Imported Upstream version 1.34.0 upstream/1.34.0
authorDongHun Kwak <dh0128.kwak@samsung.com>
Mon, 1 Feb 2021 06:17:07 +0000 (15:17 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Mon, 1 Feb 2021 06:17:07 +0000 (15:17 +0900)
967 files changed:
.bazelignore [new file with mode: 0644]
.clang-tidy
.clang_complete [deleted file]
.github/change_repo_manager.sh
.gitignore
.gitmodules
.travis.yml
BUILD
BUILD.gn
BUILDING.md
CMakeLists.txt
Makefile
Package.swift [new file with mode: 0644]
bazel/grpc_deps.bzl
build_autogenerated.yaml
build_config.rb
build_handwritten.yaml
cmake/gflags.cmake [deleted file]
composer.json
config.m4
config.w32
doc/command_line_tool.md
doc/core/pending_api_cleanups.md
doc/csharp/server_reflection.md
doc/environment_variables.md
doc/g_stands_for.md
doc/keepalive.md
doc/naming.md
doc/python/sphinx/grpc.rst
doc/xds-test-descriptions.md
examples/cpp/helloworld/cocoapods/HelloWorldCpp.xcodeproj/project.pbxproj
examples/csharp/HelloworldXamarin/Droid/HelloworldXamarin.Droid.csproj [deleted file]
examples/csharp/HelloworldXamarin/Droid/MainActivity.cs [deleted file]
examples/csharp/HelloworldXamarin/Droid/Properties/AndroidManifest.xml [deleted file]
examples/csharp/HelloworldXamarin/Droid/Properties/AssemblyInfo.cs [deleted file]
examples/csharp/HelloworldXamarin/Droid/Resources/Resource.designer.cs [deleted file]
examples/csharp/HelloworldXamarin/Droid/Resources/layout/Main.axml [deleted file]
examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-hdpi/Icon.png [deleted file]
examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-mdpi/Icon.png [deleted file]
examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xhdpi/Icon.png [deleted file]
examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xxhdpi/Icon.png [deleted file]
examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xxxhdpi/Icon.png [deleted file]
examples/csharp/HelloworldXamarin/Droid/Resources/values/Strings.xml [deleted file]
examples/csharp/HelloworldXamarin/Droid/packages.config [deleted file]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Assets/AboutAssets.txt [moved from examples/csharp/HelloworldXamarin/Droid/Assets/AboutAssets.txt with 75% similarity]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/HelloworldXamarin.Android.csproj [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/MainActivity.cs [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Properties/AndroidManifest.xml [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Properties/AssemblyInfo.cs [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/AboutResources.txt [moved from examples/csharp/HelloworldXamarin/Droid/Resources/AboutResources.txt with 72% similarity]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/Resource.designer.cs [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/layout/Tabbar.xml [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/layout/Toolbar.xml [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-anydpi-v26/icon.xml [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-anydpi-v26/icon_round.xml [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-hdpi/icon.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-hdpi/launcher_foreground.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-mdpi/icon.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-mdpi/launcher_foreground.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xhdpi/icon.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xhdpi/launcher_foreground.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxhdpi/icon.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxhdpi/launcher_foreground.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxxhdpi/icon.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/values/colors.xml [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/values/styles.xml [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/AppDelegate.cs [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Entitlements.plist [moved from examples/csharp/HelloworldXamarin/iOS/Entitlements.plist with 99% similarity]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/HelloworldXamarin.iOS.csproj [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Info.plist [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Main.cs [moved from examples/csharp/HelloworldXamarin/iOS/Main.cs with 96% similarity]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Properties/AssemblyInfo.cs [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default-568h@2x.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default-Portrait.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default-Portrait@2x.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default@2x.png [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/LaunchScreen.storyboard [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin.sln
examples/csharp/HelloworldXamarin/HelloworldXamarin/App.xaml [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin/App.xaml.cs [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin/AssemblyInfo.cs [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin/HelloworldXamarin.csproj [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin/HelloworldXamarin.projitems [deleted file]
examples/csharp/HelloworldXamarin/HelloworldXamarin/HelloworldXamarin.shproj [deleted file]
examples/csharp/HelloworldXamarin/HelloworldXamarin/MainPage.xaml [new file with mode: 0644]
examples/csharp/HelloworldXamarin/HelloworldXamarin/MainPage.xaml.cs [moved from examples/csharp/HelloworldXamarin/iOS/ViewController.cs with 63% similarity]
examples/csharp/HelloworldXamarin/iOS/AppDelegate.cs [deleted file]
examples/csharp/HelloworldXamarin/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json [deleted file]
examples/csharp/HelloworldXamarin/iOS/Assets.xcassets/Contents.json [deleted file]
examples/csharp/HelloworldXamarin/iOS/HelloworldXamarin.iOS.csproj [deleted file]
examples/csharp/HelloworldXamarin/iOS/Info.plist [deleted file]
examples/csharp/HelloworldXamarin/iOS/LaunchScreen.storyboard [deleted file]
examples/csharp/HelloworldXamarin/iOS/Main.storyboard [deleted file]
examples/csharp/HelloworldXamarin/iOS/ViewController.designer.cs [deleted file]
examples/csharp/HelloworldXamarin/iOS/packages.config [deleted file]
examples/node/dynamic_codegen/greeter_client.js
examples/node/dynamic_codegen/greeter_server.js
examples/node/dynamic_codegen/route_guide/route_guide_client.js
examples/node/dynamic_codegen/route_guide/route_guide_server.js
examples/node/package-lock.json [new file with mode: 0644]
examples/node/package.json
examples/node/static_codegen/README.md
examples/node/static_codegen/greeter_client.js
examples/node/static_codegen/greeter_server.js
examples/node/static_codegen/helloworld_grpc_pb.js
examples/node/static_codegen/helloworld_pb.js
examples/node/static_codegen/route_guide/route_guide_client.js
examples/node/static_codegen/route_guide/route_guide_grpc_pb.js
examples/node/static_codegen/route_guide/route_guide_pb.js
examples/node/static_codegen/route_guide/route_guide_server.js
examples/node/xds/greeter_client.js [new file with mode: 0644]
examples/node/xds/package.json [new file with mode: 0644]
examples/objective-c/BUILD
examples/objective-c/auth_sample/AuthSample.xcodeproj/project.pbxproj
examples/objective-c/auth_sample/AuthTestService.podspec
examples/objective-c/helloworld/HelloWorld.podspec
examples/objective-c/helloworld/HelloWorld.xcodeproj/project.pbxproj
examples/objective-c/helloworld/Podfile
examples/objective-c/helloworld_macos/HelloWorld.podspec
examples/objective-c/helloworld_macos/HelloWorld.xcodeproj/project.pbxproj
examples/objective-c/helloworld_macos/Podfile
examples/objective-c/route_guide/Podfile
examples/objective-c/route_guide/RouteGuide.podspec
examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.pbxproj
gRPC-C++.podspec
gRPC-Core.podspec
gRPC-ProtoRPC.podspec
gRPC-RxLibrary.podspec
gRPC.podspec
grpc.def
grpc.gemspec
grpc.gyp
include/grpc/grpc.h
include/grpc/grpc_security.h
include/grpc/impl/codegen/grpc_types.h
include/grpc/impl/codegen/port_platform.h
include/grpcpp/create_channel_posix.h
include/grpcpp/ext/channelz_service_plugin.h
include/grpcpp/ext/channelz_service_plugin_impl.h [deleted file]
include/grpcpp/generic/generic_stub.h
include/grpcpp/impl/codegen/async_unary_call.h
include/grpcpp/impl/codegen/byte_buffer.h
include/grpcpp/impl/codegen/call_op_set.h
include/grpcpp/impl/codegen/channel_interface.h
include/grpcpp/impl/codegen/client_callback.h
include/grpcpp/impl/codegen/client_context.h
include/grpcpp/impl/codegen/client_unary_call.h
include/grpcpp/impl/codegen/completion_queue.h
include/grpcpp/impl/codegen/method_handler.h
include/grpcpp/impl/codegen/proto_utils.h
include/grpcpp/impl/codegen/server_callback_handlers.h
include/grpcpp/impl/codegen/server_context.h
include/grpcpp/security/credentials.h
include/grpcpp/security/server_credentials.h
include/grpcpp/security/tls_certificate_provider.h [new file with mode: 0644]
include/grpcpp/security/tls_credentials_options.h
include/grpcpp/server_builder.h
package.xml
setup.py
spm-core-include/grpc [new symlink]
spm-cpp-include/grpcpp [new symlink]
src/abseil-cpp/preprocessed_builds.yaml
src/benchmark/gen_build_yaml.py
src/boringssl/boringssl_prefix_symbols.h
src/c-ares/gen_build_yaml.py
src/compiler/cpp_generator.cc
src/compiler/python_generator_helpers.h
src/core/ext/filters/client_channel/client_channel.cc
src/core/ext/filters/client_channel/config_selector.h
src/core/ext/filters/client_channel/health/health_check_client.cc
src/core/ext/filters/client_channel/health/health_check_client.h
src/core/ext/filters/client_channel/http_connect_handshaker.cc
src/core/ext/filters/client_channel/lb_policy.cc
src/core/ext/filters/client_channel/lb_policy.h
src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc
src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h
src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc
src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc
src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
src/core/ext/filters/client_channel/lb_policy/priority/priority.cc
src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
src/core/ext/filters/client_channel/lb_policy/subchannel_list.h
src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc
src/core/ext/filters/client_channel/lb_policy/xds/cds.cc
src/core/ext/filters/client_channel/lb_policy/xds/eds.cc
src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc [deleted file]
src/core/ext/filters/client_channel/lb_policy/xds/xds.h
src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc [new file with mode: 0644]
src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc
src/core/ext/filters/client_channel/resolver.cc
src/core/ext/filters/client_channel/resolver.h
src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc
src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc
src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc
src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc
src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h
src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc
src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc
src/core/ext/filters/client_channel/resolver_registry.cc
src/core/ext/filters/client_channel/resolver_result_parsing.cc
src/core/ext/filters/client_channel/resolving_lb_policy.cc
src/core/ext/filters/client_channel/resolving_lb_policy.h
src/core/ext/filters/client_channel/retry_throttle.h
src/core/ext/filters/client_channel/server_address.h
src/core/ext/filters/client_channel/service_config.cc
src/core/ext/filters/client_channel/service_config.h
src/core/ext/filters/client_channel/subchannel.cc
src/core/ext/filters/client_channel/subchannel.h
src/core/ext/filters/client_channel/subchannel_interface.h
src/core/ext/filters/client_channel/subchannel_pool_interface.h
src/core/ext/filters/deadline/deadline_filter.cc
src/core/ext/filters/deadline/deadline_filter.h
src/core/ext/filters/http/client/http_client_filter.cc
src/core/ext/filters/http/server/http_server_filter.cc
src/core/ext/filters/load_reporting/server_load_reporting_filter.cc
src/core/ext/filters/max_age/max_age_filter.cc
src/core/ext/transport/chttp2/client/chttp2_connector.h
src/core/ext/transport/chttp2/server/chttp2_server.cc
src/core/ext/transport/chttp2/transport/bin_decoder.cc
src/core/ext/transport/chttp2/transport/chttp2_transport.cc
src/core/ext/transport/chttp2/transport/flow_control.h
src/core/ext/transport/chttp2/transport/frame_goaway.cc
src/core/ext/transport/chttp2/transport/hpack_parser.cc
src/core/ext/transport/chttp2/transport/internal.h
src/core/ext/transport/chttp2/transport/parsing.cc
src/core/ext/transport/chttp2/transport/writing.cc
src/core/ext/transport/cronet/transport/cronet_status.cc
src/core/ext/transport/cronet/transport/cronet_transport.cc
src/core/ext/xds/certificate_provider_factory.h
src/core/ext/xds/certificate_provider_store.cc [new file with mode: 0644]
src/core/ext/xds/certificate_provider_store.h
src/core/ext/xds/file_watcher_certificate_provider_factory.cc [new file with mode: 0644]
src/core/ext/xds/file_watcher_certificate_provider_factory.h [new file with mode: 0644]
src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc
src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h
src/core/ext/xds/xds_api.cc
src/core/ext/xds/xds_api.h
src/core/ext/xds/xds_bootstrap.cc
src/core/ext/xds/xds_bootstrap.h
src/core/ext/xds/xds_certificate_provider.cc [new file with mode: 0644]
src/core/ext/xds/xds_certificate_provider.h [new file with mode: 0644]
src/core/ext/xds/xds_client.cc
src/core/ext/xds/xds_client.h
src/core/ext/xds/xds_client_stats.cc
src/core/ext/xds/xds_client_stats.h
src/core/lib/channel/channel_args.cc
src/core/lib/channel/channel_trace.cc
src/core/lib/channel/channelz.h
src/core/lib/channel/handshaker.h
src/core/lib/compression/compression.cc
src/core/lib/compression/compression_internal.cc
src/core/lib/compression/compression_internal.h
src/core/lib/compression/stream_compression_identity.cc
src/core/lib/debug/stats_data.cc
src/core/lib/gpr/cpu_iphone.cc
src/core/lib/gpr/log_linux.cc
src/core/lib/gpr/log_posix.cc
src/core/lib/gpr/log_windows.cc
src/core/lib/gpr/murmur_hash.cc
src/core/lib/gpr/string.cc
src/core/lib/gpr/time_precise.cc
src/core/lib/gpr/tls.h
src/core/lib/gpr/tls_msvc.h
src/core/lib/gpr/tls_stdcpp.h [new file with mode: 0644]
src/core/lib/gpr/useful.h
src/core/lib/gprpp/README.md
src/core/lib/gprpp/dual_ref_counted.h
src/core/lib/gprpp/examine_stack.cc [new file with mode: 0644]
src/core/lib/gprpp/examine_stack.h [new file with mode: 0644]
src/core/lib/gprpp/fork.cc
src/core/lib/gprpp/manual_constructor.h
src/core/lib/gprpp/orphanable.h
src/core/lib/gprpp/ref_counted.h
src/core/lib/gprpp/ref_counted_ptr.h
src/core/lib/gprpp/stat.h [moved from src/core/lib/security/authorization/mock_cel/statusor.h with 51% similarity]
src/core/lib/gprpp/stat_posix.cc [new file with mode: 0644]
src/core/lib/gprpp/stat_windows.cc [new file with mode: 0644]
src/core/lib/gprpp/thd.h
src/core/lib/gprpp/thd_posix.cc
src/core/lib/http/parser.cc
src/core/lib/iomgr/error.cc
src/core/lib/iomgr/ev_epollex_linux.cc
src/core/lib/iomgr/exec_ctx.cc
src/core/lib/iomgr/executor/mpmcqueue.h
src/core/lib/iomgr/executor/threadpool.h
src/core/lib/iomgr/parse_address.cc
src/core/lib/iomgr/parse_address.h
src/core/lib/iomgr/poller/eventmanager_libuv.cc
src/core/lib/iomgr/python_util.h
src/core/lib/iomgr/resolve_address_posix.cc
src/core/lib/iomgr/tcp_posix.cc
src/core/lib/iomgr/timer_custom.cc
src/core/lib/iomgr/unix_sockets_posix.cc
src/core/lib/iomgr/unix_sockets_posix.h
src/core/lib/iomgr/unix_sockets_posix_noop.cc
src/core/lib/iomgr/wakeup_fd_pipe.cc
src/core/lib/json/json.h
src/core/lib/json/json_reader.cc
src/core/lib/json/json_util.h
src/core/lib/json/json_writer.cc
src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h
src/core/lib/security/authorization/mock_cel/cel_expression.h
src/core/lib/security/authorization/mock_cel/cel_value.h
src/core/lib/security/authorization/mock_cel/evaluator_core.h
src/core/lib/security/authorization/mock_cel/flat_expr_builder.h
src/core/lib/security/context/security_context.h
src/core/lib/security/credentials/credentials.cc
src/core/lib/security/credentials/credentials.h
src/core/lib/security/credentials/external/aws_request_signer.cc [new file with mode: 0644]
src/core/lib/security/credentials/external/aws_request_signer.h [new file with mode: 0644]
src/core/lib/security/credentials/external/external_account_credentials.cc [new file with mode: 0644]
src/core/lib/security/credentials/external/external_account_credentials.h [new file with mode: 0644]
src/core/lib/security/credentials/external/file_external_account_credentials.cc [new file with mode: 0644]
src/core/lib/security/credentials/external/file_external_account_credentials.h [new file with mode: 0644]
src/core/lib/security/credentials/external/url_external_account_credentials.cc [new file with mode: 0644]
src/core/lib/security/credentials/external/url_external_account_credentials.h [new file with mode: 0644]
src/core/lib/security/credentials/insecure/insecure_credentials.cc [new file with mode: 0644]
src/core/lib/security/credentials/jwt/json_token.cc
src/core/lib/security/credentials/jwt/jwt_credentials.h
src/core/lib/security/credentials/jwt/jwt_verifier.cc
src/core/lib/security/credentials/oauth2/oauth2_credentials.cc
src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc
src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h
src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc [new file with mode: 0644]
src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h [moved from src/core/lib/security/certificate_provider.h with 57% similarity]
src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc
src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h
src/core/lib/security/credentials/tls/tls_credentials.cc
src/core/lib/security/credentials/tls/tls_credentials.h
src/core/lib/security/security_connector/fake/fake_security_connector.cc
src/core/lib/security/security_connector/insecure/insecure_security_connector.cc [new file with mode: 0644]
src/core/lib/security/security_connector/insecure/insecure_security_connector.h [new file with mode: 0644]
src/core/lib/security/security_connector/load_system_roots.h
src/core/lib/security/security_connector/load_system_roots_linux.h
src/core/lib/security/security_connector/local/local_security_connector.cc
src/core/lib/security/security_connector/security_connector.cc
src/core/lib/security/security_connector/security_connector.h
src/core/lib/security/security_connector/ssl_utils.h
src/core/lib/security/security_connector/tls/tls_security_connector.cc
src/core/lib/security/security_connector/tls/tls_security_connector.h
src/core/lib/security/transport/security_handshaker.cc
src/core/lib/security/transport/server_auth_filter.cc
src/core/lib/security/util/json_util.h
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_buffer.cc
src/core/lib/slice/slice_intern.cc
src/core/lib/slice/slice_traits.h [deleted file]
src/core/lib/surface/call.cc
src/core/lib/surface/completion_queue.cc
src/core/lib/surface/server.cc
src/core/lib/surface/server.h
src/core/lib/surface/validate_metadata.h
src/core/lib/surface/version.cc
src/core/lib/transport/authority_override.h
src/core/lib/transport/bdp_estimator.cc
src/core/lib/transport/byte_stream.h
src/core/lib/transport/connectivity_state.h
src/core/lib/transport/metadata.h
src/core/lib/transport/timeout_encoding.cc
src/core/lib/transport/transport.cc
src/core/lib/transport/transport.h
src/core/plugin_registry/grpc_plugin_registry.cc
src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc
src/core/tsi/fake_transport_security.cc
src/core/tsi/local_transport_security.cc
src/core/tsi/local_transport_security.h
src/core/tsi/ssl/session_cache/ssl_session.h
src/core/tsi/ssl/session_cache/ssl_session_cache.h
src/core/tsi/ssl_transport_security.cc
src/core/tsi/ssl_transport_security.h
src/core/tsi/transport_security.cc
src/cpp/Protobuf-C++.podspec
src/cpp/client/client_callback.cc
src/cpp/client/insecure_credentials.cc
src/cpp/client/secure_credentials.cc
src/cpp/client/secure_credentials.h
src/cpp/client/xds_credentials.cc [new file with mode: 0644]
src/cpp/common/alarm.cc
src/cpp/common/secure_auth_context.h
src/cpp/common/tls_certificate_provider.cc [new file with mode: 0644]
src/cpp/common/tls_credentials_options.cc
src/cpp/common/tls_credentials_options_util.cc
src/cpp/common/tls_credentials_options_util.h
src/cpp/common/version_cc.cc
src/cpp/ext/filters/census/context.h
src/cpp/ext/filters/census/grpc_plugin.h
src/cpp/ext/proto_server_reflection.cc
src/cpp/server/channel_argument_option.cc
src/cpp/server/channelz/channelz_service_plugin.cc
src/cpp/server/dynamic_thread_pool.cc
src/cpp/server/dynamic_thread_pool.h
src/cpp/server/health/default_health_check_service.cc
src/cpp/server/health/default_health_check_service.h
src/cpp/server/load_reporter/constants.h
src/cpp/server/load_reporter/load_data_store.cc
src/cpp/server/load_reporter/load_reporter.cc
src/cpp/server/load_reporter/load_reporter_async_service_impl.cc
src/cpp/server/load_reporter/load_reporter_async_service_impl.h
src/cpp/server/secure_server_credentials.cc
src/cpp/server/server_callback.cc
src/cpp/server/server_cc.cc
src/cpp/server/server_context.cc
src/csharp/Directory.Build.props
src/csharp/Directory.Build.targets [new file with mode: 0644]
src/csharp/Grpc.Auth/GoogleAuthInterceptors.cs
src/csharp/Grpc.Auth/Grpc.Auth.csproj
src/csharp/Grpc.Core.Api/Grpc.Core.Api.csproj
src/csharp/Grpc.Core.Api/VersionInfo.cs
src/csharp/Grpc.Core.NativeDebug/Grpc.Core.NativeDebug.csproj
src/csharp/Grpc.Core.Testing/Grpc.Core.Testing.csproj
src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj
src/csharp/Grpc.Core.Xamarin/.gitignore [new file with mode: 0644]
src/csharp/Grpc.Core.Xamarin/Grpc.Core.Xamarin.csproj [new file with mode: 0644]
src/csharp/Grpc.Core.Xamarin/Internal.cs [new file with mode: 0644]
src/csharp/Grpc.Core.Xamarin/build/MonoAndroid10/Grpc.Core.Xamarin.targets [moved from src/csharp/Grpc.Core/build/MonoAndroid10/Grpc.Core.targets with 100% similarity]
src/csharp/Grpc.Core.Xamarin/build/Xamarin.iOS10/Grpc.Core.Xamarin.targets [moved from src/csharp/Grpc.Core/build/Xamarin.iOS10/Grpc.Core.targets with 100% similarity]
src/csharp/Grpc.Core/Grpc.Core.csproj
src/csharp/Grpc.Core/GrpcEnvironment.cs
src/csharp/Grpc.Core/Internal/NativeExtension.cs
src/csharp/Grpc.Core/Internal/NativeMethods.Generated.cs
src/csharp/Grpc.Core/Internal/PlatformApis.cs
src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs
src/csharp/Grpc.Core/Utils/TaskUtils.cs
src/csharp/Grpc.Core/build/net45/Grpc.Core.targets
src/csharp/Grpc.Examples.MathClient/Grpc.Examples.MathClient.csproj
src/csharp/Grpc.Examples.MathClient/MathClient.cs
src/csharp/Grpc.Examples.MathServer/Grpc.Examples.MathServer.csproj
src/csharp/Grpc.Examples.MathServer/MathServer.cs
src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj
src/csharp/Grpc.Examples/Grpc.Examples.csproj
src/csharp/Grpc.Examples/MathExamples.cs
src/csharp/Grpc.Examples/MathServiceImpl.cs
src/csharp/Grpc.HealthCheck.Tests/Grpc.HealthCheck.Tests.csproj
src/csharp/Grpc.HealthCheck/Grpc.HealthCheck.csproj
src/csharp/Grpc.IntegrationTesting.Client/Grpc.IntegrationTesting.Client.csproj
src/csharp/Grpc.IntegrationTesting.QpsWorker/Grpc.IntegrationTesting.QpsWorker.csproj
src/csharp/Grpc.IntegrationTesting.Server/Grpc.IntegrationTesting.Server.csproj
src/csharp/Grpc.IntegrationTesting.StressClient/Grpc.IntegrationTesting.StressClient.csproj
src/csharp/Grpc.IntegrationTesting.XdsClient/Grpc.IntegrationTesting.XdsClient.csproj
src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj
src/csharp/Grpc.Microbenchmarks/Grpc.Microbenchmarks.csproj
src/csharp/Grpc.Reflection.Tests/Grpc.Reflection.Tests.csproj
src/csharp/Grpc.Reflection/Grpc.Reflection.csproj
src/csharp/Grpc.Tools.Tests/Grpc.Tools.Tests.csproj
src/csharp/Grpc.Tools/Common.cs
src/csharp/Grpc.Tools/Grpc.Tools.csproj
src/csharp/Grpc.sln
src/csharp/Grpc/Grpc.csproj
src/csharp/build/common.props [moved from src/csharp/Grpc.Core/Common.csproj.include with 75% similarity, mode: 0644]
src/csharp/build/dependencies.props
src/csharp/build_nuget.sh [new file with mode: 0755]
src/csharp/build_packages_dotnetcli.bat [deleted file]
src/csharp/build_unitypackage.bat [deleted file]
src/csharp/build_unitypackage.sh [new file with mode: 0755]
src/csharp/expand_dev_version.sh [changed mode: 0644->0755]
src/csharp/experimental/README.md
src/csharp/experimental/build_native_ext_for_ios.sh
src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/linux/x86.meta [deleted file]
src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/linux/x86/libgrpc_csharp_ext.so.meta [deleted file]
src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/osx/x86.meta [deleted file]
src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/osx/x86/grpc_csharp_ext.bundle.meta [deleted file]
src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec
src/objective-c/!ProtoCompiler-gRPCPlugin.podspec
src/objective-c/!ProtoCompiler.podspec
src/objective-c/BoringSSL-GRPC.podspec
src/objective-c/CronetFramework.podspec
src/objective-c/GRPCClient/private/GRPCCore/GRPCChannel.m
src/objective-c/GRPCClient/version.h
src/objective-c/README.md
src/objective-c/examples/BUILD
src/objective-c/examples/InterceptorSample/InterceptorSample.xcodeproj/project.pbxproj
src/objective-c/examples/InterceptorSample/Podfile
src/objective-c/examples/RemoteTestClient/RemoteTest.podspec
src/objective-c/examples/Sample/Podfile
src/objective-c/examples/Sample/Sample.xcodeproj/project.pbxproj
src/objective-c/examples/SwiftSample/Podfile
src/objective-c/examples/SwiftSample/SwiftSample.xcodeproj/project.pbxproj
src/objective-c/examples/tvOS-sample/tvOS-sample.xcodeproj/project.pbxproj
src/objective-c/examples/watchOS-sample/Podfile
src/objective-c/examples/watchOS-sample/watchOS-sample.xcodeproj/project.pbxproj
src/objective-c/manual_tests/GrpcIosTest.xcodeproj/project.pbxproj
src/objective-c/manual_tests/Podfile
src/objective-c/tests/BUILD
src/objective-c/tests/Connectivity/ConnectivityTestingApp.xcodeproj/project.pbxproj
src/objective-c/tests/Connectivity/Podfile
src/objective-c/tests/InteropTests/InteropTests.m
src/objective-c/tests/Podfile
src/objective-c/tests/RemoteTestClient/RemoteTest.podspec
src/objective-c/tests/Tests.xcodeproj/project.pbxproj
src/objective-c/tests/UnitTests/APIv2Tests.m
src/objective-c/tests/UnitTests/GRPCClientTests.m
src/objective-c/tests/version.h
src/php/bin/build_all_docker_images.sh
src/php/bin/run_all_docker_images.sh
src/php/composer.json
src/php/docker/alpine/Dockerfile
src/php/docker/centos7/Dockerfile
src/php/docker/grpc-ext/Dockerfile
src/php/docker/grpc-src/Dockerfile
src/php/docker/i386/Dockerfile
src/php/docker/php-future/Dockerfile
src/php/docker/php-src/Dockerfile
src/php/docker/php-zts/Dockerfile
src/php/docker/php8/Dockerfile [new file with mode: 0644]
src/php/ext/grpc/byte_buffer.c
src/php/ext/grpc/byte_buffer.h
src/php/ext/grpc/call.c
src/php/ext/grpc/call_credentials.c
src/php/ext/grpc/channel.c
src/php/ext/grpc/channel.h
src/php/ext/grpc/completion_queue.h
src/php/ext/grpc/php7_wrapper.h
src/php/ext/grpc/php_grpc.c
src/php/ext/grpc/php_grpc.h
src/php/ext/grpc/version.h
src/php/tests/generated_code/AbstractGeneratedCodeTest.php
src/php/tests/generated_code/GeneratedCodeTest.php
src/php/tests/generated_code/GeneratedCodeWithCallbackTest.php
src/php/tests/interop/interop_client.php
src/php/tests/unit_tests/CallCredentials2Test.php
src/php/tests/unit_tests/CallCredentialsTest.php
src/php/tests/unit_tests/CallInvokerTest.php
src/php/tests/unit_tests/CallTest.php
src/php/tests/unit_tests/ChannelCredentialsTest.php
src/php/tests/unit_tests/ChannelTest.php
src/php/tests/unit_tests/EndToEndTest.php
src/php/tests/unit_tests/InterceptorTest.php
src/php/tests/unit_tests/PersistentChannelTests/PersistentChannelTest.php
src/php/tests/unit_tests/SecureEndToEndTest.php
src/php/tests/unit_tests/ServerTest.php
src/php/tests/unit_tests/TimevalTest.php
src/proto/gen_build_yaml.py
src/proto/grpc/testing/messages.proto
src/proto/grpc/testing/test.proto
src/proto/grpc/testing/xds/v3/BUILD
src/proto/grpc/testing/xds/v3/http_connection_manager.proto
src/proto/grpc/testing/xds/v3/protocol.proto [new file with mode: 0644]
src/proto/grpc/testing/xds/v3/route.proto
src/python/grpcio/commands.py
src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi
src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi
src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi
src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi
src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi
src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi
src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi
src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi
src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi
src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi
src/python/grpcio/grpc/_grpcio_metadata.py
src/python/grpcio/grpc_core_dependencies.py
src/python/grpcio/grpc_version.py
src/python/grpcio_channelz/grpc_version.py
src/python/grpcio_health_checking/grpc_version.py
src/python/grpcio_reflection/grpc_version.py
src/python/grpcio_status/grpc_version.py
src/python/grpcio_testing/grpc_version.py
src/python/grpcio_tests/grpc_version.py
src/python/grpcio_tests/tests/_runner.py
src/python/grpcio_tests/tests/fork/_fork_interop_test.py
src/python/grpcio_tests/tests/fork/methods.py
src/python/grpcio_tests/tests/qps/benchmark_client.py
src/python/grpcio_tests/tests/qps/client_runner.py
src/python/grpcio_tests/tests/qps/qps_worker.py
src/python/grpcio_tests/tests/qps/worker_server.py
src/python/grpcio_tests/tests/unit/BUILD.bazel
src/python/grpcio_tests/tests/unit/_dynamic_stubs_test.py
src/python/grpcio_tests/tests/unit/data/foo/bar_with_wkt.proto [new file with mode: 0644]
src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py
src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py
src/re2/gen_build_yaml.py
src/ruby/ext/grpc/extconf.rb
src/ruby/ext/grpc/rb_grpc_imports.generated.c
src/ruby/ext/grpc/rb_grpc_imports.generated.h
src/ruby/lib/grpc/version.rb
src/ruby/tools/version.rb
src/upb/gen_build_yaml.py
src/zlib/gen_build_yaml.py
templates/CMakeLists.txt.template
templates/Makefile.template
templates/composer.json.template
templates/config.w32.template
templates/gRPC-C++.podspec.template
templates/gRPC-Core.podspec.template
templates/gRPC-ProtoRPC.podspec.template
templates/gRPC-RxLibrary.podspec.template
templates/gRPC.podspec.template
templates/grpc.gyp.template
templates/package.xml.template
templates/src/csharp/Grpc.Core/Internal/NativeMethods.Generated.cs.template
templates/src/csharp/build_unitypackage.bat.template [deleted file]
templates/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec.template
templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template
templates/src/objective-c/BoringSSL-GRPC.podspec.template
templates/src/php/composer.json.template
templates/src/php/docker/download_phpunit.include
templates/src/php/docker/php-future/Dockerfile.template
templates/src/php/docker/php8/Dockerfile.template [new file with mode: 0644]
templates/src/python/grpcio/grpc_core_dependencies.py.template
templates/test/core/end2end/end2end_nosec_tests.cc.template
templates/tools/dockerfile/go_build_interop.sh.include
templates/tools/dockerfile/grpc_clang_format/Dockerfile.template
templates/tools/dockerfile/grpc_clang_tidy/Dockerfile.template
templates/tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile.template [deleted file]
templates/tools/dockerfile/interoptest/grpc_interop_go1.7/Dockerfile.template [deleted file]
templates/tools/dockerfile/interoptest/grpc_interop_go1.7/build_interop.sh.template [deleted file]
templates/tools/dockerfile/interoptest/grpc_interop_go1.8/build_interop.sh.template [deleted file]
templates/tools/dockerfile/python_deps.include
templates/tools/dockerfile/test/cxx_alpine_x64/Dockerfile.template
templates/tools/dockerfile/test/sanity/Dockerfile.template
templates/tools/run_tests/generated/configs.json.template
test/core/bad_ssl/bad_ssl_test.cc
test/core/client_channel/BUILD
test/core/client_channel/certificate_provider_registry_test.cc
test/core/client_channel/resolvers/BUILD
test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc
test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc
test/core/client_channel/resolvers/dns_resolver_test.cc
test/core/client_channel/resolvers/sockaddr_resolver_test.cc
test/core/client_channel/service_config_test.cc
test/core/client_channel/xds_bootstrap_test.cc [deleted file]
test/core/compression/message_compress_fuzzer.cc
test/core/compression/message_decompress_fuzzer.cc
test/core/compression/stream_compression_fuzzer.cc
test/core/compression/stream_decompression_fuzzer.cc
test/core/end2end/connection_refused_test.cc
test/core/end2end/dualstack_socket_test.cc
test/core/end2end/fixtures/h2_tls.cc
test/core/end2end/fixtures/h2_uds.cc
test/core/end2end/fixtures/local_util.cc
test/core/end2end/fuzzers/client_fuzzer.cc
test/core/end2end/fuzzers/server_fuzzer.cc
test/core/end2end/gen_build_yaml.py
test/core/end2end/invalid_call_argument_test.cc
test/core/end2end/no_server_test.cc
test/core/end2end/tests/bad_ping.cc
test/core/end2end/tests/cancel_test_helpers.h
test/core/end2end/tests/ping.cc
test/core/gprpp/BUILD
test/core/gprpp/dual_ref_counted_test.cc
test/core/gprpp/examine_stack_test.cc [new file with mode: 0644]
test/core/gprpp/manual_constructor_test.cc
test/core/gprpp/orphanable_test.cc
test/core/gprpp/ref_counted_ptr_test.cc
test/core/gprpp/ref_counted_test.cc
test/core/gprpp/stat_test.cc [new file with mode: 0644]
test/core/handshake/client_ssl.cc
test/core/handshake/readahead_handshaker_server_ssl.cc
test/core/iomgr/fd_posix_test.cc
test/core/iomgr/ios/CFStreamTests/CFStreamTests.xcodeproj/project.pbxproj
test/core/iomgr/ios/CFStreamTests/Podfile
test/core/iomgr/ios/CFStreamTests/build_tests.sh
test/core/iomgr/mpmcqueue_test.cc
test/core/iomgr/parse_address_test.cc
test/core/iomgr/parse_address_with_named_scope_id_test.cc
test/core/iomgr/resolve_address_posix_test.cc
test/core/iomgr/stranded_event_test.cc
test/core/iomgr/work_serializer_test.cc
test/core/security/BUILD
test/core/security/aws_request_signer_test.cc [new file with mode: 0644]
test/core/security/credentials_test.cc
test/core/security/grpc_tls_certificate_distributor_test.cc
test/core/security/grpc_tls_credentials_options_test.cc
test/core/security/insecure_security_connector_test.cc [new file with mode: 0644]
test/core/security/ssl_server_fuzzer.cc
test/core/security/tls_security_connector_test.cc
test/core/security/verify_jwt.cc
test/core/slice/b64_decode_fuzzer.cc
test/core/slice/percent_decode_fuzzer.cc
test/core/slice/percent_encode_fuzzer.cc
test/core/surface/public_headers_must_be_c89.c
test/core/surface/sequential_connectivity_test.cc
test/core/transport/chttp2/remove_stream_from_stalled_lists_test.cc
test/core/transport/chttp2/settings_timeout_test.cc
test/core/transport/chttp2/too_many_pings_test.cc
test/core/transport/connectivity_state_test.cc
test/core/tsi/alts/fake_handshaker/BUILD
test/core/tsi/alts/fake_handshaker/fake_handshaker_server_main.cc
test/core/tsi/alts/handshaker/BUILD
test/core/tsi/alts/handshaker/alts_concurrent_connectivity_test.cc
test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc
test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc
test/core/uri/uri_fuzzer_test.cc
test/core/uri/uri_parser_test.cc
test/core/util/BUILD
test/core/util/fuzzer_corpus_test.cc
test/core/util/passthru_endpoint.cc
test/core/util/port.cc
test/core/util/resolve_localhost_ip46.cc [new file with mode: 0644]
test/core/util/resolve_localhost_ip46.h [new file with mode: 0644]
test/core/util/stack_tracer.cc [moved from test/core/util/examine_stack.cc with 91% similarity]
test/core/util/stack_tracer.h [moved from test/core/util/examine_stack.h with 54% similarity]
test/core/util/stack_tracer_test.cc [new file with mode: 0644]
test/core/util/test_config.cc
test/core/util/test_lb_policies.cc
test/core/util/tracer_util.cc
test/core/xds/BUILD
test/core/xds/certificate_provider_store_test.cc [new file with mode: 0644]
test/core/xds/file_watcher_certificate_provider_factory_test.cc [new file with mode: 0644]
test/core/xds/xds_bootstrap_test.cc [new file with mode: 0644]
test/core/xds/xds_certificate_provider_test.cc [new file with mode: 0644]
test/cpp/client/credentials_test.cc
test/cpp/cocoapods/GRPCCppTests.xcodeproj/project.pbxproj
test/cpp/cocoapods/Podfile
test/cpp/codegen/BUILD
test/cpp/codegen/golden_file_test.cc
test/cpp/common/time_jump_test.cc
test/cpp/common/timer_test.cc
test/cpp/end2end/BUILD
test/cpp/end2end/async_end2end_test.cc
test/cpp/end2end/channelz_service_test.cc
test/cpp/end2end/client_callback_end2end_test.cc
test/cpp/end2end/client_crash_test.cc
test/cpp/end2end/client_crash_test_server.cc
test/cpp/end2end/client_interceptors_end2end_test.cc
test/cpp/end2end/client_lb_end2end_test.cc
test/cpp/end2end/delegating_channel_test.cc
test/cpp/end2end/end2end_test.cc
test/cpp/end2end/filter_end2end_test.cc
test/cpp/end2end/flaky_network_test.cc
test/cpp/end2end/generic_end2end_test.cc
test/cpp/end2end/grpclb_end2end_test.cc
test/cpp/end2end/hybrid_end2end_test.cc
test/cpp/end2end/interceptors_util.cc
test/cpp/end2end/interceptors_util.h
test/cpp/end2end/message_allocator_end2end_test.cc
test/cpp/end2end/mock_test.cc
test/cpp/end2end/nonblocking_test.cc
test/cpp/end2end/proto_server_reflection_test.cc
test/cpp/end2end/raw_end2end_test.cc
test/cpp/end2end/server_builder_plugin_test.cc
test/cpp/end2end/server_crash_test.cc
test/cpp/end2end/server_crash_test_client.cc
test/cpp/end2end/server_early_return_test.cc
test/cpp/end2end/server_interceptors_end2end_test.cc
test/cpp/end2end/service_config_end2end_test.cc
test/cpp/end2end/streaming_throughput_test.cc
test/cpp/end2end/test_service_impl.h
test/cpp/end2end/thread_stress_test.cc
test/cpp/end2end/time_change_test.cc
test/cpp/end2end/xds_credentials_end2end_test.cc [new file with mode: 0644]
test/cpp/end2end/xds_end2end_test.cc
test/cpp/ext/filters/census/stats_plugin_end2end_test.cc
test/cpp/interop/BUILD
test/cpp/interop/client.cc
test/cpp/interop/client_helper.cc
test/cpp/interop/grpclb_fallback_test.cc
test/cpp/interop/http2_client.cc
test/cpp/interop/interop_client.cc
test/cpp/interop/interop_server.cc
test/cpp/interop/interop_test.cc
test/cpp/interop/metrics_client.cc
test/cpp/interop/reconnect_interop_client.cc
test/cpp/interop/reconnect_interop_server.cc
test/cpp/interop/server_helper.cc
test/cpp/interop/stress_test.cc
test/cpp/interop/xds_interop_client.cc
test/cpp/interop/xds_interop_server.cc
test/cpp/ios/Podfile
test/cpp/ios/RemoteTestClientCpp/RemoteTestCpp.podspec
test/cpp/ios/Tests.xcodeproj/project.pbxproj
test/cpp/ios/build_tests.sh
test/cpp/microbenchmarks/BUILD
test/cpp/microbenchmarks/bm_call_create.cc
test/cpp/microbenchmarks/bm_fullstack_trickle.cc
test/cpp/microbenchmarks/bm_timer.cc
test/cpp/microbenchmarks/callback_unary_ping_pong.h
test/cpp/microbenchmarks/fullstack_fixtures.h
test/cpp/naming/address_sorting_test.cc
test/cpp/naming/cancel_ares_query_test.cc
test/cpp/naming/dns_test_util.cc
test/cpp/naming/generate_resolver_component_tests.bzl
test/cpp/naming/resolver_component_test.cc
test/cpp/naming/resolver_component_tests_runner_invoker.cc
test/cpp/performance/writes_per_rpc_test.cc
test/cpp/qps/BUILD
test/cpp/qps/benchmark_config.cc
test/cpp/qps/client.h
test/cpp/qps/client_async.cc
test/cpp/qps/client_callback.cc
test/cpp/qps/client_sync.cc
test/cpp/qps/driver.cc
test/cpp/qps/histogram.h
test/cpp/qps/interarrival.h
test/cpp/qps/qps_benchmark_script.bzl
test/cpp/qps/qps_json_driver.cc
test/cpp/qps/qps_server_builder.cc
test/cpp/qps/qps_worker.cc
test/cpp/qps/server_async.cc
test/cpp/qps/worker.cc
test/cpp/server/BUILD
test/cpp/server/credentials_test.cc [new file with mode: 0644]
test/cpp/server/load_reporter/load_reporter_test.cc
test/cpp/thread_manager/BUILD
test/cpp/thread_manager/thread_manager_test.cc
test/cpp/util/BUILD
test/cpp/util/byte_buffer_proto_helper.cc
test/cpp/util/channelz_sampler.cc
test/cpp/util/channelz_sampler_test.cc
test/cpp/util/cli_credentials.cc
test/cpp/util/create_test_channel.cc
test/cpp/util/grpc_cli.cc
test/cpp/util/grpc_tool.cc
test/cpp/util/grpc_tool.h
test/cpp/util/grpc_tool_test.cc
test/cpp/util/proto_file_parser.cc
test/cpp/util/proto_reflection_descriptor_database.h
test/cpp/util/slice_test.cc
test/cpp/util/test_config_cc.cc
test/cpp/util/test_credentials_provider.cc
test/cpp/util/time_test.cc
test/distrib/cpp/run_distrib_test_cmake_as_externalproject.sh
test/distrib/csharp/DistribTest/DistribTestDotNet.csproj
test/distrib/csharp/run_distrib_test_dotnetcli.sh
third_party/address_sorting/include/address_sorting/address_sorting.h
third_party/cares/cares.BUILD
tools/bazel.rc
tools/buildgen/build_cleaner.py
tools/buildgen/extract_metadata_from_bazel_xml.py
tools/buildgen/generate_build_additions.sh
tools/buildgen/generate_projects.py
tools/buildgen/generate_projects.sh
tools/buildgen/mako_renderer.py
tools/buildgen/plugins/expand_filegroups.py
tools/buildgen/plugins/generate_vsprojects.py
tools/buildgen/plugins/list_api.py
tools/distrib/check_trailing_newlines.sh
tools/distrib/clang_tidy_code.sh
tools/distrib/gen_compilation_database.py [new file with mode: 0755]
tools/distrib/python/grpc_version.py
tools/distrib/python/grpcio_tools/BUILD.bazel
tools/distrib/python/grpcio_tools/grpc_tools/protoc.py
tools/distrib/python/grpcio_tools/grpc_version.py
tools/distrib/python/grpcio_tools/grpcio_tools.bzl [new file with mode: 0644]
tools/distrib/python/grpcio_tools/setup.py
tools/distrib/run_clang_tidy.py
tools/distrib/sanitize.sh
tools/dockerfile/distribtest/csharp_alpine_x64/Dockerfile
tools/dockerfile/distribtest/csharp_dotnet31_x64/Dockerfile [new file with mode: 0644]
tools/dockerfile/distribtest/csharp_dotnet5_x64/Dockerfile [new file with mode: 0644]
tools/dockerfile/distribtest/csharp_jessie_x86/Dockerfile [deleted file]
tools/dockerfile/distribtest/csharp_stretch_x64/Dockerfile
tools/dockerfile/distribtest/csharp_ubuntu1604_x64/Dockerfile
tools/dockerfile/distribtest/php7_stretch_x64/Dockerfile
tools/dockerfile/grpc_artifact_centos6_x64/Dockerfile
tools/dockerfile/grpc_artifact_centos6_x86/Dockerfile
tools/dockerfile/grpc_artifact_python_manylinux2010_x64/Dockerfile
tools/dockerfile/grpc_artifact_python_manylinux2010_x86/Dockerfile
tools/dockerfile/grpc_artifact_python_manylinux2014_x64/Dockerfile
tools/dockerfile/grpc_artifact_python_manylinux2014_x86/Dockerfile
tools/dockerfile/grpc_clang_format/Dockerfile
tools/dockerfile/grpc_clang_tidy/Dockerfile
tools/dockerfile/grpc_clang_tidy/clang_tidy_all_the_things.sh
tools/dockerfile/grpc_dist_proto/Dockerfile
tools/dockerfile/grpc_scan_build/Dockerfile
tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile
tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile
tools/dockerfile/interoptest/grpc_interop_cxx/Dockerfile
tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile
tools/dockerfile/interoptest/grpc_interop_go/Dockerfile
tools/dockerfile/interoptest/grpc_interop_go/build_interop.sh
tools/dockerfile/interoptest/grpc_interop_go1.11/Dockerfile
tools/dockerfile/interoptest/grpc_interop_go1.11/build_interop.sh
tools/dockerfile/interoptest/grpc_interop_go1.7/Dockerfile [deleted file]
tools/dockerfile/interoptest/grpc_interop_go1.7/build_interop.sh [deleted file]
tools/dockerfile/interoptest/grpc_interop_go1.8/Dockerfile
tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile
tools/dockerfile/interoptest/grpc_interop_node/Dockerfile
tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile
tools/dockerfile/interoptest/lb_interop_fake_servers/Dockerfile
tools/dockerfile/test/bazel/Dockerfile
tools/dockerfile/test/csharp_stretch_x64/Dockerfile
tools/dockerfile/test/cxx_alpine_x64/Dockerfile
tools/dockerfile/test/cxx_buster_x64/Dockerfile
tools/dockerfile/test/cxx_jessie_x64/Dockerfile
tools/dockerfile/test/cxx_jessie_x86/Dockerfile
tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile
tools/dockerfile/test/cxx_ubuntu1804_x64/Dockerfile
tools/dockerfile/test/fuzzer/Dockerfile
tools/dockerfile/test/node_jessie_x64/Dockerfile
tools/dockerfile/test/php73_zts_stretch_x64/Dockerfile
tools/dockerfile/test/php7_jessie_x64/Dockerfile
tools/dockerfile/test/python_alpine_x64/Dockerfile
tools/dockerfile/test/ruby_jessie_x64/Dockerfile
tools/dockerfile/test/sanity/Dockerfile
tools/doxygen/Doxyfile.c++
tools/doxygen/Doxyfile.c++.internal
tools/doxygen/Doxyfile.core
tools/doxygen/Doxyfile.core.internal
tools/doxygen/Doxyfile.objc
tools/doxygen/Doxyfile.objc.internal
tools/doxygen/Doxyfile.php
tools/gce/create_linux_kokoro_performance_worker.sh
tools/gce/create_linux_kokoro_performance_worker_from_image.sh
tools/gce/create_windows_debug_worker.sh
tools/gce/linux_kokoro_performance_worker_init.sh
tools/internal_ci/helper_scripts/install_python_interpreters.ps1
tools/internal_ci/helper_scripts/prepare_build_macos_rc
tools/internal_ci/helper_scripts/prepare_build_windows.bat
tools/internal_ci/linux/grpc_bazel_build_in_docker.sh
tools/internal_ci/linux/grpc_bazel_on_foundry_base.sh
tools/internal_ci/linux/grpc_bazel_rbe_asan.cfg
tools/internal_ci/linux/grpc_bazel_rbe_dbg.cfg
tools/internal_ci/linux/grpc_bazel_rbe_incompatible_changes.cfg
tools/internal_ci/linux/grpc_bazel_rbe_msan.cfg
tools/internal_ci/linux/grpc_bazel_rbe_opt.cfg
tools/internal_ci/linux/grpc_bazel_rbe_tsan.cfg
tools/internal_ci/linux/grpc_bazel_rbe_ubsan.cfg
tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh
tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh
tools/internal_ci/linux/grpc_xds_csharp_test_in_docker.sh
tools/internal_ci/linux/grpc_xds_php_test_in_docker.sh
tools/internal_ci/linux/grpc_xds_ruby_test_in_docker.sh
tools/internal_ci/linux/pull_request/grpc_bazel_rbe_asan.cfg
tools/internal_ci/linux/pull_request/grpc_bazel_rbe_dbg.cfg
tools/internal_ci/linux/pull_request/grpc_bazel_rbe_msan.cfg
tools/internal_ci/linux/pull_request/grpc_bazel_rbe_opt.cfg
tools/internal_ci/linux/pull_request/grpc_bazel_rbe_tsan.cfg
tools/internal_ci/linux/pull_request/grpc_bazel_rbe_ubsan.cfg
tools/internal_ci/macos/grpc_run_bazel_c_cpp_tests.sh
tools/internal_ci/windows/bazel_rbe.bat
tools/internal_ci/windows/grpc_basictests_python.cfg
tools/internal_ci/windows/grpc_bazel_rbe_dbg.cfg
tools/internal_ci/windows/grpc_bazel_rbe_opt.cfg
tools/internal_ci/windows/grpc_build_artifacts.bat
tools/internal_ci/windows/grpc_build_artifacts.cfg
tools/internal_ci/windows/grpc_build_packages.bat
tools/internal_ci/windows/grpc_run_tests_matrix.bat
tools/internal_ci/windows/pull_request/grpc_basictests_python.cfg
tools/internal_ci/windows/pull_request/grpc_bazel_rbe_dbg.cfg
tools/internal_ci/windows/pull_request/grpc_bazel_rbe_opt.cfg
tools/interop_matrix/client_matrix.py
tools/profiling/ios_bin/binary_size.py
tools/profiling/ios_bin/parse_link_map.py
tools/release/release_notes.py
tools/run_tests/artifacts/artifact_targets.py
tools/run_tests/artifacts/build_artifact_python.bat
tools/run_tests/artifacts/distribtest_targets.py
tools/run_tests/artifacts/package_targets.py
tools/run_tests/generated/configs.json
tools/run_tests/generated/lb_interop_test_scenarios.json
tools/run_tests/generated/tests.json
tools/run_tests/python_utils/download_and_unzip.py [new file with mode: 0644]
tools/run_tests/python_utils/port_server.py
tools/run_tests/python_utils/upload_rbe_results.py
tools/run_tests/run_interop_tests.py
tools/run_tests/run_tests.py
tools/run_tests/run_xds_tests.py
tools/run_tests/sanity/check_bazel_workspace.py
tools/run_tests/sanity/check_submodules.sh
tools/run_tests/sanity/sanity_tests.yaml

diff --git a/.bazelignore b/.bazelignore
new file mode 100644 (file)
index 0000000..797afef
--- /dev/null
@@ -0,0 +1,11 @@
+bazel-bin
+bazel-grpc
+bazel-out
+bazel-testlogs
+bins
+libs
+objs
+third_party/abseil-cpp
+third_party/googleapis
+third_party/protoc-gen-validate
+third_party/udpa
index d217441..8a377f3 100644 (file)
@@ -1,6 +1,49 @@
 ---
-Checks: 'modernize-use-nullptr,google-build-namespaces,google-build-explicit-make-pair,readability-function-size,performance-*,bugprone-*'
-WarningsAsErrors: 'modernize-use-nullptr,google-build-namespaces,google-build-explicit-make-pair,readability-function-size,performance-*,bugprone-*'
+# Disable abseil-no-namespace: https://bugs.llvm.org/show_bug.cgi?id=47947
+Checks: '-*,
+  abseil-*,
+  -abseil-no-namespace,
+  bugprone-*,
+  -bugprone-integer-division,
+  -bugprone-narrowing-conversions,
+  -bugprone-too-small-loop-variable,
+  performance-*,
+  -performance-unnecessary-copy-initialization,
+  -performance-unnecessary-value-param,
+  google-*,
+  -google-build-using-namespace,
+  -google-explicit-constructor,
+  -google-readability-casting,
+  -google-readability-todo,
+  -google-runtime-int,
+  -google-runtime-references,
+  misc-definitions-in-headers,
+  misc-static-assert,
+  misc-unconventional-assign-operator,
+  misc-uniqueptr-reset-release,
+  misc-unused-alias-decls,
+  misc-unused-using-decls,
+  modernize-make-unique,
+  -modernize-redundant-void-arg,
+  modernize-replace-auto-ptr,
+  modernize-shrink-to-fit,
+  modernize-use-bool-literals,
+  modernize-use-nullptr,
+  modernize-use-override,
+  readability-container-size-empty,
+  readability-deleted-default,
+  readability-function-size,
+  -readability-inconsistent-declaration-parameter-name,
+  readability-redundant-control-flow,
+  readability-redundant-smartptr-get,
+  readability-string-compare'
+WarningsAsErrors: '*'
 CheckOptions:
   - key:    readability-function-size.StatementThreshold
     value:  '450'
+  - key:    modernize-make-unique.MakeSmartPtrFunction
+    value:  'absl::make_unique'
+  - key:    modernize-make-unique.MakeSmartPtrFunctionHeader
+    value:  'absl/memory/memory.h'
+  - key:    google-readability-braces-around-statements.ShortStatementLines
+    value:  1
diff --git a/.clang_complete b/.clang_complete
deleted file mode 100644 (file)
index 2769e89..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
--Wall
--Wc++-compat
--I.
--Igens
--Iinclude
--Isrc/core/ext/upb-generated
--Ithird_party/abseil-cpp
--Ithird_party/address_sorting/include
--Ithird_party/benchmark/include
--Ithird_party/boringssl-with-bazel/src/include
--Ithird_party/cares
--Ithird_party/cares/cares
--Ithird_party/googletest
--Ithird_party/googletest/googlemock/include
--Ithird_party/googletest/googletest/include
--Ithird_party/googletest/include
--Ithird_party/protobuf/src
--Ithird_party/re2
--Ithird_party/upb
--Ithird_party/zlib
index 2c41985..739f42c 100755 (executable)
@@ -21,7 +21,7 @@ if [ $# -lt 1 ];then
   exit 1
 fi
 
-echo "Change a repo manager to $0"
+echo "Change repo manager to $1"
 
 BASE_PATH=$(dirname $0)
 
index c0ec881..14cdceb 100644 (file)
@@ -96,6 +96,9 @@ DerivedData
 *.xcuserstate
 *.DS_Store
 
+# Swift Package Manager files
+Package.resolved
+
 # Objective-C generated files
 *.pbobjc.*
 *.pbrpc.*
@@ -151,3 +154,6 @@ BenchmarkDotNet.Artifacts/
 
 # pyenv config
 .python-version
+
+# clang JSON compilation database file
+compile_commands.json
index 781cfac..ef97568 100644 (file)
@@ -8,9 +8,6 @@
 [submodule "third_party/protobuf"]
        path = third_party/protobuf
        url = https://github.com/google/protobuf.git
-[submodule "third_party/gflags"]
-       path = third_party/gflags
-       url = https://github.com/gflags/gflags.git
 [submodule "third_party/googletest"]
        path = third_party/googletest
        url = https://github.com/google/googletest.git
index 94bf382..5c432b9 100644 (file)
@@ -47,7 +47,6 @@ before_install:
   - pod --version
   # Recent pods aren't found if we don't explicitly update Cocoapods' repo.
   - pod repo update
-  - brew install gflags
 install:
   - pushd $TEST_PATH
   - pod install
diff --git a/BUILD b/BUILD
index b33851e..1354433 100644 (file)
--- a/BUILD
+++ b/BUILD
@@ -80,11 +80,11 @@ config_setting(
 python_config_settings()
 
 # This should be updated along with build_handwritten.yaml
-g_stands_for = "geeky"
+g_stands_for = "gauntlet"
 
-core_version = "13.0.0"
+core_version = "14.0.0"
 
-version = "1.33.2"
+version = "1.34.0"
 
 GPR_PUBLIC_HDRS = [
     "include/grpc/support/alloc.h",
@@ -251,6 +251,7 @@ GRPCXX_PUBLIC_HDRS = [
     "include/grpcpp/security/auth_metadata_processor.h",
     "include/grpcpp/security/credentials.h",
     "include/grpcpp/security/server_credentials.h",
+    "include/grpcpp/security/tls_certificate_provider.h",
     "include/grpcpp/security/tls_credentials_options.h",
     "include/grpcpp/server.h",
     "include/grpcpp/server_builder.h",
@@ -323,7 +324,7 @@ grpc_cc_library(
         "//conditions:default": [
             "grpc_lb_policy_cds",
             "grpc_lb_policy_eds",
-            "grpc_lb_policy_eds_drop",
+            "grpc_lb_policy_xds_cluster_impl",
             "grpc_lb_policy_xds_cluster_manager",
             "grpc_resolver_xds",
             "grpc_xds_credentials",
@@ -354,6 +355,7 @@ grpc_cc_library(
         "src/cpp/common/secure_auth_context.cc",
         "src/cpp/common/secure_channel_arguments.cc",
         "src/cpp/common/secure_create_auth_context.cc",
+        "src/cpp/common/tls_certificate_provider.cc",
         "src/cpp/common/tls_credentials_options.cc",
         "src/cpp/common/tls_credentials_options_util.cc",
         "src/cpp/server/insecure_server_credentials.cc",
@@ -367,6 +369,12 @@ grpc_cc_library(
     ],
     language = "c++",
     public_hdrs = GRPCXX_PUBLIC_HDRS,
+    select_deps = {
+        "grpc_no_xds": [],
+        "//conditions:default": [
+            "grpc++_xds_credentials",
+        ],
+    },
     standalone = True,
     deps = [
         "gpr",
@@ -380,6 +388,20 @@ grpc_cc_library(
 )
 
 grpc_cc_library(
+    name = "grpc++_xds_credentials",
+    srcs = [
+        "src/cpp/client/xds_credentials.cc",
+    ],
+    hdrs = [
+        "src/cpp/client/secure_credentials.h",
+    ],
+    language = "c++",
+    deps = [
+        "grpc++_base",
+    ],
+)
+
+grpc_cc_library(
     name = "grpc++_unsecure",
     srcs = [
         "src/cpp/client/insecure_credentials.cc",
@@ -507,10 +529,13 @@ grpc_cc_library(
         "src/core/lib/gpr/tmpfile_windows.cc",
         "src/core/lib/gpr/wrap_memcpy.cc",
         "src/core/lib/gprpp/arena.cc",
+        "src/core/lib/gprpp/examine_stack.cc",
         "src/core/lib/gprpp/fork.cc",
         "src/core/lib/gprpp/global_config_env.cc",
         "src/core/lib/gprpp/host_port.cc",
         "src/core/lib/gprpp/mpscq.cc",
+        "src/core/lib/gprpp/stat_posix.cc",
+        "src/core/lib/gprpp/stat_windows.cc",
         "src/core/lib/gprpp/thd_posix.cc",
         "src/core/lib/gprpp/thd_windows.cc",
         "src/core/lib/profiling/basic_timers.cc",
@@ -529,10 +554,12 @@ grpc_cc_library(
         "src/core/lib/gpr/tls_gcc.h",
         "src/core/lib/gpr/tls_msvc.h",
         "src/core/lib/gpr/tls_pthread.h",
+        "src/core/lib/gpr/tls_stdcpp.h",
         "src/core/lib/gpr/tmpfile.h",
         "src/core/lib/gpr/useful.h",
         "src/core/lib/gprpp/arena.h",
         "src/core/lib/gprpp/atomic.h",
+        "src/core/lib/gprpp/examine_stack.h",
         "src/core/lib/gprpp/fork.h",
         "src/core/lib/gprpp/global_config.h",
         "src/core/lib/gprpp/global_config_custom.h",
@@ -543,6 +570,7 @@ grpc_cc_library(
         "src/core/lib/gprpp/map.h",
         "src/core/lib/gprpp/memory.h",
         "src/core/lib/gprpp/mpscq.h",
+        "src/core/lib/gprpp/stat.h",
         "src/core/lib/gprpp/sync.h",
         "src/core/lib/gprpp/thd.h",
         "src/core/lib/profiling/timers.h",
@@ -550,10 +578,12 @@ grpc_cc_library(
     external_deps = [
         "absl/base",
         "absl/memory",
+        "absl/status",
         "absl/strings",
         "absl/strings:str_format",
         "absl/synchronization",
         "absl/time:time",
+        "absl/types:optional",
     ],
     language = "c++",
     public_hdrs = GPR_PUBLIC_HDRS,
@@ -1305,19 +1335,26 @@ grpc_cc_library(
 )
 
 grpc_cc_library(
-    name = "grpc_xds_api_header",
+    name = "grpc_xds_credentials",
+    srcs = [
+        "src/core/ext/xds/certificate_provider_registry.cc",
+        "src/core/ext/xds/certificate_provider_store.cc",
+        "src/core/ext/xds/xds_certificate_provider.cc",
+        "src/core/lib/security/credentials/xds/xds_credentials.cc",
+    ],
     hdrs = [
-        "src/core/ext/xds/xds_api.h",
-        "src/core/ext/xds/xds_bootstrap.h",
-        "src/core/ext/xds/xds_client_stats.h",
+        "src/core/ext/xds/certificate_provider_factory.h",
+        "src/core/ext/xds/certificate_provider_registry.h",
+        "src/core/ext/xds/certificate_provider_store.h",
+        "src/core/ext/xds/xds_certificate_provider.h",
+        "src/core/lib/security/credentials/xds/xds_credentials.h",
     ],
     external_deps = [
-        "upb_lib",
-        "re2",
+        "absl/functional:bind_front",
     ],
     language = "c++",
     deps = [
-        "grpc_base",
+        "grpc_secure",
     ],
 )
 
@@ -1330,17 +1367,42 @@ grpc_cc_library(
         "src/core/ext/xds/xds_client_stats.cc",
     ],
     hdrs = [
+        "src/core/ext/xds/xds_api.h",
+        "src/core/ext/xds/xds_bootstrap.h",
         "src/core/ext/xds/xds_channel_args.h",
         "src/core/ext/xds/xds_client.h",
+        "src/core/ext/xds/xds_client_stats.h",
+    ],
+    external_deps = [
+        "upb_lib",
+        "upb_textformat_lib",
+        "re2",
     ],
     language = "c++",
     deps = [
         "envoy_ads_upb",
+        "envoy_ads_upbdefs",
         "grpc_base",
         "grpc_client_channel",
+        "grpc_file_watcher_certificate_provider_factory",
         "grpc_google_mesh_ca_certificate_provider_factory",
-        "grpc_secure",
-        "grpc_xds_api_header",
+        "grpc_transport_chttp2_client_secure",
+        "grpc_xds_credentials",
+    ],
+)
+
+grpc_cc_library(
+    name = "grpc_file_watcher_certificate_provider_factory",
+    srcs = [
+        "src/core/ext/xds/file_watcher_certificate_provider_factory.cc",
+    ],
+    hdrs = [
+        "src/core/ext/xds/file_watcher_certificate_provider_factory.h",
+    ],
+    language = "c++",
+    deps = [
+        "grpc_base",
+        "grpc_xds_credentials",
     ],
 )
 
@@ -1355,7 +1417,7 @@ grpc_cc_library(
     language = "c++",
     deps = [
         "grpc_base",
-        "grpc_secure",
+        "grpc_xds_credentials",
     ],
 )
 
@@ -1373,13 +1435,23 @@ grpc_cc_library(
 )
 
 grpc_cc_library(
+    name = "grpc_lb_xds_common",
+    hdrs = [
+        "src/core/ext/filters/client_channel/lb_policy/xds/xds.h",
+    ],
+    language = "c++",
+    deps = [
+        "grpc_base",
+        "grpc_client_channel",
+        "grpc_xds_client",
+    ],
+)
+
+grpc_cc_library(
     name = "grpc_lb_policy_eds",
     srcs = [
         "src/core/ext/filters/client_channel/lb_policy/xds/eds.cc",
     ],
-    hdrs = [
-        "src/core/ext/filters/client_channel/lb_policy/xds/xds.h",
-    ],
     external_deps = [
         "absl/strings",
     ],
@@ -1388,14 +1460,15 @@ grpc_cc_library(
         "grpc_base",
         "grpc_client_channel",
         "grpc_lb_address_filtering",
+        "grpc_lb_xds_common",
         "grpc_xds_client",
     ],
 )
 
 grpc_cc_library(
-    name = "grpc_lb_policy_eds_drop",
+    name = "grpc_lb_policy_xds_cluster_impl",
     srcs = [
-        "src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc",
+        "src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc",
     ],
     external_deps = [
         "absl/strings",
@@ -1404,6 +1477,7 @@ grpc_cc_library(
     deps = [
         "grpc_base",
         "grpc_client_channel",
+        "grpc_lb_xds_common",
         "grpc_xds_client",
     ],
 )
@@ -1421,7 +1495,6 @@ grpc_cc_library(
         "grpc_base",
         "grpc_client_channel",
         "grpc_resolver_xds_header",
-        "grpc_xds_api_header",
     ],
 )
 
@@ -1733,17 +1806,21 @@ grpc_cc_library(
 grpc_cc_library(
     name = "grpc_secure",
     srcs = [
-        "src/core/ext/xds/certificate_provider_registry.cc",
         "src/core/lib/http/httpcli_security_connector.cc",
         "src/core/lib/security/context/security_context.cc",
         "src/core/lib/security/credentials/alts/alts_credentials.cc",
         "src/core/lib/security/credentials/composite/composite_credentials.cc",
         "src/core/lib/security/credentials/credentials.cc",
         "src/core/lib/security/credentials/credentials_metadata.cc",
+        "src/core/lib/security/credentials/external/aws_request_signer.cc",
+        "src/core/lib/security/credentials/external/external_account_credentials.cc",
+        "src/core/lib/security/credentials/external/file_external_account_credentials.cc",
+        "src/core/lib/security/credentials/external/url_external_account_credentials.cc",
         "src/core/lib/security/credentials/fake/fake_credentials.cc",
         "src/core/lib/security/credentials/google_default/credentials_generic.cc",
         "src/core/lib/security/credentials/google_default/google_default_credentials.cc",
         "src/core/lib/security/credentials/iam/iam_credentials.cc",
+        "src/core/lib/security/credentials/insecure/insecure_credentials.cc",
         "src/core/lib/security/credentials/jwt/json_token.cc",
         "src/core/lib/security/credentials/jwt/jwt_credentials.cc",
         "src/core/lib/security/credentials/jwt/jwt_verifier.cc",
@@ -1752,10 +1829,12 @@ grpc_cc_library(
         "src/core/lib/security/credentials/plugin/plugin_credentials.cc",
         "src/core/lib/security/credentials/ssl/ssl_credentials.cc",
         "src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc",
+        "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc",
         "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc",
         "src/core/lib/security/credentials/tls/tls_credentials.cc",
         "src/core/lib/security/security_connector/alts/alts_security_connector.cc",
         "src/core/lib/security/security_connector/fake/fake_security_connector.cc",
+        "src/core/lib/security/security_connector/insecure/insecure_security_connector.cc",
         "src/core/lib/security/security_connector/load_system_roots_fallback.cc",
         "src/core/lib/security/security_connector/load_system_roots_linux.cc",
         "src/core/lib/security/security_connector/local/local_security_connector.cc",
@@ -1774,15 +1853,15 @@ grpc_cc_library(
     ],
     hdrs = [
         "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h",
-        "src/core/ext/xds/certificate_provider_factory.h",
-        "src/core/ext/xds/certificate_provider_registry.h",
-        "src/core/ext/xds/certificate_provider_store.h",
         "src/core/ext/xds/xds_channel_args.h",
-        "src/core/lib/security/certificate_provider.h",
         "src/core/lib/security/context/security_context.h",
         "src/core/lib/security/credentials/alts/alts_credentials.h",
         "src/core/lib/security/credentials/composite/composite_credentials.h",
         "src/core/lib/security/credentials/credentials.h",
+        "src/core/lib/security/credentials/external/aws_request_signer.h",
+        "src/core/lib/security/credentials/external/external_account_credentials.h",
+        "src/core/lib/security/credentials/external/file_external_account_credentials.h",
+        "src/core/lib/security/credentials/external/url_external_account_credentials.h",
         "src/core/lib/security/credentials/fake/fake_credentials.h",
         "src/core/lib/security/credentials/google_default/google_default_credentials.h",
         "src/core/lib/security/credentials/iam/iam_credentials.h",
@@ -1794,10 +1873,12 @@ grpc_cc_library(
         "src/core/lib/security/credentials/plugin/plugin_credentials.h",
         "src/core/lib/security/credentials/ssl/ssl_credentials.h",
         "src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h",
+        "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h",
         "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h",
         "src/core/lib/security/credentials/tls/tls_credentials.h",
         "src/core/lib/security/security_connector/alts/alts_security_connector.h",
         "src/core/lib/security/security_connector/fake/fake_security_connector.h",
+        "src/core/lib/security/security_connector/insecure/insecure_security_connector.h",
         "src/core/lib/security/security_connector/load_system_roots.h",
         "src/core/lib/security/security_connector/load_system_roots_linux.h",
         "src/core/lib/security/security_connector/local/local_security_connector.h",
@@ -1823,19 +1904,6 @@ grpc_cc_library(
 )
 
 grpc_cc_library(
-    name = "grpc_xds_credentials",
-    srcs = [
-        "src/core/lib/security/credentials/xds/xds_credentials.cc",
-    ],
-    hdrs = [
-        "src/core/lib/security/credentials/xds/xds_credentials.h",
-    ],
-    deps = [
-        "grpc_secure",
-    ],
-)
-
-grpc_cc_library(
     name = "grpc_mock_cel",
     hdrs = [
         "src/core/lib/security/authorization/mock_cel/activation.h",
@@ -1844,7 +1912,6 @@ grpc_cc_library(
         "src/core/lib/security/authorization/mock_cel/cel_value.h",
         "src/core/lib/security/authorization/mock_cel/evaluator_core.h",
         "src/core/lib/security/authorization/mock_cel/flat_expr_builder.h",
-        "src/core/lib/security/authorization/mock_cel/statusor.h",
     ],
     language = "c++",
     deps = [
@@ -2368,7 +2435,6 @@ grpc_cc_library(
     language = "c++",
     public_hdrs = [
         "include/grpcpp/ext/channelz_service_plugin.h",
-        "include/grpcpp/ext/channelz_service_plugin_impl.h",
     ],
     deps = [
         ":grpc++",
@@ -2572,6 +2638,7 @@ grpc_cc_library(
     ],
     external_deps = [
         "upb_lib",
+        "upb_lib_descriptor",
     ],
     language = "c++",
     deps = [
@@ -2586,6 +2653,88 @@ grpc_cc_library(
 )
 
 grpc_cc_library(
+    name = "envoy_ads_upbdefs",
+    srcs = [
+        "src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c",
+    ],
+    hdrs = [
+        "src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h",
+    ],
+    external_deps = [
+        "upb_lib",
+        "upb_lib_descriptor",
+        "upb_textformat_lib",
+    ],
+    language = "c++",
+    deps = [
+        ":envoy_ads_upb",
+        ":envoy_annotations_upbdefs",
+        ":envoy_core_upbdefs",
+        ":envoy_type_upbdefs",
+        ":google_api_upbdefs",
+        ":proto_gen_validate_upbdefs",
+        ":udpa_annotations_upbdefs",
+        ":udpa_core_upbdefs",
+    ],
+)
+
+grpc_cc_library(
     name = "envoy_annotations_upb",
     srcs = [
         "src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c",
@@ -2597,6 +2746,7 @@ grpc_cc_library(
     ],
     external_deps = [
         "upb_lib",
+        "upb_lib_descriptor",
     ],
     language = "c++",
     deps = [
@@ -2605,6 +2755,28 @@ grpc_cc_library(
 )
 
 grpc_cc_library(
+    name = "envoy_annotations_upbdefs",
+    srcs = [
+        "src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c",
+    ],
+    hdrs = [
+        "src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h",
+    ],
+    external_deps = [
+        "upb_lib",
+        "upb_lib_descriptor",
+        "upb_textformat_lib",
+    ],
+    language = "c++",
+    deps = [
+        ":envoy_annotations_upb",
+        ":google_api_upbdefs",
+    ],
+)
+
+grpc_cc_library(
     name = "envoy_core_upb",
     srcs = [
         "src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c",
@@ -2638,6 +2810,7 @@ grpc_cc_library(
     ],
     external_deps = [
         "upb_lib",
+        "upb_lib_descriptor",
     ],
     language = "c++",
     deps = [
@@ -2651,6 +2824,52 @@ grpc_cc_library(
 )
 
 grpc_cc_library(
+    name = "envoy_core_upbdefs",
+    srcs = [
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c",
+    ],
+    hdrs = [
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h",
+    ],
+    external_deps = [
+        "upb_lib",
+        "upb_lib_descriptor",
+        "upb_textformat_lib",
+    ],
+    language = "c++",
+    deps = [
+        ":envoy_core_upb",
+        ":envoy_type_upbdefs",
+        ":google_api_upbdefs",
+        ":proto_gen_validate_upbdefs",
+    ],
+)
+
+grpc_cc_library(
     name = "envoy_type_upb",
     srcs = [
         "src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c",
@@ -2682,6 +2901,7 @@ grpc_cc_library(
     ],
     external_deps = [
         "upb_lib",
+        "upb_lib_descriptor",
     ],
     language = "c++",
     deps = [
@@ -2693,6 +2913,49 @@ grpc_cc_library(
 )
 
 grpc_cc_library(
+    name = "envoy_type_upbdefs",
+    srcs = [
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c",
+    ],
+    hdrs = [
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h",
+    ],
+    external_deps = [
+        "upb_lib",
+        "upb_lib_descriptor",
+        "upb_textformat_lib",
+    ],
+    language = "c++",
+    deps = [
+        ":envoy_type_upb",
+        ":google_api_upbdefs",
+        ":proto_gen_validate_upbdefs",
+    ],
+)
+
+grpc_cc_library(
     name = "proto_gen_validate_upb",
     srcs = [
         "src/core/ext/upb-generated/validate/validate.upb.c",
@@ -2702,6 +2965,7 @@ grpc_cc_library(
     ],
     external_deps = [
         "upb_lib",
+        "upb_lib_descriptor",
     ],
     language = "c++",
     deps = [
@@ -2709,6 +2973,26 @@ grpc_cc_library(
     ],
 )
 
+grpc_cc_library(
+    name = "proto_gen_validate_upbdefs",
+    srcs = [
+        "src/core/ext/upbdefs-generated/validate/validate.upbdefs.c",
+    ],
+    hdrs = [
+        "src/core/ext/upbdefs-generated/validate/validate.upbdefs.h",
+    ],
+    external_deps = [
+        "upb_lib",
+        "upb_lib_descriptor",
+        "upb_textformat_lib",
+    ],
+    language = "c++",
+    deps = [
+        ":google_api_upbdefs",
+        ":proto_gen_validate_upb",
+    ],
+)
+
 # Once upb code-gen issue is resolved, replace udpa_orca_upb with this.
 # grpc_upb_proto_library(
 #     name = "udpa_orca_upb",
@@ -2725,6 +3009,7 @@ grpc_cc_library(
     ],
     external_deps = [
         "upb_lib",
+        "upb_lib_descriptor",
     ],
     language = "c++",
     deps = [
@@ -2750,6 +3035,7 @@ grpc_cc_library(
     ],
     external_deps = [
         "upb_lib",
+        "upb_lib_descriptor",
     ],
     language = "c++",
     deps = [
@@ -2759,6 +3045,34 @@ grpc_cc_library(
 )
 
 grpc_cc_library(
+    name = "udpa_annotations_upbdefs",
+    srcs = [
+        "src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c",
+    ],
+    hdrs = [
+        "src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h",
+    ],
+    external_deps = [
+        "upb_lib",
+        "upb_lib_descriptor",
+        "upb_textformat_lib",
+    ],
+    language = "c++",
+    deps = [
+        ":google_api_upbdefs",
+        ":udpa_annotations_upb",
+    ],
+)
+
+grpc_cc_library(
     name = "udpa_core_upb",
     srcs = [
         "src/core/ext/upb-generated/udpa/core/v1/authority.upb.c",
@@ -2778,6 +3092,7 @@ grpc_cc_library(
     ],
     external_deps = [
         "upb_lib",
+        "upb_lib_descriptor",
     ],
     language = "c++",
     deps = [
@@ -2787,6 +3102,38 @@ grpc_cc_library(
     ],
 )
 
+grpc_cc_library(
+    name = "udpa_core_upbdefs",
+    srcs = [
+        "src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c",
+    ],
+    hdrs = [
+        "src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h",
+    ],
+    external_deps = [
+        "upb_lib",
+        "upb_lib_descriptor",
+        "upb_textformat_lib",
+    ],
+    language = "c++",
+    deps = [
+        ":google_api_upbdefs",
+        ":proto_gen_validate_upbdefs",
+        ":udpa_annotations_upbdefs",
+        ":udpa_core_upb",
+    ],
+)
+
 # Once upb code-gen issue is resolved, replace grpc_health_upb with this.
 # grpc_upb_proto_library(
 #     name = "grpc_health_upb",
@@ -2803,6 +3150,7 @@ grpc_cc_library(
     ],
     external_deps = [
         "upb_lib",
+        "upb_lib_descriptor",
     ],
     language = "c++",
 )
@@ -2816,7 +3164,6 @@ grpc_cc_library(
         "src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c",
         "src/core/ext/upb-generated/google/api/http.upb.c",
         "src/core/ext/upb-generated/google/protobuf/any.upb.c",
-        "src/core/ext/upb-generated/google/protobuf/descriptor.upb.c",
         "src/core/ext/upb-generated/google/protobuf/duration.upb.c",
         "src/core/ext/upb-generated/google/protobuf/empty.upb.c",
         "src/core/ext/upb-generated/google/protobuf/struct.upb.c",
@@ -2830,7 +3177,6 @@ grpc_cc_library(
         "src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h",
         "src/core/ext/upb-generated/google/api/http.upb.h",
         "src/core/ext/upb-generated/google/protobuf/any.upb.h",
-        "src/core/ext/upb-generated/google/protobuf/descriptor.upb.h",
         "src/core/ext/upb-generated/google/protobuf/duration.upb.h",
         "src/core/ext/upb-generated/google/protobuf/empty.upb.h",
         "src/core/ext/upb-generated/google/protobuf/struct.upb.h",
@@ -2840,8 +3186,46 @@ grpc_cc_library(
     ],
     external_deps = [
         "upb_lib",
+        "upb_lib_descriptor",
+    ],
+    language = "c++",
+)
+
+grpc_cc_library(
+    name = "google_api_upbdefs",
+    srcs = [
+        "src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/api/http.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c",
+    ],
+    hdrs = [
+        "src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/api/http.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h",
+    ],
+    external_deps = [
+        "upb_lib",
+        "upb_lib_descriptor",
+        "upb_textformat_lib",
     ],
     language = "c++",
+    deps = [
+        ":google_api_upb",
+    ],
 )
 
 # Once upb code-gen issue is resolved, replace grpc_lb_upb with this.
@@ -2860,6 +3244,7 @@ grpc_cc_library(
     ],
     external_deps = [
         "upb_lib",
+        "upb_lib_descriptor",
     ],
     language = "c++",
     deps = [
@@ -2907,6 +3292,7 @@ grpc_cc_library(
     ],
     external_deps = [
         "upb_lib",
+        "upb_lib_descriptor",
     ],
     language = "c++",
 )
index 221f636..6c93c6c 100644 (file)
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -137,6 +137,7 @@ config("grpc_config") {
         "src/core/lib/gpr/tls_msvc.h",
         "src/core/lib/gpr/tls_pthread.cc",
         "src/core/lib/gpr/tls_pthread.h",
+        "src/core/lib/gpr/tls_stdcpp.h",
         "src/core/lib/gpr/tmpfile.h",
         "src/core/lib/gpr/tmpfile_msys.cc",
         "src/core/lib/gpr/tmpfile_posix.cc",
@@ -146,6 +147,8 @@ config("grpc_config") {
         "src/core/lib/gprpp/arena.cc",
         "src/core/lib/gprpp/arena.h",
         "src/core/lib/gprpp/atomic.h",
+        "src/core/lib/gprpp/examine_stack.cc",
+        "src/core/lib/gprpp/examine_stack.h",
         "src/core/lib/gprpp/fork.cc",
         "src/core/lib/gprpp/fork.h",
         "src/core/lib/gprpp/global_config.h",
@@ -160,6 +163,9 @@ config("grpc_config") {
         "src/core/lib/gprpp/memory.h",
         "src/core/lib/gprpp/mpscq.cc",
         "src/core/lib/gprpp/mpscq.h",
+        "src/core/lib/gprpp/stat.h",
+        "src/core/lib/gprpp/stat_posix.cc",
+        "src/core/lib/gprpp/stat_windows.cc",
         "src/core/lib/gprpp/sync.h",
         "src/core/lib/gprpp/thd.h",
         "src/core/lib/gprpp/thd_posix.cc",
@@ -169,10 +175,12 @@ config("grpc_config") {
         "src/core/lib/profiling/timers.h",
     ]
     deps = [
+        ":absl/types:optional",
         ":absl/time:time",
         ":absl/synchronization:synchronization",
         ":absl/strings:strings",
         ":absl/strings:str_format",
+        ":absl/status:status",
         ":absl/memory:memory",
         ":absl/base:base",
     ]
@@ -249,8 +257,8 @@ config("grpc_config") {
         "src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc",
         "src/core/ext/filters/client_channel/lb_policy/xds/cds.cc",
         "src/core/ext/filters/client_channel/lb_policy/xds/eds.cc",
-        "src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc",
         "src/core/ext/filters/client_channel/lb_policy/xds/xds.h",
+        "src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc",
         "src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc",
         "src/core/ext/filters/client_channel/lb_policy_factory.h",
         "src/core/ext/filters/client_channel/lb_policy_registry.cc",
@@ -511,8 +519,6 @@ config("grpc_config") {
         "src/core/ext/upb-generated/google/api/http.upb.h",
         "src/core/ext/upb-generated/google/protobuf/any.upb.c",
         "src/core/ext/upb-generated/google/protobuf/any.upb.h",
-        "src/core/ext/upb-generated/google/protobuf/descriptor.upb.c",
-        "src/core/ext/upb-generated/google/protobuf/descriptor.upb.h",
         "src/core/ext/upb-generated/google/protobuf/duration.upb.c",
         "src/core/ext/upb-generated/google/protobuf/duration.upb.h",
         "src/core/ext/upb-generated/google/protobuf/empty.upb.c",
@@ -561,16 +567,177 @@ config("grpc_config") {
         "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h",
         "src/core/ext/upb-generated/validate/validate.upb.c",
         "src/core/ext/upb-generated/validate/validate.upb.h",
+        "src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c",
+        "src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/api/http.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/api/http.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h",
+        "src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c",
+        "src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c",
+        "src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h",
+        "src/core/ext/upbdefs-generated/validate/validate.upbdefs.c",
+        "src/core/ext/upbdefs-generated/validate/validate.upbdefs.h",
         "src/core/ext/xds/certificate_provider_factory.h",
         "src/core/ext/xds/certificate_provider_registry.cc",
         "src/core/ext/xds/certificate_provider_registry.h",
+        "src/core/ext/xds/certificate_provider_store.cc",
         "src/core/ext/xds/certificate_provider_store.h",
+        "src/core/ext/xds/file_watcher_certificate_provider_factory.cc",
+        "src/core/ext/xds/file_watcher_certificate_provider_factory.h",
         "src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc",
         "src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h",
         "src/core/ext/xds/xds_api.cc",
         "src/core/ext/xds/xds_api.h",
         "src/core/ext/xds/xds_bootstrap.cc",
         "src/core/ext/xds/xds_bootstrap.h",
+        "src/core/ext/xds/xds_certificate_provider.cc",
+        "src/core/ext/xds/xds_certificate_provider.h",
         "src/core/ext/xds/xds_channel_args.h",
         "src/core/ext/xds/xds_client.cc",
         "src/core/ext/xds/xds_client.h",
@@ -824,8 +991,6 @@ config("grpc_config") {
         "src/core/lib/security/authorization/mock_cel/cel_value.h",
         "src/core/lib/security/authorization/mock_cel/evaluator_core.h",
         "src/core/lib/security/authorization/mock_cel/flat_expr_builder.h",
-        "src/core/lib/security/authorization/mock_cel/statusor.h",
-        "src/core/lib/security/certificate_provider.h",
         "src/core/lib/security/context/security_context.cc",
         "src/core/lib/security/context/security_context.h",
         "src/core/lib/security/credentials/alts/alts_credentials.cc",
@@ -844,6 +1009,14 @@ config("grpc_config") {
         "src/core/lib/security/credentials/credentials.cc",
         "src/core/lib/security/credentials/credentials.h",
         "src/core/lib/security/credentials/credentials_metadata.cc",
+        "src/core/lib/security/credentials/external/aws_request_signer.cc",
+        "src/core/lib/security/credentials/external/aws_request_signer.h",
+        "src/core/lib/security/credentials/external/external_account_credentials.cc",
+        "src/core/lib/security/credentials/external/external_account_credentials.h",
+        "src/core/lib/security/credentials/external/file_external_account_credentials.cc",
+        "src/core/lib/security/credentials/external/file_external_account_credentials.h",
+        "src/core/lib/security/credentials/external/url_external_account_credentials.cc",
+        "src/core/lib/security/credentials/external/url_external_account_credentials.h",
         "src/core/lib/security/credentials/fake/fake_credentials.cc",
         "src/core/lib/security/credentials/fake/fake_credentials.h",
         "src/core/lib/security/credentials/google_default/credentials_generic.cc",
@@ -851,6 +1024,7 @@ config("grpc_config") {
         "src/core/lib/security/credentials/google_default/google_default_credentials.h",
         "src/core/lib/security/credentials/iam/iam_credentials.cc",
         "src/core/lib/security/credentials/iam/iam_credentials.h",
+        "src/core/lib/security/credentials/insecure/insecure_credentials.cc",
         "src/core/lib/security/credentials/jwt/json_token.cc",
         "src/core/lib/security/credentials/jwt/json_token.h",
         "src/core/lib/security/credentials/jwt/jwt_credentials.cc",
@@ -867,6 +1041,8 @@ config("grpc_config") {
         "src/core/lib/security/credentials/ssl/ssl_credentials.h",
         "src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc",
         "src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h",
+        "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc",
+        "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h",
         "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc",
         "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h",
         "src/core/lib/security/credentials/tls/tls_credentials.cc",
@@ -877,6 +1053,8 @@ config("grpc_config") {
         "src/core/lib/security/security_connector/alts/alts_security_connector.h",
         "src/core/lib/security/security_connector/fake/fake_security_connector.cc",
         "src/core/lib/security/security_connector/fake/fake_security_connector.h",
+        "src/core/lib/security/security_connector/insecure/insecure_security_connector.cc",
+        "src/core/lib/security/security_connector/insecure/insecure_security_connector.h",
         "src/core/lib/security/security_connector/load_system_roots.h",
         "src/core/lib/security/security_connector/load_system_roots_fallback.cc",
         "src/core/lib/security/security_connector/load_system_roots_linux.cc",
@@ -1044,6 +1222,7 @@ config("grpc_config") {
         ":absl/types:optional",
         ":absl/strings:strings",
         ":absl/status:status",
+        ":absl/functional:bind_front",
         ":absl/container:inlined_vector",
         ":absl/container:flat_hash_set",
         "//third_party/cares",
@@ -1218,6 +1397,7 @@ config("grpc_config") {
         "include/grpcpp/security/auth_metadata_processor.h",
         "include/grpcpp/security/credentials.h",
         "include/grpcpp/security/server_credentials.h",
+        "include/grpcpp/security/tls_certificate_provider.h",
         "include/grpcpp/security/tls_credentials_options.h",
         "include/grpcpp/server.h",
         "include/grpcpp/server_builder.h",
@@ -1257,6 +1437,7 @@ config("grpc_config") {
         "src/cpp/client/insecure_credentials.cc",
         "src/cpp/client/secure_credentials.cc",
         "src/cpp/client/secure_credentials.h",
+        "src/cpp/client/xds_credentials.cc",
         "src/cpp/codegen/codegen_init.cc",
         "src/cpp/common/alarm.cc",
         "src/cpp/common/auth_property_iterator.cc",
@@ -1271,6 +1452,7 @@ config("grpc_config") {
         "src/cpp/common/secure_auth_context.h",
         "src/cpp/common/secure_channel_arguments.cc",
         "src/cpp/common/secure_create_auth_context.cc",
+        "src/cpp/common/tls_certificate_provider.cc",
         "src/cpp/common/tls_credentials_options.cc",
         "src/cpp/common/tls_credentials_options_util.cc",
         "src/cpp/common/tls_credentials_options_util.h",
index e9f0823..531e3dc 100644 (file)
@@ -19,8 +19,6 @@ If you plan to build using CMake
 
 If you are a contributor and plan to build and run tests, install the following as well:
 ```sh
- $ # libgflags-dev is only required if building with make (deprecated)
- $ [sudo] apt-get install libgflags-dev
  $ # clang and LLVM C++ lib is only required for sanitizer builds
  $ [sudo] apt-get install clang-5.0 libc++-dev
 ```
@@ -45,12 +43,6 @@ packages from [Homebrew](https://brew.sh):
 
 If you plan to build using CMake, follow the instructions from https://cmake.org/download/
 
-If you are a contributor and plan to build and run tests, install the following as well:
-```sh
- $ # gflags is only required if building with make (deprecated) 
- $ brew install gflags
-```
-
 *Tip*: when building,
 you *may* want to explicitly set the `LIBTOOL` and `LIBTOOLIZE`
 environment variables when running `make` to ensure the version
index 0f0c47a..de5e000 100644 (file)
 cmake_minimum_required(VERSION 3.5.1)
 
 set(PACKAGE_NAME          "grpc")
-set(PACKAGE_VERSION       "1.33.2")
-set(gRPC_CORE_VERSION     "13.0.0")
-set(gRPC_CORE_SOVERSION   "13")
-set(gRPC_CPP_VERSION      "1.33.2")
+set(PACKAGE_VERSION       "1.34.0")
+set(gRPC_CORE_VERSION     "14.0.0")
+set(gRPC_CORE_SOVERSION   "14")
+set(gRPC_CPP_VERSION      "1.34.0")
 set(gRPC_CPP_SOVERSION    "1")
-set(gRPC_CSHARP_VERSION   "2.33.2")
+set(gRPC_CSHARP_VERSION   "2.34.0")
 set(gRPC_CSHARP_SOVERSION "2")
 set(PACKAGE_STRING        "${PACKAGE_NAME} ${PACKAGE_VERSION}")
 set(PACKAGE_TARNAME       "${PACKAGE_NAME}-${PACKAGE_VERSION}")
@@ -88,13 +88,9 @@ set(gRPC_PROTOBUF_PACKAGE_TYPE "" CACHE STRING "Algorithm for searching protobuf
 set_property(CACHE gRPC_PROTOBUF_PACKAGE_TYPE PROPERTY STRINGS "CONFIG" "MODULE")
 
 if(gRPC_BUILD_TESTS)
-  set(gRPC_GFLAGS_PROVIDER "module" CACHE STRING "Provider of gflags library")
-  set_property(CACHE gRPC_GFLAGS_PROVIDER PROPERTY STRINGS "module" "package")
-
   set(gRPC_BENCHMARK_PROVIDER "module" CACHE STRING "Provider of benchmark library")
   set_property(CACHE gRPC_BENCHMARK_PROVIDER PROPERTY STRINGS "module" "package")
 else()
-  set(gRPC_GFLAGS_PROVIDER "none")
   set(gRPC_BENCHMARK_PROVIDER "none")
 endif()
 
@@ -109,6 +105,7 @@ set(gRPC_ABSL_USED_TARGETS
   absl_bad_variant_access
   absl_base
   absl_base_internal
+  absl_bind_front
   absl_bits
   absl_city
   absl_civil_time
@@ -236,8 +233,8 @@ endif()
 if(gRPC_BACKWARDS_COMPATIBILITY_MODE)
   add_definitions(-DGPR_BACKWARDS_COMPATIBILITY_MODE)
   if(_gRPC_PLATFORM_MAC)
-    # some C++11 constructs not supported before OS X 10.9
-    set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9)
+    # some C++11 constructs not supported before OS X 10.10
+    set(CMAKE_OSX_DEPLOYMENT_TARGET 10.10)
   endif()
 endif()
 
@@ -251,7 +248,6 @@ include(cmake/abseil-cpp.cmake)
 include(cmake/address_sorting.cmake)
 include(cmake/benchmark.cmake)
 include(cmake/cares.cmake)
-include(cmake/gflags.cmake)
 include(cmake/protobuf.cmake)
 include(cmake/re2.cmake)
 include(cmake/ssl.cmake)
@@ -489,6 +485,9 @@ protobuf_generate_grpc_cpp(
   src/proto/grpc/testing/xds/v3/percent.proto
 )
 protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/xds/v3/protocol.proto
+)
+protobuf_generate_grpc_cpp(
   src/proto/grpc/testing/xds/v3/range.proto
 )
 protobuf_generate_grpc_cpp(
@@ -552,8 +551,8 @@ if(gRPC_BUILD_TESTS)
   add_dependencies(buildtests_c concurrent_connectivity_test)
   add_dependencies(buildtests_c connection_refused_test)
   add_dependencies(buildtests_c cpu_test)
-  add_dependencies(buildtests_c dns_resolver_connectivity_using_ares_resolver_test)
-  add_dependencies(buildtests_c dns_resolver_connectivity_using_native_resolver_test)
+  add_dependencies(buildtests_c dns_resolver_connectivity_using_ares_test)
+  add_dependencies(buildtests_c dns_resolver_connectivity_using_native_test)
   add_dependencies(buildtests_c dns_resolver_cooldown_test)
   add_dependencies(buildtests_c dns_resolver_test)
   if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
@@ -705,13 +704,14 @@ if(gRPC_BUILD_TESTS)
   if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     add_dependencies(buildtests_cxx alarm_test)
   endif()
-  if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
+  if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     add_dependencies(buildtests_cxx alts_concurrent_connectivity_test)
   endif()
   add_dependencies(buildtests_cxx alts_util_test)
   add_dependencies(buildtests_cxx async_end2end_test)
   add_dependencies(buildtests_cxx auth_property_iterator_test)
   add_dependencies(buildtests_cxx authorization_engine_test)
+  add_dependencies(buildtests_cxx aws_request_signer_test)
   add_dependencies(buildtests_cxx backoff_test)
   add_dependencies(buildtests_cxx bad_streaming_id_bad_client_test)
   add_dependencies(buildtests_cxx badreq_bad_client_test)
@@ -785,6 +785,7 @@ if(gRPC_BUILD_TESTS)
   add_dependencies(buildtests_cxx byte_stream_test)
   add_dependencies(buildtests_cxx cancel_ares_query_test)
   add_dependencies(buildtests_cxx certificate_provider_registry_test)
+  add_dependencies(buildtests_cxx certificate_provider_store_test)
   add_dependencies(buildtests_cxx cfstream_test)
   add_dependencies(buildtests_cxx channel_arguments_test)
   add_dependencies(buildtests_cxx channel_filter_test)
@@ -814,7 +815,11 @@ if(gRPC_BUILD_TESTS)
   add_dependencies(buildtests_cxx error_details_test)
   add_dependencies(buildtests_cxx evaluate_args_test)
   add_dependencies(buildtests_cxx eventmanager_libuv_test)
+  if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
+    add_dependencies(buildtests_cxx examine_stack_test)
+  endif()
   add_dependencies(buildtests_cxx exception_test)
+  add_dependencies(buildtests_cxx file_watcher_certificate_provider_factory_test)
   add_dependencies(buildtests_cxx filter_end2end_test)
   add_dependencies(buildtests_cxx flaky_network_test)
   add_dependencies(buildtests_cxx generic_end2end_test)
@@ -841,6 +846,7 @@ if(gRPC_BUILD_TESTS)
   add_dependencies(buildtests_cxx hybrid_end2end_test)
   add_dependencies(buildtests_cxx init_test)
   add_dependencies(buildtests_cxx initial_settings_frame_bad_client_test)
+  add_dependencies(buildtests_cxx insecure_security_connector_test)
   add_dependencies(buildtests_cxx interop_client)
   add_dependencies(buildtests_cxx interop_server)
   if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
@@ -891,6 +897,10 @@ if(gRPC_BUILD_TESTS)
   add_dependencies(buildtests_cxx settings_timeout_test)
   add_dependencies(buildtests_cxx shutdown_test)
   add_dependencies(buildtests_cxx simple_request_bad_client_test)
+  if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
+    add_dependencies(buildtests_cxx stack_tracer_test)
+  endif()
+  add_dependencies(buildtests_cxx stat_test)
   add_dependencies(buildtests_cxx static_metadata_test)
   add_dependencies(buildtests_cxx stats_test)
   add_dependencies(buildtests_cxx status_metadata_test)
@@ -903,6 +913,7 @@ if(gRPC_BUILD_TESTS)
   endif()
   add_dependencies(buildtests_cxx string_ref_test)
   add_dependencies(buildtests_cxx test_cpp_client_credentials_test)
+  add_dependencies(buildtests_cxx test_cpp_server_credentials_test)
   add_dependencies(buildtests_cxx test_cpp_util_slice_test)
   add_dependencies(buildtests_cxx test_cpp_util_time_test)
   add_dependencies(buildtests_cxx thread_manager_test)
@@ -924,6 +935,8 @@ if(gRPC_BUILD_TESTS)
     add_dependencies(buildtests_cxx writes_per_rpc_test)
   endif()
   add_dependencies(buildtests_cxx xds_bootstrap_test)
+  add_dependencies(buildtests_cxx xds_certificate_provider_test)
+  add_dependencies(buildtests_cxx xds_credentials_end2end_test)
   if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     add_dependencies(buildtests_cxx xds_end2end_test)
   endif()
@@ -1300,10 +1313,13 @@ add_library(gpr
   src/core/lib/gpr/tmpfile_windows.cc
   src/core/lib/gpr/wrap_memcpy.cc
   src/core/lib/gprpp/arena.cc
+  src/core/lib/gprpp/examine_stack.cc
   src/core/lib/gprpp/fork.cc
   src/core/lib/gprpp/global_config_env.cc
   src/core/lib/gprpp/host_port.cc
   src/core/lib/gprpp/mpscq.cc
+  src/core/lib/gprpp/stat_posix.cc
+  src/core/lib/gprpp/stat_windows.cc
   src/core/lib/gprpp/thd_posix.cc
   src/core/lib/gprpp/thd_windows.cc
   src/core/lib/profiling/basic_timers.cc
@@ -1340,10 +1356,12 @@ target_include_directories(gpr
 )
 target_link_libraries(gpr
   ${_gRPC_ALLTARGETS_LIBRARIES}
+  absl::optional
   absl::time
   absl::synchronization
   absl::strings
   absl::str_format
+  absl::status
   absl::memory
   absl::base
 )
@@ -1443,7 +1461,7 @@ add_library(grpc
   src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc
   src/core/ext/filters/client_channel/lb_policy/xds/cds.cc
   src/core/ext/filters/client_channel/lb_policy/xds/eds.cc
-  src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc
+  src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc
   src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc
   src/core/ext/filters/client_channel/lb_policy_registry.cc
   src/core/ext/filters/client_channel/local_subchannel_pool.cc
@@ -1583,7 +1601,6 @@ add_library(grpc
   src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c
   src/core/ext/upb-generated/google/api/http.upb.c
   src/core/ext/upb-generated/google/protobuf/any.upb.c
-  src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
   src/core/ext/upb-generated/google/protobuf/duration.upb.c
   src/core/ext/upb-generated/google/protobuf/empty.upb.c
   src/core/ext/upb-generated/google/protobuf/struct.upb.c
@@ -1608,10 +1625,91 @@ add_library(grpc
   src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c
   src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c
   src/core/ext/upb-generated/validate/validate.upb.c
+  src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c
+  src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c
+  src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c
+  src/core/ext/upbdefs-generated/google/api/http.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c
+  src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c
+  src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c
+  src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c
+  src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c
+  src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c
+  src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c
+  src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c
+  src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c
+  src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c
+  src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c
+  src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c
+  src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c
+  src/core/ext/upbdefs-generated/validate/validate.upbdefs.c
   src/core/ext/xds/certificate_provider_registry.cc
+  src/core/ext/xds/certificate_provider_store.cc
+  src/core/ext/xds/file_watcher_certificate_provider_factory.cc
   src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc
   src/core/ext/xds/xds_api.cc
   src/core/ext/xds/xds_bootstrap.cc
+  src/core/ext/xds/xds_certificate_provider.cc
   src/core/ext/xds/xds_client.cc
   src/core/ext/xds/xds_client_stats.cc
   src/core/lib/avl/avl.cc
@@ -1753,10 +1851,15 @@ add_library(grpc
   src/core/lib/security/credentials/composite/composite_credentials.cc
   src/core/lib/security/credentials/credentials.cc
   src/core/lib/security/credentials/credentials_metadata.cc
+  src/core/lib/security/credentials/external/aws_request_signer.cc
+  src/core/lib/security/credentials/external/external_account_credentials.cc
+  src/core/lib/security/credentials/external/file_external_account_credentials.cc
+  src/core/lib/security/credentials/external/url_external_account_credentials.cc
   src/core/lib/security/credentials/fake/fake_credentials.cc
   src/core/lib/security/credentials/google_default/credentials_generic.cc
   src/core/lib/security/credentials/google_default/google_default_credentials.cc
   src/core/lib/security/credentials/iam/iam_credentials.cc
+  src/core/lib/security/credentials/insecure/insecure_credentials.cc
   src/core/lib/security/credentials/jwt/json_token.cc
   src/core/lib/security/credentials/jwt/jwt_credentials.cc
   src/core/lib/security/credentials/jwt/jwt_verifier.cc
@@ -1765,11 +1868,13 @@ add_library(grpc
   src/core/lib/security/credentials/plugin/plugin_credentials.cc
   src/core/lib/security/credentials/ssl/ssl_credentials.cc
   src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc
+  src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc
   src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc
   src/core/lib/security/credentials/tls/tls_credentials.cc
   src/core/lib/security/credentials/xds/xds_credentials.cc
   src/core/lib/security/security_connector/alts/alts_security_connector.cc
   src/core/lib/security/security_connector/fake/fake_security_connector.cc
+  src/core/lib/security/security_connector/insecure/insecure_security_connector.cc
   src/core/lib/security/security_connector/load_system_roots_fallback.cc
   src/core/lib/security/security_connector/load_system_roots_linux.cc
   src/core/lib/security/security_connector/local/local_security_connector.cc
@@ -1898,6 +2003,7 @@ target_link_libraries(grpc
   absl::optional
   absl::strings
   absl::status
+  absl::bind_front
   absl::inlined_vector
   absl::flat_hash_set
 )
@@ -1987,7 +2093,6 @@ add_library(grpc_test_util
   test/core/util/cmdline.cc
   test/core/util/debugger_macros.cc
   test/core/util/eval_args_mock_endpoint.cc
-  test/core/util/examine_stack.cc
   test/core/util/fuzzer_util.cc
   test/core/util/grpc_profiler.cc
   test/core/util/histogram.cc
@@ -1999,7 +2104,9 @@ add_library(grpc_test_util
   test/core/util/port_isolated_runtime_environment.cc
   test/core/util/port_server_client.cc
   test/core/util/reconnect_server.cc
+  test/core/util/resolve_localhost_ip46.cc
   test/core/util/slice_splitter.cc
+  test/core/util/stack_tracer.cc
   test/core/util/subprocess_posix.cc
   test/core/util/subprocess_windows.cc
   test/core/util/test_config.cc
@@ -2058,7 +2165,6 @@ add_library(grpc_test_util_unsecure
   test/core/util/cmdline.cc
   test/core/util/debugger_macros.cc
   test/core/util/eval_args_mock_endpoint.cc
-  test/core/util/examine_stack.cc
   test/core/util/fuzzer_util.cc
   test/core/util/grpc_profiler.cc
   test/core/util/histogram.cc
@@ -2070,7 +2176,9 @@ add_library(grpc_test_util_unsecure
   test/core/util/port_isolated_runtime_environment.cc
   test/core/util/port_server_client.cc
   test/core/util/reconnect_server.cc
+  test/core/util/resolve_localhost_ip46.cc
   test/core/util/slice_splitter.cc
+  test/core/util/stack_tracer.cc
   test/core/util/subprocess_posix.cc
   test/core/util/subprocess_windows.cc
   test/core/util/test_config.cc
@@ -2229,7 +2337,6 @@ add_library(grpc_unsecure
   src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c
   src/core/ext/upb-generated/google/api/http.upb.c
   src/core/ext/upb-generated/google/protobuf/any.upb.c
-  src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
   src/core/ext/upb-generated/google/protobuf/duration.upb.c
   src/core/ext/upb-generated/google/protobuf/empty.upb.c
   src/core/ext/upb-generated/google/protobuf/struct.upb.c
@@ -2551,7 +2658,6 @@ target_link_libraries(benchmark_helpers
   address_sorting
   upb
   ${_gRPC_BENCHMARK_LIBRARIES}
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 endif()
@@ -2569,6 +2675,7 @@ add_library(grpc++
   src/cpp/client/credentials_cc.cc
   src/cpp/client/insecure_credentials.cc
   src/cpp/client/secure_credentials.cc
+  src/cpp/client/xds_credentials.cc
   src/cpp/codegen/codegen_init.cc
   src/cpp/common/alarm.cc
   src/cpp/common/auth_property_iterator.cc
@@ -2581,6 +2688,7 @@ add_library(grpc++
   src/cpp/common/secure_auth_context.cc
   src/cpp/common/secure_channel_arguments.cc
   src/cpp/common/secure_create_auth_context.cc
+  src/cpp/common/tls_certificate_provider.cc
   src/cpp/common/tls_credentials_options.cc
   src/cpp/common/tls_credentials_options_util.cc
   src/cpp/common/validate_service_config.cc
@@ -2803,6 +2911,7 @@ foreach(_hdr
   include/grpcpp/security/auth_metadata_processor.h
   include/grpcpp/security/credentials.h
   include/grpcpp/security/server_credentials.h
+  include/grpcpp/security/tls_certificate_provider.h
   include/grpcpp/security/tls_credentials_options.h
   include/grpcpp/server.h
   include/grpcpp/server_builder.h
@@ -3105,7 +3214,6 @@ target_link_libraries(grpc++_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 foreach(_hdr
@@ -3167,7 +3275,7 @@ target_link_libraries(grpc++_test_config
   ${_gRPC_PROTOBUF_LIBRARIES}
   ${_gRPC_ALLTARGETS_LIBRARIES}
   gpr
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags_parse
 )
 
 
@@ -3228,7 +3336,7 @@ target_link_libraries(grpc++_test_util
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -3472,6 +3580,7 @@ foreach(_hdr
   include/grpcpp/security/auth_metadata_processor.h
   include/grpcpp/security/credentials.h
   include/grpcpp/security/server_credentials.h
+  include/grpcpp/security/tls_certificate_provider.h
   include/grpcpp/security/tls_credentials_options.h
   include/grpcpp/server.h
   include/grpcpp/server_builder.h
@@ -3636,7 +3745,6 @@ target_link_libraries(grpcpp_channelz
 
 foreach(_hdr
   include/grpcpp/ext/channelz_service_plugin.h
-  include/grpcpp/ext/channelz_service_plugin_impl.h
 )
   string(REPLACE "include/" "" _path ${_hdr})
   get_filename_component(_path ${_path} PATH)
@@ -3665,6 +3773,23 @@ add_library(upb
   third_party/upb/upb/port.c
   third_party/upb/upb/table.c
   third_party/upb/upb/upb.c
+  third_party/upb/upb/def.c
+  third_party/upb/upb/reflection.c
+  third_party/upb/upb/text_encode.c
+  src/core/ext/upb-generated/google/protobuf/any.upb.c
+  src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
+  src/core/ext/upb-generated/google/protobuf/duration.upb.c
+  src/core/ext/upb-generated/google/protobuf/empty.upb.c
+  src/core/ext/upb-generated/google/protobuf/struct.upb.c
+  src/core/ext/upb-generated/google/protobuf/timestamp.upb.c
+  src/core/ext/upb-generated/google/protobuf/wrappers.upb.c
+  src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c
+  src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c
 )
 
 set_target_properties(upb PROPERTIES
@@ -4977,11 +5102,11 @@ target_link_libraries(cpu_test
 endif()
 if(gRPC_BUILD_TESTS)
 
-add_executable(dns_resolver_connectivity_using_ares_resolver_test
+add_executable(dns_resolver_connectivity_using_ares_test
   test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc
 )
 
-target_include_directories(dns_resolver_connectivity_using_ares_resolver_test
+target_include_directories(dns_resolver_connectivity_using_ares_test
   PRIVATE
     ${CMAKE_CURRENT_SOURCE_DIR}
     ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -4994,7 +5119,7 @@ target_include_directories(dns_resolver_connectivity_using_ares_resolver_test
     ${_gRPC_ZLIB_INCLUDE_DIR}
 )
 
-target_link_libraries(dns_resolver_connectivity_using_ares_resolver_test
+target_link_libraries(dns_resolver_connectivity_using_ares_test
   ${_gRPC_ALLTARGETS_LIBRARIES}
   grpc_test_util
   grpc
@@ -5007,11 +5132,11 @@ target_link_libraries(dns_resolver_connectivity_using_ares_resolver_test
 endif()
 if(gRPC_BUILD_TESTS)
 
-add_executable(dns_resolver_connectivity_using_native_resolver_test
+add_executable(dns_resolver_connectivity_using_native_test
   test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc
 )
 
-target_include_directories(dns_resolver_connectivity_using_native_resolver_test
+target_include_directories(dns_resolver_connectivity_using_native_test
   PRIVATE
     ${CMAKE_CURRENT_SOURCE_DIR}
     ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -5024,7 +5149,7 @@ target_include_directories(dns_resolver_connectivity_using_native_resolver_test
     ${_gRPC_ZLIB_INCLUDE_DIR}
 )
 
-target_link_libraries(dns_resolver_connectivity_using_native_resolver_test
+target_link_libraries(dns_resolver_connectivity_using_native_test
   ${_gRPC_ALLTARGETS_LIBRARIES}
   grpc_test_util
   grpc
@@ -8037,7 +8162,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8083,7 +8207,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8125,14 +8248,13 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
 endif()
 endif()
 if(gRPC_BUILD_TESTS)
-if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
+if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
 
   add_executable(alts_concurrent_connectivity_test
     ${_gRPC_PROTO_GENS_DIR}/test/core/tsi/alts/fake_handshaker/handshaker.pb.cc
@@ -8177,7 +8299,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8220,7 +8341,6 @@ target_link_libraries(alts_util_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -8281,7 +8401,6 @@ target_link_libraries(async_end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -8322,7 +8441,6 @@ target_link_libraries(auth_property_iterator_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -8361,7 +8479,44 @@ target_link_libraries(authorization_engine_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(aws_request_signer_test
+  test/core/security/aws_request_signer_test.cc
+  third_party/googletest/googletest/src/gtest-all.cc
+  third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(aws_request_signer_test
+  PRIVATE
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/include
+    ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+    ${_gRPC_RE2_INCLUDE_DIR}
+    ${_gRPC_SSL_INCLUDE_DIR}
+    ${_gRPC_UPB_GENERATED_DIR}
+    ${_gRPC_UPB_GRPC_GENERATED_DIR}
+    ${_gRPC_UPB_INCLUDE_DIR}
+    ${_gRPC_ZLIB_INCLUDE_DIR}
+    third_party/googletest/googletest/include
+    third_party/googletest/googletest
+    third_party/googletest/googlemock/include
+    third_party/googletest/googlemock
+    ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(aws_request_signer_test
+  ${_gRPC_PROTOBUF_LIBRARIES}
+  ${_gRPC_ALLTARGETS_LIBRARIES}
+  grpc_test_util
+  grpc
+  gpr
+  address_sorting
+  upb
 )
 
 
@@ -8400,7 +8555,6 @@ target_link_libraries(backoff_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -8441,7 +8595,6 @@ target_link_libraries(bad_streaming_id_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -8482,7 +8635,6 @@ target_link_libraries(badreq_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -8522,7 +8674,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8567,7 +8718,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8612,7 +8762,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8657,7 +8806,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8702,7 +8850,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8751,7 +8898,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8800,7 +8946,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8845,7 +8990,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8890,7 +9034,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8935,7 +9078,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -8980,7 +9122,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -9025,7 +9166,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -9070,7 +9210,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -9115,7 +9254,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -9160,7 +9298,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -9205,7 +9342,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -9250,7 +9386,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
+    absl::flags
   )
 
 
@@ -9295,7 +9431,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -9340,7 +9475,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -9385,7 +9519,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -9430,7 +9563,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -9475,7 +9607,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
     address_sorting
     upb
     ${_gRPC_BENCHMARK_LIBRARIES}
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -9517,7 +9648,6 @@ target_link_libraries(byte_buffer_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -9556,7 +9686,6 @@ target_link_libraries(byte_stream_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -9600,7 +9729,6 @@ target_link_libraries(cancel_ares_query_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -9639,7 +9767,44 @@ target_link_libraries(certificate_provider_registry_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(certificate_provider_store_test
+  test/core/xds/certificate_provider_store_test.cc
+  third_party/googletest/googletest/src/gtest-all.cc
+  third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(certificate_provider_store_test
+  PRIVATE
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/include
+    ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+    ${_gRPC_RE2_INCLUDE_DIR}
+    ${_gRPC_SSL_INCLUDE_DIR}
+    ${_gRPC_UPB_GENERATED_DIR}
+    ${_gRPC_UPB_GRPC_GENERATED_DIR}
+    ${_gRPC_UPB_INCLUDE_DIR}
+    ${_gRPC_ZLIB_INCLUDE_DIR}
+    third_party/googletest/googletest/include
+    third_party/googletest/googletest
+    third_party/googletest/googlemock/include
+    third_party/googletest/googlemock
+    ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(certificate_provider_store_test
+  ${_gRPC_PROTOBUF_LIBRARIES}
+  ${_gRPC_ALLTARGETS_LIBRARIES}
+  grpc_test_util
+  grpc
+  gpr
+  address_sorting
+  upb
 )
 
 
@@ -9693,7 +9858,6 @@ target_link_libraries(cfstream_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -9733,7 +9897,6 @@ target_link_libraries(channel_arguments_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -9773,7 +9936,6 @@ target_link_libraries(channel_filter_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -9818,7 +9980,6 @@ target_link_libraries(channel_trace_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -9858,7 +10019,6 @@ target_link_libraries(channelz_registry_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -9913,7 +10073,6 @@ target_link_libraries(channelz_service_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -9958,7 +10117,6 @@ target_link_libraries(channelz_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10021,7 +10179,7 @@ target_link_libraries(cli_call_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -10076,7 +10234,6 @@ target_link_libraries(client_callback_end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10139,7 +10296,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -10195,7 +10351,6 @@ target_link_libraries(client_interceptors_end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10259,7 +10414,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -10300,7 +10454,6 @@ target_link_libraries(codegen_test_full
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10340,7 +10493,6 @@ target_link_libraries(codegen_test_minimal
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10381,7 +10533,6 @@ target_link_libraries(connection_prefix_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10420,7 +10571,6 @@ target_link_libraries(connectivity_state_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10459,7 +10609,6 @@ target_link_libraries(context_list_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10513,7 +10662,6 @@ target_link_libraries(delegating_channel_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10554,7 +10702,6 @@ target_link_libraries(destroy_grpclb_channel_with_active_connect_stress_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10593,7 +10740,6 @@ target_link_libraries(dual_ref_counted_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10634,7 +10780,6 @@ target_link_libraries(duplicate_header_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10694,7 +10839,6 @@ target_link_libraries(end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10739,7 +10883,6 @@ target_link_libraries(error_details_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10778,7 +10921,6 @@ target_link_libraries(evaluate_args_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10817,12 +10959,53 @@ target_link_libraries(eventmanager_libuv_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
 endif()
 if(gRPC_BUILD_TESTS)
+if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
+
+  add_executable(examine_stack_test
+    test/core/gprpp/examine_stack_test.cc
+    third_party/googletest/googletest/src/gtest-all.cc
+    third_party/googletest/googlemock/src/gmock-all.cc
+  )
+
+  target_include_directories(examine_stack_test
+    PRIVATE
+      ${CMAKE_CURRENT_SOURCE_DIR}
+      ${CMAKE_CURRENT_SOURCE_DIR}/include
+      ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+      ${_gRPC_RE2_INCLUDE_DIR}
+      ${_gRPC_SSL_INCLUDE_DIR}
+      ${_gRPC_UPB_GENERATED_DIR}
+      ${_gRPC_UPB_GRPC_GENERATED_DIR}
+      ${_gRPC_UPB_INCLUDE_DIR}
+      ${_gRPC_ZLIB_INCLUDE_DIR}
+      third_party/googletest/googletest/include
+      third_party/googletest/googletest
+      third_party/googletest/googlemock/include
+      third_party/googletest/googlemock
+      ${_gRPC_PROTO_GENS_DIR}
+  )
+
+  target_link_libraries(examine_stack_test
+    ${_gRPC_PROTOBUF_LIBRARIES}
+    ${_gRPC_ALLTARGETS_LIBRARIES}
+    grpc_test_util
+    grpc
+    gpr
+    address_sorting
+    upb
+    absl::symbolize
+    absl::stacktrace
+  )
+
+
+endif()
+endif()
+if(gRPC_BUILD_TESTS)
 
 add_executable(exception_test
   ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc
@@ -10870,7 +11053,44 @@ target_link_libraries(exception_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(file_watcher_certificate_provider_factory_test
+  test/core/xds/file_watcher_certificate_provider_factory_test.cc
+  third_party/googletest/googletest/src/gtest-all.cc
+  third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(file_watcher_certificate_provider_factory_test
+  PRIVATE
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/include
+    ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+    ${_gRPC_RE2_INCLUDE_DIR}
+    ${_gRPC_SSL_INCLUDE_DIR}
+    ${_gRPC_UPB_GENERATED_DIR}
+    ${_gRPC_UPB_GRPC_GENERATED_DIR}
+    ${_gRPC_UPB_INCLUDE_DIR}
+    ${_gRPC_ZLIB_INCLUDE_DIR}
+    third_party/googletest/googletest/include
+    third_party/googletest/googletest
+    third_party/googletest/googlemock/include
+    third_party/googletest/googlemock
+    ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(file_watcher_certificate_provider_factory_test
+  ${_gRPC_PROTOBUF_LIBRARIES}
+  ${_gRPC_ALLTARGETS_LIBRARIES}
+  grpc_test_util
+  grpc
+  gpr
+  address_sorting
+  upb
 )
 
 
@@ -10927,7 +11147,6 @@ target_link_libraries(filter_end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -10981,7 +11200,6 @@ target_link_libraries(flaky_network_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -11038,7 +11256,6 @@ target_link_libraries(generic_end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -11078,7 +11295,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -11118,7 +11334,6 @@ target_link_libraries(global_config_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -11157,7 +11372,6 @@ target_link_libraries(google_mesh_ca_certificate_provider_factory_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -11207,7 +11421,7 @@ target_link_libraries(grpc_cli
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -11512,7 +11726,6 @@ target_link_libraries(grpc_tls_certificate_distributor_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -11551,7 +11764,6 @@ target_link_libraries(grpc_tls_credentials_options_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -11612,7 +11824,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
+    absl::flags
   )
 
 
@@ -11658,7 +11870,6 @@ target_link_libraries(grpclb_api_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -11721,7 +11932,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -11762,7 +11972,6 @@ target_link_libraries(h2_ssl_session_reuse_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -11803,7 +12012,6 @@ target_link_libraries(head_of_line_blocking_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -11844,7 +12052,6 @@ target_link_libraries(headers_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -11907,7 +12114,6 @@ target_link_libraries(health_service_end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -11961,7 +12167,7 @@ target_link_libraries(http2_client
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -12019,7 +12225,6 @@ target_link_libraries(hybrid_end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12058,7 +12263,6 @@ target_link_libraries(init_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12099,7 +12303,44 @@ target_link_libraries(initial_settings_frame_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(insecure_security_connector_test
+  test/core/security/insecure_security_connector_test.cc
+  third_party/googletest/googletest/src/gtest-all.cc
+  third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(insecure_security_connector_test
+  PRIVATE
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/include
+    ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+    ${_gRPC_RE2_INCLUDE_DIR}
+    ${_gRPC_SSL_INCLUDE_DIR}
+    ${_gRPC_UPB_GENERATED_DIR}
+    ${_gRPC_UPB_GRPC_GENERATED_DIR}
+    ${_gRPC_UPB_INCLUDE_DIR}
+    ${_gRPC_ZLIB_INCLUDE_DIR}
+    third_party/googletest/googletest/include
+    third_party/googletest/googletest
+    third_party/googletest/googlemock/include
+    third_party/googletest/googlemock
+    ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(insecure_security_connector_test
+  ${_gRPC_PROTOBUF_LIBRARIES}
+  ${_gRPC_ALLTARGETS_LIBRARIES}
+  grpc_test_util
+  grpc
+  gpr
+  address_sorting
+  upb
 )
 
 
@@ -12156,7 +12397,7 @@ target_link_libraries(interop_client
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -12212,7 +12453,7 @@ target_link_libraries(interop_server
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -12255,7 +12496,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
+    absl::flags
   )
 
 
@@ -12295,7 +12536,6 @@ target_link_libraries(json_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12336,7 +12576,6 @@ target_link_libraries(large_metadata_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12380,7 +12619,6 @@ target_link_libraries(lb_get_cpu_stats_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12421,7 +12659,6 @@ target_link_libraries(lb_load_data_store_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12460,7 +12697,6 @@ target_link_libraries(linux_system_roots_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12514,7 +12750,6 @@ target_link_libraries(message_allocator_end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12572,7 +12807,6 @@ target_link_libraries(mock_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12625,7 +12859,6 @@ target_link_libraries(nonblocking_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12665,7 +12898,6 @@ target_link_libraries(noop-benchmark
   address_sorting
   upb
   ${_gRPC_BENCHMARK_LIBRARIES}
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12704,7 +12936,6 @@ target_link_libraries(orphanable_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12745,7 +12976,6 @@ target_link_libraries(out_of_bounds_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12784,7 +13014,6 @@ target_link_libraries(pid_controller_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12838,7 +13067,6 @@ target_link_libraries(port_sharing_end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12898,7 +13126,6 @@ target_link_libraries(proto_server_reflection_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -12938,7 +13165,6 @@ target_link_libraries(proto_utils_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13026,7 +13252,7 @@ target_link_libraries(qps_json_driver
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -13106,7 +13332,7 @@ target_link_libraries(qps_worker
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -13164,7 +13390,6 @@ target_link_libraries(raw_end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13203,7 +13428,6 @@ target_link_libraries(ref_counted_ptr_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13242,7 +13466,6 @@ target_link_libraries(ref_counted_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13282,7 +13505,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -13322,7 +13544,6 @@ target_link_libraries(retry_throttle_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13363,7 +13584,6 @@ target_link_libraries(secure_auth_context_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13421,7 +13641,6 @@ target_link_libraries(server_builder_plugin_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13474,7 +13693,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -13528,7 +13746,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -13568,7 +13785,6 @@ target_link_libraries(server_chttp2_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13610,7 +13826,6 @@ target_link_libraries(server_context_test_spouse_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13663,7 +13878,6 @@ target_link_libraries(server_early_return_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13718,7 +13932,6 @@ target_link_libraries(server_interceptors_end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13759,7 +13972,6 @@ target_link_libraries(server_registered_method_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13812,7 +14024,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -13871,7 +14082,6 @@ target_link_libraries(service_config_end2end_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13910,7 +14120,6 @@ target_link_libraries(service_config_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -13949,7 +14158,6 @@ target_link_libraries(settings_timeout_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14006,7 +14214,6 @@ target_link_libraries(shutdown_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14047,7 +14254,85 @@ target_link_libraries(simple_request_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
+
+  add_executable(stack_tracer_test
+    test/core/util/stack_tracer_test.cc
+    third_party/googletest/googletest/src/gtest-all.cc
+    third_party/googletest/googlemock/src/gmock-all.cc
+  )
+
+  target_include_directories(stack_tracer_test
+    PRIVATE
+      ${CMAKE_CURRENT_SOURCE_DIR}
+      ${CMAKE_CURRENT_SOURCE_DIR}/include
+      ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+      ${_gRPC_RE2_INCLUDE_DIR}
+      ${_gRPC_SSL_INCLUDE_DIR}
+      ${_gRPC_UPB_GENERATED_DIR}
+      ${_gRPC_UPB_GRPC_GENERATED_DIR}
+      ${_gRPC_UPB_INCLUDE_DIR}
+      ${_gRPC_ZLIB_INCLUDE_DIR}
+      third_party/googletest/googletest/include
+      third_party/googletest/googletest
+      third_party/googletest/googlemock/include
+      third_party/googletest/googlemock
+      ${_gRPC_PROTO_GENS_DIR}
+  )
+
+  target_link_libraries(stack_tracer_test
+    ${_gRPC_PROTOBUF_LIBRARIES}
+    ${_gRPC_ALLTARGETS_LIBRARIES}
+    grpc_test_util
+    grpc
+    gpr
+    address_sorting
+    upb
+    absl::symbolize
+  )
+
+
+endif()
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(stat_test
+  test/core/gprpp/stat_test.cc
+  third_party/googletest/googletest/src/gtest-all.cc
+  third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(stat_test
+  PRIVATE
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/include
+    ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+    ${_gRPC_RE2_INCLUDE_DIR}
+    ${_gRPC_SSL_INCLUDE_DIR}
+    ${_gRPC_UPB_GENERATED_DIR}
+    ${_gRPC_UPB_GRPC_GENERATED_DIR}
+    ${_gRPC_UPB_INCLUDE_DIR}
+    ${_gRPC_ZLIB_INCLUDE_DIR}
+    third_party/googletest/googletest/include
+    third_party/googletest/googletest
+    third_party/googletest/googlemock/include
+    third_party/googletest/googlemock
+    ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(stat_test
+  ${_gRPC_PROTOBUF_LIBRARIES}
+  ${_gRPC_ALLTARGETS_LIBRARIES}
+  grpc_test_util
+  grpc
+  gpr
+  address_sorting
+  upb
 )
 
 
@@ -14086,7 +14371,6 @@ target_link_libraries(static_metadata_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14125,7 +14409,6 @@ target_link_libraries(stats_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14164,7 +14447,6 @@ target_link_libraries(status_metadata_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14203,7 +14485,6 @@ target_link_libraries(status_util_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14244,7 +14525,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -14303,7 +14583,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -14344,7 +14623,6 @@ target_link_libraries(string_ref_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14384,7 +14662,45 @@ target_link_libraries(test_cpp_client_credentials_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(test_cpp_server_credentials_test
+  test/cpp/server/credentials_test.cc
+  third_party/googletest/googletest/src/gtest-all.cc
+  third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(test_cpp_server_credentials_test
+  PRIVATE
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/include
+    ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+    ${_gRPC_RE2_INCLUDE_DIR}
+    ${_gRPC_SSL_INCLUDE_DIR}
+    ${_gRPC_UPB_GENERATED_DIR}
+    ${_gRPC_UPB_GRPC_GENERATED_DIR}
+    ${_gRPC_UPB_INCLUDE_DIR}
+    ${_gRPC_ZLIB_INCLUDE_DIR}
+    third_party/googletest/googletest/include
+    third_party/googletest/googletest
+    third_party/googletest/googlemock/include
+    third_party/googletest/googlemock
+    ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(test_cpp_server_credentials_test
+  ${_gRPC_PROTOBUF_LIBRARIES}
+  ${_gRPC_ALLTARGETS_LIBRARIES}
+  grpc_test_util
+  grpc++
+  grpc
+  gpr
+  address_sorting
+  upb
 )
 
 
@@ -14425,7 +14741,6 @@ target_link_libraries(test_cpp_util_slice_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14466,7 +14781,6 @@ target_link_libraries(test_cpp_util_time_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14508,7 +14822,6 @@ target_link_libraries(thread_manager_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14566,7 +14879,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -14608,7 +14920,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -14649,7 +14960,6 @@ target_link_libraries(timer_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14688,7 +14998,6 @@ target_link_libraries(tls_security_connector_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14731,7 +15040,6 @@ target_link_libraries(too_many_pings_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14772,7 +15080,6 @@ target_link_libraries(unknown_frame_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14813,7 +15120,6 @@ target_link_libraries(window_overflow_bad_client_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
 )
 
 
@@ -14853,7 +15159,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -14878,7 +15183,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     test/core/util/cmdline.cc
     test/core/util/debugger_macros.cc
     test/core/util/eval_args_mock_endpoint.cc
-    test/core/util/examine_stack.cc
     test/core/util/fuzzer_util.cc
     test/core/util/grpc_profiler.cc
     test/core/util/histogram.cc
@@ -14890,7 +15194,9 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     test/core/util/port_isolated_runtime_environment.cc
     test/core/util/port_server_client.cc
     test/core/util/reconnect_server.cc
+    test/core/util/resolve_localhost_ip46.cc
     test/core/util/slice_splitter.cc
+    test/core/util/stack_tracer.cc
     test/core/util/subprocess_posix.cc
     test/core/util/subprocess_windows.cc
     test/core/util/test_config.cc
@@ -14931,7 +15237,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     absl::symbolize
     absl::stacktrace
     absl::failure_signal_handler
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -14940,7 +15245,7 @@ endif()
 if(gRPC_BUILD_TESTS)
 
 add_executable(xds_bootstrap_test
-  test/core/client_channel/xds_bootstrap_test.cc
+  test/core/xds/xds_bootstrap_test.cc
   third_party/googletest/googletest/src/gtest-all.cc
   third_party/googletest/googlemock/src/gmock-all.cc
 )
@@ -14971,7 +15276,97 @@ target_link_libraries(xds_bootstrap_test
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(xds_certificate_provider_test
+  test/core/xds/xds_certificate_provider_test.cc
+  third_party/googletest/googletest/src/gtest-all.cc
+  third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(xds_certificate_provider_test
+  PRIVATE
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/include
+    ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+    ${_gRPC_RE2_INCLUDE_DIR}
+    ${_gRPC_SSL_INCLUDE_DIR}
+    ${_gRPC_UPB_GENERATED_DIR}
+    ${_gRPC_UPB_GRPC_GENERATED_DIR}
+    ${_gRPC_UPB_INCLUDE_DIR}
+    ${_gRPC_ZLIB_INCLUDE_DIR}
+    third_party/googletest/googletest/include
+    third_party/googletest/googletest
+    third_party/googletest/googlemock/include
+    third_party/googletest/googlemock
+    ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(xds_certificate_provider_test
+  ${_gRPC_PROTOBUF_LIBRARIES}
+  ${_gRPC_ALLTARGETS_LIBRARIES}
+  grpc_test_util
+  grpc
+  gpr
+  address_sorting
+  upb
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(xds_credentials_end2end_test
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h
+  test/cpp/end2end/test_service_impl.cc
+  test/cpp/end2end/xds_credentials_end2end_test.cc
+  third_party/googletest/googletest/src/gtest-all.cc
+  third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(xds_credentials_end2end_test
+  PRIVATE
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/include
+    ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+    ${_gRPC_RE2_INCLUDE_DIR}
+    ${_gRPC_SSL_INCLUDE_DIR}
+    ${_gRPC_UPB_GENERATED_DIR}
+    ${_gRPC_UPB_GRPC_GENERATED_DIR}
+    ${_gRPC_UPB_INCLUDE_DIR}
+    ${_gRPC_ZLIB_INCLUDE_DIR}
+    third_party/googletest/googletest/include
+    third_party/googletest/googletest
+    third_party/googletest/googlemock/include
+    third_party/googletest/googlemock
+    ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(xds_credentials_end2end_test
+  ${_gRPC_PROTOBUF_LIBRARIES}
+  ${_gRPC_ALLTARGETS_LIBRARIES}
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr
+  address_sorting
+  upb
 )
 
 
@@ -15064,6 +15459,10 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/percent.grpc.pb.cc
     ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/percent.pb.h
     ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/percent.grpc.pb.h
+    ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/protocol.pb.cc
+    ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/protocol.grpc.pb.cc
+    ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/protocol.pb.h
+    ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/protocol.grpc.pb.h
     ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/range.pb.cc
     ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/range.grpc.pb.cc
     ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/range.pb.h
@@ -15110,7 +15509,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
     gpr
     address_sorting
     upb
-    ${_gRPC_GFLAGS_LIBRARIES}
   )
 
 
@@ -15164,7 +15562,7 @@ target_link_libraries(xds_interop_client
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15217,7 +15615,7 @@ target_link_libraries(xds_interop_server
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15258,7 +15656,7 @@ target_link_libraries(alts_credentials_fuzzer_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15299,7 +15697,7 @@ target_link_libraries(client_fuzzer_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15340,7 +15738,7 @@ target_link_libraries(hpack_parser_fuzzer_test_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15381,7 +15779,7 @@ target_link_libraries(http_request_fuzzer_test_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15422,7 +15820,7 @@ target_link_libraries(http_response_fuzzer_test_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15463,7 +15861,7 @@ target_link_libraries(json_fuzzer_test_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15504,7 +15902,7 @@ target_link_libraries(nanopb_fuzzer_response_test_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15545,7 +15943,7 @@ target_link_libraries(nanopb_fuzzer_serverlist_test_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15586,7 +15984,7 @@ target_link_libraries(percent_decode_fuzzer_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15627,7 +16025,7 @@ target_link_libraries(percent_encode_fuzzer_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15668,7 +16066,7 @@ target_link_libraries(server_fuzzer_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15709,7 +16107,7 @@ target_link_libraries(ssl_server_fuzzer_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15750,7 +16148,7 @@ target_link_libraries(uri_fuzzer_test_one_entry
   gpr
   address_sorting
   upb
-  ${_gRPC_GFLAGS_LIBRARIES}
+  absl::flags
 )
 
 
@@ -15814,7 +16212,7 @@ generate_pkgconfig(
   "gRPC platform support library"
   "${gRPC_CORE_VERSION}"
   ""
-  "-lgpr -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity -labsl_dynamic_annotations"
+  "-lgpr -labsl_status -labsl_cord -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_bad_optional_access -labsl_raw_logging_internal -labsl_log_severity"
   ""
   "gpr.pc")
 
@@ -15824,7 +16222,7 @@ generate_pkgconfig(
   "high performance general RPC framework"
   "${gRPC_CORE_VERSION}"
   "gpr openssl"
-  "-lgrpc -laddress_sorting -lre2 -lupb -lcares -lz -labsl_raw_hash_set -labsl_hashtablez_sampler -labsl_exponential_biased -labsl_hash -labsl_bad_variant_access -labsl_city -labsl_status -labsl_cord -labsl_bad_optional_access -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity -labsl_dynamic_annotations"
+  "-lgrpc -laddress_sorting -lre2 -lupb -lcares -lz -labsl_raw_hash_set -labsl_hashtablez_sampler -labsl_exponential_biased -labsl_hash -labsl_bad_variant_access -labsl_city -labsl_status -labsl_cord -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_bad_optional_access -labsl_raw_logging_internal -labsl_log_severity"
   ""
   "grpc.pc")
 
@@ -15834,7 +16232,7 @@ generate_pkgconfig(
   "high performance general RPC framework without SSL"
   "${gRPC_CORE_VERSION}"
   "gpr"
-  "-lgrpc_unsecure -labsl_status -labsl_cord -labsl_bad_optional_access -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity -labsl_dynamic_annotations"
+  "-lgrpc_unsecure -labsl_status -labsl_cord -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_bad_optional_access -labsl_raw_logging_internal -labsl_log_severity"
   ""
   "grpc_unsecure.pc")
 
@@ -15844,7 +16242,7 @@ generate_pkgconfig(
   "C++ wrapper for gRPC"
   "${gRPC_CPP_VERSION}"
   "grpc"
-  "-lgrpc++ -labsl_raw_hash_set -labsl_hashtablez_sampler -labsl_exponential_biased -labsl_hash -labsl_bad_variant_access -labsl_city -labsl_status -labsl_cord -labsl_bad_optional_access -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity -labsl_dynamic_annotations"
+  "-lgrpc++ -labsl_raw_hash_set -labsl_hashtablez_sampler -labsl_exponential_biased -labsl_hash -labsl_bad_variant_access -labsl_city -labsl_status -labsl_cord -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_bad_optional_access -labsl_raw_logging_internal -labsl_log_severity"
   ""
   "grpc++.pc")
 
@@ -15854,6 +16252,6 @@ generate_pkgconfig(
   "C++ wrapper for gRPC without SSL"
   "${gRPC_CPP_VERSION}"
   "grpc_unsecure"
-  "-lgrpc++_unsecure -labsl_status -labsl_cord -labsl_bad_optional_access -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity -labsl_dynamic_annotations"
+  "-lgrpc++_unsecure -labsl_status -labsl_cord -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_bad_optional_access -labsl_raw_logging_internal -labsl_log_severity"
   ""
   "grpc++_unsecure.pc")
index 45ab9f0..f746995 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -79,31 +79,6 @@ GENDIR = $(BUILDDIR_ABSOLUTE)/gens
 
 # Configurations (as defined under "configs" section in build_handwritten.yaml)
 
-VALID_CONFIG_opt = 1
-CC_opt = $(DEFAULT_CC)
-CXX_opt = $(DEFAULT_CXX)
-LD_opt = $(DEFAULT_CC)
-LDXX_opt = $(DEFAULT_CXX)
-CPPFLAGS_opt = -O2 -Wframe-larger-than=16384
-DEFINES_opt = NDEBUG
-
-VALID_CONFIG_asan-trace-cmp = 1
-REQUIRE_CUSTOM_LIBRARIES_asan-trace-cmp = 1
-CC_asan-trace-cmp = clang
-CXX_asan-trace-cmp = clang++
-LD_asan-trace-cmp = clang++
-LDXX_asan-trace-cmp = clang++
-CPPFLAGS_asan-trace-cmp = -O0 -fsanitize-coverage=edge,trace-pc-guard -fsanitize-coverage=trace-cmp -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS
-LDFLAGS_asan-trace-cmp = -fsanitize=address
-
-VALID_CONFIG_dbg = 1
-CC_dbg = $(DEFAULT_CC)
-CXX_dbg = $(DEFAULT_CXX)
-LD_dbg = $(DEFAULT_CC)
-LDXX_dbg = $(DEFAULT_CXX)
-CPPFLAGS_dbg = -O0
-DEFINES_dbg = _DEBUG DEBUG
-
 VALID_CONFIG_asan = 1
 REQUIRE_CUSTOM_LIBRARIES_asan = 1
 CC_asan = clang
@@ -113,33 +88,6 @@ LDXX_asan = clang++
 CPPFLAGS_asan = -O0 -fsanitize-coverage=edge,trace-pc-guard -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS
 LDFLAGS_asan = -fsanitize=address
 
-VALID_CONFIG_msan = 1
-REQUIRE_CUSTOM_LIBRARIES_msan = 1
-CC_msan = clang
-CXX_msan = clang++
-LD_msan = clang++
-LDXX_msan = clang++
-CPPFLAGS_msan = -O0 -stdlib=libc++ -fsanitize-coverage=edge,trace-pc-guard -fsanitize=memory -fsanitize-memory-track-origins -fsanitize-memory-use-after-dtor -fno-omit-frame-pointer -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -Wno-unused-command-line-argument -fPIE -pie -DGPR_NO_DIRECT_SYSCALLS
-LDFLAGS_msan = -stdlib=libc++ -fsanitize=memory -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -fPIE -pie $(if $(JENKINS_BUILD),-Wl$(comma)-Ttext-segment=0x7e0000000000,)
-DEFINES_msan = NDEBUG
-
-VALID_CONFIG_basicprof = 1
-CC_basicprof = $(DEFAULT_CC)
-CXX_basicprof = $(DEFAULT_CXX)
-LD_basicprof = $(DEFAULT_CC)
-LDXX_basicprof = $(DEFAULT_CXX)
-CPPFLAGS_basicprof = -O2 -DGRPC_BASIC_PROFILER -DGRPC_TIMERS_RDTSC
-DEFINES_basicprof = NDEBUG
-
-VALID_CONFIG_helgrind = 1
-CC_helgrind = $(DEFAULT_CC)
-CXX_helgrind = $(DEFAULT_CXX)
-LD_helgrind = $(DEFAULT_CC)
-LDXX_helgrind = $(DEFAULT_CXX)
-CPPFLAGS_helgrind = -O0
-LDFLAGS_helgrind = -rdynamic
-DEFINES_helgrind = _DEBUG DEBUG
-
 VALID_CONFIG_asan-noleaks = 1
 REQUIRE_CUSTOM_LIBRARIES_asan-noleaks = 1
 CC_asan-noleaks = clang
@@ -149,34 +97,39 @@ LDXX_asan-noleaks = clang++
 CPPFLAGS_asan-noleaks = -O0 -fsanitize-coverage=edge,trace-pc-guard -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS
 LDFLAGS_asan-noleaks = fsanitize=address
 
-VALID_CONFIG_noexcept = 1
-CC_noexcept = $(DEFAULT_CC)
-CXX_noexcept = $(DEFAULT_CXX)
-LD_noexcept = $(DEFAULT_CC)
-LDXX_noexcept = $(DEFAULT_CXX)
-CXXFLAGS_noexcept = -fno-exceptions
-CPPFLAGS_noexcept = -O2 -Wframe-larger-than=16384
-DEFINES_noexcept = NDEBUG
+VALID_CONFIG_asan-trace-cmp = 1
+REQUIRE_CUSTOM_LIBRARIES_asan-trace-cmp = 1
+CC_asan-trace-cmp = clang
+CXX_asan-trace-cmp = clang++
+LD_asan-trace-cmp = clang++
+LDXX_asan-trace-cmp = clang++
+CPPFLAGS_asan-trace-cmp = -O0 -fsanitize-coverage=edge,trace-pc-guard -fsanitize-coverage=trace-cmp -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS
+LDFLAGS_asan-trace-cmp = -fsanitize=address
 
-VALID_CONFIG_ubsan = 1
-REQUIRE_CUSTOM_LIBRARIES_ubsan = 1
-CC_ubsan = clang
-CXX_ubsan = clang++
-LD_ubsan = clang++
-LDXX_ubsan = clang++
-CPPFLAGS_ubsan = -O0 -stdlib=libc++ -fsanitize-coverage=edge,trace-pc-guard -fsanitize=undefined -fno-omit-frame-pointer -Wno-unused-command-line-argument -Wvarargs
-LDFLAGS_ubsan = -stdlib=libc++ -fsanitize=undefined,unsigned-integer-overflow
-DEFINES_ubsan = NDEBUG GRPC_UBSAN
+VALID_CONFIG_basicprof = 1
+CC_basicprof = $(DEFAULT_CC)
+CXX_basicprof = $(DEFAULT_CXX)
+LD_basicprof = $(DEFAULT_CC)
+LDXX_basicprof = $(DEFAULT_CXX)
+CPPFLAGS_basicprof = -O2 -DGRPC_BASIC_PROFILER -DGRPC_TIMERS_RDTSC
+DEFINES_basicprof = NDEBUG
 
-VALID_CONFIG_tsan = 1
-REQUIRE_CUSTOM_LIBRARIES_tsan = 1
-CC_tsan = clang
-CXX_tsan = clang++
-LD_tsan = clang++
-LDXX_tsan = clang++
-CPPFLAGS_tsan = -O0 -fsanitize=thread -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS
-LDFLAGS_tsan = -fsanitize=thread
-DEFINES_tsan = GRPC_TSAN
+VALID_CONFIG_c++-compat = 1
+CC_c++-compat = $(DEFAULT_CC)
+CXX_c++-compat = $(DEFAULT_CXX)
+LD_c++-compat = $(DEFAULT_CC)
+LDXX_c++-compat = $(DEFAULT_CXX)
+CFLAGS_c++-compat = -Wc++-compat
+CPPFLAGS_c++-compat = -O0
+DEFINES_c++-compat = _DEBUG DEBUG
+
+VALID_CONFIG_counters = 1
+CC_counters = $(DEFAULT_CC)
+CXX_counters = $(DEFAULT_CXX)
+LD_counters = $(DEFAULT_CC)
+LDXX_counters = $(DEFAULT_CXX)
+CPPFLAGS_counters = -O2 -DGPR_LOW_LEVEL_COUNTERS
+DEFINES_counters = NDEBUG
 
 VALID_CONFIG_counters_with_memory_counter = 1
 CC_counters_with_memory_counter = $(DEFAULT_CC)
@@ -187,13 +140,13 @@ CPPFLAGS_counters_with_memory_counter = -O2 -DGPR_LOW_LEVEL_COUNTERS -DGPR_WRAP_
 LDFLAGS_counters_with_memory_counter = -Wl,--wrap=malloc -Wl,--wrap=calloc -Wl,--wrap=realloc -Wl,--wrap=free
 DEFINES_counters_with_memory_counter = NDEBUG
 
-VALID_CONFIG_stapprof = 1
-CC_stapprof = $(DEFAULT_CC)
-CXX_stapprof = $(DEFAULT_CXX)
-LD_stapprof = $(DEFAULT_CC)
-LDXX_stapprof = $(DEFAULT_CXX)
-CPPFLAGS_stapprof = -O2 -DGRPC_STAP_PROFILER
-DEFINES_stapprof = NDEBUG
+VALID_CONFIG_dbg = 1
+CC_dbg = $(DEFAULT_CC)
+CXX_dbg = $(DEFAULT_CXX)
+LD_dbg = $(DEFAULT_CC)
+LDXX_dbg = $(DEFAULT_CXX)
+CPPFLAGS_dbg = -O0
+DEFINES_dbg = _DEBUG DEBUG
 
 VALID_CONFIG_gcov = 1
 CC_gcov = gcc
@@ -204,14 +157,14 @@ CPPFLAGS_gcov = -O0 -fprofile-arcs -ftest-coverage -Wno-return-type
 LDFLAGS_gcov = -fprofile-arcs -ftest-coverage -rdynamic -lstdc++
 DEFINES_gcov = _DEBUG DEBUG GPR_GCOV
 
-VALID_CONFIG_memcheck = 1
-CC_memcheck = $(DEFAULT_CC)
-CXX_memcheck = $(DEFAULT_CXX)
-LD_memcheck = $(DEFAULT_CC)
-LDXX_memcheck = $(DEFAULT_CXX)
-CPPFLAGS_memcheck = -O0
-LDFLAGS_memcheck = -rdynamic
-DEFINES_memcheck = _DEBUG DEBUG
+VALID_CONFIG_helgrind = 1
+CC_helgrind = $(DEFAULT_CC)
+CXX_helgrind = $(DEFAULT_CXX)
+LD_helgrind = $(DEFAULT_CC)
+LDXX_helgrind = $(DEFAULT_CXX)
+CPPFLAGS_helgrind = -O0
+LDFLAGS_helgrind = -rdynamic
+DEFINES_helgrind = _DEBUG DEBUG
 
 VALID_CONFIG_lto = 1
 CC_lto = $(DEFAULT_CC)
@@ -221,14 +174,24 @@ LDXX_lto = $(DEFAULT_CXX)
 CPPFLAGS_lto = -O2
 DEFINES_lto = NDEBUG
 
-VALID_CONFIG_c++-compat = 1
-CC_c++-compat = $(DEFAULT_CC)
-CXX_c++-compat = $(DEFAULT_CXX)
-LD_c++-compat = $(DEFAULT_CC)
-LDXX_c++-compat = $(DEFAULT_CXX)
-CFLAGS_c++-compat = -Wc++-compat
-CPPFLAGS_c++-compat = -O0
-DEFINES_c++-compat = _DEBUG DEBUG
+VALID_CONFIG_memcheck = 1
+CC_memcheck = $(DEFAULT_CC)
+CXX_memcheck = $(DEFAULT_CXX)
+LD_memcheck = $(DEFAULT_CC)
+LDXX_memcheck = $(DEFAULT_CXX)
+CPPFLAGS_memcheck = -O0
+LDFLAGS_memcheck = -rdynamic
+DEFINES_memcheck = _DEBUG DEBUG
+
+VALID_CONFIG_msan = 1
+REQUIRE_CUSTOM_LIBRARIES_msan = 1
+CC_msan = clang
+CXX_msan = clang++
+LD_msan = clang++
+LDXX_msan = clang++
+CPPFLAGS_msan = -O0 -stdlib=libc++ -fsanitize-coverage=edge,trace-pc-guard -fsanitize=memory -fsanitize-memory-track-origins -fsanitize-memory-use-after-dtor -fno-omit-frame-pointer -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -Wno-unused-command-line-argument -fPIE -pie -DGPR_NO_DIRECT_SYSCALLS
+LDFLAGS_msan = -stdlib=libc++ -fsanitize=memory -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -fPIE -pie $(if $(JENKINS_BUILD),-Wl$(comma)-Ttext-segment=0x7e0000000000,)
+DEFINES_msan = NDEBUG
 
 VALID_CONFIG_mutrace = 1
 CC_mutrace = $(DEFAULT_CC)
@@ -239,13 +202,50 @@ CPPFLAGS_mutrace = -O3 -fno-omit-frame-pointer
 LDFLAGS_mutrace = -rdynamic
 DEFINES_mutrace = NDEBUG
 
-VALID_CONFIG_counters = 1
-CC_counters = $(DEFAULT_CC)
-CXX_counters = $(DEFAULT_CXX)
-LD_counters = $(DEFAULT_CC)
-LDXX_counters = $(DEFAULT_CXX)
-CPPFLAGS_counters = -O2 -DGPR_LOW_LEVEL_COUNTERS
-DEFINES_counters = NDEBUG
+VALID_CONFIG_noexcept = 1
+CC_noexcept = $(DEFAULT_CC)
+CXX_noexcept = $(DEFAULT_CXX)
+LD_noexcept = $(DEFAULT_CC)
+LDXX_noexcept = $(DEFAULT_CXX)
+CXXFLAGS_noexcept = -fno-exceptions
+CPPFLAGS_noexcept = -O2 -Wframe-larger-than=16384
+DEFINES_noexcept = NDEBUG
+
+VALID_CONFIG_opt = 1
+CC_opt = $(DEFAULT_CC)
+CXX_opt = $(DEFAULT_CXX)
+LD_opt = $(DEFAULT_CC)
+LDXX_opt = $(DEFAULT_CXX)
+CPPFLAGS_opt = -O2 -Wframe-larger-than=16384
+DEFINES_opt = NDEBUG
+
+VALID_CONFIG_stapprof = 1
+CC_stapprof = $(DEFAULT_CC)
+CXX_stapprof = $(DEFAULT_CXX)
+LD_stapprof = $(DEFAULT_CC)
+LDXX_stapprof = $(DEFAULT_CXX)
+CPPFLAGS_stapprof = -O2 -DGRPC_STAP_PROFILER
+DEFINES_stapprof = NDEBUG
+
+VALID_CONFIG_tsan = 1
+REQUIRE_CUSTOM_LIBRARIES_tsan = 1
+CC_tsan = clang
+CXX_tsan = clang++
+LD_tsan = clang++
+LDXX_tsan = clang++
+CPPFLAGS_tsan = -O0 -fsanitize=thread -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS
+LDFLAGS_tsan = -fsanitize=thread
+DEFINES_tsan = GRPC_TSAN
+
+VALID_CONFIG_ubsan = 1
+REQUIRE_CUSTOM_LIBRARIES_ubsan = 1
+CC_ubsan = clang
+CXX_ubsan = clang++
+LD_ubsan = clang++
+LDXX_ubsan = clang++
+CPPFLAGS_ubsan = -O0 -stdlib=libc++ -fsanitize-coverage=edge,trace-pc-guard -fsanitize=undefined -fno-omit-frame-pointer -Wno-unused-command-line-argument -Wvarargs
+LDFLAGS_ubsan = -stdlib=libc++ -fsanitize=undefined,unsigned-integer-overflow
+DEFINES_ubsan = NDEBUG GRPC_UBSAN
 
 
 
@@ -455,9 +455,9 @@ E = @echo
 Q = @
 endif
 
-CORE_VERSION = 13.0.0
-CPP_VERSION = 1.33.2
-CSHARP_VERSION = 2.33.2
+CORE_VERSION = 14.0.0
+CPP_VERSION = 1.34.0
+CSHARP_VERSION = 2.34.0
 
 CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
 CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
@@ -493,7 +493,7 @@ SHARED_EXT_CORE = dll
 SHARED_EXT_CPP = dll
 SHARED_EXT_CSHARP = dll
 SHARED_PREFIX =
-SHARED_VERSION_CORE = -13
+SHARED_VERSION_CORE = -14
 SHARED_VERSION_CPP = -1
 SHARED_VERSION_CSHARP = -2
 else ifeq ($(SYSTEM),Darwin)
@@ -1422,12 +1422,12 @@ $(GENDIR)/src/proto/grpc/testing/xds/v3/http_connection_manager.pb.cc: protoc_de
 $(GENDIR)/src/proto/grpc/testing/xds/v3/http_connection_manager.grpc.pb.cc: protoc_dep_error
 else
 
-$(GENDIR)/src/proto/grpc/testing/xds/v3/http_connection_manager.pb.cc: src/proto/grpc/testing/xds/v3/http_connection_manager.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/xds/v3/config_source.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/v3/route.pb.cc
+$(GENDIR)/src/proto/grpc/testing/xds/v3/http_connection_manager.pb.cc: src/proto/grpc/testing/xds/v3/http_connection_manager.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/xds/v3/config_source.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/v3/protocol.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/v3/route.pb.cc
        $(E) "[PROTOC]  Generating protobuf CC file from $<"
        $(Q) mkdir -p `dirname $@`
        $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $<
 
-$(GENDIR)/src/proto/grpc/testing/xds/v3/http_connection_manager.grpc.pb.cc: src/proto/grpc/testing/xds/v3/http_connection_manager.proto $(GENDIR)/src/proto/grpc/testing/xds/v3/http_connection_manager.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/xds/v3/config_source.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/v3/config_source.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/v3/route.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/v3/route.grpc.pb.cc
+$(GENDIR)/src/proto/grpc/testing/xds/v3/http_connection_manager.grpc.pb.cc: src/proto/grpc/testing/xds/v3/http_connection_manager.proto $(GENDIR)/src/proto/grpc/testing/xds/v3/http_connection_manager.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/xds/v3/config_source.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/v3/config_source.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/v3/protocol.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/v3/protocol.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/v3/route.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/v3/route.grpc.pb.cc
        $(E) "[GRPC]    Generating gRPC's protobuf service CC file from $<"
        $(Q) mkdir -p `dirname $@`
        $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $<
@@ -1498,6 +1498,22 @@ $(GENDIR)/src/proto/grpc/testing/xds/v3/percent.grpc.pb.cc: src/proto/grpc/testi
 endif
 
 ifeq ($(NO_PROTOC),true)
+$(GENDIR)/src/proto/grpc/testing/xds/v3/protocol.pb.cc: protoc_dep_error
+$(GENDIR)/src/proto/grpc/testing/xds/v3/protocol.grpc.pb.cc: protoc_dep_error
+else
+
+$(GENDIR)/src/proto/grpc/testing/xds/v3/protocol.pb.cc: src/proto/grpc/testing/xds/v3/protocol.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) 
+       $(E) "[PROTOC]  Generating protobuf CC file from $<"
+       $(Q) mkdir -p `dirname $@`
+       $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $<
+
+$(GENDIR)/src/proto/grpc/testing/xds/v3/protocol.grpc.pb.cc: src/proto/grpc/testing/xds/v3/protocol.proto $(GENDIR)/src/proto/grpc/testing/xds/v3/protocol.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) 
+       $(E) "[GRPC]    Generating gRPC's protobuf service CC file from $<"
+       $(Q) mkdir -p `dirname $@`
+       $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $<
+endif
+
+ifeq ($(NO_PROTOC),true)
 $(GENDIR)/src/proto/grpc/testing/xds/v3/range.pb.cc: protoc_dep_error
 $(GENDIR)/src/proto/grpc/testing/xds/v3/range.grpc.pb.cc: protoc_dep_error
 else
@@ -1679,8 +1695,8 @@ $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE):
 ifeq ($(SYSTEM),Darwin)
        $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBADDRESS_SORTING_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
 else
-       $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libaddress_sorting.so.13 -o $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBADDRESS_SORTING_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
-       $(Q) ln -sf $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).so.13
+       $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libaddress_sorting.so.14 -o $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBADDRESS_SORTING_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
+       $(Q) ln -sf $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).so.14
        $(Q) ln -sf $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).so
 endif
 endif
@@ -1726,10 +1742,13 @@ LIBGPR_SRC = \
     src/core/lib/gpr/tmpfile_windows.cc \
     src/core/lib/gpr/wrap_memcpy.cc \
     src/core/lib/gprpp/arena.cc \
+    src/core/lib/gprpp/examine_stack.cc \
     src/core/lib/gprpp/fork.cc \
     src/core/lib/gprpp/global_config_env.cc \
     src/core/lib/gprpp/host_port.cc \
     src/core/lib/gprpp/mpscq.cc \
+    src/core/lib/gprpp/stat_posix.cc \
+    src/core/lib/gprpp/stat_windows.cc \
     src/core/lib/gprpp/thd_posix.cc \
     src/core/lib/gprpp/thd_windows.cc \
     src/core/lib/profiling/basic_timers.cc \
@@ -1804,8 +1823,8 @@ $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBGPR_OB
 ifeq ($(SYSTEM),Darwin)
        $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGPR_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
 else
-       $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgpr.so.13 -o $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGPR_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
-       $(Q) ln -sf $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).so.13
+       $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgpr.so.14 -o $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGPR_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
+       $(Q) ln -sf $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).so.14
        $(Q) ln -sf $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).so
 endif
 endif
@@ -1846,7 +1865,7 @@ LIBGRPC_SRC = \
     src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \
-    src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc \
+    src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc \
     src/core/ext/filters/client_channel/lb_policy_registry.cc \
     src/core/ext/filters/client_channel/local_subchannel_pool.cc \
@@ -1986,7 +2005,6 @@ LIBGRPC_SRC = \
     src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c \
     src/core/ext/upb-generated/google/api/http.upb.c \
     src/core/ext/upb-generated/google/protobuf/any.upb.c \
-    src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
     src/core/ext/upb-generated/google/protobuf/duration.upb.c \
     src/core/ext/upb-generated/google/protobuf/empty.upb.c \
     src/core/ext/upb-generated/google/protobuf/struct.upb.c \
@@ -2011,10 +2029,91 @@ LIBGRPC_SRC = \
     src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c \
     src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
     src/core/ext/upb-generated/validate/validate.upb.c \
+    src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/api/http.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c \
+    src/core/ext/upbdefs-generated/validate/validate.upbdefs.c \
     src/core/ext/xds/certificate_provider_registry.cc \
+    src/core/ext/xds/certificate_provider_store.cc \
+    src/core/ext/xds/file_watcher_certificate_provider_factory.cc \
     src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc \
     src/core/ext/xds/xds_api.cc \
     src/core/ext/xds/xds_bootstrap.cc \
+    src/core/ext/xds/xds_certificate_provider.cc \
     src/core/ext/xds/xds_client.cc \
     src/core/ext/xds/xds_client_stats.cc \
     src/core/lib/avl/avl.cc \
@@ -2156,10 +2255,15 @@ LIBGRPC_SRC = \
     src/core/lib/security/credentials/composite/composite_credentials.cc \
     src/core/lib/security/credentials/credentials.cc \
     src/core/lib/security/credentials/credentials_metadata.cc \
+    src/core/lib/security/credentials/external/aws_request_signer.cc \
+    src/core/lib/security/credentials/external/external_account_credentials.cc \
+    src/core/lib/security/credentials/external/file_external_account_credentials.cc \
+    src/core/lib/security/credentials/external/url_external_account_credentials.cc \
     src/core/lib/security/credentials/fake/fake_credentials.cc \
     src/core/lib/security/credentials/google_default/credentials_generic.cc \
     src/core/lib/security/credentials/google_default/google_default_credentials.cc \
     src/core/lib/security/credentials/iam/iam_credentials.cc \
+    src/core/lib/security/credentials/insecure/insecure_credentials.cc \
     src/core/lib/security/credentials/jwt/json_token.cc \
     src/core/lib/security/credentials/jwt/jwt_credentials.cc \
     src/core/lib/security/credentials/jwt/jwt_verifier.cc \
@@ -2168,11 +2272,13 @@ LIBGRPC_SRC = \
     src/core/lib/security/credentials/plugin/plugin_credentials.cc \
     src/core/lib/security/credentials/ssl/ssl_credentials.cc \
     src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc \
+    src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc \
     src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc \
     src/core/lib/security/credentials/tls/tls_credentials.cc \
     src/core/lib/security/credentials/xds/xds_credentials.cc \
     src/core/lib/security/security_connector/alts/alts_security_connector.cc \
     src/core/lib/security/security_connector/fake/fake_security_connector.cc \
+    src/core/lib/security/security_connector/insecure/insecure_security_connector.cc \
     src/core/lib/security/security_connector/load_system_roots_fallback.cc \
     src/core/lib/security/security_connector/load_system_roots_linux.cc \
     src/core/lib/security/security_connector/local/local_security_connector.cc \
@@ -2310,8 +2416,8 @@ $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBGRPC_
 ifeq ($(SYSTEM),Darwin)
        $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_MERGE_LIBS) $(LDLIBS_SECURE) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
 else
-       $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc.so.13 -o $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_MERGE_LIBS) $(LDLIBS_SECURE) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
-       $(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).so.13
+       $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc.so.14 -o $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_MERGE_LIBS) $(LDLIBS_SECURE) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
+       $(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).so.14
        $(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).so
 endif
 endif
@@ -2369,8 +2475,8 @@ $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE):
 ifeq ($(SYSTEM),Darwin)
        $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_CSHARP_EXT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
 else
-       $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc_csharp_ext.so.13 -o $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_CSHARP_EXT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
-       $(Q) ln -sf $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).so.13
+       $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc_csharp_ext.so.14 -o $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_CSHARP_EXT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
+       $(Q) ln -sf $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).so.14
        $(Q) ln -sf $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).so
 endif
 endif
@@ -2491,7 +2597,6 @@ LIBGRPC_UNSECURE_SRC = \
     src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c \
     src/core/ext/upb-generated/google/api/http.upb.c \
     src/core/ext/upb-generated/google/protobuf/any.upb.c \
-    src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
     src/core/ext/upb-generated/google/protobuf/duration.upb.c \
     src/core/ext/upb-generated/google/protobuf/empty.upb.c \
     src/core/ext/upb-generated/google/protobuf/struct.upb.c \
@@ -2710,8 +2815,8 @@ $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $
 ifeq ($(SYSTEM),Darwin)
        $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_UNSECURE_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
 else
-       $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc_unsecure.so.13 -o $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_UNSECURE_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
-       $(Q) ln -sf $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).so.13
+       $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc_unsecure.so.14 -o $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_UNSECURE_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
+       $(Q) ln -sf $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).so.14
        $(Q) ln -sf $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).so
 endif
 endif
@@ -2734,6 +2839,7 @@ LIBGRPC++_SRC = \
     src/cpp/client/credentials_cc.cc \
     src/cpp/client/insecure_credentials.cc \
     src/cpp/client/secure_credentials.cc \
+    src/cpp/client/xds_credentials.cc \
     src/cpp/codegen/codegen_init.cc \
     src/cpp/common/alarm.cc \
     src/cpp/common/auth_property_iterator.cc \
@@ -2746,6 +2852,7 @@ LIBGRPC++_SRC = \
     src/cpp/common/secure_auth_context.cc \
     src/cpp/common/secure_channel_arguments.cc \
     src/cpp/common/secure_create_auth_context.cc \
+    src/cpp/common/tls_certificate_provider.cc \
     src/cpp/common/tls_credentials_options.cc \
     src/cpp/common/tls_credentials_options_util.cc \
     src/cpp/common/validate_service_config.cc \
@@ -2928,6 +3035,7 @@ PUBLIC_HEADERS_CXX += \
     include/grpcpp/security/auth_metadata_processor.h \
     include/grpcpp/security/credentials.h \
     include/grpcpp/security/server_credentials.h \
+    include/grpcpp/security/tls_certificate_provider.h \
     include/grpcpp/security/tls_credentials_options.h \
     include/grpcpp/server.h \
     include/grpcpp/server_builder.h \
@@ -3442,6 +3550,7 @@ PUBLIC_HEADERS_CXX += \
     include/grpcpp/security/auth_metadata_processor.h \
     include/grpcpp/security/credentials.h \
     include/grpcpp/security/server_credentials.h \
+    include/grpcpp/security/tls_certificate_provider.h \
     include/grpcpp/security/tls_credentials_options.h \
     include/grpcpp/server.h \
     include/grpcpp/server_builder.h \
@@ -3574,7 +3683,6 @@ LIBGRPCPP_CHANNELZ_SRC = \
 
 PUBLIC_HEADERS_CXX += \
     include/grpcpp/ext/channelz_service_plugin.h \
-    include/grpcpp/ext/channelz_service_plugin_impl.h \
 
 LIBGRPCPP_CHANNELZ_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPCPP_CHANNELZ_SRC))))
 
@@ -3794,6 +3902,7 @@ LIBBORINGSSL_SRC = \
     third_party/boringssl-with-bazel/src/crypto/thread_win.c \
     third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c \
     third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c \
+    third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c \
     third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c \
     third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c \
     third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c \
@@ -3915,9 +4024,9 @@ PUBLIC_HEADERS_C += \
 
 LIBBORINGSSL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_SRC))))
 
+$(LIBBORINGSSL_OBJS): CFLAGS += -g
 $(LIBBORINGSSL_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
 $(LIBBORINGSSL_OBJS): CXXFLAGS += -fno-exceptions
-$(LIBBORINGSSL_OBJS): CFLAGS += -g
 
 $(LIBDIR)/$(CONFIG)/libboringssl.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(RE2_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP)  $(LIBBORINGSSL_OBJS) 
        $(E) "[AR]      Creating $@"
@@ -3994,6 +4103,23 @@ LIBUPB_SRC = \
     third_party/upb/upb/port.c \
     third_party/upb/upb/table.c \
     third_party/upb/upb/upb.c \
+    third_party/upb/upb/def.c \
+    third_party/upb/upb/reflection.c \
+    third_party/upb/upb/text_encode.c \
+    src/core/ext/upb-generated/google/protobuf/any.upb.c \
+    src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
+    src/core/ext/upb-generated/google/protobuf/duration.upb.c \
+    src/core/ext/upb-generated/google/protobuf/empty.upb.c \
+    src/core/ext/upb-generated/google/protobuf/struct.upb.c \
+    src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \
+    src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \
+    src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c \
 
 PUBLIC_HEADERS_C += \
 
@@ -4023,8 +4149,8 @@ $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBUPB_OB
 ifeq ($(SYSTEM),Darwin)
        $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBUPB_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
 else
-       $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libupb.so.13 -o $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBUPB_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
-       $(Q) ln -sf $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).so.13
+       $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libupb.so.14 -o $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBUPB_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
+       $(Q) ln -sf $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).so.14
        $(Q) ln -sf $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).so
 endif
 endif
@@ -4134,8 +4260,8 @@ PUBLIC_HEADERS_C += \
 
 LIBARES_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBARES_SRC))))
 
-$(LIBARES_OBJS): CPPFLAGS += -Ithird_party/cares -Ithird_party/cares/cares -fvisibility=hidden -D_GNU_SOURCE $(if $(subst Darwin,,$(SYSTEM)),,-Ithird_party/cares/config_darwin) $(if $(subst FreeBSD,,$(SYSTEM)),,-Ithird_party/cares/config_freebsd) $(if $(subst Linux,,$(SYSTEM)),,-Ithird_party/cares/config_linux) $(if $(subst OpenBSD,,$(SYSTEM)),,-Ithird_party/cares/config_openbsd) -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX $(if $(subst MINGW32,,$(SYSTEM)),-DHAVE_CONFIG_H,)
 $(LIBARES_OBJS): CFLAGS += -g
+$(LIBARES_OBJS): CPPFLAGS += -Ithird_party/cares -Ithird_party/cares/cares -fvisibility=hidden -D_GNU_SOURCE $(if $(subst Darwin,,$(SYSTEM)),,-Ithird_party/cares/config_darwin) $(if $(subst FreeBSD,,$(SYSTEM)),,-Ithird_party/cares/config_freebsd) $(if $(subst Linux,,$(SYSTEM)),,-Ithird_party/cares/config_linux) $(if $(subst OpenBSD,,$(SYSTEM)),,-Ithird_party/cares/config_openbsd) -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX $(if $(subst MINGW32,,$(SYSTEM)),-DHAVE_CONFIG_H,)
 
 $(LIBDIR)/$(CONFIG)/libares.a:  $(LIBARES_OBJS) 
        $(E) "[AR]      Creating $@"
@@ -4160,7 +4286,6 @@ endif
 
 # start of build recipe for library "grpc_abseil" (generated by makelib(lib) template function)
 LIBGRPC_ABSEIL_SRC = \
-    third_party/abseil-cpp/absl/base/dynamic_annotations.cc \
     third_party/abseil-cpp/absl/base/internal/cycleclock.cc \
     third_party/abseil-cpp/absl/base/internal/exponential_biased.cc \
     third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc \
@@ -4504,7 +4629,7 @@ ifneq ($(OPENSSL_DEP),)
 src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc: $(OPENSSL_DEP)
 src/core/ext/filters/client_channel/lb_policy/xds/cds.cc: $(OPENSSL_DEP)
 src/core/ext/filters/client_channel/lb_policy/xds/eds.cc: $(OPENSSL_DEP)
-src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc: $(OPENSSL_DEP)
+src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc: $(OPENSSL_DEP)
 src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc: $(OPENSSL_DEP)
 src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc: $(OPENSSL_DEP)
 src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc: $(OPENSSL_DEP)
@@ -4580,10 +4705,84 @@ src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c: $(OPENSSL_DEP)
 src/core/ext/upb-generated/udpa/core/v1/resource.upb.c: $(OPENSSL_DEP)
 src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c: $(OPENSSL_DEP)
 src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/google/api/http.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/validate/validate.upbdefs.c: $(OPENSSL_DEP)
 src/core/ext/xds/certificate_provider_registry.cc: $(OPENSSL_DEP)
+src/core/ext/xds/certificate_provider_store.cc: $(OPENSSL_DEP)
+src/core/ext/xds/file_watcher_certificate_provider_factory.cc: $(OPENSSL_DEP)
 src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc: $(OPENSSL_DEP)
 src/core/ext/xds/xds_api.cc: $(OPENSSL_DEP)
 src/core/ext/xds/xds_bootstrap.cc: $(OPENSSL_DEP)
+src/core/ext/xds/xds_certificate_provider.cc: $(OPENSSL_DEP)
 src/core/ext/xds/xds_client.cc: $(OPENSSL_DEP)
 src/core/ext/xds/xds_client_stats.cc: $(OPENSSL_DEP)
 src/core/lib/http/httpcli_security_connector.cc: $(OPENSSL_DEP)
@@ -4601,10 +4800,15 @@ src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc:
 src/core/lib/security/credentials/composite/composite_credentials.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/credentials.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/credentials_metadata.cc: $(OPENSSL_DEP)
+src/core/lib/security/credentials/external/aws_request_signer.cc: $(OPENSSL_DEP)
+src/core/lib/security/credentials/external/external_account_credentials.cc: $(OPENSSL_DEP)
+src/core/lib/security/credentials/external/file_external_account_credentials.cc: $(OPENSSL_DEP)
+src/core/lib/security/credentials/external/url_external_account_credentials.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/fake/fake_credentials.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/google_default/credentials_generic.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/google_default/google_default_credentials.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/iam/iam_credentials.cc: $(OPENSSL_DEP)
+src/core/lib/security/credentials/insecure/insecure_credentials.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/jwt/json_token.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/jwt/jwt_credentials.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/jwt/jwt_verifier.cc: $(OPENSSL_DEP)
@@ -4613,11 +4817,13 @@ src/core/lib/security/credentials/oauth2/oauth2_credentials.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/plugin/plugin_credentials.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/ssl/ssl_credentials.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc: $(OPENSSL_DEP)
+src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/tls/tls_credentials.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/xds/xds_credentials.cc: $(OPENSSL_DEP)
 src/core/lib/security/security_connector/alts/alts_security_connector.cc: $(OPENSSL_DEP)
 src/core/lib/security/security_connector/fake/fake_security_connector.cc: $(OPENSSL_DEP)
+src/core/lib/security/security_connector/insecure/insecure_security_connector.cc: $(OPENSSL_DEP)
 src/core/lib/security/security_connector/load_system_roots_fallback.cc: $(OPENSSL_DEP)
 src/core/lib/security/security_connector/load_system_roots_linux.cc: $(OPENSSL_DEP)
 src/core/lib/security/security_connector/local/local_security_connector.cc: $(OPENSSL_DEP)
@@ -4662,12 +4868,14 @@ src/core/tsi/ssl_transport_security.cc: $(OPENSSL_DEP)
 src/core/tsi/transport_security.cc: $(OPENSSL_DEP)
 src/core/tsi/transport_security_grpc.cc: $(OPENSSL_DEP)
 src/cpp/client/secure_credentials.cc: $(OPENSSL_DEP)
+src/cpp/client/xds_credentials.cc: $(OPENSSL_DEP)
 src/cpp/common/alts_context.cc: $(OPENSSL_DEP)
 src/cpp/common/alts_util.cc: $(OPENSSL_DEP)
 src/cpp/common/auth_property_iterator.cc: $(OPENSSL_DEP)
 src/cpp/common/secure_auth_context.cc: $(OPENSSL_DEP)
 src/cpp/common/secure_channel_arguments.cc: $(OPENSSL_DEP)
 src/cpp/common/secure_create_auth_context.cc: $(OPENSSL_DEP)
+src/cpp/common/tls_certificate_provider.cc: $(OPENSSL_DEP)
 src/cpp/common/tls_credentials_options.cc: $(OPENSSL_DEP)
 src/cpp/common/tls_credentials_options_util.cc: $(OPENSSL_DEP)
 src/cpp/ext/proto_server_reflection.cc: $(OPENSSL_DEP)
diff --git a/Package.swift b/Package.swift
new file mode 100644 (file)
index 0000000..23d0f82
--- /dev/null
@@ -0,0 +1,124 @@
+// swift-tools-version:5.2
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+import PackageDescription
+
+let package = Package(
+  name: "gRPC",
+  products: [
+    .library(
+      name: "gRPC-Core",
+      targets: [
+        "gRPC-Core",
+      ]
+    ),
+    .library(
+      name: "gRPC-cpp",
+      targets: [
+        "gRPC-cpp",
+      ]
+    )
+  ],
+
+  dependencies: [
+    .package(
+      name: "abseil",
+      url: "https://github.com/firebase/abseil-cpp-SwiftPM.git",
+      .revision("05d8107f2971a37e6c77245b7c4c6b0a7e97bc99")
+    ),
+    .package(name: "BoringSSL-GRPC",
+      url: "https://github.com/firebase/boringssl-SwiftPM.git",
+      .branch("7bcafa2660bc58715c39637494550d1ed7cd7229")
+    ),
+  ],
+
+  targets: [
+    .target(
+      name: "gRPC-Core",
+      dependencies: [
+        .product(name:"abseil", package: "abseil"),
+        .product(name:"openssl_grpc", package: "BoringSSL-GRPC"),
+      ],
+      path: ".",
+      exclude: [
+        "src/core/ext/filters/load_reporting/",
+        "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc",
+        "src/core/ext/filters/client_channel/xds/xds_channel.cc",
+        "src/core/ext/transport/cronet/",
+        "src/core/ext/upb-generated/third_party/",
+        "src/core/ext/upbdefs-generated/envoy/config/rbac/",
+        "src/core/ext/upbdefs-generated/google/api/expr/",
+        "src/core/ext/upbdefs-generated/src/",
+        "src/core/ext/upbdefs-generated/third_party/",
+        "src/core/ext/upbdefs-generated/udpa/data/",
+        "src/core/lib/surface/init_unsecure.cc",
+        "src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h",
+        "src/core/lib/security/authorization/mock_cel/cel_expression.h",
+        "src/core/lib/security/authorization/mock_cel/evaluator_core.h",
+        "src/core/lib/security/authorization/mock_cel/flat_expr_builder.h",
+        "src/core/lib/security/authorization/mock_cel/statusor.h",
+        "src/core/plugin_registry/grpc_unsecure_plugin_registry.cc",
+        "third_party/re2/re2/testing/",
+        "third_party/re2/re2/fuzzing/",
+        "third_party/re2/util/benchmark.cc",
+        "third_party/re2/util/test.cc",
+        "third_party/re2/util/fuzz.cc",
+        "third_party/upb/upb/bindings/",
+        "third_party/upb/upb/json/",
+        "third_party/upb/upb/pb/",
+      ],
+      sources: [
+        "src/core/ext/filters/",
+        "src/core/ext/transport/",
+        "src/core/ext/upb-generated/",
+        "src/core/ext/upbdefs-generated/",
+        "src/core/ext/xds/",
+        "src/core/lib/",
+        "src/core/plugin_registry/grpc_plugin_registry.cc",
+        "src/core/tsi/",
+        "third_party/re2/re2/",
+        "third_party/re2/util/",
+        "third_party/upb/upb/",
+      ],
+      publicHeadersPath: "spm-core-include",
+      cSettings: [
+        .headerSearchPath("./"),
+        .headerSearchPath("include/"),
+        .headerSearchPath("third_party/re2/"),
+        .headerSearchPath("third_party/upb/"),
+        .headerSearchPath("src/core/ext/upb-generated/"),
+        .headerSearchPath("src/core/ext/upbdefs-generated/"),
+        .define("GRPC_ARES", to: "0"),
+      ]
+    ),
+    .target(
+      name: "gRPC-cpp",
+      dependencies: [
+        .product(name:"abseil", package: "abseil"),
+        "gRPC-Core",
+      ],
+      path: ".",
+      exclude: [
+        "src/cpp/client/cronet_credentials.cc",
+        "src/cpp/common/insecure_create_auth_context.cc",
+        "src/cpp/ext/",
+        "src/cpp/server/channelz/",
+        "src/cpp/server/load_reporter/",
+        "src/cpp/util/core_stats.cc",
+        "src/cpp/util/core_stats.h",
+        "src/cpp/util/error_details.cc",
+      ],
+      sources: [
+        "src/cpp/",
+      ],
+      publicHeadersPath: "spm-cpp-include",
+      cSettings: [
+        .headerSearchPath("./"),
+        .headerSearchPath("include/"),
+        .headerSearchPath("third_party/upb/"),
+        .headerSearchPath("src/core/ext/upb-generated"),
+      ]
+    ),
+  ],
+  cLanguageStandard: .gnu11,
+  cxxLanguageStandard: .cxx11
+)
index ed8786e..0ef4102 100644 (file)
@@ -12,6 +12,16 @@ def grpc_deps():
     )
 
     native.bind(
+        name = "upb_lib_descriptor",
+        actual = "@upb//:descriptor_upb_proto",
+    )
+
+    native.bind(
+        name = "upb_textformat_lib",
+        actual = "@upb//:textformat",
+    )
+
+    native.bind(
         name = "absl",
         actual = "@com_google_absl//absl",
     )
@@ -77,11 +87,6 @@ def grpc_deps():
     )
 
     native.bind(
-        name = "gflags",
-        actual = "@com_github_gflags_gflags//:gflags",
-    )
-
-    native.bind(
         name = "grpc_cpp_plugin",
         actual = "@com_github_grpc_grpc//src/compiler:grpc_cpp_plugin",
     )
@@ -136,11 +141,11 @@ def grpc_deps():
             name = "boringssl",
             # Use github mirror instead of https://boringssl.googlesource.com/boringssl
             # to obtain a boringssl archive with consistent sha256
-            sha256 = "cb0fd3eda612d4ae4be21108938800a19b015717a7627ea7f530e3469d207707",
-            strip_prefix = "boringssl-88aeb757f1a415c71fb4cbf5af936ecae4bc8179",
+            sha256 = "e8c02bb7043644dc138e422a9a3412108732b6ff30590db4a05664476b209c03",
+            strip_prefix = "boringssl-29c6e0e27268f5a43e039cd2ed4e849d6b736fc1",
             urls = [
-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/88aeb757f1a415c71fb4cbf5af936ecae4bc8179.tar.gz",
-                "https://github.com/google/boringssl/archive/88aeb757f1a415c71fb4cbf5af936ecae4bc8179.tar.gz",
+                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/29c6e0e27268f5a43e039cd2ed4e849d6b736fc1.tar.gz",
+                "https://github.com/google/boringssl/archive/29c6e0e27268f5a43e039cd2ed4e849d6b736fc1.tar.gz",
             ],
         )
 
@@ -191,17 +196,6 @@ def grpc_deps():
             ],
         )
 
-    if "com_github_gflags_gflags" not in native.existing_rules():
-        http_archive(
-            name = "com_github_gflags_gflags",
-            sha256 = "63ae70ea3e05780f7547d03503a53de3a7d2d83ad1caaa443a31cb20aea28654",
-            strip_prefix = "gflags-28f50e0fed19872e0fd50dd23ce2ee8cd759338e",
-            urls = [
-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/gflags/gflags/archive/28f50e0fed19872e0fd50dd23ce2ee8cd759338e.tar.gz",
-                "https://github.com/gflags/gflags/archive/28f50e0fed19872e0fd50dd23ce2ee8cd759338e.tar.gz",
-            ],
-        )
-
     if "com_github_google_benchmark" not in native.existing_rules():
         http_archive(
             name = "com_github_google_benchmark",
@@ -239,11 +233,11 @@ def grpc_deps():
     if "com_google_absl" not in native.existing_rules():
         http_archive(
             name = "com_google_absl",
-            sha256 = "f368a8476f4e2e0eccf8a7318b98dafbe30b2600f4e3cf52636e5eb145aba06a",
-            strip_prefix = "abseil-cpp-df3ea785d8c30a9503321a3d35ee7d35808f190d",
+            sha256 = "3d74cdc98b42fd4257d91f652575206de195e2c824fcd8d6e6d227f85cb143ef",
+            strip_prefix = "abseil-cpp-0f3bb466b868b523cf1dc9b2aaaed65c77b28862",
             urls = [
-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz",
-                "https://github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz",
+                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/abseil/abseil-cpp/archive/0f3bb466b868b523cf1dc9b2aaaed65c77b28862.tar.gz",
+                "https://github.com/abseil/abseil-cpp/archive/0f3bb466b868b523cf1dc9b2aaaed65c77b28862.tar.gz",
             ],
         )
 
@@ -269,6 +263,17 @@ def grpc_deps():
             sha256 = "97e70364e9249702246c0e9444bccdc4b847bed1eb03c5a3ece4f83dfe6abc44",
         )
 
+    if "bazel_compdb" not in native.existing_rules():
+        http_archive(
+            name = "bazel_compdb",
+            sha256 = "bcecfd622c4ef272fd4ba42726a52e140b961c4eac23025f18b346c968a8cfb4",
+            strip_prefix = "bazel-compilation-database-0.4.5",
+            urls = [
+                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/grailbio/bazel-compilation-database/archive/0.4.5.tar.gz",
+                "https://github.com/grailbio/bazel-compilation-database/archive/0.4.5.tar.gz",
+            ],
+        )
+
     if "io_opencensus_cpp" not in native.existing_rules():
         http_archive(
             name = "io_opencensus_cpp",
index 8fd41d5..e8c0240 100644 (file)
@@ -290,10 +290,12 @@ libs:
   - src/core/lib/gpr/tls_gcc.h
   - src/core/lib/gpr/tls_msvc.h
   - src/core/lib/gpr/tls_pthread.h
+  - src/core/lib/gpr/tls_stdcpp.h
   - src/core/lib/gpr/tmpfile.h
   - src/core/lib/gpr/useful.h
   - src/core/lib/gprpp/arena.h
   - src/core/lib/gprpp/atomic.h
+  - src/core/lib/gprpp/examine_stack.h
   - src/core/lib/gprpp/fork.h
   - src/core/lib/gprpp/global_config.h
   - src/core/lib/gprpp/global_config_custom.h
@@ -304,6 +306,7 @@ libs:
   - src/core/lib/gprpp/map.h
   - src/core/lib/gprpp/memory.h
   - src/core/lib/gprpp/mpscq.h
+  - src/core/lib/gprpp/stat.h
   - src/core/lib/gprpp/sync.h
   - src/core/lib/gprpp/thd.h
   - src/core/lib/profiling/timers.h
@@ -341,19 +344,24 @@ libs:
   - src/core/lib/gpr/tmpfile_windows.cc
   - src/core/lib/gpr/wrap_memcpy.cc
   - src/core/lib/gprpp/arena.cc
+  - src/core/lib/gprpp/examine_stack.cc
   - src/core/lib/gprpp/fork.cc
   - src/core/lib/gprpp/global_config_env.cc
   - src/core/lib/gprpp/host_port.cc
   - src/core/lib/gprpp/mpscq.cc
+  - src/core/lib/gprpp/stat_posix.cc
+  - src/core/lib/gprpp/stat_windows.cc
   - src/core/lib/gprpp/thd_posix.cc
   - src/core/lib/gprpp/thd_windows.cc
   - src/core/lib/profiling/basic_timers.cc
   - src/core/lib/profiling/stap_timers.cc
   deps:
+  - absl/types:optional
   - absl/time:time
   - absl/synchronization:synchronization
   - absl/strings:strings
   - absl/strings:str_format
+  - absl/status:status
   - absl/memory:memory
   - absl/base:base
   secure: false
@@ -519,7 +527,6 @@ libs:
   - src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h
   - src/core/ext/upb-generated/google/api/http.upb.h
   - src/core/ext/upb-generated/google/protobuf/any.upb.h
-  - src/core/ext/upb-generated/google/protobuf/descriptor.upb.h
   - src/core/ext/upb-generated/google/protobuf/duration.upb.h
   - src/core/ext/upb-generated/google/protobuf/empty.upb.h
   - src/core/ext/upb-generated/google/protobuf/struct.upb.h
@@ -544,12 +551,92 @@ libs:
   - src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h
   - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h
   - src/core/ext/upb-generated/validate/validate.upb.h
+  - src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h
+  - src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h
+  - src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h
+  - src/core/ext/upbdefs-generated/google/api/http.upbdefs.h
+  - src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h
+  - src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h
+  - src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h
+  - src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h
+  - src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h
+  - src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h
+  - src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h
+  - src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h
+  - src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h
+  - src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h
+  - src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h
+  - src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h
+  - src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h
+  - src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h
+  - src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h
+  - src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h
+  - src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h
+  - src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h
+  - src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h
+  - src/core/ext/upbdefs-generated/validate/validate.upbdefs.h
   - src/core/ext/xds/certificate_provider_factory.h
   - src/core/ext/xds/certificate_provider_registry.h
   - src/core/ext/xds/certificate_provider_store.h
+  - src/core/ext/xds/file_watcher_certificate_provider_factory.h
   - src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h
   - src/core/ext/xds/xds_api.h
   - src/core/ext/xds/xds_bootstrap.h
+  - src/core/ext/xds/xds_certificate_provider.h
   - src/core/ext/xds/xds_channel_args.h
   - src/core/ext/xds/xds_client.h
   - src/core/ext/xds/xds_client_stats.h
@@ -674,14 +761,16 @@ libs:
   - src/core/lib/security/authorization/mock_cel/cel_value.h
   - src/core/lib/security/authorization/mock_cel/evaluator_core.h
   - src/core/lib/security/authorization/mock_cel/flat_expr_builder.h
-  - src/core/lib/security/authorization/mock_cel/statusor.h
-  - src/core/lib/security/certificate_provider.h
   - src/core/lib/security/context/security_context.h
   - src/core/lib/security/credentials/alts/alts_credentials.h
   - src/core/lib/security/credentials/alts/check_gcp_environment.h
   - src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h
   - src/core/lib/security/credentials/composite/composite_credentials.h
   - src/core/lib/security/credentials/credentials.h
+  - src/core/lib/security/credentials/external/aws_request_signer.h
+  - src/core/lib/security/credentials/external/external_account_credentials.h
+  - src/core/lib/security/credentials/external/file_external_account_credentials.h
+  - src/core/lib/security/credentials/external/url_external_account_credentials.h
   - src/core/lib/security/credentials/fake/fake_credentials.h
   - src/core/lib/security/credentials/google_default/google_default_credentials.h
   - src/core/lib/security/credentials/iam/iam_credentials.h
@@ -693,11 +782,13 @@ libs:
   - src/core/lib/security/credentials/plugin/plugin_credentials.h
   - src/core/lib/security/credentials/ssl/ssl_credentials.h
   - src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h
+  - src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h
   - src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h
   - src/core/lib/security/credentials/tls/tls_credentials.h
   - src/core/lib/security/credentials/xds/xds_credentials.h
   - src/core/lib/security/security_connector/alts/alts_security_connector.h
   - src/core/lib/security/security_connector/fake/fake_security_connector.h
+  - src/core/lib/security/security_connector/insecure/insecure_security_connector.h
   - src/core/lib/security/security_connector/load_system_roots.h
   - src/core/lib/security/security_connector/load_system_roots_linux.h
   - src/core/lib/security/security_connector/local/local_security_connector.h
@@ -801,7 +892,7 @@ libs:
   - src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc
   - src/core/ext/filters/client_channel/lb_policy/xds/cds.cc
   - src/core/ext/filters/client_channel/lb_policy/xds/eds.cc
-  - src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc
+  - src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc
   - src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc
   - src/core/ext/filters/client_channel/lb_policy_registry.cc
   - src/core/ext/filters/client_channel/local_subchannel_pool.cc
@@ -941,7 +1032,6 @@ libs:
   - src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c
   - src/core/ext/upb-generated/google/api/http.upb.c
   - src/core/ext/upb-generated/google/protobuf/any.upb.c
-  - src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
   - src/core/ext/upb-generated/google/protobuf/duration.upb.c
   - src/core/ext/upb-generated/google/protobuf/empty.upb.c
   - src/core/ext/upb-generated/google/protobuf/struct.upb.c
@@ -966,10 +1056,91 @@ libs:
   - src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c
   - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c
   - src/core/ext/upb-generated/validate/validate.upb.c
+  - src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c
+  - src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c
+  - src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c
+  - src/core/ext/upbdefs-generated/google/api/http.upbdefs.c
+  - src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c
+  - src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c
+  - src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c
+  - src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c
+  - src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c
+  - src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c
+  - src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c
+  - src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c
+  - src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c
+  - src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c
+  - src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c
+  - src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c
+  - src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c
+  - src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c
+  - src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c
+  - src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c
+  - src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c
+  - src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c
+  - src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c
+  - src/core/ext/upbdefs-generated/validate/validate.upbdefs.c
   - src/core/ext/xds/certificate_provider_registry.cc
+  - src/core/ext/xds/certificate_provider_store.cc
+  - src/core/ext/xds/file_watcher_certificate_provider_factory.cc
   - src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc
   - src/core/ext/xds/xds_api.cc
   - src/core/ext/xds/xds_bootstrap.cc
+  - src/core/ext/xds/xds_certificate_provider.cc
   - src/core/ext/xds/xds_client.cc
   - src/core/ext/xds/xds_client_stats.cc
   - src/core/lib/avl/avl.cc
@@ -1111,10 +1282,15 @@ libs:
   - src/core/lib/security/credentials/composite/composite_credentials.cc
   - src/core/lib/security/credentials/credentials.cc
   - src/core/lib/security/credentials/credentials_metadata.cc
+  - src/core/lib/security/credentials/external/aws_request_signer.cc
+  - src/core/lib/security/credentials/external/external_account_credentials.cc
+  - src/core/lib/security/credentials/external/file_external_account_credentials.cc
+  - src/core/lib/security/credentials/external/url_external_account_credentials.cc
   - src/core/lib/security/credentials/fake/fake_credentials.cc
   - src/core/lib/security/credentials/google_default/credentials_generic.cc
   - src/core/lib/security/credentials/google_default/google_default_credentials.cc
   - src/core/lib/security/credentials/iam/iam_credentials.cc
+  - src/core/lib/security/credentials/insecure/insecure_credentials.cc
   - src/core/lib/security/credentials/jwt/json_token.cc
   - src/core/lib/security/credentials/jwt/jwt_credentials.cc
   - src/core/lib/security/credentials/jwt/jwt_verifier.cc
@@ -1123,11 +1299,13 @@ libs:
   - src/core/lib/security/credentials/plugin/plugin_credentials.cc
   - src/core/lib/security/credentials/ssl/ssl_credentials.cc
   - src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc
+  - src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc
   - src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc
   - src/core/lib/security/credentials/tls/tls_credentials.cc
   - src/core/lib/security/credentials/xds/xds_credentials.cc
   - src/core/lib/security/security_connector/alts/alts_security_connector.cc
   - src/core/lib/security/security_connector/fake/fake_security_connector.cc
+  - src/core/lib/security/security_connector/insecure/insecure_security_connector.cc
   - src/core/lib/security/security_connector/load_system_roots_fallback.cc
   - src/core/lib/security/security_connector/load_system_roots_linux.cc
   - src/core/lib/security/security_connector/local/local_security_connector.cc
@@ -1218,6 +1396,7 @@ libs:
   - absl/types:optional
   - absl/strings:strings
   - absl/status:status
+  - absl/functional:bind_front
   - absl/container:inlined_vector
   - absl/container:flat_hash_set
   baselib: true
@@ -1247,7 +1426,6 @@ libs:
   - test/core/util/cmdline.h
   - test/core/util/debugger_macros.h
   - test/core/util/eval_args_mock_endpoint.h
-  - test/core/util/examine_stack.h
   - test/core/util/fuzzer_util.h
   - test/core/util/grpc_profiler.h
   - test/core/util/histogram.h
@@ -1258,7 +1436,9 @@ libs:
   - test/core/util/port.h
   - test/core/util/port_server_client.h
   - test/core/util/reconnect_server.h
+  - test/core/util/resolve_localhost_ip46.h
   - test/core/util/slice_splitter.h
+  - test/core/util/stack_tracer.h
   - test/core/util/subprocess.h
   - test/core/util/test_config.h
   - test/core/util/test_tcp_server.h
@@ -1268,7 +1448,6 @@ libs:
   - test/core/util/cmdline.cc
   - test/core/util/debugger_macros.cc
   - test/core/util/eval_args_mock_endpoint.cc
-  - test/core/util/examine_stack.cc
   - test/core/util/fuzzer_util.cc
   - test/core/util/grpc_profiler.cc
   - test/core/util/histogram.cc
@@ -1280,7 +1459,9 @@ libs:
   - test/core/util/port_isolated_runtime_environment.cc
   - test/core/util/port_server_client.cc
   - test/core/util/reconnect_server.cc
+  - test/core/util/resolve_localhost_ip46.cc
   - test/core/util/slice_splitter.cc
+  - test/core/util/stack_tracer.cc
   - test/core/util/subprocess_posix.cc
   - test/core/util/subprocess_windows.cc
   - test/core/util/test_config.cc
@@ -1303,7 +1484,6 @@ libs:
   - test/core/util/cmdline.h
   - test/core/util/debugger_macros.h
   - test/core/util/eval_args_mock_endpoint.h
-  - test/core/util/examine_stack.h
   - test/core/util/fuzzer_util.h
   - test/core/util/grpc_profiler.h
   - test/core/util/histogram.h
@@ -1314,7 +1494,9 @@ libs:
   - test/core/util/port.h
   - test/core/util/port_server_client.h
   - test/core/util/reconnect_server.h
+  - test/core/util/resolve_localhost_ip46.h
   - test/core/util/slice_splitter.h
+  - test/core/util/stack_tracer.h
   - test/core/util/subprocess.h
   - test/core/util/test_config.h
   - test/core/util/test_tcp_server.h
@@ -1324,7 +1506,6 @@ libs:
   - test/core/util/cmdline.cc
   - test/core/util/debugger_macros.cc
   - test/core/util/eval_args_mock_endpoint.cc
-  - test/core/util/examine_stack.cc
   - test/core/util/fuzzer_util.cc
   - test/core/util/grpc_profiler.cc
   - test/core/util/histogram.cc
@@ -1336,7 +1517,9 @@ libs:
   - test/core/util/port_isolated_runtime_environment.cc
   - test/core/util/port_server_client.cc
   - test/core/util/reconnect_server.cc
+  - test/core/util/resolve_localhost_ip46.cc
   - test/core/util/slice_splitter.cc
+  - test/core/util/stack_tracer.cc
   - test/core/util/subprocess_posix.cc
   - test/core/util/subprocess_windows.cc
   - test/core/util/test_config.cc
@@ -1454,7 +1637,6 @@ libs:
   - src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h
   - src/core/ext/upb-generated/google/api/http.upb.h
   - src/core/ext/upb-generated/google/protobuf/any.upb.h
-  - src/core/ext/upb-generated/google/protobuf/descriptor.upb.h
   - src/core/ext/upb-generated/google/protobuf/duration.upb.h
   - src/core/ext/upb-generated/google/protobuf/empty.upb.h
   - src/core/ext/upb-generated/google/protobuf/struct.upb.h
@@ -1717,7 +1899,6 @@ libs:
   - src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c
   - src/core/ext/upb-generated/google/api/http.upb.c
   - src/core/ext/upb-generated/google/protobuf/any.upb.c
-  - src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
   - src/core/ext/upb-generated/google/protobuf/duration.upb.c
   - src/core/ext/upb-generated/google/protobuf/empty.upb.c
   - src/core/ext/upb-generated/google/protobuf/struct.upb.c
@@ -2089,6 +2270,7 @@ libs:
   - include/grpcpp/security/auth_metadata_processor.h
   - include/grpcpp/security/credentials.h
   - include/grpcpp/security/server_credentials.h
+  - include/grpcpp/security/tls_certificate_provider.h
   - include/grpcpp/security/tls_credentials_options.h
   - include/grpcpp/server.h
   - include/grpcpp/server_builder.h
@@ -2139,6 +2321,7 @@ libs:
   - src/cpp/client/credentials_cc.cc
   - src/cpp/client/insecure_credentials.cc
   - src/cpp/client/secure_credentials.cc
+  - src/cpp/client/xds_credentials.cc
   - src/cpp/codegen/codegen_init.cc
   - src/cpp/common/alarm.cc
   - src/cpp/common/auth_property_iterator.cc
@@ -2151,6 +2334,7 @@ libs:
   - src/cpp/common/secure_auth_context.cc
   - src/cpp/common/secure_channel_arguments.cc
   - src/cpp/common/secure_create_auth_context.cc
+  - src/cpp/common/tls_certificate_provider.cc
   - src/cpp/common/tls_credentials_options.cc
   - src/cpp/common/tls_credentials_options_util.cc
   - src/cpp/common/validate_service_config.cc
@@ -2263,6 +2447,7 @@ libs:
   - test/cpp/util/test_config_cc.cc
   deps:
   - gpr
+  - absl/flags:parse
 - name: grpc++_test_util
   build: private
   language: c++
@@ -2291,6 +2476,7 @@ libs:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
 - name: grpc++_unsecure
   build: all
   language: c++
@@ -2450,6 +2636,7 @@ libs:
   - include/grpcpp/security/auth_metadata_processor.h
   - include/grpcpp/security/credentials.h
   - include/grpcpp/security/server_credentials.h
+  - include/grpcpp/security/tls_certificate_provider.h
   - include/grpcpp/security/tls_credentials_options.h
   - include/grpcpp/server.h
   - include/grpcpp/server_builder.h
@@ -2579,7 +2766,6 @@ libs:
   language: c++
   public_headers:
   - include/grpcpp/ext/channelz_service_plugin.h
-  - include/grpcpp/ext/channelz_service_plugin_impl.h
   headers:
   - src/cpp/server/channelz/channelz_service.h
   src:
@@ -3110,7 +3296,7 @@ targets:
   - address_sorting
   - upb
   uses_polling: false
-- name: dns_resolver_connectivity_using_ares_resolver_test
+- name: dns_resolver_connectivity_using_ares_test
   build: test
   language: c
   headers: []
@@ -3124,7 +3310,7 @@ targets:
   - upb
   args:
   - --resolver=ares
-- name: dns_resolver_connectivity_using_native_resolver_test
+- name: dns_resolver_connectivity_using_native_test
   build: test
   language: c
   headers: []
@@ -4575,7 +4761,6 @@ targets:
   platforms:
   - linux
   - posix
-  - mac
 - name: alts_credentials_fuzzer
   build: fuzzer
   language: c++
@@ -4590,6 +4775,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/security/corpus/alts_credentials_corpus
   maxlen: 2048
@@ -4658,6 +4844,19 @@ targets:
   - gpr
   - address_sorting
   - upb
+- name: aws_request_signer_test
+  gtest: true
+  build: test
+  language: c++
+  headers: []
+  src:
+  - test/core/security/aws_request_signer_test.cc
+  deps:
+  - grpc_test_util
+  - grpc
+  - gpr
+  - address_sorting
+  - upb
 - name: backoff_test
   gtest: true
   build: test
@@ -5083,6 +5282,7 @@ targets:
   - address_sorting
   - upb
   - benchmark
+  - absl/flags:flag
   benchmark: true
   defaults: benchmark
   platforms:
@@ -5264,6 +5464,19 @@ targets:
   - gpr
   - address_sorting
   - upb
+- name: certificate_provider_store_test
+  gtest: true
+  build: test
+  language: c++
+  headers: []
+  src:
+  - test/core/xds/certificate_provider_store_test.cc
+  deps:
+  - grpc_test_util
+  - grpc
+  - gpr
+  - address_sorting
+  - upb
 - name: cfstream_test
   gtest: true
   build: test
@@ -5417,6 +5630,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
 - name: client_callback_end2end_test
   gtest: true
   build: test
@@ -5480,6 +5694,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/end2end/fuzzers/client_fuzzer_corpus
   dict: test/core/end2end/fuzzers/hpack.dictionary
@@ -5742,6 +5957,26 @@ targets:
   - address_sorting
   - upb
   uses_polling: false
+- name: examine_stack_test
+  gtest: true
+  build: test
+  language: c++
+  headers: []
+  src:
+  - test/core/gprpp/examine_stack_test.cc
+  deps:
+  - grpc_test_util
+  - grpc
+  - gpr
+  - address_sorting
+  - upb
+  - absl/debugging:symbolize
+  - absl/debugging:stacktrace
+  platforms:
+  - linux
+  - posix
+  - mac
+  uses_polling: false
 - name: exception_test
   gtest: true
   build: test
@@ -5760,6 +5995,19 @@ targets:
   - gpr
   - address_sorting
   - upb
+- name: file_watcher_certificate_provider_factory_test
+  gtest: true
+  build: test
+  language: c++
+  headers: []
+  src:
+  - test/core/xds/file_watcher_certificate_provider_factory_test.cc
+  deps:
+  - grpc_test_util
+  - grpc
+  - gpr
+  - address_sorting
+  - upb
 - name: filter_end2end_test
   gtest: true
   build: test
@@ -5892,6 +6140,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
 - name: grpc_cpp_plugin
   build: protoc
   language: c++
@@ -6013,6 +6262,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   platforms:
   - linux
   - posix
@@ -6146,6 +6396,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/transport/chttp2/hpack_parser_corpus
   dict: test/core/end2end/fuzzers/hpack.dictionary
@@ -6169,6 +6420,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
 - name: http_request_fuzzer_test
   build: fuzzer
   language: c++
@@ -6183,6 +6435,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/http/request_corpus
   maxlen: 2048
@@ -6200,6 +6453,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/http/response_corpus
   maxlen: 2048
@@ -6255,6 +6509,19 @@ targets:
   - gpr
   - address_sorting
   - upb
+- name: insecure_security_connector_test
+  gtest: true
+  build: test
+  language: c++
+  headers: []
+  src:
+  - test/core/security/insecure_security_connector_test.cc
+  deps:
+  - grpc_test_util
+  - grpc
+  - gpr
+  - address_sorting
+  - upb
 - name: interop_client
   build: test
   run: false
@@ -6280,6 +6547,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
 - name: interop_server
   build: test
   run: false
@@ -6302,6 +6570,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
 - name: interop_test
   build: test
   language: c++
@@ -6317,6 +6586,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   platforms:
   - linux
   - posix
@@ -6335,6 +6605,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/json/corpus
   maxlen: 512
@@ -6472,6 +6743,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/nanopb/corpus_response
   maxlen: 128
@@ -6489,6 +6761,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/nanopb/corpus_serverlist
   maxlen: 128
@@ -6569,6 +6842,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/slice/percent_decode_corpus
   maxlen: 32
@@ -6586,6 +6860,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/slice/percent_encode_corpus
   maxlen: 32
@@ -6712,6 +6987,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
 - name: qps_worker
   build: test
   run: false
@@ -6754,6 +7030,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
 - name: raw_end2end_test
   gtest: true
   build: test
@@ -6971,6 +7248,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/end2end/fuzzers/server_fuzzer_corpus
   dict: test/core/end2end/fuzzers/hpack.dictionary
@@ -7133,9 +7411,43 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/security/corpus/ssl_server_corpus
   maxlen: 2048
+- name: stack_tracer_test
+  gtest: true
+  build: test
+  language: c++
+  headers: []
+  src:
+  - test/core/util/stack_tracer_test.cc
+  deps:
+  - grpc_test_util
+  - grpc
+  - gpr
+  - address_sorting
+  - upb
+  - absl/debugging:symbolize
+  platforms:
+  - linux
+  - posix
+  - mac
+  uses_polling: false
+- name: stat_test
+  gtest: true
+  build: test
+  language: c++
+  headers: []
+  src:
+  - test/core/gprpp/stat_test.cc
+  deps:
+  - grpc_test_util
+  - grpc
+  - gpr
+  - address_sorting
+  - upb
+  uses_polling: false
 - name: static_metadata_test
   gtest: true
   build: test
@@ -7263,6 +7575,20 @@ targets:
   - gpr
   - address_sorting
   - upb
+- name: test_cpp_server_credentials_test
+  gtest: true
+  build: test
+  language: c++
+  headers: []
+  src:
+  - test/cpp/server/credentials_test.cc
+  deps:
+  - grpc_test_util
+  - grpc++
+  - grpc
+  - gpr
+  - address_sorting
+  - upb
 - name: test_cpp_util_slice_test
   gtest: true
   build: test
@@ -7429,6 +7755,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
   corpus_dirs:
   - test/core/uri/uri_corpus
   maxlen: 128
@@ -7474,7 +7801,6 @@ targets:
   - test/core/util/cmdline.h
   - test/core/util/debugger_macros.h
   - test/core/util/eval_args_mock_endpoint.h
-  - test/core/util/examine_stack.h
   - test/core/util/fuzzer_util.h
   - test/core/util/grpc_profiler.h
   - test/core/util/histogram.h
@@ -7485,7 +7811,9 @@ targets:
   - test/core/util/port.h
   - test/core/util/port_server_client.h
   - test/core/util/reconnect_server.h
+  - test/core/util/resolve_localhost_ip46.h
   - test/core/util/slice_splitter.h
+  - test/core/util/stack_tracer.h
   - test/core/util/subprocess.h
   - test/core/util/test_config.h
   - test/core/util/test_tcp_server.h
@@ -7498,7 +7826,6 @@ targets:
   - test/core/util/cmdline.cc
   - test/core/util/debugger_macros.cc
   - test/core/util/eval_args_mock_endpoint.cc
-  - test/core/util/examine_stack.cc
   - test/core/util/fuzzer_util.cc
   - test/core/util/grpc_profiler.cc
   - test/core/util/histogram.cc
@@ -7510,7 +7837,9 @@ targets:
   - test/core/util/port_isolated_runtime_environment.cc
   - test/core/util/port_server_client.cc
   - test/core/util/reconnect_server.cc
+  - test/core/util/resolve_localhost_ip46.cc
   - test/core/util/slice_splitter.cc
+  - test/core/util/stack_tracer.cc
   - test/core/util/subprocess_posix.cc
   - test/core/util/subprocess_windows.cc
   - test/core/util/test_config.cc
@@ -7537,13 +7866,46 @@ targets:
   language: c++
   headers: []
   src:
-  - test/core/client_channel/xds_bootstrap_test.cc
+  - test/core/xds/xds_bootstrap_test.cc
   deps:
   - grpc_test_util
   - grpc
   - gpr
   - address_sorting
   - upb
+- name: xds_certificate_provider_test
+  gtest: true
+  build: test
+  language: c++
+  headers: []
+  src:
+  - test/core/xds/xds_certificate_provider_test.cc
+  deps:
+  - grpc_test_util
+  - grpc
+  - gpr
+  - address_sorting
+  - upb
+- name: xds_credentials_end2end_test
+  gtest: true
+  build: test
+  language: c++
+  headers:
+  - test/cpp/end2end/test_service_impl.h
+  src:
+  - src/proto/grpc/testing/echo.proto
+  - src/proto/grpc/testing/echo_messages.proto
+  - src/proto/grpc/testing/simple_messages.proto
+  - test/cpp/end2end/test_service_impl.cc
+  - test/cpp/end2end/xds_credentials_end2end_test.cc
+  deps:
+  - grpc++_test_util
+  - grpc_test_util
+  - grpc++
+  - grpc
+  - gpr
+  - address_sorting
+  - upb
 - name: xds_end2end_test
   gtest: true
   build: test
@@ -7573,6 +7935,7 @@ targets:
   - src/proto/grpc/testing/xds/v3/load_report.proto
   - src/proto/grpc/testing/xds/v3/lrs.proto
   - src/proto/grpc/testing/xds/v3/percent.proto
+  - src/proto/grpc/testing/xds/v3/protocol.proto
   - src/proto/grpc/testing/xds/v3/range.proto
   - src/proto/grpc/testing/xds/v3/regex.proto
   - src/proto/grpc/testing/xds/v3/route.proto
@@ -7608,6 +7971,7 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
 - name: xds_interop_server
   build: test
   run: false
@@ -7626,4 +7990,5 @@ targets:
   - gpr
   - address_sorting
   - upb
+  - absl/flags:flag
 tests: []
index 031c588..7b776c9 100644 (file)
@@ -13,5 +13,5 @@
 # limitations under the License.
 
 module GrpcBuildConfig
-  CORE_WINDOWS_DLL = '/tmp/libs/opt/grpc-13.dll'
+  CORE_WINDOWS_DLL = '/tmp/libs/opt/grpc-14.dll'
 end
index 0054713..b7c1070 100644 (file)
@@ -12,10 +12,10 @@ settings:
   '#08': Use "-preN" suffixes to identify pre-release versions
   '#09': Per-language overrides are possible with (eg) ruby_version tag here
   '#10': See the expand_version.py for all the quirks here
-  core_version: 13.0.0
+  core_version: 14.0.0
   csharp_major_version: 2
-  g_stands_for: geeky
-  version: 1.33.2
+  g_stands_for: gauntlet
+  version: 1.34.0
 targets:
 - name: check_epollexclusive
   build: tool
@@ -58,10 +58,6 @@ vspackages:
   props: true
   redist: true
   version: 1.0.204.1
-- name: gflags
-  props: false
-  redist: false
-  version: 2.1.2.1
 - name: gtest
   props: false
   redist: false
diff --git a/cmake/gflags.cmake b/cmake/gflags.cmake
deleted file mode 100644 (file)
index f00c466..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2017 gRPC authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-if(gRPC_GFLAGS_PROVIDER STREQUAL "module")
-  if(NOT GFLAGS_ROOT_DIR)
-    set(GFLAGS_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gflags)
-  endif()
-  if(EXISTS "${GFLAGS_ROOT_DIR}/CMakeLists.txt")
-    add_subdirectory(${GFLAGS_ROOT_DIR} third_party/gflags)
-    set(_gRPC_GFLAGS_LIBRARIES gflags::gflags)
-  else()
-    message(WARNING "gRPC_GFLAGS_PROVIDER is \"module\" but GFLAGS_ROOT_DIR is wrong")
-  endif()
-elseif(gRPC_GFLAGS_PROVIDER STREQUAL "package")
-  # Use "CONFIG" as there is no built-in cmake module for gflags.
-  find_package(gflags REQUIRED CONFIG)
-  if(TARGET gflags::gflags)
-    set(_gRPC_GFLAGS_LIBRARIES gflags::gflags)
-  endif()
-  set(_gRPC_FIND_GFLAGS "if(NOT gflags_FOUND)\n  find_package(gflags CONFIG)\nendif()")
-elseif(gRPC_GFLAGS_PROVIDER STREQUAL "none")
-  # gflags is a test-only dependency and can be avoided if we're not building tests.
-endif()
index b8f4346..4ad328d 100644 (file)
@@ -6,7 +6,7 @@
   "homepage": "https://grpc.io",
   "license": "Apache-2.0",
   "require": {
-    "php": ">=5.5.0"
+    "php": ">=7.0.0"
   },
   "require-dev": {
     "google/auth": "^v1.3.0"
index 7a65203..358acfc 100644 (file)
--- a/config.m4
+++ b/config.m4
@@ -67,7 +67,7 @@ if test "$PHP_GRPC" != "no"; then
     src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \
-    src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc \
+    src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc \
     src/core/ext/filters/client_channel/lb_policy_registry.cc \
     src/core/ext/filters/client_channel/local_subchannel_pool.cc \
@@ -232,10 +232,91 @@ if test "$PHP_GRPC" != "no"; then
     src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c \
     src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
     src/core/ext/upb-generated/validate/validate.upb.c \
+    src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c \
+    src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/api/http.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c \
+    src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c \
+    src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c \
+    src/core/ext/upbdefs-generated/validate/validate.upbdefs.c \
     src/core/ext/xds/certificate_provider_registry.cc \
+    src/core/ext/xds/certificate_provider_store.cc \
+    src/core/ext/xds/file_watcher_certificate_provider_factory.cc \
     src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc \
     src/core/ext/xds/xds_api.cc \
     src/core/ext/xds/xds_bootstrap.cc \
+    src/core/ext/xds/xds_certificate_provider.cc \
     src/core/ext/xds/xds_client.cc \
     src/core/ext/xds/xds_client_stats.cc \
     src/core/lib/avl/avl.cc \
@@ -293,10 +374,13 @@ if test "$PHP_GRPC" != "no"; then
     src/core/lib/gpr/tmpfile_windows.cc \
     src/core/lib/gpr/wrap_memcpy.cc \
     src/core/lib/gprpp/arena.cc \
+    src/core/lib/gprpp/examine_stack.cc \
     src/core/lib/gprpp/fork.cc \
     src/core/lib/gprpp/global_config_env.cc \
     src/core/lib/gprpp/host_port.cc \
     src/core/lib/gprpp/mpscq.cc \
+    src/core/lib/gprpp/stat_posix.cc \
+    src/core/lib/gprpp/stat_windows.cc \
     src/core/lib/gprpp/thd_posix.cc \
     src/core/lib/gprpp/thd_windows.cc \
     src/core/lib/http/format_request.cc \
@@ -418,10 +502,15 @@ if test "$PHP_GRPC" != "no"; then
     src/core/lib/security/credentials/composite/composite_credentials.cc \
     src/core/lib/security/credentials/credentials.cc \
     src/core/lib/security/credentials/credentials_metadata.cc \
+    src/core/lib/security/credentials/external/aws_request_signer.cc \
+    src/core/lib/security/credentials/external/external_account_credentials.cc \
+    src/core/lib/security/credentials/external/file_external_account_credentials.cc \
+    src/core/lib/security/credentials/external/url_external_account_credentials.cc \
     src/core/lib/security/credentials/fake/fake_credentials.cc \
     src/core/lib/security/credentials/google_default/credentials_generic.cc \
     src/core/lib/security/credentials/google_default/google_default_credentials.cc \
     src/core/lib/security/credentials/iam/iam_credentials.cc \
+    src/core/lib/security/credentials/insecure/insecure_credentials.cc \
     src/core/lib/security/credentials/jwt/json_token.cc \
     src/core/lib/security/credentials/jwt/jwt_credentials.cc \
     src/core/lib/security/credentials/jwt/jwt_verifier.cc \
@@ -430,11 +519,13 @@ if test "$PHP_GRPC" != "no"; then
     src/core/lib/security/credentials/plugin/plugin_credentials.cc \
     src/core/lib/security/credentials/ssl/ssl_credentials.cc \
     src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc \
+    src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc \
     src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc \
     src/core/lib/security/credentials/tls/tls_credentials.cc \
     src/core/lib/security/credentials/xds/xds_credentials.cc \
     src/core/lib/security/security_connector/alts/alts_security_connector.cc \
     src/core/lib/security/security_connector/fake/fake_security_connector.cc \
+    src/core/lib/security/security_connector/insecure/insecure_security_connector.cc \
     src/core/lib/security/security_connector/load_system_roots_fallback.cc \
     src/core/lib/security/security_connector/load_system_roots_linux.cc \
     src/core/lib/security/security_connector/local/local_security_connector.cc \
@@ -528,7 +619,6 @@ if test "$PHP_GRPC" != "no"; then
     src/php/ext/grpc/server.c \
     src/php/ext/grpc/server_credentials.c \
     src/php/ext/grpc/timeval.c \
-    third_party/abseil-cpp/absl/base/dynamic_annotations.cc \
     third_party/abseil-cpp/absl/base/internal/cycleclock.cc \
     third_party/abseil-cpp/absl/base/internal/exponential_biased.cc \
     third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc \
@@ -755,6 +845,7 @@ if test "$PHP_GRPC" != "no"; then
     third_party/boringssl-with-bazel/src/crypto/thread_win.c \
     third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c \
     third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c \
+    third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c \
     third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c \
     third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c \
     third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c \
@@ -895,10 +986,13 @@ if test "$PHP_GRPC" != "no"; then
     third_party/re2/util/rune.cc \
     third_party/re2/util/strutil.cc \
     third_party/upb/upb/decode.c \
+    third_party/upb/upb/def.c \
     third_party/upb/upb/encode.c \
     third_party/upb/upb/msg.c \
     third_party/upb/upb/port.c \
+    third_party/upb/upb/reflection.c \
     third_party/upb/upb/table.c \
+    third_party/upb/upb/text_encode.c \
     third_party/upb/upb/upb.c \
     , $ext_shared, , -fvisibility=hidden \
     -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN \
@@ -971,6 +1065,32 @@ if test "$PHP_GRPC" != "no"; then
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/core/v1)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/data/orca/v1)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/validate)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/annotations)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/cluster/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/core/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/listener/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/route/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/trace/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/cluster/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/discovery/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/listener/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/route/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/matcher/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/metadata/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/tracing/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/v3)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/api)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/protobuf)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/rpc)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/udpa/annotations)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/udpa/core/v1)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/validate)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/xds)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/avl)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/backoff)
@@ -990,9 +1110,11 @@ if test "$PHP_GRPC" != "no"; then
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/alts)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/composite)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/external)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/fake)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/google_default)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/iam)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/insecure)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/jwt)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/local)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/oauth2)
@@ -1003,6 +1125,7 @@ if test "$PHP_GRPC" != "no"; then
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/alts)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/fake)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/insecure)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/local)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/ssl)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/tls)
index 8c32a7d..4c4d59a 100644 (file)
@@ -34,7 +34,7 @@ if (PHP_GRPC != "no") {
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\weighted_target\\weighted_target.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\cds.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\eds.cc " +
-    "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\eds_drop.cc " +
+    "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds_cluster_impl.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds_cluster_manager.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy_registry.cc " +
     "src\\core\\ext\\filters\\client_channel\\local_subchannel_pool.cc " +
@@ -199,10 +199,91 @@ if (PHP_GRPC != "no") {
     "src\\core\\ext\\upb-generated\\udpa\\core\\v1\\resource_name.upb.c " +
     "src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1\\orca_load_report.upb.c " +
     "src\\core\\ext\\upb-generated\\validate\\validate.upb.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\annotations\\deprecation.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\annotations\\resource.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\accesslog\\v3\\accesslog.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\cluster\\v3\\circuit_breaker.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\cluster\\v3\\cluster.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\cluster\\v3\\filter.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\cluster\\v3\\outlier_detection.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\address.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\backoff.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\base.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\config_source.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\event_service_config.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\extension.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\grpc_service.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\health_check.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\http_uri.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\protocol.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\proxy_protocol.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\socket_option.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\substitution_format_string.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\endpoint\\v3\\endpoint.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\endpoint\\v3\\endpoint_components.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\endpoint\\v3\\load_report.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\listener\\v3\\api_listener.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\listener\\v3\\listener.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\listener\\v3\\listener_components.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\listener\\v3\\udp_listener_config.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\route\\v3\\route.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\route\\v3\\route_components.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\route\\v3\\scoped_route.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\config\\trace\\v3\\http_tracer.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\network\\http_connection_manager\\v3\\http_connection_manager.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\cert.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\common.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\secret.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\tls.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\service\\cluster\\v3\\cds.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\service\\discovery\\v3\\ads.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\service\\discovery\\v3\\discovery.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\service\\endpoint\\v3\\eds.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\service\\listener\\v3\\lds.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\service\\load_stats\\v3\\lrs.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\service\\route\\v3\\rds.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\service\\route\\v3\\srds.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher\\v3\\metadata.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher\\v3\\number.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher\\v3\\path.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher\\v3\\regex.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher\\v3\\string.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher\\v3\\value.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\type\\metadata\\v3\\metadata.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\type\\tracing\\v3\\custom_tag.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\type\\v3\\http.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\type\\v3\\percent.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\type\\v3\\range.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\envoy\\type\\v3\\semantic_version.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\google\\api\\annotations.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\google\\api\\http.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\google\\protobuf\\any.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\google\\protobuf\\descriptor.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\google\\protobuf\\duration.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\google\\protobuf\\empty.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\google\\protobuf\\struct.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\google\\protobuf\\timestamp.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\google\\protobuf\\wrappers.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\google\\rpc\\status.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\migrate.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\security.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\sensitive.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\status.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\versioning.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1\\authority.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1\\collection_entry.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1\\context_params.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1\\resource.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1\\resource_locator.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1\\resource_name.upbdefs.c " +
+    "src\\core\\ext\\upbdefs-generated\\validate\\validate.upbdefs.c " +
     "src\\core\\ext\\xds\\certificate_provider_registry.cc " +
+    "src\\core\\ext\\xds\\certificate_provider_store.cc " +
+    "src\\core\\ext\\xds\\file_watcher_certificate_provider_factory.cc " +
     "src\\core\\ext\\xds\\google_mesh_ca_certificate_provider_factory.cc " +
     "src\\core\\ext\\xds\\xds_api.cc " +
     "src\\core\\ext\\xds\\xds_bootstrap.cc " +
+    "src\\core\\ext\\xds\\xds_certificate_provider.cc " +
     "src\\core\\ext\\xds\\xds_client.cc " +
     "src\\core\\ext\\xds\\xds_client_stats.cc " +
     "src\\core\\lib\\avl\\avl.cc " +
@@ -260,10 +341,13 @@ if (PHP_GRPC != "no") {
     "src\\core\\lib\\gpr\\tmpfile_windows.cc " +
     "src\\core\\lib\\gpr\\wrap_memcpy.cc " +
     "src\\core\\lib\\gprpp\\arena.cc " +
+    "src\\core\\lib\\gprpp\\examine_stack.cc " +
     "src\\core\\lib\\gprpp\\fork.cc " +
     "src\\core\\lib\\gprpp\\global_config_env.cc " +
     "src\\core\\lib\\gprpp\\host_port.cc " +
     "src\\core\\lib\\gprpp\\mpscq.cc " +
+    "src\\core\\lib\\gprpp\\stat_posix.cc " +
+    "src\\core\\lib\\gprpp\\stat_windows.cc " +
     "src\\core\\lib\\gprpp\\thd_posix.cc " +
     "src\\core\\lib\\gprpp\\thd_windows.cc " +
     "src\\core\\lib\\http\\format_request.cc " +
@@ -385,10 +469,15 @@ if (PHP_GRPC != "no") {
     "src\\core\\lib\\security\\credentials\\composite\\composite_credentials.cc " +
     "src\\core\\lib\\security\\credentials\\credentials.cc " +
     "src\\core\\lib\\security\\credentials\\credentials_metadata.cc " +
+    "src\\core\\lib\\security\\credentials\\external\\aws_request_signer.cc " +
+    "src\\core\\lib\\security\\credentials\\external\\external_account_credentials.cc " +
+    "src\\core\\lib\\security\\credentials\\external\\file_external_account_credentials.cc " +
+    "src\\core\\lib\\security\\credentials\\external\\url_external_account_credentials.cc " +
     "src\\core\\lib\\security\\credentials\\fake\\fake_credentials.cc " +
     "src\\core\\lib\\security\\credentials\\google_default\\credentials_generic.cc " +
     "src\\core\\lib\\security\\credentials\\google_default\\google_default_credentials.cc " +
     "src\\core\\lib\\security\\credentials\\iam\\iam_credentials.cc " +
+    "src\\core\\lib\\security\\credentials\\insecure\\insecure_credentials.cc " +
     "src\\core\\lib\\security\\credentials\\jwt\\json_token.cc " +
     "src\\core\\lib\\security\\credentials\\jwt\\jwt_credentials.cc " +
     "src\\core\\lib\\security\\credentials\\jwt\\jwt_verifier.cc " +
@@ -397,11 +486,13 @@ if (PHP_GRPC != "no") {
     "src\\core\\lib\\security\\credentials\\plugin\\plugin_credentials.cc " +
     "src\\core\\lib\\security\\credentials\\ssl\\ssl_credentials.cc " +
     "src\\core\\lib\\security\\credentials\\tls\\grpc_tls_certificate_distributor.cc " +
+    "src\\core\\lib\\security\\credentials\\tls\\grpc_tls_certificate_provider.cc " +
     "src\\core\\lib\\security\\credentials\\tls\\grpc_tls_credentials_options.cc " +
     "src\\core\\lib\\security\\credentials\\tls\\tls_credentials.cc " +
     "src\\core\\lib\\security\\credentials\\xds\\xds_credentials.cc " +
     "src\\core\\lib\\security\\security_connector\\alts\\alts_security_connector.cc " +
     "src\\core\\lib\\security\\security_connector\\fake\\fake_security_connector.cc " +
+    "src\\core\\lib\\security\\security_connector\\insecure\\insecure_security_connector.cc " +
     "src\\core\\lib\\security\\security_connector\\load_system_roots_fallback.cc " +
     "src\\core\\lib\\security\\security_connector\\load_system_roots_linux.cc " +
     "src\\core\\lib\\security\\security_connector\\local\\local_security_connector.cc " +
@@ -495,7 +586,6 @@ if (PHP_GRPC != "no") {
     "src\\php\\ext\\grpc\\server.c " +
     "src\\php\\ext\\grpc\\server_credentials.c " +
     "src\\php\\ext\\grpc\\timeval.c " +
-    "third_party\\abseil-cpp\\absl\\base\\dynamic_annotations.cc " +
     "third_party\\abseil-cpp\\absl\\base\\internal\\cycleclock.cc " +
     "third_party\\abseil-cpp\\absl\\base\\internal\\exponential_biased.cc " +
     "third_party\\abseil-cpp\\absl\\base\\internal\\low_level_alloc.cc " +
@@ -722,6 +812,7 @@ if (PHP_GRPC != "no") {
     "third_party\\boringssl-with-bazel\\src\\crypto\\thread_win.c " +
     "third_party\\boringssl-with-bazel\\src\\crypto\\trust_token\\pmbtoken.c " +
     "third_party\\boringssl-with-bazel\\src\\crypto\\trust_token\\trust_token.c " +
+    "third_party\\boringssl-with-bazel\\src\\crypto\\trust_token\\voprf.c " +
     "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_digest.c " +
     "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_sign.c " +
     "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_strex.c " +
@@ -862,10 +953,13 @@ if (PHP_GRPC != "no") {
     "third_party\\re2\\util\\rune.cc " +
     "third_party\\re2\\util\\strutil.cc " +
     "third_party\\upb\\upb\\decode.c " +
+    "third_party\\upb\\upb\\def.c " +
     "third_party\\upb\\upb\\encode.c " +
     "third_party\\upb\\upb\\msg.c " +
     "third_party\\upb\\upb\\port.c " +
+    "third_party\\upb\\upb\\reflection.c " +
     "third_party\\upb\\upb\\table.c " +
+    "third_party\\upb\\upb\\text_encode.c " +
     "third_party\\upb\\upb\\upb.c " +
     "third_party\\zlib\\adler32.c " +
     "third_party\\zlib\\compress.c " +
@@ -889,6 +983,7 @@ if (PHP_GRPC != "no") {
     "/I"+configure_module_dirname+" "+
     "/I"+configure_module_dirname+"\\include "+
     "/I"+configure_module_dirname+"\\src\\core\\ext\\upb-generated "+
+    "/I"+configure_module_dirname+"\\src\\core\\ext\\upbdefs-generated "+
     "/I"+configure_module_dirname+"\\src\\php\\ext\\grpc "+
     "/I"+configure_module_dirname+"\\third_party\\abseil-cpp "+
     "/I"+configure_module_dirname+"\\third_party\\address_sorting\\include "+
@@ -1012,6 +1107,62 @@ if (PHP_GRPC != "no") {
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data\\orca");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\validate");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\annotations");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\accesslog");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\accesslog\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\cluster");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\cluster\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\core");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\endpoint");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\endpoint\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\listener");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\listener\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\route");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\route\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\trace");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\trace\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\network");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\network\\http_connection_manager");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\network\\http_connection_manager\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\cluster");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\cluster\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\discovery");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\discovery\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\endpoint");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\endpoint\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\listener");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\listener\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\load_stats");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\load_stats\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\route");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\route\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type\\metadata");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type\\metadata\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type\\tracing");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type\\tracing\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type\\v3");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\google");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\google\\api");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\google\\protobuf");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\google\\rpc");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\udpa");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\udpa\\annotations");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\udpa\\core");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\validate");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\xds");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\avl");
@@ -1033,9 +1184,11 @@ if (PHP_GRPC != "no") {
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\alts");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\composite");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\external");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\fake");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\google_default");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\iam");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\insecure");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\jwt");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\local");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\oauth2");
@@ -1046,6 +1199,7 @@ if (PHP_GRPC != "no") {
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\alts");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\fake");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\insecure");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\local");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\ssl");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\tls");
index 786825f..be95a6d 100644 (file)
@@ -41,17 +41,6 @@ repository, you need to run the following command to update submodules:
 git submodule update --init
 ```
 
-You also need to have the gflags library installed on your system. gflags can be
-installed with the following command:
-Linux:
-```
-sudo apt-get install libgflags-dev
-```
-Mac systems with Homebrew:
-```
-brew install gflags
-```
-
 Once the prerequisites are satisfied, you can build with cmake:
 
 ```
index 970bcd0..4bfc9ae 100644 (file)
@@ -16,3 +16,5 @@ number:
   (cannot be done until after next grpc release, so that TensorFlow can
   use the same code both internally and externally)
 - require a C++ runtime for all languages wrapping core.
+- remove `GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS` channel arg
+
index 7827cbb..be71424 100644 (file)
@@ -21,7 +21,7 @@ server = new Server()
     Services =
     {
         // the server will serve 2 services, the Greeter and the ServerReflection
-        ServerReflection.BindService(new GreeterImpl()),
+        Greeter.BindService(new GreeterImpl()),
         ServerReflection.BindService(reflectionServiceImpl)
     },
     Ports = { { "localhost", 50051, ServerCredentials.Insecure } }
index f93a251..7333782 100644 (file)
@@ -68,7 +68,6 @@ some configuration as environment variables that can be set.
   - inproc - traces the in-process transport
   - http_keepalive - traces gRPC keepalive pings
   - flowctl - traces http2 flow control
-  - lrs_lb - traces lrs LB policy
   - op_failure - traces error information when failure is pushed onto a
     completion queue
   - pick_first - traces the pick first load balancing policy
@@ -91,6 +90,7 @@ some configuration as environment variables that can be set.
   - weighted_target_lb - traces weighted_target LB policy
   - xds_client - traces xds client
   - xds_cluster_manager_lb - traces cluster manager LB policy
+  - xds_cluster_impl_lb - traces cluster impl LB policy
   - xds_resolver - traces xds resolver
 
   The following tracers will only run in binaries built in DEBUG mode. This is
index c2076f2..b004f52 100644 (file)
@@ -33,3 +33,5 @@
 - 1.31 'g' stands for ['galore'](https://github.com/grpc/grpc/tree/v1.31.x)
 - 1.32 'g' stands for ['giggle'](https://github.com/grpc/grpc/tree/v1.32.x)
 - 1.33 'g' stands for ['geeky'](https://github.com/grpc/grpc/tree/v1.33.x)
+- 1.34 'g' stands for ['gauntlet'](https://github.com/grpc/grpc/tree/v1.34.x)
+- 1.35 'g' stands for ['gecko'](https://github.com/grpc/grpc/tree/master)
index 3bf1ab4..b598a28 100644 (file)
@@ -17,8 +17,6 @@ The above two channel arguments should be sufficient for most users, but the fol
   * This channel argument if set to 1 (0 : false; 1 : true), allows keepalive pings to be sent even if there are no calls in flight.
 * **GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA**
   * This channel argument controls the maximum number of pings that can be sent when there is no data/header frame to be sent. GRPC Core will not continue sending pings if we run over the limit. Setting it to 0 allows sending pings without such a restriction.
-* **GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS**
-  * If there are no data/header frames being received on the transport, this channel argument controls the minimum time (in milliseconds) gRPC Core will wait between successive pings.
 * **GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS**
   * If there are no data/header frames being sent on the transport, this channel argument on the server side controls the minimum time (in milliseconds) that gRPC Core would expect between receiving successive pings. If the time between successive pings is less that than this time, then the ping will be considered a bad ping from the peer. Such a ping counts as a ‘ping strike’.
 On the client side, this does not have any effect.
@@ -33,7 +31,6 @@ GRPC_ARG_KEEPALIVE_TIME_MS|INT_MAX (disabled)|7200000 (2 hours)
 GRPC_ARG_KEEPALIVE_TIMEOUT_MS|20000 (20 seconds)|20000 (20 seconds)
 GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS|0 (false)|0 (false)
 GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA|2|2
-GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS|300000 (5 minutes)|300000 (5 minutes)
 GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS|N/A|300000 (5 minutes)
 GRPC_ARG_HTTP2_MAX_PING_STRIKES|N/A|2
 
@@ -42,11 +39,10 @@ GRPC_ARG_HTTP2_MAX_PING_STRIKES|N/A|2
   * The keepalive timer is started when a transport is done connecting (after handshake).
 * What happens when the keepalive timer fires?
   * When the keepalive timer fires, gRPC Core will try to send a keepalive ping on the transport. This ping can be blocked if -
-    * there is no active call on that transport and GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS is false.
-    * the number of pings already sent on the transport without any data has already exceeded GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA.
-    * the time elapsed since the previous ping is less than GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS.
+    * there is no active call on that transport and `GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS` is false.
+    * the number of pings already sent on the transport without any data has already exceeded `GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA`.
   * If a keepalive ping is not blocked and is sent on the transport, then the keepalive watchdog timer is started which will close the transport if the ping is not acknowledged before it fires.
-* Why am I receiving a GOAWAY with error code ENHANCE_YOUR_CALM?
-  * A server sends a GOAWAY with ENHANCE_YOUR_CALM if the client sends too many misbehaving pings. For example -
-    * if a server has GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS set to false and the client sends pings without there being any call in flight.
-    * if the client's GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS setting is lower than the server's GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS.
+* Why am I receiving a GOAWAY with error code `ENHANCE_YOUR_CALM`?
+  * A server sends a GOAWAY with `ENHANCE_YOUR_CALM` if the client sends too many misbehaving pings as described in [A8-client-side-keepalive.md](https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md). Some scenarios where this can happen are -
+    * if a server has `GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS` set to false while the client has set this to true resulting in keepalive pings being sent even when there is no call in flight.
+    * if the client's `GRPC_ARG_KEEPALIVE_TIME_MS` setting is lower than the server's `GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS`.
index 42045fd..f975ffc 100644 (file)
@@ -34,13 +34,24 @@ Most gRPC implementations support the following URI schemes:
     resolver does not support this, but the c-ares based resolver
     supports specifying this in the form "IP:port".)
 
-- `unix:path` or `unix://absolute_path` -- Unix domain sockets (Unix systems only)
+- `unix:path`, `unix://absolute_path` -- Unix domain sockets (Unix systems only)
   - `path` indicates the location of the desired socket.
   - In the first form, the path may be relative or absolute; in the
     second form, the path must be absolute (i.e., there will actually be
     three slashes, two prior to the path and another to begin the
     absolute path).
 
+- `unix-abstract:abstract_path` -- Unix domain socket in abstract namespace (Unix systems only)
+  - `abstract_path` indicates a name in the abstract namespace.
+  - The name has no connection with filesystem pathnames.
+  - No permissions will apply to the socket - any process/user may access the socket.
+  - The underlying implementation of Abstract sockets uses a null byte ('\0')
+    as the first character; the implementation will prepend this null. Do not include 
+    the null in `abstract_path`.
+  - `abstract_path` cannot contain null bytes.
+    - TODO(https://github.com/grpc/grpc/issues/24638): Unix allows abstract socket names to contain null bytes, 
+      but this is not supported by the gRPC C-core implementation.
+
 The following schemes are supported by the gRPC C-core implementation,
 but may not be supported in other languages:
 
index f9d03a3..90b8738 100644 (file)
@@ -3,18 +3,7 @@ gRPC
 
 .. module:: grpc
 
-Tutorial
---------
-
-If you want to see gRPC in action first, visit the `Python Quickstart <https://grpc.io/docs/languages/python/quickstart>`_.
-Or, if you would like dive in with more extensive usage of gRPC Python, check `gRPC Basics - Python <https://grpc.io/docs/languages/python/basics>`_ out.
-
-
-Example
--------
-
-Go to `gRPC Python Examples <https://github.com/grpc/grpc/tree/master/examples/python>`_
-
+For documentation, examples, and more, see the `Python gRPC <https://grpc.io/docs/languages/python/>`_ page on `grpc.io <https://grpc.io/>`_.
 
 Module Contents
 ---------------
index bea4a67..b64431f 100644 (file)
@@ -42,6 +42,47 @@ Clients should accept these arguments:
 *   --rpc_timeout_sec=SEC
     *   The timeout to set on all outbound RPCs. Default is 20.
 
+### XdsUpdateClientConfigureService
+
+The xDS test client's behavior can be dynamically changed in the middle of tests.
+This is achieved by invoking the `XdsUpdateClientConfigureService` gRPC service
+on the test client. This can be useful for tests requiring special client behaviors
+that are not desirable at test initialization and client warmup. The service is
+defined as:
+
+```
+message ClientConfigureRequest {
+  // Type of RPCs to send.
+  enum RpcType {
+    EMPTY_CALL = 0;
+    UNARY_CALL = 1;
+  }
+
+  // Metadata to be attached for the given type of RPCs.
+  message Metadata {
+    RpcType type = 1;
+    string key = 2;
+    string value = 3;
+  }
+
+  // The types of RPCs the client sends.
+  repeated RpcType types = 1;
+  // The collection of custom metadata to be attached to RPCs sent by the client.
+  repeated Metadata metadata = 2;
+}
+
+message ClientConfigureResponse {}
+
+service XdsUpdateClientConfigureService {
+  // Update the tes client's configuration.
+  rpc Configure(ClientConfigureRequest) returns (ClientConfigureResponse);
+}
+```
+
+The test client changes its behavior right after receiving the
+`ClientConfigureRequest`. Currently it only supports configuring the type(s) 
+of RPCs sent by the test client and metadata attached to each type of RPCs.
+
 ## Test Driver
 
 Note that, unlike our other interop tests, neither the client nor the server has
@@ -70,10 +111,24 @@ message LoadBalancerStatsResponse {
   int32 num_failures = 2;
 }
 
+message LoadBalancerAccumulatedStatsRequest {}
+
+message LoadBalancerAccumulatedStatsResponse {
+  // The total number of RPCs have ever issued for each type.
+  map<string, int32> num_rpcs_started_by_method = 1;
+  // The total number of RPCs have ever completed successfully for each type.
+  map<string, int32> num_rpcs_succeeded_by_method = 2;
+  // The total number of RPCs have ever failed for each type.
+  map<string, int32> num_rpcs_failed_by_method = 3;
+}
+
 service LoadBalancerStatsService {
   // Gets the backend distribution for RPCs sent by a test client.
   rpc GetClientStats(LoadBalancerStatsRequest)
       returns (LoadBalancerStatsResponse) {}
+  // Gets the accumulated stats for RPCs sent by a test client.
+  rpc GetClientAccumulatedStats(LoadBalancerAccumulatedStatsRequest)
+      returns (LoadBalancerAccumulatedStatsResponse) {}
 }
 ```
 
@@ -297,6 +352,82 @@ Assert:
 
 1. Once all backends receive at least one RPC, the following 1000 RPCs are
 distributed across the 2 backends as a: 20, b: 80.
+### path_matching
+
+This test verifies that the traffic for a certain RPC can be routed to a
+specific cluster based on the RPC path.
+
+Client parameters:
+
+1.  –num_channels=1
+1.  –qps=10
+1.  –fail_on_failed_rpc=true
+1.  –rpc=“EmptyCall,UnaryCall”
+
+Load balancer configuration:
+
+1.  2 MIGs, each with 1 backend
+1.  routes
+    - “/”: MIG_default
+
+Assert:
+
+1.  UnaryCall RPCs are sent to MIG_default
+1.  EmptyCall RPCs are sent to MIG_default
+
+The test driver adds a route for EmptyCall, routes become:
+
+1.  path{“/grpc.testing.TestService/EmptyCall”}: MIG_2
+1.  “/”: MIG_default
+
+Assert:
+
+1.  UnaryCall RPCs are sent to MIG_default
+1.  EmptyCall RPCs are sent to MIG_2
+
+The test driver adds a route for prefix Unary, routes become:
+
+1.  prefix{“/grpc.testing.TestService/Unary”}: MIG_2
+1.  “/”: MIG_default
+
+Assert:
+
+1.  UnaryCall RPCs are sent to MIG_2
+1.  EmptyCall RPCs are sent to MIG_default
+
+### header_matching
+
+This test verifies that the traffic for a certain RPC can be routed to a
+specific cluster based on the RPC header (metadata).
+
+Client parameters:
+
+1.  –num_channels=1
+1.  –qps=10
+1.  –fail_on_failed_rpc=true
+1.  –rpc=“EmptyCall,UnaryCall”
+1.  –rpc=“EmptyCall:xds_md:exact_match”
+
+Load balancer configuration:
+
+1.  2 MIGs, each with 1 backend
+1.  routes
+    - “/”: MIG_default
+
+Assert:
+
+1.  UnaryCall RPCs are sent to MIG_default
+1.  EmptyCall RPCs are sent to MIG_default
+
+The test driver adds a route for header exact match, routes become:
+
+1.  header{“xds_md”, exact: “exact_match”}: MIG_2
+1.  “/”: MIG_default
+
+Assert:
+
+1.  UnaryCall RPCs are sent to MIG_default
+1.  EmptyCall RPCs are sent to MIG_2
 
 ### gentle_failover
 
@@ -331,3 +462,38 @@ Test driver asserts:
 
 1.  All backends in the primary locality receive at least 1 RPC.
 1.  No backends in the secondary locality receive RPCs.
+
+### circuit_breaking
+
+This test verifies that the maximum number of outstanding requests is limited
+by circuit breakers of the backend service.
+
+Client parameters:
+
+1.  --num_channels=1
+1.  --qps=100
+
+Load balancer configuration:
+
+1.  Two MIGs with each having two backends.
+
+The test driver configures the backend services with:
+
+1. path{“/grpc.testing.TestService/UnaryCall"}: MIG_1
+1. path{“/grpc.testing.TestService/EmptyCall"}: MIG_2
+1. MIG_1 circuit_breakers with max_requests = 500
+1. MIG_2 circuit breakers with max_requests = 1000
+
+The test driver configures the test client to send both UnaryCall and EmptyCall,
+with all RPCs keep-open.
+
+Assert:
+
+1.  After reaching steady state, there are 500 UnaryCall RPCs in-flight
+and 1000 EmptyCall RPCs in-flight.
+
+The test driver updates MIG_1's circuit breakers with max_request = 800.
+
+Test driver asserts:
+
+1.  After reaching steady state, there are 800 UnaryCall RPCs in-flight.
\ No newline at end of file
index b722b80..b1536a7 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = iphoneos;
                                VALIDATE_PRODUCT = YES;
diff --git a/examples/csharp/HelloworldXamarin/Droid/HelloworldXamarin.Droid.csproj b/examples/csharp/HelloworldXamarin/Droid/HelloworldXamarin.Droid.csproj
deleted file mode 100644 (file)
index a25dfdf..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
-  <PropertyGroup>\r
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
-    <ProjectGuid>{B9B0D41C-1C07-4590-A919-5865E741B2EA}</ProjectGuid>\r
-    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\r
-    <OutputType>Library</OutputType>\r
-    <RootNamespace>HelloworldXamarin.Droid</RootNamespace>\r
-    <AssemblyName>HelloworldXamarin.Droid</AssemblyName>\r
-    <TargetFrameworkVersion>v8.1</TargetFrameworkVersion>\r
-    <AndroidApplication>True</AndroidApplication>\r
-    <AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>\r
-    <AndroidResgenClass>Resource</AndroidResgenClass>\r
-    <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>\r
-    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>\r
-    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>\r
-    <NuGetPackageImportStamp>\r
-    </NuGetPackageImportStamp>\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">\r
-    <DebugSymbols>true</DebugSymbols>\r
-    <DebugType>full</DebugType>\r
-    <Optimize>false</Optimize>\r
-    <OutputPath>bin\Debug</OutputPath>\r
-    <DefineConstants>DEBUG;</DefineConstants>\r
-    <ErrorReport>prompt</ErrorReport>\r
-    <WarningLevel>4</WarningLevel>\r
-    <AndroidLinkMode>None</AndroidLinkMode>\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
-    <DebugSymbols>true</DebugSymbols>\r
-    <DebugType>pdbonly</DebugType>\r
-    <Optimize>true</Optimize>\r
-    <OutputPath>bin\Release</OutputPath>\r
-    <ErrorReport>prompt</ErrorReport>\r
-    <WarningLevel>4</WarningLevel>\r
-    <AndroidManagedSymbols>true</AndroidManagedSymbols>\r
-    <AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>\r
-  </PropertyGroup>\r
-  <ItemGroup>\r
-    <Reference Include="Google.Protobuf, Version=3.8.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">\r
-      <HintPath>..\packages\Google.Protobuf.3.8.0\lib\netstandard2.0\Google.Protobuf.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="Grpc.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=d754f35622e28bad, processorArchitecture=MSIL">\r
-      <HintPath>..\packages\Grpc.Core.2.23.0\lib\netstandard2.0\Grpc.Core.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="Grpc.Core.Api, Version=2.0.0.0, Culture=neutral, PublicKeyToken=d754f35622e28bad, processorArchitecture=MSIL">\r
-      <HintPath>..\packages\Grpc.Core.Api.2.23.0\lib\netstandard2.0\Grpc.Core.Api.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="System" />\r
-    <Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">\r
-      <HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">\r
-      <HintPath>..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">\r
-      <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="System.Xml" />\r
-    <Reference Include="System.Core" />\r
-    <Reference Include="Mono.Android" />\r
-    <Reference Include="System.IO.Compression" />\r
-    <Reference Include="System.Net.Http" />\r
-    <Reference Include="System.Runtime.Loader">\r
-      <HintPath>..\packages\System.Runtime.Loader.4.0.0\lib\netstandard1.5\System.Runtime.Loader.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="System.Interactive.Async">\r
-      <HintPath>..\packages\System.Interactive.Async.3.1.1\lib\netstandard1.3\System.Interactive.Async.dll</HintPath>\r
-    </Reference>\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <Compile Include="MainActivity.cs" />\r
-    <Compile Include="Resources\Resource.designer.cs" />\r
-    <Compile Include="Properties\AssemblyInfo.cs" />\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <None Include="app.config" />\r
-    <None Include="Resources\AboutResources.txt" />\r
-    <None Include="Properties\AndroidManifest.xml" />\r
-    <None Include="Assets\AboutAssets.txt" />\r
-    <None Include="packages.config" />\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <AndroidResource Include="Resources\layout\Main.axml" />\r
-    <AndroidResource Include="Resources\values\Strings.xml" />\r
-    <AndroidResource Include="Resources\mipmap-hdpi\Icon.png" />\r
-    <AndroidResource Include="Resources\mipmap-mdpi\Icon.png" />\r
-    <AndroidResource Include="Resources\mipmap-xhdpi\Icon.png" />\r
-    <AndroidResource Include="Resources\mipmap-xxhdpi\Icon.png" />\r
-    <AndroidResource Include="Resources\mipmap-xxxhdpi\Icon.png" />\r
-  </ItemGroup>\r
-  <Import Project="..\HelloworldXamarin\HelloworldXamarin.projitems" Label="Shared" Condition="Exists('..\HelloworldXamarin\HelloworldXamarin.projitems')" />\r
-  <Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />\r
-  <Import Project="..\packages\Grpc.Core.2.23.0\build\MonoAndroid10\Grpc.Core.targets" Condition="Exists('..\packages\Grpc.Core.2.23.0\build\MonoAndroid10\Grpc.Core.targets')" />\r
-  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">\r
-    <PropertyGroup>\r
-      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\r
-    </PropertyGroup>\r
-    <Error Condition="!Exists('..\packages\Grpc.Core.2.23.0\build\MonoAndroid10\Grpc.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Grpc.Core.2.23.0\build\MonoAndroid10\Grpc.Core.targets'))" />\r
-  </Target>\r
-</Project>
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/Droid/MainActivity.cs b/examples/csharp/HelloworldXamarin/Droid/MainActivity.cs
deleted file mode 100644 (file)
index 41f4e85..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2018 The gRPC Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using Android.App;
-using Android.Widget;
-using Android.OS;
-using System.Threading.Tasks;
-using Grpc.Core;
-using Helloworld;
-
-namespace HelloworldXamarin.Droid
-{
-    [Activity(Label = "HelloworldXamarin", MainLauncher = true, Icon = "@mipmap/icon")]
-    public class MainActivity : Activity
-    {
-        const int Port = 30051;
-        int count = 1;
-
-        protected override void OnCreate(Bundle savedInstanceState)
-        {
-            base.OnCreate(savedInstanceState);
-
-            // Set our view from the "main" layout resource
-            SetContentView(Resource.Layout.Main);
-
-            // Get our button from the layout resource,
-            // and attach an event to it
-            Button button = FindViewById<Button>(Resource.Id.myButton);
-
-            button.Click += delegate { SayHello(button); };
-        }
-
-        private void SayHello(Button button)
-        {
-            Server server = new Server
-            {
-              Services = { Greeter.BindService(new GreeterImpl()) },
-              Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
-            };
-            server.Start();
-
-            // use loopback on host machine: https://developer.android.com/studio/run/emulator-networking
-            //10.0.2.2:30051
-            Channel channel = new Channel("localhost:30051", ChannelCredentials.Insecure);
-
-            var client = new Greeter.GreeterClient(channel);
-            string user = "Xamarin " + count;
-
-            var reply = client.SayHello(new HelloRequest { Name = user });
-
-            button.Text = "Greeting: " + reply.Message;
-
-            channel.ShutdownAsync().Wait();
-            server.ShutdownAsync().Wait();
-
-            count++;
-        }
-
-        class GreeterImpl : Greeter.GreeterBase
-        {
-            // Server side handler of the SayHello RPC
-            public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
-            {
-              return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
-            }
-        }
-    }
-}
-
diff --git a/examples/csharp/HelloworldXamarin/Droid/Properties/AndroidManifest.xml b/examples/csharp/HelloworldXamarin/Droid/Properties/AndroidManifest.xml
deleted file mode 100644 (file)
index 9d767ff..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="io.grpc.examples.HelloworldXamarin">
-       <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="27" />
-       <application android:label="HelloworldXamarin"></application>
-</manifest>
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/Droid/Properties/AssemblyInfo.cs b/examples/csharp/HelloworldXamarin/Droid/Properties/AssemblyInfo.cs
deleted file mode 100644 (file)
index 5a47965..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2018 The gRPC Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using Android.App;
-
-// Information about this assembly is defined by the following attributes. 
-// Change them to the values specific to your project.
-
-[assembly: AssemblyTitle("HelloworldXamarin.Droid")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("${AuthorCopyright}")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
-// The form "{Major}.{Minor}.*" will automatically update the build and revision,
-// and "{Major}.{Minor}.{Build}.*" will update just the revision.
-
-[assembly: AssemblyVersion("1.0.0")]
-
-// The following attributes are used to specify the signing key for the assembly, 
-// if desired. See the Mono documentation for more information about signing.
-
-//[assembly: AssemblyDelaySign(false)]
-//[assembly: AssemblyKeyFile("")]
diff --git a/examples/csharp/HelloworldXamarin/Droid/Resources/Resource.designer.cs b/examples/csharp/HelloworldXamarin/Droid/Resources/Resource.designer.cs
deleted file mode 100644 (file)
index 0b8a27d..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-#pragma warning disable 1591
-//------------------------------------------------------------------------------
-// <auto-generated>
-//     This code was generated by a tool.
-//     Runtime Version:4.0.30319.42000
-//
-//     Changes to this file may cause incorrect behavior and will be lost if
-//     the code is regenerated.
-// </auto-generated>
-//------------------------------------------------------------------------------
-
-[assembly: global::Android.Runtime.ResourceDesignerAttribute("HelloworldXamarin.Droid.Resource", IsApplication=true)]
-
-namespace HelloworldXamarin.Droid
-{
-       
-       
-       [System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
-       public partial class Resource
-       {
-               
-               static Resource()
-               {
-                       global::Android.Runtime.ResourceIdManager.UpdateIdValues();
-               }
-               
-               public static void UpdateIdValues()
-               {
-               }
-               
-               public partial class Attribute
-               {
-                       
-                       static Attribute()
-                       {
-                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
-                       }
-                       
-                       private Attribute()
-                       {
-                       }
-               }
-               
-               public partial class Id
-               {
-                       
-                       // aapt resource value: 0x7f050000
-                       public const int myButton = 2131034112;
-                       
-                       static Id()
-                       {
-                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
-                       }
-                       
-                       private Id()
-                       {
-                       }
-               }
-               
-               public partial class Layout
-               {
-                       
-                       // aapt resource value: 0x7f030000
-                       public const int Main = 2130903040;
-                       
-                       static Layout()
-                       {
-                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
-                       }
-                       
-                       private Layout()
-                       {
-                       }
-               }
-               
-               public partial class Mipmap
-               {
-                       
-                       // aapt resource value: 0x7f020000
-                       public const int Icon = 2130837504;
-                       
-                       static Mipmap()
-                       {
-                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
-                       }
-                       
-                       private Mipmap()
-                       {
-                       }
-               }
-               
-               public partial class String
-               {
-                       
-                       // aapt resource value: 0x7f040001
-                       public const int app_name = 2130968577;
-                       
-                       // aapt resource value: 0x7f040000
-                       public const int hello = 2130968576;
-                       
-                       static String()
-                       {
-                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
-                       }
-                       
-                       private String()
-                       {
-                       }
-               }
-       }
-}
-#pragma warning restore 1591
diff --git a/examples/csharp/HelloworldXamarin/Droid/Resources/layout/Main.axml b/examples/csharp/HelloworldXamarin/Droid/Resources/layout/Main.axml
deleted file mode 100644 (file)
index 8cb7228..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
-    <Button android:id="@+id/myButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/hello" />
-</LinearLayout>
diff --git a/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-hdpi/Icon.png b/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-hdpi/Icon.png
deleted file mode 100644 (file)
index f4c8046..0000000
Binary files a/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-hdpi/Icon.png and /dev/null differ
diff --git a/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-mdpi/Icon.png b/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-mdpi/Icon.png
deleted file mode 100644 (file)
index ef1e1ee..0000000
Binary files a/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-mdpi/Icon.png and /dev/null differ
diff --git a/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xhdpi/Icon.png b/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xhdpi/Icon.png
deleted file mode 100644 (file)
index b7e2e57..0000000
Binary files a/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xhdpi/Icon.png and /dev/null differ
diff --git a/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xxhdpi/Icon.png b/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xxhdpi/Icon.png
deleted file mode 100644 (file)
index 8d20a38..0000000
Binary files a/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xxhdpi/Icon.png and /dev/null differ
diff --git a/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xxxhdpi/Icon.png b/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xxxhdpi/Icon.png
deleted file mode 100644 (file)
index 6d9919c..0000000
Binary files a/examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xxxhdpi/Icon.png and /dev/null differ
diff --git a/examples/csharp/HelloworldXamarin/Droid/Resources/values/Strings.xml b/examples/csharp/HelloworldXamarin/Droid/Resources/values/Strings.xml
deleted file mode 100644 (file)
index 0a47c04..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="hello">Hello World, Click Me!</string>
-    <string name="app_name">HelloworldXamarin.Droid</string>
-</resources>
diff --git a/examples/csharp/HelloworldXamarin/Droid/packages.config b/examples/csharp/HelloworldXamarin/Droid/packages.config
deleted file mode 100644 (file)
index d56f8b7..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
-  <package id="Google.Protobuf" version="3.8.0" targetFramework="monoandroid81" />
-  <package id="Grpc.Core" version="2.23.0" targetFramework="monoandroid81" />
-  <package id="Grpc.Core.Api" version="2.23.0" targetFramework="monoandroid81" />
-  <package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="monoandroid81" />
-  <package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="NETStandard.Library" version="1.6.1" targetFramework="monoandroid81" />
-  <package id="System.AppContext" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Buffers" version="4.4.0" targetFramework="monoandroid81" />
-  <package id="System.Collections" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Collections.Concurrent" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Console" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Globalization" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Globalization.Calendars" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Interactive.Async" version="3.1.1" targetFramework="monoandroid81" />
-  <package id="System.IO" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.IO.Compression" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.IO.FileSystem" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Linq" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Linq.Expressions" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Memory" version="4.5.3" targetFramework="monoandroid81" />
-  <package id="System.Net.Http" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Net.Primitives" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Net.Sockets" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.ObjectModel" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Reflection" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Reflection.Extensions" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Reflection.Primitives" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Runtime" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="monoandroid81" />
-  <package id="System.Runtime.Extensions" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Runtime.Handles" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Runtime.Loader" version="4.0.0" targetFramework="monoandroid81" />
-  <package id="System.Runtime.Numerics" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Text.Encoding" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Threading" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Threading.Tasks" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Threading.Thread" version="4.0.0" targetFramework="monoandroid81" />
-  <package id="System.Threading.ThreadPool" version="4.0.10" targetFramework="monoandroid81" />
-  <package id="System.Threading.Timer" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Xml.ReaderWriter" version="4.3.0" targetFramework="monoandroid81" />
-  <package id="System.Xml.XDocument" version="4.3.0" targetFramework="monoandroid81" />
-</packages>
\ No newline at end of file
@@ -6,12 +6,12 @@ AssetManager, like this:
 
 public class ReadAsset : Activity
 {
-       protected override void OnCreate (Bundle bundle)
-       {
-               base.OnCreate (bundle);
+    protected override void OnCreate (Bundle bundle)
+    {
+        base.OnCreate (bundle);
 
-               InputStream input = Assets.Open ("my_asset.txt");
-       }
+        InputStream input = Assets.Open ("my_asset.txt");
+    }
 }
 
 Additionally, some Android functions will automatically load asset files:
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/HelloworldXamarin.Android.csproj b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/HelloworldXamarin.Android.csproj
new file mode 100644 (file)
index 0000000..6b39559
--- /dev/null
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{FB8D18D2-51AF-432C-8EA0-21B4454F45A9}</ProjectGuid>
+    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <TemplateGuid>{c9e5eea5-ca05-42a1-839b-61506e0a37df}</TemplateGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>HelloworldXamarin.Droid</RootNamespace>
+    <AssemblyName>HelloworldXamarin.Android</AssemblyName>
+    <Deterministic>True</Deterministic>
+    <AndroidApplication>True</AndroidApplication>
+    <AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
+    <AndroidResgenClass>Resource</AndroidResgenClass>
+    <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
+    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
+    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
+    <AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
+    <TargetFrameworkVersion>v9.0</TargetFrameworkVersion>
+    <AndroidEnableSGenConcurrent>true</AndroidEnableSGenConcurrent>
+    <AndroidUseAapt2>true</AndroidUseAapt2>
+    <AndroidHttpClientHandlerType>Xamarin.Android.Net.AndroidClientHandler</AndroidHttpClientHandlerType>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>portable</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <AndroidLinkMode>None</AndroidLinkMode>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>portable</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <AndroidManagedSymbols>true</AndroidManagedSymbols>
+    <AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Mono.Android" />
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Numerics" />
+    <Reference Include="System.Numerics.Vectors" />
+  </ItemGroup>
+  <ItemGroup>
+    <PackageReference Include="Grpc.Core">
+      <Version>2.32.0</Version>
+    </PackageReference>
+    <PackageReference Include="Xamarin.Forms" Version="4.6.0.1141" />
+    <PackageReference Include="Xamarin.Essentials" Version="1.5.3.2" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="MainActivity.cs" />
+    <Compile Include="Resources\Resource.designer.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\AboutResources.txt" />
+    <None Include="Assets\AboutAssets.txt" />
+    <None Include="Properties\AndroidManifest.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <AndroidResource Include="Resources\layout\Tabbar.xml" />
+    <AndroidResource Include="Resources\layout\Toolbar.xml" />
+    <AndroidResource Include="Resources\values\styles.xml" />
+    <AndroidResource Include="Resources\values\colors.xml" />
+    <AndroidResource Include="Resources\mipmap-anydpi-v26\icon.xml" />
+    <AndroidResource Include="Resources\mipmap-anydpi-v26\icon_round.xml" />
+    <AndroidResource Include="Resources\mipmap-hdpi\icon.png" />
+    <AndroidResource Include="Resources\mipmap-hdpi\launcher_foreground.png" />
+    <AndroidResource Include="Resources\mipmap-mdpi\icon.png" />
+    <AndroidResource Include="Resources\mipmap-mdpi\launcher_foreground.png" />
+    <AndroidResource Include="Resources\mipmap-xhdpi\icon.png" />
+    <AndroidResource Include="Resources\mipmap-xhdpi\launcher_foreground.png" />
+    <AndroidResource Include="Resources\mipmap-xxhdpi\icon.png" />
+    <AndroidResource Include="Resources\mipmap-xxhdpi\launcher_foreground.png" />
+    <AndroidResource Include="Resources\mipmap-xxxhdpi\icon.png" />
+    <AndroidResource Include="Resources\mipmap-xxxhdpi\launcher_foreground.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Resources\drawable\" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HelloworldXamarin\HelloworldXamarin.csproj">
+      <Project>{5900A2BD-3407-4F05-8CF2-DFF2A98B54F3}</Project>
+      <Name>HelloworldXamarin</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/MainActivity.cs b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/MainActivity.cs
new file mode 100644 (file)
index 0000000..5599b29
--- /dev/null
@@ -0,0 +1,49 @@
+#region Copyright notice and license
+// Copyright 2020 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#endregion
+
+using System;
+
+using Android.App;
+using Android.Content.PM;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+
+namespace HelloworldXamarin.Droid
+{
+    [Activity(Label = "HelloworldXamarin", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]
+    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
+    {
+        protected override void OnCreate(Bundle savedInstanceState)
+        {
+            TabLayoutResource = Resource.Layout.Tabbar;
+            ToolbarResource = Resource.Layout.Toolbar;
+
+            base.OnCreate(savedInstanceState);
+
+            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
+            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
+            LoadApplication(new App());
+        }
+        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
+        {
+            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
+
+            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
+        }
+    }
+}
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Properties/AndroidManifest.xml b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Properties/AndroidManifest.xml
new file mode 100644 (file)
index 0000000..f7d37dd
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.helloworldxamarin">
+    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
+    <application android:label="HelloworldXamarin.Android" android:theme="@style/MainTheme"></application>
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+</manifest>
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Properties/AssemblyInfo.cs b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Properties/AssemblyInfo.cs
new file mode 100644 (file)
index 0000000..ec1149e
--- /dev/null
@@ -0,0 +1,46 @@
+#region Copyright notice and license
+// Copyright 2020 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using Android.App;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HelloworldXamarin.Android")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HelloworldXamarin.Android")]
+[assembly: AssemblyCopyright("Copyright ©  2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: ComVisible(false)]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+
+// Add some common permissions, these can be removed if not needed
+[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
+[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
@@ -3,16 +3,22 @@ in your application as resource files.  Various Android APIs are designed to
 operate on the resource IDs instead of dealing with images, strings or binary blobs 
 directly.
 
-For example, a sample Android app that contains a user interface layout (main.axml),
+For example, a sample Android app that contains a user interface layout (main.xml),
 an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) 
 would keep its resources in the "Resources" directory of the application:
 
 Resources/
-    drawable/
+    drawable-hdpi/
+        icon.png
+
+    drawable-ldpi/
+        icon.png
+
+    drawable-mdpi/
         icon.png
 
     layout/
-        main.axml
+        main.xml
 
     values/
         strings.xml
@@ -20,11 +26,11 @@ Resources/
 In order to get the build system to recognize Android resources, set the build action to
 "AndroidResource".  The native Android APIs do not operate directly with filenames, but 
 instead operate on resource IDs.  When you compile an Android application that uses resources, 
-the build system will package the resources for distribution and generate a class called "R" 
-(this is an Android convention) that contains the tokens for each one of the resources 
-included. For example, for the above Resources layout, this is what the R class would expose:
+the build system will package the resources for distribution and generate a class called
+"Resource" that contains the tokens for each one of the resources included. For example, 
+for the above Resources layout, this is what the Resource class would expose:
 
-public class R {
+public class Resource {
     public class drawable {
         public const int icon = 0x123;
     }
@@ -39,6 +45,6 @@ public class R {
     }
 }
 
-You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main 
-to reference the layout/main.axml file, or R.strings.first_string to reference the first 
+You would then use R.drawable.icon to reference the drawable/icon.png file, or Resource.layout.main 
+to reference the layout/main.xml file, or Resource.strings.first_string to reference the first 
 string in the dictionary file values/strings.xml.
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/Resource.designer.cs b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/Resource.designer.cs
new file mode 100644 (file)
index 0000000..23236ae
--- /dev/null
@@ -0,0 +1,14016 @@
+#region Copyright notice and license
+// Copyright 2020 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#endregion
+
+#pragma warning disable 1591
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+[assembly: global::Android.Runtime.ResourceDesignerAttribute("HelloworldXamarin.Droid.Resource", IsApplication=true)]
+
+namespace HelloworldXamarin.Droid
+{
+       
+       
+       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
+       public partial class Resource
+       {
+               
+               static Resource()
+               {
+                       global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+               }
+               
+               public static void UpdateIdValues()
+               {
+                       global::Xamarin.Essentials.Resource.Attribute.alpha = global::HelloworldXamarin.Droid.Resource.Attribute.alpha;
+                       global::Xamarin.Essentials.Resource.Attribute.coordinatorLayoutStyle = global::HelloworldXamarin.Droid.Resource.Attribute.coordinatorLayoutStyle;
+                       global::Xamarin.Essentials.Resource.Attribute.font = global::HelloworldXamarin.Droid.Resource.Attribute.font;
+                       global::Xamarin.Essentials.Resource.Attribute.fontProviderAuthority = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderAuthority;
+                       global::Xamarin.Essentials.Resource.Attribute.fontProviderCerts = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderCerts;
+                       global::Xamarin.Essentials.Resource.Attribute.fontProviderFetchStrategy = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderFetchStrategy;
+                       global::Xamarin.Essentials.Resource.Attribute.fontProviderFetchTimeout = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderFetchTimeout;
+                       global::Xamarin.Essentials.Resource.Attribute.fontProviderPackage = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderPackage;
+                       global::Xamarin.Essentials.Resource.Attribute.fontProviderQuery = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderQuery;
+                       global::Xamarin.Essentials.Resource.Attribute.fontStyle = global::HelloworldXamarin.Droid.Resource.Attribute.fontStyle;
+                       global::Xamarin.Essentials.Resource.Attribute.fontVariationSettings = global::HelloworldXamarin.Droid.Resource.Attribute.fontVariationSettings;
+                       global::Xamarin.Essentials.Resource.Attribute.fontWeight = global::HelloworldXamarin.Droid.Resource.Attribute.fontWeight;
+                       global::Xamarin.Essentials.Resource.Attribute.keylines = global::HelloworldXamarin.Droid.Resource.Attribute.keylines;
+                       global::Xamarin.Essentials.Resource.Attribute.layout_anchor = global::HelloworldXamarin.Droid.Resource.Attribute.layout_anchor;
+                       global::Xamarin.Essentials.Resource.Attribute.layout_anchorGravity = global::HelloworldXamarin.Droid.Resource.Attribute.layout_anchorGravity;
+                       global::Xamarin.Essentials.Resource.Attribute.layout_behavior = global::HelloworldXamarin.Droid.Resource.Attribute.layout_behavior;
+                       global::Xamarin.Essentials.Resource.Attribute.layout_dodgeInsetEdges = global::HelloworldXamarin.Droid.Resource.Attribute.layout_dodgeInsetEdges;
+                       global::Xamarin.Essentials.Resource.Attribute.layout_insetEdge = global::HelloworldXamarin.Droid.Resource.Attribute.layout_insetEdge;
+                       global::Xamarin.Essentials.Resource.Attribute.layout_keyline = global::HelloworldXamarin.Droid.Resource.Attribute.layout_keyline;
+                       global::Xamarin.Essentials.Resource.Attribute.statusBarBackground = global::HelloworldXamarin.Droid.Resource.Attribute.statusBarBackground;
+                       global::Xamarin.Essentials.Resource.Attribute.ttcIndex = global::HelloworldXamarin.Droid.Resource.Attribute.ttcIndex;
+                       global::Xamarin.Essentials.Resource.Color.browser_actions_bg_grey = global::HelloworldXamarin.Droid.Resource.Color.browser_actions_bg_grey;
+                       global::Xamarin.Essentials.Resource.Color.browser_actions_divider_color = global::HelloworldXamarin.Droid.Resource.Color.browser_actions_divider_color;
+                       global::Xamarin.Essentials.Resource.Color.browser_actions_text_color = global::HelloworldXamarin.Droid.Resource.Color.browser_actions_text_color;
+                       global::Xamarin.Essentials.Resource.Color.browser_actions_title_color = global::HelloworldXamarin.Droid.Resource.Color.browser_actions_title_color;
+                       global::Xamarin.Essentials.Resource.Color.notification_action_color_filter = global::HelloworldXamarin.Droid.Resource.Color.notification_action_color_filter;
+                       global::Xamarin.Essentials.Resource.Color.notification_icon_bg_color = global::HelloworldXamarin.Droid.Resource.Color.notification_icon_bg_color;
+                       global::Xamarin.Essentials.Resource.Color.ripple_material_light = global::HelloworldXamarin.Droid.Resource.Color.ripple_material_light;
+                       global::Xamarin.Essentials.Resource.Color.secondary_text_default_material_light = global::HelloworldXamarin.Droid.Resource.Color.secondary_text_default_material_light;
+                       global::Xamarin.Essentials.Resource.Dimension.browser_actions_context_menu_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.browser_actions_context_menu_max_width;
+                       global::Xamarin.Essentials.Resource.Dimension.browser_actions_context_menu_min_padding = global::HelloworldXamarin.Droid.Resource.Dimension.browser_actions_context_menu_min_padding;
+                       global::Xamarin.Essentials.Resource.Dimension.compat_button_inset_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_button_inset_horizontal_material;
+                       global::Xamarin.Essentials.Resource.Dimension.compat_button_inset_vertical_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_button_inset_vertical_material;
+                       global::Xamarin.Essentials.Resource.Dimension.compat_button_padding_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_button_padding_horizontal_material;
+                       global::Xamarin.Essentials.Resource.Dimension.compat_button_padding_vertical_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_button_padding_vertical_material;
+                       global::Xamarin.Essentials.Resource.Dimension.compat_control_corner_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_control_corner_material;
+                       global::Xamarin.Essentials.Resource.Dimension.compat_notification_large_icon_max_height = global::HelloworldXamarin.Droid.Resource.Dimension.compat_notification_large_icon_max_height;
+                       global::Xamarin.Essentials.Resource.Dimension.compat_notification_large_icon_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.compat_notification_large_icon_max_width;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_action_icon_size = global::HelloworldXamarin.Droid.Resource.Dimension.notification_action_icon_size;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_action_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.notification_action_text_size;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_big_circle_margin = global::HelloworldXamarin.Droid.Resource.Dimension.notification_big_circle_margin;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_content_margin_start = global::HelloworldXamarin.Droid.Resource.Dimension.notification_content_margin_start;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_large_icon_height = global::HelloworldXamarin.Droid.Resource.Dimension.notification_large_icon_height;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_large_icon_width = global::HelloworldXamarin.Droid.Resource.Dimension.notification_large_icon_width;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_main_column_padding_top = global::HelloworldXamarin.Droid.Resource.Dimension.notification_main_column_padding_top;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_media_narrow_margin = global::HelloworldXamarin.Droid.Resource.Dimension.notification_media_narrow_margin;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_right_icon_size = global::HelloworldXamarin.Droid.Resource.Dimension.notification_right_icon_size;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_right_side_padding_top = global::HelloworldXamarin.Droid.Resource.Dimension.notification_right_side_padding_top;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_small_icon_background_padding = global::HelloworldXamarin.Droid.Resource.Dimension.notification_small_icon_background_padding;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_small_icon_size_as_large = global::HelloworldXamarin.Droid.Resource.Dimension.notification_small_icon_size_as_large;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_subtext_size = global::HelloworldXamarin.Droid.Resource.Dimension.notification_subtext_size;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_top_pad = global::HelloworldXamarin.Droid.Resource.Dimension.notification_top_pad;
+                       global::Xamarin.Essentials.Resource.Dimension.notification_top_pad_large_text = global::HelloworldXamarin.Droid.Resource.Dimension.notification_top_pad_large_text;
+                       global::Xamarin.Essentials.Resource.Drawable.notification_action_background = global::HelloworldXamarin.Droid.Resource.Drawable.notification_action_background;
+                       global::Xamarin.Essentials.Resource.Drawable.notification_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg;
+                       global::Xamarin.Essentials.Resource.Drawable.notification_bg_low = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_low;
+                       global::Xamarin.Essentials.Resource.Drawable.notification_bg_low_normal = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_low_normal;
+                       global::Xamarin.Essentials.Resource.Drawable.notification_bg_low_pressed = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_low_pressed;
+                       global::Xamarin.Essentials.Resource.Drawable.notification_bg_normal = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_normal;
+                       global::Xamarin.Essentials.Resource.Drawable.notification_bg_normal_pressed = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_normal_pressed;
+                       global::Xamarin.Essentials.Resource.Drawable.notification_icon_background = global::HelloworldXamarin.Droid.Resource.Drawable.notification_icon_background;
+                       global::Xamarin.Essentials.Resource.Drawable.notification_template_icon_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notification_template_icon_bg;
+                       global::Xamarin.Essentials.Resource.Drawable.notification_template_icon_low_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notification_template_icon_low_bg;
+                       global::Xamarin.Essentials.Resource.Drawable.notification_tile_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notification_tile_bg;
+                       global::Xamarin.Essentials.Resource.Drawable.notify_panel_notification_icon_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notify_panel_notification_icon_bg;
+                       global::Xamarin.Essentials.Resource.Id.actions = global::HelloworldXamarin.Droid.Resource.Id.actions;
+                       global::Xamarin.Essentials.Resource.Id.action_container = global::HelloworldXamarin.Droid.Resource.Id.action_container;
+                       global::Xamarin.Essentials.Resource.Id.action_divider = global::HelloworldXamarin.Droid.Resource.Id.action_divider;
+                       global::Xamarin.Essentials.Resource.Id.action_image = global::HelloworldXamarin.Droid.Resource.Id.action_image;
+                       global::Xamarin.Essentials.Resource.Id.action_text = global::HelloworldXamarin.Droid.Resource.Id.action_text;
+                       global::Xamarin.Essentials.Resource.Id.all = global::HelloworldXamarin.Droid.Resource.Id.all;
+                       global::Xamarin.Essentials.Resource.Id.async = global::HelloworldXamarin.Droid.Resource.Id.async;
+                       global::Xamarin.Essentials.Resource.Id.blocking = global::HelloworldXamarin.Droid.Resource.Id.blocking;
+                       global::Xamarin.Essentials.Resource.Id.bottom = global::HelloworldXamarin.Droid.Resource.Id.bottom;
+                       global::Xamarin.Essentials.Resource.Id.browser_actions_header_text = global::HelloworldXamarin.Droid.Resource.Id.browser_actions_header_text;
+                       global::Xamarin.Essentials.Resource.Id.browser_actions_menu_items = global::HelloworldXamarin.Droid.Resource.Id.browser_actions_menu_items;
+                       global::Xamarin.Essentials.Resource.Id.browser_actions_menu_item_icon = global::HelloworldXamarin.Droid.Resource.Id.browser_actions_menu_item_icon;
+                       global::Xamarin.Essentials.Resource.Id.browser_actions_menu_item_text = global::HelloworldXamarin.Droid.Resource.Id.browser_actions_menu_item_text;
+                       global::Xamarin.Essentials.Resource.Id.browser_actions_menu_view = global::HelloworldXamarin.Droid.Resource.Id.browser_actions_menu_view;
+                       global::Xamarin.Essentials.Resource.Id.center = global::HelloworldXamarin.Droid.Resource.Id.center;
+                       global::Xamarin.Essentials.Resource.Id.center_horizontal = global::HelloworldXamarin.Droid.Resource.Id.center_horizontal;
+                       global::Xamarin.Essentials.Resource.Id.center_vertical = global::HelloworldXamarin.Droid.Resource.Id.center_vertical;
+                       global::Xamarin.Essentials.Resource.Id.chronometer = global::HelloworldXamarin.Droid.Resource.Id.chronometer;
+                       global::Xamarin.Essentials.Resource.Id.clip_horizontal = global::HelloworldXamarin.Droid.Resource.Id.clip_horizontal;
+                       global::Xamarin.Essentials.Resource.Id.clip_vertical = global::HelloworldXamarin.Droid.Resource.Id.clip_vertical;
+                       global::Xamarin.Essentials.Resource.Id.end = global::HelloworldXamarin.Droid.Resource.Id.end;
+                       global::Xamarin.Essentials.Resource.Id.fill = global::HelloworldXamarin.Droid.Resource.Id.fill;
+                       global::Xamarin.Essentials.Resource.Id.fill_horizontal = global::HelloworldXamarin.Droid.Resource.Id.fill_horizontal;
+                       global::Xamarin.Essentials.Resource.Id.fill_vertical = global::HelloworldXamarin.Droid.Resource.Id.fill_vertical;
+                       global::Xamarin.Essentials.Resource.Id.forever = global::HelloworldXamarin.Droid.Resource.Id.forever;
+                       global::Xamarin.Essentials.Resource.Id.icon = global::HelloworldXamarin.Droid.Resource.Id.icon;
+                       global::Xamarin.Essentials.Resource.Id.icon_group = global::HelloworldXamarin.Droid.Resource.Id.icon_group;
+                       global::Xamarin.Essentials.Resource.Id.info = global::HelloworldXamarin.Droid.Resource.Id.info;
+                       global::Xamarin.Essentials.Resource.Id.italic = global::HelloworldXamarin.Droid.Resource.Id.italic;
+                       global::Xamarin.Essentials.Resource.Id.left = global::HelloworldXamarin.Droid.Resource.Id.left;
+                       global::Xamarin.Essentials.Resource.Id.line1 = global::HelloworldXamarin.Droid.Resource.Id.line1;
+                       global::Xamarin.Essentials.Resource.Id.line3 = global::HelloworldXamarin.Droid.Resource.Id.line3;
+                       global::Xamarin.Essentials.Resource.Id.none = global::HelloworldXamarin.Droid.Resource.Id.none;
+                       global::Xamarin.Essentials.Resource.Id.normal = global::HelloworldXamarin.Droid.Resource.Id.normal;
+                       global::Xamarin.Essentials.Resource.Id.notification_background = global::HelloworldXamarin.Droid.Resource.Id.notification_background;
+                       global::Xamarin.Essentials.Resource.Id.notification_main_column = global::HelloworldXamarin.Droid.Resource.Id.notification_main_column;
+                       global::Xamarin.Essentials.Resource.Id.notification_main_column_container = global::HelloworldXamarin.Droid.Resource.Id.notification_main_column_container;
+                       global::Xamarin.Essentials.Resource.Id.right = global::HelloworldXamarin.Droid.Resource.Id.right;
+                       global::Xamarin.Essentials.Resource.Id.right_icon = global::HelloworldXamarin.Droid.Resource.Id.right_icon;
+                       global::Xamarin.Essentials.Resource.Id.right_side = global::HelloworldXamarin.Droid.Resource.Id.right_side;
+                       global::Xamarin.Essentials.Resource.Id.start = global::HelloworldXamarin.Droid.Resource.Id.start;
+                       global::Xamarin.Essentials.Resource.Id.tag_transition_group = global::HelloworldXamarin.Droid.Resource.Id.tag_transition_group;
+                       global::Xamarin.Essentials.Resource.Id.tag_unhandled_key_event_manager = global::HelloworldXamarin.Droid.Resource.Id.tag_unhandled_key_event_manager;
+                       global::Xamarin.Essentials.Resource.Id.tag_unhandled_key_listeners = global::HelloworldXamarin.Droid.Resource.Id.tag_unhandled_key_listeners;
+                       global::Xamarin.Essentials.Resource.Id.text = global::HelloworldXamarin.Droid.Resource.Id.text;
+                       global::Xamarin.Essentials.Resource.Id.text2 = global::HelloworldXamarin.Droid.Resource.Id.text2;
+                       global::Xamarin.Essentials.Resource.Id.time = global::HelloworldXamarin.Droid.Resource.Id.time;
+                       global::Xamarin.Essentials.Resource.Id.title = global::HelloworldXamarin.Droid.Resource.Id.title;
+                       global::Xamarin.Essentials.Resource.Id.top = global::HelloworldXamarin.Droid.Resource.Id.top;
+                       global::Xamarin.Essentials.Resource.Integer.status_bar_notification_info_maxnum = global::HelloworldXamarin.Droid.Resource.Integer.status_bar_notification_info_maxnum;
+                       global::Xamarin.Essentials.Resource.Layout.browser_actions_context_menu_page = global::HelloworldXamarin.Droid.Resource.Layout.browser_actions_context_menu_page;
+                       global::Xamarin.Essentials.Resource.Layout.browser_actions_context_menu_row = global::HelloworldXamarin.Droid.Resource.Layout.browser_actions_context_menu_row;
+                       global::Xamarin.Essentials.Resource.Layout.notification_action = global::HelloworldXamarin.Droid.Resource.Layout.notification_action;
+                       global::Xamarin.Essentials.Resource.Layout.notification_action_tombstone = global::HelloworldXamarin.Droid.Resource.Layout.notification_action_tombstone;
+                       global::Xamarin.Essentials.Resource.Layout.notification_template_custom_big = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_custom_big;
+                       global::Xamarin.Essentials.Resource.Layout.notification_template_icon_group = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_icon_group;
+                       global::Xamarin.Essentials.Resource.Layout.notification_template_part_chronometer = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_part_chronometer;
+                       global::Xamarin.Essentials.Resource.Layout.notification_template_part_time = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_part_time;
+                       global::Xamarin.Essentials.Resource.String.status_bar_notification_info_overflow = global::HelloworldXamarin.Droid.Resource.String.status_bar_notification_info_overflow;
+                       global::Xamarin.Essentials.Resource.Style.TextAppearance_Compat_Notification = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification;
+                       global::Xamarin.Essentials.Resource.Style.TextAppearance_Compat_Notification_Info = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Info;
+                       global::Xamarin.Essentials.Resource.Style.TextAppearance_Compat_Notification_Line2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Line2;
+                       global::Xamarin.Essentials.Resource.Style.TextAppearance_Compat_Notification_Time = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Time;
+                       global::Xamarin.Essentials.Resource.Style.TextAppearance_Compat_Notification_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Title;
+                       global::Xamarin.Essentials.Resource.Style.Widget_Compat_NotificationActionContainer = global::HelloworldXamarin.Droid.Resource.Style.Widget_Compat_NotificationActionContainer;
+                       global::Xamarin.Essentials.Resource.Style.Widget_Compat_NotificationActionText = global::HelloworldXamarin.Droid.Resource.Style.Widget_Compat_NotificationActionText;
+                       global::Xamarin.Essentials.Resource.Style.Widget_Support_CoordinatorLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_Support_CoordinatorLayout;
+                       global::Xamarin.Essentials.Resource.Styleable.ColorStateListItem = global::HelloworldXamarin.Droid.Resource.Styleable.ColorStateListItem;
+                       global::Xamarin.Essentials.Resource.Styleable.ColorStateListItem_alpha = global::HelloworldXamarin.Droid.Resource.Styleable.ColorStateListItem_alpha;
+                       global::Xamarin.Essentials.Resource.Styleable.ColorStateListItem_android_alpha = global::HelloworldXamarin.Droid.Resource.Styleable.ColorStateListItem_android_alpha;
+                       global::Xamarin.Essentials.Resource.Styleable.ColorStateListItem_android_color = global::HelloworldXamarin.Droid.Resource.Styleable.ColorStateListItem_android_color;
+                       global::Xamarin.Essentials.Resource.Styleable.CoordinatorLayout = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout;
+                       global::Xamarin.Essentials.Resource.Styleable.CoordinatorLayout_keylines = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_keylines;
+                       global::Xamarin.Essentials.Resource.Styleable.CoordinatorLayout_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout;
+                       global::Xamarin.Essentials.Resource.Styleable.CoordinatorLayout_Layout_android_layout_gravity = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_android_layout_gravity;
+                       global::Xamarin.Essentials.Resource.Styleable.CoordinatorLayout_Layout_layout_anchor = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_anchor;
+                       global::Xamarin.Essentials.Resource.Styleable.CoordinatorLayout_Layout_layout_anchorGravity = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_anchorGravity;
+                       global::Xamarin.Essentials.Resource.Styleable.CoordinatorLayout_Layout_layout_behavior = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_behavior;
+                       global::Xamarin.Essentials.Resource.Styleable.CoordinatorLayout_Layout_layout_dodgeInsetEdges = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_dodgeInsetEdges;
+                       global::Xamarin.Essentials.Resource.Styleable.CoordinatorLayout_Layout_layout_insetEdge = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_insetEdge;
+                       global::Xamarin.Essentials.Resource.Styleable.CoordinatorLayout_Layout_layout_keyline = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_keyline;
+                       global::Xamarin.Essentials.Resource.Styleable.CoordinatorLayout_statusBarBackground = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_statusBarBackground;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamily = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamilyFont = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamilyFont_android_font = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_font;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamilyFont_android_fontStyle = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_fontStyle;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamilyFont_android_fontVariationSettings = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_fontVariationSettings;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamilyFont_android_fontWeight = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_fontWeight;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamilyFont_android_ttcIndex = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_ttcIndex;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamilyFont_font = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_font;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamilyFont_fontStyle = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_fontStyle;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamilyFont_fontVariationSettings = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_fontVariationSettings;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamilyFont_fontWeight = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_fontWeight;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamilyFont_ttcIndex = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_ttcIndex;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamily_fontProviderAuthority = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderAuthority;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamily_fontProviderCerts = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderCerts;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamily_fontProviderFetchStrategy = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderFetchStrategy;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamily_fontProviderFetchTimeout = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderFetchTimeout;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamily_fontProviderPackage = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderPackage;
+                       global::Xamarin.Essentials.Resource.Styleable.FontFamily_fontProviderQuery = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderQuery;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColorItem = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColorItem;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColorItem_android_color = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColorItem_android_color;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColorItem_android_offset = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColorItem_android_offset;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor_android_centerColor = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_centerColor;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor_android_centerX = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_centerX;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor_android_centerY = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_centerY;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor_android_endColor = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_endColor;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor_android_endX = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_endX;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor_android_endY = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_endY;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor_android_gradientRadius = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_gradientRadius;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor_android_startColor = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_startColor;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor_android_startX = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_startX;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor_android_startY = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_startY;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor_android_tileMode = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_tileMode;
+                       global::Xamarin.Essentials.Resource.Styleable.GradientColor_android_type = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_type;
+                       global::Xamarin.Essentials.Resource.Xml.xamarin_essentials_fileprovider_file_paths = global::HelloworldXamarin.Droid.Resource.Xml.xamarin_essentials_fileprovider_file_paths;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.abc_fade_in = global::HelloworldXamarin.Droid.Resource.Animation.abc_fade_in;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.abc_fade_out = global::HelloworldXamarin.Droid.Resource.Animation.abc_fade_out;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.abc_grow_fade_in_from_bottom = global::HelloworldXamarin.Droid.Resource.Animation.abc_grow_fade_in_from_bottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.abc_popup_enter = global::HelloworldXamarin.Droid.Resource.Animation.abc_popup_enter;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.abc_popup_exit = global::HelloworldXamarin.Droid.Resource.Animation.abc_popup_exit;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.abc_shrink_fade_out_from_bottom = global::HelloworldXamarin.Droid.Resource.Animation.abc_shrink_fade_out_from_bottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.abc_slide_in_bottom = global::HelloworldXamarin.Droid.Resource.Animation.abc_slide_in_bottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.abc_slide_in_top = global::HelloworldXamarin.Droid.Resource.Animation.abc_slide_in_top;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.abc_slide_out_bottom = global::HelloworldXamarin.Droid.Resource.Animation.abc_slide_out_bottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.abc_slide_out_top = global::HelloworldXamarin.Droid.Resource.Animation.abc_slide_out_top;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.abc_tooltip_enter = global::HelloworldXamarin.Droid.Resource.Animation.abc_tooltip_enter;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.abc_tooltip_exit = global::HelloworldXamarin.Droid.Resource.Animation.abc_tooltip_exit;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.design_bottom_sheet_slide_in = global::HelloworldXamarin.Droid.Resource.Animation.design_bottom_sheet_slide_in;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.design_bottom_sheet_slide_out = global::HelloworldXamarin.Droid.Resource.Animation.design_bottom_sheet_slide_out;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.design_snackbar_in = global::HelloworldXamarin.Droid.Resource.Animation.design_snackbar_in;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.design_snackbar_out = global::HelloworldXamarin.Droid.Resource.Animation.design_snackbar_out;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.EnterFromLeft = global::HelloworldXamarin.Droid.Resource.Animation.EnterFromLeft;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.EnterFromRight = global::HelloworldXamarin.Droid.Resource.Animation.EnterFromRight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.ExitToLeft = global::HelloworldXamarin.Droid.Resource.Animation.ExitToLeft;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animation.ExitToRight = global::HelloworldXamarin.Droid.Resource.Animation.ExitToRight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animator.design_appbar_state_list_animator = global::HelloworldXamarin.Droid.Resource.Animator.design_appbar_state_list_animator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animator.design_fab_hide_motion_spec = global::HelloworldXamarin.Droid.Resource.Animator.design_fab_hide_motion_spec;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animator.design_fab_show_motion_spec = global::HelloworldXamarin.Droid.Resource.Animator.design_fab_show_motion_spec;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animator.mtrl_btn_state_list_anim = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_btn_state_list_anim;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animator.mtrl_btn_unelevated_state_list_anim = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_btn_unelevated_state_list_anim;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animator.mtrl_chip_state_list_anim = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_chip_state_list_anim;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animator.mtrl_fab_hide_motion_spec = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_fab_hide_motion_spec;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animator.mtrl_fab_show_motion_spec = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_fab_show_motion_spec;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animator.mtrl_fab_transformation_sheet_collapse_spec = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_fab_transformation_sheet_collapse_spec;
+                       global::Xamarin.Forms.Platform.Android.Resource.Animator.mtrl_fab_transformation_sheet_expand_spec = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_fab_transformation_sheet_expand_spec;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarDivider = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarDivider;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarItemBackground = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarItemBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarPopupTheme = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarPopupTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarSize = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarSplitStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarSplitStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarTabBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarTabBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarTabStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarTabStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarTabTextStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarTabTextStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarTheme = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarWidgetTheme = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarWidgetTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionDropDownStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionDropDownStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionLayout = global::HelloworldXamarin.Droid.Resource.Attribute.actionLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionMenuTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.actionMenuTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionMenuTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.actionMenuTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModeBackground = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModeCloseButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeCloseButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModeCloseDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeCloseDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModeCopyDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeCopyDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModeCutDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeCutDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModeFindDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeFindDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModePasteDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModePasteDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModePopupWindowStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionModePopupWindowStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModeSelectAllDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeSelectAllDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModeShareDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeShareDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModeSplitBackground = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeSplitBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModeStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionModeWebSearchDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeWebSearchDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionOverflowButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionOverflowButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionOverflowMenuStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionOverflowMenuStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionProviderClass = global::HelloworldXamarin.Droid.Resource.Attribute.actionProviderClass;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionViewClass = global::HelloworldXamarin.Droid.Resource.Attribute.actionViewClass;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.activityChooserViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.activityChooserViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.alertDialogButtonGroupStyle = global::HelloworldXamarin.Droid.Resource.Attribute.alertDialogButtonGroupStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.alertDialogCenterButtons = global::HelloworldXamarin.Droid.Resource.Attribute.alertDialogCenterButtons;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.alertDialogStyle = global::HelloworldXamarin.Droid.Resource.Attribute.alertDialogStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.alertDialogTheme = global::HelloworldXamarin.Droid.Resource.Attribute.alertDialogTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.allowStacking = global::HelloworldXamarin.Droid.Resource.Attribute.allowStacking;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.alpha = global::HelloworldXamarin.Droid.Resource.Attribute.alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.alphabeticModifiers = global::HelloworldXamarin.Droid.Resource.Attribute.alphabeticModifiers;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.arrowHeadLength = global::HelloworldXamarin.Droid.Resource.Attribute.arrowHeadLength;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.arrowShaftLength = global::HelloworldXamarin.Droid.Resource.Attribute.arrowShaftLength;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.autoCompleteTextViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.autoCompleteTextViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.autoSizeMaxTextSize = global::HelloworldXamarin.Droid.Resource.Attribute.autoSizeMaxTextSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.autoSizeMinTextSize = global::HelloworldXamarin.Droid.Resource.Attribute.autoSizeMinTextSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.autoSizePresetSizes = global::HelloworldXamarin.Droid.Resource.Attribute.autoSizePresetSizes;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.autoSizeStepGranularity = global::HelloworldXamarin.Droid.Resource.Attribute.autoSizeStepGranularity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.autoSizeTextType = global::HelloworldXamarin.Droid.Resource.Attribute.autoSizeTextType;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.background = global::HelloworldXamarin.Droid.Resource.Attribute.background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.backgroundSplit = global::HelloworldXamarin.Droid.Resource.Attribute.backgroundSplit;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.backgroundStacked = global::HelloworldXamarin.Droid.Resource.Attribute.backgroundStacked;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.backgroundTint = global::HelloworldXamarin.Droid.Resource.Attribute.backgroundTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.backgroundTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.backgroundTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.barLength = global::HelloworldXamarin.Droid.Resource.Attribute.barLength;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.behavior_autoHide = global::HelloworldXamarin.Droid.Resource.Attribute.behavior_autoHide;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.behavior_fitToContents = global::HelloworldXamarin.Droid.Resource.Attribute.behavior_fitToContents;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.behavior_hideable = global::HelloworldXamarin.Droid.Resource.Attribute.behavior_hideable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.behavior_overlapTop = global::HelloworldXamarin.Droid.Resource.Attribute.behavior_overlapTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.behavior_peekHeight = global::HelloworldXamarin.Droid.Resource.Attribute.behavior_peekHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.behavior_skipCollapsed = global::HelloworldXamarin.Droid.Resource.Attribute.behavior_skipCollapsed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.borderlessButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.borderlessButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.borderWidth = global::HelloworldXamarin.Droid.Resource.Attribute.borderWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.bottomAppBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.bottomAppBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.bottomNavigationStyle = global::HelloworldXamarin.Droid.Resource.Attribute.bottomNavigationStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.bottomSheetDialogTheme = global::HelloworldXamarin.Droid.Resource.Attribute.bottomSheetDialogTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.bottomSheetStyle = global::HelloworldXamarin.Droid.Resource.Attribute.bottomSheetStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.boxBackgroundColor = global::HelloworldXamarin.Droid.Resource.Attribute.boxBackgroundColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.boxBackgroundMode = global::HelloworldXamarin.Droid.Resource.Attribute.boxBackgroundMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.boxCollapsedPaddingTop = global::HelloworldXamarin.Droid.Resource.Attribute.boxCollapsedPaddingTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.boxCornerRadiusBottomEnd = global::HelloworldXamarin.Droid.Resource.Attribute.boxCornerRadiusBottomEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.boxCornerRadiusBottomStart = global::HelloworldXamarin.Droid.Resource.Attribute.boxCornerRadiusBottomStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.boxCornerRadiusTopEnd = global::HelloworldXamarin.Droid.Resource.Attribute.boxCornerRadiusTopEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.boxCornerRadiusTopStart = global::HelloworldXamarin.Droid.Resource.Attribute.boxCornerRadiusTopStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.boxStrokeColor = global::HelloworldXamarin.Droid.Resource.Attribute.boxStrokeColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.boxStrokeWidth = global::HelloworldXamarin.Droid.Resource.Attribute.boxStrokeWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.buttonBarButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.buttonBarButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.buttonBarNegativeButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.buttonBarNegativeButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.buttonBarNeutralButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.buttonBarNeutralButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.buttonBarPositiveButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.buttonBarPositiveButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.buttonBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.buttonBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.buttonGravity = global::HelloworldXamarin.Droid.Resource.Attribute.buttonGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.buttonIconDimen = global::HelloworldXamarin.Droid.Resource.Attribute.buttonIconDimen;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.buttonPanelSideLayout = global::HelloworldXamarin.Droid.Resource.Attribute.buttonPanelSideLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.buttonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.buttonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.buttonStyleSmall = global::HelloworldXamarin.Droid.Resource.Attribute.buttonStyleSmall;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.buttonTint = global::HelloworldXamarin.Droid.Resource.Attribute.buttonTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.buttonTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.buttonTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.cardBackgroundColor = global::HelloworldXamarin.Droid.Resource.Attribute.cardBackgroundColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.cardCornerRadius = global::HelloworldXamarin.Droid.Resource.Attribute.cardCornerRadius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.cardElevation = global::HelloworldXamarin.Droid.Resource.Attribute.cardElevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.cardMaxElevation = global::HelloworldXamarin.Droid.Resource.Attribute.cardMaxElevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.cardPreventCornerOverlap = global::HelloworldXamarin.Droid.Resource.Attribute.cardPreventCornerOverlap;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.cardUseCompatPadding = global::HelloworldXamarin.Droid.Resource.Attribute.cardUseCompatPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.cardViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.cardViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.checkboxStyle = global::HelloworldXamarin.Droid.Resource.Attribute.checkboxStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.checkedChip = global::HelloworldXamarin.Droid.Resource.Attribute.checkedChip;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.checkedIcon = global::HelloworldXamarin.Droid.Resource.Attribute.checkedIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.checkedIconEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.checkedIconEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.checkedIconVisible = global::HelloworldXamarin.Droid.Resource.Attribute.checkedIconVisible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.checkedTextViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.checkedTextViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipBackgroundColor = global::HelloworldXamarin.Droid.Resource.Attribute.chipBackgroundColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipCornerRadius = global::HelloworldXamarin.Droid.Resource.Attribute.chipCornerRadius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipEndPadding = global::HelloworldXamarin.Droid.Resource.Attribute.chipEndPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipGroupStyle = global::HelloworldXamarin.Droid.Resource.Attribute.chipGroupStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipIcon = global::HelloworldXamarin.Droid.Resource.Attribute.chipIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipIconEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.chipIconEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipIconSize = global::HelloworldXamarin.Droid.Resource.Attribute.chipIconSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipIconTint = global::HelloworldXamarin.Droid.Resource.Attribute.chipIconTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipIconVisible = global::HelloworldXamarin.Droid.Resource.Attribute.chipIconVisible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipMinHeight = global::HelloworldXamarin.Droid.Resource.Attribute.chipMinHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipSpacing = global::HelloworldXamarin.Droid.Resource.Attribute.chipSpacing;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipSpacingHorizontal = global::HelloworldXamarin.Droid.Resource.Attribute.chipSpacingHorizontal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipSpacingVertical = global::HelloworldXamarin.Droid.Resource.Attribute.chipSpacingVertical;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipStandaloneStyle = global::HelloworldXamarin.Droid.Resource.Attribute.chipStandaloneStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipStartPadding = global::HelloworldXamarin.Droid.Resource.Attribute.chipStartPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipStrokeColor = global::HelloworldXamarin.Droid.Resource.Attribute.chipStrokeColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipStrokeWidth = global::HelloworldXamarin.Droid.Resource.Attribute.chipStrokeWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.chipStyle = global::HelloworldXamarin.Droid.Resource.Attribute.chipStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.closeIcon = global::HelloworldXamarin.Droid.Resource.Attribute.closeIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.closeIconEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.closeIconEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.closeIconEndPadding = global::HelloworldXamarin.Droid.Resource.Attribute.closeIconEndPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.closeIconSize = global::HelloworldXamarin.Droid.Resource.Attribute.closeIconSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.closeIconStartPadding = global::HelloworldXamarin.Droid.Resource.Attribute.closeIconStartPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.closeIconTint = global::HelloworldXamarin.Droid.Resource.Attribute.closeIconTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.closeIconVisible = global::HelloworldXamarin.Droid.Resource.Attribute.closeIconVisible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.closeItemLayout = global::HelloworldXamarin.Droid.Resource.Attribute.closeItemLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.collapseContentDescription = global::HelloworldXamarin.Droid.Resource.Attribute.collapseContentDescription;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.collapsedTitleGravity = global::HelloworldXamarin.Droid.Resource.Attribute.collapsedTitleGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.collapsedTitleTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.collapsedTitleTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.collapseIcon = global::HelloworldXamarin.Droid.Resource.Attribute.collapseIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.color = global::HelloworldXamarin.Droid.Resource.Attribute.color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.colorAccent = global::HelloworldXamarin.Droid.Resource.Attribute.colorAccent;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.colorBackgroundFloating = global::HelloworldXamarin.Droid.Resource.Attribute.colorBackgroundFloating;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.colorButtonNormal = global::HelloworldXamarin.Droid.Resource.Attribute.colorButtonNormal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.colorControlActivated = global::HelloworldXamarin.Droid.Resource.Attribute.colorControlActivated;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.colorControlHighlight = global::HelloworldXamarin.Droid.Resource.Attribute.colorControlHighlight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.colorControlNormal = global::HelloworldXamarin.Droid.Resource.Attribute.colorControlNormal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.colorError = global::HelloworldXamarin.Droid.Resource.Attribute.colorError;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.colorPrimary = global::HelloworldXamarin.Droid.Resource.Attribute.colorPrimary;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.colorPrimaryDark = global::HelloworldXamarin.Droid.Resource.Attribute.colorPrimaryDark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.colorSecondary = global::HelloworldXamarin.Droid.Resource.Attribute.colorSecondary;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.colorSwitchThumbNormal = global::HelloworldXamarin.Droid.Resource.Attribute.colorSwitchThumbNormal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.commitIcon = global::HelloworldXamarin.Droid.Resource.Attribute.commitIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentDescription = global::HelloworldXamarin.Droid.Resource.Attribute.contentDescription;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentInsetEnd = global::HelloworldXamarin.Droid.Resource.Attribute.contentInsetEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentInsetEndWithActions = global::HelloworldXamarin.Droid.Resource.Attribute.contentInsetEndWithActions;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentInsetLeft = global::HelloworldXamarin.Droid.Resource.Attribute.contentInsetLeft;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentInsetRight = global::HelloworldXamarin.Droid.Resource.Attribute.contentInsetRight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentInsetStart = global::HelloworldXamarin.Droid.Resource.Attribute.contentInsetStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentInsetStartWithNavigation = global::HelloworldXamarin.Droid.Resource.Attribute.contentInsetStartWithNavigation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentPadding = global::HelloworldXamarin.Droid.Resource.Attribute.contentPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentPaddingBottom = global::HelloworldXamarin.Droid.Resource.Attribute.contentPaddingBottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentPaddingLeft = global::HelloworldXamarin.Droid.Resource.Attribute.contentPaddingLeft;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentPaddingRight = global::HelloworldXamarin.Droid.Resource.Attribute.contentPaddingRight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentPaddingTop = global::HelloworldXamarin.Droid.Resource.Attribute.contentPaddingTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.contentScrim = global::HelloworldXamarin.Droid.Resource.Attribute.contentScrim;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.controlBackground = global::HelloworldXamarin.Droid.Resource.Attribute.controlBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.coordinatorLayoutStyle = global::HelloworldXamarin.Droid.Resource.Attribute.coordinatorLayoutStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.cornerRadius = global::HelloworldXamarin.Droid.Resource.Attribute.cornerRadius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.counterEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.counterEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.counterMaxLength = global::HelloworldXamarin.Droid.Resource.Attribute.counterMaxLength;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.counterOverflowTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.counterOverflowTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.counterTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.counterTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.customNavigationLayout = global::HelloworldXamarin.Droid.Resource.Attribute.customNavigationLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.defaultQueryHint = global::HelloworldXamarin.Droid.Resource.Attribute.defaultQueryHint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.dialogCornerRadius = global::HelloworldXamarin.Droid.Resource.Attribute.dialogCornerRadius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.dialogPreferredPadding = global::HelloworldXamarin.Droid.Resource.Attribute.dialogPreferredPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.dialogTheme = global::HelloworldXamarin.Droid.Resource.Attribute.dialogTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.displayOptions = global::HelloworldXamarin.Droid.Resource.Attribute.displayOptions;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.divider = global::HelloworldXamarin.Droid.Resource.Attribute.divider;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.dividerHorizontal = global::HelloworldXamarin.Droid.Resource.Attribute.dividerHorizontal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.dividerPadding = global::HelloworldXamarin.Droid.Resource.Attribute.dividerPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.dividerVertical = global::HelloworldXamarin.Droid.Resource.Attribute.dividerVertical;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.drawableSize = global::HelloworldXamarin.Droid.Resource.Attribute.drawableSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.drawerArrowStyle = global::HelloworldXamarin.Droid.Resource.Attribute.drawerArrowStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.dropdownListPreferredItemHeight = global::HelloworldXamarin.Droid.Resource.Attribute.dropdownListPreferredItemHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.dropDownListViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.dropDownListViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.editTextBackground = global::HelloworldXamarin.Droid.Resource.Attribute.editTextBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.editTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.editTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.editTextStyle = global::HelloworldXamarin.Droid.Resource.Attribute.editTextStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.elevation = global::HelloworldXamarin.Droid.Resource.Attribute.elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.enforceMaterialTheme = global::HelloworldXamarin.Droid.Resource.Attribute.enforceMaterialTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.enforceTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.enforceTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.errorEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.errorEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.errorTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.errorTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.expandActivityOverflowButtonDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.expandActivityOverflowButtonDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.expanded = global::HelloworldXamarin.Droid.Resource.Attribute.expanded;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.expandedTitleGravity = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.expandedTitleMargin = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleMargin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.expandedTitleMarginBottom = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleMarginBottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.expandedTitleMarginEnd = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleMarginEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.expandedTitleMarginStart = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleMarginStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.expandedTitleMarginTop = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleMarginTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.expandedTitleTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fabAlignmentMode = global::HelloworldXamarin.Droid.Resource.Attribute.fabAlignmentMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fabCradleMargin = global::HelloworldXamarin.Droid.Resource.Attribute.fabCradleMargin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fabCradleRoundedCornerRadius = global::HelloworldXamarin.Droid.Resource.Attribute.fabCradleRoundedCornerRadius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fabCradleVerticalOffset = global::HelloworldXamarin.Droid.Resource.Attribute.fabCradleVerticalOffset;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fabCustomSize = global::HelloworldXamarin.Droid.Resource.Attribute.fabCustomSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fabSize = global::HelloworldXamarin.Droid.Resource.Attribute.fabSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fastScrollEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.fastScrollEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fastScrollHorizontalThumbDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.fastScrollHorizontalThumbDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fastScrollHorizontalTrackDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.fastScrollHorizontalTrackDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fastScrollVerticalThumbDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.fastScrollVerticalThumbDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fastScrollVerticalTrackDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.fastScrollVerticalTrackDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.firstBaselineToTopHeight = global::HelloworldXamarin.Droid.Resource.Attribute.firstBaselineToTopHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.floatingActionButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.floatingActionButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.font = global::HelloworldXamarin.Droid.Resource.Attribute.font;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fontFamily = global::HelloworldXamarin.Droid.Resource.Attribute.fontFamily;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fontProviderAuthority = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderAuthority;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fontProviderCerts = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderCerts;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fontProviderFetchStrategy = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderFetchStrategy;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fontProviderFetchTimeout = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderFetchTimeout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fontProviderPackage = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderPackage;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fontProviderQuery = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderQuery;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fontStyle = global::HelloworldXamarin.Droid.Resource.Attribute.fontStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fontVariationSettings = global::HelloworldXamarin.Droid.Resource.Attribute.fontVariationSettings;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.fontWeight = global::HelloworldXamarin.Droid.Resource.Attribute.fontWeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.foregroundInsidePadding = global::HelloworldXamarin.Droid.Resource.Attribute.foregroundInsidePadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.gapBetweenBars = global::HelloworldXamarin.Droid.Resource.Attribute.gapBetweenBars;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.goIcon = global::HelloworldXamarin.Droid.Resource.Attribute.goIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.headerLayout = global::HelloworldXamarin.Droid.Resource.Attribute.headerLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.height = global::HelloworldXamarin.Droid.Resource.Attribute.height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.helperText = global::HelloworldXamarin.Droid.Resource.Attribute.helperText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.helperTextEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.helperTextEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.helperTextTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.helperTextTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.hideMotionSpec = global::HelloworldXamarin.Droid.Resource.Attribute.hideMotionSpec;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.hideOnContentScroll = global::HelloworldXamarin.Droid.Resource.Attribute.hideOnContentScroll;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.hideOnScroll = global::HelloworldXamarin.Droid.Resource.Attribute.hideOnScroll;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.hintAnimationEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.hintAnimationEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.hintEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.hintEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.hintTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.hintTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.homeAsUpIndicator = global::HelloworldXamarin.Droid.Resource.Attribute.homeAsUpIndicator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.homeLayout = global::HelloworldXamarin.Droid.Resource.Attribute.homeLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.hoveredFocusedTranslationZ = global::HelloworldXamarin.Droid.Resource.Attribute.hoveredFocusedTranslationZ;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.icon = global::HelloworldXamarin.Droid.Resource.Attribute.icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.iconEndPadding = global::HelloworldXamarin.Droid.Resource.Attribute.iconEndPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.iconGravity = global::HelloworldXamarin.Droid.Resource.Attribute.iconGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.iconifiedByDefault = global::HelloworldXamarin.Droid.Resource.Attribute.iconifiedByDefault;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.iconPadding = global::HelloworldXamarin.Droid.Resource.Attribute.iconPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.iconSize = global::HelloworldXamarin.Droid.Resource.Attribute.iconSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.iconStartPadding = global::HelloworldXamarin.Droid.Resource.Attribute.iconStartPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.iconTint = global::HelloworldXamarin.Droid.Resource.Attribute.iconTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.iconTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.iconTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.imageButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.imageButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.indeterminateProgressStyle = global::HelloworldXamarin.Droid.Resource.Attribute.indeterminateProgressStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.initialActivityCount = global::HelloworldXamarin.Droid.Resource.Attribute.initialActivityCount;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.insetForeground = global::HelloworldXamarin.Droid.Resource.Attribute.insetForeground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.isLightTheme = global::HelloworldXamarin.Droid.Resource.Attribute.isLightTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.itemBackground = global::HelloworldXamarin.Droid.Resource.Attribute.itemBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.itemHorizontalPadding = global::HelloworldXamarin.Droid.Resource.Attribute.itemHorizontalPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.itemHorizontalTranslationEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.itemHorizontalTranslationEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.itemIconPadding = global::HelloworldXamarin.Droid.Resource.Attribute.itemIconPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.itemIconSize = global::HelloworldXamarin.Droid.Resource.Attribute.itemIconSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.itemIconTint = global::HelloworldXamarin.Droid.Resource.Attribute.itemIconTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.itemPadding = global::HelloworldXamarin.Droid.Resource.Attribute.itemPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.itemSpacing = global::HelloworldXamarin.Droid.Resource.Attribute.itemSpacing;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.itemTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.itemTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.itemTextAppearanceActive = global::HelloworldXamarin.Droid.Resource.Attribute.itemTextAppearanceActive;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.itemTextAppearanceInactive = global::HelloworldXamarin.Droid.Resource.Attribute.itemTextAppearanceInactive;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.itemTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.itemTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.keylines = global::HelloworldXamarin.Droid.Resource.Attribute.keylines;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.labelVisibilityMode = global::HelloworldXamarin.Droid.Resource.Attribute.labelVisibilityMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.lastBaselineToBottomHeight = global::HelloworldXamarin.Droid.Resource.Attribute.lastBaselineToBottomHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.layout = global::HelloworldXamarin.Droid.Resource.Attribute.layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.layoutManager = global::HelloworldXamarin.Droid.Resource.Attribute.layoutManager;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.layout_anchor = global::HelloworldXamarin.Droid.Resource.Attribute.layout_anchor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.layout_anchorGravity = global::HelloworldXamarin.Droid.Resource.Attribute.layout_anchorGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.layout_behavior = global::HelloworldXamarin.Droid.Resource.Attribute.layout_behavior;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.layout_collapseMode = global::HelloworldXamarin.Droid.Resource.Attribute.layout_collapseMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.layout_collapseParallaxMultiplier = global::HelloworldXamarin.Droid.Resource.Attribute.layout_collapseParallaxMultiplier;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.layout_dodgeInsetEdges = global::HelloworldXamarin.Droid.Resource.Attribute.layout_dodgeInsetEdges;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.layout_insetEdge = global::HelloworldXamarin.Droid.Resource.Attribute.layout_insetEdge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.layout_keyline = global::HelloworldXamarin.Droid.Resource.Attribute.layout_keyline;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.layout_scrollFlags = global::HelloworldXamarin.Droid.Resource.Attribute.layout_scrollFlags;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.layout_scrollInterpolator = global::HelloworldXamarin.Droid.Resource.Attribute.layout_scrollInterpolator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.liftOnScroll = global::HelloworldXamarin.Droid.Resource.Attribute.liftOnScroll;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.lineHeight = global::HelloworldXamarin.Droid.Resource.Attribute.lineHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.lineSpacing = global::HelloworldXamarin.Droid.Resource.Attribute.lineSpacing;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.listChoiceBackgroundIndicator = global::HelloworldXamarin.Droid.Resource.Attribute.listChoiceBackgroundIndicator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.listDividerAlertDialog = global::HelloworldXamarin.Droid.Resource.Attribute.listDividerAlertDialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.listItemLayout = global::HelloworldXamarin.Droid.Resource.Attribute.listItemLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.listLayout = global::HelloworldXamarin.Droid.Resource.Attribute.listLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.listMenuViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.listMenuViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.listPopupWindowStyle = global::HelloworldXamarin.Droid.Resource.Attribute.listPopupWindowStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.listPreferredItemHeight = global::HelloworldXamarin.Droid.Resource.Attribute.listPreferredItemHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.listPreferredItemHeightLarge = global::HelloworldXamarin.Droid.Resource.Attribute.listPreferredItemHeightLarge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.listPreferredItemHeightSmall = global::HelloworldXamarin.Droid.Resource.Attribute.listPreferredItemHeightSmall;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.listPreferredItemPaddingLeft = global::HelloworldXamarin.Droid.Resource.Attribute.listPreferredItemPaddingLeft;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.listPreferredItemPaddingRight = global::HelloworldXamarin.Droid.Resource.Attribute.listPreferredItemPaddingRight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.logo = global::HelloworldXamarin.Droid.Resource.Attribute.logo;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.logoDescription = global::HelloworldXamarin.Droid.Resource.Attribute.logoDescription;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.materialButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.materialButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.materialCardViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.materialCardViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.maxActionInlineWidth = global::HelloworldXamarin.Droid.Resource.Attribute.maxActionInlineWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.maxButtonHeight = global::HelloworldXamarin.Droid.Resource.Attribute.maxButtonHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.maxImageSize = global::HelloworldXamarin.Droid.Resource.Attribute.maxImageSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.measureWithLargestChild = global::HelloworldXamarin.Droid.Resource.Attribute.measureWithLargestChild;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.menu = global::HelloworldXamarin.Droid.Resource.Attribute.menu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.multiChoiceItemLayout = global::HelloworldXamarin.Droid.Resource.Attribute.multiChoiceItemLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.navigationContentDescription = global::HelloworldXamarin.Droid.Resource.Attribute.navigationContentDescription;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.navigationIcon = global::HelloworldXamarin.Droid.Resource.Attribute.navigationIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.navigationMode = global::HelloworldXamarin.Droid.Resource.Attribute.navigationMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.navigationViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.navigationViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.numericModifiers = global::HelloworldXamarin.Droid.Resource.Attribute.numericModifiers;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.overlapAnchor = global::HelloworldXamarin.Droid.Resource.Attribute.overlapAnchor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.paddingBottomNoButtons = global::HelloworldXamarin.Droid.Resource.Attribute.paddingBottomNoButtons;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.paddingEnd = global::HelloworldXamarin.Droid.Resource.Attribute.paddingEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.paddingStart = global::HelloworldXamarin.Droid.Resource.Attribute.paddingStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.paddingTopNoTitle = global::HelloworldXamarin.Droid.Resource.Attribute.paddingTopNoTitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.panelBackground = global::HelloworldXamarin.Droid.Resource.Attribute.panelBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.panelMenuListTheme = global::HelloworldXamarin.Droid.Resource.Attribute.panelMenuListTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.panelMenuListWidth = global::HelloworldXamarin.Droid.Resource.Attribute.panelMenuListWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.passwordToggleContentDescription = global::HelloworldXamarin.Droid.Resource.Attribute.passwordToggleContentDescription;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.passwordToggleDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.passwordToggleDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.passwordToggleEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.passwordToggleEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.passwordToggleTint = global::HelloworldXamarin.Droid.Resource.Attribute.passwordToggleTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.passwordToggleTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.passwordToggleTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.popupMenuStyle = global::HelloworldXamarin.Droid.Resource.Attribute.popupMenuStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.popupTheme = global::HelloworldXamarin.Droid.Resource.Attribute.popupTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.popupWindowStyle = global::HelloworldXamarin.Droid.Resource.Attribute.popupWindowStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.preserveIconSpacing = global::HelloworldXamarin.Droid.Resource.Attribute.preserveIconSpacing;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.pressedTranslationZ = global::HelloworldXamarin.Droid.Resource.Attribute.pressedTranslationZ;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.progressBarPadding = global::HelloworldXamarin.Droid.Resource.Attribute.progressBarPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.progressBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.progressBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.queryBackground = global::HelloworldXamarin.Droid.Resource.Attribute.queryBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.queryHint = global::HelloworldXamarin.Droid.Resource.Attribute.queryHint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.radioButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.radioButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.ratingBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.ratingBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.ratingBarStyleIndicator = global::HelloworldXamarin.Droid.Resource.Attribute.ratingBarStyleIndicator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.ratingBarStyleSmall = global::HelloworldXamarin.Droid.Resource.Attribute.ratingBarStyleSmall;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.reverseLayout = global::HelloworldXamarin.Droid.Resource.Attribute.reverseLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.rippleColor = global::HelloworldXamarin.Droid.Resource.Attribute.rippleColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.scrimAnimationDuration = global::HelloworldXamarin.Droid.Resource.Attribute.scrimAnimationDuration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.scrimBackground = global::HelloworldXamarin.Droid.Resource.Attribute.scrimBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.scrimVisibleHeightTrigger = global::HelloworldXamarin.Droid.Resource.Attribute.scrimVisibleHeightTrigger;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.searchHintIcon = global::HelloworldXamarin.Droid.Resource.Attribute.searchHintIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.searchIcon = global::HelloworldXamarin.Droid.Resource.Attribute.searchIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.searchViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.searchViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.seekBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.seekBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.selectableItemBackground = global::HelloworldXamarin.Droid.Resource.Attribute.selectableItemBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.selectableItemBackgroundBorderless = global::HelloworldXamarin.Droid.Resource.Attribute.selectableItemBackgroundBorderless;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.showAsAction = global::HelloworldXamarin.Droid.Resource.Attribute.showAsAction;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.showDividers = global::HelloworldXamarin.Droid.Resource.Attribute.showDividers;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.showMotionSpec = global::HelloworldXamarin.Droid.Resource.Attribute.showMotionSpec;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.showText = global::HelloworldXamarin.Droid.Resource.Attribute.showText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.showTitle = global::HelloworldXamarin.Droid.Resource.Attribute.showTitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.singleChoiceItemLayout = global::HelloworldXamarin.Droid.Resource.Attribute.singleChoiceItemLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.singleLine = global::HelloworldXamarin.Droid.Resource.Attribute.singleLine;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.singleSelection = global::HelloworldXamarin.Droid.Resource.Attribute.singleSelection;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.snackbarButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.snackbarButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.snackbarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.snackbarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.spanCount = global::HelloworldXamarin.Droid.Resource.Attribute.spanCount;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.spinBars = global::HelloworldXamarin.Droid.Resource.Attribute.spinBars;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.spinnerDropDownItemStyle = global::HelloworldXamarin.Droid.Resource.Attribute.spinnerDropDownItemStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.spinnerStyle = global::HelloworldXamarin.Droid.Resource.Attribute.spinnerStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.splitTrack = global::HelloworldXamarin.Droid.Resource.Attribute.splitTrack;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.srcCompat = global::HelloworldXamarin.Droid.Resource.Attribute.srcCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.stackFromEnd = global::HelloworldXamarin.Droid.Resource.Attribute.stackFromEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.state_above_anchor = global::HelloworldXamarin.Droid.Resource.Attribute.state_above_anchor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.state_collapsed = global::HelloworldXamarin.Droid.Resource.Attribute.state_collapsed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.state_collapsible = global::HelloworldXamarin.Droid.Resource.Attribute.state_collapsible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.state_liftable = global::HelloworldXamarin.Droid.Resource.Attribute.state_liftable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.state_lifted = global::HelloworldXamarin.Droid.Resource.Attribute.state_lifted;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.statusBarBackground = global::HelloworldXamarin.Droid.Resource.Attribute.statusBarBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.statusBarScrim = global::HelloworldXamarin.Droid.Resource.Attribute.statusBarScrim;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.strokeColor = global::HelloworldXamarin.Droid.Resource.Attribute.strokeColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.strokeWidth = global::HelloworldXamarin.Droid.Resource.Attribute.strokeWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.subMenuArrow = global::HelloworldXamarin.Droid.Resource.Attribute.subMenuArrow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.submitBackground = global::HelloworldXamarin.Droid.Resource.Attribute.submitBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.subtitle = global::HelloworldXamarin.Droid.Resource.Attribute.subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.subtitleTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.subtitleTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.subtitleTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.subtitleTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.subtitleTextStyle = global::HelloworldXamarin.Droid.Resource.Attribute.subtitleTextStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.suggestionRowLayout = global::HelloworldXamarin.Droid.Resource.Attribute.suggestionRowLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.switchMinWidth = global::HelloworldXamarin.Droid.Resource.Attribute.switchMinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.switchPadding = global::HelloworldXamarin.Droid.Resource.Attribute.switchPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.switchStyle = global::HelloworldXamarin.Droid.Resource.Attribute.switchStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.switchTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.switchTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabBackground = global::HelloworldXamarin.Droid.Resource.Attribute.tabBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabContentStart = global::HelloworldXamarin.Droid.Resource.Attribute.tabContentStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabGravity = global::HelloworldXamarin.Droid.Resource.Attribute.tabGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabIconTint = global::HelloworldXamarin.Droid.Resource.Attribute.tabIconTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabIconTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.tabIconTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabIndicator = global::HelloworldXamarin.Droid.Resource.Attribute.tabIndicator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabIndicatorAnimationDuration = global::HelloworldXamarin.Droid.Resource.Attribute.tabIndicatorAnimationDuration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabIndicatorColor = global::HelloworldXamarin.Droid.Resource.Attribute.tabIndicatorColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabIndicatorFullWidth = global::HelloworldXamarin.Droid.Resource.Attribute.tabIndicatorFullWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabIndicatorGravity = global::HelloworldXamarin.Droid.Resource.Attribute.tabIndicatorGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabIndicatorHeight = global::HelloworldXamarin.Droid.Resource.Attribute.tabIndicatorHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabInlineLabel = global::HelloworldXamarin.Droid.Resource.Attribute.tabInlineLabel;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabMaxWidth = global::HelloworldXamarin.Droid.Resource.Attribute.tabMaxWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabMinWidth = global::HelloworldXamarin.Droid.Resource.Attribute.tabMinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabMode = global::HelloworldXamarin.Droid.Resource.Attribute.tabMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabPadding = global::HelloworldXamarin.Droid.Resource.Attribute.tabPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabPaddingBottom = global::HelloworldXamarin.Droid.Resource.Attribute.tabPaddingBottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabPaddingEnd = global::HelloworldXamarin.Droid.Resource.Attribute.tabPaddingEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabPaddingStart = global::HelloworldXamarin.Droid.Resource.Attribute.tabPaddingStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabPaddingTop = global::HelloworldXamarin.Droid.Resource.Attribute.tabPaddingTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabRippleColor = global::HelloworldXamarin.Droid.Resource.Attribute.tabRippleColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabSelectedTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.tabSelectedTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabStyle = global::HelloworldXamarin.Droid.Resource.Attribute.tabStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.tabTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.tabTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tabUnboundedRipple = global::HelloworldXamarin.Droid.Resource.Attribute.tabUnboundedRipple;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAllCaps = global::HelloworldXamarin.Droid.Resource.Attribute.textAllCaps;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceBody1 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceBody1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceBody2 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceBody2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceButton = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceCaption = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceCaption;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceHeadline1 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceHeadline1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceHeadline2 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceHeadline2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceHeadline3 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceHeadline3;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceHeadline4 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceHeadline4;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceHeadline5 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceHeadline5;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceHeadline6 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceHeadline6;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceLargePopupMenu = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceLargePopupMenu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceListItem = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceListItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceListItemSecondary = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceListItemSecondary;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceListItemSmall = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceListItemSmall;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceOverline = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceOverline;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearancePopupMenuHeader = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearancePopupMenuHeader;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceSearchResultSubtitle = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceSearchResultSubtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceSearchResultTitle = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceSearchResultTitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceSmallPopupMenu = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceSmallPopupMenu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceSubtitle1 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceSubtitle1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textAppearanceSubtitle2 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceSubtitle2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textColorAlertDialogListItem = global::HelloworldXamarin.Droid.Resource.Attribute.textColorAlertDialogListItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textColorSearchUrl = global::HelloworldXamarin.Droid.Resource.Attribute.textColorSearchUrl;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textEndPadding = global::HelloworldXamarin.Droid.Resource.Attribute.textEndPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textInputStyle = global::HelloworldXamarin.Droid.Resource.Attribute.textInputStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.textStartPadding = global::HelloworldXamarin.Droid.Resource.Attribute.textStartPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.theme = global::HelloworldXamarin.Droid.Resource.Attribute.theme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.thickness = global::HelloworldXamarin.Droid.Resource.Attribute.thickness;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.thumbTextPadding = global::HelloworldXamarin.Droid.Resource.Attribute.thumbTextPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.thumbTint = global::HelloworldXamarin.Droid.Resource.Attribute.thumbTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.thumbTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.thumbTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tickMark = global::HelloworldXamarin.Droid.Resource.Attribute.tickMark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tickMarkTint = global::HelloworldXamarin.Droid.Resource.Attribute.tickMarkTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tickMarkTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.tickMarkTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tint = global::HelloworldXamarin.Droid.Resource.Attribute.tint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tintMode = global::HelloworldXamarin.Droid.Resource.Attribute.tintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.title = global::HelloworldXamarin.Droid.Resource.Attribute.title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.titleEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.titleEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.titleMargin = global::HelloworldXamarin.Droid.Resource.Attribute.titleMargin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.titleMarginBottom = global::HelloworldXamarin.Droid.Resource.Attribute.titleMarginBottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.titleMarginEnd = global::HelloworldXamarin.Droid.Resource.Attribute.titleMarginEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.titleMargins = global::HelloworldXamarin.Droid.Resource.Attribute.titleMargins;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.titleMarginStart = global::HelloworldXamarin.Droid.Resource.Attribute.titleMarginStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.titleMarginTop = global::HelloworldXamarin.Droid.Resource.Attribute.titleMarginTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.titleTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.titleTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.titleTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.titleTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.titleTextStyle = global::HelloworldXamarin.Droid.Resource.Attribute.titleTextStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.toolbarId = global::HelloworldXamarin.Droid.Resource.Attribute.toolbarId;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.toolbarNavigationButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.toolbarNavigationButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.toolbarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.toolbarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tooltipForegroundColor = global::HelloworldXamarin.Droid.Resource.Attribute.tooltipForegroundColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tooltipFrameBackground = global::HelloworldXamarin.Droid.Resource.Attribute.tooltipFrameBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.tooltipText = global::HelloworldXamarin.Droid.Resource.Attribute.tooltipText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.track = global::HelloworldXamarin.Droid.Resource.Attribute.track;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.trackTint = global::HelloworldXamarin.Droid.Resource.Attribute.trackTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.trackTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.trackTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.ttcIndex = global::HelloworldXamarin.Droid.Resource.Attribute.ttcIndex;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.useCompatPadding = global::HelloworldXamarin.Droid.Resource.Attribute.useCompatPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.viewInflaterClass = global::HelloworldXamarin.Droid.Resource.Attribute.viewInflaterClass;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.voiceIcon = global::HelloworldXamarin.Droid.Resource.Attribute.voiceIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.windowActionBar = global::HelloworldXamarin.Droid.Resource.Attribute.windowActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.windowActionBarOverlay = global::HelloworldXamarin.Droid.Resource.Attribute.windowActionBarOverlay;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.windowActionModeOverlay = global::HelloworldXamarin.Droid.Resource.Attribute.windowActionModeOverlay;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.windowFixedHeightMajor = global::HelloworldXamarin.Droid.Resource.Attribute.windowFixedHeightMajor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.windowFixedHeightMinor = global::HelloworldXamarin.Droid.Resource.Attribute.windowFixedHeightMinor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.windowFixedWidthMajor = global::HelloworldXamarin.Droid.Resource.Attribute.windowFixedWidthMajor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.windowFixedWidthMinor = global::HelloworldXamarin.Droid.Resource.Attribute.windowFixedWidthMinor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.windowMinWidthMajor = global::HelloworldXamarin.Droid.Resource.Attribute.windowMinWidthMajor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.windowMinWidthMinor = global::HelloworldXamarin.Droid.Resource.Attribute.windowMinWidthMinor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Attribute.windowNoTitle = global::HelloworldXamarin.Droid.Resource.Attribute.windowNoTitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Boolean.abc_action_bar_embed_tabs = global::HelloworldXamarin.Droid.Resource.Boolean.abc_action_bar_embed_tabs;
+                       global::Xamarin.Forms.Platform.Android.Resource.Boolean.abc_allow_stacked_button_bar = global::HelloworldXamarin.Droid.Resource.Boolean.abc_allow_stacked_button_bar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Boolean.abc_config_actionMenuItemAllCaps = global::HelloworldXamarin.Droid.Resource.Boolean.abc_config_actionMenuItemAllCaps;
+                       global::Xamarin.Forms.Platform.Android.Resource.Boolean.mtrl_btn_textappearance_all_caps = global::HelloworldXamarin.Droid.Resource.Boolean.mtrl_btn_textappearance_all_caps;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_background_cache_hint_selector_material_dark = global::HelloworldXamarin.Droid.Resource.Color.abc_background_cache_hint_selector_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_background_cache_hint_selector_material_light = global::HelloworldXamarin.Droid.Resource.Color.abc_background_cache_hint_selector_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_btn_colored_borderless_text_material = global::HelloworldXamarin.Droid.Resource.Color.abc_btn_colored_borderless_text_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_btn_colored_text_material = global::HelloworldXamarin.Droid.Resource.Color.abc_btn_colored_text_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_color_highlight_material = global::HelloworldXamarin.Droid.Resource.Color.abc_color_highlight_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_hint_foreground_material_dark = global::HelloworldXamarin.Droid.Resource.Color.abc_hint_foreground_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_hint_foreground_material_light = global::HelloworldXamarin.Droid.Resource.Color.abc_hint_foreground_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_input_method_navigation_guard = global::HelloworldXamarin.Droid.Resource.Color.abc_input_method_navigation_guard;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_primary_text_disable_only_material_dark = global::HelloworldXamarin.Droid.Resource.Color.abc_primary_text_disable_only_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_primary_text_disable_only_material_light = global::HelloworldXamarin.Droid.Resource.Color.abc_primary_text_disable_only_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_primary_text_material_dark = global::HelloworldXamarin.Droid.Resource.Color.abc_primary_text_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_primary_text_material_light = global::HelloworldXamarin.Droid.Resource.Color.abc_primary_text_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_search_url_text = global::HelloworldXamarin.Droid.Resource.Color.abc_search_url_text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_search_url_text_normal = global::HelloworldXamarin.Droid.Resource.Color.abc_search_url_text_normal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_search_url_text_pressed = global::HelloworldXamarin.Droid.Resource.Color.abc_search_url_text_pressed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_search_url_text_selected = global::HelloworldXamarin.Droid.Resource.Color.abc_search_url_text_selected;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_secondary_text_material_dark = global::HelloworldXamarin.Droid.Resource.Color.abc_secondary_text_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_secondary_text_material_light = global::HelloworldXamarin.Droid.Resource.Color.abc_secondary_text_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_tint_btn_checkable = global::HelloworldXamarin.Droid.Resource.Color.abc_tint_btn_checkable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_tint_default = global::HelloworldXamarin.Droid.Resource.Color.abc_tint_default;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_tint_edittext = global::HelloworldXamarin.Droid.Resource.Color.abc_tint_edittext;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_tint_seek_thumb = global::HelloworldXamarin.Droid.Resource.Color.abc_tint_seek_thumb;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_tint_spinner = global::HelloworldXamarin.Droid.Resource.Color.abc_tint_spinner;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.abc_tint_switch_track = global::HelloworldXamarin.Droid.Resource.Color.abc_tint_switch_track;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.accent_material_dark = global::HelloworldXamarin.Droid.Resource.Color.accent_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.accent_material_light = global::HelloworldXamarin.Droid.Resource.Color.accent_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.background_floating_material_dark = global::HelloworldXamarin.Droid.Resource.Color.background_floating_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.background_floating_material_light = global::HelloworldXamarin.Droid.Resource.Color.background_floating_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.background_material_dark = global::HelloworldXamarin.Droid.Resource.Color.background_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.background_material_light = global::HelloworldXamarin.Droid.Resource.Color.background_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.bright_foreground_disabled_material_dark = global::HelloworldXamarin.Droid.Resource.Color.bright_foreground_disabled_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.bright_foreground_disabled_material_light = global::HelloworldXamarin.Droid.Resource.Color.bright_foreground_disabled_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.bright_foreground_inverse_material_dark = global::HelloworldXamarin.Droid.Resource.Color.bright_foreground_inverse_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.bright_foreground_inverse_material_light = global::HelloworldXamarin.Droid.Resource.Color.bright_foreground_inverse_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.bright_foreground_material_dark = global::HelloworldXamarin.Droid.Resource.Color.bright_foreground_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.bright_foreground_material_light = global::HelloworldXamarin.Droid.Resource.Color.bright_foreground_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.button_material_dark = global::HelloworldXamarin.Droid.Resource.Color.button_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.button_material_light = global::HelloworldXamarin.Droid.Resource.Color.button_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.cardview_dark_background = global::HelloworldXamarin.Droid.Resource.Color.cardview_dark_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.cardview_light_background = global::HelloworldXamarin.Droid.Resource.Color.cardview_light_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.cardview_shadow_end_color = global::HelloworldXamarin.Droid.Resource.Color.cardview_shadow_end_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.cardview_shadow_start_color = global::HelloworldXamarin.Droid.Resource.Color.cardview_shadow_start_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_bottom_navigation_shadow_color = global::HelloworldXamarin.Droid.Resource.Color.design_bottom_navigation_shadow_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_default_color_primary = global::HelloworldXamarin.Droid.Resource.Color.design_default_color_primary;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_default_color_primary_dark = global::HelloworldXamarin.Droid.Resource.Color.design_default_color_primary_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_error = global::HelloworldXamarin.Droid.Resource.Color.design_error;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_fab_shadow_end_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_shadow_end_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_fab_shadow_mid_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_shadow_mid_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_fab_shadow_start_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_shadow_start_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_fab_stroke_end_inner_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_stroke_end_inner_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_fab_stroke_end_outer_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_stroke_end_outer_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_fab_stroke_top_inner_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_stroke_top_inner_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_fab_stroke_top_outer_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_stroke_top_outer_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_snackbar_background_color = global::HelloworldXamarin.Droid.Resource.Color.design_snackbar_background_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.design_tint_password_toggle = global::HelloworldXamarin.Droid.Resource.Color.design_tint_password_toggle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.dim_foreground_disabled_material_dark = global::HelloworldXamarin.Droid.Resource.Color.dim_foreground_disabled_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.dim_foreground_disabled_material_light = global::HelloworldXamarin.Droid.Resource.Color.dim_foreground_disabled_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.dim_foreground_material_dark = global::HelloworldXamarin.Droid.Resource.Color.dim_foreground_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.dim_foreground_material_light = global::HelloworldXamarin.Droid.Resource.Color.dim_foreground_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.error_color_material_dark = global::HelloworldXamarin.Droid.Resource.Color.error_color_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.error_color_material_light = global::HelloworldXamarin.Droid.Resource.Color.error_color_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.foreground_material_dark = global::HelloworldXamarin.Droid.Resource.Color.foreground_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.foreground_material_light = global::HelloworldXamarin.Droid.Resource.Color.foreground_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.highlighted_text_material_dark = global::HelloworldXamarin.Droid.Resource.Color.highlighted_text_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.highlighted_text_material_light = global::HelloworldXamarin.Droid.Resource.Color.highlighted_text_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.material_blue_grey_800 = global::HelloworldXamarin.Droid.Resource.Color.material_blue_grey_800;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.material_blue_grey_900 = global::HelloworldXamarin.Droid.Resource.Color.material_blue_grey_900;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.material_blue_grey_950 = global::HelloworldXamarin.Droid.Resource.Color.material_blue_grey_950;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.material_deep_teal_200 = global::HelloworldXamarin.Droid.Resource.Color.material_deep_teal_200;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.material_deep_teal_500 = global::HelloworldXamarin.Droid.Resource.Color.material_deep_teal_500;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.material_grey_100 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_100;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.material_grey_300 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_300;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.material_grey_50 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_50;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.material_grey_600 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_600;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.material_grey_800 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_800;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.material_grey_850 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_850;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.material_grey_900 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_900;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_bottom_nav_colored_item_tint = global::HelloworldXamarin.Droid.Resource.Color.mtrl_bottom_nav_colored_item_tint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_bottom_nav_item_tint = global::HelloworldXamarin.Droid.Resource.Color.mtrl_bottom_nav_item_tint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_btn_bg_color_disabled = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_bg_color_disabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_btn_bg_color_selector = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_bg_color_selector;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_btn_ripple_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_ripple_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_btn_stroke_color_selector = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_stroke_color_selector;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_btn_text_btn_ripple_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_text_btn_ripple_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_btn_text_color_disabled = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_text_color_disabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_btn_text_color_selector = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_text_color_selector;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_btn_transparent_bg_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_transparent_bg_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_chip_background_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_chip_background_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_chip_close_icon_tint = global::HelloworldXamarin.Droid.Resource.Color.mtrl_chip_close_icon_tint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_chip_ripple_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_chip_ripple_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_chip_text_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_chip_text_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_fab_ripple_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_fab_ripple_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_scrim_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_scrim_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_tabs_colored_ripple_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_tabs_colored_ripple_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_tabs_icon_color_selector = global::HelloworldXamarin.Droid.Resource.Color.mtrl_tabs_icon_color_selector;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_tabs_icon_color_selector_colored = global::HelloworldXamarin.Droid.Resource.Color.mtrl_tabs_icon_color_selector_colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_tabs_legacy_text_color_selector = global::HelloworldXamarin.Droid.Resource.Color.mtrl_tabs_legacy_text_color_selector;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_tabs_ripple_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_tabs_ripple_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_textinput_default_box_stroke_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_textinput_default_box_stroke_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_textinput_disabled_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_textinput_disabled_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_textinput_filled_box_default_background_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_textinput_filled_box_default_background_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_textinput_hovered_box_stroke_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_textinput_hovered_box_stroke_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.mtrl_text_btn_text_color_selector = global::HelloworldXamarin.Droid.Resource.Color.mtrl_text_btn_text_color_selector;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.notification_action_color_filter = global::HelloworldXamarin.Droid.Resource.Color.notification_action_color_filter;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.notification_icon_bg_color = global::HelloworldXamarin.Droid.Resource.Color.notification_icon_bg_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.notification_material_background_media_default_color = global::HelloworldXamarin.Droid.Resource.Color.notification_material_background_media_default_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.primary_dark_material_dark = global::HelloworldXamarin.Droid.Resource.Color.primary_dark_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.primary_dark_material_light = global::HelloworldXamarin.Droid.Resource.Color.primary_dark_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.primary_material_dark = global::HelloworldXamarin.Droid.Resource.Color.primary_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.primary_material_light = global::HelloworldXamarin.Droid.Resource.Color.primary_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.primary_text_default_material_dark = global::HelloworldXamarin.Droid.Resource.Color.primary_text_default_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.primary_text_default_material_light = global::HelloworldXamarin.Droid.Resource.Color.primary_text_default_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.primary_text_disabled_material_dark = global::HelloworldXamarin.Droid.Resource.Color.primary_text_disabled_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.primary_text_disabled_material_light = global::HelloworldXamarin.Droid.Resource.Color.primary_text_disabled_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.ripple_material_dark = global::HelloworldXamarin.Droid.Resource.Color.ripple_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.ripple_material_light = global::HelloworldXamarin.Droid.Resource.Color.ripple_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.secondary_text_default_material_dark = global::HelloworldXamarin.Droid.Resource.Color.secondary_text_default_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.secondary_text_default_material_light = global::HelloworldXamarin.Droid.Resource.Color.secondary_text_default_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.secondary_text_disabled_material_dark = global::HelloworldXamarin.Droid.Resource.Color.secondary_text_disabled_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.secondary_text_disabled_material_light = global::HelloworldXamarin.Droid.Resource.Color.secondary_text_disabled_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.switch_thumb_disabled_material_dark = global::HelloworldXamarin.Droid.Resource.Color.switch_thumb_disabled_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.switch_thumb_disabled_material_light = global::HelloworldXamarin.Droid.Resource.Color.switch_thumb_disabled_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.switch_thumb_material_dark = global::HelloworldXamarin.Droid.Resource.Color.switch_thumb_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.switch_thumb_material_light = global::HelloworldXamarin.Droid.Resource.Color.switch_thumb_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.switch_thumb_normal_material_dark = global::HelloworldXamarin.Droid.Resource.Color.switch_thumb_normal_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.switch_thumb_normal_material_light = global::HelloworldXamarin.Droid.Resource.Color.switch_thumb_normal_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.tooltip_background_dark = global::HelloworldXamarin.Droid.Resource.Color.tooltip_background_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Color.tooltip_background_light = global::HelloworldXamarin.Droid.Resource.Color.tooltip_background_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_content_inset_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_content_inset_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_content_inset_with_nav = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_content_inset_with_nav;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_default_height_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_default_height_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_default_padding_end_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_default_padding_end_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_default_padding_start_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_default_padding_start_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_elevation_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_elevation_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_icon_vertical_padding_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_icon_vertical_padding_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_overflow_padding_end_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_overflow_padding_end_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_overflow_padding_start_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_overflow_padding_start_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_stacked_max_height = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_stacked_max_height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_stacked_tab_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_stacked_tab_max_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_subtitle_bottom_margin_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_subtitle_bottom_margin_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_bar_subtitle_top_margin_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_subtitle_top_margin_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_button_min_height_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_button_min_height_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_button_min_width_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_button_min_width_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_action_button_min_width_overflow_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_button_min_width_overflow_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_alert_dialog_button_bar_height = global::HelloworldXamarin.Droid.Resource.Dimension.abc_alert_dialog_button_bar_height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_alert_dialog_button_dimen = global::HelloworldXamarin.Droid.Resource.Dimension.abc_alert_dialog_button_dimen;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_button_inset_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_button_inset_horizontal_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_button_inset_vertical_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_button_inset_vertical_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_button_padding_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_button_padding_horizontal_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_button_padding_vertical_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_button_padding_vertical_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_cascading_menus_min_smallest_width = global::HelloworldXamarin.Droid.Resource.Dimension.abc_cascading_menus_min_smallest_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_config_prefDialogWidth = global::HelloworldXamarin.Droid.Resource.Dimension.abc_config_prefDialogWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_control_corner_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_control_corner_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_control_inset_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_control_inset_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_control_padding_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_control_padding_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dialog_corner_radius_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_corner_radius_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dialog_fixed_height_major = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_fixed_height_major;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dialog_fixed_height_minor = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_fixed_height_minor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dialog_fixed_width_major = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_fixed_width_major;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dialog_fixed_width_minor = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_fixed_width_minor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dialog_list_padding_bottom_no_buttons = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_list_padding_bottom_no_buttons;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dialog_list_padding_top_no_title = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_list_padding_top_no_title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dialog_min_width_major = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_min_width_major;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dialog_min_width_minor = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_min_width_minor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dialog_padding_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_padding_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dialog_padding_top_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_padding_top_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dialog_title_divider_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_title_divider_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_disabled_alpha_material_dark = global::HelloworldXamarin.Droid.Resource.Dimension.abc_disabled_alpha_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_disabled_alpha_material_light = global::HelloworldXamarin.Droid.Resource.Dimension.abc_disabled_alpha_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dropdownitem_icon_width = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dropdownitem_icon_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dropdownitem_text_padding_left = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dropdownitem_text_padding_left;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_dropdownitem_text_padding_right = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dropdownitem_text_padding_right;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_edit_text_inset_bottom_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_edit_text_inset_bottom_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_edit_text_inset_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_edit_text_inset_horizontal_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_edit_text_inset_top_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_edit_text_inset_top_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_floating_window_z = global::HelloworldXamarin.Droid.Resource.Dimension.abc_floating_window_z;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_list_item_padding_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_list_item_padding_horizontal_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_panel_menu_list_width = global::HelloworldXamarin.Droid.Resource.Dimension.abc_panel_menu_list_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_progress_bar_height_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_progress_bar_height_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_search_view_preferred_height = global::HelloworldXamarin.Droid.Resource.Dimension.abc_search_view_preferred_height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_search_view_preferred_width = global::HelloworldXamarin.Droid.Resource.Dimension.abc_search_view_preferred_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_seekbar_track_background_height_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_seekbar_track_background_height_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_seekbar_track_progress_height_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_seekbar_track_progress_height_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_select_dialog_padding_start_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_select_dialog_padding_start_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_switch_padding = global::HelloworldXamarin.Droid.Resource.Dimension.abc_switch_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_body_1_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_body_1_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_body_2_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_body_2_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_button_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_button_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_caption_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_caption_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_display_1_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_display_1_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_display_2_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_display_2_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_display_3_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_display_3_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_display_4_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_display_4_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_headline_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_headline_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_large_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_large_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_medium_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_medium_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_menu_header_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_menu_header_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_menu_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_menu_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_small_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_small_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_subhead_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_subhead_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_subtitle_material_toolbar = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_subtitle_material_toolbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_title_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_title_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.abc_text_size_title_material_toolbar = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_title_material_toolbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.cardview_compat_inset_shadow = global::HelloworldXamarin.Droid.Resource.Dimension.cardview_compat_inset_shadow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.cardview_default_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.cardview_default_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.cardview_default_radius = global::HelloworldXamarin.Droid.Resource.Dimension.cardview_default_radius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.compat_button_inset_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_button_inset_horizontal_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.compat_button_inset_vertical_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_button_inset_vertical_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.compat_button_padding_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_button_padding_horizontal_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.compat_button_padding_vertical_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_button_padding_vertical_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.compat_control_corner_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_control_corner_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.compat_notification_large_icon_max_height = global::HelloworldXamarin.Droid.Resource.Dimension.compat_notification_large_icon_max_height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.compat_notification_large_icon_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.compat_notification_large_icon_max_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_appbar_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.design_appbar_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_navigation_active_item_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_active_item_max_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_navigation_active_item_min_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_active_item_min_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_navigation_active_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_active_text_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_navigation_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_navigation_height = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_navigation_icon_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_icon_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_navigation_item_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_item_max_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_navigation_item_min_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_item_min_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_navigation_margin = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_margin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_navigation_shadow_height = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_shadow_height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_navigation_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_text_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_sheet_modal_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_sheet_modal_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_bottom_sheet_peek_height_min = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_sheet_peek_height_min;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_fab_border_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_border_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_fab_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_fab_image_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_image_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_fab_size_mini = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_size_mini;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_fab_size_normal = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_size_normal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_fab_translation_z_hovered_focused = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_translation_z_hovered_focused;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_fab_translation_z_pressed = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_translation_z_pressed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_navigation_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_navigation_icon_padding = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_icon_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_navigation_icon_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_icon_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_navigation_item_horizontal_padding = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_item_horizontal_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_navigation_item_icon_padding = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_item_icon_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_navigation_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_max_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_navigation_padding_bottom = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_padding_bottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_navigation_separator_vertical_padding = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_separator_vertical_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_snackbar_action_inline_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_action_inline_max_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_snackbar_background_corner_radius = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_background_corner_radius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_snackbar_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_snackbar_extra_spacing_horizontal = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_extra_spacing_horizontal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_snackbar_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_max_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_snackbar_min_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_min_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_snackbar_padding_horizontal = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_padding_horizontal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_snackbar_padding_vertical = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_padding_vertical;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_snackbar_padding_vertical_2lines = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_padding_vertical_2lines;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_snackbar_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_text_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_tab_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_tab_max_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_tab_scrollable_min_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_tab_scrollable_min_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_tab_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_tab_text_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_tab_text_size_2line = global::HelloworldXamarin.Droid.Resource.Dimension.design_tab_text_size_2line;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.design_textinput_caption_translate_y = global::HelloworldXamarin.Droid.Resource.Dimension.design_textinput_caption_translate_y;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.disabled_alpha_material_dark = global::HelloworldXamarin.Droid.Resource.Dimension.disabled_alpha_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.disabled_alpha_material_light = global::HelloworldXamarin.Droid.Resource.Dimension.disabled_alpha_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.fastscroll_default_thickness = global::HelloworldXamarin.Droid.Resource.Dimension.fastscroll_default_thickness;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.fastscroll_margin = global::HelloworldXamarin.Droid.Resource.Dimension.fastscroll_margin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.fastscroll_minimum_range = global::HelloworldXamarin.Droid.Resource.Dimension.fastscroll_minimum_range;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.highlight_alpha_material_colored = global::HelloworldXamarin.Droid.Resource.Dimension.highlight_alpha_material_colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.highlight_alpha_material_dark = global::HelloworldXamarin.Droid.Resource.Dimension.highlight_alpha_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.highlight_alpha_material_light = global::HelloworldXamarin.Droid.Resource.Dimension.highlight_alpha_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.hint_alpha_material_dark = global::HelloworldXamarin.Droid.Resource.Dimension.hint_alpha_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.hint_alpha_material_light = global::HelloworldXamarin.Droid.Resource.Dimension.hint_alpha_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.hint_pressed_alpha_material_dark = global::HelloworldXamarin.Droid.Resource.Dimension.hint_pressed_alpha_material_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.hint_pressed_alpha_material_light = global::HelloworldXamarin.Droid.Resource.Dimension.hint_pressed_alpha_material_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.item_touch_helper_max_drag_scroll_per_frame = global::HelloworldXamarin.Droid.Resource.Dimension.item_touch_helper_max_drag_scroll_per_frame;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.item_touch_helper_swipe_escape_max_velocity = global::HelloworldXamarin.Droid.Resource.Dimension.item_touch_helper_swipe_escape_max_velocity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.item_touch_helper_swipe_escape_velocity = global::HelloworldXamarin.Droid.Resource.Dimension.item_touch_helper_swipe_escape_velocity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_bottomappbar_fabOffsetEndMode = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_bottomappbar_fabOffsetEndMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_bottomappbar_fab_cradle_margin = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_bottomappbar_fab_cradle_margin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_bottomappbar_fab_cradle_rounded_corner_radius = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_bottomappbar_fab_cradle_rounded_corner_radius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_bottomappbar_fab_cradle_vertical_offset = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_bottomappbar_fab_cradle_vertical_offset;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_bottomappbar_height = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_bottomappbar_height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_corner_radius = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_corner_radius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_dialog_btn_min_width = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_dialog_btn_min_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_disabled_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_disabled_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_disabled_z = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_disabled_z;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_focused_z = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_focused_z;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_hovered_z = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_hovered_z;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_icon_btn_padding_left = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_icon_btn_padding_left;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_icon_padding = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_icon_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_inset = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_inset;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_letter_spacing = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_letter_spacing;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_padding_bottom = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_padding_bottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_padding_left = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_padding_left;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_padding_right = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_padding_right;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_padding_top = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_padding_top;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_pressed_z = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_pressed_z;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_stroke_size = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_stroke_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_text_btn_icon_padding = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_text_btn_icon_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_text_btn_padding_left = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_text_btn_padding_left;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_text_btn_padding_right = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_text_btn_padding_right;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_text_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_btn_z = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_z;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_card_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_card_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_card_spacing = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_card_spacing;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_chip_pressed_translation_z = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_chip_pressed_translation_z;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_chip_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_chip_text_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_fab_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_fab_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_fab_translation_z_hovered_focused = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_fab_translation_z_hovered_focused;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_fab_translation_z_pressed = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_fab_translation_z_pressed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_navigation_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_navigation_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_navigation_item_horizontal_padding = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_navigation_item_horizontal_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_navigation_item_icon_padding = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_navigation_item_icon_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_snackbar_background_corner_radius = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_snackbar_background_corner_radius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_snackbar_margin = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_snackbar_margin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_textinput_box_bottom_offset = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_bottom_offset;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_textinput_box_corner_radius_medium = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_corner_radius_medium;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_textinput_box_corner_radius_small = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_corner_radius_small;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_textinput_box_label_cutout_padding = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_label_cutout_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_textinput_box_padding_end = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_padding_end;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_textinput_box_stroke_width_default = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_stroke_width_default;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_textinput_box_stroke_width_focused = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_stroke_width_focused;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_textinput_outline_box_expanded_padding = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_outline_box_expanded_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.mtrl_toolbar_default_height = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_toolbar_default_height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_action_icon_size = global::HelloworldXamarin.Droid.Resource.Dimension.notification_action_icon_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_action_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.notification_action_text_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_big_circle_margin = global::HelloworldXamarin.Droid.Resource.Dimension.notification_big_circle_margin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_content_margin_start = global::HelloworldXamarin.Droid.Resource.Dimension.notification_content_margin_start;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_large_icon_height = global::HelloworldXamarin.Droid.Resource.Dimension.notification_large_icon_height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_large_icon_width = global::HelloworldXamarin.Droid.Resource.Dimension.notification_large_icon_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_main_column_padding_top = global::HelloworldXamarin.Droid.Resource.Dimension.notification_main_column_padding_top;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_media_narrow_margin = global::HelloworldXamarin.Droid.Resource.Dimension.notification_media_narrow_margin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_right_icon_size = global::HelloworldXamarin.Droid.Resource.Dimension.notification_right_icon_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_right_side_padding_top = global::HelloworldXamarin.Droid.Resource.Dimension.notification_right_side_padding_top;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_small_icon_background_padding = global::HelloworldXamarin.Droid.Resource.Dimension.notification_small_icon_background_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_small_icon_size_as_large = global::HelloworldXamarin.Droid.Resource.Dimension.notification_small_icon_size_as_large;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_subtext_size = global::HelloworldXamarin.Droid.Resource.Dimension.notification_subtext_size;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_top_pad = global::HelloworldXamarin.Droid.Resource.Dimension.notification_top_pad;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.notification_top_pad_large_text = global::HelloworldXamarin.Droid.Resource.Dimension.notification_top_pad_large_text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.subtitle_corner_radius = global::HelloworldXamarin.Droid.Resource.Dimension.subtitle_corner_radius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.subtitle_outline_width = global::HelloworldXamarin.Droid.Resource.Dimension.subtitle_outline_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.subtitle_shadow_offset = global::HelloworldXamarin.Droid.Resource.Dimension.subtitle_shadow_offset;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.subtitle_shadow_radius = global::HelloworldXamarin.Droid.Resource.Dimension.subtitle_shadow_radius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.tooltip_corner_radius = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_corner_radius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.tooltip_horizontal_padding = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_horizontal_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.tooltip_margin = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_margin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.tooltip_precise_anchor_extra_offset = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_precise_anchor_extra_offset;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.tooltip_precise_anchor_threshold = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_precise_anchor_threshold;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.tooltip_vertical_padding = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_vertical_padding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.tooltip_y_offset_non_touch = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_y_offset_non_touch;
+                       global::Xamarin.Forms.Platform.Android.Resource.Dimension.tooltip_y_offset_touch = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_y_offset_touch;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ab_share_pack_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ab_share_pack_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_action_bar_item_background_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_action_bar_item_background_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_btn_borderless_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_borderless_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_btn_check_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_check_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_btn_check_to_on_mtrl_000 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_check_to_on_mtrl_000;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_btn_check_to_on_mtrl_015 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_check_to_on_mtrl_015;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_btn_colored_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_colored_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_btn_default_mtrl_shape = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_default_mtrl_shape;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_btn_radio_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_radio_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_btn_radio_to_on_mtrl_000 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_radio_to_on_mtrl_000;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_btn_radio_to_on_mtrl_015 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_radio_to_on_mtrl_015;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_btn_switch_to_on_mtrl_00001 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_switch_to_on_mtrl_00001;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_btn_switch_to_on_mtrl_00012 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_switch_to_on_mtrl_00012;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_cab_background_internal_bg = global::HelloworldXamarin.Droid.Resource.Drawable.abc_cab_background_internal_bg;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_cab_background_top_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_cab_background_top_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_cab_background_top_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_cab_background_top_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_control_background_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_control_background_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_dialog_material_background = global::HelloworldXamarin.Droid.Resource.Drawable.abc_dialog_material_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_edit_text_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_edit_text_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_ab_back_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_ab_back_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_arrow_drop_right_black_24dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_arrow_drop_right_black_24dp;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_clear_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_clear_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_commit_search_api_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_commit_search_api_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_go_search_api_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_go_search_api_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_menu_copy_mtrl_am_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_menu_copy_mtrl_am_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_menu_cut_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_menu_cut_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_menu_overflow_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_menu_overflow_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_menu_paste_mtrl_am_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_menu_paste_mtrl_am_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_menu_selectall_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_menu_selectall_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_menu_share_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_menu_share_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_search_api_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_search_api_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_star_black_16dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_star_black_16dp;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_star_black_36dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_star_black_36dp;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_star_black_48dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_star_black_48dp;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_star_half_black_16dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_star_half_black_16dp;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_star_half_black_36dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_star_half_black_36dp;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_star_half_black_48dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_star_half_black_48dp;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ic_voice_search_api_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_voice_search_api_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_item_background_holo_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_item_background_holo_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_item_background_holo_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_item_background_holo_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_list_divider_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_divider_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_list_divider_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_divider_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_list_focused_holo = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_focused_holo;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_list_longpressed_holo = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_longpressed_holo;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_list_pressed_holo_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_pressed_holo_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_list_pressed_holo_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_pressed_holo_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_list_selector_background_transition_holo_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_selector_background_transition_holo_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_list_selector_background_transition_holo_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_selector_background_transition_holo_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_list_selector_disabled_holo_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_selector_disabled_holo_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_list_selector_disabled_holo_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_selector_disabled_holo_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_list_selector_holo_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_selector_holo_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_list_selector_holo_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_selector_holo_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_menu_hardkey_panel_mtrl_mult = global::HelloworldXamarin.Droid.Resource.Drawable.abc_menu_hardkey_panel_mtrl_mult;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_popup_background_mtrl_mult = global::HelloworldXamarin.Droid.Resource.Drawable.abc_popup_background_mtrl_mult;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ratingbar_indicator_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ratingbar_indicator_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ratingbar_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ratingbar_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_ratingbar_small_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ratingbar_small_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_scrubber_control_off_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_scrubber_control_off_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_scrubber_control_to_pressed_mtrl_000 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_scrubber_control_to_pressed_mtrl_000;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_scrubber_control_to_pressed_mtrl_005 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_scrubber_control_to_pressed_mtrl_005;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_scrubber_primary_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_scrubber_primary_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_scrubber_track_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_scrubber_track_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_seekbar_thumb_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_seekbar_thumb_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_seekbar_tick_mark_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_seekbar_tick_mark_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_seekbar_track_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_seekbar_track_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_spinner_mtrl_am_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_spinner_mtrl_am_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_spinner_textfield_background_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_spinner_textfield_background_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_switch_thumb_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_switch_thumb_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_switch_track_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_switch_track_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_tab_indicator_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_tab_indicator_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_tab_indicator_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_tab_indicator_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_textfield_activated_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_textfield_activated_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_textfield_default_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_textfield_default_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_textfield_search_activated_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_textfield_search_activated_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_textfield_search_default_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_textfield_search_default_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_textfield_search_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_textfield_search_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_text_cursor_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_cursor_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_text_select_handle_left_mtrl_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_select_handle_left_mtrl_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_text_select_handle_left_mtrl_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_select_handle_left_mtrl_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_text_select_handle_middle_mtrl_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_select_handle_middle_mtrl_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_text_select_handle_middle_mtrl_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_select_handle_middle_mtrl_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_text_select_handle_right_mtrl_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_select_handle_right_mtrl_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_text_select_handle_right_mtrl_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_select_handle_right_mtrl_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.abc_vector_test = global::HelloworldXamarin.Droid.Resource.Drawable.abc_vector_test;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.avd_hide_password = global::HelloworldXamarin.Droid.Resource.Drawable.avd_hide_password;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.avd_show_password = global::HelloworldXamarin.Droid.Resource.Drawable.avd_show_password;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.design_bottom_navigation_item_background = global::HelloworldXamarin.Droid.Resource.Drawable.design_bottom_navigation_item_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.design_fab_background = global::HelloworldXamarin.Droid.Resource.Drawable.design_fab_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.design_ic_visibility = global::HelloworldXamarin.Droid.Resource.Drawable.design_ic_visibility;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.design_ic_visibility_off = global::HelloworldXamarin.Droid.Resource.Drawable.design_ic_visibility_off;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.design_password_eye = global::HelloworldXamarin.Droid.Resource.Drawable.design_password_eye;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.design_snackbar_background = global::HelloworldXamarin.Droid.Resource.Drawable.design_snackbar_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.ic_mtrl_chip_checked_black = global::HelloworldXamarin.Droid.Resource.Drawable.ic_mtrl_chip_checked_black;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.ic_mtrl_chip_checked_circle = global::HelloworldXamarin.Droid.Resource.Drawable.ic_mtrl_chip_checked_circle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.ic_mtrl_chip_close_circle = global::HelloworldXamarin.Droid.Resource.Drawable.ic_mtrl_chip_close_circle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.mtrl_snackbar_background = global::HelloworldXamarin.Droid.Resource.Drawable.mtrl_snackbar_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.mtrl_tabs_default_indicator = global::HelloworldXamarin.Droid.Resource.Drawable.mtrl_tabs_default_indicator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.navigation_empty_icon = global::HelloworldXamarin.Droid.Resource.Drawable.navigation_empty_icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.notification_action_background = global::HelloworldXamarin.Droid.Resource.Drawable.notification_action_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.notification_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.notification_bg_low = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_low;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.notification_bg_low_normal = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_low_normal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.notification_bg_low_pressed = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_low_pressed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.notification_bg_normal = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_normal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.notification_bg_normal_pressed = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_normal_pressed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.notification_icon_background = global::HelloworldXamarin.Droid.Resource.Drawable.notification_icon_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.notification_template_icon_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notification_template_icon_bg;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.notification_template_icon_low_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notification_template_icon_low_bg;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.notification_tile_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notification_tile_bg;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.notify_panel_notification_icon_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notify_panel_notification_icon_bg;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.tooltip_frame_dark = global::HelloworldXamarin.Droid.Resource.Drawable.tooltip_frame_dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Drawable.tooltip_frame_light = global::HelloworldXamarin.Droid.Resource.Drawable.tooltip_frame_light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action0 = global::HelloworldXamarin.Droid.Resource.Id.action0;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.actions = global::HelloworldXamarin.Droid.Resource.Id.actions;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_bar = global::HelloworldXamarin.Droid.Resource.Id.action_bar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_bar_activity_content = global::HelloworldXamarin.Droid.Resource.Id.action_bar_activity_content;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_bar_container = global::HelloworldXamarin.Droid.Resource.Id.action_bar_container;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_bar_root = global::HelloworldXamarin.Droid.Resource.Id.action_bar_root;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_bar_spinner = global::HelloworldXamarin.Droid.Resource.Id.action_bar_spinner;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_bar_subtitle = global::HelloworldXamarin.Droid.Resource.Id.action_bar_subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_bar_title = global::HelloworldXamarin.Droid.Resource.Id.action_bar_title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_container = global::HelloworldXamarin.Droid.Resource.Id.action_container;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_context_bar = global::HelloworldXamarin.Droid.Resource.Id.action_context_bar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_divider = global::HelloworldXamarin.Droid.Resource.Id.action_divider;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_image = global::HelloworldXamarin.Droid.Resource.Id.action_image;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_menu_divider = global::HelloworldXamarin.Droid.Resource.Id.action_menu_divider;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_menu_presenter = global::HelloworldXamarin.Droid.Resource.Id.action_menu_presenter;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_mode_bar = global::HelloworldXamarin.Droid.Resource.Id.action_mode_bar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_mode_bar_stub = global::HelloworldXamarin.Droid.Resource.Id.action_mode_bar_stub;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_mode_close_button = global::HelloworldXamarin.Droid.Resource.Id.action_mode_close_button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.action_text = global::HelloworldXamarin.Droid.Resource.Id.action_text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.activity_chooser_view_content = global::HelloworldXamarin.Droid.Resource.Id.activity_chooser_view_content;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.add = global::HelloworldXamarin.Droid.Resource.Id.add;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.alertTitle = global::HelloworldXamarin.Droid.Resource.Id.alertTitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.all = global::HelloworldXamarin.Droid.Resource.Id.all;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.ALT = global::HelloworldXamarin.Droid.Resource.Id.ALT;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.always = global::HelloworldXamarin.Droid.Resource.Id.always;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.async = global::HelloworldXamarin.Droid.Resource.Id.async;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.auto = global::HelloworldXamarin.Droid.Resource.Id.auto;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.beginning = global::HelloworldXamarin.Droid.Resource.Id.beginning;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.blocking = global::HelloworldXamarin.Droid.Resource.Id.blocking;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.bottom = global::HelloworldXamarin.Droid.Resource.Id.bottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.bottomtab_navarea = global::HelloworldXamarin.Droid.Resource.Id.bottomtab_navarea;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.bottomtab_tabbar = global::HelloworldXamarin.Droid.Resource.Id.bottomtab_tabbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.buttonPanel = global::HelloworldXamarin.Droid.Resource.Id.buttonPanel;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.cancel_action = global::HelloworldXamarin.Droid.Resource.Id.cancel_action;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.center = global::HelloworldXamarin.Droid.Resource.Id.center;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.center_horizontal = global::HelloworldXamarin.Droid.Resource.Id.center_horizontal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.center_vertical = global::HelloworldXamarin.Droid.Resource.Id.center_vertical;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.checkbox = global::HelloworldXamarin.Droid.Resource.Id.checkbox;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.chronometer = global::HelloworldXamarin.Droid.Resource.Id.chronometer;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.clip_horizontal = global::HelloworldXamarin.Droid.Resource.Id.clip_horizontal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.clip_vertical = global::HelloworldXamarin.Droid.Resource.Id.clip_vertical;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.collapseActionView = global::HelloworldXamarin.Droid.Resource.Id.collapseActionView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.container = global::HelloworldXamarin.Droid.Resource.Id.container;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.content = global::HelloworldXamarin.Droid.Resource.Id.content;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.contentPanel = global::HelloworldXamarin.Droid.Resource.Id.contentPanel;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.coordinator = global::HelloworldXamarin.Droid.Resource.Id.coordinator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.CTRL = global::HelloworldXamarin.Droid.Resource.Id.CTRL;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.custom = global::HelloworldXamarin.Droid.Resource.Id.custom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.customPanel = global::HelloworldXamarin.Droid.Resource.Id.customPanel;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.decor_content_parent = global::HelloworldXamarin.Droid.Resource.Id.decor_content_parent;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.default_activity_button = global::HelloworldXamarin.Droid.Resource.Id.default_activity_button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.design_bottom_sheet = global::HelloworldXamarin.Droid.Resource.Id.design_bottom_sheet;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.design_menu_item_action_area = global::HelloworldXamarin.Droid.Resource.Id.design_menu_item_action_area;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.design_menu_item_action_area_stub = global::HelloworldXamarin.Droid.Resource.Id.design_menu_item_action_area_stub;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.design_menu_item_text = global::HelloworldXamarin.Droid.Resource.Id.design_menu_item_text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.design_navigation_view = global::HelloworldXamarin.Droid.Resource.Id.design_navigation_view;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.disableHome = global::HelloworldXamarin.Droid.Resource.Id.disableHome;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.edit_query = global::HelloworldXamarin.Droid.Resource.Id.edit_query;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.end = global::HelloworldXamarin.Droid.Resource.Id.end;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.end_padder = global::HelloworldXamarin.Droid.Resource.Id.end_padder;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.enterAlways = global::HelloworldXamarin.Droid.Resource.Id.enterAlways;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.enterAlwaysCollapsed = global::HelloworldXamarin.Droid.Resource.Id.enterAlwaysCollapsed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.exitUntilCollapsed = global::HelloworldXamarin.Droid.Resource.Id.exitUntilCollapsed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.expanded_menu = global::HelloworldXamarin.Droid.Resource.Id.expanded_menu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.expand_activities_button = global::HelloworldXamarin.Droid.Resource.Id.expand_activities_button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.fill = global::HelloworldXamarin.Droid.Resource.Id.fill;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.filled = global::HelloworldXamarin.Droid.Resource.Id.filled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.fill_horizontal = global::HelloworldXamarin.Droid.Resource.Id.fill_horizontal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.fill_vertical = global::HelloworldXamarin.Droid.Resource.Id.fill_vertical;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.@fixed = global::HelloworldXamarin.Droid.Resource.Id.@fixed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.flyoutcontent_appbar = global::HelloworldXamarin.Droid.Resource.Id.flyoutcontent_appbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.flyoutcontent_recycler = global::HelloworldXamarin.Droid.Resource.Id.flyoutcontent_recycler;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.forever = global::HelloworldXamarin.Droid.Resource.Id.forever;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.FUNCTION = global::HelloworldXamarin.Droid.Resource.Id.FUNCTION;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.ghost_view = global::HelloworldXamarin.Droid.Resource.Id.ghost_view;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.group_divider = global::HelloworldXamarin.Droid.Resource.Id.group_divider;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.home = global::HelloworldXamarin.Droid.Resource.Id.home;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.homeAsUp = global::HelloworldXamarin.Droid.Resource.Id.homeAsUp;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.icon = global::HelloworldXamarin.Droid.Resource.Id.icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.icon_group = global::HelloworldXamarin.Droid.Resource.Id.icon_group;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.ifRoom = global::HelloworldXamarin.Droid.Resource.Id.ifRoom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.image = global::HelloworldXamarin.Droid.Resource.Id.image;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.info = global::HelloworldXamarin.Droid.Resource.Id.info;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.italic = global::HelloworldXamarin.Droid.Resource.Id.italic;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.item_touch_helper_previous_elevation = global::HelloworldXamarin.Droid.Resource.Id.item_touch_helper_previous_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.labeled = global::HelloworldXamarin.Droid.Resource.Id.labeled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.largeLabel = global::HelloworldXamarin.Droid.Resource.Id.largeLabel;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.left = global::HelloworldXamarin.Droid.Resource.Id.left;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.line1 = global::HelloworldXamarin.Droid.Resource.Id.line1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.line3 = global::HelloworldXamarin.Droid.Resource.Id.line3;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.listMode = global::HelloworldXamarin.Droid.Resource.Id.listMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.list_item = global::HelloworldXamarin.Droid.Resource.Id.list_item;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.main_appbar = global::HelloworldXamarin.Droid.Resource.Id.main_appbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.main_tablayout = global::HelloworldXamarin.Droid.Resource.Id.main_tablayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.main_toolbar = global::HelloworldXamarin.Droid.Resource.Id.main_toolbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.main_viewpager = global::HelloworldXamarin.Droid.Resource.Id.main_viewpager;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.masked = global::HelloworldXamarin.Droid.Resource.Id.masked;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.media_actions = global::HelloworldXamarin.Droid.Resource.Id.media_actions;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.message = global::HelloworldXamarin.Droid.Resource.Id.message;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.META = global::HelloworldXamarin.Droid.Resource.Id.META;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.middle = global::HelloworldXamarin.Droid.Resource.Id.middle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.mini = global::HelloworldXamarin.Droid.Resource.Id.mini;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.mtrl_child_content_container = global::HelloworldXamarin.Droid.Resource.Id.mtrl_child_content_container;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.mtrl_internal_children_alpha_tag = global::HelloworldXamarin.Droid.Resource.Id.mtrl_internal_children_alpha_tag;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.multiply = global::HelloworldXamarin.Droid.Resource.Id.multiply;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.navigation_header_container = global::HelloworldXamarin.Droid.Resource.Id.navigation_header_container;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.never = global::HelloworldXamarin.Droid.Resource.Id.never;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.none = global::HelloworldXamarin.Droid.Resource.Id.none;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.normal = global::HelloworldXamarin.Droid.Resource.Id.normal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.notification_background = global::HelloworldXamarin.Droid.Resource.Id.notification_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.notification_main_column = global::HelloworldXamarin.Droid.Resource.Id.notification_main_column;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.notification_main_column_container = global::HelloworldXamarin.Droid.Resource.Id.notification_main_column_container;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.outline = global::HelloworldXamarin.Droid.Resource.Id.outline;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.parallax = global::HelloworldXamarin.Droid.Resource.Id.parallax;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.parentPanel = global::HelloworldXamarin.Droid.Resource.Id.parentPanel;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.parent_matrix = global::HelloworldXamarin.Droid.Resource.Id.parent_matrix;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.pin = global::HelloworldXamarin.Droid.Resource.Id.pin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.progress_circular = global::HelloworldXamarin.Droid.Resource.Id.progress_circular;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.progress_horizontal = global::HelloworldXamarin.Droid.Resource.Id.progress_horizontal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.radio = global::HelloworldXamarin.Droid.Resource.Id.radio;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.right = global::HelloworldXamarin.Droid.Resource.Id.right;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.right_icon = global::HelloworldXamarin.Droid.Resource.Id.right_icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.right_side = global::HelloworldXamarin.Droid.Resource.Id.right_side;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.save_image_matrix = global::HelloworldXamarin.Droid.Resource.Id.save_image_matrix;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.save_non_transition_alpha = global::HelloworldXamarin.Droid.Resource.Id.save_non_transition_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.save_scale_type = global::HelloworldXamarin.Droid.Resource.Id.save_scale_type;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.screen = global::HelloworldXamarin.Droid.Resource.Id.screen;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.scroll = global::HelloworldXamarin.Droid.Resource.Id.scroll;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.scrollable = global::HelloworldXamarin.Droid.Resource.Id.scrollable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.scrollIndicatorDown = global::HelloworldXamarin.Droid.Resource.Id.scrollIndicatorDown;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.scrollIndicatorUp = global::HelloworldXamarin.Droid.Resource.Id.scrollIndicatorUp;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.scrollView = global::HelloworldXamarin.Droid.Resource.Id.scrollView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.search_badge = global::HelloworldXamarin.Droid.Resource.Id.search_badge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.search_bar = global::HelloworldXamarin.Droid.Resource.Id.search_bar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.search_button = global::HelloworldXamarin.Droid.Resource.Id.search_button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.search_close_btn = global::HelloworldXamarin.Droid.Resource.Id.search_close_btn;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.search_edit_frame = global::HelloworldXamarin.Droid.Resource.Id.search_edit_frame;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.search_go_btn = global::HelloworldXamarin.Droid.Resource.Id.search_go_btn;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.search_mag_icon = global::HelloworldXamarin.Droid.Resource.Id.search_mag_icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.search_plate = global::HelloworldXamarin.Droid.Resource.Id.search_plate;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.search_src_text = global::HelloworldXamarin.Droid.Resource.Id.search_src_text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.search_voice_btn = global::HelloworldXamarin.Droid.Resource.Id.search_voice_btn;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.selected = global::HelloworldXamarin.Droid.Resource.Id.selected;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.select_dialog_listview = global::HelloworldXamarin.Droid.Resource.Id.select_dialog_listview;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.shellcontent_appbar = global::HelloworldXamarin.Droid.Resource.Id.shellcontent_appbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.shellcontent_toolbar = global::HelloworldXamarin.Droid.Resource.Id.shellcontent_toolbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.SHIFT = global::HelloworldXamarin.Droid.Resource.Id.SHIFT;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.shortcut = global::HelloworldXamarin.Droid.Resource.Id.shortcut;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.showCustom = global::HelloworldXamarin.Droid.Resource.Id.showCustom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.showHome = global::HelloworldXamarin.Droid.Resource.Id.showHome;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.showTitle = global::HelloworldXamarin.Droid.Resource.Id.showTitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.smallLabel = global::HelloworldXamarin.Droid.Resource.Id.smallLabel;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.snackbar_action = global::HelloworldXamarin.Droid.Resource.Id.snackbar_action;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.snackbar_text = global::HelloworldXamarin.Droid.Resource.Id.snackbar_text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.snap = global::HelloworldXamarin.Droid.Resource.Id.snap;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.snapMargins = global::HelloworldXamarin.Droid.Resource.Id.snapMargins;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.spacer = global::HelloworldXamarin.Droid.Resource.Id.spacer;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.split_action_bar = global::HelloworldXamarin.Droid.Resource.Id.split_action_bar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.src_atop = global::HelloworldXamarin.Droid.Resource.Id.src_atop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.src_in = global::HelloworldXamarin.Droid.Resource.Id.src_in;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.src_over = global::HelloworldXamarin.Droid.Resource.Id.src_over;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.start = global::HelloworldXamarin.Droid.Resource.Id.start;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.status_bar_latest_event_content = global::HelloworldXamarin.Droid.Resource.Id.status_bar_latest_event_content;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.stretch = global::HelloworldXamarin.Droid.Resource.Id.stretch;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.submenuarrow = global::HelloworldXamarin.Droid.Resource.Id.submenuarrow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.submit_area = global::HelloworldXamarin.Droid.Resource.Id.submit_area;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.SYM = global::HelloworldXamarin.Droid.Resource.Id.SYM;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.tabMode = global::HelloworldXamarin.Droid.Resource.Id.tabMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.tag_transition_group = global::HelloworldXamarin.Droid.Resource.Id.tag_transition_group;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.tag_unhandled_key_event_manager = global::HelloworldXamarin.Droid.Resource.Id.tag_unhandled_key_event_manager;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.tag_unhandled_key_listeners = global::HelloworldXamarin.Droid.Resource.Id.tag_unhandled_key_listeners;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.text = global::HelloworldXamarin.Droid.Resource.Id.text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.text2 = global::HelloworldXamarin.Droid.Resource.Id.text2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.textinput_counter = global::HelloworldXamarin.Droid.Resource.Id.textinput_counter;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.textinput_error = global::HelloworldXamarin.Droid.Resource.Id.textinput_error;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.textinput_helper_text = global::HelloworldXamarin.Droid.Resource.Id.textinput_helper_text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.textSpacerNoButtons = global::HelloworldXamarin.Droid.Resource.Id.textSpacerNoButtons;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.textSpacerNoTitle = global::HelloworldXamarin.Droid.Resource.Id.textSpacerNoTitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.textStart = global::HelloworldXamarin.Droid.Resource.Id.textStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.text_input_password_toggle = global::HelloworldXamarin.Droid.Resource.Id.text_input_password_toggle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.time = global::HelloworldXamarin.Droid.Resource.Id.time;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.title = global::HelloworldXamarin.Droid.Resource.Id.title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.titleDividerNoCustom = global::HelloworldXamarin.Droid.Resource.Id.titleDividerNoCustom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.title_template = global::HelloworldXamarin.Droid.Resource.Id.title_template;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.top = global::HelloworldXamarin.Droid.Resource.Id.top;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.topPanel = global::HelloworldXamarin.Droid.Resource.Id.topPanel;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.touch_outside = global::HelloworldXamarin.Droid.Resource.Id.touch_outside;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.transition_current_scene = global::HelloworldXamarin.Droid.Resource.Id.transition_current_scene;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.transition_layout_save = global::HelloworldXamarin.Droid.Resource.Id.transition_layout_save;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.transition_position = global::HelloworldXamarin.Droid.Resource.Id.transition_position;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.transition_scene_layoutid_cache = global::HelloworldXamarin.Droid.Resource.Id.transition_scene_layoutid_cache;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.transition_transform = global::HelloworldXamarin.Droid.Resource.Id.transition_transform;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.uniform = global::HelloworldXamarin.Droid.Resource.Id.uniform;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.unlabeled = global::HelloworldXamarin.Droid.Resource.Id.unlabeled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.up = global::HelloworldXamarin.Droid.Resource.Id.up;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.useLogo = global::HelloworldXamarin.Droid.Resource.Id.useLogo;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.view_offset_helper = global::HelloworldXamarin.Droid.Resource.Id.view_offset_helper;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.visible = global::HelloworldXamarin.Droid.Resource.Id.visible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.withText = global::HelloworldXamarin.Droid.Resource.Id.withText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Id.wrap_content = global::HelloworldXamarin.Droid.Resource.Id.wrap_content;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.abc_config_activityDefaultDur = global::HelloworldXamarin.Droid.Resource.Integer.abc_config_activityDefaultDur;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.abc_config_activityShortDur = global::HelloworldXamarin.Droid.Resource.Integer.abc_config_activityShortDur;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.app_bar_elevation_anim_duration = global::HelloworldXamarin.Droid.Resource.Integer.app_bar_elevation_anim_duration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.bottom_sheet_slide_duration = global::HelloworldXamarin.Droid.Resource.Integer.bottom_sheet_slide_duration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.cancel_button_image_alpha = global::HelloworldXamarin.Droid.Resource.Integer.cancel_button_image_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.config_tooltipAnimTime = global::HelloworldXamarin.Droid.Resource.Integer.config_tooltipAnimTime;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.design_snackbar_text_max_lines = global::HelloworldXamarin.Droid.Resource.Integer.design_snackbar_text_max_lines;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.design_tab_indicator_anim_duration_ms = global::HelloworldXamarin.Droid.Resource.Integer.design_tab_indicator_anim_duration_ms;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.hide_password_duration = global::HelloworldXamarin.Droid.Resource.Integer.hide_password_duration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.mtrl_btn_anim_delay_ms = global::HelloworldXamarin.Droid.Resource.Integer.mtrl_btn_anim_delay_ms;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.mtrl_btn_anim_duration_ms = global::HelloworldXamarin.Droid.Resource.Integer.mtrl_btn_anim_duration_ms;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.mtrl_chip_anim_duration = global::HelloworldXamarin.Droid.Resource.Integer.mtrl_chip_anim_duration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.mtrl_tab_indicator_anim_duration_ms = global::HelloworldXamarin.Droid.Resource.Integer.mtrl_tab_indicator_anim_duration_ms;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.show_password_duration = global::HelloworldXamarin.Droid.Resource.Integer.show_password_duration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Integer.status_bar_notification_info_maxnum = global::HelloworldXamarin.Droid.Resource.Integer.status_bar_notification_info_maxnum;
+                       global::Xamarin.Forms.Platform.Android.Resource.Interpolator.mtrl_fast_out_linear_in = global::HelloworldXamarin.Droid.Resource.Interpolator.mtrl_fast_out_linear_in;
+                       global::Xamarin.Forms.Platform.Android.Resource.Interpolator.mtrl_fast_out_slow_in = global::HelloworldXamarin.Droid.Resource.Interpolator.mtrl_fast_out_slow_in;
+                       global::Xamarin.Forms.Platform.Android.Resource.Interpolator.mtrl_linear = global::HelloworldXamarin.Droid.Resource.Interpolator.mtrl_linear;
+                       global::Xamarin.Forms.Platform.Android.Resource.Interpolator.mtrl_linear_out_slow_in = global::HelloworldXamarin.Droid.Resource.Interpolator.mtrl_linear_out_slow_in;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_action_bar_title_item = global::HelloworldXamarin.Droid.Resource.Layout.abc_action_bar_title_item;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_action_bar_up_container = global::HelloworldXamarin.Droid.Resource.Layout.abc_action_bar_up_container;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_action_menu_item_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_action_menu_item_layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_action_menu_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_action_menu_layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_action_mode_bar = global::HelloworldXamarin.Droid.Resource.Layout.abc_action_mode_bar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_action_mode_close_item_material = global::HelloworldXamarin.Droid.Resource.Layout.abc_action_mode_close_item_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_activity_chooser_view = global::HelloworldXamarin.Droid.Resource.Layout.abc_activity_chooser_view;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_activity_chooser_view_list_item = global::HelloworldXamarin.Droid.Resource.Layout.abc_activity_chooser_view_list_item;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_alert_dialog_button_bar_material = global::HelloworldXamarin.Droid.Resource.Layout.abc_alert_dialog_button_bar_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_alert_dialog_material = global::HelloworldXamarin.Droid.Resource.Layout.abc_alert_dialog_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_alert_dialog_title_material = global::HelloworldXamarin.Droid.Resource.Layout.abc_alert_dialog_title_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_cascading_menu_item_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_cascading_menu_item_layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_dialog_title_material = global::HelloworldXamarin.Droid.Resource.Layout.abc_dialog_title_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_expanded_menu_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_expanded_menu_layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_list_menu_item_checkbox = global::HelloworldXamarin.Droid.Resource.Layout.abc_list_menu_item_checkbox;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_list_menu_item_icon = global::HelloworldXamarin.Droid.Resource.Layout.abc_list_menu_item_icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_list_menu_item_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_list_menu_item_layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_list_menu_item_radio = global::HelloworldXamarin.Droid.Resource.Layout.abc_list_menu_item_radio;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_popup_menu_header_item_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_popup_menu_header_item_layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_popup_menu_item_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_popup_menu_item_layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_screen_content_include = global::HelloworldXamarin.Droid.Resource.Layout.abc_screen_content_include;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_screen_simple = global::HelloworldXamarin.Droid.Resource.Layout.abc_screen_simple;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_screen_simple_overlay_action_mode = global::HelloworldXamarin.Droid.Resource.Layout.abc_screen_simple_overlay_action_mode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_screen_toolbar = global::HelloworldXamarin.Droid.Resource.Layout.abc_screen_toolbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_search_dropdown_item_icons_2line = global::HelloworldXamarin.Droid.Resource.Layout.abc_search_dropdown_item_icons_2line;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_search_view = global::HelloworldXamarin.Droid.Resource.Layout.abc_search_view;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_select_dialog_material = global::HelloworldXamarin.Droid.Resource.Layout.abc_select_dialog_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.abc_tooltip = global::HelloworldXamarin.Droid.Resource.Layout.abc_tooltip;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.BottomTabLayout = global::HelloworldXamarin.Droid.Resource.Layout.BottomTabLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_bottom_navigation_item = global::HelloworldXamarin.Droid.Resource.Layout.design_bottom_navigation_item;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_bottom_sheet_dialog = global::HelloworldXamarin.Droid.Resource.Layout.design_bottom_sheet_dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_layout_snackbar = global::HelloworldXamarin.Droid.Resource.Layout.design_layout_snackbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_layout_snackbar_include = global::HelloworldXamarin.Droid.Resource.Layout.design_layout_snackbar_include;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_layout_tab_icon = global::HelloworldXamarin.Droid.Resource.Layout.design_layout_tab_icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_layout_tab_text = global::HelloworldXamarin.Droid.Resource.Layout.design_layout_tab_text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_menu_item_action_area = global::HelloworldXamarin.Droid.Resource.Layout.design_menu_item_action_area;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_navigation_item = global::HelloworldXamarin.Droid.Resource.Layout.design_navigation_item;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_navigation_item_header = global::HelloworldXamarin.Droid.Resource.Layout.design_navigation_item_header;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_navigation_item_separator = global::HelloworldXamarin.Droid.Resource.Layout.design_navigation_item_separator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_navigation_item_subheader = global::HelloworldXamarin.Droid.Resource.Layout.design_navigation_item_subheader;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_navigation_menu = global::HelloworldXamarin.Droid.Resource.Layout.design_navigation_menu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_navigation_menu_item = global::HelloworldXamarin.Droid.Resource.Layout.design_navigation_menu_item;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.design_text_input_password_icon = global::HelloworldXamarin.Droid.Resource.Layout.design_text_input_password_icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.FlyoutContent = global::HelloworldXamarin.Droid.Resource.Layout.FlyoutContent;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.mtrl_layout_snackbar = global::HelloworldXamarin.Droid.Resource.Layout.mtrl_layout_snackbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.mtrl_layout_snackbar_include = global::HelloworldXamarin.Droid.Resource.Layout.mtrl_layout_snackbar_include;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_action = global::HelloworldXamarin.Droid.Resource.Layout.notification_action;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_action_tombstone = global::HelloworldXamarin.Droid.Resource.Layout.notification_action_tombstone;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_media_action = global::HelloworldXamarin.Droid.Resource.Layout.notification_media_action;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_media_cancel_action = global::HelloworldXamarin.Droid.Resource.Layout.notification_media_cancel_action;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_template_big_media = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_big_media;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_template_big_media_custom = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_big_media_custom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_template_big_media_narrow = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_big_media_narrow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_template_big_media_narrow_custom = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_big_media_narrow_custom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_template_custom_big = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_custom_big;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_template_icon_group = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_icon_group;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_template_lines_media = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_lines_media;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_template_media = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_media;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_template_media_custom = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_media_custom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_template_part_chronometer = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_part_chronometer;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.notification_template_part_time = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_part_time;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.RootLayout = global::HelloworldXamarin.Droid.Resource.Layout.RootLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.select_dialog_item_material = global::HelloworldXamarin.Droid.Resource.Layout.select_dialog_item_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.select_dialog_multichoice_material = global::HelloworldXamarin.Droid.Resource.Layout.select_dialog_multichoice_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.select_dialog_singlechoice_material = global::HelloworldXamarin.Droid.Resource.Layout.select_dialog_singlechoice_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.ShellContent = global::HelloworldXamarin.Droid.Resource.Layout.ShellContent;
+                       global::Xamarin.Forms.Platform.Android.Resource.Layout.support_simple_spinner_dropdown_item = global::HelloworldXamarin.Droid.Resource.Layout.support_simple_spinner_dropdown_item;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_action_bar_home_description = global::HelloworldXamarin.Droid.Resource.String.abc_action_bar_home_description;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_action_bar_up_description = global::HelloworldXamarin.Droid.Resource.String.abc_action_bar_up_description;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_action_menu_overflow_description = global::HelloworldXamarin.Droid.Resource.String.abc_action_menu_overflow_description;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_action_mode_done = global::HelloworldXamarin.Droid.Resource.String.abc_action_mode_done;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_activitychooserview_choose_application = global::HelloworldXamarin.Droid.Resource.String.abc_activitychooserview_choose_application;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_activity_chooser_view_see_all = global::HelloworldXamarin.Droid.Resource.String.abc_activity_chooser_view_see_all;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_capital_off = global::HelloworldXamarin.Droid.Resource.String.abc_capital_off;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_capital_on = global::HelloworldXamarin.Droid.Resource.String.abc_capital_on;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_font_family_body_1_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_body_1_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_font_family_body_2_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_body_2_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_font_family_button_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_button_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_font_family_caption_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_caption_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_font_family_display_1_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_display_1_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_font_family_display_2_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_display_2_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_font_family_display_3_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_display_3_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_font_family_display_4_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_display_4_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_font_family_headline_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_headline_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_font_family_menu_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_menu_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_font_family_subhead_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_subhead_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_font_family_title_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_title_material;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_menu_alt_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_alt_shortcut_label;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_menu_ctrl_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_ctrl_shortcut_label;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_menu_delete_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_delete_shortcut_label;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_menu_enter_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_enter_shortcut_label;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_menu_function_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_function_shortcut_label;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_menu_meta_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_meta_shortcut_label;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_menu_shift_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_shift_shortcut_label;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_menu_space_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_space_shortcut_label;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_menu_sym_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_sym_shortcut_label;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_prepend_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_prepend_shortcut_label;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_searchview_description_clear = global::HelloworldXamarin.Droid.Resource.String.abc_searchview_description_clear;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_searchview_description_query = global::HelloworldXamarin.Droid.Resource.String.abc_searchview_description_query;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_searchview_description_search = global::HelloworldXamarin.Droid.Resource.String.abc_searchview_description_search;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_searchview_description_submit = global::HelloworldXamarin.Droid.Resource.String.abc_searchview_description_submit;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_searchview_description_voice = global::HelloworldXamarin.Droid.Resource.String.abc_searchview_description_voice;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_search_hint = global::HelloworldXamarin.Droid.Resource.String.abc_search_hint;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_shareactionprovider_share_with = global::HelloworldXamarin.Droid.Resource.String.abc_shareactionprovider_share_with;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_shareactionprovider_share_with_application = global::HelloworldXamarin.Droid.Resource.String.abc_shareactionprovider_share_with_application;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.abc_toolbar_collapse_description = global::HelloworldXamarin.Droid.Resource.String.abc_toolbar_collapse_description;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.appbar_scrolling_view_behavior = global::HelloworldXamarin.Droid.Resource.String.appbar_scrolling_view_behavior;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.bottom_sheet_behavior = global::HelloworldXamarin.Droid.Resource.String.bottom_sheet_behavior;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.character_counter_content_description = global::HelloworldXamarin.Droid.Resource.String.character_counter_content_description;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.character_counter_pattern = global::HelloworldXamarin.Droid.Resource.String.character_counter_pattern;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.fab_transformation_scrim_behavior = global::HelloworldXamarin.Droid.Resource.String.fab_transformation_scrim_behavior;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.fab_transformation_sheet_behavior = global::HelloworldXamarin.Droid.Resource.String.fab_transformation_sheet_behavior;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.hide_bottom_view_on_scroll_behavior = global::HelloworldXamarin.Droid.Resource.String.hide_bottom_view_on_scroll_behavior;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.mtrl_chip_close_icon_content_description = global::HelloworldXamarin.Droid.Resource.String.mtrl_chip_close_icon_content_description;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.password_toggle_content_description = global::HelloworldXamarin.Droid.Resource.String.password_toggle_content_description;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.path_password_eye = global::HelloworldXamarin.Droid.Resource.String.path_password_eye;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.path_password_eye_mask_strike_through = global::HelloworldXamarin.Droid.Resource.String.path_password_eye_mask_strike_through;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.path_password_eye_mask_visible = global::HelloworldXamarin.Droid.Resource.String.path_password_eye_mask_visible;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.path_password_strike_through = global::HelloworldXamarin.Droid.Resource.String.path_password_strike_through;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.search_menu_title = global::HelloworldXamarin.Droid.Resource.String.search_menu_title;
+                       global::Xamarin.Forms.Platform.Android.Resource.String.status_bar_notification_info_overflow = global::HelloworldXamarin.Droid.Resource.String.status_bar_notification_info_overflow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.AlertDialog_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.AlertDialog_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.AlertDialog_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.AlertDialog_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Animation_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Animation_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Animation_AppCompat_DropDownUp = global::HelloworldXamarin.Droid.Resource.Style.Animation_AppCompat_DropDownUp;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Animation_AppCompat_Tooltip = global::HelloworldXamarin.Droid.Resource.Style.Animation_AppCompat_Tooltip;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Animation_Design_BottomSheetDialog = global::HelloworldXamarin.Droid.Resource.Style.Animation_Design_BottomSheetDialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.AppCompatDialogStyle = global::HelloworldXamarin.Droid.Resource.Style.AppCompatDialogStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_AlertDialog_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_AlertDialog_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_AlertDialog_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_AlertDialog_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Animation_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Animation_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Animation_AppCompat_DropDownUp = global::HelloworldXamarin.Droid.Resource.Style.Base_Animation_AppCompat_DropDownUp;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Animation_AppCompat_Tooltip = global::HelloworldXamarin.Droid.Resource.Style.Base_Animation_AppCompat_Tooltip;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_CardView = global::HelloworldXamarin.Droid.Resource.Style.Base_CardView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_DialogWindowTitleBackground_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_DialogWindowTitleBackground_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_DialogWindowTitle_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_DialogWindowTitle_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Body1 = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Body1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Body2 = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Body2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Button = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Caption = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Caption;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Display1 = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Display1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Display2 = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Display2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Display3 = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Display3;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Display4 = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Display4;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Headline = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Headline;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Large = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Large;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Large_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Large_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Medium = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Medium;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Medium_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Medium_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Menu = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Menu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_SearchResult = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_SearchResult;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_SearchResult_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_SearchResult_Subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_SearchResult_Title = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_SearchResult_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Small = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Small;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Small_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Small_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Subhead = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Subhead;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Subhead_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Subhead_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Title = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Title_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Title_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Tooltip = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Tooltip;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Menu = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Menu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Title = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionMode_Title = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionMode_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button_Colored = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button_Colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_DropDownItem = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_DropDownItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_PopupMenu_Header = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_PopupMenu_Header;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_PopupMenu_Large = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_PopupMenu_Large;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_PopupMenu_Small = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_PopupMenu_Small;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_Switch = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_Switch;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_TextAppearance_Widget_AppCompat_Toolbar_Title = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_Widget_AppCompat_Toolbar_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_ThemeOverlay_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_ThemeOverlay_AppCompat_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_ThemeOverlay_AppCompat_Dark = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat_Dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_ThemeOverlay_AppCompat_Dark_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat_Dark_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_ThemeOverlay_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_ThemeOverlay_AppCompat_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_ThemeOverlay_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_ThemeOverlay_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_ThemeOverlay_MaterialComponents_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_MaterialComponents_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_CompactMenu = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_CompactMenu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_Dialog_FixedSize = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Dialog_FixedSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_Light_DarkActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light_DarkActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_Light_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_Light_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_Light_Dialog_FixedSize = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light_Dialog_FixedSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_AppCompat_Light_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Bridge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_CompactMenu = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_CompactMenu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Dialog_FixedSize = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Dialog_FixedSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Light_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_Bridge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Light_DarkActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_DarkActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Light_DarkActionBar_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_DarkActionBar_Bridge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Light_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog_FixedSize = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog_FixedSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V14_ThemeOverlay_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_ThemeOverlay_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V14_ThemeOverlay_MaterialComponents_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_ThemeOverlay_MaterialComponents_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V14_Theme_MaterialComponents = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V14_Theme_MaterialComponents_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents_Bridge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V14_Theme_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V14_Theme_MaterialComponents_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V14_Theme_MaterialComponents_Light_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents_Light_Bridge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V14_Theme_MaterialComponents_Light_DarkActionBar_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents_Light_DarkActionBar_Bridge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V14_Theme_MaterialComponents_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V21_ThemeOverlay_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V21_ThemeOverlay_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V21_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_V21_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V21_Theme_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V21_Theme_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V21_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V21_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V21_Theme_AppCompat_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V21_Theme_AppCompat_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V22_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_V22_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V22_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V22_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V23_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_V23_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V23_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V23_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V26_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_V26_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V26_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V26_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V26_Widget_AppCompat_Toolbar = global::HelloworldXamarin.Droid.Resource.Style.Base_V26_Widget_AppCompat_Toolbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V28_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_V28_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V28_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V28_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V7_ThemeOverlay_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_ThemeOverlay_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V7_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V7_Theme_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Theme_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V7_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V7_Theme_AppCompat_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Theme_AppCompat_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V7_Widget_AppCompat_AutoCompleteTextView = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Widget_AppCompat_AutoCompleteTextView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V7_Widget_AppCompat_EditText = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Widget_AppCompat_EditText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_V7_Widget_AppCompat_Toolbar = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Widget_AppCompat_Toolbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ActionBar_Solid = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionBar_Solid;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ActionBar_TabBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionBar_TabBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ActionBar_TabText = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionBar_TabText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ActionBar_TabView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionBar_TabView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ActionButton = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ActionButton_CloseMode = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionButton_CloseMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ActionButton_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionButton_Overflow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ActionMode = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ActivityChooserView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActivityChooserView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_AutoCompleteTextView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_AutoCompleteTextView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Button = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ButtonBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ButtonBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ButtonBar_AlertDialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ButtonBar_AlertDialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Button_Borderless = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Button_Borderless;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Button_Borderless_Colored = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Button_Borderless_Colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Button_ButtonBar_AlertDialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Button_ButtonBar_AlertDialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Button_Colored = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Button_Colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Button_Small = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Button_Small;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_CompoundButton_CheckBox = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_CompoundButton_CheckBox;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_CompoundButton_RadioButton = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_CompoundButton_RadioButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_CompoundButton_Switch = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_CompoundButton_Switch;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_DrawerArrowToggle = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_DrawerArrowToggle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_DrawerArrowToggle_Common = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_DrawerArrowToggle_Common;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_DropDownItem_Spinner = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_DropDownItem_Spinner;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_EditText = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_EditText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ImageButton = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ImageButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Light_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_Solid = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_Solid;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabText = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Light_PopupMenu = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_PopupMenu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Light_PopupMenu_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_PopupMenu_Overflow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ListMenuView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ListMenuView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ListPopupWindow = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ListPopupWindow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ListView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ListView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ListView_DropDown = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ListView_DropDown;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ListView_Menu = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ListView_Menu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_PopupMenu = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_PopupMenu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_PopupMenu_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_PopupMenu_Overflow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_PopupWindow = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_PopupWindow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ProgressBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ProgressBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_ProgressBar_Horizontal = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ProgressBar_Horizontal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_RatingBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_RatingBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_RatingBar_Indicator = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_RatingBar_Indicator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_RatingBar_Small = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_RatingBar_Small;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_SearchView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_SearchView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_SearchView_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_SearchView_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_SeekBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_SeekBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_SeekBar_Discrete = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_SeekBar_Discrete;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Spinner = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Spinner;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Spinner_Underlined = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Spinner_Underlined;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_TextView_SpinnerItem = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_TextView_SpinnerItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Toolbar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Toolbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_AppCompat_Toolbar_Button_Navigation = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Toolbar_Button_Navigation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_Design_TabLayout = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_Design_TabLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_MaterialComponents_Chip = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_MaterialComponents_Chip;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_MaterialComponents_TextInputEditText = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_MaterialComponents_TextInputEditText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Base_Widget_MaterialComponents_TextInputLayout = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_MaterialComponents_TextInputLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.CardView = global::HelloworldXamarin.Droid.Resource.Style.CardView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.CardView_Dark = global::HelloworldXamarin.Droid.Resource.Style.CardView_Dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.CardView_Light = global::HelloworldXamarin.Droid.Resource.Style.CardView_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.collectionViewStyle = global::HelloworldXamarin.Droid.Resource.Style.collectionViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.MainTheme = global::HelloworldXamarin.Droid.Resource.Style.MainTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.MainTheme_Base = global::HelloworldXamarin.Droid.Resource.Style.MainTheme_Base;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Platform_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Platform_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_MaterialComponents = global::HelloworldXamarin.Droid.Resource.Style.Platform_MaterialComponents;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Platform_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_MaterialComponents_Light = global::HelloworldXamarin.Droid.Resource.Style.Platform_MaterialComponents_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_MaterialComponents_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Platform_MaterialComponents_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_ThemeOverlay_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Platform_ThemeOverlay_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_ThemeOverlay_AppCompat_Dark = global::HelloworldXamarin.Droid.Resource.Style.Platform_ThemeOverlay_AppCompat_Dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_ThemeOverlay_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Platform_ThemeOverlay_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_V21_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Platform_V21_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_V21_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Platform_V21_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_V25_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Platform_V25_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_V25_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Platform_V25_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Platform_Widget_AppCompat_Spinner = global::HelloworldXamarin.Droid.Resource.Style.Platform_Widget_AppCompat_Spinner;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_DialogWindowTitle_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_DialogWindowTitle_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_ActionBar_TitleItem = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_ActionBar_TitleItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_DialogTitle_Icon = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_DialogTitle_Icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_Text = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_Text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_Title = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_SearchView_MagIcon = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_SearchView_MagIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Query = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Query;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Text = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlUnderlay_Widget_AppCompat_ActionButton = global::HelloworldXamarin.Droid.Resource.Style.RtlUnderlay_Widget_AppCompat_ActionButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.RtlUnderlay_Widget_AppCompat_ActionButton_Overflow = global::HelloworldXamarin.Droid.Resource.Style.RtlUnderlay_Widget_AppCompat_ActionButton_Overflow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Body1 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Body1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Body2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Body2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Button = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Caption = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Caption;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Display1 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Display1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Display2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Display2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Display3 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Display3;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Display4 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Display4;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Headline = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Headline;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Large = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Large;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Large_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Large_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Light_SearchResult_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Light_SearchResult_Subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Light_SearchResult_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Light_SearchResult_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Light_Widget_PopupMenu_Large = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Light_Widget_PopupMenu_Small = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Medium = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Medium;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Medium_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Medium_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Menu = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Menu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_SearchResult_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_SearchResult_Subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_SearchResult_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_SearchResult_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Small = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Small;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Small_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Small_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Subhead = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Subhead;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Subhead_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Subhead_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Title_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Title_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Tooltip = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Tooltip;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Menu = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Menu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_Button = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_Button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_Button_Borderless_Colored = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_Button_Borderless_Colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_Button_Colored = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_Button_Colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_Button_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_Button_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_DropDownItem = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_DropDownItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_PopupMenu_Header = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_PopupMenu_Header;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_PopupMenu_Large = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_PopupMenu_Large;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_PopupMenu_Small = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_PopupMenu_Small;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_Switch = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_Switch;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_AppCompat_Widget_TextView_SpinnerItem = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Compat_Notification = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Compat_Notification_Info = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Info;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Compat_Notification_Info_Media = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Info_Media;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Compat_Notification_Line2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Line2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Compat_Notification_Line2_Media = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Line2_Media;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Compat_Notification_Media = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Media;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Compat_Notification_Time = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Time;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Compat_Notification_Time_Media = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Time_Media;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Compat_Notification_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Compat_Notification_Title_Media = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Title_Media;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Design_CollapsingToolbar_Expanded = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_CollapsingToolbar_Expanded;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Design_Counter = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_Counter;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Design_Counter_Overflow = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_Counter_Overflow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Design_Error = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_Error;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Design_HelperText = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_HelperText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Design_Hint = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_Hint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Design_Snackbar_Message = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_Snackbar_Message;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Design_Tab = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_Tab;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Body1 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Body1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Body2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Body2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Button = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Caption = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Caption;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Chip = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Chip;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Headline1 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Headline1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Headline2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Headline2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Headline3 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Headline3;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Headline4 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Headline4;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Headline5 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Headline5;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Headline6 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Headline6;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Overline = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Overline;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Subtitle1 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Subtitle1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Subtitle2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Subtitle2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_MaterialComponents_Tab = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Tab;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Widget_AppCompat_ExpandedMenu_Item = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Widget_AppCompat_Toolbar_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.TextAppearance_Widget_AppCompat_Toolbar_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Widget_AppCompat_Toolbar_Title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_AppCompat_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_AppCompat_Dark = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat_Dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_AppCompat_Dark_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat_Dark_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_AppCompat_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_MaterialComponents = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_MaterialComponents_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_MaterialComponents_Dark = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_Dark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_MaterialComponents_Dark_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_Dark_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_MaterialComponents_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_MaterialComponents_Light = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox_Dense = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox_Dense;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox_Dense = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox_Dense;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_CompactMenu = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_CompactMenu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_DayNight = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_DayNight_DarkActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight_DarkActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_DayNight_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_DayNight_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_DayNight_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_DayNight_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_DayNight_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight_NoActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_Light_DarkActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light_DarkActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_Light_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_Light_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_Light_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_Light_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light_NoActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_AppCompat_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_NoActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_Design = global::HelloworldXamarin.Droid.Resource.Style.Theme_Design;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_Design_BottomSheetDialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_Design_BottomSheetDialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_Design_Light = global::HelloworldXamarin.Droid.Resource.Style.Theme_Design_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_Design_Light_BottomSheetDialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_Design_Light_BottomSheetDialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_Design_Light_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_Design_Light_NoActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_Design_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_Design_NoActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_BottomSheetDialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_BottomSheetDialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Bridge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_CompactMenu = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_CompactMenu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Light = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Light_BottomSheetDialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_BottomSheetDialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Light_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_Bridge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Light_DarkActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_DarkActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Light_DarkActionBar_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_DarkActionBar_Bridge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Light_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Light_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Light_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Light_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_NoActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_Light_NoActionBar_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_NoActionBar_Bridge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_NoActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Theme_MaterialComponents_NoActionBar_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_NoActionBar_Bridge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ActionBar_Solid = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionBar_Solid;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ActionBar_TabBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionBar_TabBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ActionBar_TabText = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionBar_TabText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ActionBar_TabView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionBar_TabView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ActionButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ActionButton_CloseMode = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionButton_CloseMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ActionButton_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionButton_Overflow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ActionMode = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ActivityChooserView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActivityChooserView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_AutoCompleteTextView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_AutoCompleteTextView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Button = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ButtonBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ButtonBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ButtonBar_AlertDialog = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ButtonBar_AlertDialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Button_Borderless = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Button_Borderless;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Button_Borderless_Colored = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Button_Borderless_Colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Button_ButtonBar_AlertDialog = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Button_ButtonBar_AlertDialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Button_Colored = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Button_Colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Button_Small = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Button_Small;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_CompoundButton_CheckBox = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_CompoundButton_CheckBox;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_CompoundButton_RadioButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_CompoundButton_RadioButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_CompoundButton_Switch = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_CompoundButton_Switch;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_DrawerArrowToggle = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_DrawerArrowToggle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_DropDownItem_Spinner = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_DropDownItem_Spinner;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_EditText = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_EditText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ImageButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ImageButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionBar_Solid = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_Solid;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionBar_Solid_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_Solid_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionBar_TabBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_TabBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionBar_TabBar_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_TabBar_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionBar_TabText = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_TabText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionBar_TabText_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_TabText_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionBar_TabView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_TabView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionBar_TabView_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_TabView_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionButton_CloseMode = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionButton_CloseMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionButton_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionButton_Overflow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActionMode_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionMode_Inverse;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ActivityChooserView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActivityChooserView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_AutoCompleteTextView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_AutoCompleteTextView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_DropDownItem_Spinner = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_DropDownItem_Spinner;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ListPopupWindow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ListPopupWindow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_ListView_DropDown = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ListView_DropDown;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_PopupMenu = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_PopupMenu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_PopupMenu_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_PopupMenu_Overflow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_SearchView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_SearchView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Light_Spinner_DropDown_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_Spinner_DropDown_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ListMenuView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ListMenuView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ListPopupWindow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ListPopupWindow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ListView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ListView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ListView_DropDown = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ListView_DropDown;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ListView_Menu = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ListView_Menu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_PopupMenu = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_PopupMenu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_PopupMenu_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_PopupMenu_Overflow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_PopupWindow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_PopupWindow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ProgressBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ProgressBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_ProgressBar_Horizontal = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ProgressBar_Horizontal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_RatingBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_RatingBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_RatingBar_Indicator = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_RatingBar_Indicator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_RatingBar_Small = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_RatingBar_Small;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_SearchView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_SearchView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_SearchView_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_SearchView_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_SeekBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_SeekBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_SeekBar_Discrete = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_SeekBar_Discrete;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Spinner = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Spinner;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Spinner_DropDown = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Spinner_DropDown;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Spinner_DropDown_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Spinner_DropDown_ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Spinner_Underlined = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Spinner_Underlined;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_TextView_SpinnerItem = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_TextView_SpinnerItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Toolbar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Toolbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_AppCompat_Toolbar_Button_Navigation = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Toolbar_Button_Navigation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Compat_NotificationActionContainer = global::HelloworldXamarin.Droid.Resource.Style.Widget_Compat_NotificationActionContainer;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Compat_NotificationActionText = global::HelloworldXamarin.Droid.Resource.Style.Widget_Compat_NotificationActionText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Design_AppBarLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_AppBarLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Design_BottomNavigationView = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_BottomNavigationView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Design_BottomSheet_Modal = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_BottomSheet_Modal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Design_CollapsingToolbar = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_CollapsingToolbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Design_FloatingActionButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_FloatingActionButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Design_NavigationView = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_NavigationView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Design_ScrimInsetsFrameLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_ScrimInsetsFrameLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Design_Snackbar = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_Snackbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Design_TabLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_TabLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Design_TextInputLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_TextInputLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_BottomAppBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_BottomAppBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_BottomAppBar_Colored = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_BottomAppBar_Colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_BottomNavigationView = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_BottomNavigationView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_BottomNavigationView_Colored = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_BottomNavigationView_Colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_BottomSheet_Modal = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_BottomSheet_Modal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Button = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Button_Icon = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_Icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Button_OutlinedButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_OutlinedButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Button_OutlinedButton_Icon = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_OutlinedButton_Icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Button_TextButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_TextButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Button_TextButton_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_TextButton_Dialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Button_TextButton_Dialog_Icon = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_TextButton_Dialog_Icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Button_TextButton_Icon = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_TextButton_Icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Button_UnelevatedButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_UnelevatedButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Button_UnelevatedButton_Icon = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_UnelevatedButton_Icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_CardView = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_CardView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_ChipGroup = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_ChipGroup;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Chip_Action = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Chip_Action;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Chip_Choice = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Chip_Choice;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Chip_Entry = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Chip_Entry;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Chip_Filter = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Chip_Filter;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_FloatingActionButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_FloatingActionButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_NavigationView = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_NavigationView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Snackbar = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Snackbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Snackbar_FullWidth = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Snackbar_FullWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_TabLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TabLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_TabLayout_Colored = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TabLayout_Colored;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_TextInputEditText_FilledBox = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputEditText_FilledBox;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_TextInputEditText_FilledBox_Dense = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputEditText_FilledBox_Dense;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_TextInputEditText_OutlinedBox = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputEditText_OutlinedBox;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_TextInputEditText_OutlinedBox_Dense = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputEditText_OutlinedBox_Dense;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_TextInputLayout_FilledBox = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputLayout_FilledBox;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_TextInputLayout_FilledBox_Dense = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputLayout_FilledBox_Dense;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_TextInputLayout_OutlinedBox = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputLayout_OutlinedBox;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_MaterialComponents_Toolbar = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Toolbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Style.Widget_Support_CoordinatorLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_Support_CoordinatorLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBarLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBarLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBarLayout_android_layout_gravity = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBarLayout_android_layout_gravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_background = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_backgroundSplit = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_backgroundSplit;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_backgroundStacked = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_backgroundStacked;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_contentInsetEnd = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_contentInsetEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_contentInsetEndWithActions = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_contentInsetEndWithActions;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_contentInsetLeft = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_contentInsetLeft;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_contentInsetRight = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_contentInsetRight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_contentInsetStart = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_contentInsetStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_contentInsetStartWithNavigation = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_contentInsetStartWithNavigation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_customNavigationLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_customNavigationLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_displayOptions = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_displayOptions;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_divider = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_divider;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_elevation = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_height = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_hideOnContentScroll = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_hideOnContentScroll;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_homeAsUpIndicator = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_homeAsUpIndicator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_homeLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_homeLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_icon = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_indeterminateProgressStyle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_indeterminateProgressStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_itemPadding = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_itemPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_logo = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_logo;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_navigationMode = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_navigationMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_popupTheme = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_popupTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_progressBarPadding = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_progressBarPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_progressBarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_progressBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_subtitle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_subtitleTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_subtitleTextStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_title = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionBar_titleTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_titleTextStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionMenuItemView = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMenuItemView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionMenuItemView_android_minWidth = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMenuItemView_android_minWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionMenuView = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMenuView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionMode = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionMode_background = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionMode_backgroundSplit = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode_backgroundSplit;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionMode_closeItemLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode_closeItemLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionMode_height = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode_height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionMode_subtitleTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode_subtitleTextStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActionMode_titleTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode_titleTextStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActivityChooserView = global::HelloworldXamarin.Droid.Resource.Styleable.ActivityChooserView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActivityChooserView_expandActivityOverflowButtonDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.ActivityChooserView_expandActivityOverflowButtonDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ActivityChooserView_initialActivityCount = global::HelloworldXamarin.Droid.Resource.Styleable.ActivityChooserView_initialActivityCount;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AlertDialog = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AlertDialog_android_layout = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_android_layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AlertDialog_buttonIconDimen = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_buttonIconDimen;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AlertDialog_buttonPanelSideLayout = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_buttonPanelSideLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AlertDialog_listItemLayout = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_listItemLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AlertDialog_listLayout = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_listLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AlertDialog_multiChoiceItemLayout = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_multiChoiceItemLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AlertDialog_showTitle = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_showTitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AlertDialog_singleChoiceItemLayout = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_singleChoiceItemLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableCompat = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableCompat_android_constantSize = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat_android_constantSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableCompat_android_dither = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat_android_dither;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableCompat_android_enterFadeDuration = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat_android_enterFadeDuration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableCompat_android_exitFadeDuration = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat_android_exitFadeDuration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableCompat_android_variablePadding = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat_android_variablePadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableCompat_android_visible = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat_android_visible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableItem = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableItem_android_drawable = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableItem_android_drawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableItem_android_id = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableItem_android_id;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableTransition = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableTransition;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableTransition_android_drawable = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableTransition_android_drawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableTransition_android_fromId = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableTransition_android_fromId;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableTransition_android_reversible = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableTransition_android_reversible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AnimatedStateListDrawableTransition_android_toId = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableTransition_android_toId;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayout = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayoutStates = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayoutStates;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayoutStates_state_collapsed = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayoutStates_state_collapsed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayoutStates_state_collapsible = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayoutStates_state_collapsible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayoutStates_state_liftable = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayoutStates_state_liftable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayoutStates_state_lifted = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayoutStates_state_lifted;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayout_android_background = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_android_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayout_android_keyboardNavigationCluster = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_android_keyboardNavigationCluster;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayout_android_touchscreenBlocksFocus = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_android_touchscreenBlocksFocus;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayout_elevation = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayout_expanded = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_expanded;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayout_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_Layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayout_Layout_layout_scrollFlags = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_Layout_layout_scrollFlags;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayout_Layout_layout_scrollInterpolator = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_Layout_layout_scrollInterpolator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppBarLayout_liftOnScroll = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_liftOnScroll;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatImageView = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatImageView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatImageView_android_src = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatImageView_android_src;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatImageView_srcCompat = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatImageView_srcCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatImageView_tint = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatImageView_tint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatImageView_tintMode = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatImageView_tintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatSeekBar = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatSeekBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatSeekBar_android_thumb = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatSeekBar_android_thumb;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatSeekBar_tickMark = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatSeekBar_tickMark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatSeekBar_tickMarkTint = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatSeekBar_tickMarkTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatSeekBar_tickMarkTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatSeekBar_tickMarkTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextHelper = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextHelper_android_drawableBottom = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_drawableBottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextHelper_android_drawableEnd = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_drawableEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextHelper_android_drawableLeft = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_drawableLeft;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextHelper_android_drawableRight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_drawableRight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextHelper_android_drawableStart = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_drawableStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextHelper_android_drawableTop = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_drawableTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextHelper_android_textAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_textAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextView = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextView_android_textAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_android_textAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextView_autoSizeMaxTextSize = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_autoSizeMaxTextSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextView_autoSizeMinTextSize = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_autoSizeMinTextSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextView_autoSizePresetSizes = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_autoSizePresetSizes;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextView_autoSizeStepGranularity = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_autoSizeStepGranularity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextView_autoSizeTextType = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_autoSizeTextType;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextView_firstBaselineToTopHeight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_firstBaselineToTopHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextView_fontFamily = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_fontFamily;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextView_lastBaselineToBottomHeight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_lastBaselineToBottomHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextView_lineHeight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_lineHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTextView_textAllCaps = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_textAllCaps;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionBarDivider = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarDivider;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionBarItemBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarItemBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionBarPopupTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarPopupTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionBarSize = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionBarSplitStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarSplitStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionBarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionBarTabBarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarTabBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionBarTabStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarTabStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionBarTabTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarTabTextStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionBarTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionBarWidgetTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarWidgetTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionDropDownStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionDropDownStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionMenuTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionMenuTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionMenuTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionMenuTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModeBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModeCloseButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeCloseButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModeCloseDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeCloseDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModeCopyDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeCopyDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModeCutDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeCutDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModeFindDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeFindDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModePasteDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModePasteDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModePopupWindowStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModePopupWindowStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModeSelectAllDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeSelectAllDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModeShareDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeShareDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModeSplitBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeSplitBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModeStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionModeWebSearchDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeWebSearchDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionOverflowButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionOverflowButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_actionOverflowMenuStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionOverflowMenuStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_activityChooserViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_activityChooserViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_alertDialogButtonGroupStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_alertDialogButtonGroupStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_alertDialogCenterButtons = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_alertDialogCenterButtons;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_alertDialogStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_alertDialogStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_alertDialogTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_alertDialogTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_android_windowAnimationStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_android_windowAnimationStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_android_windowIsFloating = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_android_windowIsFloating;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_autoCompleteTextViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_autoCompleteTextViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_borderlessButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_borderlessButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_buttonBarButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonBarButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_buttonBarNegativeButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonBarNegativeButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_buttonBarNeutralButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonBarNeutralButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_buttonBarPositiveButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonBarPositiveButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_buttonBarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_buttonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_buttonStyleSmall = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonStyleSmall;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_checkboxStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_checkboxStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_checkedTextViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_checkedTextViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_colorAccent = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorAccent;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_colorBackgroundFloating = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorBackgroundFloating;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_colorButtonNormal = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorButtonNormal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_colorControlActivated = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorControlActivated;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_colorControlHighlight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorControlHighlight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_colorControlNormal = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorControlNormal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_colorError = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorError;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_colorPrimary = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorPrimary;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_colorPrimaryDark = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorPrimaryDark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_colorSwitchThumbNormal = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorSwitchThumbNormal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_controlBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_controlBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_dialogCornerRadius = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dialogCornerRadius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_dialogPreferredPadding = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dialogPreferredPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_dialogTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dialogTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_dividerHorizontal = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dividerHorizontal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_dividerVertical = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dividerVertical;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_dropdownListPreferredItemHeight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dropdownListPreferredItemHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_dropDownListViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dropDownListViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_editTextBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_editTextBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_editTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_editTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_editTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_editTextStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_homeAsUpIndicator = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_homeAsUpIndicator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_imageButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_imageButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_listChoiceBackgroundIndicator = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listChoiceBackgroundIndicator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_listDividerAlertDialog = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listDividerAlertDialog;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_listMenuViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listMenuViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_listPopupWindowStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listPopupWindowStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_listPreferredItemHeight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listPreferredItemHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_listPreferredItemHeightLarge = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listPreferredItemHeightLarge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_listPreferredItemHeightSmall = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listPreferredItemHeightSmall;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_listPreferredItemPaddingLeft = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listPreferredItemPaddingLeft;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_listPreferredItemPaddingRight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listPreferredItemPaddingRight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_panelBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_panelBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_panelMenuListTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_panelMenuListTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_panelMenuListWidth = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_panelMenuListWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_popupMenuStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_popupMenuStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_popupWindowStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_popupWindowStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_radioButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_radioButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_ratingBarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_ratingBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_ratingBarStyleIndicator = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_ratingBarStyleIndicator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_ratingBarStyleSmall = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_ratingBarStyleSmall;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_searchViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_searchViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_seekBarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_seekBarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_selectableItemBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_selectableItemBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_selectableItemBackgroundBorderless = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_selectableItemBackgroundBorderless;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_spinnerDropDownItemStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_spinnerDropDownItemStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_spinnerStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_spinnerStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_switchStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_switchStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_textAppearanceLargePopupMenu = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceLargePopupMenu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_textAppearanceListItem = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceListItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_textAppearanceListItemSecondary = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceListItemSecondary;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_textAppearanceListItemSmall = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceListItemSmall;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_textAppearancePopupMenuHeader = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearancePopupMenuHeader;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_textAppearanceSearchResultSubtitle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceSearchResultSubtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_textAppearanceSearchResultTitle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceSearchResultTitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_textAppearanceSmallPopupMenu = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceSmallPopupMenu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_textColorAlertDialogListItem = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textColorAlertDialogListItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_textColorSearchUrl = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textColorSearchUrl;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_toolbarNavigationButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_toolbarNavigationButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_toolbarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_toolbarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_tooltipForegroundColor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_tooltipForegroundColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_tooltipFrameBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_tooltipFrameBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_viewInflaterClass = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_viewInflaterClass;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_windowActionBar = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowActionBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_windowActionBarOverlay = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowActionBarOverlay;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_windowActionModeOverlay = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowActionModeOverlay;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_windowFixedHeightMajor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowFixedHeightMajor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_windowFixedHeightMinor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowFixedHeightMinor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_windowFixedWidthMajor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowFixedWidthMajor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_windowFixedWidthMinor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowFixedWidthMinor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_windowMinWidthMajor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowMinWidthMajor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_windowMinWidthMinor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowMinWidthMinor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.AppCompatTheme_windowNoTitle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowNoTitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomAppBar = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomAppBar_backgroundTint = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar_backgroundTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomAppBar_fabAlignmentMode = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar_fabAlignmentMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomAppBar_fabCradleMargin = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar_fabCradleMargin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomAppBar_fabCradleRoundedCornerRadius = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar_fabCradleRoundedCornerRadius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomAppBar_fabCradleVerticalOffset = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar_fabCradleVerticalOffset;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomAppBar_hideOnScroll = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar_hideOnScroll;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomNavigationView = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomNavigationView_elevation = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomNavigationView_itemBackground = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomNavigationView_itemHorizontalTranslationEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemHorizontalTranslationEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomNavigationView_itemIconSize = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemIconSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomNavigationView_itemIconTint = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemIconTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomNavigationView_itemTextAppearanceActive = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemTextAppearanceActive;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomNavigationView_itemTextAppearanceInactive = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemTextAppearanceInactive;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomNavigationView_itemTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomNavigationView_labelVisibilityMode = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_labelVisibilityMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomNavigationView_menu = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_menu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomSheetBehavior_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.BottomSheetBehavior_Layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomSheetBehavior_Layout_behavior_fitToContents = global::HelloworldXamarin.Droid.Resource.Styleable.BottomSheetBehavior_Layout_behavior_fitToContents;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomSheetBehavior_Layout_behavior_hideable = global::HelloworldXamarin.Droid.Resource.Styleable.BottomSheetBehavior_Layout_behavior_hideable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomSheetBehavior_Layout_behavior_peekHeight = global::HelloworldXamarin.Droid.Resource.Styleable.BottomSheetBehavior_Layout_behavior_peekHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.BottomSheetBehavior_Layout_behavior_skipCollapsed = global::HelloworldXamarin.Droid.Resource.Styleable.BottomSheetBehavior_Layout_behavior_skipCollapsed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ButtonBarLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ButtonBarLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ButtonBarLayout_allowStacking = global::HelloworldXamarin.Droid.Resource.Styleable.ButtonBarLayout_allowStacking;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView = global::HelloworldXamarin.Droid.Resource.Styleable.CardView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_android_minHeight = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_android_minHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_android_minWidth = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_android_minWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_cardBackgroundColor = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_cardBackgroundColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_cardCornerRadius = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_cardCornerRadius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_cardElevation = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_cardElevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_cardMaxElevation = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_cardMaxElevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_cardPreventCornerOverlap = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_cardPreventCornerOverlap;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_cardUseCompatPadding = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_cardUseCompatPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_contentPadding = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_contentPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_contentPaddingBottom = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_contentPaddingBottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_contentPaddingLeft = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_contentPaddingLeft;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_contentPaddingRight = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_contentPaddingRight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CardView_contentPaddingTop = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_contentPaddingTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip = global::HelloworldXamarin.Droid.Resource.Styleable.Chip;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ChipGroup = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ChipGroup_checkedChip = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup_checkedChip;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ChipGroup_chipSpacing = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup_chipSpacing;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ChipGroup_chipSpacingHorizontal = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup_chipSpacingHorizontal;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ChipGroup_chipSpacingVertical = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup_chipSpacingVertical;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ChipGroup_singleLine = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup_singleLine;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ChipGroup_singleSelection = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup_singleSelection;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_android_checkable = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_android_checkable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_android_ellipsize = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_android_ellipsize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_android_maxWidth = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_android_maxWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_android_text = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_android_text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_android_textAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_android_textAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_checkedIcon = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_checkedIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_checkedIconEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_checkedIconEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_checkedIconVisible = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_checkedIconVisible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_chipBackgroundColor = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipBackgroundColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_chipCornerRadius = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipCornerRadius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_chipEndPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipEndPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_chipIcon = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_chipIconEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipIconEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_chipIconSize = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipIconSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_chipIconTint = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipIconTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_chipIconVisible = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipIconVisible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_chipMinHeight = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipMinHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_chipStartPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipStartPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_chipStrokeColor = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipStrokeColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_chipStrokeWidth = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipStrokeWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_closeIcon = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_closeIconEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIconEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_closeIconEndPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIconEndPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_closeIconSize = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIconSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_closeIconStartPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIconStartPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_closeIconTint = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIconTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_closeIconVisible = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIconVisible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_hideMotionSpec = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_hideMotionSpec;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_iconEndPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_iconEndPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_iconStartPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_iconStartPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_rippleColor = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_rippleColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_showMotionSpec = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_showMotionSpec;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_textEndPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_textEndPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Chip_textStartPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_textStartPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_collapsedTitleGravity = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_collapsedTitleGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_collapsedTitleTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_collapsedTitleTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_contentScrim = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_contentScrim;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_expandedTitleGravity = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMargin = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMargin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginBottom = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginBottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginEnd = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginStart = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginTop = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_expandedTitleTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_Layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_Layout_layout_collapseMode = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_Layout_layout_collapseMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_scrimAnimationDuration = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_scrimAnimationDuration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_scrimVisibleHeightTrigger = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_scrimVisibleHeightTrigger;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_statusBarScrim = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_statusBarScrim;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_title = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_titleEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_titleEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CollapsingToolbarLayout_toolbarId = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_toolbarId;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ColorStateListItem = global::HelloworldXamarin.Droid.Resource.Styleable.ColorStateListItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ColorStateListItem_alpha = global::HelloworldXamarin.Droid.Resource.Styleable.ColorStateListItem_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ColorStateListItem_android_alpha = global::HelloworldXamarin.Droid.Resource.Styleable.ColorStateListItem_android_alpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ColorStateListItem_android_color = global::HelloworldXamarin.Droid.Resource.Styleable.ColorStateListItem_android_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CompoundButton = global::HelloworldXamarin.Droid.Resource.Styleable.CompoundButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CompoundButton_android_button = global::HelloworldXamarin.Droid.Resource.Styleable.CompoundButton_android_button;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CompoundButton_buttonTint = global::HelloworldXamarin.Droid.Resource.Styleable.CompoundButton_buttonTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CompoundButton_buttonTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.CompoundButton_buttonTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CoordinatorLayout = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CoordinatorLayout_keylines = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_keylines;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CoordinatorLayout_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CoordinatorLayout_Layout_android_layout_gravity = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_android_layout_gravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CoordinatorLayout_Layout_layout_anchor = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_anchor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CoordinatorLayout_Layout_layout_anchorGravity = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_anchorGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CoordinatorLayout_Layout_layout_behavior = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_behavior;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CoordinatorLayout_Layout_layout_dodgeInsetEdges = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_dodgeInsetEdges;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CoordinatorLayout_Layout_layout_insetEdge = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_insetEdge;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CoordinatorLayout_Layout_layout_keyline = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_keyline;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.CoordinatorLayout_statusBarBackground = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_statusBarBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.DesignTheme = global::HelloworldXamarin.Droid.Resource.Styleable.DesignTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.DesignTheme_bottomSheetDialogTheme = global::HelloworldXamarin.Droid.Resource.Styleable.DesignTheme_bottomSheetDialogTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.DesignTheme_bottomSheetStyle = global::HelloworldXamarin.Droid.Resource.Styleable.DesignTheme_bottomSheetStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.DrawerArrowToggle = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.DrawerArrowToggle_arrowHeadLength = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_arrowHeadLength;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.DrawerArrowToggle_arrowShaftLength = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_arrowShaftLength;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.DrawerArrowToggle_barLength = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_barLength;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.DrawerArrowToggle_color = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.DrawerArrowToggle_drawableSize = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_drawableSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.DrawerArrowToggle_gapBetweenBars = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_gapBetweenBars;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.DrawerArrowToggle_spinBars = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_spinBars;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.DrawerArrowToggle_thickness = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_thickness;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_backgroundTint = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_backgroundTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_backgroundTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_backgroundTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_Behavior_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_Behavior_Layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_Behavior_Layout_behavior_autoHide = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_Behavior_Layout_behavior_autoHide;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_borderWidth = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_borderWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_elevation = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_fabCustomSize = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_fabCustomSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_fabSize = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_fabSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_hideMotionSpec = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_hideMotionSpec;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_hoveredFocusedTranslationZ = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_hoveredFocusedTranslationZ;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_maxImageSize = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_maxImageSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_pressedTranslationZ = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_pressedTranslationZ;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_rippleColor = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_rippleColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_showMotionSpec = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_showMotionSpec;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FloatingActionButton_useCompatPadding = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_useCompatPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FlowLayout = global::HelloworldXamarin.Droid.Resource.Styleable.FlowLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FlowLayout_itemSpacing = global::HelloworldXamarin.Droid.Resource.Styleable.FlowLayout_itemSpacing;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FlowLayout_lineSpacing = global::HelloworldXamarin.Droid.Resource.Styleable.FlowLayout_lineSpacing;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamily = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamilyFont = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamilyFont_android_font = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_font;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamilyFont_android_fontStyle = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_fontStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamilyFont_android_fontVariationSettings = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_fontVariationSettings;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamilyFont_android_fontWeight = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_fontWeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamilyFont_android_ttcIndex = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_ttcIndex;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamilyFont_font = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_font;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamilyFont_fontStyle = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_fontStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamilyFont_fontVariationSettings = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_fontVariationSettings;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamilyFont_fontWeight = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_fontWeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamilyFont_ttcIndex = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_ttcIndex;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamily_fontProviderAuthority = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderAuthority;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamily_fontProviderCerts = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderCerts;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamily_fontProviderFetchStrategy = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderFetchStrategy;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamily_fontProviderFetchTimeout = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderFetchTimeout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamily_fontProviderPackage = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderPackage;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.FontFamily_fontProviderQuery = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderQuery;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ForegroundLinearLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ForegroundLinearLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ForegroundLinearLayout_android_foreground = global::HelloworldXamarin.Droid.Resource.Styleable.ForegroundLinearLayout_android_foreground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ForegroundLinearLayout_android_foregroundGravity = global::HelloworldXamarin.Droid.Resource.Styleable.ForegroundLinearLayout_android_foregroundGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ForegroundLinearLayout_foregroundInsidePadding = global::HelloworldXamarin.Droid.Resource.Styleable.ForegroundLinearLayout_foregroundInsidePadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColorItem = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColorItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColorItem_android_color = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColorItem_android_color;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColorItem_android_offset = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColorItem_android_offset;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor_android_centerColor = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_centerColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor_android_centerX = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_centerX;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor_android_centerY = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_centerY;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor_android_endColor = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_endColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor_android_endX = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_endX;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor_android_endY = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_endY;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor_android_gradientRadius = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_gradientRadius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor_android_startColor = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_startColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor_android_startX = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_startX;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor_android_startY = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_startY;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor_android_tileMode = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_tileMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.GradientColor_android_type = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_type;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_android_baselineAligned = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_android_baselineAligned;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_android_baselineAlignedChildIndex = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_android_baselineAlignedChildIndex;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_android_gravity = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_android_gravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_android_orientation = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_android_orientation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_android_weightSum = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_android_weightSum;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_divider = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_divider;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_dividerPadding = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_dividerPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_Layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_gravity = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_gravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_height = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_height;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_weight = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_weight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_width = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_width;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_measureWithLargestChild = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_measureWithLargestChild;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.LinearLayoutCompat_showDividers = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_showDividers;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ListPopupWindow = global::HelloworldXamarin.Droid.Resource.Styleable.ListPopupWindow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ListPopupWindow_android_dropDownHorizontalOffset = global::HelloworldXamarin.Droid.Resource.Styleable.ListPopupWindow_android_dropDownHorizontalOffset;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ListPopupWindow_android_dropDownVerticalOffset = global::HelloworldXamarin.Droid.Resource.Styleable.ListPopupWindow_android_dropDownVerticalOffset;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_android_insetBottom = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_android_insetBottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_android_insetLeft = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_android_insetLeft;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_android_insetRight = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_android_insetRight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_android_insetTop = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_android_insetTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_backgroundTint = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_backgroundTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_backgroundTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_backgroundTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_cornerRadius = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_cornerRadius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_icon = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_iconGravity = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_iconGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_iconPadding = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_iconPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_iconSize = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_iconSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_iconTint = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_iconTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_iconTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_iconTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_rippleColor = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_rippleColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_strokeColor = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_strokeColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialButton_strokeWidth = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_strokeWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialCardView = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialCardView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialCardView_strokeColor = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialCardView_strokeColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialCardView_strokeWidth = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialCardView_strokeWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_bottomSheetDialogTheme = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_bottomSheetDialogTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_bottomSheetStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_bottomSheetStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_chipGroupStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_chipGroupStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_chipStandaloneStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_chipStandaloneStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_chipStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_chipStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_colorAccent = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_colorAccent;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_colorBackgroundFloating = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_colorBackgroundFloating;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_colorPrimary = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_colorPrimary;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_colorPrimaryDark = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_colorPrimaryDark;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_colorSecondary = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_colorSecondary;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_editTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_editTextStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_floatingActionButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_floatingActionButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_materialButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_materialButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_materialCardViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_materialCardViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_navigationViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_navigationViewStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_scrimBackground = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_scrimBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_snackbarButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_snackbarButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_tabStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_tabStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceBody1 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceBody1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceBody2 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceBody2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceButton = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceButton;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceCaption = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceCaption;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline1 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline2 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline3 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline3;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline4 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline4;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline5 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline5;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline6 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline6;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceOverline = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceOverline;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceSubtitle1 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceSubtitle1;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textAppearanceSubtitle2 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceSubtitle2;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MaterialComponentsTheme_textInputStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textInputStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuGroup = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuGroup_android_checkableBehavior = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup_android_checkableBehavior;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuGroup_android_enabled = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup_android_enabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuGroup_android_id = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup_android_id;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuGroup_android_menuCategory = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup_android_menuCategory;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuGroup_android_orderInCategory = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup_android_orderInCategory;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuGroup_android_visible = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup_android_visible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_actionLayout = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_actionLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_actionProviderClass = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_actionProviderClass;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_actionViewClass = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_actionViewClass;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_alphabeticModifiers = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_alphabeticModifiers;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_alphabeticShortcut = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_alphabeticShortcut;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_checkable = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_checkable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_checked = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_checked;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_enabled = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_enabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_icon = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_id = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_id;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_menuCategory = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_menuCategory;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_numericShortcut = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_numericShortcut;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_onClick = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_onClick;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_orderInCategory = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_orderInCategory;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_title = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_titleCondensed = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_titleCondensed;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_android_visible = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_visible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_contentDescription = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_contentDescription;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_iconTint = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_iconTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_iconTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_iconTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_numericModifiers = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_numericModifiers;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_showAsAction = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_showAsAction;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuItem_tooltipText = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_tooltipText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuView = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuView_android_headerBackground = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_headerBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuView_android_horizontalDivider = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_horizontalDivider;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuView_android_itemBackground = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_itemBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuView_android_itemIconDisabledAlpha = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_itemIconDisabledAlpha;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuView_android_itemTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_itemTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuView_android_verticalDivider = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_verticalDivider;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuView_android_windowAnimationStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_windowAnimationStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuView_preserveIconSpacing = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_preserveIconSpacing;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.MenuView_subMenuArrow = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_subMenuArrow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView_android_background = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_android_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView_android_fitsSystemWindows = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_android_fitsSystemWindows;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView_android_maxWidth = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_android_maxWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView_elevation = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView_headerLayout = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_headerLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView_itemBackground = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_itemBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView_itemHorizontalPadding = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_itemHorizontalPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView_itemIconPadding = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_itemIconPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView_itemIconTint = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_itemIconTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView_itemTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_itemTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView_itemTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_itemTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.NavigationView_menu = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_menu;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.PopupWindow = global::HelloworldXamarin.Droid.Resource.Styleable.PopupWindow;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.PopupWindowBackgroundState = global::HelloworldXamarin.Droid.Resource.Styleable.PopupWindowBackgroundState;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.PopupWindowBackgroundState_state_above_anchor = global::HelloworldXamarin.Droid.Resource.Styleable.PopupWindowBackgroundState_state_above_anchor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.PopupWindow_android_popupAnimationStyle = global::HelloworldXamarin.Droid.Resource.Styleable.PopupWindow_android_popupAnimationStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.PopupWindow_android_popupBackground = global::HelloworldXamarin.Droid.Resource.Styleable.PopupWindow_android_popupBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.PopupWindow_overlapAnchor = global::HelloworldXamarin.Droid.Resource.Styleable.PopupWindow_overlapAnchor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecycleListView = global::HelloworldXamarin.Droid.Resource.Styleable.RecycleListView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecycleListView_paddingBottomNoButtons = global::HelloworldXamarin.Droid.Resource.Styleable.RecycleListView_paddingBottomNoButtons;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecycleListView_paddingTopNoTitle = global::HelloworldXamarin.Droid.Resource.Styleable.RecycleListView_paddingTopNoTitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecyclerView = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecyclerView_android_descendantFocusability = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_android_descendantFocusability;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecyclerView_android_orientation = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_android_orientation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecyclerView_fastScrollEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_fastScrollEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecyclerView_fastScrollHorizontalThumbDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_fastScrollHorizontalThumbDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecyclerView_fastScrollHorizontalTrackDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_fastScrollHorizontalTrackDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecyclerView_fastScrollVerticalThumbDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_fastScrollVerticalThumbDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecyclerView_fastScrollVerticalTrackDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_fastScrollVerticalTrackDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecyclerView_layoutManager = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_layoutManager;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecyclerView_reverseLayout = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_reverseLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecyclerView_spanCount = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_spanCount;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.RecyclerView_stackFromEnd = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_stackFromEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ScrimInsetsFrameLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ScrimInsetsFrameLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ScrimInsetsFrameLayout_insetForeground = global::HelloworldXamarin.Droid.Resource.Styleable.ScrimInsetsFrameLayout_insetForeground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ScrollingViewBehavior_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.ScrollingViewBehavior_Layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ScrollingViewBehavior_Layout_behavior_overlapTop = global::HelloworldXamarin.Droid.Resource.Styleable.ScrollingViewBehavior_Layout_behavior_overlapTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_android_focusable = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_android_focusable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_android_imeOptions = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_android_imeOptions;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_android_inputType = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_android_inputType;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_android_maxWidth = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_android_maxWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_closeIcon = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_closeIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_commitIcon = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_commitIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_defaultQueryHint = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_defaultQueryHint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_goIcon = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_goIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_iconifiedByDefault = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_iconifiedByDefault;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_layout = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_queryBackground = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_queryBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_queryHint = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_queryHint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_searchHintIcon = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_searchHintIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_searchIcon = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_searchIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_submitBackground = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_submitBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_suggestionRowLayout = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_suggestionRowLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SearchView_voiceIcon = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_voiceIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Snackbar = global::HelloworldXamarin.Droid.Resource.Styleable.Snackbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SnackbarLayout = global::HelloworldXamarin.Droid.Resource.Styleable.SnackbarLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SnackbarLayout_android_maxWidth = global::HelloworldXamarin.Droid.Resource.Styleable.SnackbarLayout_android_maxWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SnackbarLayout_elevation = global::HelloworldXamarin.Droid.Resource.Styleable.SnackbarLayout_elevation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SnackbarLayout_maxActionInlineWidth = global::HelloworldXamarin.Droid.Resource.Styleable.SnackbarLayout_maxActionInlineWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Snackbar_snackbarButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.Snackbar_snackbarButtonStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Snackbar_snackbarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.Snackbar_snackbarStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Spinner = global::HelloworldXamarin.Droid.Resource.Styleable.Spinner;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Spinner_android_dropDownWidth = global::HelloworldXamarin.Droid.Resource.Styleable.Spinner_android_dropDownWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Spinner_android_entries = global::HelloworldXamarin.Droid.Resource.Styleable.Spinner_android_entries;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Spinner_android_popupBackground = global::HelloworldXamarin.Droid.Resource.Styleable.Spinner_android_popupBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Spinner_android_prompt = global::HelloworldXamarin.Droid.Resource.Styleable.Spinner_android_prompt;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Spinner_popupTheme = global::HelloworldXamarin.Droid.Resource.Styleable.Spinner_popupTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.StateListDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.StateListDrawableItem = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawableItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.StateListDrawableItem_android_drawable = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawableItem_android_drawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.StateListDrawable_android_constantSize = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable_android_constantSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.StateListDrawable_android_dither = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable_android_dither;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.StateListDrawable_android_enterFadeDuration = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable_android_enterFadeDuration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.StateListDrawable_android_exitFadeDuration = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable_android_exitFadeDuration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.StateListDrawable_android_variablePadding = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable_android_variablePadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.StateListDrawable_android_visible = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable_android_visible;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_android_textOff = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_android_textOff;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_android_textOn = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_android_textOn;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_android_thumb = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_android_thumb;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_showText = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_showText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_splitTrack = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_splitTrack;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_switchMinWidth = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_switchMinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_switchPadding = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_switchPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_switchTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_switchTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_thumbTextPadding = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_thumbTextPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_thumbTint = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_thumbTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_thumbTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_thumbTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_track = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_track;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_trackTint = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_trackTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.SwitchCompat_trackTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_trackTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabItem = global::HelloworldXamarin.Droid.Resource.Styleable.TabItem;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabItem_android_icon = global::HelloworldXamarin.Droid.Resource.Styleable.TabItem_android_icon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabItem_android_layout = global::HelloworldXamarin.Droid.Resource.Styleable.TabItem_android_layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabItem_android_text = global::HelloworldXamarin.Droid.Resource.Styleable.TabItem_android_text;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabBackground = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabBackground;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabContentStart = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabContentStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabGravity = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabIconTint = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIconTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabIconTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIconTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabIndicator = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIndicator;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabIndicatorAnimationDuration = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIndicatorAnimationDuration;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabIndicatorColor = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIndicatorColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabIndicatorFullWidth = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIndicatorFullWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabIndicatorGravity = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIndicatorGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabIndicatorHeight = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIndicatorHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabInlineLabel = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabInlineLabel;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabMaxWidth = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabMaxWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabMinWidth = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabMinWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabMode = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabPadding = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabPadding;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabPaddingBottom = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabPaddingBottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabPaddingEnd = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabPaddingEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabPaddingStart = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabPaddingStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabPaddingTop = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabPaddingTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabRippleColor = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabRippleColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabSelectedTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabSelectedTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TabLayout_tabUnboundedRipple = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabUnboundedRipple;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_android_fontFamily = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_fontFamily;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_android_shadowColor = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_shadowColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_android_shadowDx = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_shadowDx;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_android_shadowDy = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_shadowDy;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_android_shadowRadius = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_shadowRadius;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_android_textColor = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_textColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_android_textColorHint = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_textColorHint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_android_textColorLink = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_textColorLink;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_android_textSize = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_textSize;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_android_textStyle = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_textStyle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_android_typeface = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_typeface;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_fontFamily = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_fontFamily;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextAppearance_textAllCaps = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_textAllCaps;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_android_hint = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_android_hint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_android_textColorHint = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_android_textColorHint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_boxBackgroundColor = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxBackgroundColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_boxBackgroundMode = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxBackgroundMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_boxCollapsedPaddingTop = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxCollapsedPaddingTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_boxCornerRadiusBottomEnd = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxCornerRadiusBottomEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_boxCornerRadiusBottomStart = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxCornerRadiusBottomStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_boxCornerRadiusTopEnd = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxCornerRadiusTopEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_boxCornerRadiusTopStart = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxCornerRadiusTopStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_boxStrokeColor = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxStrokeColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_boxStrokeWidth = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxStrokeWidth;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_counterEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_counterEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_counterMaxLength = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_counterMaxLength;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_counterOverflowTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_counterOverflowTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_counterTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_counterTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_errorEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_errorEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_errorTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_errorTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_helperText = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_helperText;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_helperTextEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_helperTextEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_helperTextTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_helperTextTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_hintAnimationEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_hintAnimationEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_hintEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_hintEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_hintTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_hintTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_passwordToggleContentDescription = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_passwordToggleContentDescription;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_passwordToggleDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_passwordToggleDrawable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_passwordToggleEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_passwordToggleEnabled;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_passwordToggleTint = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_passwordToggleTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.TextInputLayout_passwordToggleTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_passwordToggleTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ThemeEnforcement = global::HelloworldXamarin.Droid.Resource.Styleable.ThemeEnforcement;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ThemeEnforcement_android_textAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.ThemeEnforcement_android_textAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ThemeEnforcement_enforceMaterialTheme = global::HelloworldXamarin.Droid.Resource.Styleable.ThemeEnforcement_enforceMaterialTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ThemeEnforcement_enforceTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.ThemeEnforcement_enforceTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_android_gravity = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_android_gravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_android_minHeight = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_android_minHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_buttonGravity = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_buttonGravity;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_collapseContentDescription = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_collapseContentDescription;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_collapseIcon = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_collapseIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_contentInsetEnd = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_contentInsetEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_contentInsetEndWithActions = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_contentInsetEndWithActions;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_contentInsetLeft = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_contentInsetLeft;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_contentInsetRight = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_contentInsetRight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_contentInsetStart = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_contentInsetStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_contentInsetStartWithNavigation = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_contentInsetStartWithNavigation;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_logo = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_logo;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_logoDescription = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_logoDescription;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_maxButtonHeight = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_maxButtonHeight;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_navigationContentDescription = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_navigationContentDescription;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_navigationIcon = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_navigationIcon;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_popupTheme = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_popupTheme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_subtitle = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_subtitle;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_subtitleTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_subtitleTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_subtitleTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_subtitleTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_title = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_title;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_titleMargin = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleMargin;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_titleMarginBottom = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleMarginBottom;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_titleMarginEnd = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleMarginEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_titleMargins = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleMargins;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_titleMarginStart = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleMarginStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_titleMarginTop = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleMarginTop;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_titleTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleTextAppearance;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.Toolbar_titleTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleTextColor;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.View = global::HelloworldXamarin.Droid.Resource.Styleable.View;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ViewBackgroundHelper = global::HelloworldXamarin.Droid.Resource.Styleable.ViewBackgroundHelper;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ViewBackgroundHelper_android_background = global::HelloworldXamarin.Droid.Resource.Styleable.ViewBackgroundHelper_android_background;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ViewBackgroundHelper_backgroundTint = global::HelloworldXamarin.Droid.Resource.Styleable.ViewBackgroundHelper_backgroundTint;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ViewBackgroundHelper_backgroundTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.ViewBackgroundHelper_backgroundTintMode;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ViewStubCompat = global::HelloworldXamarin.Droid.Resource.Styleable.ViewStubCompat;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ViewStubCompat_android_id = global::HelloworldXamarin.Droid.Resource.Styleable.ViewStubCompat_android_id;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ViewStubCompat_android_inflatedId = global::HelloworldXamarin.Droid.Resource.Styleable.ViewStubCompat_android_inflatedId;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.ViewStubCompat_android_layout = global::HelloworldXamarin.Droid.Resource.Styleable.ViewStubCompat_android_layout;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.View_android_focusable = global::HelloworldXamarin.Droid.Resource.Styleable.View_android_focusable;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.View_android_theme = global::HelloworldXamarin.Droid.Resource.Styleable.View_android_theme;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.View_paddingEnd = global::HelloworldXamarin.Droid.Resource.Styleable.View_paddingEnd;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.View_paddingStart = global::HelloworldXamarin.Droid.Resource.Styleable.View_paddingStart;
+                       global::Xamarin.Forms.Platform.Android.Resource.Styleable.View_theme = global::HelloworldXamarin.Droid.Resource.Styleable.View_theme;
+                       global::Xamarin.Forms.Platform.Resource.Animation.abc_fade_in = global::HelloworldXamarin.Droid.Resource.Animation.abc_fade_in;
+                       global::Xamarin.Forms.Platform.Resource.Animation.abc_fade_out = global::HelloworldXamarin.Droid.Resource.Animation.abc_fade_out;
+                       global::Xamarin.Forms.Platform.Resource.Animation.abc_grow_fade_in_from_bottom = global::HelloworldXamarin.Droid.Resource.Animation.abc_grow_fade_in_from_bottom;
+                       global::Xamarin.Forms.Platform.Resource.Animation.abc_popup_enter = global::HelloworldXamarin.Droid.Resource.Animation.abc_popup_enter;
+                       global::Xamarin.Forms.Platform.Resource.Animation.abc_popup_exit = global::HelloworldXamarin.Droid.Resource.Animation.abc_popup_exit;
+                       global::Xamarin.Forms.Platform.Resource.Animation.abc_shrink_fade_out_from_bottom = global::HelloworldXamarin.Droid.Resource.Animation.abc_shrink_fade_out_from_bottom;
+                       global::Xamarin.Forms.Platform.Resource.Animation.abc_slide_in_bottom = global::HelloworldXamarin.Droid.Resource.Animation.abc_slide_in_bottom;
+                       global::Xamarin.Forms.Platform.Resource.Animation.abc_slide_in_top = global::HelloworldXamarin.Droid.Resource.Animation.abc_slide_in_top;
+                       global::Xamarin.Forms.Platform.Resource.Animation.abc_slide_out_bottom = global::HelloworldXamarin.Droid.Resource.Animation.abc_slide_out_bottom;
+                       global::Xamarin.Forms.Platform.Resource.Animation.abc_slide_out_top = global::HelloworldXamarin.Droid.Resource.Animation.abc_slide_out_top;
+                       global::Xamarin.Forms.Platform.Resource.Animation.abc_tooltip_enter = global::HelloworldXamarin.Droid.Resource.Animation.abc_tooltip_enter;
+                       global::Xamarin.Forms.Platform.Resource.Animation.abc_tooltip_exit = global::HelloworldXamarin.Droid.Resource.Animation.abc_tooltip_exit;
+                       global::Xamarin.Forms.Platform.Resource.Animation.design_bottom_sheet_slide_in = global::HelloworldXamarin.Droid.Resource.Animation.design_bottom_sheet_slide_in;
+                       global::Xamarin.Forms.Platform.Resource.Animation.design_bottom_sheet_slide_out = global::HelloworldXamarin.Droid.Resource.Animation.design_bottom_sheet_slide_out;
+                       global::Xamarin.Forms.Platform.Resource.Animation.design_snackbar_in = global::HelloworldXamarin.Droid.Resource.Animation.design_snackbar_in;
+                       global::Xamarin.Forms.Platform.Resource.Animation.design_snackbar_out = global::HelloworldXamarin.Droid.Resource.Animation.design_snackbar_out;
+                       global::Xamarin.Forms.Platform.Resource.Animation.EnterFromLeft = global::HelloworldXamarin.Droid.Resource.Animation.EnterFromLeft;
+                       global::Xamarin.Forms.Platform.Resource.Animation.EnterFromRight = global::HelloworldXamarin.Droid.Resource.Animation.EnterFromRight;
+                       global::Xamarin.Forms.Platform.Resource.Animation.ExitToLeft = global::HelloworldXamarin.Droid.Resource.Animation.ExitToLeft;
+                       global::Xamarin.Forms.Platform.Resource.Animation.ExitToRight = global::HelloworldXamarin.Droid.Resource.Animation.ExitToRight;
+                       global::Xamarin.Forms.Platform.Resource.Animator.design_appbar_state_list_animator = global::HelloworldXamarin.Droid.Resource.Animator.design_appbar_state_list_animator;
+                       global::Xamarin.Forms.Platform.Resource.Animator.design_fab_hide_motion_spec = global::HelloworldXamarin.Droid.Resource.Animator.design_fab_hide_motion_spec;
+                       global::Xamarin.Forms.Platform.Resource.Animator.design_fab_show_motion_spec = global::HelloworldXamarin.Droid.Resource.Animator.design_fab_show_motion_spec;
+                       global::Xamarin.Forms.Platform.Resource.Animator.mtrl_btn_state_list_anim = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_btn_state_list_anim;
+                       global::Xamarin.Forms.Platform.Resource.Animator.mtrl_btn_unelevated_state_list_anim = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_btn_unelevated_state_list_anim;
+                       global::Xamarin.Forms.Platform.Resource.Animator.mtrl_chip_state_list_anim = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_chip_state_list_anim;
+                       global::Xamarin.Forms.Platform.Resource.Animator.mtrl_fab_hide_motion_spec = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_fab_hide_motion_spec;
+                       global::Xamarin.Forms.Platform.Resource.Animator.mtrl_fab_show_motion_spec = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_fab_show_motion_spec;
+                       global::Xamarin.Forms.Platform.Resource.Animator.mtrl_fab_transformation_sheet_collapse_spec = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_fab_transformation_sheet_collapse_spec;
+                       global::Xamarin.Forms.Platform.Resource.Animator.mtrl_fab_transformation_sheet_expand_spec = global::HelloworldXamarin.Droid.Resource.Animator.mtrl_fab_transformation_sheet_expand_spec;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionBarDivider = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarDivider;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionBarItemBackground = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarItemBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionBarPopupTheme = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarPopupTheme;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionBarSize = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarSize;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionBarSplitStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarSplitStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionBarTabBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarTabBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionBarTabStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarTabStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionBarTabTextStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarTabTextStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionBarTheme = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarTheme;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionBarWidgetTheme = global::HelloworldXamarin.Droid.Resource.Attribute.actionBarWidgetTheme;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionDropDownStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionDropDownStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionLayout = global::HelloworldXamarin.Droid.Resource.Attribute.actionLayout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionMenuTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.actionMenuTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionMenuTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.actionMenuTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModeBackground = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModeCloseButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeCloseButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModeCloseDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeCloseDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModeCopyDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeCopyDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModeCutDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeCutDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModeFindDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeFindDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModePasteDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModePasteDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModePopupWindowStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionModePopupWindowStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModeSelectAllDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeSelectAllDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModeShareDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeShareDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModeSplitBackground = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeSplitBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModeStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionModeWebSearchDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.actionModeWebSearchDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionOverflowButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionOverflowButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionOverflowMenuStyle = global::HelloworldXamarin.Droid.Resource.Attribute.actionOverflowMenuStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionProviderClass = global::HelloworldXamarin.Droid.Resource.Attribute.actionProviderClass;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.actionViewClass = global::HelloworldXamarin.Droid.Resource.Attribute.actionViewClass;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.activityChooserViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.activityChooserViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.alertDialogButtonGroupStyle = global::HelloworldXamarin.Droid.Resource.Attribute.alertDialogButtonGroupStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.alertDialogCenterButtons = global::HelloworldXamarin.Droid.Resource.Attribute.alertDialogCenterButtons;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.alertDialogStyle = global::HelloworldXamarin.Droid.Resource.Attribute.alertDialogStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.alertDialogTheme = global::HelloworldXamarin.Droid.Resource.Attribute.alertDialogTheme;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.allowStacking = global::HelloworldXamarin.Droid.Resource.Attribute.allowStacking;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.alpha = global::HelloworldXamarin.Droid.Resource.Attribute.alpha;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.alphabeticModifiers = global::HelloworldXamarin.Droid.Resource.Attribute.alphabeticModifiers;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.arrowHeadLength = global::HelloworldXamarin.Droid.Resource.Attribute.arrowHeadLength;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.arrowShaftLength = global::HelloworldXamarin.Droid.Resource.Attribute.arrowShaftLength;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.autoCompleteTextViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.autoCompleteTextViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.autoSizeMaxTextSize = global::HelloworldXamarin.Droid.Resource.Attribute.autoSizeMaxTextSize;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.autoSizeMinTextSize = global::HelloworldXamarin.Droid.Resource.Attribute.autoSizeMinTextSize;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.autoSizePresetSizes = global::HelloworldXamarin.Droid.Resource.Attribute.autoSizePresetSizes;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.autoSizeStepGranularity = global::HelloworldXamarin.Droid.Resource.Attribute.autoSizeStepGranularity;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.autoSizeTextType = global::HelloworldXamarin.Droid.Resource.Attribute.autoSizeTextType;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.background = global::HelloworldXamarin.Droid.Resource.Attribute.background;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.backgroundSplit = global::HelloworldXamarin.Droid.Resource.Attribute.backgroundSplit;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.backgroundStacked = global::HelloworldXamarin.Droid.Resource.Attribute.backgroundStacked;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.backgroundTint = global::HelloworldXamarin.Droid.Resource.Attribute.backgroundTint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.backgroundTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.backgroundTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.barLength = global::HelloworldXamarin.Droid.Resource.Attribute.barLength;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.behavior_autoHide = global::HelloworldXamarin.Droid.Resource.Attribute.behavior_autoHide;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.behavior_fitToContents = global::HelloworldXamarin.Droid.Resource.Attribute.behavior_fitToContents;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.behavior_hideable = global::HelloworldXamarin.Droid.Resource.Attribute.behavior_hideable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.behavior_overlapTop = global::HelloworldXamarin.Droid.Resource.Attribute.behavior_overlapTop;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.behavior_peekHeight = global::HelloworldXamarin.Droid.Resource.Attribute.behavior_peekHeight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.behavior_skipCollapsed = global::HelloworldXamarin.Droid.Resource.Attribute.behavior_skipCollapsed;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.borderlessButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.borderlessButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.borderWidth = global::HelloworldXamarin.Droid.Resource.Attribute.borderWidth;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.bottomAppBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.bottomAppBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.bottomNavigationStyle = global::HelloworldXamarin.Droid.Resource.Attribute.bottomNavigationStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.bottomSheetDialogTheme = global::HelloworldXamarin.Droid.Resource.Attribute.bottomSheetDialogTheme;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.bottomSheetStyle = global::HelloworldXamarin.Droid.Resource.Attribute.bottomSheetStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.boxBackgroundColor = global::HelloworldXamarin.Droid.Resource.Attribute.boxBackgroundColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.boxBackgroundMode = global::HelloworldXamarin.Droid.Resource.Attribute.boxBackgroundMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.boxCollapsedPaddingTop = global::HelloworldXamarin.Droid.Resource.Attribute.boxCollapsedPaddingTop;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.boxCornerRadiusBottomEnd = global::HelloworldXamarin.Droid.Resource.Attribute.boxCornerRadiusBottomEnd;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.boxCornerRadiusBottomStart = global::HelloworldXamarin.Droid.Resource.Attribute.boxCornerRadiusBottomStart;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.boxCornerRadiusTopEnd = global::HelloworldXamarin.Droid.Resource.Attribute.boxCornerRadiusTopEnd;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.boxCornerRadiusTopStart = global::HelloworldXamarin.Droid.Resource.Attribute.boxCornerRadiusTopStart;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.boxStrokeColor = global::HelloworldXamarin.Droid.Resource.Attribute.boxStrokeColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.boxStrokeWidth = global::HelloworldXamarin.Droid.Resource.Attribute.boxStrokeWidth;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.buttonBarButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.buttonBarButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.buttonBarNegativeButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.buttonBarNegativeButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.buttonBarNeutralButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.buttonBarNeutralButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.buttonBarPositiveButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.buttonBarPositiveButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.buttonBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.buttonBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.buttonGravity = global::HelloworldXamarin.Droid.Resource.Attribute.buttonGravity;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.buttonIconDimen = global::HelloworldXamarin.Droid.Resource.Attribute.buttonIconDimen;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.buttonPanelSideLayout = global::HelloworldXamarin.Droid.Resource.Attribute.buttonPanelSideLayout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.buttonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.buttonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.buttonStyleSmall = global::HelloworldXamarin.Droid.Resource.Attribute.buttonStyleSmall;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.buttonTint = global::HelloworldXamarin.Droid.Resource.Attribute.buttonTint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.buttonTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.buttonTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.cardBackgroundColor = global::HelloworldXamarin.Droid.Resource.Attribute.cardBackgroundColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.cardCornerRadius = global::HelloworldXamarin.Droid.Resource.Attribute.cardCornerRadius;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.cardElevation = global::HelloworldXamarin.Droid.Resource.Attribute.cardElevation;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.cardMaxElevation = global::HelloworldXamarin.Droid.Resource.Attribute.cardMaxElevation;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.cardPreventCornerOverlap = global::HelloworldXamarin.Droid.Resource.Attribute.cardPreventCornerOverlap;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.cardUseCompatPadding = global::HelloworldXamarin.Droid.Resource.Attribute.cardUseCompatPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.cardViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.cardViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.checkboxStyle = global::HelloworldXamarin.Droid.Resource.Attribute.checkboxStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.checkedChip = global::HelloworldXamarin.Droid.Resource.Attribute.checkedChip;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.checkedIcon = global::HelloworldXamarin.Droid.Resource.Attribute.checkedIcon;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.checkedIconEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.checkedIconEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.checkedIconVisible = global::HelloworldXamarin.Droid.Resource.Attribute.checkedIconVisible;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.checkedTextViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.checkedTextViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipBackgroundColor = global::HelloworldXamarin.Droid.Resource.Attribute.chipBackgroundColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipCornerRadius = global::HelloworldXamarin.Droid.Resource.Attribute.chipCornerRadius;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipEndPadding = global::HelloworldXamarin.Droid.Resource.Attribute.chipEndPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipGroupStyle = global::HelloworldXamarin.Droid.Resource.Attribute.chipGroupStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipIcon = global::HelloworldXamarin.Droid.Resource.Attribute.chipIcon;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipIconEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.chipIconEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipIconSize = global::HelloworldXamarin.Droid.Resource.Attribute.chipIconSize;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipIconTint = global::HelloworldXamarin.Droid.Resource.Attribute.chipIconTint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipIconVisible = global::HelloworldXamarin.Droid.Resource.Attribute.chipIconVisible;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipMinHeight = global::HelloworldXamarin.Droid.Resource.Attribute.chipMinHeight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipSpacing = global::HelloworldXamarin.Droid.Resource.Attribute.chipSpacing;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipSpacingHorizontal = global::HelloworldXamarin.Droid.Resource.Attribute.chipSpacingHorizontal;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipSpacingVertical = global::HelloworldXamarin.Droid.Resource.Attribute.chipSpacingVertical;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipStandaloneStyle = global::HelloworldXamarin.Droid.Resource.Attribute.chipStandaloneStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipStartPadding = global::HelloworldXamarin.Droid.Resource.Attribute.chipStartPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipStrokeColor = global::HelloworldXamarin.Droid.Resource.Attribute.chipStrokeColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipStrokeWidth = global::HelloworldXamarin.Droid.Resource.Attribute.chipStrokeWidth;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.chipStyle = global::HelloworldXamarin.Droid.Resource.Attribute.chipStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.closeIcon = global::HelloworldXamarin.Droid.Resource.Attribute.closeIcon;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.closeIconEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.closeIconEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.closeIconEndPadding = global::HelloworldXamarin.Droid.Resource.Attribute.closeIconEndPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.closeIconSize = global::HelloworldXamarin.Droid.Resource.Attribute.closeIconSize;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.closeIconStartPadding = global::HelloworldXamarin.Droid.Resource.Attribute.closeIconStartPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.closeIconTint = global::HelloworldXamarin.Droid.Resource.Attribute.closeIconTint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.closeIconVisible = global::HelloworldXamarin.Droid.Resource.Attribute.closeIconVisible;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.closeItemLayout = global::HelloworldXamarin.Droid.Resource.Attribute.closeItemLayout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.collapseContentDescription = global::HelloworldXamarin.Droid.Resource.Attribute.collapseContentDescription;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.collapsedTitleGravity = global::HelloworldXamarin.Droid.Resource.Attribute.collapsedTitleGravity;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.collapsedTitleTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.collapsedTitleTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.collapseIcon = global::HelloworldXamarin.Droid.Resource.Attribute.collapseIcon;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.color = global::HelloworldXamarin.Droid.Resource.Attribute.color;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.colorAccent = global::HelloworldXamarin.Droid.Resource.Attribute.colorAccent;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.colorBackgroundFloating = global::HelloworldXamarin.Droid.Resource.Attribute.colorBackgroundFloating;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.colorButtonNormal = global::HelloworldXamarin.Droid.Resource.Attribute.colorButtonNormal;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.colorControlActivated = global::HelloworldXamarin.Droid.Resource.Attribute.colorControlActivated;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.colorControlHighlight = global::HelloworldXamarin.Droid.Resource.Attribute.colorControlHighlight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.colorControlNormal = global::HelloworldXamarin.Droid.Resource.Attribute.colorControlNormal;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.colorError = global::HelloworldXamarin.Droid.Resource.Attribute.colorError;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.colorPrimary = global::HelloworldXamarin.Droid.Resource.Attribute.colorPrimary;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.colorPrimaryDark = global::HelloworldXamarin.Droid.Resource.Attribute.colorPrimaryDark;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.colorSecondary = global::HelloworldXamarin.Droid.Resource.Attribute.colorSecondary;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.colorSwitchThumbNormal = global::HelloworldXamarin.Droid.Resource.Attribute.colorSwitchThumbNormal;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.commitIcon = global::HelloworldXamarin.Droid.Resource.Attribute.commitIcon;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentDescription = global::HelloworldXamarin.Droid.Resource.Attribute.contentDescription;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentInsetEnd = global::HelloworldXamarin.Droid.Resource.Attribute.contentInsetEnd;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentInsetEndWithActions = global::HelloworldXamarin.Droid.Resource.Attribute.contentInsetEndWithActions;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentInsetLeft = global::HelloworldXamarin.Droid.Resource.Attribute.contentInsetLeft;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentInsetRight = global::HelloworldXamarin.Droid.Resource.Attribute.contentInsetRight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentInsetStart = global::HelloworldXamarin.Droid.Resource.Attribute.contentInsetStart;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentInsetStartWithNavigation = global::HelloworldXamarin.Droid.Resource.Attribute.contentInsetStartWithNavigation;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentPadding = global::HelloworldXamarin.Droid.Resource.Attribute.contentPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentPaddingBottom = global::HelloworldXamarin.Droid.Resource.Attribute.contentPaddingBottom;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentPaddingLeft = global::HelloworldXamarin.Droid.Resource.Attribute.contentPaddingLeft;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentPaddingRight = global::HelloworldXamarin.Droid.Resource.Attribute.contentPaddingRight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentPaddingTop = global::HelloworldXamarin.Droid.Resource.Attribute.contentPaddingTop;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.contentScrim = global::HelloworldXamarin.Droid.Resource.Attribute.contentScrim;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.controlBackground = global::HelloworldXamarin.Droid.Resource.Attribute.controlBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.coordinatorLayoutStyle = global::HelloworldXamarin.Droid.Resource.Attribute.coordinatorLayoutStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.cornerRadius = global::HelloworldXamarin.Droid.Resource.Attribute.cornerRadius;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.counterEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.counterEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.counterMaxLength = global::HelloworldXamarin.Droid.Resource.Attribute.counterMaxLength;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.counterOverflowTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.counterOverflowTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.counterTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.counterTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.customNavigationLayout = global::HelloworldXamarin.Droid.Resource.Attribute.customNavigationLayout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.defaultQueryHint = global::HelloworldXamarin.Droid.Resource.Attribute.defaultQueryHint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.dialogCornerRadius = global::HelloworldXamarin.Droid.Resource.Attribute.dialogCornerRadius;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.dialogPreferredPadding = global::HelloworldXamarin.Droid.Resource.Attribute.dialogPreferredPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.dialogTheme = global::HelloworldXamarin.Droid.Resource.Attribute.dialogTheme;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.displayOptions = global::HelloworldXamarin.Droid.Resource.Attribute.displayOptions;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.divider = global::HelloworldXamarin.Droid.Resource.Attribute.divider;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.dividerHorizontal = global::HelloworldXamarin.Droid.Resource.Attribute.dividerHorizontal;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.dividerPadding = global::HelloworldXamarin.Droid.Resource.Attribute.dividerPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.dividerVertical = global::HelloworldXamarin.Droid.Resource.Attribute.dividerVertical;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.drawableSize = global::HelloworldXamarin.Droid.Resource.Attribute.drawableSize;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.drawerArrowStyle = global::HelloworldXamarin.Droid.Resource.Attribute.drawerArrowStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.dropdownListPreferredItemHeight = global::HelloworldXamarin.Droid.Resource.Attribute.dropdownListPreferredItemHeight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.dropDownListViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.dropDownListViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.editTextBackground = global::HelloworldXamarin.Droid.Resource.Attribute.editTextBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.editTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.editTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.editTextStyle = global::HelloworldXamarin.Droid.Resource.Attribute.editTextStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.elevation = global::HelloworldXamarin.Droid.Resource.Attribute.elevation;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.enforceMaterialTheme = global::HelloworldXamarin.Droid.Resource.Attribute.enforceMaterialTheme;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.enforceTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.enforceTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.errorEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.errorEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.errorTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.errorTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.expandActivityOverflowButtonDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.expandActivityOverflowButtonDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.expanded = global::HelloworldXamarin.Droid.Resource.Attribute.expanded;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.expandedTitleGravity = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleGravity;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.expandedTitleMargin = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleMargin;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.expandedTitleMarginBottom = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleMarginBottom;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.expandedTitleMarginEnd = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleMarginEnd;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.expandedTitleMarginStart = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleMarginStart;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.expandedTitleMarginTop = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleMarginTop;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.expandedTitleTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.expandedTitleTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fabAlignmentMode = global::HelloworldXamarin.Droid.Resource.Attribute.fabAlignmentMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fabCradleMargin = global::HelloworldXamarin.Droid.Resource.Attribute.fabCradleMargin;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fabCradleRoundedCornerRadius = global::HelloworldXamarin.Droid.Resource.Attribute.fabCradleRoundedCornerRadius;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fabCradleVerticalOffset = global::HelloworldXamarin.Droid.Resource.Attribute.fabCradleVerticalOffset;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fabCustomSize = global::HelloworldXamarin.Droid.Resource.Attribute.fabCustomSize;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fabSize = global::HelloworldXamarin.Droid.Resource.Attribute.fabSize;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fastScrollEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.fastScrollEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fastScrollHorizontalThumbDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.fastScrollHorizontalThumbDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fastScrollHorizontalTrackDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.fastScrollHorizontalTrackDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fastScrollVerticalThumbDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.fastScrollVerticalThumbDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fastScrollVerticalTrackDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.fastScrollVerticalTrackDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.firstBaselineToTopHeight = global::HelloworldXamarin.Droid.Resource.Attribute.firstBaselineToTopHeight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.floatingActionButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.floatingActionButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.font = global::HelloworldXamarin.Droid.Resource.Attribute.font;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fontFamily = global::HelloworldXamarin.Droid.Resource.Attribute.fontFamily;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fontProviderAuthority = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderAuthority;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fontProviderCerts = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderCerts;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fontProviderFetchStrategy = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderFetchStrategy;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fontProviderFetchTimeout = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderFetchTimeout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fontProviderPackage = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderPackage;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fontProviderQuery = global::HelloworldXamarin.Droid.Resource.Attribute.fontProviderQuery;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fontStyle = global::HelloworldXamarin.Droid.Resource.Attribute.fontStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fontVariationSettings = global::HelloworldXamarin.Droid.Resource.Attribute.fontVariationSettings;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.fontWeight = global::HelloworldXamarin.Droid.Resource.Attribute.fontWeight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.foregroundInsidePadding = global::HelloworldXamarin.Droid.Resource.Attribute.foregroundInsidePadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.gapBetweenBars = global::HelloworldXamarin.Droid.Resource.Attribute.gapBetweenBars;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.goIcon = global::HelloworldXamarin.Droid.Resource.Attribute.goIcon;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.headerLayout = global::HelloworldXamarin.Droid.Resource.Attribute.headerLayout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.height = global::HelloworldXamarin.Droid.Resource.Attribute.height;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.helperText = global::HelloworldXamarin.Droid.Resource.Attribute.helperText;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.helperTextEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.helperTextEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.helperTextTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.helperTextTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.hideMotionSpec = global::HelloworldXamarin.Droid.Resource.Attribute.hideMotionSpec;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.hideOnContentScroll = global::HelloworldXamarin.Droid.Resource.Attribute.hideOnContentScroll;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.hideOnScroll = global::HelloworldXamarin.Droid.Resource.Attribute.hideOnScroll;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.hintAnimationEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.hintAnimationEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.hintEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.hintEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.hintTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.hintTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.homeAsUpIndicator = global::HelloworldXamarin.Droid.Resource.Attribute.homeAsUpIndicator;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.homeLayout = global::HelloworldXamarin.Droid.Resource.Attribute.homeLayout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.hoveredFocusedTranslationZ = global::HelloworldXamarin.Droid.Resource.Attribute.hoveredFocusedTranslationZ;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.icon = global::HelloworldXamarin.Droid.Resource.Attribute.icon;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.iconEndPadding = global::HelloworldXamarin.Droid.Resource.Attribute.iconEndPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.iconGravity = global::HelloworldXamarin.Droid.Resource.Attribute.iconGravity;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.iconifiedByDefault = global::HelloworldXamarin.Droid.Resource.Attribute.iconifiedByDefault;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.iconPadding = global::HelloworldXamarin.Droid.Resource.Attribute.iconPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.iconSize = global::HelloworldXamarin.Droid.Resource.Attribute.iconSize;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.iconStartPadding = global::HelloworldXamarin.Droid.Resource.Attribute.iconStartPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.iconTint = global::HelloworldXamarin.Droid.Resource.Attribute.iconTint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.iconTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.iconTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.imageButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.imageButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.indeterminateProgressStyle = global::HelloworldXamarin.Droid.Resource.Attribute.indeterminateProgressStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.initialActivityCount = global::HelloworldXamarin.Droid.Resource.Attribute.initialActivityCount;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.insetForeground = global::HelloworldXamarin.Droid.Resource.Attribute.insetForeground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.isLightTheme = global::HelloworldXamarin.Droid.Resource.Attribute.isLightTheme;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.itemBackground = global::HelloworldXamarin.Droid.Resource.Attribute.itemBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.itemHorizontalPadding = global::HelloworldXamarin.Droid.Resource.Attribute.itemHorizontalPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.itemHorizontalTranslationEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.itemHorizontalTranslationEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.itemIconPadding = global::HelloworldXamarin.Droid.Resource.Attribute.itemIconPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.itemIconSize = global::HelloworldXamarin.Droid.Resource.Attribute.itemIconSize;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.itemIconTint = global::HelloworldXamarin.Droid.Resource.Attribute.itemIconTint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.itemPadding = global::HelloworldXamarin.Droid.Resource.Attribute.itemPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.itemSpacing = global::HelloworldXamarin.Droid.Resource.Attribute.itemSpacing;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.itemTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.itemTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.itemTextAppearanceActive = global::HelloworldXamarin.Droid.Resource.Attribute.itemTextAppearanceActive;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.itemTextAppearanceInactive = global::HelloworldXamarin.Droid.Resource.Attribute.itemTextAppearanceInactive;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.itemTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.itemTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.keylines = global::HelloworldXamarin.Droid.Resource.Attribute.keylines;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.labelVisibilityMode = global::HelloworldXamarin.Droid.Resource.Attribute.labelVisibilityMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.lastBaselineToBottomHeight = global::HelloworldXamarin.Droid.Resource.Attribute.lastBaselineToBottomHeight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.layout = global::HelloworldXamarin.Droid.Resource.Attribute.layout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.layoutManager = global::HelloworldXamarin.Droid.Resource.Attribute.layoutManager;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.layout_anchor = global::HelloworldXamarin.Droid.Resource.Attribute.layout_anchor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.layout_anchorGravity = global::HelloworldXamarin.Droid.Resource.Attribute.layout_anchorGravity;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.layout_behavior = global::HelloworldXamarin.Droid.Resource.Attribute.layout_behavior;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.layout_collapseMode = global::HelloworldXamarin.Droid.Resource.Attribute.layout_collapseMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.layout_collapseParallaxMultiplier = global::HelloworldXamarin.Droid.Resource.Attribute.layout_collapseParallaxMultiplier;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.layout_dodgeInsetEdges = global::HelloworldXamarin.Droid.Resource.Attribute.layout_dodgeInsetEdges;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.layout_insetEdge = global::HelloworldXamarin.Droid.Resource.Attribute.layout_insetEdge;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.layout_keyline = global::HelloworldXamarin.Droid.Resource.Attribute.layout_keyline;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.layout_scrollFlags = global::HelloworldXamarin.Droid.Resource.Attribute.layout_scrollFlags;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.layout_scrollInterpolator = global::HelloworldXamarin.Droid.Resource.Attribute.layout_scrollInterpolator;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.liftOnScroll = global::HelloworldXamarin.Droid.Resource.Attribute.liftOnScroll;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.lineHeight = global::HelloworldXamarin.Droid.Resource.Attribute.lineHeight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.lineSpacing = global::HelloworldXamarin.Droid.Resource.Attribute.lineSpacing;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.listChoiceBackgroundIndicator = global::HelloworldXamarin.Droid.Resource.Attribute.listChoiceBackgroundIndicator;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.listDividerAlertDialog = global::HelloworldXamarin.Droid.Resource.Attribute.listDividerAlertDialog;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.listItemLayout = global::HelloworldXamarin.Droid.Resource.Attribute.listItemLayout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.listLayout = global::HelloworldXamarin.Droid.Resource.Attribute.listLayout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.listMenuViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.listMenuViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.listPopupWindowStyle = global::HelloworldXamarin.Droid.Resource.Attribute.listPopupWindowStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.listPreferredItemHeight = global::HelloworldXamarin.Droid.Resource.Attribute.listPreferredItemHeight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.listPreferredItemHeightLarge = global::HelloworldXamarin.Droid.Resource.Attribute.listPreferredItemHeightLarge;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.listPreferredItemHeightSmall = global::HelloworldXamarin.Droid.Resource.Attribute.listPreferredItemHeightSmall;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.listPreferredItemPaddingLeft = global::HelloworldXamarin.Droid.Resource.Attribute.listPreferredItemPaddingLeft;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.listPreferredItemPaddingRight = global::HelloworldXamarin.Droid.Resource.Attribute.listPreferredItemPaddingRight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.logo = global::HelloworldXamarin.Droid.Resource.Attribute.logo;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.logoDescription = global::HelloworldXamarin.Droid.Resource.Attribute.logoDescription;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.materialButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.materialButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.materialCardViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.materialCardViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.maxActionInlineWidth = global::HelloworldXamarin.Droid.Resource.Attribute.maxActionInlineWidth;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.maxButtonHeight = global::HelloworldXamarin.Droid.Resource.Attribute.maxButtonHeight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.maxImageSize = global::HelloworldXamarin.Droid.Resource.Attribute.maxImageSize;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.measureWithLargestChild = global::HelloworldXamarin.Droid.Resource.Attribute.measureWithLargestChild;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.menu = global::HelloworldXamarin.Droid.Resource.Attribute.menu;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.multiChoiceItemLayout = global::HelloworldXamarin.Droid.Resource.Attribute.multiChoiceItemLayout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.navigationContentDescription = global::HelloworldXamarin.Droid.Resource.Attribute.navigationContentDescription;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.navigationIcon = global::HelloworldXamarin.Droid.Resource.Attribute.navigationIcon;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.navigationMode = global::HelloworldXamarin.Droid.Resource.Attribute.navigationMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.navigationViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.navigationViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.numericModifiers = global::HelloworldXamarin.Droid.Resource.Attribute.numericModifiers;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.overlapAnchor = global::HelloworldXamarin.Droid.Resource.Attribute.overlapAnchor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.paddingBottomNoButtons = global::HelloworldXamarin.Droid.Resource.Attribute.paddingBottomNoButtons;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.paddingEnd = global::HelloworldXamarin.Droid.Resource.Attribute.paddingEnd;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.paddingStart = global::HelloworldXamarin.Droid.Resource.Attribute.paddingStart;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.paddingTopNoTitle = global::HelloworldXamarin.Droid.Resource.Attribute.paddingTopNoTitle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.panelBackground = global::HelloworldXamarin.Droid.Resource.Attribute.panelBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.panelMenuListTheme = global::HelloworldXamarin.Droid.Resource.Attribute.panelMenuListTheme;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.panelMenuListWidth = global::HelloworldXamarin.Droid.Resource.Attribute.panelMenuListWidth;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.passwordToggleContentDescription = global::HelloworldXamarin.Droid.Resource.Attribute.passwordToggleContentDescription;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.passwordToggleDrawable = global::HelloworldXamarin.Droid.Resource.Attribute.passwordToggleDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.passwordToggleEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.passwordToggleEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.passwordToggleTint = global::HelloworldXamarin.Droid.Resource.Attribute.passwordToggleTint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.passwordToggleTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.passwordToggleTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.popupMenuStyle = global::HelloworldXamarin.Droid.Resource.Attribute.popupMenuStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.popupTheme = global::HelloworldXamarin.Droid.Resource.Attribute.popupTheme;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.popupWindowStyle = global::HelloworldXamarin.Droid.Resource.Attribute.popupWindowStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.preserveIconSpacing = global::HelloworldXamarin.Droid.Resource.Attribute.preserveIconSpacing;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.pressedTranslationZ = global::HelloworldXamarin.Droid.Resource.Attribute.pressedTranslationZ;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.progressBarPadding = global::HelloworldXamarin.Droid.Resource.Attribute.progressBarPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.progressBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.progressBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.queryBackground = global::HelloworldXamarin.Droid.Resource.Attribute.queryBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.queryHint = global::HelloworldXamarin.Droid.Resource.Attribute.queryHint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.radioButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.radioButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.ratingBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.ratingBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.ratingBarStyleIndicator = global::HelloworldXamarin.Droid.Resource.Attribute.ratingBarStyleIndicator;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.ratingBarStyleSmall = global::HelloworldXamarin.Droid.Resource.Attribute.ratingBarStyleSmall;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.reverseLayout = global::HelloworldXamarin.Droid.Resource.Attribute.reverseLayout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.rippleColor = global::HelloworldXamarin.Droid.Resource.Attribute.rippleColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.scrimAnimationDuration = global::HelloworldXamarin.Droid.Resource.Attribute.scrimAnimationDuration;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.scrimBackground = global::HelloworldXamarin.Droid.Resource.Attribute.scrimBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.scrimVisibleHeightTrigger = global::HelloworldXamarin.Droid.Resource.Attribute.scrimVisibleHeightTrigger;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.searchHintIcon = global::HelloworldXamarin.Droid.Resource.Attribute.searchHintIcon;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.searchIcon = global::HelloworldXamarin.Droid.Resource.Attribute.searchIcon;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.searchViewStyle = global::HelloworldXamarin.Droid.Resource.Attribute.searchViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.seekBarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.seekBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.selectableItemBackground = global::HelloworldXamarin.Droid.Resource.Attribute.selectableItemBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.selectableItemBackgroundBorderless = global::HelloworldXamarin.Droid.Resource.Attribute.selectableItemBackgroundBorderless;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.showAsAction = global::HelloworldXamarin.Droid.Resource.Attribute.showAsAction;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.showDividers = global::HelloworldXamarin.Droid.Resource.Attribute.showDividers;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.showMotionSpec = global::HelloworldXamarin.Droid.Resource.Attribute.showMotionSpec;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.showText = global::HelloworldXamarin.Droid.Resource.Attribute.showText;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.showTitle = global::HelloworldXamarin.Droid.Resource.Attribute.showTitle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.singleChoiceItemLayout = global::HelloworldXamarin.Droid.Resource.Attribute.singleChoiceItemLayout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.singleLine = global::HelloworldXamarin.Droid.Resource.Attribute.singleLine;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.singleSelection = global::HelloworldXamarin.Droid.Resource.Attribute.singleSelection;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.snackbarButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.snackbarButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.snackbarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.snackbarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.spanCount = global::HelloworldXamarin.Droid.Resource.Attribute.spanCount;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.spinBars = global::HelloworldXamarin.Droid.Resource.Attribute.spinBars;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.spinnerDropDownItemStyle = global::HelloworldXamarin.Droid.Resource.Attribute.spinnerDropDownItemStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.spinnerStyle = global::HelloworldXamarin.Droid.Resource.Attribute.spinnerStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.splitTrack = global::HelloworldXamarin.Droid.Resource.Attribute.splitTrack;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.srcCompat = global::HelloworldXamarin.Droid.Resource.Attribute.srcCompat;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.stackFromEnd = global::HelloworldXamarin.Droid.Resource.Attribute.stackFromEnd;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.state_above_anchor = global::HelloworldXamarin.Droid.Resource.Attribute.state_above_anchor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.state_collapsed = global::HelloworldXamarin.Droid.Resource.Attribute.state_collapsed;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.state_collapsible = global::HelloworldXamarin.Droid.Resource.Attribute.state_collapsible;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.state_liftable = global::HelloworldXamarin.Droid.Resource.Attribute.state_liftable;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.state_lifted = global::HelloworldXamarin.Droid.Resource.Attribute.state_lifted;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.statusBarBackground = global::HelloworldXamarin.Droid.Resource.Attribute.statusBarBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.statusBarScrim = global::HelloworldXamarin.Droid.Resource.Attribute.statusBarScrim;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.strokeColor = global::HelloworldXamarin.Droid.Resource.Attribute.strokeColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.strokeWidth = global::HelloworldXamarin.Droid.Resource.Attribute.strokeWidth;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.subMenuArrow = global::HelloworldXamarin.Droid.Resource.Attribute.subMenuArrow;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.submitBackground = global::HelloworldXamarin.Droid.Resource.Attribute.submitBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.subtitle = global::HelloworldXamarin.Droid.Resource.Attribute.subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.subtitleTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.subtitleTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.subtitleTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.subtitleTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.subtitleTextStyle = global::HelloworldXamarin.Droid.Resource.Attribute.subtitleTextStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.suggestionRowLayout = global::HelloworldXamarin.Droid.Resource.Attribute.suggestionRowLayout;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.switchMinWidth = global::HelloworldXamarin.Droid.Resource.Attribute.switchMinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.switchPadding = global::HelloworldXamarin.Droid.Resource.Attribute.switchPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.switchStyle = global::HelloworldXamarin.Droid.Resource.Attribute.switchStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.switchTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.switchTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabBackground = global::HelloworldXamarin.Droid.Resource.Attribute.tabBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabContentStart = global::HelloworldXamarin.Droid.Resource.Attribute.tabContentStart;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabGravity = global::HelloworldXamarin.Droid.Resource.Attribute.tabGravity;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabIconTint = global::HelloworldXamarin.Droid.Resource.Attribute.tabIconTint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabIconTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.tabIconTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabIndicator = global::HelloworldXamarin.Droid.Resource.Attribute.tabIndicator;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabIndicatorAnimationDuration = global::HelloworldXamarin.Droid.Resource.Attribute.tabIndicatorAnimationDuration;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabIndicatorColor = global::HelloworldXamarin.Droid.Resource.Attribute.tabIndicatorColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabIndicatorFullWidth = global::HelloworldXamarin.Droid.Resource.Attribute.tabIndicatorFullWidth;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabIndicatorGravity = global::HelloworldXamarin.Droid.Resource.Attribute.tabIndicatorGravity;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabIndicatorHeight = global::HelloworldXamarin.Droid.Resource.Attribute.tabIndicatorHeight;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabInlineLabel = global::HelloworldXamarin.Droid.Resource.Attribute.tabInlineLabel;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabMaxWidth = global::HelloworldXamarin.Droid.Resource.Attribute.tabMaxWidth;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabMinWidth = global::HelloworldXamarin.Droid.Resource.Attribute.tabMinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabMode = global::HelloworldXamarin.Droid.Resource.Attribute.tabMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabPadding = global::HelloworldXamarin.Droid.Resource.Attribute.tabPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabPaddingBottom = global::HelloworldXamarin.Droid.Resource.Attribute.tabPaddingBottom;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabPaddingEnd = global::HelloworldXamarin.Droid.Resource.Attribute.tabPaddingEnd;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabPaddingStart = global::HelloworldXamarin.Droid.Resource.Attribute.tabPaddingStart;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabPaddingTop = global::HelloworldXamarin.Droid.Resource.Attribute.tabPaddingTop;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabRippleColor = global::HelloworldXamarin.Droid.Resource.Attribute.tabRippleColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabSelectedTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.tabSelectedTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabStyle = global::HelloworldXamarin.Droid.Resource.Attribute.tabStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.tabTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.tabTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tabUnboundedRipple = global::HelloworldXamarin.Droid.Resource.Attribute.tabUnboundedRipple;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAllCaps = global::HelloworldXamarin.Droid.Resource.Attribute.textAllCaps;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceBody1 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceBody1;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceBody2 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceBody2;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceButton = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceButton;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceCaption = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceCaption;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceHeadline1 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceHeadline1;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceHeadline2 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceHeadline2;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceHeadline3 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceHeadline3;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceHeadline4 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceHeadline4;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceHeadline5 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceHeadline5;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceHeadline6 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceHeadline6;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceLargePopupMenu = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceLargePopupMenu;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceListItem = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceListItem;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceListItemSecondary = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceListItemSecondary;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceListItemSmall = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceListItemSmall;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceOverline = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceOverline;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearancePopupMenuHeader = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearancePopupMenuHeader;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceSearchResultSubtitle = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceSearchResultSubtitle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceSearchResultTitle = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceSearchResultTitle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceSmallPopupMenu = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceSmallPopupMenu;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceSubtitle1 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceSubtitle1;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textAppearanceSubtitle2 = global::HelloworldXamarin.Droid.Resource.Attribute.textAppearanceSubtitle2;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textColorAlertDialogListItem = global::HelloworldXamarin.Droid.Resource.Attribute.textColorAlertDialogListItem;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textColorSearchUrl = global::HelloworldXamarin.Droid.Resource.Attribute.textColorSearchUrl;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textEndPadding = global::HelloworldXamarin.Droid.Resource.Attribute.textEndPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textInputStyle = global::HelloworldXamarin.Droid.Resource.Attribute.textInputStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.textStartPadding = global::HelloworldXamarin.Droid.Resource.Attribute.textStartPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.theme = global::HelloworldXamarin.Droid.Resource.Attribute.theme;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.thickness = global::HelloworldXamarin.Droid.Resource.Attribute.thickness;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.thumbTextPadding = global::HelloworldXamarin.Droid.Resource.Attribute.thumbTextPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.thumbTint = global::HelloworldXamarin.Droid.Resource.Attribute.thumbTint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.thumbTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.thumbTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tickMark = global::HelloworldXamarin.Droid.Resource.Attribute.tickMark;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tickMarkTint = global::HelloworldXamarin.Droid.Resource.Attribute.tickMarkTint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tickMarkTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.tickMarkTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tint = global::HelloworldXamarin.Droid.Resource.Attribute.tint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tintMode = global::HelloworldXamarin.Droid.Resource.Attribute.tintMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.title = global::HelloworldXamarin.Droid.Resource.Attribute.title;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.titleEnabled = global::HelloworldXamarin.Droid.Resource.Attribute.titleEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.titleMargin = global::HelloworldXamarin.Droid.Resource.Attribute.titleMargin;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.titleMarginBottom = global::HelloworldXamarin.Droid.Resource.Attribute.titleMarginBottom;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.titleMarginEnd = global::HelloworldXamarin.Droid.Resource.Attribute.titleMarginEnd;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.titleMargins = global::HelloworldXamarin.Droid.Resource.Attribute.titleMargins;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.titleMarginStart = global::HelloworldXamarin.Droid.Resource.Attribute.titleMarginStart;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.titleMarginTop = global::HelloworldXamarin.Droid.Resource.Attribute.titleMarginTop;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.titleTextAppearance = global::HelloworldXamarin.Droid.Resource.Attribute.titleTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.titleTextColor = global::HelloworldXamarin.Droid.Resource.Attribute.titleTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.titleTextStyle = global::HelloworldXamarin.Droid.Resource.Attribute.titleTextStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.toolbarId = global::HelloworldXamarin.Droid.Resource.Attribute.toolbarId;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.toolbarNavigationButtonStyle = global::HelloworldXamarin.Droid.Resource.Attribute.toolbarNavigationButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.toolbarStyle = global::HelloworldXamarin.Droid.Resource.Attribute.toolbarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tooltipForegroundColor = global::HelloworldXamarin.Droid.Resource.Attribute.tooltipForegroundColor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tooltipFrameBackground = global::HelloworldXamarin.Droid.Resource.Attribute.tooltipFrameBackground;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.tooltipText = global::HelloworldXamarin.Droid.Resource.Attribute.tooltipText;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.track = global::HelloworldXamarin.Droid.Resource.Attribute.track;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.trackTint = global::HelloworldXamarin.Droid.Resource.Attribute.trackTint;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.trackTintMode = global::HelloworldXamarin.Droid.Resource.Attribute.trackTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.ttcIndex = global::HelloworldXamarin.Droid.Resource.Attribute.ttcIndex;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.useCompatPadding = global::HelloworldXamarin.Droid.Resource.Attribute.useCompatPadding;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.viewInflaterClass = global::HelloworldXamarin.Droid.Resource.Attribute.viewInflaterClass;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.voiceIcon = global::HelloworldXamarin.Droid.Resource.Attribute.voiceIcon;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.windowActionBar = global::HelloworldXamarin.Droid.Resource.Attribute.windowActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.windowActionBarOverlay = global::HelloworldXamarin.Droid.Resource.Attribute.windowActionBarOverlay;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.windowActionModeOverlay = global::HelloworldXamarin.Droid.Resource.Attribute.windowActionModeOverlay;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.windowFixedHeightMajor = global::HelloworldXamarin.Droid.Resource.Attribute.windowFixedHeightMajor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.windowFixedHeightMinor = global::HelloworldXamarin.Droid.Resource.Attribute.windowFixedHeightMinor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.windowFixedWidthMajor = global::HelloworldXamarin.Droid.Resource.Attribute.windowFixedWidthMajor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.windowFixedWidthMinor = global::HelloworldXamarin.Droid.Resource.Attribute.windowFixedWidthMinor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.windowMinWidthMajor = global::HelloworldXamarin.Droid.Resource.Attribute.windowMinWidthMajor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.windowMinWidthMinor = global::HelloworldXamarin.Droid.Resource.Attribute.windowMinWidthMinor;
+                       global::Xamarin.Forms.Platform.Resource.Attribute.windowNoTitle = global::HelloworldXamarin.Droid.Resource.Attribute.windowNoTitle;
+                       global::Xamarin.Forms.Platform.Resource.Boolean.abc_action_bar_embed_tabs = global::HelloworldXamarin.Droid.Resource.Boolean.abc_action_bar_embed_tabs;
+                       global::Xamarin.Forms.Platform.Resource.Boolean.abc_allow_stacked_button_bar = global::HelloworldXamarin.Droid.Resource.Boolean.abc_allow_stacked_button_bar;
+                       global::Xamarin.Forms.Platform.Resource.Boolean.abc_config_actionMenuItemAllCaps = global::HelloworldXamarin.Droid.Resource.Boolean.abc_config_actionMenuItemAllCaps;
+                       global::Xamarin.Forms.Platform.Resource.Boolean.mtrl_btn_textappearance_all_caps = global::HelloworldXamarin.Droid.Resource.Boolean.mtrl_btn_textappearance_all_caps;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_background_cache_hint_selector_material_dark = global::HelloworldXamarin.Droid.Resource.Color.abc_background_cache_hint_selector_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_background_cache_hint_selector_material_light = global::HelloworldXamarin.Droid.Resource.Color.abc_background_cache_hint_selector_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_btn_colored_borderless_text_material = global::HelloworldXamarin.Droid.Resource.Color.abc_btn_colored_borderless_text_material;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_btn_colored_text_material = global::HelloworldXamarin.Droid.Resource.Color.abc_btn_colored_text_material;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_color_highlight_material = global::HelloworldXamarin.Droid.Resource.Color.abc_color_highlight_material;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_hint_foreground_material_dark = global::HelloworldXamarin.Droid.Resource.Color.abc_hint_foreground_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_hint_foreground_material_light = global::HelloworldXamarin.Droid.Resource.Color.abc_hint_foreground_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_input_method_navigation_guard = global::HelloworldXamarin.Droid.Resource.Color.abc_input_method_navigation_guard;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_primary_text_disable_only_material_dark = global::HelloworldXamarin.Droid.Resource.Color.abc_primary_text_disable_only_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_primary_text_disable_only_material_light = global::HelloworldXamarin.Droid.Resource.Color.abc_primary_text_disable_only_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_primary_text_material_dark = global::HelloworldXamarin.Droid.Resource.Color.abc_primary_text_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_primary_text_material_light = global::HelloworldXamarin.Droid.Resource.Color.abc_primary_text_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_search_url_text = global::HelloworldXamarin.Droid.Resource.Color.abc_search_url_text;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_search_url_text_normal = global::HelloworldXamarin.Droid.Resource.Color.abc_search_url_text_normal;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_search_url_text_pressed = global::HelloworldXamarin.Droid.Resource.Color.abc_search_url_text_pressed;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_search_url_text_selected = global::HelloworldXamarin.Droid.Resource.Color.abc_search_url_text_selected;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_secondary_text_material_dark = global::HelloworldXamarin.Droid.Resource.Color.abc_secondary_text_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_secondary_text_material_light = global::HelloworldXamarin.Droid.Resource.Color.abc_secondary_text_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_tint_btn_checkable = global::HelloworldXamarin.Droid.Resource.Color.abc_tint_btn_checkable;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_tint_default = global::HelloworldXamarin.Droid.Resource.Color.abc_tint_default;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_tint_edittext = global::HelloworldXamarin.Droid.Resource.Color.abc_tint_edittext;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_tint_seek_thumb = global::HelloworldXamarin.Droid.Resource.Color.abc_tint_seek_thumb;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_tint_spinner = global::HelloworldXamarin.Droid.Resource.Color.abc_tint_spinner;
+                       global::Xamarin.Forms.Platform.Resource.Color.abc_tint_switch_track = global::HelloworldXamarin.Droid.Resource.Color.abc_tint_switch_track;
+                       global::Xamarin.Forms.Platform.Resource.Color.accent_material_dark = global::HelloworldXamarin.Droid.Resource.Color.accent_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.accent_material_light = global::HelloworldXamarin.Droid.Resource.Color.accent_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.background_floating_material_dark = global::HelloworldXamarin.Droid.Resource.Color.background_floating_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.background_floating_material_light = global::HelloworldXamarin.Droid.Resource.Color.background_floating_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.background_material_dark = global::HelloworldXamarin.Droid.Resource.Color.background_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.background_material_light = global::HelloworldXamarin.Droid.Resource.Color.background_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.bright_foreground_disabled_material_dark = global::HelloworldXamarin.Droid.Resource.Color.bright_foreground_disabled_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.bright_foreground_disabled_material_light = global::HelloworldXamarin.Droid.Resource.Color.bright_foreground_disabled_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.bright_foreground_inverse_material_dark = global::HelloworldXamarin.Droid.Resource.Color.bright_foreground_inverse_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.bright_foreground_inverse_material_light = global::HelloworldXamarin.Droid.Resource.Color.bright_foreground_inverse_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.bright_foreground_material_dark = global::HelloworldXamarin.Droid.Resource.Color.bright_foreground_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.bright_foreground_material_light = global::HelloworldXamarin.Droid.Resource.Color.bright_foreground_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.button_material_dark = global::HelloworldXamarin.Droid.Resource.Color.button_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.button_material_light = global::HelloworldXamarin.Droid.Resource.Color.button_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.cardview_dark_background = global::HelloworldXamarin.Droid.Resource.Color.cardview_dark_background;
+                       global::Xamarin.Forms.Platform.Resource.Color.cardview_light_background = global::HelloworldXamarin.Droid.Resource.Color.cardview_light_background;
+                       global::Xamarin.Forms.Platform.Resource.Color.cardview_shadow_end_color = global::HelloworldXamarin.Droid.Resource.Color.cardview_shadow_end_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.cardview_shadow_start_color = global::HelloworldXamarin.Droid.Resource.Color.cardview_shadow_start_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_bottom_navigation_shadow_color = global::HelloworldXamarin.Droid.Resource.Color.design_bottom_navigation_shadow_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_default_color_primary = global::HelloworldXamarin.Droid.Resource.Color.design_default_color_primary;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_default_color_primary_dark = global::HelloworldXamarin.Droid.Resource.Color.design_default_color_primary_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_error = global::HelloworldXamarin.Droid.Resource.Color.design_error;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_fab_shadow_end_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_shadow_end_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_fab_shadow_mid_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_shadow_mid_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_fab_shadow_start_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_shadow_start_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_fab_stroke_end_inner_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_stroke_end_inner_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_fab_stroke_end_outer_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_stroke_end_outer_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_fab_stroke_top_inner_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_stroke_top_inner_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_fab_stroke_top_outer_color = global::HelloworldXamarin.Droid.Resource.Color.design_fab_stroke_top_outer_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_snackbar_background_color = global::HelloworldXamarin.Droid.Resource.Color.design_snackbar_background_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.design_tint_password_toggle = global::HelloworldXamarin.Droid.Resource.Color.design_tint_password_toggle;
+                       global::Xamarin.Forms.Platform.Resource.Color.dim_foreground_disabled_material_dark = global::HelloworldXamarin.Droid.Resource.Color.dim_foreground_disabled_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.dim_foreground_disabled_material_light = global::HelloworldXamarin.Droid.Resource.Color.dim_foreground_disabled_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.dim_foreground_material_dark = global::HelloworldXamarin.Droid.Resource.Color.dim_foreground_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.dim_foreground_material_light = global::HelloworldXamarin.Droid.Resource.Color.dim_foreground_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.error_color_material_dark = global::HelloworldXamarin.Droid.Resource.Color.error_color_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.error_color_material_light = global::HelloworldXamarin.Droid.Resource.Color.error_color_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.foreground_material_dark = global::HelloworldXamarin.Droid.Resource.Color.foreground_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.foreground_material_light = global::HelloworldXamarin.Droid.Resource.Color.foreground_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.highlighted_text_material_dark = global::HelloworldXamarin.Droid.Resource.Color.highlighted_text_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.highlighted_text_material_light = global::HelloworldXamarin.Droid.Resource.Color.highlighted_text_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.material_blue_grey_800 = global::HelloworldXamarin.Droid.Resource.Color.material_blue_grey_800;
+                       global::Xamarin.Forms.Platform.Resource.Color.material_blue_grey_900 = global::HelloworldXamarin.Droid.Resource.Color.material_blue_grey_900;
+                       global::Xamarin.Forms.Platform.Resource.Color.material_blue_grey_950 = global::HelloworldXamarin.Droid.Resource.Color.material_blue_grey_950;
+                       global::Xamarin.Forms.Platform.Resource.Color.material_deep_teal_200 = global::HelloworldXamarin.Droid.Resource.Color.material_deep_teal_200;
+                       global::Xamarin.Forms.Platform.Resource.Color.material_deep_teal_500 = global::HelloworldXamarin.Droid.Resource.Color.material_deep_teal_500;
+                       global::Xamarin.Forms.Platform.Resource.Color.material_grey_100 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_100;
+                       global::Xamarin.Forms.Platform.Resource.Color.material_grey_300 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_300;
+                       global::Xamarin.Forms.Platform.Resource.Color.material_grey_50 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_50;
+                       global::Xamarin.Forms.Platform.Resource.Color.material_grey_600 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_600;
+                       global::Xamarin.Forms.Platform.Resource.Color.material_grey_800 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_800;
+                       global::Xamarin.Forms.Platform.Resource.Color.material_grey_850 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_850;
+                       global::Xamarin.Forms.Platform.Resource.Color.material_grey_900 = global::HelloworldXamarin.Droid.Resource.Color.material_grey_900;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_bottom_nav_colored_item_tint = global::HelloworldXamarin.Droid.Resource.Color.mtrl_bottom_nav_colored_item_tint;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_bottom_nav_item_tint = global::HelloworldXamarin.Droid.Resource.Color.mtrl_bottom_nav_item_tint;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_btn_bg_color_disabled = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_bg_color_disabled;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_btn_bg_color_selector = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_bg_color_selector;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_btn_ripple_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_ripple_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_btn_stroke_color_selector = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_stroke_color_selector;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_btn_text_btn_ripple_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_text_btn_ripple_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_btn_text_color_disabled = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_text_color_disabled;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_btn_text_color_selector = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_text_color_selector;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_btn_transparent_bg_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_btn_transparent_bg_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_chip_background_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_chip_background_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_chip_close_icon_tint = global::HelloworldXamarin.Droid.Resource.Color.mtrl_chip_close_icon_tint;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_chip_ripple_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_chip_ripple_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_chip_text_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_chip_text_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_fab_ripple_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_fab_ripple_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_scrim_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_scrim_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_tabs_colored_ripple_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_tabs_colored_ripple_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_tabs_icon_color_selector = global::HelloworldXamarin.Droid.Resource.Color.mtrl_tabs_icon_color_selector;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_tabs_icon_color_selector_colored = global::HelloworldXamarin.Droid.Resource.Color.mtrl_tabs_icon_color_selector_colored;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_tabs_legacy_text_color_selector = global::HelloworldXamarin.Droid.Resource.Color.mtrl_tabs_legacy_text_color_selector;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_tabs_ripple_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_tabs_ripple_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_textinput_default_box_stroke_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_textinput_default_box_stroke_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_textinput_disabled_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_textinput_disabled_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_textinput_filled_box_default_background_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_textinput_filled_box_default_background_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_textinput_hovered_box_stroke_color = global::HelloworldXamarin.Droid.Resource.Color.mtrl_textinput_hovered_box_stroke_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.mtrl_text_btn_text_color_selector = global::HelloworldXamarin.Droid.Resource.Color.mtrl_text_btn_text_color_selector;
+                       global::Xamarin.Forms.Platform.Resource.Color.notification_action_color_filter = global::HelloworldXamarin.Droid.Resource.Color.notification_action_color_filter;
+                       global::Xamarin.Forms.Platform.Resource.Color.notification_icon_bg_color = global::HelloworldXamarin.Droid.Resource.Color.notification_icon_bg_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.notification_material_background_media_default_color = global::HelloworldXamarin.Droid.Resource.Color.notification_material_background_media_default_color;
+                       global::Xamarin.Forms.Platform.Resource.Color.primary_dark_material_dark = global::HelloworldXamarin.Droid.Resource.Color.primary_dark_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.primary_dark_material_light = global::HelloworldXamarin.Droid.Resource.Color.primary_dark_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.primary_material_dark = global::HelloworldXamarin.Droid.Resource.Color.primary_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.primary_material_light = global::HelloworldXamarin.Droid.Resource.Color.primary_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.primary_text_default_material_dark = global::HelloworldXamarin.Droid.Resource.Color.primary_text_default_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.primary_text_default_material_light = global::HelloworldXamarin.Droid.Resource.Color.primary_text_default_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.primary_text_disabled_material_dark = global::HelloworldXamarin.Droid.Resource.Color.primary_text_disabled_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.primary_text_disabled_material_light = global::HelloworldXamarin.Droid.Resource.Color.primary_text_disabled_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.ripple_material_dark = global::HelloworldXamarin.Droid.Resource.Color.ripple_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.ripple_material_light = global::HelloworldXamarin.Droid.Resource.Color.ripple_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.secondary_text_default_material_dark = global::HelloworldXamarin.Droid.Resource.Color.secondary_text_default_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.secondary_text_default_material_light = global::HelloworldXamarin.Droid.Resource.Color.secondary_text_default_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.secondary_text_disabled_material_dark = global::HelloworldXamarin.Droid.Resource.Color.secondary_text_disabled_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.secondary_text_disabled_material_light = global::HelloworldXamarin.Droid.Resource.Color.secondary_text_disabled_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.switch_thumb_disabled_material_dark = global::HelloworldXamarin.Droid.Resource.Color.switch_thumb_disabled_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.switch_thumb_disabled_material_light = global::HelloworldXamarin.Droid.Resource.Color.switch_thumb_disabled_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.switch_thumb_material_dark = global::HelloworldXamarin.Droid.Resource.Color.switch_thumb_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.switch_thumb_material_light = global::HelloworldXamarin.Droid.Resource.Color.switch_thumb_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.switch_thumb_normal_material_dark = global::HelloworldXamarin.Droid.Resource.Color.switch_thumb_normal_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.switch_thumb_normal_material_light = global::HelloworldXamarin.Droid.Resource.Color.switch_thumb_normal_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Color.tooltip_background_dark = global::HelloworldXamarin.Droid.Resource.Color.tooltip_background_dark;
+                       global::Xamarin.Forms.Platform.Resource.Color.tooltip_background_light = global::HelloworldXamarin.Droid.Resource.Color.tooltip_background_light;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_content_inset_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_content_inset_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_content_inset_with_nav = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_content_inset_with_nav;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_default_height_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_default_height_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_default_padding_end_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_default_padding_end_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_default_padding_start_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_default_padding_start_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_elevation_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_elevation_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_icon_vertical_padding_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_icon_vertical_padding_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_overflow_padding_end_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_overflow_padding_end_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_overflow_padding_start_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_overflow_padding_start_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_stacked_max_height = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_stacked_max_height;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_stacked_tab_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_stacked_tab_max_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_subtitle_bottom_margin_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_subtitle_bottom_margin_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_bar_subtitle_top_margin_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_bar_subtitle_top_margin_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_button_min_height_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_button_min_height_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_button_min_width_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_button_min_width_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_action_button_min_width_overflow_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_action_button_min_width_overflow_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_alert_dialog_button_bar_height = global::HelloworldXamarin.Droid.Resource.Dimension.abc_alert_dialog_button_bar_height;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_alert_dialog_button_dimen = global::HelloworldXamarin.Droid.Resource.Dimension.abc_alert_dialog_button_dimen;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_button_inset_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_button_inset_horizontal_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_button_inset_vertical_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_button_inset_vertical_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_button_padding_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_button_padding_horizontal_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_button_padding_vertical_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_button_padding_vertical_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_cascading_menus_min_smallest_width = global::HelloworldXamarin.Droid.Resource.Dimension.abc_cascading_menus_min_smallest_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_config_prefDialogWidth = global::HelloworldXamarin.Droid.Resource.Dimension.abc_config_prefDialogWidth;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_control_corner_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_control_corner_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_control_inset_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_control_inset_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_control_padding_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_control_padding_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dialog_corner_radius_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_corner_radius_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dialog_fixed_height_major = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_fixed_height_major;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dialog_fixed_height_minor = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_fixed_height_minor;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dialog_fixed_width_major = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_fixed_width_major;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dialog_fixed_width_minor = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_fixed_width_minor;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dialog_list_padding_bottom_no_buttons = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_list_padding_bottom_no_buttons;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dialog_list_padding_top_no_title = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_list_padding_top_no_title;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dialog_min_width_major = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_min_width_major;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dialog_min_width_minor = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_min_width_minor;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dialog_padding_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_padding_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dialog_padding_top_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_padding_top_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dialog_title_divider_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dialog_title_divider_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_disabled_alpha_material_dark = global::HelloworldXamarin.Droid.Resource.Dimension.abc_disabled_alpha_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_disabled_alpha_material_light = global::HelloworldXamarin.Droid.Resource.Dimension.abc_disabled_alpha_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dropdownitem_icon_width = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dropdownitem_icon_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dropdownitem_text_padding_left = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dropdownitem_text_padding_left;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_dropdownitem_text_padding_right = global::HelloworldXamarin.Droid.Resource.Dimension.abc_dropdownitem_text_padding_right;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_edit_text_inset_bottom_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_edit_text_inset_bottom_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_edit_text_inset_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_edit_text_inset_horizontal_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_edit_text_inset_top_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_edit_text_inset_top_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_floating_window_z = global::HelloworldXamarin.Droid.Resource.Dimension.abc_floating_window_z;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_list_item_padding_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_list_item_padding_horizontal_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_panel_menu_list_width = global::HelloworldXamarin.Droid.Resource.Dimension.abc_panel_menu_list_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_progress_bar_height_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_progress_bar_height_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_search_view_preferred_height = global::HelloworldXamarin.Droid.Resource.Dimension.abc_search_view_preferred_height;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_search_view_preferred_width = global::HelloworldXamarin.Droid.Resource.Dimension.abc_search_view_preferred_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_seekbar_track_background_height_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_seekbar_track_background_height_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_seekbar_track_progress_height_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_seekbar_track_progress_height_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_select_dialog_padding_start_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_select_dialog_padding_start_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_switch_padding = global::HelloworldXamarin.Droid.Resource.Dimension.abc_switch_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_body_1_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_body_1_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_body_2_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_body_2_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_button_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_button_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_caption_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_caption_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_display_1_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_display_1_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_display_2_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_display_2_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_display_3_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_display_3_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_display_4_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_display_4_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_headline_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_headline_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_large_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_large_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_medium_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_medium_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_menu_header_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_menu_header_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_menu_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_menu_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_small_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_small_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_subhead_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_subhead_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_subtitle_material_toolbar = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_subtitle_material_toolbar;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_title_material = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_title_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.abc_text_size_title_material_toolbar = global::HelloworldXamarin.Droid.Resource.Dimension.abc_text_size_title_material_toolbar;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.cardview_compat_inset_shadow = global::HelloworldXamarin.Droid.Resource.Dimension.cardview_compat_inset_shadow;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.cardview_default_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.cardview_default_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.cardview_default_radius = global::HelloworldXamarin.Droid.Resource.Dimension.cardview_default_radius;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.compat_button_inset_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_button_inset_horizontal_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.compat_button_inset_vertical_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_button_inset_vertical_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.compat_button_padding_horizontal_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_button_padding_horizontal_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.compat_button_padding_vertical_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_button_padding_vertical_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.compat_control_corner_material = global::HelloworldXamarin.Droid.Resource.Dimension.compat_control_corner_material;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.compat_notification_large_icon_max_height = global::HelloworldXamarin.Droid.Resource.Dimension.compat_notification_large_icon_max_height;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.compat_notification_large_icon_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.compat_notification_large_icon_max_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_appbar_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.design_appbar_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_navigation_active_item_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_active_item_max_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_navigation_active_item_min_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_active_item_min_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_navigation_active_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_active_text_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_navigation_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_navigation_height = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_height;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_navigation_icon_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_icon_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_navigation_item_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_item_max_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_navigation_item_min_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_item_min_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_navigation_margin = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_margin;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_navigation_shadow_height = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_shadow_height;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_navigation_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_navigation_text_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_sheet_modal_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_sheet_modal_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_bottom_sheet_peek_height_min = global::HelloworldXamarin.Droid.Resource.Dimension.design_bottom_sheet_peek_height_min;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_fab_border_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_border_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_fab_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_fab_image_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_image_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_fab_size_mini = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_size_mini;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_fab_size_normal = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_size_normal;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_fab_translation_z_hovered_focused = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_translation_z_hovered_focused;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_fab_translation_z_pressed = global::HelloworldXamarin.Droid.Resource.Dimension.design_fab_translation_z_pressed;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_navigation_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_navigation_icon_padding = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_icon_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_navigation_icon_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_icon_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_navigation_item_horizontal_padding = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_item_horizontal_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_navigation_item_icon_padding = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_item_icon_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_navigation_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_max_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_navigation_padding_bottom = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_padding_bottom;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_navigation_separator_vertical_padding = global::HelloworldXamarin.Droid.Resource.Dimension.design_navigation_separator_vertical_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_snackbar_action_inline_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_action_inline_max_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_snackbar_background_corner_radius = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_background_corner_radius;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_snackbar_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_snackbar_extra_spacing_horizontal = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_extra_spacing_horizontal;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_snackbar_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_max_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_snackbar_min_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_min_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_snackbar_padding_horizontal = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_padding_horizontal;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_snackbar_padding_vertical = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_padding_vertical;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_snackbar_padding_vertical_2lines = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_padding_vertical_2lines;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_snackbar_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_snackbar_text_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_tab_max_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_tab_max_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_tab_scrollable_min_width = global::HelloworldXamarin.Droid.Resource.Dimension.design_tab_scrollable_min_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_tab_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.design_tab_text_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_tab_text_size_2line = global::HelloworldXamarin.Droid.Resource.Dimension.design_tab_text_size_2line;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.design_textinput_caption_translate_y = global::HelloworldXamarin.Droid.Resource.Dimension.design_textinput_caption_translate_y;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.disabled_alpha_material_dark = global::HelloworldXamarin.Droid.Resource.Dimension.disabled_alpha_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.disabled_alpha_material_light = global::HelloworldXamarin.Droid.Resource.Dimension.disabled_alpha_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.fastscroll_default_thickness = global::HelloworldXamarin.Droid.Resource.Dimension.fastscroll_default_thickness;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.fastscroll_margin = global::HelloworldXamarin.Droid.Resource.Dimension.fastscroll_margin;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.fastscroll_minimum_range = global::HelloworldXamarin.Droid.Resource.Dimension.fastscroll_minimum_range;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.highlight_alpha_material_colored = global::HelloworldXamarin.Droid.Resource.Dimension.highlight_alpha_material_colored;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.highlight_alpha_material_dark = global::HelloworldXamarin.Droid.Resource.Dimension.highlight_alpha_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.highlight_alpha_material_light = global::HelloworldXamarin.Droid.Resource.Dimension.highlight_alpha_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.hint_alpha_material_dark = global::HelloworldXamarin.Droid.Resource.Dimension.hint_alpha_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.hint_alpha_material_light = global::HelloworldXamarin.Droid.Resource.Dimension.hint_alpha_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.hint_pressed_alpha_material_dark = global::HelloworldXamarin.Droid.Resource.Dimension.hint_pressed_alpha_material_dark;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.hint_pressed_alpha_material_light = global::HelloworldXamarin.Droid.Resource.Dimension.hint_pressed_alpha_material_light;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.item_touch_helper_max_drag_scroll_per_frame = global::HelloworldXamarin.Droid.Resource.Dimension.item_touch_helper_max_drag_scroll_per_frame;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.item_touch_helper_swipe_escape_max_velocity = global::HelloworldXamarin.Droid.Resource.Dimension.item_touch_helper_swipe_escape_max_velocity;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.item_touch_helper_swipe_escape_velocity = global::HelloworldXamarin.Droid.Resource.Dimension.item_touch_helper_swipe_escape_velocity;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_bottomappbar_fabOffsetEndMode = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_bottomappbar_fabOffsetEndMode;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_bottomappbar_fab_cradle_margin = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_bottomappbar_fab_cradle_margin;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_bottomappbar_fab_cradle_rounded_corner_radius = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_bottomappbar_fab_cradle_rounded_corner_radius;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_bottomappbar_fab_cradle_vertical_offset = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_bottomappbar_fab_cradle_vertical_offset;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_bottomappbar_height = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_bottomappbar_height;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_corner_radius = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_corner_radius;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_dialog_btn_min_width = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_dialog_btn_min_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_disabled_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_disabled_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_disabled_z = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_disabled_z;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_focused_z = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_focused_z;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_hovered_z = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_hovered_z;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_icon_btn_padding_left = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_icon_btn_padding_left;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_icon_padding = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_icon_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_inset = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_inset;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_letter_spacing = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_letter_spacing;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_padding_bottom = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_padding_bottom;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_padding_left = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_padding_left;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_padding_right = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_padding_right;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_padding_top = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_padding_top;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_pressed_z = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_pressed_z;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_stroke_size = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_stroke_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_text_btn_icon_padding = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_text_btn_icon_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_text_btn_padding_left = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_text_btn_padding_left;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_text_btn_padding_right = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_text_btn_padding_right;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_text_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_btn_z = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_btn_z;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_card_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_card_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_card_spacing = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_card_spacing;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_chip_pressed_translation_z = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_chip_pressed_translation_z;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_chip_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_chip_text_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_fab_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_fab_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_fab_translation_z_hovered_focused = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_fab_translation_z_hovered_focused;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_fab_translation_z_pressed = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_fab_translation_z_pressed;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_navigation_elevation = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_navigation_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_navigation_item_horizontal_padding = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_navigation_item_horizontal_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_navigation_item_icon_padding = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_navigation_item_icon_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_snackbar_background_corner_radius = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_snackbar_background_corner_radius;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_snackbar_margin = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_snackbar_margin;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_textinput_box_bottom_offset = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_bottom_offset;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_textinput_box_corner_radius_medium = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_corner_radius_medium;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_textinput_box_corner_radius_small = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_corner_radius_small;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_textinput_box_label_cutout_padding = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_label_cutout_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_textinput_box_padding_end = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_padding_end;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_textinput_box_stroke_width_default = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_stroke_width_default;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_textinput_box_stroke_width_focused = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_box_stroke_width_focused;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_textinput_outline_box_expanded_padding = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_textinput_outline_box_expanded_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.mtrl_toolbar_default_height = global::HelloworldXamarin.Droid.Resource.Dimension.mtrl_toolbar_default_height;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_action_icon_size = global::HelloworldXamarin.Droid.Resource.Dimension.notification_action_icon_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_action_text_size = global::HelloworldXamarin.Droid.Resource.Dimension.notification_action_text_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_big_circle_margin = global::HelloworldXamarin.Droid.Resource.Dimension.notification_big_circle_margin;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_content_margin_start = global::HelloworldXamarin.Droid.Resource.Dimension.notification_content_margin_start;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_large_icon_height = global::HelloworldXamarin.Droid.Resource.Dimension.notification_large_icon_height;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_large_icon_width = global::HelloworldXamarin.Droid.Resource.Dimension.notification_large_icon_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_main_column_padding_top = global::HelloworldXamarin.Droid.Resource.Dimension.notification_main_column_padding_top;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_media_narrow_margin = global::HelloworldXamarin.Droid.Resource.Dimension.notification_media_narrow_margin;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_right_icon_size = global::HelloworldXamarin.Droid.Resource.Dimension.notification_right_icon_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_right_side_padding_top = global::HelloworldXamarin.Droid.Resource.Dimension.notification_right_side_padding_top;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_small_icon_background_padding = global::HelloworldXamarin.Droid.Resource.Dimension.notification_small_icon_background_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_small_icon_size_as_large = global::HelloworldXamarin.Droid.Resource.Dimension.notification_small_icon_size_as_large;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_subtext_size = global::HelloworldXamarin.Droid.Resource.Dimension.notification_subtext_size;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_top_pad = global::HelloworldXamarin.Droid.Resource.Dimension.notification_top_pad;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.notification_top_pad_large_text = global::HelloworldXamarin.Droid.Resource.Dimension.notification_top_pad_large_text;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.subtitle_corner_radius = global::HelloworldXamarin.Droid.Resource.Dimension.subtitle_corner_radius;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.subtitle_outline_width = global::HelloworldXamarin.Droid.Resource.Dimension.subtitle_outline_width;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.subtitle_shadow_offset = global::HelloworldXamarin.Droid.Resource.Dimension.subtitle_shadow_offset;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.subtitle_shadow_radius = global::HelloworldXamarin.Droid.Resource.Dimension.subtitle_shadow_radius;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.tooltip_corner_radius = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_corner_radius;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.tooltip_horizontal_padding = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_horizontal_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.tooltip_margin = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_margin;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.tooltip_precise_anchor_extra_offset = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_precise_anchor_extra_offset;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.tooltip_precise_anchor_threshold = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_precise_anchor_threshold;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.tooltip_vertical_padding = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_vertical_padding;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.tooltip_y_offset_non_touch = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_y_offset_non_touch;
+                       global::Xamarin.Forms.Platform.Resource.Dimension.tooltip_y_offset_touch = global::HelloworldXamarin.Droid.Resource.Dimension.tooltip_y_offset_touch;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ab_share_pack_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ab_share_pack_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_action_bar_item_background_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_action_bar_item_background_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_btn_borderless_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_borderless_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_btn_check_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_check_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_btn_check_to_on_mtrl_000 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_check_to_on_mtrl_000;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_btn_check_to_on_mtrl_015 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_check_to_on_mtrl_015;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_btn_colored_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_colored_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_btn_default_mtrl_shape = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_default_mtrl_shape;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_btn_radio_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_radio_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_btn_radio_to_on_mtrl_000 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_radio_to_on_mtrl_000;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_btn_radio_to_on_mtrl_015 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_radio_to_on_mtrl_015;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_btn_switch_to_on_mtrl_00001 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_switch_to_on_mtrl_00001;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_btn_switch_to_on_mtrl_00012 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_btn_switch_to_on_mtrl_00012;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_cab_background_internal_bg = global::HelloworldXamarin.Droid.Resource.Drawable.abc_cab_background_internal_bg;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_cab_background_top_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_cab_background_top_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_cab_background_top_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_cab_background_top_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_control_background_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_control_background_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_dialog_material_background = global::HelloworldXamarin.Droid.Resource.Drawable.abc_dialog_material_background;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_edit_text_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_edit_text_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_ab_back_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_ab_back_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_arrow_drop_right_black_24dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_arrow_drop_right_black_24dp;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_clear_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_clear_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_commit_search_api_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_commit_search_api_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_go_search_api_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_go_search_api_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_menu_copy_mtrl_am_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_menu_copy_mtrl_am_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_menu_cut_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_menu_cut_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_menu_overflow_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_menu_overflow_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_menu_paste_mtrl_am_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_menu_paste_mtrl_am_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_menu_selectall_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_menu_selectall_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_menu_share_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_menu_share_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_search_api_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_search_api_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_star_black_16dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_star_black_16dp;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_star_black_36dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_star_black_36dp;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_star_black_48dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_star_black_48dp;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_star_half_black_16dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_star_half_black_16dp;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_star_half_black_36dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_star_half_black_36dp;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_star_half_black_48dp = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_star_half_black_48dp;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ic_voice_search_api_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ic_voice_search_api_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_item_background_holo_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_item_background_holo_dark;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_item_background_holo_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_item_background_holo_light;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_list_divider_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_divider_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_list_divider_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_divider_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_list_focused_holo = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_focused_holo;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_list_longpressed_holo = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_longpressed_holo;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_list_pressed_holo_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_pressed_holo_dark;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_list_pressed_holo_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_pressed_holo_light;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_list_selector_background_transition_holo_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_selector_background_transition_holo_dark;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_list_selector_background_transition_holo_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_selector_background_transition_holo_light;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_list_selector_disabled_holo_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_selector_disabled_holo_dark;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_list_selector_disabled_holo_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_selector_disabled_holo_light;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_list_selector_holo_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_selector_holo_dark;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_list_selector_holo_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_list_selector_holo_light;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_menu_hardkey_panel_mtrl_mult = global::HelloworldXamarin.Droid.Resource.Drawable.abc_menu_hardkey_panel_mtrl_mult;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_popup_background_mtrl_mult = global::HelloworldXamarin.Droid.Resource.Drawable.abc_popup_background_mtrl_mult;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ratingbar_indicator_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ratingbar_indicator_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ratingbar_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ratingbar_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_ratingbar_small_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_ratingbar_small_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_scrubber_control_off_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_scrubber_control_off_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_scrubber_control_to_pressed_mtrl_000 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_scrubber_control_to_pressed_mtrl_000;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_scrubber_control_to_pressed_mtrl_005 = global::HelloworldXamarin.Droid.Resource.Drawable.abc_scrubber_control_to_pressed_mtrl_005;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_scrubber_primary_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_scrubber_primary_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_scrubber_track_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_scrubber_track_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_seekbar_thumb_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_seekbar_thumb_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_seekbar_tick_mark_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_seekbar_tick_mark_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_seekbar_track_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_seekbar_track_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_spinner_mtrl_am_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_spinner_mtrl_am_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_spinner_textfield_background_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_spinner_textfield_background_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_switch_thumb_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_switch_thumb_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_switch_track_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_switch_track_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_tab_indicator_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_tab_indicator_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_tab_indicator_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_tab_indicator_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_textfield_activated_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_textfield_activated_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_textfield_default_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_textfield_default_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_textfield_search_activated_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_textfield_search_activated_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_textfield_search_default_mtrl_alpha = global::HelloworldXamarin.Droid.Resource.Drawable.abc_textfield_search_default_mtrl_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_textfield_search_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_textfield_search_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_text_cursor_material = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_cursor_material;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_text_select_handle_left_mtrl_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_select_handle_left_mtrl_dark;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_text_select_handle_left_mtrl_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_select_handle_left_mtrl_light;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_text_select_handle_middle_mtrl_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_select_handle_middle_mtrl_dark;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_text_select_handle_middle_mtrl_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_select_handle_middle_mtrl_light;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_text_select_handle_right_mtrl_dark = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_select_handle_right_mtrl_dark;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_text_select_handle_right_mtrl_light = global::HelloworldXamarin.Droid.Resource.Drawable.abc_text_select_handle_right_mtrl_light;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.abc_vector_test = global::HelloworldXamarin.Droid.Resource.Drawable.abc_vector_test;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.avd_hide_password = global::HelloworldXamarin.Droid.Resource.Drawable.avd_hide_password;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.avd_show_password = global::HelloworldXamarin.Droid.Resource.Drawable.avd_show_password;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.design_bottom_navigation_item_background = global::HelloworldXamarin.Droid.Resource.Drawable.design_bottom_navigation_item_background;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.design_fab_background = global::HelloworldXamarin.Droid.Resource.Drawable.design_fab_background;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.design_ic_visibility = global::HelloworldXamarin.Droid.Resource.Drawable.design_ic_visibility;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.design_ic_visibility_off = global::HelloworldXamarin.Droid.Resource.Drawable.design_ic_visibility_off;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.design_password_eye = global::HelloworldXamarin.Droid.Resource.Drawable.design_password_eye;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.design_snackbar_background = global::HelloworldXamarin.Droid.Resource.Drawable.design_snackbar_background;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.ic_mtrl_chip_checked_black = global::HelloworldXamarin.Droid.Resource.Drawable.ic_mtrl_chip_checked_black;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.ic_mtrl_chip_checked_circle = global::HelloworldXamarin.Droid.Resource.Drawable.ic_mtrl_chip_checked_circle;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.ic_mtrl_chip_close_circle = global::HelloworldXamarin.Droid.Resource.Drawable.ic_mtrl_chip_close_circle;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.mtrl_snackbar_background = global::HelloworldXamarin.Droid.Resource.Drawable.mtrl_snackbar_background;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.mtrl_tabs_default_indicator = global::HelloworldXamarin.Droid.Resource.Drawable.mtrl_tabs_default_indicator;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.navigation_empty_icon = global::HelloworldXamarin.Droid.Resource.Drawable.navigation_empty_icon;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.notification_action_background = global::HelloworldXamarin.Droid.Resource.Drawable.notification_action_background;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.notification_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.notification_bg_low = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_low;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.notification_bg_low_normal = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_low_normal;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.notification_bg_low_pressed = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_low_pressed;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.notification_bg_normal = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_normal;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.notification_bg_normal_pressed = global::HelloworldXamarin.Droid.Resource.Drawable.notification_bg_normal_pressed;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.notification_icon_background = global::HelloworldXamarin.Droid.Resource.Drawable.notification_icon_background;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.notification_template_icon_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notification_template_icon_bg;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.notification_template_icon_low_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notification_template_icon_low_bg;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.notification_tile_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notification_tile_bg;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.notify_panel_notification_icon_bg = global::HelloworldXamarin.Droid.Resource.Drawable.notify_panel_notification_icon_bg;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.tooltip_frame_dark = global::HelloworldXamarin.Droid.Resource.Drawable.tooltip_frame_dark;
+                       global::Xamarin.Forms.Platform.Resource.Drawable.tooltip_frame_light = global::HelloworldXamarin.Droid.Resource.Drawable.tooltip_frame_light;
+                       global::Xamarin.Forms.Platform.Resource.Id.action0 = global::HelloworldXamarin.Droid.Resource.Id.action0;
+                       global::Xamarin.Forms.Platform.Resource.Id.actions = global::HelloworldXamarin.Droid.Resource.Id.actions;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_bar = global::HelloworldXamarin.Droid.Resource.Id.action_bar;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_bar_activity_content = global::HelloworldXamarin.Droid.Resource.Id.action_bar_activity_content;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_bar_container = global::HelloworldXamarin.Droid.Resource.Id.action_bar_container;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_bar_root = global::HelloworldXamarin.Droid.Resource.Id.action_bar_root;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_bar_spinner = global::HelloworldXamarin.Droid.Resource.Id.action_bar_spinner;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_bar_subtitle = global::HelloworldXamarin.Droid.Resource.Id.action_bar_subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_bar_title = global::HelloworldXamarin.Droid.Resource.Id.action_bar_title;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_container = global::HelloworldXamarin.Droid.Resource.Id.action_container;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_context_bar = global::HelloworldXamarin.Droid.Resource.Id.action_context_bar;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_divider = global::HelloworldXamarin.Droid.Resource.Id.action_divider;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_image = global::HelloworldXamarin.Droid.Resource.Id.action_image;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_menu_divider = global::HelloworldXamarin.Droid.Resource.Id.action_menu_divider;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_menu_presenter = global::HelloworldXamarin.Droid.Resource.Id.action_menu_presenter;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_mode_bar = global::HelloworldXamarin.Droid.Resource.Id.action_mode_bar;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_mode_bar_stub = global::HelloworldXamarin.Droid.Resource.Id.action_mode_bar_stub;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_mode_close_button = global::HelloworldXamarin.Droid.Resource.Id.action_mode_close_button;
+                       global::Xamarin.Forms.Platform.Resource.Id.action_text = global::HelloworldXamarin.Droid.Resource.Id.action_text;
+                       global::Xamarin.Forms.Platform.Resource.Id.activity_chooser_view_content = global::HelloworldXamarin.Droid.Resource.Id.activity_chooser_view_content;
+                       global::Xamarin.Forms.Platform.Resource.Id.add = global::HelloworldXamarin.Droid.Resource.Id.add;
+                       global::Xamarin.Forms.Platform.Resource.Id.alertTitle = global::HelloworldXamarin.Droid.Resource.Id.alertTitle;
+                       global::Xamarin.Forms.Platform.Resource.Id.all = global::HelloworldXamarin.Droid.Resource.Id.all;
+                       global::Xamarin.Forms.Platform.Resource.Id.ALT = global::HelloworldXamarin.Droid.Resource.Id.ALT;
+                       global::Xamarin.Forms.Platform.Resource.Id.always = global::HelloworldXamarin.Droid.Resource.Id.always;
+                       global::Xamarin.Forms.Platform.Resource.Id.async = global::HelloworldXamarin.Droid.Resource.Id.async;
+                       global::Xamarin.Forms.Platform.Resource.Id.auto = global::HelloworldXamarin.Droid.Resource.Id.auto;
+                       global::Xamarin.Forms.Platform.Resource.Id.beginning = global::HelloworldXamarin.Droid.Resource.Id.beginning;
+                       global::Xamarin.Forms.Platform.Resource.Id.blocking = global::HelloworldXamarin.Droid.Resource.Id.blocking;
+                       global::Xamarin.Forms.Platform.Resource.Id.bottom = global::HelloworldXamarin.Droid.Resource.Id.bottom;
+                       global::Xamarin.Forms.Platform.Resource.Id.bottomtab_navarea = global::HelloworldXamarin.Droid.Resource.Id.bottomtab_navarea;
+                       global::Xamarin.Forms.Platform.Resource.Id.bottomtab_tabbar = global::HelloworldXamarin.Droid.Resource.Id.bottomtab_tabbar;
+                       global::Xamarin.Forms.Platform.Resource.Id.buttonPanel = global::HelloworldXamarin.Droid.Resource.Id.buttonPanel;
+                       global::Xamarin.Forms.Platform.Resource.Id.cancel_action = global::HelloworldXamarin.Droid.Resource.Id.cancel_action;
+                       global::Xamarin.Forms.Platform.Resource.Id.center = global::HelloworldXamarin.Droid.Resource.Id.center;
+                       global::Xamarin.Forms.Platform.Resource.Id.center_horizontal = global::HelloworldXamarin.Droid.Resource.Id.center_horizontal;
+                       global::Xamarin.Forms.Platform.Resource.Id.center_vertical = global::HelloworldXamarin.Droid.Resource.Id.center_vertical;
+                       global::Xamarin.Forms.Platform.Resource.Id.checkbox = global::HelloworldXamarin.Droid.Resource.Id.checkbox;
+                       global::Xamarin.Forms.Platform.Resource.Id.chronometer = global::HelloworldXamarin.Droid.Resource.Id.chronometer;
+                       global::Xamarin.Forms.Platform.Resource.Id.clip_horizontal = global::HelloworldXamarin.Droid.Resource.Id.clip_horizontal;
+                       global::Xamarin.Forms.Platform.Resource.Id.clip_vertical = global::HelloworldXamarin.Droid.Resource.Id.clip_vertical;
+                       global::Xamarin.Forms.Platform.Resource.Id.collapseActionView = global::HelloworldXamarin.Droid.Resource.Id.collapseActionView;
+                       global::Xamarin.Forms.Platform.Resource.Id.container = global::HelloworldXamarin.Droid.Resource.Id.container;
+                       global::Xamarin.Forms.Platform.Resource.Id.content = global::HelloworldXamarin.Droid.Resource.Id.content;
+                       global::Xamarin.Forms.Platform.Resource.Id.contentPanel = global::HelloworldXamarin.Droid.Resource.Id.contentPanel;
+                       global::Xamarin.Forms.Platform.Resource.Id.coordinator = global::HelloworldXamarin.Droid.Resource.Id.coordinator;
+                       global::Xamarin.Forms.Platform.Resource.Id.CTRL = global::HelloworldXamarin.Droid.Resource.Id.CTRL;
+                       global::Xamarin.Forms.Platform.Resource.Id.custom = global::HelloworldXamarin.Droid.Resource.Id.custom;
+                       global::Xamarin.Forms.Platform.Resource.Id.customPanel = global::HelloworldXamarin.Droid.Resource.Id.customPanel;
+                       global::Xamarin.Forms.Platform.Resource.Id.decor_content_parent = global::HelloworldXamarin.Droid.Resource.Id.decor_content_parent;
+                       global::Xamarin.Forms.Platform.Resource.Id.default_activity_button = global::HelloworldXamarin.Droid.Resource.Id.default_activity_button;
+                       global::Xamarin.Forms.Platform.Resource.Id.design_bottom_sheet = global::HelloworldXamarin.Droid.Resource.Id.design_bottom_sheet;
+                       global::Xamarin.Forms.Platform.Resource.Id.design_menu_item_action_area = global::HelloworldXamarin.Droid.Resource.Id.design_menu_item_action_area;
+                       global::Xamarin.Forms.Platform.Resource.Id.design_menu_item_action_area_stub = global::HelloworldXamarin.Droid.Resource.Id.design_menu_item_action_area_stub;
+                       global::Xamarin.Forms.Platform.Resource.Id.design_menu_item_text = global::HelloworldXamarin.Droid.Resource.Id.design_menu_item_text;
+                       global::Xamarin.Forms.Platform.Resource.Id.design_navigation_view = global::HelloworldXamarin.Droid.Resource.Id.design_navigation_view;
+                       global::Xamarin.Forms.Platform.Resource.Id.disableHome = global::HelloworldXamarin.Droid.Resource.Id.disableHome;
+                       global::Xamarin.Forms.Platform.Resource.Id.edit_query = global::HelloworldXamarin.Droid.Resource.Id.edit_query;
+                       global::Xamarin.Forms.Platform.Resource.Id.end = global::HelloworldXamarin.Droid.Resource.Id.end;
+                       global::Xamarin.Forms.Platform.Resource.Id.end_padder = global::HelloworldXamarin.Droid.Resource.Id.end_padder;
+                       global::Xamarin.Forms.Platform.Resource.Id.enterAlways = global::HelloworldXamarin.Droid.Resource.Id.enterAlways;
+                       global::Xamarin.Forms.Platform.Resource.Id.enterAlwaysCollapsed = global::HelloworldXamarin.Droid.Resource.Id.enterAlwaysCollapsed;
+                       global::Xamarin.Forms.Platform.Resource.Id.exitUntilCollapsed = global::HelloworldXamarin.Droid.Resource.Id.exitUntilCollapsed;
+                       global::Xamarin.Forms.Platform.Resource.Id.expanded_menu = global::HelloworldXamarin.Droid.Resource.Id.expanded_menu;
+                       global::Xamarin.Forms.Platform.Resource.Id.expand_activities_button = global::HelloworldXamarin.Droid.Resource.Id.expand_activities_button;
+                       global::Xamarin.Forms.Platform.Resource.Id.fill = global::HelloworldXamarin.Droid.Resource.Id.fill;
+                       global::Xamarin.Forms.Platform.Resource.Id.filled = global::HelloworldXamarin.Droid.Resource.Id.filled;
+                       global::Xamarin.Forms.Platform.Resource.Id.fill_horizontal = global::HelloworldXamarin.Droid.Resource.Id.fill_horizontal;
+                       global::Xamarin.Forms.Platform.Resource.Id.fill_vertical = global::HelloworldXamarin.Droid.Resource.Id.fill_vertical;
+                       global::Xamarin.Forms.Platform.Resource.Id.@fixed = global::HelloworldXamarin.Droid.Resource.Id.@fixed;
+                       global::Xamarin.Forms.Platform.Resource.Id.flyoutcontent_appbar = global::HelloworldXamarin.Droid.Resource.Id.flyoutcontent_appbar;
+                       global::Xamarin.Forms.Platform.Resource.Id.flyoutcontent_recycler = global::HelloworldXamarin.Droid.Resource.Id.flyoutcontent_recycler;
+                       global::Xamarin.Forms.Platform.Resource.Id.forever = global::HelloworldXamarin.Droid.Resource.Id.forever;
+                       global::Xamarin.Forms.Platform.Resource.Id.FUNCTION = global::HelloworldXamarin.Droid.Resource.Id.FUNCTION;
+                       global::Xamarin.Forms.Platform.Resource.Id.ghost_view = global::HelloworldXamarin.Droid.Resource.Id.ghost_view;
+                       global::Xamarin.Forms.Platform.Resource.Id.group_divider = global::HelloworldXamarin.Droid.Resource.Id.group_divider;
+                       global::Xamarin.Forms.Platform.Resource.Id.home = global::HelloworldXamarin.Droid.Resource.Id.home;
+                       global::Xamarin.Forms.Platform.Resource.Id.homeAsUp = global::HelloworldXamarin.Droid.Resource.Id.homeAsUp;
+                       global::Xamarin.Forms.Platform.Resource.Id.icon = global::HelloworldXamarin.Droid.Resource.Id.icon;
+                       global::Xamarin.Forms.Platform.Resource.Id.icon_group = global::HelloworldXamarin.Droid.Resource.Id.icon_group;
+                       global::Xamarin.Forms.Platform.Resource.Id.ifRoom = global::HelloworldXamarin.Droid.Resource.Id.ifRoom;
+                       global::Xamarin.Forms.Platform.Resource.Id.image = global::HelloworldXamarin.Droid.Resource.Id.image;
+                       global::Xamarin.Forms.Platform.Resource.Id.info = global::HelloworldXamarin.Droid.Resource.Id.info;
+                       global::Xamarin.Forms.Platform.Resource.Id.italic = global::HelloworldXamarin.Droid.Resource.Id.italic;
+                       global::Xamarin.Forms.Platform.Resource.Id.item_touch_helper_previous_elevation = global::HelloworldXamarin.Droid.Resource.Id.item_touch_helper_previous_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Id.labeled = global::HelloworldXamarin.Droid.Resource.Id.labeled;
+                       global::Xamarin.Forms.Platform.Resource.Id.largeLabel = global::HelloworldXamarin.Droid.Resource.Id.largeLabel;
+                       global::Xamarin.Forms.Platform.Resource.Id.left = global::HelloworldXamarin.Droid.Resource.Id.left;
+                       global::Xamarin.Forms.Platform.Resource.Id.line1 = global::HelloworldXamarin.Droid.Resource.Id.line1;
+                       global::Xamarin.Forms.Platform.Resource.Id.line3 = global::HelloworldXamarin.Droid.Resource.Id.line3;
+                       global::Xamarin.Forms.Platform.Resource.Id.listMode = global::HelloworldXamarin.Droid.Resource.Id.listMode;
+                       global::Xamarin.Forms.Platform.Resource.Id.list_item = global::HelloworldXamarin.Droid.Resource.Id.list_item;
+                       global::Xamarin.Forms.Platform.Resource.Id.main_appbar = global::HelloworldXamarin.Droid.Resource.Id.main_appbar;
+                       global::Xamarin.Forms.Platform.Resource.Id.main_tablayout = global::HelloworldXamarin.Droid.Resource.Id.main_tablayout;
+                       global::Xamarin.Forms.Platform.Resource.Id.main_toolbar = global::HelloworldXamarin.Droid.Resource.Id.main_toolbar;
+                       global::Xamarin.Forms.Platform.Resource.Id.main_viewpager = global::HelloworldXamarin.Droid.Resource.Id.main_viewpager;
+                       global::Xamarin.Forms.Platform.Resource.Id.masked = global::HelloworldXamarin.Droid.Resource.Id.masked;
+                       global::Xamarin.Forms.Platform.Resource.Id.media_actions = global::HelloworldXamarin.Droid.Resource.Id.media_actions;
+                       global::Xamarin.Forms.Platform.Resource.Id.message = global::HelloworldXamarin.Droid.Resource.Id.message;
+                       global::Xamarin.Forms.Platform.Resource.Id.META = global::HelloworldXamarin.Droid.Resource.Id.META;
+                       global::Xamarin.Forms.Platform.Resource.Id.middle = global::HelloworldXamarin.Droid.Resource.Id.middle;
+                       global::Xamarin.Forms.Platform.Resource.Id.mini = global::HelloworldXamarin.Droid.Resource.Id.mini;
+                       global::Xamarin.Forms.Platform.Resource.Id.mtrl_child_content_container = global::HelloworldXamarin.Droid.Resource.Id.mtrl_child_content_container;
+                       global::Xamarin.Forms.Platform.Resource.Id.mtrl_internal_children_alpha_tag = global::HelloworldXamarin.Droid.Resource.Id.mtrl_internal_children_alpha_tag;
+                       global::Xamarin.Forms.Platform.Resource.Id.multiply = global::HelloworldXamarin.Droid.Resource.Id.multiply;
+                       global::Xamarin.Forms.Platform.Resource.Id.navigation_header_container = global::HelloworldXamarin.Droid.Resource.Id.navigation_header_container;
+                       global::Xamarin.Forms.Platform.Resource.Id.never = global::HelloworldXamarin.Droid.Resource.Id.never;
+                       global::Xamarin.Forms.Platform.Resource.Id.none = global::HelloworldXamarin.Droid.Resource.Id.none;
+                       global::Xamarin.Forms.Platform.Resource.Id.normal = global::HelloworldXamarin.Droid.Resource.Id.normal;
+                       global::Xamarin.Forms.Platform.Resource.Id.notification_background = global::HelloworldXamarin.Droid.Resource.Id.notification_background;
+                       global::Xamarin.Forms.Platform.Resource.Id.notification_main_column = global::HelloworldXamarin.Droid.Resource.Id.notification_main_column;
+                       global::Xamarin.Forms.Platform.Resource.Id.notification_main_column_container = global::HelloworldXamarin.Droid.Resource.Id.notification_main_column_container;
+                       global::Xamarin.Forms.Platform.Resource.Id.outline = global::HelloworldXamarin.Droid.Resource.Id.outline;
+                       global::Xamarin.Forms.Platform.Resource.Id.parallax = global::HelloworldXamarin.Droid.Resource.Id.parallax;
+                       global::Xamarin.Forms.Platform.Resource.Id.parentPanel = global::HelloworldXamarin.Droid.Resource.Id.parentPanel;
+                       global::Xamarin.Forms.Platform.Resource.Id.parent_matrix = global::HelloworldXamarin.Droid.Resource.Id.parent_matrix;
+                       global::Xamarin.Forms.Platform.Resource.Id.pin = global::HelloworldXamarin.Droid.Resource.Id.pin;
+                       global::Xamarin.Forms.Platform.Resource.Id.progress_circular = global::HelloworldXamarin.Droid.Resource.Id.progress_circular;
+                       global::Xamarin.Forms.Platform.Resource.Id.progress_horizontal = global::HelloworldXamarin.Droid.Resource.Id.progress_horizontal;
+                       global::Xamarin.Forms.Platform.Resource.Id.radio = global::HelloworldXamarin.Droid.Resource.Id.radio;
+                       global::Xamarin.Forms.Platform.Resource.Id.right = global::HelloworldXamarin.Droid.Resource.Id.right;
+                       global::Xamarin.Forms.Platform.Resource.Id.right_icon = global::HelloworldXamarin.Droid.Resource.Id.right_icon;
+                       global::Xamarin.Forms.Platform.Resource.Id.right_side = global::HelloworldXamarin.Droid.Resource.Id.right_side;
+                       global::Xamarin.Forms.Platform.Resource.Id.save_image_matrix = global::HelloworldXamarin.Droid.Resource.Id.save_image_matrix;
+                       global::Xamarin.Forms.Platform.Resource.Id.save_non_transition_alpha = global::HelloworldXamarin.Droid.Resource.Id.save_non_transition_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Id.save_scale_type = global::HelloworldXamarin.Droid.Resource.Id.save_scale_type;
+                       global::Xamarin.Forms.Platform.Resource.Id.screen = global::HelloworldXamarin.Droid.Resource.Id.screen;
+                       global::Xamarin.Forms.Platform.Resource.Id.scroll = global::HelloworldXamarin.Droid.Resource.Id.scroll;
+                       global::Xamarin.Forms.Platform.Resource.Id.scrollable = global::HelloworldXamarin.Droid.Resource.Id.scrollable;
+                       global::Xamarin.Forms.Platform.Resource.Id.scrollIndicatorDown = global::HelloworldXamarin.Droid.Resource.Id.scrollIndicatorDown;
+                       global::Xamarin.Forms.Platform.Resource.Id.scrollIndicatorUp = global::HelloworldXamarin.Droid.Resource.Id.scrollIndicatorUp;
+                       global::Xamarin.Forms.Platform.Resource.Id.scrollView = global::HelloworldXamarin.Droid.Resource.Id.scrollView;
+                       global::Xamarin.Forms.Platform.Resource.Id.search_badge = global::HelloworldXamarin.Droid.Resource.Id.search_badge;
+                       global::Xamarin.Forms.Platform.Resource.Id.search_bar = global::HelloworldXamarin.Droid.Resource.Id.search_bar;
+                       global::Xamarin.Forms.Platform.Resource.Id.search_button = global::HelloworldXamarin.Droid.Resource.Id.search_button;
+                       global::Xamarin.Forms.Platform.Resource.Id.search_close_btn = global::HelloworldXamarin.Droid.Resource.Id.search_close_btn;
+                       global::Xamarin.Forms.Platform.Resource.Id.search_edit_frame = global::HelloworldXamarin.Droid.Resource.Id.search_edit_frame;
+                       global::Xamarin.Forms.Platform.Resource.Id.search_go_btn = global::HelloworldXamarin.Droid.Resource.Id.search_go_btn;
+                       global::Xamarin.Forms.Platform.Resource.Id.search_mag_icon = global::HelloworldXamarin.Droid.Resource.Id.search_mag_icon;
+                       global::Xamarin.Forms.Platform.Resource.Id.search_plate = global::HelloworldXamarin.Droid.Resource.Id.search_plate;
+                       global::Xamarin.Forms.Platform.Resource.Id.search_src_text = global::HelloworldXamarin.Droid.Resource.Id.search_src_text;
+                       global::Xamarin.Forms.Platform.Resource.Id.search_voice_btn = global::HelloworldXamarin.Droid.Resource.Id.search_voice_btn;
+                       global::Xamarin.Forms.Platform.Resource.Id.selected = global::HelloworldXamarin.Droid.Resource.Id.selected;
+                       global::Xamarin.Forms.Platform.Resource.Id.select_dialog_listview = global::HelloworldXamarin.Droid.Resource.Id.select_dialog_listview;
+                       global::Xamarin.Forms.Platform.Resource.Id.shellcontent_appbar = global::HelloworldXamarin.Droid.Resource.Id.shellcontent_appbar;
+                       global::Xamarin.Forms.Platform.Resource.Id.shellcontent_toolbar = global::HelloworldXamarin.Droid.Resource.Id.shellcontent_toolbar;
+                       global::Xamarin.Forms.Platform.Resource.Id.SHIFT = global::HelloworldXamarin.Droid.Resource.Id.SHIFT;
+                       global::Xamarin.Forms.Platform.Resource.Id.shortcut = global::HelloworldXamarin.Droid.Resource.Id.shortcut;
+                       global::Xamarin.Forms.Platform.Resource.Id.showCustom = global::HelloworldXamarin.Droid.Resource.Id.showCustom;
+                       global::Xamarin.Forms.Platform.Resource.Id.showHome = global::HelloworldXamarin.Droid.Resource.Id.showHome;
+                       global::Xamarin.Forms.Platform.Resource.Id.showTitle = global::HelloworldXamarin.Droid.Resource.Id.showTitle;
+                       global::Xamarin.Forms.Platform.Resource.Id.smallLabel = global::HelloworldXamarin.Droid.Resource.Id.smallLabel;
+                       global::Xamarin.Forms.Platform.Resource.Id.snackbar_action = global::HelloworldXamarin.Droid.Resource.Id.snackbar_action;
+                       global::Xamarin.Forms.Platform.Resource.Id.snackbar_text = global::HelloworldXamarin.Droid.Resource.Id.snackbar_text;
+                       global::Xamarin.Forms.Platform.Resource.Id.snap = global::HelloworldXamarin.Droid.Resource.Id.snap;
+                       global::Xamarin.Forms.Platform.Resource.Id.snapMargins = global::HelloworldXamarin.Droid.Resource.Id.snapMargins;
+                       global::Xamarin.Forms.Platform.Resource.Id.spacer = global::HelloworldXamarin.Droid.Resource.Id.spacer;
+                       global::Xamarin.Forms.Platform.Resource.Id.split_action_bar = global::HelloworldXamarin.Droid.Resource.Id.split_action_bar;
+                       global::Xamarin.Forms.Platform.Resource.Id.src_atop = global::HelloworldXamarin.Droid.Resource.Id.src_atop;
+                       global::Xamarin.Forms.Platform.Resource.Id.src_in = global::HelloworldXamarin.Droid.Resource.Id.src_in;
+                       global::Xamarin.Forms.Platform.Resource.Id.src_over = global::HelloworldXamarin.Droid.Resource.Id.src_over;
+                       global::Xamarin.Forms.Platform.Resource.Id.start = global::HelloworldXamarin.Droid.Resource.Id.start;
+                       global::Xamarin.Forms.Platform.Resource.Id.status_bar_latest_event_content = global::HelloworldXamarin.Droid.Resource.Id.status_bar_latest_event_content;
+                       global::Xamarin.Forms.Platform.Resource.Id.stretch = global::HelloworldXamarin.Droid.Resource.Id.stretch;
+                       global::Xamarin.Forms.Platform.Resource.Id.submenuarrow = global::HelloworldXamarin.Droid.Resource.Id.submenuarrow;
+                       global::Xamarin.Forms.Platform.Resource.Id.submit_area = global::HelloworldXamarin.Droid.Resource.Id.submit_area;
+                       global::Xamarin.Forms.Platform.Resource.Id.SYM = global::HelloworldXamarin.Droid.Resource.Id.SYM;
+                       global::Xamarin.Forms.Platform.Resource.Id.tabMode = global::HelloworldXamarin.Droid.Resource.Id.tabMode;
+                       global::Xamarin.Forms.Platform.Resource.Id.tag_transition_group = global::HelloworldXamarin.Droid.Resource.Id.tag_transition_group;
+                       global::Xamarin.Forms.Platform.Resource.Id.tag_unhandled_key_event_manager = global::HelloworldXamarin.Droid.Resource.Id.tag_unhandled_key_event_manager;
+                       global::Xamarin.Forms.Platform.Resource.Id.tag_unhandled_key_listeners = global::HelloworldXamarin.Droid.Resource.Id.tag_unhandled_key_listeners;
+                       global::Xamarin.Forms.Platform.Resource.Id.text = global::HelloworldXamarin.Droid.Resource.Id.text;
+                       global::Xamarin.Forms.Platform.Resource.Id.text2 = global::HelloworldXamarin.Droid.Resource.Id.text2;
+                       global::Xamarin.Forms.Platform.Resource.Id.textinput_counter = global::HelloworldXamarin.Droid.Resource.Id.textinput_counter;
+                       global::Xamarin.Forms.Platform.Resource.Id.textinput_error = global::HelloworldXamarin.Droid.Resource.Id.textinput_error;
+                       global::Xamarin.Forms.Platform.Resource.Id.textinput_helper_text = global::HelloworldXamarin.Droid.Resource.Id.textinput_helper_text;
+                       global::Xamarin.Forms.Platform.Resource.Id.textSpacerNoButtons = global::HelloworldXamarin.Droid.Resource.Id.textSpacerNoButtons;
+                       global::Xamarin.Forms.Platform.Resource.Id.textSpacerNoTitle = global::HelloworldXamarin.Droid.Resource.Id.textSpacerNoTitle;
+                       global::Xamarin.Forms.Platform.Resource.Id.textStart = global::HelloworldXamarin.Droid.Resource.Id.textStart;
+                       global::Xamarin.Forms.Platform.Resource.Id.text_input_password_toggle = global::HelloworldXamarin.Droid.Resource.Id.text_input_password_toggle;
+                       global::Xamarin.Forms.Platform.Resource.Id.time = global::HelloworldXamarin.Droid.Resource.Id.time;
+                       global::Xamarin.Forms.Platform.Resource.Id.title = global::HelloworldXamarin.Droid.Resource.Id.title;
+                       global::Xamarin.Forms.Platform.Resource.Id.titleDividerNoCustom = global::HelloworldXamarin.Droid.Resource.Id.titleDividerNoCustom;
+                       global::Xamarin.Forms.Platform.Resource.Id.title_template = global::HelloworldXamarin.Droid.Resource.Id.title_template;
+                       global::Xamarin.Forms.Platform.Resource.Id.top = global::HelloworldXamarin.Droid.Resource.Id.top;
+                       global::Xamarin.Forms.Platform.Resource.Id.topPanel = global::HelloworldXamarin.Droid.Resource.Id.topPanel;
+                       global::Xamarin.Forms.Platform.Resource.Id.touch_outside = global::HelloworldXamarin.Droid.Resource.Id.touch_outside;
+                       global::Xamarin.Forms.Platform.Resource.Id.transition_current_scene = global::HelloworldXamarin.Droid.Resource.Id.transition_current_scene;
+                       global::Xamarin.Forms.Platform.Resource.Id.transition_layout_save = global::HelloworldXamarin.Droid.Resource.Id.transition_layout_save;
+                       global::Xamarin.Forms.Platform.Resource.Id.transition_position = global::HelloworldXamarin.Droid.Resource.Id.transition_position;
+                       global::Xamarin.Forms.Platform.Resource.Id.transition_scene_layoutid_cache = global::HelloworldXamarin.Droid.Resource.Id.transition_scene_layoutid_cache;
+                       global::Xamarin.Forms.Platform.Resource.Id.transition_transform = global::HelloworldXamarin.Droid.Resource.Id.transition_transform;
+                       global::Xamarin.Forms.Platform.Resource.Id.uniform = global::HelloworldXamarin.Droid.Resource.Id.uniform;
+                       global::Xamarin.Forms.Platform.Resource.Id.unlabeled = global::HelloworldXamarin.Droid.Resource.Id.unlabeled;
+                       global::Xamarin.Forms.Platform.Resource.Id.up = global::HelloworldXamarin.Droid.Resource.Id.up;
+                       global::Xamarin.Forms.Platform.Resource.Id.useLogo = global::HelloworldXamarin.Droid.Resource.Id.useLogo;
+                       global::Xamarin.Forms.Platform.Resource.Id.view_offset_helper = global::HelloworldXamarin.Droid.Resource.Id.view_offset_helper;
+                       global::Xamarin.Forms.Platform.Resource.Id.visible = global::HelloworldXamarin.Droid.Resource.Id.visible;
+                       global::Xamarin.Forms.Platform.Resource.Id.withText = global::HelloworldXamarin.Droid.Resource.Id.withText;
+                       global::Xamarin.Forms.Platform.Resource.Id.wrap_content = global::HelloworldXamarin.Droid.Resource.Id.wrap_content;
+                       global::Xamarin.Forms.Platform.Resource.Integer.abc_config_activityDefaultDur = global::HelloworldXamarin.Droid.Resource.Integer.abc_config_activityDefaultDur;
+                       global::Xamarin.Forms.Platform.Resource.Integer.abc_config_activityShortDur = global::HelloworldXamarin.Droid.Resource.Integer.abc_config_activityShortDur;
+                       global::Xamarin.Forms.Platform.Resource.Integer.app_bar_elevation_anim_duration = global::HelloworldXamarin.Droid.Resource.Integer.app_bar_elevation_anim_duration;
+                       global::Xamarin.Forms.Platform.Resource.Integer.bottom_sheet_slide_duration = global::HelloworldXamarin.Droid.Resource.Integer.bottom_sheet_slide_duration;
+                       global::Xamarin.Forms.Platform.Resource.Integer.cancel_button_image_alpha = global::HelloworldXamarin.Droid.Resource.Integer.cancel_button_image_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Integer.config_tooltipAnimTime = global::HelloworldXamarin.Droid.Resource.Integer.config_tooltipAnimTime;
+                       global::Xamarin.Forms.Platform.Resource.Integer.design_snackbar_text_max_lines = global::HelloworldXamarin.Droid.Resource.Integer.design_snackbar_text_max_lines;
+                       global::Xamarin.Forms.Platform.Resource.Integer.design_tab_indicator_anim_duration_ms = global::HelloworldXamarin.Droid.Resource.Integer.design_tab_indicator_anim_duration_ms;
+                       global::Xamarin.Forms.Platform.Resource.Integer.hide_password_duration = global::HelloworldXamarin.Droid.Resource.Integer.hide_password_duration;
+                       global::Xamarin.Forms.Platform.Resource.Integer.mtrl_btn_anim_delay_ms = global::HelloworldXamarin.Droid.Resource.Integer.mtrl_btn_anim_delay_ms;
+                       global::Xamarin.Forms.Platform.Resource.Integer.mtrl_btn_anim_duration_ms = global::HelloworldXamarin.Droid.Resource.Integer.mtrl_btn_anim_duration_ms;
+                       global::Xamarin.Forms.Platform.Resource.Integer.mtrl_chip_anim_duration = global::HelloworldXamarin.Droid.Resource.Integer.mtrl_chip_anim_duration;
+                       global::Xamarin.Forms.Platform.Resource.Integer.mtrl_tab_indicator_anim_duration_ms = global::HelloworldXamarin.Droid.Resource.Integer.mtrl_tab_indicator_anim_duration_ms;
+                       global::Xamarin.Forms.Platform.Resource.Integer.show_password_duration = global::HelloworldXamarin.Droid.Resource.Integer.show_password_duration;
+                       global::Xamarin.Forms.Platform.Resource.Integer.status_bar_notification_info_maxnum = global::HelloworldXamarin.Droid.Resource.Integer.status_bar_notification_info_maxnum;
+                       global::Xamarin.Forms.Platform.Resource.Interpolator.mtrl_fast_out_linear_in = global::HelloworldXamarin.Droid.Resource.Interpolator.mtrl_fast_out_linear_in;
+                       global::Xamarin.Forms.Platform.Resource.Interpolator.mtrl_fast_out_slow_in = global::HelloworldXamarin.Droid.Resource.Interpolator.mtrl_fast_out_slow_in;
+                       global::Xamarin.Forms.Platform.Resource.Interpolator.mtrl_linear = global::HelloworldXamarin.Droid.Resource.Interpolator.mtrl_linear;
+                       global::Xamarin.Forms.Platform.Resource.Interpolator.mtrl_linear_out_slow_in = global::HelloworldXamarin.Droid.Resource.Interpolator.mtrl_linear_out_slow_in;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_action_bar_title_item = global::HelloworldXamarin.Droid.Resource.Layout.abc_action_bar_title_item;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_action_bar_up_container = global::HelloworldXamarin.Droid.Resource.Layout.abc_action_bar_up_container;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_action_menu_item_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_action_menu_item_layout;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_action_menu_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_action_menu_layout;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_action_mode_bar = global::HelloworldXamarin.Droid.Resource.Layout.abc_action_mode_bar;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_action_mode_close_item_material = global::HelloworldXamarin.Droid.Resource.Layout.abc_action_mode_close_item_material;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_activity_chooser_view = global::HelloworldXamarin.Droid.Resource.Layout.abc_activity_chooser_view;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_activity_chooser_view_list_item = global::HelloworldXamarin.Droid.Resource.Layout.abc_activity_chooser_view_list_item;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_alert_dialog_button_bar_material = global::HelloworldXamarin.Droid.Resource.Layout.abc_alert_dialog_button_bar_material;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_alert_dialog_material = global::HelloworldXamarin.Droid.Resource.Layout.abc_alert_dialog_material;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_alert_dialog_title_material = global::HelloworldXamarin.Droid.Resource.Layout.abc_alert_dialog_title_material;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_cascading_menu_item_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_cascading_menu_item_layout;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_dialog_title_material = global::HelloworldXamarin.Droid.Resource.Layout.abc_dialog_title_material;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_expanded_menu_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_expanded_menu_layout;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_list_menu_item_checkbox = global::HelloworldXamarin.Droid.Resource.Layout.abc_list_menu_item_checkbox;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_list_menu_item_icon = global::HelloworldXamarin.Droid.Resource.Layout.abc_list_menu_item_icon;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_list_menu_item_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_list_menu_item_layout;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_list_menu_item_radio = global::HelloworldXamarin.Droid.Resource.Layout.abc_list_menu_item_radio;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_popup_menu_header_item_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_popup_menu_header_item_layout;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_popup_menu_item_layout = global::HelloworldXamarin.Droid.Resource.Layout.abc_popup_menu_item_layout;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_screen_content_include = global::HelloworldXamarin.Droid.Resource.Layout.abc_screen_content_include;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_screen_simple = global::HelloworldXamarin.Droid.Resource.Layout.abc_screen_simple;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_screen_simple_overlay_action_mode = global::HelloworldXamarin.Droid.Resource.Layout.abc_screen_simple_overlay_action_mode;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_screen_toolbar = global::HelloworldXamarin.Droid.Resource.Layout.abc_screen_toolbar;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_search_dropdown_item_icons_2line = global::HelloworldXamarin.Droid.Resource.Layout.abc_search_dropdown_item_icons_2line;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_search_view = global::HelloworldXamarin.Droid.Resource.Layout.abc_search_view;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_select_dialog_material = global::HelloworldXamarin.Droid.Resource.Layout.abc_select_dialog_material;
+                       global::Xamarin.Forms.Platform.Resource.Layout.abc_tooltip = global::HelloworldXamarin.Droid.Resource.Layout.abc_tooltip;
+                       global::Xamarin.Forms.Platform.Resource.Layout.BottomTabLayout = global::HelloworldXamarin.Droid.Resource.Layout.BottomTabLayout;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_bottom_navigation_item = global::HelloworldXamarin.Droid.Resource.Layout.design_bottom_navigation_item;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_bottom_sheet_dialog = global::HelloworldXamarin.Droid.Resource.Layout.design_bottom_sheet_dialog;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_layout_snackbar = global::HelloworldXamarin.Droid.Resource.Layout.design_layout_snackbar;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_layout_snackbar_include = global::HelloworldXamarin.Droid.Resource.Layout.design_layout_snackbar_include;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_layout_tab_icon = global::HelloworldXamarin.Droid.Resource.Layout.design_layout_tab_icon;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_layout_tab_text = global::HelloworldXamarin.Droid.Resource.Layout.design_layout_tab_text;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_menu_item_action_area = global::HelloworldXamarin.Droid.Resource.Layout.design_menu_item_action_area;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_navigation_item = global::HelloworldXamarin.Droid.Resource.Layout.design_navigation_item;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_navigation_item_header = global::HelloworldXamarin.Droid.Resource.Layout.design_navigation_item_header;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_navigation_item_separator = global::HelloworldXamarin.Droid.Resource.Layout.design_navigation_item_separator;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_navigation_item_subheader = global::HelloworldXamarin.Droid.Resource.Layout.design_navigation_item_subheader;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_navigation_menu = global::HelloworldXamarin.Droid.Resource.Layout.design_navigation_menu;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_navigation_menu_item = global::HelloworldXamarin.Droid.Resource.Layout.design_navigation_menu_item;
+                       global::Xamarin.Forms.Platform.Resource.Layout.design_text_input_password_icon = global::HelloworldXamarin.Droid.Resource.Layout.design_text_input_password_icon;
+                       global::Xamarin.Forms.Platform.Resource.Layout.FlyoutContent = global::HelloworldXamarin.Droid.Resource.Layout.FlyoutContent;
+                       global::Xamarin.Forms.Platform.Resource.Layout.mtrl_layout_snackbar = global::HelloworldXamarin.Droid.Resource.Layout.mtrl_layout_snackbar;
+                       global::Xamarin.Forms.Platform.Resource.Layout.mtrl_layout_snackbar_include = global::HelloworldXamarin.Droid.Resource.Layout.mtrl_layout_snackbar_include;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_action = global::HelloworldXamarin.Droid.Resource.Layout.notification_action;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_action_tombstone = global::HelloworldXamarin.Droid.Resource.Layout.notification_action_tombstone;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_media_action = global::HelloworldXamarin.Droid.Resource.Layout.notification_media_action;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_media_cancel_action = global::HelloworldXamarin.Droid.Resource.Layout.notification_media_cancel_action;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_template_big_media = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_big_media;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_template_big_media_custom = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_big_media_custom;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_template_big_media_narrow = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_big_media_narrow;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_template_big_media_narrow_custom = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_big_media_narrow_custom;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_template_custom_big = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_custom_big;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_template_icon_group = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_icon_group;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_template_lines_media = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_lines_media;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_template_media = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_media;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_template_media_custom = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_media_custom;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_template_part_chronometer = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_part_chronometer;
+                       global::Xamarin.Forms.Platform.Resource.Layout.notification_template_part_time = global::HelloworldXamarin.Droid.Resource.Layout.notification_template_part_time;
+                       global::Xamarin.Forms.Platform.Resource.Layout.RootLayout = global::HelloworldXamarin.Droid.Resource.Layout.RootLayout;
+                       global::Xamarin.Forms.Platform.Resource.Layout.select_dialog_item_material = global::HelloworldXamarin.Droid.Resource.Layout.select_dialog_item_material;
+                       global::Xamarin.Forms.Platform.Resource.Layout.select_dialog_multichoice_material = global::HelloworldXamarin.Droid.Resource.Layout.select_dialog_multichoice_material;
+                       global::Xamarin.Forms.Platform.Resource.Layout.select_dialog_singlechoice_material = global::HelloworldXamarin.Droid.Resource.Layout.select_dialog_singlechoice_material;
+                       global::Xamarin.Forms.Platform.Resource.Layout.ShellContent = global::HelloworldXamarin.Droid.Resource.Layout.ShellContent;
+                       global::Xamarin.Forms.Platform.Resource.Layout.support_simple_spinner_dropdown_item = global::HelloworldXamarin.Droid.Resource.Layout.support_simple_spinner_dropdown_item;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_action_bar_home_description = global::HelloworldXamarin.Droid.Resource.String.abc_action_bar_home_description;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_action_bar_up_description = global::HelloworldXamarin.Droid.Resource.String.abc_action_bar_up_description;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_action_menu_overflow_description = global::HelloworldXamarin.Droid.Resource.String.abc_action_menu_overflow_description;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_action_mode_done = global::HelloworldXamarin.Droid.Resource.String.abc_action_mode_done;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_activitychooserview_choose_application = global::HelloworldXamarin.Droid.Resource.String.abc_activitychooserview_choose_application;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_activity_chooser_view_see_all = global::HelloworldXamarin.Droid.Resource.String.abc_activity_chooser_view_see_all;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_capital_off = global::HelloworldXamarin.Droid.Resource.String.abc_capital_off;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_capital_on = global::HelloworldXamarin.Droid.Resource.String.abc_capital_on;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_font_family_body_1_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_body_1_material;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_font_family_body_2_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_body_2_material;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_font_family_button_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_button_material;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_font_family_caption_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_caption_material;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_font_family_display_1_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_display_1_material;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_font_family_display_2_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_display_2_material;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_font_family_display_3_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_display_3_material;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_font_family_display_4_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_display_4_material;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_font_family_headline_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_headline_material;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_font_family_menu_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_menu_material;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_font_family_subhead_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_subhead_material;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_font_family_title_material = global::HelloworldXamarin.Droid.Resource.String.abc_font_family_title_material;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_menu_alt_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_alt_shortcut_label;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_menu_ctrl_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_ctrl_shortcut_label;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_menu_delete_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_delete_shortcut_label;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_menu_enter_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_enter_shortcut_label;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_menu_function_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_function_shortcut_label;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_menu_meta_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_meta_shortcut_label;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_menu_shift_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_shift_shortcut_label;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_menu_space_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_space_shortcut_label;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_menu_sym_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_menu_sym_shortcut_label;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_prepend_shortcut_label = global::HelloworldXamarin.Droid.Resource.String.abc_prepend_shortcut_label;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_searchview_description_clear = global::HelloworldXamarin.Droid.Resource.String.abc_searchview_description_clear;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_searchview_description_query = global::HelloworldXamarin.Droid.Resource.String.abc_searchview_description_query;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_searchview_description_search = global::HelloworldXamarin.Droid.Resource.String.abc_searchview_description_search;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_searchview_description_submit = global::HelloworldXamarin.Droid.Resource.String.abc_searchview_description_submit;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_searchview_description_voice = global::HelloworldXamarin.Droid.Resource.String.abc_searchview_description_voice;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_search_hint = global::HelloworldXamarin.Droid.Resource.String.abc_search_hint;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_shareactionprovider_share_with = global::HelloworldXamarin.Droid.Resource.String.abc_shareactionprovider_share_with;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_shareactionprovider_share_with_application = global::HelloworldXamarin.Droid.Resource.String.abc_shareactionprovider_share_with_application;
+                       global::Xamarin.Forms.Platform.Resource.String.abc_toolbar_collapse_description = global::HelloworldXamarin.Droid.Resource.String.abc_toolbar_collapse_description;
+                       global::Xamarin.Forms.Platform.Resource.String.appbar_scrolling_view_behavior = global::HelloworldXamarin.Droid.Resource.String.appbar_scrolling_view_behavior;
+                       global::Xamarin.Forms.Platform.Resource.String.bottom_sheet_behavior = global::HelloworldXamarin.Droid.Resource.String.bottom_sheet_behavior;
+                       global::Xamarin.Forms.Platform.Resource.String.character_counter_content_description = global::HelloworldXamarin.Droid.Resource.String.character_counter_content_description;
+                       global::Xamarin.Forms.Platform.Resource.String.character_counter_pattern = global::HelloworldXamarin.Droid.Resource.String.character_counter_pattern;
+                       global::Xamarin.Forms.Platform.Resource.String.fab_transformation_scrim_behavior = global::HelloworldXamarin.Droid.Resource.String.fab_transformation_scrim_behavior;
+                       global::Xamarin.Forms.Platform.Resource.String.fab_transformation_sheet_behavior = global::HelloworldXamarin.Droid.Resource.String.fab_transformation_sheet_behavior;
+                       global::Xamarin.Forms.Platform.Resource.String.hide_bottom_view_on_scroll_behavior = global::HelloworldXamarin.Droid.Resource.String.hide_bottom_view_on_scroll_behavior;
+                       global::Xamarin.Forms.Platform.Resource.String.mtrl_chip_close_icon_content_description = global::HelloworldXamarin.Droid.Resource.String.mtrl_chip_close_icon_content_description;
+                       global::Xamarin.Forms.Platform.Resource.String.password_toggle_content_description = global::HelloworldXamarin.Droid.Resource.String.password_toggle_content_description;
+                       global::Xamarin.Forms.Platform.Resource.String.path_password_eye = global::HelloworldXamarin.Droid.Resource.String.path_password_eye;
+                       global::Xamarin.Forms.Platform.Resource.String.path_password_eye_mask_strike_through = global::HelloworldXamarin.Droid.Resource.String.path_password_eye_mask_strike_through;
+                       global::Xamarin.Forms.Platform.Resource.String.path_password_eye_mask_visible = global::HelloworldXamarin.Droid.Resource.String.path_password_eye_mask_visible;
+                       global::Xamarin.Forms.Platform.Resource.String.path_password_strike_through = global::HelloworldXamarin.Droid.Resource.String.path_password_strike_through;
+                       global::Xamarin.Forms.Platform.Resource.String.search_menu_title = global::HelloworldXamarin.Droid.Resource.String.search_menu_title;
+                       global::Xamarin.Forms.Platform.Resource.String.status_bar_notification_info_overflow = global::HelloworldXamarin.Droid.Resource.String.status_bar_notification_info_overflow;
+                       global::Xamarin.Forms.Platform.Resource.Style.AlertDialog_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.AlertDialog_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.AlertDialog_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.AlertDialog_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Animation_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Animation_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Animation_AppCompat_DropDownUp = global::HelloworldXamarin.Droid.Resource.Style.Animation_AppCompat_DropDownUp;
+                       global::Xamarin.Forms.Platform.Resource.Style.Animation_AppCompat_Tooltip = global::HelloworldXamarin.Droid.Resource.Style.Animation_AppCompat_Tooltip;
+                       global::Xamarin.Forms.Platform.Resource.Style.Animation_Design_BottomSheetDialog = global::HelloworldXamarin.Droid.Resource.Style.Animation_Design_BottomSheetDialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.AppCompatDialogStyle = global::HelloworldXamarin.Droid.Resource.Style.AppCompatDialogStyle;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_AlertDialog_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_AlertDialog_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_AlertDialog_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_AlertDialog_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Animation_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Animation_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Animation_AppCompat_DropDownUp = global::HelloworldXamarin.Droid.Resource.Style.Base_Animation_AppCompat_DropDownUp;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Animation_AppCompat_Tooltip = global::HelloworldXamarin.Droid.Resource.Style.Base_Animation_AppCompat_Tooltip;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_CardView = global::HelloworldXamarin.Droid.Resource.Style.Base_CardView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_DialogWindowTitleBackground_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_DialogWindowTitleBackground_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_DialogWindowTitle_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_DialogWindowTitle_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Body1 = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Body1;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Body2 = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Body2;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Button = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Button;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Caption = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Caption;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Display1 = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Display1;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Display2 = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Display2;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Display3 = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Display3;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Display4 = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Display4;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Headline = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Headline;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Large = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Large;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Large_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Large_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Medium = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Medium;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Medium_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Medium_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Menu = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Menu;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_SearchResult = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_SearchResult;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_SearchResult_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_SearchResult_Subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_SearchResult_Title = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_SearchResult_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Small = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Small;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Small_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Small_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Subhead = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Subhead;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Subhead_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Subhead_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Title = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Title_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Title_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Tooltip = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Tooltip;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Menu = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Menu;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Title = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionMode_Title = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_ActionMode_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button_Colored = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button_Colored;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_Button_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_DropDownItem = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_DropDownItem;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_PopupMenu_Header = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_PopupMenu_Header;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_PopupMenu_Large = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_PopupMenu_Large;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_PopupMenu_Small = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_PopupMenu_Small;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_Switch = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_Switch;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_TextAppearance_Widget_AppCompat_Toolbar_Title = global::HelloworldXamarin.Droid.Resource.Style.Base_TextAppearance_Widget_AppCompat_Toolbar_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_ThemeOverlay_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_ThemeOverlay_AppCompat_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_ThemeOverlay_AppCompat_Dark = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat_Dark;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_ThemeOverlay_AppCompat_Dark_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat_Dark_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_ThemeOverlay_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_ThemeOverlay_AppCompat_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_ThemeOverlay_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_ThemeOverlay_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_ThemeOverlay_MaterialComponents_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_ThemeOverlay_MaterialComponents_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_CompactMenu = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_CompactMenu;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_Dialog_FixedSize = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Dialog_FixedSize;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_Light_DarkActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light_DarkActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_Light_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_Light_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_Light_Dialog_FixedSize = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light_Dialog_FixedSize;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_AppCompat_Light_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_AppCompat_Light_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Bridge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_CompactMenu = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_CompactMenu;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Dialog_FixedSize = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Dialog_FixedSize;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Light_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_Bridge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Light_DarkActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_DarkActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Light_DarkActionBar_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_DarkActionBar_Bridge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Light_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog_FixedSize = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog_FixedSize;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Base_Theme_MaterialComponents_Light_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V14_ThemeOverlay_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_ThemeOverlay_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V14_ThemeOverlay_MaterialComponents_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_ThemeOverlay_MaterialComponents_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V14_Theme_MaterialComponents = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V14_Theme_MaterialComponents_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents_Bridge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V14_Theme_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V14_Theme_MaterialComponents_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V14_Theme_MaterialComponents_Light_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents_Light_Bridge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V14_Theme_MaterialComponents_Light_DarkActionBar_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents_Light_DarkActionBar_Bridge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V14_Theme_MaterialComponents_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V14_Theme_MaterialComponents_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V21_ThemeOverlay_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V21_ThemeOverlay_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V21_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_V21_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V21_Theme_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V21_Theme_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V21_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V21_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V21_Theme_AppCompat_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V21_Theme_AppCompat_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V22_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_V22_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V22_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V22_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V23_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_V23_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V23_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V23_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V26_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_V26_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V26_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V26_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V26_Widget_AppCompat_Toolbar = global::HelloworldXamarin.Droid.Resource.Style.Base_V26_Widget_AppCompat_Toolbar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V28_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_V28_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V28_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V28_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V7_ThemeOverlay_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_ThemeOverlay_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V7_Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V7_Theme_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Theme_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V7_Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V7_Theme_AppCompat_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Theme_AppCompat_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V7_Widget_AppCompat_AutoCompleteTextView = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Widget_AppCompat_AutoCompleteTextView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V7_Widget_AppCompat_EditText = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Widget_AppCompat_EditText;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_V7_Widget_AppCompat_Toolbar = global::HelloworldXamarin.Droid.Resource.Style.Base_V7_Widget_AppCompat_Toolbar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ActionBar_Solid = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionBar_Solid;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ActionBar_TabBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionBar_TabBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ActionBar_TabText = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionBar_TabText;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ActionBar_TabView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionBar_TabView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ActionButton = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ActionButton_CloseMode = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionButton_CloseMode;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ActionButton_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionButton_Overflow;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ActionMode = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActionMode;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ActivityChooserView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ActivityChooserView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_AutoCompleteTextView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_AutoCompleteTextView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Button = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Button;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ButtonBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ButtonBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ButtonBar_AlertDialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ButtonBar_AlertDialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Button_Borderless = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Button_Borderless;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Button_Borderless_Colored = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Button_Borderless_Colored;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Button_ButtonBar_AlertDialog = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Button_ButtonBar_AlertDialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Button_Colored = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Button_Colored;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Button_Small = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Button_Small;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_CompoundButton_CheckBox = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_CompoundButton_CheckBox;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_CompoundButton_RadioButton = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_CompoundButton_RadioButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_CompoundButton_Switch = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_CompoundButton_Switch;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_DrawerArrowToggle = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_DrawerArrowToggle;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_DrawerArrowToggle_Common = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_DrawerArrowToggle_Common;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_DropDownItem_Spinner = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_DropDownItem_Spinner;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_EditText = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_EditText;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ImageButton = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ImageButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Light_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_Solid = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_Solid;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabText = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabText;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_ActionBar_TabView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Light_PopupMenu = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_PopupMenu;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Light_PopupMenu_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Light_PopupMenu_Overflow;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ListMenuView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ListMenuView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ListPopupWindow = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ListPopupWindow;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ListView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ListView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ListView_DropDown = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ListView_DropDown;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ListView_Menu = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ListView_Menu;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_PopupMenu = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_PopupMenu;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_PopupMenu_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_PopupMenu_Overflow;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_PopupWindow = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_PopupWindow;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ProgressBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ProgressBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_ProgressBar_Horizontal = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_ProgressBar_Horizontal;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_RatingBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_RatingBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_RatingBar_Indicator = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_RatingBar_Indicator;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_RatingBar_Small = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_RatingBar_Small;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_SearchView = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_SearchView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_SearchView_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_SearchView_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_SeekBar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_SeekBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_SeekBar_Discrete = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_SeekBar_Discrete;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Spinner = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Spinner;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Spinner_Underlined = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Spinner_Underlined;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_TextView_SpinnerItem = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_TextView_SpinnerItem;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Toolbar = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Toolbar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_AppCompat_Toolbar_Button_Navigation = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_AppCompat_Toolbar_Button_Navigation;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_Design_TabLayout = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_Design_TabLayout;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_MaterialComponents_Chip = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_MaterialComponents_Chip;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_MaterialComponents_TextInputEditText = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_MaterialComponents_TextInputEditText;
+                       global::Xamarin.Forms.Platform.Resource.Style.Base_Widget_MaterialComponents_TextInputLayout = global::HelloworldXamarin.Droid.Resource.Style.Base_Widget_MaterialComponents_TextInputLayout;
+                       global::Xamarin.Forms.Platform.Resource.Style.CardView = global::HelloworldXamarin.Droid.Resource.Style.CardView;
+                       global::Xamarin.Forms.Platform.Resource.Style.CardView_Dark = global::HelloworldXamarin.Droid.Resource.Style.CardView_Dark;
+                       global::Xamarin.Forms.Platform.Resource.Style.CardView_Light = global::HelloworldXamarin.Droid.Resource.Style.CardView_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.collectionViewStyle = global::HelloworldXamarin.Droid.Resource.Style.collectionViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Style.MainTheme = global::HelloworldXamarin.Droid.Resource.Style.MainTheme;
+                       global::Xamarin.Forms.Platform.Resource.Style.MainTheme_Base = global::HelloworldXamarin.Droid.Resource.Style.MainTheme_Base;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Platform_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Platform_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_MaterialComponents = global::HelloworldXamarin.Droid.Resource.Style.Platform_MaterialComponents;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Platform_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_MaterialComponents_Light = global::HelloworldXamarin.Droid.Resource.Style.Platform_MaterialComponents_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_MaterialComponents_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Platform_MaterialComponents_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_ThemeOverlay_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Platform_ThemeOverlay_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_ThemeOverlay_AppCompat_Dark = global::HelloworldXamarin.Droid.Resource.Style.Platform_ThemeOverlay_AppCompat_Dark;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_ThemeOverlay_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Platform_ThemeOverlay_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_V21_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Platform_V21_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_V21_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Platform_V21_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_V25_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Platform_V25_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_V25_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Platform_V25_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Platform_Widget_AppCompat_Spinner = global::HelloworldXamarin.Droid.Resource.Style.Platform_Widget_AppCompat_Spinner;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_DialogWindowTitle_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_DialogWindowTitle_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_ActionBar_TitleItem = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_ActionBar_TitleItem;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_DialogTitle_Icon = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_DialogTitle_Icon;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_Text = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_Text;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_Title = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_PopupMenuItem_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_SearchView_MagIcon = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_SearchView_MagIcon;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Query = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Query;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Text = global::HelloworldXamarin.Droid.Resource.Style.RtlOverlay_Widget_AppCompat_Search_DropDown_Text;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlUnderlay_Widget_AppCompat_ActionButton = global::HelloworldXamarin.Droid.Resource.Style.RtlUnderlay_Widget_AppCompat_ActionButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.RtlUnderlay_Widget_AppCompat_ActionButton_Overflow = global::HelloworldXamarin.Droid.Resource.Style.RtlUnderlay_Widget_AppCompat_ActionButton_Overflow;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Body1 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Body1;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Body2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Body2;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Button = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Button;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Caption = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Caption;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Display1 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Display1;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Display2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Display2;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Display3 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Display3;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Display4 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Display4;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Headline = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Headline;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Large = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Large;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Large_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Large_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Light_SearchResult_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Light_SearchResult_Subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Light_SearchResult_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Light_SearchResult_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Light_Widget_PopupMenu_Large = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Light_Widget_PopupMenu_Small = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Medium = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Medium;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Medium_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Medium_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Menu = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Menu;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_SearchResult_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_SearchResult_Subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_SearchResult_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_SearchResult_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Small = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Small;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Small_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Small_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Subhead = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Subhead;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Subhead_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Subhead_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Title_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Title_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Tooltip = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Tooltip;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Menu = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Menu;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_Button = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_Button;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_Button_Borderless_Colored = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_Button_Borderless_Colored;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_Button_Colored = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_Button_Colored;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_Button_Inverse = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_Button_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_DropDownItem = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_DropDownItem;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_PopupMenu_Header = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_PopupMenu_Header;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_PopupMenu_Large = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_PopupMenu_Large;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_PopupMenu_Small = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_PopupMenu_Small;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_Switch = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_Switch;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_AppCompat_Widget_TextView_SpinnerItem = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Compat_Notification = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Compat_Notification_Info = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Info;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Compat_Notification_Info_Media = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Info_Media;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Compat_Notification_Line2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Line2;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Compat_Notification_Line2_Media = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Line2_Media;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Compat_Notification_Media = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Media;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Compat_Notification_Time = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Time;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Compat_Notification_Time_Media = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Time_Media;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Compat_Notification_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Compat_Notification_Title_Media = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Compat_Notification_Title_Media;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Design_CollapsingToolbar_Expanded = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_CollapsingToolbar_Expanded;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Design_Counter = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_Counter;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Design_Counter_Overflow = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_Counter_Overflow;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Design_Error = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_Error;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Design_HelperText = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_HelperText;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Design_Hint = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_Hint;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Design_Snackbar_Message = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_Snackbar_Message;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Design_Tab = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Design_Tab;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Body1 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Body1;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Body2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Body2;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Button = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Button;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Caption = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Caption;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Chip = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Chip;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Headline1 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Headline1;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Headline2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Headline2;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Headline3 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Headline3;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Headline4 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Headline4;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Headline5 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Headline5;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Headline6 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Headline6;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Overline = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Overline;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Subtitle1 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Subtitle1;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Subtitle2 = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Subtitle2;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_MaterialComponents_Tab = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_MaterialComponents_Tab;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Widget_AppCompat_ExpandedMenu_Item = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Widget_AppCompat_Toolbar_Subtitle = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Style.TextAppearance_Widget_AppCompat_Toolbar_Title = global::HelloworldXamarin.Droid.Resource.Style.TextAppearance_Widget_AppCompat_Toolbar_Title;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_AppCompat_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_AppCompat_Dark = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat_Dark;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_AppCompat_Dark_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat_Dark_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_AppCompat_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_MaterialComponents = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_MaterialComponents_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_MaterialComponents_Dark = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_Dark;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_MaterialComponents_Dark_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_Dark_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_MaterialComponents_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_MaterialComponents_Light = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox_Dense = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox_Dense;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox;
+                       global::Xamarin.Forms.Platform.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox_Dense = global::HelloworldXamarin.Droid.Resource.Style.ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox_Dense;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_CompactMenu = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_CompactMenu;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_DayNight = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_DayNight_DarkActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight_DarkActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_DayNight_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_DayNight_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_DayNight_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_DayNight_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_DayNight_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DayNight_NoActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_Light = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_Light_DarkActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light_DarkActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_Light_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_Light_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_Light_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_Light_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_Light_NoActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_AppCompat_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_AppCompat_NoActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_Design = global::HelloworldXamarin.Droid.Resource.Style.Theme_Design;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_Design_BottomSheetDialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_Design_BottomSheetDialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_Design_Light = global::HelloworldXamarin.Droid.Resource.Style.Theme_Design_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_Design_Light_BottomSheetDialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_Design_Light_BottomSheetDialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_Design_Light_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_Design_Light_NoActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_Design_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_Design_NoActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_BottomSheetDialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_BottomSheetDialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Bridge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_CompactMenu = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_CompactMenu;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Light = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Light_BottomSheetDialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_BottomSheetDialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Light_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_Bridge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Light_DarkActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_DarkActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Light_DarkActionBar_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_DarkActionBar_Bridge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Light_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Light_DialogWhenLarge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_DialogWhenLarge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Light_Dialog_Alert = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_Dialog_Alert;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Light_Dialog_MinWidth = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_Dialog_MinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Light_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_NoActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_Light_NoActionBar_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_Light_NoActionBar_Bridge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_NoActionBar = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_NoActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Theme_MaterialComponents_NoActionBar_Bridge = global::HelloworldXamarin.Droid.Resource.Style.Theme_MaterialComponents_NoActionBar_Bridge;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ActionBar_Solid = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionBar_Solid;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ActionBar_TabBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionBar_TabBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ActionBar_TabText = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionBar_TabText;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ActionBar_TabView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionBar_TabView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ActionButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ActionButton_CloseMode = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionButton_CloseMode;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ActionButton_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionButton_Overflow;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ActionMode = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActionMode;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ActivityChooserView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ActivityChooserView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_AutoCompleteTextView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_AutoCompleteTextView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Button = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Button;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ButtonBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ButtonBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ButtonBar_AlertDialog = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ButtonBar_AlertDialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Button_Borderless = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Button_Borderless;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Button_Borderless_Colored = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Button_Borderless_Colored;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Button_ButtonBar_AlertDialog = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Button_ButtonBar_AlertDialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Button_Colored = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Button_Colored;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Button_Small = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Button_Small;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_CompoundButton_CheckBox = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_CompoundButton_CheckBox;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_CompoundButton_RadioButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_CompoundButton_RadioButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_CompoundButton_Switch = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_CompoundButton_Switch;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_DrawerArrowToggle = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_DrawerArrowToggle;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_DropDownItem_Spinner = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_DropDownItem_Spinner;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_EditText = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_EditText;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ImageButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ImageButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionBar_Solid = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_Solid;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionBar_Solid_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_Solid_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionBar_TabBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_TabBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionBar_TabBar_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_TabBar_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionBar_TabText = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_TabText;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionBar_TabText_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_TabText_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionBar_TabView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_TabView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionBar_TabView_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionBar_TabView_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionButton_CloseMode = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionButton_CloseMode;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionButton_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionButton_Overflow;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActionMode_Inverse = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActionMode_Inverse;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ActivityChooserView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ActivityChooserView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_AutoCompleteTextView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_AutoCompleteTextView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_DropDownItem_Spinner = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_DropDownItem_Spinner;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ListPopupWindow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ListPopupWindow;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_ListView_DropDown = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_ListView_DropDown;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_PopupMenu = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_PopupMenu;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_PopupMenu_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_PopupMenu_Overflow;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_SearchView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_SearchView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Light_Spinner_DropDown_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Light_Spinner_DropDown_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ListMenuView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ListMenuView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ListPopupWindow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ListPopupWindow;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ListView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ListView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ListView_DropDown = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ListView_DropDown;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ListView_Menu = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ListView_Menu;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_PopupMenu = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_PopupMenu;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_PopupMenu_Overflow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_PopupMenu_Overflow;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_PopupWindow = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_PopupWindow;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ProgressBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ProgressBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_ProgressBar_Horizontal = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_ProgressBar_Horizontal;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_RatingBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_RatingBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_RatingBar_Indicator = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_RatingBar_Indicator;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_RatingBar_Small = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_RatingBar_Small;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_SearchView = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_SearchView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_SearchView_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_SearchView_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_SeekBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_SeekBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_SeekBar_Discrete = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_SeekBar_Discrete;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Spinner = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Spinner;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Spinner_DropDown = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Spinner_DropDown;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Spinner_DropDown_ActionBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Spinner_DropDown_ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Spinner_Underlined = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Spinner_Underlined;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_TextView_SpinnerItem = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_TextView_SpinnerItem;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Toolbar = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Toolbar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_AppCompat_Toolbar_Button_Navigation = global::HelloworldXamarin.Droid.Resource.Style.Widget_AppCompat_Toolbar_Button_Navigation;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Compat_NotificationActionContainer = global::HelloworldXamarin.Droid.Resource.Style.Widget_Compat_NotificationActionContainer;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Compat_NotificationActionText = global::HelloworldXamarin.Droid.Resource.Style.Widget_Compat_NotificationActionText;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Design_AppBarLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_AppBarLayout;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Design_BottomNavigationView = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_BottomNavigationView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Design_BottomSheet_Modal = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_BottomSheet_Modal;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Design_CollapsingToolbar = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_CollapsingToolbar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Design_FloatingActionButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_FloatingActionButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Design_NavigationView = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_NavigationView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Design_ScrimInsetsFrameLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_ScrimInsetsFrameLayout;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Design_Snackbar = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_Snackbar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Design_TabLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_TabLayout;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Design_TextInputLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_Design_TextInputLayout;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_BottomAppBar = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_BottomAppBar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_BottomAppBar_Colored = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_BottomAppBar_Colored;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_BottomNavigationView = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_BottomNavigationView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_BottomNavigationView_Colored = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_BottomNavigationView_Colored;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_BottomSheet_Modal = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_BottomSheet_Modal;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Button = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Button_Icon = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_Icon;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Button_OutlinedButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_OutlinedButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Button_OutlinedButton_Icon = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_OutlinedButton_Icon;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Button_TextButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_TextButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Button_TextButton_Dialog = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_TextButton_Dialog;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Button_TextButton_Dialog_Icon = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_TextButton_Dialog_Icon;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Button_TextButton_Icon = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_TextButton_Icon;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Button_UnelevatedButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_UnelevatedButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Button_UnelevatedButton_Icon = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Button_UnelevatedButton_Icon;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_CardView = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_CardView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_ChipGroup = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_ChipGroup;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Chip_Action = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Chip_Action;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Chip_Choice = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Chip_Choice;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Chip_Entry = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Chip_Entry;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Chip_Filter = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Chip_Filter;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_FloatingActionButton = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_FloatingActionButton;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_NavigationView = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_NavigationView;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Snackbar = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Snackbar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Snackbar_FullWidth = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Snackbar_FullWidth;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_TabLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TabLayout;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_TabLayout_Colored = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TabLayout_Colored;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_TextInputEditText_FilledBox = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputEditText_FilledBox;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_TextInputEditText_FilledBox_Dense = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputEditText_FilledBox_Dense;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_TextInputEditText_OutlinedBox = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputEditText_OutlinedBox;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_TextInputEditText_OutlinedBox_Dense = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputEditText_OutlinedBox_Dense;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_TextInputLayout_FilledBox = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputLayout_FilledBox;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_TextInputLayout_FilledBox_Dense = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputLayout_FilledBox_Dense;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_TextInputLayout_OutlinedBox = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputLayout_OutlinedBox;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_MaterialComponents_Toolbar = global::HelloworldXamarin.Droid.Resource.Style.Widget_MaterialComponents_Toolbar;
+                       global::Xamarin.Forms.Platform.Resource.Style.Widget_Support_CoordinatorLayout = global::HelloworldXamarin.Droid.Resource.Style.Widget_Support_CoordinatorLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBarLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBarLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBarLayout_android_layout_gravity = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBarLayout_android_layout_gravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_background = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_background;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_backgroundSplit = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_backgroundSplit;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_backgroundStacked = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_backgroundStacked;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_contentInsetEnd = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_contentInsetEnd;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_contentInsetEndWithActions = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_contentInsetEndWithActions;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_contentInsetLeft = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_contentInsetLeft;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_contentInsetRight = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_contentInsetRight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_contentInsetStart = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_contentInsetStart;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_contentInsetStartWithNavigation = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_contentInsetStartWithNavigation;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_customNavigationLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_customNavigationLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_displayOptions = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_displayOptions;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_divider = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_divider;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_elevation = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_height = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_height;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_hideOnContentScroll = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_hideOnContentScroll;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_homeAsUpIndicator = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_homeAsUpIndicator;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_homeLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_homeLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_icon = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_icon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_indeterminateProgressStyle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_indeterminateProgressStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_itemPadding = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_itemPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_logo = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_logo;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_navigationMode = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_navigationMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_popupTheme = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_popupTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_progressBarPadding = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_progressBarPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_progressBarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_progressBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_subtitle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_subtitleTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_subtitleTextStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_title = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_title;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionBar_titleTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionBar_titleTextStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionMenuItemView = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMenuItemView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionMenuItemView_android_minWidth = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMenuItemView_android_minWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionMenuView = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMenuView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionMode = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionMode_background = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode_background;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionMode_backgroundSplit = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode_backgroundSplit;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionMode_closeItemLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode_closeItemLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionMode_height = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode_height;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionMode_subtitleTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode_subtitleTextStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActionMode_titleTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.ActionMode_titleTextStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActivityChooserView = global::HelloworldXamarin.Droid.Resource.Styleable.ActivityChooserView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActivityChooserView_expandActivityOverflowButtonDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.ActivityChooserView_expandActivityOverflowButtonDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ActivityChooserView_initialActivityCount = global::HelloworldXamarin.Droid.Resource.Styleable.ActivityChooserView_initialActivityCount;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AlertDialog = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AlertDialog_android_layout = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_android_layout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AlertDialog_buttonIconDimen = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_buttonIconDimen;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AlertDialog_buttonPanelSideLayout = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_buttonPanelSideLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AlertDialog_listItemLayout = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_listItemLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AlertDialog_listLayout = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_listLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AlertDialog_multiChoiceItemLayout = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_multiChoiceItemLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AlertDialog_showTitle = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_showTitle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AlertDialog_singleChoiceItemLayout = global::HelloworldXamarin.Droid.Resource.Styleable.AlertDialog_singleChoiceItemLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableCompat = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableCompat_android_constantSize = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat_android_constantSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableCompat_android_dither = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat_android_dither;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableCompat_android_enterFadeDuration = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat_android_enterFadeDuration;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableCompat_android_exitFadeDuration = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat_android_exitFadeDuration;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableCompat_android_variablePadding = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat_android_variablePadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableCompat_android_visible = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableCompat_android_visible;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableItem = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableItem;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableItem_android_drawable = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableItem_android_drawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableItem_android_id = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableItem_android_id;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableTransition = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableTransition;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableTransition_android_drawable = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableTransition_android_drawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableTransition_android_fromId = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableTransition_android_fromId;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableTransition_android_reversible = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableTransition_android_reversible;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AnimatedStateListDrawableTransition_android_toId = global::HelloworldXamarin.Droid.Resource.Styleable.AnimatedStateListDrawableTransition_android_toId;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayout = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayoutStates = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayoutStates;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayoutStates_state_collapsed = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayoutStates_state_collapsed;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayoutStates_state_collapsible = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayoutStates_state_collapsible;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayoutStates_state_liftable = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayoutStates_state_liftable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayoutStates_state_lifted = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayoutStates_state_lifted;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayout_android_background = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_android_background;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayout_android_keyboardNavigationCluster = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_android_keyboardNavigationCluster;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayout_android_touchscreenBlocksFocus = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_android_touchscreenBlocksFocus;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayout_elevation = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayout_expanded = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_expanded;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayout_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_Layout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayout_Layout_layout_scrollFlags = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_Layout_layout_scrollFlags;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayout_Layout_layout_scrollInterpolator = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_Layout_layout_scrollInterpolator;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppBarLayout_liftOnScroll = global::HelloworldXamarin.Droid.Resource.Styleable.AppBarLayout_liftOnScroll;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatImageView = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatImageView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatImageView_android_src = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatImageView_android_src;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatImageView_srcCompat = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatImageView_srcCompat;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatImageView_tint = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatImageView_tint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatImageView_tintMode = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatImageView_tintMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatSeekBar = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatSeekBar;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatSeekBar_android_thumb = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatSeekBar_android_thumb;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatSeekBar_tickMark = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatSeekBar_tickMark;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatSeekBar_tickMarkTint = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatSeekBar_tickMarkTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatSeekBar_tickMarkTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatSeekBar_tickMarkTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextHelper = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextHelper_android_drawableBottom = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_drawableBottom;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextHelper_android_drawableEnd = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_drawableEnd;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextHelper_android_drawableLeft = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_drawableLeft;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextHelper_android_drawableRight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_drawableRight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextHelper_android_drawableStart = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_drawableStart;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextHelper_android_drawableTop = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_drawableTop;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextHelper_android_textAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextHelper_android_textAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextView = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextView_android_textAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_android_textAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextView_autoSizeMaxTextSize = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_autoSizeMaxTextSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextView_autoSizeMinTextSize = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_autoSizeMinTextSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextView_autoSizePresetSizes = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_autoSizePresetSizes;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextView_autoSizeStepGranularity = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_autoSizeStepGranularity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextView_autoSizeTextType = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_autoSizeTextType;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextView_firstBaselineToTopHeight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_firstBaselineToTopHeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextView_fontFamily = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_fontFamily;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextView_lastBaselineToBottomHeight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_lastBaselineToBottomHeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextView_lineHeight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_lineHeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTextView_textAllCaps = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTextView_textAllCaps;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionBarDivider = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarDivider;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionBarItemBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarItemBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionBarPopupTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarPopupTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionBarSize = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionBarSplitStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarSplitStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionBarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionBarTabBarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarTabBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionBarTabStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarTabStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionBarTabTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarTabTextStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionBarTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionBarWidgetTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionBarWidgetTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionDropDownStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionDropDownStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionMenuTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionMenuTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionMenuTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionMenuTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModeBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModeCloseButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeCloseButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModeCloseDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeCloseDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModeCopyDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeCopyDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModeCutDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeCutDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModeFindDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeFindDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModePasteDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModePasteDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModePopupWindowStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModePopupWindowStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModeSelectAllDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeSelectAllDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModeShareDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeShareDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModeSplitBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeSplitBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModeStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionModeWebSearchDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionModeWebSearchDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionOverflowButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionOverflowButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_actionOverflowMenuStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_actionOverflowMenuStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_activityChooserViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_activityChooserViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_alertDialogButtonGroupStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_alertDialogButtonGroupStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_alertDialogCenterButtons = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_alertDialogCenterButtons;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_alertDialogStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_alertDialogStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_alertDialogTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_alertDialogTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_android_windowAnimationStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_android_windowAnimationStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_android_windowIsFloating = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_android_windowIsFloating;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_autoCompleteTextViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_autoCompleteTextViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_borderlessButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_borderlessButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_buttonBarButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonBarButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_buttonBarNegativeButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonBarNegativeButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_buttonBarNeutralButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonBarNeutralButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_buttonBarPositiveButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonBarPositiveButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_buttonBarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_buttonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_buttonStyleSmall = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_buttonStyleSmall;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_checkboxStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_checkboxStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_checkedTextViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_checkedTextViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_colorAccent = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorAccent;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_colorBackgroundFloating = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorBackgroundFloating;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_colorButtonNormal = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorButtonNormal;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_colorControlActivated = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorControlActivated;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_colorControlHighlight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorControlHighlight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_colorControlNormal = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorControlNormal;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_colorError = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorError;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_colorPrimary = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorPrimary;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_colorPrimaryDark = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorPrimaryDark;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_colorSwitchThumbNormal = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_colorSwitchThumbNormal;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_controlBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_controlBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_dialogCornerRadius = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dialogCornerRadius;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_dialogPreferredPadding = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dialogPreferredPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_dialogTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dialogTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_dividerHorizontal = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dividerHorizontal;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_dividerVertical = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dividerVertical;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_dropdownListPreferredItemHeight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dropdownListPreferredItemHeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_dropDownListViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_dropDownListViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_editTextBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_editTextBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_editTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_editTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_editTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_editTextStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_homeAsUpIndicator = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_homeAsUpIndicator;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_imageButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_imageButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_listChoiceBackgroundIndicator = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listChoiceBackgroundIndicator;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_listDividerAlertDialog = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listDividerAlertDialog;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_listMenuViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listMenuViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_listPopupWindowStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listPopupWindowStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_listPreferredItemHeight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listPreferredItemHeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_listPreferredItemHeightLarge = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listPreferredItemHeightLarge;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_listPreferredItemHeightSmall = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listPreferredItemHeightSmall;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_listPreferredItemPaddingLeft = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listPreferredItemPaddingLeft;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_listPreferredItemPaddingRight = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_listPreferredItemPaddingRight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_panelBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_panelBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_panelMenuListTheme = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_panelMenuListTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_panelMenuListWidth = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_panelMenuListWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_popupMenuStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_popupMenuStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_popupWindowStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_popupWindowStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_radioButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_radioButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_ratingBarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_ratingBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_ratingBarStyleIndicator = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_ratingBarStyleIndicator;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_ratingBarStyleSmall = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_ratingBarStyleSmall;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_searchViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_searchViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_seekBarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_seekBarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_selectableItemBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_selectableItemBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_selectableItemBackgroundBorderless = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_selectableItemBackgroundBorderless;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_spinnerDropDownItemStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_spinnerDropDownItemStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_spinnerStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_spinnerStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_switchStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_switchStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_textAppearanceLargePopupMenu = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceLargePopupMenu;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_textAppearanceListItem = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceListItem;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_textAppearanceListItemSecondary = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceListItemSecondary;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_textAppearanceListItemSmall = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceListItemSmall;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_textAppearancePopupMenuHeader = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearancePopupMenuHeader;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_textAppearanceSearchResultSubtitle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceSearchResultSubtitle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_textAppearanceSearchResultTitle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceSearchResultTitle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_textAppearanceSmallPopupMenu = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textAppearanceSmallPopupMenu;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_textColorAlertDialogListItem = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textColorAlertDialogListItem;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_textColorSearchUrl = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_textColorSearchUrl;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_toolbarNavigationButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_toolbarNavigationButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_toolbarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_toolbarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_tooltipForegroundColor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_tooltipForegroundColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_tooltipFrameBackground = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_tooltipFrameBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_viewInflaterClass = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_viewInflaterClass;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_windowActionBar = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowActionBar;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_windowActionBarOverlay = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowActionBarOverlay;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_windowActionModeOverlay = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowActionModeOverlay;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_windowFixedHeightMajor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowFixedHeightMajor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_windowFixedHeightMinor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowFixedHeightMinor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_windowFixedWidthMajor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowFixedWidthMajor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_windowFixedWidthMinor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowFixedWidthMinor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_windowMinWidthMajor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowMinWidthMajor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_windowMinWidthMinor = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowMinWidthMinor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.AppCompatTheme_windowNoTitle = global::HelloworldXamarin.Droid.Resource.Styleable.AppCompatTheme_windowNoTitle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomAppBar = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomAppBar_backgroundTint = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar_backgroundTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomAppBar_fabAlignmentMode = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar_fabAlignmentMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomAppBar_fabCradleMargin = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar_fabCradleMargin;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomAppBar_fabCradleRoundedCornerRadius = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar_fabCradleRoundedCornerRadius;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomAppBar_fabCradleVerticalOffset = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar_fabCradleVerticalOffset;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomAppBar_hideOnScroll = global::HelloworldXamarin.Droid.Resource.Styleable.BottomAppBar_hideOnScroll;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomNavigationView = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomNavigationView_elevation = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomNavigationView_itemBackground = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomNavigationView_itemHorizontalTranslationEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemHorizontalTranslationEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomNavigationView_itemIconSize = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemIconSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomNavigationView_itemIconTint = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemIconTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomNavigationView_itemTextAppearanceActive = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemTextAppearanceActive;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomNavigationView_itemTextAppearanceInactive = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemTextAppearanceInactive;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomNavigationView_itemTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_itemTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomNavigationView_labelVisibilityMode = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_labelVisibilityMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomNavigationView_menu = global::HelloworldXamarin.Droid.Resource.Styleable.BottomNavigationView_menu;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomSheetBehavior_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.BottomSheetBehavior_Layout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomSheetBehavior_Layout_behavior_fitToContents = global::HelloworldXamarin.Droid.Resource.Styleable.BottomSheetBehavior_Layout_behavior_fitToContents;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomSheetBehavior_Layout_behavior_hideable = global::HelloworldXamarin.Droid.Resource.Styleable.BottomSheetBehavior_Layout_behavior_hideable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomSheetBehavior_Layout_behavior_peekHeight = global::HelloworldXamarin.Droid.Resource.Styleable.BottomSheetBehavior_Layout_behavior_peekHeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.BottomSheetBehavior_Layout_behavior_skipCollapsed = global::HelloworldXamarin.Droid.Resource.Styleable.BottomSheetBehavior_Layout_behavior_skipCollapsed;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ButtonBarLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ButtonBarLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ButtonBarLayout_allowStacking = global::HelloworldXamarin.Droid.Resource.Styleable.ButtonBarLayout_allowStacking;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView = global::HelloworldXamarin.Droid.Resource.Styleable.CardView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_android_minHeight = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_android_minHeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_android_minWidth = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_android_minWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_cardBackgroundColor = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_cardBackgroundColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_cardCornerRadius = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_cardCornerRadius;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_cardElevation = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_cardElevation;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_cardMaxElevation = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_cardMaxElevation;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_cardPreventCornerOverlap = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_cardPreventCornerOverlap;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_cardUseCompatPadding = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_cardUseCompatPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_contentPadding = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_contentPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_contentPaddingBottom = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_contentPaddingBottom;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_contentPaddingLeft = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_contentPaddingLeft;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_contentPaddingRight = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_contentPaddingRight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CardView_contentPaddingTop = global::HelloworldXamarin.Droid.Resource.Styleable.CardView_contentPaddingTop;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip = global::HelloworldXamarin.Droid.Resource.Styleable.Chip;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ChipGroup = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ChipGroup_checkedChip = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup_checkedChip;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ChipGroup_chipSpacing = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup_chipSpacing;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ChipGroup_chipSpacingHorizontal = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup_chipSpacingHorizontal;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ChipGroup_chipSpacingVertical = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup_chipSpacingVertical;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ChipGroup_singleLine = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup_singleLine;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ChipGroup_singleSelection = global::HelloworldXamarin.Droid.Resource.Styleable.ChipGroup_singleSelection;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_android_checkable = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_android_checkable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_android_ellipsize = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_android_ellipsize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_android_maxWidth = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_android_maxWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_android_text = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_android_text;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_android_textAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_android_textAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_checkedIcon = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_checkedIcon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_checkedIconEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_checkedIconEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_checkedIconVisible = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_checkedIconVisible;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_chipBackgroundColor = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipBackgroundColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_chipCornerRadius = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipCornerRadius;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_chipEndPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipEndPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_chipIcon = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipIcon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_chipIconEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipIconEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_chipIconSize = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipIconSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_chipIconTint = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipIconTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_chipIconVisible = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipIconVisible;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_chipMinHeight = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipMinHeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_chipStartPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipStartPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_chipStrokeColor = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipStrokeColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_chipStrokeWidth = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_chipStrokeWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_closeIcon = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIcon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_closeIconEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIconEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_closeIconEndPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIconEndPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_closeIconSize = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIconSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_closeIconStartPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIconStartPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_closeIconTint = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIconTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_closeIconVisible = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_closeIconVisible;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_hideMotionSpec = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_hideMotionSpec;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_iconEndPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_iconEndPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_iconStartPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_iconStartPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_rippleColor = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_rippleColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_showMotionSpec = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_showMotionSpec;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_textEndPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_textEndPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Chip_textStartPadding = global::HelloworldXamarin.Droid.Resource.Styleable.Chip_textStartPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_collapsedTitleGravity = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_collapsedTitleGravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_collapsedTitleTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_collapsedTitleTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_contentScrim = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_contentScrim;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_expandedTitleGravity = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleGravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMargin = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMargin;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginBottom = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginBottom;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginEnd = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginEnd;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginStart = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginStart;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginTop = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleMarginTop;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_expandedTitleTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_expandedTitleTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_Layout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_Layout_layout_collapseMode = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_Layout_layout_collapseMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_scrimAnimationDuration = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_scrimAnimationDuration;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_scrimVisibleHeightTrigger = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_scrimVisibleHeightTrigger;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_statusBarScrim = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_statusBarScrim;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_title = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_title;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_titleEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_titleEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CollapsingToolbarLayout_toolbarId = global::HelloworldXamarin.Droid.Resource.Styleable.CollapsingToolbarLayout_toolbarId;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ColorStateListItem = global::HelloworldXamarin.Droid.Resource.Styleable.ColorStateListItem;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ColorStateListItem_alpha = global::HelloworldXamarin.Droid.Resource.Styleable.ColorStateListItem_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ColorStateListItem_android_alpha = global::HelloworldXamarin.Droid.Resource.Styleable.ColorStateListItem_android_alpha;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ColorStateListItem_android_color = global::HelloworldXamarin.Droid.Resource.Styleable.ColorStateListItem_android_color;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CompoundButton = global::HelloworldXamarin.Droid.Resource.Styleable.CompoundButton;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CompoundButton_android_button = global::HelloworldXamarin.Droid.Resource.Styleable.CompoundButton_android_button;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CompoundButton_buttonTint = global::HelloworldXamarin.Droid.Resource.Styleable.CompoundButton_buttonTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CompoundButton_buttonTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.CompoundButton_buttonTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CoordinatorLayout = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CoordinatorLayout_keylines = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_keylines;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CoordinatorLayout_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CoordinatorLayout_Layout_android_layout_gravity = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_android_layout_gravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CoordinatorLayout_Layout_layout_anchor = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_anchor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CoordinatorLayout_Layout_layout_anchorGravity = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_anchorGravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CoordinatorLayout_Layout_layout_behavior = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_behavior;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CoordinatorLayout_Layout_layout_dodgeInsetEdges = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_dodgeInsetEdges;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CoordinatorLayout_Layout_layout_insetEdge = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_insetEdge;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CoordinatorLayout_Layout_layout_keyline = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_Layout_layout_keyline;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.CoordinatorLayout_statusBarBackground = global::HelloworldXamarin.Droid.Resource.Styleable.CoordinatorLayout_statusBarBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.DesignTheme = global::HelloworldXamarin.Droid.Resource.Styleable.DesignTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.DesignTheme_bottomSheetDialogTheme = global::HelloworldXamarin.Droid.Resource.Styleable.DesignTheme_bottomSheetDialogTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.DesignTheme_bottomSheetStyle = global::HelloworldXamarin.Droid.Resource.Styleable.DesignTheme_bottomSheetStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.DrawerArrowToggle = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.DrawerArrowToggle_arrowHeadLength = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_arrowHeadLength;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.DrawerArrowToggle_arrowShaftLength = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_arrowShaftLength;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.DrawerArrowToggle_barLength = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_barLength;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.DrawerArrowToggle_color = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_color;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.DrawerArrowToggle_drawableSize = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_drawableSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.DrawerArrowToggle_gapBetweenBars = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_gapBetweenBars;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.DrawerArrowToggle_spinBars = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_spinBars;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.DrawerArrowToggle_thickness = global::HelloworldXamarin.Droid.Resource.Styleable.DrawerArrowToggle_thickness;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_backgroundTint = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_backgroundTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_backgroundTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_backgroundTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_Behavior_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_Behavior_Layout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_Behavior_Layout_behavior_autoHide = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_Behavior_Layout_behavior_autoHide;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_borderWidth = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_borderWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_elevation = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_fabCustomSize = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_fabCustomSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_fabSize = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_fabSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_hideMotionSpec = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_hideMotionSpec;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_hoveredFocusedTranslationZ = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_hoveredFocusedTranslationZ;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_maxImageSize = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_maxImageSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_pressedTranslationZ = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_pressedTranslationZ;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_rippleColor = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_rippleColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_showMotionSpec = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_showMotionSpec;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FloatingActionButton_useCompatPadding = global::HelloworldXamarin.Droid.Resource.Styleable.FloatingActionButton_useCompatPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FlowLayout = global::HelloworldXamarin.Droid.Resource.Styleable.FlowLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FlowLayout_itemSpacing = global::HelloworldXamarin.Droid.Resource.Styleable.FlowLayout_itemSpacing;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FlowLayout_lineSpacing = global::HelloworldXamarin.Droid.Resource.Styleable.FlowLayout_lineSpacing;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamily = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamilyFont = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamilyFont_android_font = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_font;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamilyFont_android_fontStyle = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_fontStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamilyFont_android_fontVariationSettings = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_fontVariationSettings;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamilyFont_android_fontWeight = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_fontWeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamilyFont_android_ttcIndex = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_android_ttcIndex;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamilyFont_font = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_font;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamilyFont_fontStyle = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_fontStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamilyFont_fontVariationSettings = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_fontVariationSettings;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamilyFont_fontWeight = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_fontWeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamilyFont_ttcIndex = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamilyFont_ttcIndex;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamily_fontProviderAuthority = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderAuthority;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamily_fontProviderCerts = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderCerts;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamily_fontProviderFetchStrategy = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderFetchStrategy;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamily_fontProviderFetchTimeout = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderFetchTimeout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamily_fontProviderPackage = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderPackage;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.FontFamily_fontProviderQuery = global::HelloworldXamarin.Droid.Resource.Styleable.FontFamily_fontProviderQuery;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ForegroundLinearLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ForegroundLinearLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ForegroundLinearLayout_android_foreground = global::HelloworldXamarin.Droid.Resource.Styleable.ForegroundLinearLayout_android_foreground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ForegroundLinearLayout_android_foregroundGravity = global::HelloworldXamarin.Droid.Resource.Styleable.ForegroundLinearLayout_android_foregroundGravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ForegroundLinearLayout_foregroundInsidePadding = global::HelloworldXamarin.Droid.Resource.Styleable.ForegroundLinearLayout_foregroundInsidePadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColorItem = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColorItem;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColorItem_android_color = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColorItem_android_color;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColorItem_android_offset = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColorItem_android_offset;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor_android_centerColor = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_centerColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor_android_centerX = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_centerX;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor_android_centerY = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_centerY;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor_android_endColor = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_endColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor_android_endX = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_endX;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor_android_endY = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_endY;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor_android_gradientRadius = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_gradientRadius;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor_android_startColor = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_startColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor_android_startX = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_startX;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor_android_startY = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_startY;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor_android_tileMode = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_tileMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.GradientColor_android_type = global::HelloworldXamarin.Droid.Resource.Styleable.GradientColor_android_type;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_android_baselineAligned = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_android_baselineAligned;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_android_baselineAlignedChildIndex = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_android_baselineAlignedChildIndex;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_android_gravity = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_android_gravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_android_orientation = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_android_orientation;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_android_weightSum = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_android_weightSum;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_divider = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_divider;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_dividerPadding = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_dividerPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_Layout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_gravity = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_gravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_height = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_height;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_weight = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_weight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_width = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_Layout_android_layout_width;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_measureWithLargestChild = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_measureWithLargestChild;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.LinearLayoutCompat_showDividers = global::HelloworldXamarin.Droid.Resource.Styleable.LinearLayoutCompat_showDividers;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ListPopupWindow = global::HelloworldXamarin.Droid.Resource.Styleable.ListPopupWindow;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ListPopupWindow_android_dropDownHorizontalOffset = global::HelloworldXamarin.Droid.Resource.Styleable.ListPopupWindow_android_dropDownHorizontalOffset;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ListPopupWindow_android_dropDownVerticalOffset = global::HelloworldXamarin.Droid.Resource.Styleable.ListPopupWindow_android_dropDownVerticalOffset;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_android_insetBottom = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_android_insetBottom;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_android_insetLeft = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_android_insetLeft;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_android_insetRight = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_android_insetRight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_android_insetTop = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_android_insetTop;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_backgroundTint = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_backgroundTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_backgroundTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_backgroundTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_cornerRadius = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_cornerRadius;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_icon = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_icon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_iconGravity = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_iconGravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_iconPadding = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_iconPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_iconSize = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_iconSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_iconTint = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_iconTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_iconTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_iconTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_rippleColor = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_rippleColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_strokeColor = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_strokeColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialButton_strokeWidth = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialButton_strokeWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialCardView = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialCardView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialCardView_strokeColor = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialCardView_strokeColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialCardView_strokeWidth = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialCardView_strokeWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_bottomSheetDialogTheme = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_bottomSheetDialogTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_bottomSheetStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_bottomSheetStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_chipGroupStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_chipGroupStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_chipStandaloneStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_chipStandaloneStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_chipStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_chipStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_colorAccent = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_colorAccent;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_colorBackgroundFloating = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_colorBackgroundFloating;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_colorPrimary = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_colorPrimary;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_colorPrimaryDark = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_colorPrimaryDark;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_colorSecondary = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_colorSecondary;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_editTextStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_editTextStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_floatingActionButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_floatingActionButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_materialButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_materialButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_materialCardViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_materialCardViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_navigationViewStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_navigationViewStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_scrimBackground = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_scrimBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_snackbarButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_snackbarButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_tabStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_tabStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceBody1 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceBody1;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceBody2 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceBody2;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceButton = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceButton;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceCaption = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceCaption;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline1 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline1;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline2 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline2;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline3 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline3;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline4 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline4;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline5 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline5;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline6 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceHeadline6;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceOverline = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceOverline;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceSubtitle1 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceSubtitle1;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textAppearanceSubtitle2 = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textAppearanceSubtitle2;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MaterialComponentsTheme_textInputStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MaterialComponentsTheme_textInputStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuGroup = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuGroup_android_checkableBehavior = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup_android_checkableBehavior;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuGroup_android_enabled = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup_android_enabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuGroup_android_id = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup_android_id;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuGroup_android_menuCategory = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup_android_menuCategory;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuGroup_android_orderInCategory = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup_android_orderInCategory;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuGroup_android_visible = global::HelloworldXamarin.Droid.Resource.Styleable.MenuGroup_android_visible;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_actionLayout = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_actionLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_actionProviderClass = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_actionProviderClass;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_actionViewClass = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_actionViewClass;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_alphabeticModifiers = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_alphabeticModifiers;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_alphabeticShortcut = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_alphabeticShortcut;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_checkable = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_checkable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_checked = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_checked;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_enabled = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_enabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_icon = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_icon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_id = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_id;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_menuCategory = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_menuCategory;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_numericShortcut = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_numericShortcut;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_onClick = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_onClick;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_orderInCategory = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_orderInCategory;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_title = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_title;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_titleCondensed = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_titleCondensed;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_android_visible = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_android_visible;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_contentDescription = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_contentDescription;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_iconTint = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_iconTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_iconTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_iconTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_numericModifiers = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_numericModifiers;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_showAsAction = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_showAsAction;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuItem_tooltipText = global::HelloworldXamarin.Droid.Resource.Styleable.MenuItem_tooltipText;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuView = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuView_android_headerBackground = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_headerBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuView_android_horizontalDivider = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_horizontalDivider;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuView_android_itemBackground = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_itemBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuView_android_itemIconDisabledAlpha = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_itemIconDisabledAlpha;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuView_android_itemTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_itemTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuView_android_verticalDivider = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_verticalDivider;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuView_android_windowAnimationStyle = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_android_windowAnimationStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuView_preserveIconSpacing = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_preserveIconSpacing;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.MenuView_subMenuArrow = global::HelloworldXamarin.Droid.Resource.Styleable.MenuView_subMenuArrow;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView_android_background = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_android_background;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView_android_fitsSystemWindows = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_android_fitsSystemWindows;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView_android_maxWidth = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_android_maxWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView_elevation = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView_headerLayout = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_headerLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView_itemBackground = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_itemBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView_itemHorizontalPadding = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_itemHorizontalPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView_itemIconPadding = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_itemIconPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView_itemIconTint = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_itemIconTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView_itemTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_itemTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView_itemTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_itemTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.NavigationView_menu = global::HelloworldXamarin.Droid.Resource.Styleable.NavigationView_menu;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.PopupWindow = global::HelloworldXamarin.Droid.Resource.Styleable.PopupWindow;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.PopupWindowBackgroundState = global::HelloworldXamarin.Droid.Resource.Styleable.PopupWindowBackgroundState;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.PopupWindowBackgroundState_state_above_anchor = global::HelloworldXamarin.Droid.Resource.Styleable.PopupWindowBackgroundState_state_above_anchor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.PopupWindow_android_popupAnimationStyle = global::HelloworldXamarin.Droid.Resource.Styleable.PopupWindow_android_popupAnimationStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.PopupWindow_android_popupBackground = global::HelloworldXamarin.Droid.Resource.Styleable.PopupWindow_android_popupBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.PopupWindow_overlapAnchor = global::HelloworldXamarin.Droid.Resource.Styleable.PopupWindow_overlapAnchor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecycleListView = global::HelloworldXamarin.Droid.Resource.Styleable.RecycleListView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecycleListView_paddingBottomNoButtons = global::HelloworldXamarin.Droid.Resource.Styleable.RecycleListView_paddingBottomNoButtons;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecycleListView_paddingTopNoTitle = global::HelloworldXamarin.Droid.Resource.Styleable.RecycleListView_paddingTopNoTitle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecyclerView = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecyclerView_android_descendantFocusability = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_android_descendantFocusability;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecyclerView_android_orientation = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_android_orientation;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecyclerView_fastScrollEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_fastScrollEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecyclerView_fastScrollHorizontalThumbDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_fastScrollHorizontalThumbDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecyclerView_fastScrollHorizontalTrackDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_fastScrollHorizontalTrackDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecyclerView_fastScrollVerticalThumbDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_fastScrollVerticalThumbDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecyclerView_fastScrollVerticalTrackDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_fastScrollVerticalTrackDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecyclerView_layoutManager = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_layoutManager;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecyclerView_reverseLayout = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_reverseLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecyclerView_spanCount = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_spanCount;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.RecyclerView_stackFromEnd = global::HelloworldXamarin.Droid.Resource.Styleable.RecyclerView_stackFromEnd;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ScrimInsetsFrameLayout = global::HelloworldXamarin.Droid.Resource.Styleable.ScrimInsetsFrameLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ScrimInsetsFrameLayout_insetForeground = global::HelloworldXamarin.Droid.Resource.Styleable.ScrimInsetsFrameLayout_insetForeground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ScrollingViewBehavior_Layout = global::HelloworldXamarin.Droid.Resource.Styleable.ScrollingViewBehavior_Layout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ScrollingViewBehavior_Layout_behavior_overlapTop = global::HelloworldXamarin.Droid.Resource.Styleable.ScrollingViewBehavior_Layout_behavior_overlapTop;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_android_focusable = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_android_focusable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_android_imeOptions = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_android_imeOptions;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_android_inputType = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_android_inputType;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_android_maxWidth = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_android_maxWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_closeIcon = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_closeIcon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_commitIcon = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_commitIcon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_defaultQueryHint = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_defaultQueryHint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_goIcon = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_goIcon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_iconifiedByDefault = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_iconifiedByDefault;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_layout = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_layout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_queryBackground = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_queryBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_queryHint = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_queryHint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_searchHintIcon = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_searchHintIcon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_searchIcon = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_searchIcon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_submitBackground = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_submitBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_suggestionRowLayout = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_suggestionRowLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SearchView_voiceIcon = global::HelloworldXamarin.Droid.Resource.Styleable.SearchView_voiceIcon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Snackbar = global::HelloworldXamarin.Droid.Resource.Styleable.Snackbar;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SnackbarLayout = global::HelloworldXamarin.Droid.Resource.Styleable.SnackbarLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SnackbarLayout_android_maxWidth = global::HelloworldXamarin.Droid.Resource.Styleable.SnackbarLayout_android_maxWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SnackbarLayout_elevation = global::HelloworldXamarin.Droid.Resource.Styleable.SnackbarLayout_elevation;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SnackbarLayout_maxActionInlineWidth = global::HelloworldXamarin.Droid.Resource.Styleable.SnackbarLayout_maxActionInlineWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Snackbar_snackbarButtonStyle = global::HelloworldXamarin.Droid.Resource.Styleable.Snackbar_snackbarButtonStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Snackbar_snackbarStyle = global::HelloworldXamarin.Droid.Resource.Styleable.Snackbar_snackbarStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Spinner = global::HelloworldXamarin.Droid.Resource.Styleable.Spinner;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Spinner_android_dropDownWidth = global::HelloworldXamarin.Droid.Resource.Styleable.Spinner_android_dropDownWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Spinner_android_entries = global::HelloworldXamarin.Droid.Resource.Styleable.Spinner_android_entries;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Spinner_android_popupBackground = global::HelloworldXamarin.Droid.Resource.Styleable.Spinner_android_popupBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Spinner_android_prompt = global::HelloworldXamarin.Droid.Resource.Styleable.Spinner_android_prompt;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Spinner_popupTheme = global::HelloworldXamarin.Droid.Resource.Styleable.Spinner_popupTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.StateListDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.StateListDrawableItem = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawableItem;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.StateListDrawableItem_android_drawable = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawableItem_android_drawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.StateListDrawable_android_constantSize = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable_android_constantSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.StateListDrawable_android_dither = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable_android_dither;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.StateListDrawable_android_enterFadeDuration = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable_android_enterFadeDuration;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.StateListDrawable_android_exitFadeDuration = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable_android_exitFadeDuration;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.StateListDrawable_android_variablePadding = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable_android_variablePadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.StateListDrawable_android_visible = global::HelloworldXamarin.Droid.Resource.Styleable.StateListDrawable_android_visible;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_android_textOff = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_android_textOff;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_android_textOn = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_android_textOn;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_android_thumb = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_android_thumb;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_showText = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_showText;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_splitTrack = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_splitTrack;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_switchMinWidth = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_switchMinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_switchPadding = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_switchPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_switchTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_switchTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_thumbTextPadding = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_thumbTextPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_thumbTint = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_thumbTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_thumbTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_thumbTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_track = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_track;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_trackTint = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_trackTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.SwitchCompat_trackTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.SwitchCompat_trackTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabItem = global::HelloworldXamarin.Droid.Resource.Styleable.TabItem;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabItem_android_icon = global::HelloworldXamarin.Droid.Resource.Styleable.TabItem_android_icon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabItem_android_layout = global::HelloworldXamarin.Droid.Resource.Styleable.TabItem_android_layout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabItem_android_text = global::HelloworldXamarin.Droid.Resource.Styleable.TabItem_android_text;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabBackground = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabBackground;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabContentStart = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabContentStart;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabGravity = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabGravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabIconTint = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIconTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabIconTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIconTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabIndicator = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIndicator;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabIndicatorAnimationDuration = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIndicatorAnimationDuration;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabIndicatorColor = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIndicatorColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabIndicatorFullWidth = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIndicatorFullWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabIndicatorGravity = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIndicatorGravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabIndicatorHeight = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabIndicatorHeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabInlineLabel = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabInlineLabel;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabMaxWidth = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabMaxWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabMinWidth = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabMinWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabMode = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabPadding = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabPadding;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabPaddingBottom = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabPaddingBottom;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabPaddingEnd = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabPaddingEnd;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabPaddingStart = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabPaddingStart;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabPaddingTop = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabPaddingTop;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabRippleColor = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabRippleColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabSelectedTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabSelectedTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TabLayout_tabUnboundedRipple = global::HelloworldXamarin.Droid.Resource.Styleable.TabLayout_tabUnboundedRipple;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_android_fontFamily = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_fontFamily;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_android_shadowColor = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_shadowColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_android_shadowDx = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_shadowDx;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_android_shadowDy = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_shadowDy;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_android_shadowRadius = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_shadowRadius;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_android_textColor = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_textColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_android_textColorHint = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_textColorHint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_android_textColorLink = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_textColorLink;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_android_textSize = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_textSize;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_android_textStyle = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_textStyle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_android_typeface = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_android_typeface;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_fontFamily = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_fontFamily;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextAppearance_textAllCaps = global::HelloworldXamarin.Droid.Resource.Styleable.TextAppearance_textAllCaps;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_android_hint = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_android_hint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_android_textColorHint = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_android_textColorHint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_boxBackgroundColor = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxBackgroundColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_boxBackgroundMode = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxBackgroundMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_boxCollapsedPaddingTop = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxCollapsedPaddingTop;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_boxCornerRadiusBottomEnd = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxCornerRadiusBottomEnd;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_boxCornerRadiusBottomStart = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxCornerRadiusBottomStart;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_boxCornerRadiusTopEnd = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxCornerRadiusTopEnd;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_boxCornerRadiusTopStart = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxCornerRadiusTopStart;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_boxStrokeColor = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxStrokeColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_boxStrokeWidth = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_boxStrokeWidth;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_counterEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_counterEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_counterMaxLength = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_counterMaxLength;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_counterOverflowTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_counterOverflowTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_counterTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_counterTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_errorEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_errorEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_errorTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_errorTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_helperText = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_helperText;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_helperTextEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_helperTextEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_helperTextTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_helperTextTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_hintAnimationEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_hintAnimationEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_hintEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_hintEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_hintTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_hintTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_passwordToggleContentDescription = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_passwordToggleContentDescription;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_passwordToggleDrawable = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_passwordToggleDrawable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_passwordToggleEnabled = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_passwordToggleEnabled;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_passwordToggleTint = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_passwordToggleTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.TextInputLayout_passwordToggleTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.TextInputLayout_passwordToggleTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ThemeEnforcement = global::HelloworldXamarin.Droid.Resource.Styleable.ThemeEnforcement;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ThemeEnforcement_android_textAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.ThemeEnforcement_android_textAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ThemeEnforcement_enforceMaterialTheme = global::HelloworldXamarin.Droid.Resource.Styleable.ThemeEnforcement_enforceMaterialTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ThemeEnforcement_enforceTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.ThemeEnforcement_enforceTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_android_gravity = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_android_gravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_android_minHeight = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_android_minHeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_buttonGravity = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_buttonGravity;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_collapseContentDescription = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_collapseContentDescription;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_collapseIcon = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_collapseIcon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_contentInsetEnd = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_contentInsetEnd;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_contentInsetEndWithActions = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_contentInsetEndWithActions;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_contentInsetLeft = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_contentInsetLeft;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_contentInsetRight = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_contentInsetRight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_contentInsetStart = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_contentInsetStart;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_contentInsetStartWithNavigation = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_contentInsetStartWithNavigation;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_logo = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_logo;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_logoDescription = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_logoDescription;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_maxButtonHeight = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_maxButtonHeight;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_navigationContentDescription = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_navigationContentDescription;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_navigationIcon = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_navigationIcon;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_popupTheme = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_popupTheme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_subtitle = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_subtitle;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_subtitleTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_subtitleTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_subtitleTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_subtitleTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_title = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_title;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_titleMargin = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleMargin;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_titleMarginBottom = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleMarginBottom;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_titleMarginEnd = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleMarginEnd;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_titleMargins = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleMargins;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_titleMarginStart = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleMarginStart;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_titleMarginTop = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleMarginTop;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_titleTextAppearance = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleTextAppearance;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.Toolbar_titleTextColor = global::HelloworldXamarin.Droid.Resource.Styleable.Toolbar_titleTextColor;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.View = global::HelloworldXamarin.Droid.Resource.Styleable.View;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ViewBackgroundHelper = global::HelloworldXamarin.Droid.Resource.Styleable.ViewBackgroundHelper;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ViewBackgroundHelper_android_background = global::HelloworldXamarin.Droid.Resource.Styleable.ViewBackgroundHelper_android_background;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ViewBackgroundHelper_backgroundTint = global::HelloworldXamarin.Droid.Resource.Styleable.ViewBackgroundHelper_backgroundTint;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ViewBackgroundHelper_backgroundTintMode = global::HelloworldXamarin.Droid.Resource.Styleable.ViewBackgroundHelper_backgroundTintMode;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ViewStubCompat = global::HelloworldXamarin.Droid.Resource.Styleable.ViewStubCompat;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ViewStubCompat_android_id = global::HelloworldXamarin.Droid.Resource.Styleable.ViewStubCompat_android_id;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ViewStubCompat_android_inflatedId = global::HelloworldXamarin.Droid.Resource.Styleable.ViewStubCompat_android_inflatedId;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.ViewStubCompat_android_layout = global::HelloworldXamarin.Droid.Resource.Styleable.ViewStubCompat_android_layout;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.View_android_focusable = global::HelloworldXamarin.Droid.Resource.Styleable.View_android_focusable;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.View_android_theme = global::HelloworldXamarin.Droid.Resource.Styleable.View_android_theme;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.View_paddingEnd = global::HelloworldXamarin.Droid.Resource.Styleable.View_paddingEnd;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.View_paddingStart = global::HelloworldXamarin.Droid.Resource.Styleable.View_paddingStart;
+                       global::Xamarin.Forms.Platform.Resource.Styleable.View_theme = global::HelloworldXamarin.Droid.Resource.Styleable.View_theme;
+               }
+               
+               public partial class Animation
+               {
+                       
+                       // aapt resource value: 0x7F010000
+                       public const int abc_fade_in = 2130771968;
+                       
+                       // aapt resource value: 0x7F010001
+                       public const int abc_fade_out = 2130771969;
+                       
+                       // aapt resource value: 0x7F010002
+                       public const int abc_grow_fade_in_from_bottom = 2130771970;
+                       
+                       // aapt resource value: 0x7F010003
+                       public const int abc_popup_enter = 2130771971;
+                       
+                       // aapt resource value: 0x7F010004
+                       public const int abc_popup_exit = 2130771972;
+                       
+                       // aapt resource value: 0x7F010005
+                       public const int abc_shrink_fade_out_from_bottom = 2130771973;
+                       
+                       // aapt resource value: 0x7F010006
+                       public const int abc_slide_in_bottom = 2130771974;
+                       
+                       // aapt resource value: 0x7F010007
+                       public const int abc_slide_in_top = 2130771975;
+                       
+                       // aapt resource value: 0x7F010008
+                       public const int abc_slide_out_bottom = 2130771976;
+                       
+                       // aapt resource value: 0x7F010009
+                       public const int abc_slide_out_top = 2130771977;
+                       
+                       // aapt resource value: 0x7F01000A
+                       public const int abc_tooltip_enter = 2130771978;
+                       
+                       // aapt resource value: 0x7F01000B
+                       public const int abc_tooltip_exit = 2130771979;
+                       
+                       // aapt resource value: 0x7F01000C
+                       public const int design_bottom_sheet_slide_in = 2130771980;
+                       
+                       // aapt resource value: 0x7F01000D
+                       public const int design_bottom_sheet_slide_out = 2130771981;
+                       
+                       // aapt resource value: 0x7F01000E
+                       public const int design_snackbar_in = 2130771982;
+                       
+                       // aapt resource value: 0x7F01000F
+                       public const int design_snackbar_out = 2130771983;
+                       
+                       // aapt resource value: 0x7F010010
+                       public const int EnterFromLeft = 2130771984;
+                       
+                       // aapt resource value: 0x7F010011
+                       public const int EnterFromRight = 2130771985;
+                       
+                       // aapt resource value: 0x7F010012
+                       public const int ExitToLeft = 2130771986;
+                       
+                       // aapt resource value: 0x7F010013
+                       public const int ExitToRight = 2130771987;
+                       
+                       static Animation()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Animation()
+                       {
+                       }
+               }
+               
+               public partial class Animator
+               {
+                       
+                       // aapt resource value: 0x7F020000
+                       public const int design_appbar_state_list_animator = 2130837504;
+                       
+                       // aapt resource value: 0x7F020001
+                       public const int design_fab_hide_motion_spec = 2130837505;
+                       
+                       // aapt resource value: 0x7F020002
+                       public const int design_fab_show_motion_spec = 2130837506;
+                       
+                       // aapt resource value: 0x7F020003
+                       public const int mtrl_btn_state_list_anim = 2130837507;
+                       
+                       // aapt resource value: 0x7F020004
+                       public const int mtrl_btn_unelevated_state_list_anim = 2130837508;
+                       
+                       // aapt resource value: 0x7F020005
+                       public const int mtrl_chip_state_list_anim = 2130837509;
+                       
+                       // aapt resource value: 0x7F020006
+                       public const int mtrl_fab_hide_motion_spec = 2130837510;
+                       
+                       // aapt resource value: 0x7F020007
+                       public const int mtrl_fab_show_motion_spec = 2130837511;
+                       
+                       // aapt resource value: 0x7F020008
+                       public const int mtrl_fab_transformation_sheet_collapse_spec = 2130837512;
+                       
+                       // aapt resource value: 0x7F020009
+                       public const int mtrl_fab_transformation_sheet_expand_spec = 2130837513;
+                       
+                       static Animator()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Animator()
+                       {
+                       }
+               }
+               
+               public partial class Attribute
+               {
+                       
+                       // aapt resource value: 0x7F030000
+                       public const int actionBarDivider = 2130903040;
+                       
+                       // aapt resource value: 0x7F030001
+                       public const int actionBarItemBackground = 2130903041;
+                       
+                       // aapt resource value: 0x7F030002
+                       public const int actionBarPopupTheme = 2130903042;
+                       
+                       // aapt resource value: 0x7F030003
+                       public const int actionBarSize = 2130903043;
+                       
+                       // aapt resource value: 0x7F030004
+                       public const int actionBarSplitStyle = 2130903044;
+                       
+                       // aapt resource value: 0x7F030005
+                       public const int actionBarStyle = 2130903045;
+                       
+                       // aapt resource value: 0x7F030006
+                       public const int actionBarTabBarStyle = 2130903046;
+                       
+                       // aapt resource value: 0x7F030007
+                       public const int actionBarTabStyle = 2130903047;
+                       
+                       // aapt resource value: 0x7F030008
+                       public const int actionBarTabTextStyle = 2130903048;
+                       
+                       // aapt resource value: 0x7F030009
+                       public const int actionBarTheme = 2130903049;
+                       
+                       // aapt resource value: 0x7F03000A
+                       public const int actionBarWidgetTheme = 2130903050;
+                       
+                       // aapt resource value: 0x7F03000B
+                       public const int actionButtonStyle = 2130903051;
+                       
+                       // aapt resource value: 0x7F03000C
+                       public const int actionDropDownStyle = 2130903052;
+                       
+                       // aapt resource value: 0x7F03000D
+                       public const int actionLayout = 2130903053;
+                       
+                       // aapt resource value: 0x7F03000E
+                       public const int actionMenuTextAppearance = 2130903054;
+                       
+                       // aapt resource value: 0x7F03000F
+                       public const int actionMenuTextColor = 2130903055;
+                       
+                       // aapt resource value: 0x7F030010
+                       public const int actionModeBackground = 2130903056;
+                       
+                       // aapt resource value: 0x7F030011
+                       public const int actionModeCloseButtonStyle = 2130903057;
+                       
+                       // aapt resource value: 0x7F030012
+                       public const int actionModeCloseDrawable = 2130903058;
+                       
+                       // aapt resource value: 0x7F030013
+                       public const int actionModeCopyDrawable = 2130903059;
+                       
+                       // aapt resource value: 0x7F030014
+                       public const int actionModeCutDrawable = 2130903060;
+                       
+                       // aapt resource value: 0x7F030015
+                       public const int actionModeFindDrawable = 2130903061;
+                       
+                       // aapt resource value: 0x7F030016
+                       public const int actionModePasteDrawable = 2130903062;
+                       
+                       // aapt resource value: 0x7F030017
+                       public const int actionModePopupWindowStyle = 2130903063;
+                       
+                       // aapt resource value: 0x7F030018
+                       public const int actionModeSelectAllDrawable = 2130903064;
+                       
+                       // aapt resource value: 0x7F030019
+                       public const int actionModeShareDrawable = 2130903065;
+                       
+                       // aapt resource value: 0x7F03001A
+                       public const int actionModeSplitBackground = 2130903066;
+                       
+                       // aapt resource value: 0x7F03001B
+                       public const int actionModeStyle = 2130903067;
+                       
+                       // aapt resource value: 0x7F03001C
+                       public const int actionModeWebSearchDrawable = 2130903068;
+                       
+                       // aapt resource value: 0x7F03001D
+                       public const int actionOverflowButtonStyle = 2130903069;
+                       
+                       // aapt resource value: 0x7F03001E
+                       public const int actionOverflowMenuStyle = 2130903070;
+                       
+                       // aapt resource value: 0x7F03001F
+                       public const int actionProviderClass = 2130903071;
+                       
+                       // aapt resource value: 0x7F030020
+                       public const int actionViewClass = 2130903072;
+                       
+                       // aapt resource value: 0x7F030021
+                       public const int activityChooserViewStyle = 2130903073;
+                       
+                       // aapt resource value: 0x7F030022
+                       public const int alertDialogButtonGroupStyle = 2130903074;
+                       
+                       // aapt resource value: 0x7F030023
+                       public const int alertDialogCenterButtons = 2130903075;
+                       
+                       // aapt resource value: 0x7F030024
+                       public const int alertDialogStyle = 2130903076;
+                       
+                       // aapt resource value: 0x7F030025
+                       public const int alertDialogTheme = 2130903077;
+                       
+                       // aapt resource value: 0x7F030026
+                       public const int allowStacking = 2130903078;
+                       
+                       // aapt resource value: 0x7F030027
+                       public const int alpha = 2130903079;
+                       
+                       // aapt resource value: 0x7F030028
+                       public const int alphabeticModifiers = 2130903080;
+                       
+                       // aapt resource value: 0x7F030029
+                       public const int arrowHeadLength = 2130903081;
+                       
+                       // aapt resource value: 0x7F03002A
+                       public const int arrowShaftLength = 2130903082;
+                       
+                       // aapt resource value: 0x7F03002B
+                       public const int autoCompleteTextViewStyle = 2130903083;
+                       
+                       // aapt resource value: 0x7F03002C
+                       public const int autoSizeMaxTextSize = 2130903084;
+                       
+                       // aapt resource value: 0x7F03002D
+                       public const int autoSizeMinTextSize = 2130903085;
+                       
+                       // aapt resource value: 0x7F03002E
+                       public const int autoSizePresetSizes = 2130903086;
+                       
+                       // aapt resource value: 0x7F03002F
+                       public const int autoSizeStepGranularity = 2130903087;
+                       
+                       // aapt resource value: 0x7F030030
+                       public const int autoSizeTextType = 2130903088;
+                       
+                       // aapt resource value: 0x7F030031
+                       public const int background = 2130903089;
+                       
+                       // aapt resource value: 0x7F030032
+                       public const int backgroundSplit = 2130903090;
+                       
+                       // aapt resource value: 0x7F030033
+                       public const int backgroundStacked = 2130903091;
+                       
+                       // aapt resource value: 0x7F030034
+                       public const int backgroundTint = 2130903092;
+                       
+                       // aapt resource value: 0x7F030035
+                       public const int backgroundTintMode = 2130903093;
+                       
+                       // aapt resource value: 0x7F030036
+                       public const int barLength = 2130903094;
+                       
+                       // aapt resource value: 0x7F030037
+                       public const int behavior_autoHide = 2130903095;
+                       
+                       // aapt resource value: 0x7F030038
+                       public const int behavior_fitToContents = 2130903096;
+                       
+                       // aapt resource value: 0x7F030039
+                       public const int behavior_hideable = 2130903097;
+                       
+                       // aapt resource value: 0x7F03003A
+                       public const int behavior_overlapTop = 2130903098;
+                       
+                       // aapt resource value: 0x7F03003B
+                       public const int behavior_peekHeight = 2130903099;
+                       
+                       // aapt resource value: 0x7F03003C
+                       public const int behavior_skipCollapsed = 2130903100;
+                       
+                       // aapt resource value: 0x7F03003E
+                       public const int borderlessButtonStyle = 2130903102;
+                       
+                       // aapt resource value: 0x7F03003D
+                       public const int borderWidth = 2130903101;
+                       
+                       // aapt resource value: 0x7F03003F
+                       public const int bottomAppBarStyle = 2130903103;
+                       
+                       // aapt resource value: 0x7F030040
+                       public const int bottomNavigationStyle = 2130903104;
+                       
+                       // aapt resource value: 0x7F030041
+                       public const int bottomSheetDialogTheme = 2130903105;
+                       
+                       // aapt resource value: 0x7F030042
+                       public const int bottomSheetStyle = 2130903106;
+                       
+                       // aapt resource value: 0x7F030043
+                       public const int boxBackgroundColor = 2130903107;
+                       
+                       // aapt resource value: 0x7F030044
+                       public const int boxBackgroundMode = 2130903108;
+                       
+                       // aapt resource value: 0x7F030045
+                       public const int boxCollapsedPaddingTop = 2130903109;
+                       
+                       // aapt resource value: 0x7F030046
+                       public const int boxCornerRadiusBottomEnd = 2130903110;
+                       
+                       // aapt resource value: 0x7F030047
+                       public const int boxCornerRadiusBottomStart = 2130903111;
+                       
+                       // aapt resource value: 0x7F030048
+                       public const int boxCornerRadiusTopEnd = 2130903112;
+                       
+                       // aapt resource value: 0x7F030049
+                       public const int boxCornerRadiusTopStart = 2130903113;
+                       
+                       // aapt resource value: 0x7F03004A
+                       public const int boxStrokeColor = 2130903114;
+                       
+                       // aapt resource value: 0x7F03004B
+                       public const int boxStrokeWidth = 2130903115;
+                       
+                       // aapt resource value: 0x7F03004C
+                       public const int buttonBarButtonStyle = 2130903116;
+                       
+                       // aapt resource value: 0x7F03004D
+                       public const int buttonBarNegativeButtonStyle = 2130903117;
+                       
+                       // aapt resource value: 0x7F03004E
+                       public const int buttonBarNeutralButtonStyle = 2130903118;
+                       
+                       // aapt resource value: 0x7F03004F
+                       public const int buttonBarPositiveButtonStyle = 2130903119;
+                       
+                       // aapt resource value: 0x7F030050
+                       public const int buttonBarStyle = 2130903120;
+                       
+                       // aapt resource value: 0x7F030051
+                       public const int buttonGravity = 2130903121;
+                       
+                       // aapt resource value: 0x7F030052
+                       public const int buttonIconDimen = 2130903122;
+                       
+                       // aapt resource value: 0x7F030053
+                       public const int buttonPanelSideLayout = 2130903123;
+                       
+                       // aapt resource value: 0x7F030054
+                       public const int buttonStyle = 2130903124;
+                       
+                       // aapt resource value: 0x7F030055
+                       public const int buttonStyleSmall = 2130903125;
+                       
+                       // aapt resource value: 0x7F030056
+                       public const int buttonTint = 2130903126;
+                       
+                       // aapt resource value: 0x7F030057
+                       public const int buttonTintMode = 2130903127;
+                       
+                       // aapt resource value: 0x7F030058
+                       public const int cardBackgroundColor = 2130903128;
+                       
+                       // aapt resource value: 0x7F030059
+                       public const int cardCornerRadius = 2130903129;
+                       
+                       // aapt resource value: 0x7F03005A
+                       public const int cardElevation = 2130903130;
+                       
+                       // aapt resource value: 0x7F03005B
+                       public const int cardMaxElevation = 2130903131;
+                       
+                       // aapt resource value: 0x7F03005C
+                       public const int cardPreventCornerOverlap = 2130903132;
+                       
+                       // aapt resource value: 0x7F03005D
+                       public const int cardUseCompatPadding = 2130903133;
+                       
+                       // aapt resource value: 0x7F03005E
+                       public const int cardViewStyle = 2130903134;
+                       
+                       // aapt resource value: 0x7F03005F
+                       public const int checkboxStyle = 2130903135;
+                       
+                       // aapt resource value: 0x7F030060
+                       public const int checkedChip = 2130903136;
+                       
+                       // aapt resource value: 0x7F030061
+                       public const int checkedIcon = 2130903137;
+                       
+                       // aapt resource value: 0x7F030062
+                       public const int checkedIconEnabled = 2130903138;
+                       
+                       // aapt resource value: 0x7F030063
+                       public const int checkedIconVisible = 2130903139;
+                       
+                       // aapt resource value: 0x7F030064
+                       public const int checkedTextViewStyle = 2130903140;
+                       
+                       // aapt resource value: 0x7F030065
+                       public const int chipBackgroundColor = 2130903141;
+                       
+                       // aapt resource value: 0x7F030066
+                       public const int chipCornerRadius = 2130903142;
+                       
+                       // aapt resource value: 0x7F030067
+                       public const int chipEndPadding = 2130903143;
+                       
+                       // aapt resource value: 0x7F030068
+                       public const int chipGroupStyle = 2130903144;
+                       
+                       // aapt resource value: 0x7F030069
+                       public const int chipIcon = 2130903145;
+                       
+                       // aapt resource value: 0x7F03006A
+                       public const int chipIconEnabled = 2130903146;
+                       
+                       // aapt resource value: 0x7F03006B
+                       public const int chipIconSize = 2130903147;
+                       
+                       // aapt resource value: 0x7F03006C
+                       public const int chipIconTint = 2130903148;
+                       
+                       // aapt resource value: 0x7F03006D
+                       public const int chipIconVisible = 2130903149;
+                       
+                       // aapt resource value: 0x7F03006E
+                       public const int chipMinHeight = 2130903150;
+                       
+                       // aapt resource value: 0x7F03006F
+                       public const int chipSpacing = 2130903151;
+                       
+                       // aapt resource value: 0x7F030070
+                       public const int chipSpacingHorizontal = 2130903152;
+                       
+                       // aapt resource value: 0x7F030071
+                       public const int chipSpacingVertical = 2130903153;
+                       
+                       // aapt resource value: 0x7F030072
+                       public const int chipStandaloneStyle = 2130903154;
+                       
+                       // aapt resource value: 0x7F030073
+                       public const int chipStartPadding = 2130903155;
+                       
+                       // aapt resource value: 0x7F030074
+                       public const int chipStrokeColor = 2130903156;
+                       
+                       // aapt resource value: 0x7F030075
+                       public const int chipStrokeWidth = 2130903157;
+                       
+                       // aapt resource value: 0x7F030076
+                       public const int chipStyle = 2130903158;
+                       
+                       // aapt resource value: 0x7F030077
+                       public const int closeIcon = 2130903159;
+                       
+                       // aapt resource value: 0x7F030078
+                       public const int closeIconEnabled = 2130903160;
+                       
+                       // aapt resource value: 0x7F030079
+                       public const int closeIconEndPadding = 2130903161;
+                       
+                       // aapt resource value: 0x7F03007A
+                       public const int closeIconSize = 2130903162;
+                       
+                       // aapt resource value: 0x7F03007B
+                       public const int closeIconStartPadding = 2130903163;
+                       
+                       // aapt resource value: 0x7F03007C
+                       public const int closeIconTint = 2130903164;
+                       
+                       // aapt resource value: 0x7F03007D
+                       public const int closeIconVisible = 2130903165;
+                       
+                       // aapt resource value: 0x7F03007E
+                       public const int closeItemLayout = 2130903166;
+                       
+                       // aapt resource value: 0x7F03007F
+                       public const int collapseContentDescription = 2130903167;
+                       
+                       // aapt resource value: 0x7F030081
+                       public const int collapsedTitleGravity = 2130903169;
+                       
+                       // aapt resource value: 0x7F030082
+                       public const int collapsedTitleTextAppearance = 2130903170;
+                       
+                       // aapt resource value: 0x7F030080
+                       public const int collapseIcon = 2130903168;
+                       
+                       // aapt resource value: 0x7F030083
+                       public const int color = 2130903171;
+                       
+                       // aapt resource value: 0x7F030084
+                       public const int colorAccent = 2130903172;
+                       
+                       // aapt resource value: 0x7F030085
+                       public const int colorBackgroundFloating = 2130903173;
+                       
+                       // aapt resource value: 0x7F030086
+                       public const int colorButtonNormal = 2130903174;
+                       
+                       // aapt resource value: 0x7F030087
+                       public const int colorControlActivated = 2130903175;
+                       
+                       // aapt resource value: 0x7F030088
+                       public const int colorControlHighlight = 2130903176;
+                       
+                       // aapt resource value: 0x7F030089
+                       public const int colorControlNormal = 2130903177;
+                       
+                       // aapt resource value: 0x7F03008A
+                       public const int colorError = 2130903178;
+                       
+                       // aapt resource value: 0x7F03008B
+                       public const int colorPrimary = 2130903179;
+                       
+                       // aapt resource value: 0x7F03008C
+                       public const int colorPrimaryDark = 2130903180;
+                       
+                       // aapt resource value: 0x7F03008D
+                       public const int colorSecondary = 2130903181;
+                       
+                       // aapt resource value: 0x7F03008E
+                       public const int colorSwitchThumbNormal = 2130903182;
+                       
+                       // aapt resource value: 0x7F03008F
+                       public const int commitIcon = 2130903183;
+                       
+                       // aapt resource value: 0x7F030090
+                       public const int contentDescription = 2130903184;
+                       
+                       // aapt resource value: 0x7F030091
+                       public const int contentInsetEnd = 2130903185;
+                       
+                       // aapt resource value: 0x7F030092
+                       public const int contentInsetEndWithActions = 2130903186;
+                       
+                       // aapt resource value: 0x7F030093
+                       public const int contentInsetLeft = 2130903187;
+                       
+                       // aapt resource value: 0x7F030094
+                       public const int contentInsetRight = 2130903188;
+                       
+                       // aapt resource value: 0x7F030095
+                       public const int contentInsetStart = 2130903189;
+                       
+                       // aapt resource value: 0x7F030096
+                       public const int contentInsetStartWithNavigation = 2130903190;
+                       
+                       // aapt resource value: 0x7F030097
+                       public const int contentPadding = 2130903191;
+                       
+                       // aapt resource value: 0x7F030098
+                       public const int contentPaddingBottom = 2130903192;
+                       
+                       // aapt resource value: 0x7F030099
+                       public const int contentPaddingLeft = 2130903193;
+                       
+                       // aapt resource value: 0x7F03009A
+                       public const int contentPaddingRight = 2130903194;
+                       
+                       // aapt resource value: 0x7F03009B
+                       public const int contentPaddingTop = 2130903195;
+                       
+                       // aapt resource value: 0x7F03009C
+                       public const int contentScrim = 2130903196;
+                       
+                       // aapt resource value: 0x7F03009D
+                       public const int controlBackground = 2130903197;
+                       
+                       // aapt resource value: 0x7F03009E
+                       public const int coordinatorLayoutStyle = 2130903198;
+                       
+                       // aapt resource value: 0x7F03009F
+                       public const int cornerRadius = 2130903199;
+                       
+                       // aapt resource value: 0x7F0300A0
+                       public const int counterEnabled = 2130903200;
+                       
+                       // aapt resource value: 0x7F0300A1
+                       public const int counterMaxLength = 2130903201;
+                       
+                       // aapt resource value: 0x7F0300A2
+                       public const int counterOverflowTextAppearance = 2130903202;
+                       
+                       // aapt resource value: 0x7F0300A3
+                       public const int counterTextAppearance = 2130903203;
+                       
+                       // aapt resource value: 0x7F0300A4
+                       public const int customNavigationLayout = 2130903204;
+                       
+                       // aapt resource value: 0x7F0300A5
+                       public const int defaultQueryHint = 2130903205;
+                       
+                       // aapt resource value: 0x7F0300A6
+                       public const int dialogCornerRadius = 2130903206;
+                       
+                       // aapt resource value: 0x7F0300A7
+                       public const int dialogPreferredPadding = 2130903207;
+                       
+                       // aapt resource value: 0x7F0300A8
+                       public const int dialogTheme = 2130903208;
+                       
+                       // aapt resource value: 0x7F0300A9
+                       public const int displayOptions = 2130903209;
+                       
+                       // aapt resource value: 0x7F0300AA
+                       public const int divider = 2130903210;
+                       
+                       // aapt resource value: 0x7F0300AB
+                       public const int dividerHorizontal = 2130903211;
+                       
+                       // aapt resource value: 0x7F0300AC
+                       public const int dividerPadding = 2130903212;
+                       
+                       // aapt resource value: 0x7F0300AD
+                       public const int dividerVertical = 2130903213;
+                       
+                       // aapt resource value: 0x7F0300AE
+                       public const int drawableSize = 2130903214;
+                       
+                       // aapt resource value: 0x7F0300AF
+                       public const int drawerArrowStyle = 2130903215;
+                       
+                       // aapt resource value: 0x7F0300B1
+                       public const int dropdownListPreferredItemHeight = 2130903217;
+                       
+                       // aapt resource value: 0x7F0300B0
+                       public const int dropDownListViewStyle = 2130903216;
+                       
+                       // aapt resource value: 0x7F0300B2
+                       public const int editTextBackground = 2130903218;
+                       
+                       // aapt resource value: 0x7F0300B3
+                       public const int editTextColor = 2130903219;
+                       
+                       // aapt resource value: 0x7F0300B4
+                       public const int editTextStyle = 2130903220;
+                       
+                       // aapt resource value: 0x7F0300B5
+                       public const int elevation = 2130903221;
+                       
+                       // aapt resource value: 0x7F0300B6
+                       public const int enforceMaterialTheme = 2130903222;
+                       
+                       // aapt resource value: 0x7F0300B7
+                       public const int enforceTextAppearance = 2130903223;
+                       
+                       // aapt resource value: 0x7F0300B8
+                       public const int errorEnabled = 2130903224;
+                       
+                       // aapt resource value: 0x7F0300B9
+                       public const int errorTextAppearance = 2130903225;
+                       
+                       // aapt resource value: 0x7F0300BA
+                       public const int expandActivityOverflowButtonDrawable = 2130903226;
+                       
+                       // aapt resource value: 0x7F0300BB
+                       public const int expanded = 2130903227;
+                       
+                       // aapt resource value: 0x7F0300BC
+                       public const int expandedTitleGravity = 2130903228;
+                       
+                       // aapt resource value: 0x7F0300BD
+                       public const int expandedTitleMargin = 2130903229;
+                       
+                       // aapt resource value: 0x7F0300BE
+                       public const int expandedTitleMarginBottom = 2130903230;
+                       
+                       // aapt resource value: 0x7F0300BF
+                       public const int expandedTitleMarginEnd = 2130903231;
+                       
+                       // aapt resource value: 0x7F0300C0
+                       public const int expandedTitleMarginStart = 2130903232;
+                       
+                       // aapt resource value: 0x7F0300C1
+                       public const int expandedTitleMarginTop = 2130903233;
+                       
+                       // aapt resource value: 0x7F0300C2
+                       public const int expandedTitleTextAppearance = 2130903234;
+                       
+                       // aapt resource value: 0x7F0300C3
+                       public const int fabAlignmentMode = 2130903235;
+                       
+                       // aapt resource value: 0x7F0300C4
+                       public const int fabCradleMargin = 2130903236;
+                       
+                       // aapt resource value: 0x7F0300C5
+                       public const int fabCradleRoundedCornerRadius = 2130903237;
+                       
+                       // aapt resource value: 0x7F0300C6
+                       public const int fabCradleVerticalOffset = 2130903238;
+                       
+                       // aapt resource value: 0x7F0300C7
+                       public const int fabCustomSize = 2130903239;
+                       
+                       // aapt resource value: 0x7F0300C8
+                       public const int fabSize = 2130903240;
+                       
+                       // aapt resource value: 0x7F0300C9
+                       public const int fastScrollEnabled = 2130903241;
+                       
+                       // aapt resource value: 0x7F0300CA
+                       public const int fastScrollHorizontalThumbDrawable = 2130903242;
+                       
+                       // aapt resource value: 0x7F0300CB
+                       public const int fastScrollHorizontalTrackDrawable = 2130903243;
+                       
+                       // aapt resource value: 0x7F0300CC
+                       public const int fastScrollVerticalThumbDrawable = 2130903244;
+                       
+                       // aapt resource value: 0x7F0300CD
+                       public const int fastScrollVerticalTrackDrawable = 2130903245;
+                       
+                       // aapt resource value: 0x7F0300CE
+                       public const int firstBaselineToTopHeight = 2130903246;
+                       
+                       // aapt resource value: 0x7F0300CF
+                       public const int floatingActionButtonStyle = 2130903247;
+                       
+                       // aapt resource value: 0x7F0300D0
+                       public const int font = 2130903248;
+                       
+                       // aapt resource value: 0x7F0300D1
+                       public const int fontFamily = 2130903249;
+                       
+                       // aapt resource value: 0x7F0300D2
+                       public const int fontProviderAuthority = 2130903250;
+                       
+                       // aapt resource value: 0x7F0300D3
+                       public const int fontProviderCerts = 2130903251;
+                       
+                       // aapt resource value: 0x7F0300D4
+                       public const int fontProviderFetchStrategy = 2130903252;
+                       
+                       // aapt resource value: 0x7F0300D5
+                       public const int fontProviderFetchTimeout = 2130903253;
+                       
+                       // aapt resource value: 0x7F0300D6
+                       public const int fontProviderPackage = 2130903254;
+                       
+                       // aapt resource value: 0x7F0300D7
+                       public const int fontProviderQuery = 2130903255;
+                       
+                       // aapt resource value: 0x7F0300D8
+                       public const int fontStyle = 2130903256;
+                       
+                       // aapt resource value: 0x7F0300D9
+                       public const int fontVariationSettings = 2130903257;
+                       
+                       // aapt resource value: 0x7F0300DA
+                       public const int fontWeight = 2130903258;
+                       
+                       // aapt resource value: 0x7F0300DB
+                       public const int foregroundInsidePadding = 2130903259;
+                       
+                       // aapt resource value: 0x7F0300DC
+                       public const int gapBetweenBars = 2130903260;
+                       
+                       // aapt resource value: 0x7F0300DD
+                       public const int goIcon = 2130903261;
+                       
+                       // aapt resource value: 0x7F0300DE
+                       public const int headerLayout = 2130903262;
+                       
+                       // aapt resource value: 0x7F0300DF
+                       public const int height = 2130903263;
+                       
+                       // aapt resource value: 0x7F0300E0
+                       public const int helperText = 2130903264;
+                       
+                       // aapt resource value: 0x7F0300E1
+                       public const int helperTextEnabled = 2130903265;
+                       
+                       // aapt resource value: 0x7F0300E2
+                       public const int helperTextTextAppearance = 2130903266;
+                       
+                       // aapt resource value: 0x7F0300E3
+                       public const int hideMotionSpec = 2130903267;
+                       
+                       // aapt resource value: 0x7F0300E4
+                       public const int hideOnContentScroll = 2130903268;
+                       
+                       // aapt resource value: 0x7F0300E5
+                       public const int hideOnScroll = 2130903269;
+                       
+                       // aapt resource value: 0x7F0300E6
+                       public const int hintAnimationEnabled = 2130903270;
+                       
+                       // aapt resource value: 0x7F0300E7
+                       public const int hintEnabled = 2130903271;
+                       
+                       // aapt resource value: 0x7F0300E8
+                       public const int hintTextAppearance = 2130903272;
+                       
+                       // aapt resource value: 0x7F0300E9
+                       public const int homeAsUpIndicator = 2130903273;
+                       
+                       // aapt resource value: 0x7F0300EA
+                       public const int homeLayout = 2130903274;
+                       
+                       // aapt resource value: 0x7F0300EB
+                       public const int hoveredFocusedTranslationZ = 2130903275;
+                       
+                       // aapt resource value: 0x7F0300EC
+                       public const int icon = 2130903276;
+                       
+                       // aapt resource value: 0x7F0300ED
+                       public const int iconEndPadding = 2130903277;
+                       
+                       // aapt resource value: 0x7F0300EE
+                       public const int iconGravity = 2130903278;
+                       
+                       // aapt resource value: 0x7F0300F4
+                       public const int iconifiedByDefault = 2130903284;
+                       
+                       // aapt resource value: 0x7F0300EF
+                       public const int iconPadding = 2130903279;
+                       
+                       // aapt resource value: 0x7F0300F0
+                       public const int iconSize = 2130903280;
+                       
+                       // aapt resource value: 0x7F0300F1
+                       public const int iconStartPadding = 2130903281;
+                       
+                       // aapt resource value: 0x7F0300F2
+                       public const int iconTint = 2130903282;
+                       
+                       // aapt resource value: 0x7F0300F3
+                       public const int iconTintMode = 2130903283;
+                       
+                       // aapt resource value: 0x7F0300F5
+                       public const int imageButtonStyle = 2130903285;
+                       
+                       // aapt resource value: 0x7F0300F6
+                       public const int indeterminateProgressStyle = 2130903286;
+                       
+                       // aapt resource value: 0x7F0300F7
+                       public const int initialActivityCount = 2130903287;
+                       
+                       // aapt resource value: 0x7F0300F8
+                       public const int insetForeground = 2130903288;
+                       
+                       // aapt resource value: 0x7F0300F9
+                       public const int isLightTheme = 2130903289;
+                       
+                       // aapt resource value: 0x7F0300FA
+                       public const int itemBackground = 2130903290;
+                       
+                       // aapt resource value: 0x7F0300FB
+                       public const int itemHorizontalPadding = 2130903291;
+                       
+                       // aapt resource value: 0x7F0300FC
+                       public const int itemHorizontalTranslationEnabled = 2130903292;
+                       
+                       // aapt resource value: 0x7F0300FD
+                       public const int itemIconPadding = 2130903293;
+                       
+                       // aapt resource value: 0x7F0300FE
+                       public const int itemIconSize = 2130903294;
+                       
+                       // aapt resource value: 0x7F0300FF
+                       public const int itemIconTint = 2130903295;
+                       
+                       // aapt resource value: 0x7F030100
+                       public const int itemPadding = 2130903296;
+                       
+                       // aapt resource value: 0x7F030101
+                       public const int itemSpacing = 2130903297;
+                       
+                       // aapt resource value: 0x7F030102
+                       public const int itemTextAppearance = 2130903298;
+                       
+                       // aapt resource value: 0x7F030103
+                       public const int itemTextAppearanceActive = 2130903299;
+                       
+                       // aapt resource value: 0x7F030104
+                       public const int itemTextAppearanceInactive = 2130903300;
+                       
+                       // aapt resource value: 0x7F030105
+                       public const int itemTextColor = 2130903301;
+                       
+                       // aapt resource value: 0x7F030106
+                       public const int keylines = 2130903302;
+                       
+                       // aapt resource value: 0x7F030107
+                       public const int labelVisibilityMode = 2130903303;
+                       
+                       // aapt resource value: 0x7F030108
+                       public const int lastBaselineToBottomHeight = 2130903304;
+                       
+                       // aapt resource value: 0x7F030109
+                       public const int layout = 2130903305;
+                       
+                       // aapt resource value: 0x7F03010A
+                       public const int layoutManager = 2130903306;
+                       
+                       // aapt resource value: 0x7F03010B
+                       public const int layout_anchor = 2130903307;
+                       
+                       // aapt resource value: 0x7F03010C
+                       public const int layout_anchorGravity = 2130903308;
+                       
+                       // aapt resource value: 0x7F03010D
+                       public const int layout_behavior = 2130903309;
+                       
+                       // aapt resource value: 0x7F03010E
+                       public const int layout_collapseMode = 2130903310;
+                       
+                       // aapt resource value: 0x7F03010F
+                       public const int layout_collapseParallaxMultiplier = 2130903311;
+                       
+                       // aapt resource value: 0x7F030110
+                       public const int layout_dodgeInsetEdges = 2130903312;
+                       
+                       // aapt resource value: 0x7F030111
+                       public const int layout_insetEdge = 2130903313;
+                       
+                       // aapt resource value: 0x7F030112
+                       public const int layout_keyline = 2130903314;
+                       
+                       // aapt resource value: 0x7F030113
+                       public const int layout_scrollFlags = 2130903315;
+                       
+                       // aapt resource value: 0x7F030114
+                       public const int layout_scrollInterpolator = 2130903316;
+                       
+                       // aapt resource value: 0x7F030115
+                       public const int liftOnScroll = 2130903317;
+                       
+                       // aapt resource value: 0x7F030116
+                       public const int lineHeight = 2130903318;
+                       
+                       // aapt resource value: 0x7F030117
+                       public const int lineSpacing = 2130903319;
+                       
+                       // aapt resource value: 0x7F030118
+                       public const int listChoiceBackgroundIndicator = 2130903320;
+                       
+                       // aapt resource value: 0x7F030119
+                       public const int listDividerAlertDialog = 2130903321;
+                       
+                       // aapt resource value: 0x7F03011A
+                       public const int listItemLayout = 2130903322;
+                       
+                       // aapt resource value: 0x7F03011B
+                       public const int listLayout = 2130903323;
+                       
+                       // aapt resource value: 0x7F03011C
+                       public const int listMenuViewStyle = 2130903324;
+                       
+                       // aapt resource value: 0x7F03011D
+                       public const int listPopupWindowStyle = 2130903325;
+                       
+                       // aapt resource value: 0x7F03011E
+                       public const int listPreferredItemHeight = 2130903326;
+                       
+                       // aapt resource value: 0x7F03011F
+                       public const int listPreferredItemHeightLarge = 2130903327;
+                       
+                       // aapt resource value: 0x7F030120
+                       public const int listPreferredItemHeightSmall = 2130903328;
+                       
+                       // aapt resource value: 0x7F030121
+                       public const int listPreferredItemPaddingLeft = 2130903329;
+                       
+                       // aapt resource value: 0x7F030122
+                       public const int listPreferredItemPaddingRight = 2130903330;
+                       
+                       // aapt resource value: 0x7F030123
+                       public const int logo = 2130903331;
+                       
+                       // aapt resource value: 0x7F030124
+                       public const int logoDescription = 2130903332;
+                       
+                       // aapt resource value: 0x7F030125
+                       public const int materialButtonStyle = 2130903333;
+                       
+                       // aapt resource value: 0x7F030126
+                       public const int materialCardViewStyle = 2130903334;
+                       
+                       // aapt resource value: 0x7F030127
+                       public const int maxActionInlineWidth = 2130903335;
+                       
+                       // aapt resource value: 0x7F030128
+                       public const int maxButtonHeight = 2130903336;
+                       
+                       // aapt resource value: 0x7F030129
+                       public const int maxImageSize = 2130903337;
+                       
+                       // aapt resource value: 0x7F03012A
+                       public const int measureWithLargestChild = 2130903338;
+                       
+                       // aapt resource value: 0x7F03012B
+                       public const int menu = 2130903339;
+                       
+                       // aapt resource value: 0x7F03012C
+                       public const int multiChoiceItemLayout = 2130903340;
+                       
+                       // aapt resource value: 0x7F03012D
+                       public const int navigationContentDescription = 2130903341;
+                       
+                       // aapt resource value: 0x7F03012E
+                       public const int navigationIcon = 2130903342;
+                       
+                       // aapt resource value: 0x7F03012F
+                       public const int navigationMode = 2130903343;
+                       
+                       // aapt resource value: 0x7F030130
+                       public const int navigationViewStyle = 2130903344;
+                       
+                       // aapt resource value: 0x7F030131
+                       public const int numericModifiers = 2130903345;
+                       
+                       // aapt resource value: 0x7F030132
+                       public const int overlapAnchor = 2130903346;
+                       
+                       // aapt resource value: 0x7F030133
+                       public const int paddingBottomNoButtons = 2130903347;
+                       
+                       // aapt resource value: 0x7F030134
+                       public const int paddingEnd = 2130903348;
+                       
+                       // aapt resource value: 0x7F030135
+                       public const int paddingStart = 2130903349;
+                       
+                       // aapt resource value: 0x7F030136
+                       public const int paddingTopNoTitle = 2130903350;
+                       
+                       // aapt resource value: 0x7F030137
+                       public const int panelBackground = 2130903351;
+                       
+                       // aapt resource value: 0x7F030138
+                       public const int panelMenuListTheme = 2130903352;
+                       
+                       // aapt resource value: 0x7F030139
+                       public const int panelMenuListWidth = 2130903353;
+                       
+                       // aapt resource value: 0x7F03013A
+                       public const int passwordToggleContentDescription = 2130903354;
+                       
+                       // aapt resource value: 0x7F03013B
+                       public const int passwordToggleDrawable = 2130903355;
+                       
+                       // aapt resource value: 0x7F03013C
+                       public const int passwordToggleEnabled = 2130903356;
+                       
+                       // aapt resource value: 0x7F03013D
+                       public const int passwordToggleTint = 2130903357;
+                       
+                       // aapt resource value: 0x7F03013E
+                       public const int passwordToggleTintMode = 2130903358;
+                       
+                       // aapt resource value: 0x7F03013F
+                       public const int popupMenuStyle = 2130903359;
+                       
+                       // aapt resource value: 0x7F030140
+                       public const int popupTheme = 2130903360;
+                       
+                       // aapt resource value: 0x7F030141
+                       public const int popupWindowStyle = 2130903361;
+                       
+                       // aapt resource value: 0x7F030142
+                       public const int preserveIconSpacing = 2130903362;
+                       
+                       // aapt resource value: 0x7F030143
+                       public const int pressedTranslationZ = 2130903363;
+                       
+                       // aapt resource value: 0x7F030144
+                       public const int progressBarPadding = 2130903364;
+                       
+                       // aapt resource value: 0x7F030145
+                       public const int progressBarStyle = 2130903365;
+                       
+                       // aapt resource value: 0x7F030146
+                       public const int queryBackground = 2130903366;
+                       
+                       // aapt resource value: 0x7F030147
+                       public const int queryHint = 2130903367;
+                       
+                       // aapt resource value: 0x7F030148
+                       public const int radioButtonStyle = 2130903368;
+                       
+                       // aapt resource value: 0x7F030149
+                       public const int ratingBarStyle = 2130903369;
+                       
+                       // aapt resource value: 0x7F03014A
+                       public const int ratingBarStyleIndicator = 2130903370;
+                       
+                       // aapt resource value: 0x7F03014B
+                       public const int ratingBarStyleSmall = 2130903371;
+                       
+                       // aapt resource value: 0x7F03014C
+                       public const int reverseLayout = 2130903372;
+                       
+                       // aapt resource value: 0x7F03014D
+                       public const int rippleColor = 2130903373;
+                       
+                       // aapt resource value: 0x7F03014E
+                       public const int scrimAnimationDuration = 2130903374;
+                       
+                       // aapt resource value: 0x7F03014F
+                       public const int scrimBackground = 2130903375;
+                       
+                       // aapt resource value: 0x7F030150
+                       public const int scrimVisibleHeightTrigger = 2130903376;
+                       
+                       // aapt resource value: 0x7F030151
+                       public const int searchHintIcon = 2130903377;
+                       
+                       // aapt resource value: 0x7F030152
+                       public const int searchIcon = 2130903378;
+                       
+                       // aapt resource value: 0x7F030153
+                       public const int searchViewStyle = 2130903379;
+                       
+                       // aapt resource value: 0x7F030154
+                       public const int seekBarStyle = 2130903380;
+                       
+                       // aapt resource value: 0x7F030155
+                       public const int selectableItemBackground = 2130903381;
+                       
+                       // aapt resource value: 0x7F030156
+                       public const int selectableItemBackgroundBorderless = 2130903382;
+                       
+                       // aapt resource value: 0x7F030157
+                       public const int showAsAction = 2130903383;
+                       
+                       // aapt resource value: 0x7F030158
+                       public const int showDividers = 2130903384;
+                       
+                       // aapt resource value: 0x7F030159
+                       public const int showMotionSpec = 2130903385;
+                       
+                       // aapt resource value: 0x7F03015A
+                       public const int showText = 2130903386;
+                       
+                       // aapt resource value: 0x7F03015B
+                       public const int showTitle = 2130903387;
+                       
+                       // aapt resource value: 0x7F03015C
+                       public const int singleChoiceItemLayout = 2130903388;
+                       
+                       // aapt resource value: 0x7F03015D
+                       public const int singleLine = 2130903389;
+                       
+                       // aapt resource value: 0x7F03015E
+                       public const int singleSelection = 2130903390;
+                       
+                       // aapt resource value: 0x7F03015F
+                       public const int snackbarButtonStyle = 2130903391;
+                       
+                       // aapt resource value: 0x7F030160
+                       public const int snackbarStyle = 2130903392;
+                       
+                       // aapt resource value: 0x7F030161
+                       public const int spanCount = 2130903393;
+                       
+                       // aapt resource value: 0x7F030162
+                       public const int spinBars = 2130903394;
+                       
+                       // aapt resource value: 0x7F030163
+                       public const int spinnerDropDownItemStyle = 2130903395;
+                       
+                       // aapt resource value: 0x7F030164
+                       public const int spinnerStyle = 2130903396;
+                       
+                       // aapt resource value: 0x7F030165
+                       public const int splitTrack = 2130903397;
+                       
+                       // aapt resource value: 0x7F030166
+                       public const int srcCompat = 2130903398;
+                       
+                       // aapt resource value: 0x7F030167
+                       public const int stackFromEnd = 2130903399;
+                       
+                       // aapt resource value: 0x7F030168
+                       public const int state_above_anchor = 2130903400;
+                       
+                       // aapt resource value: 0x7F030169
+                       public const int state_collapsed = 2130903401;
+                       
+                       // aapt resource value: 0x7F03016A
+                       public const int state_collapsible = 2130903402;
+                       
+                       // aapt resource value: 0x7F03016B
+                       public const int state_liftable = 2130903403;
+                       
+                       // aapt resource value: 0x7F03016C
+                       public const int state_lifted = 2130903404;
+                       
+                       // aapt resource value: 0x7F03016D
+                       public const int statusBarBackground = 2130903405;
+                       
+                       // aapt resource value: 0x7F03016E
+                       public const int statusBarScrim = 2130903406;
+                       
+                       // aapt resource value: 0x7F03016F
+                       public const int strokeColor = 2130903407;
+                       
+                       // aapt resource value: 0x7F030170
+                       public const int strokeWidth = 2130903408;
+                       
+                       // aapt resource value: 0x7F030171
+                       public const int subMenuArrow = 2130903409;
+                       
+                       // aapt resource value: 0x7F030172
+                       public const int submitBackground = 2130903410;
+                       
+                       // aapt resource value: 0x7F030173
+                       public const int subtitle = 2130903411;
+                       
+                       // aapt resource value: 0x7F030174
+                       public const int subtitleTextAppearance = 2130903412;
+                       
+                       // aapt resource value: 0x7F030175
+                       public const int subtitleTextColor = 2130903413;
+                       
+                       // aapt resource value: 0x7F030176
+                       public const int subtitleTextStyle = 2130903414;
+                       
+                       // aapt resource value: 0x7F030177
+                       public const int suggestionRowLayout = 2130903415;
+                       
+                       // aapt resource value: 0x7F030178
+                       public const int switchMinWidth = 2130903416;
+                       
+                       // aapt resource value: 0x7F030179
+                       public const int switchPadding = 2130903417;
+                       
+                       // aapt resource value: 0x7F03017A
+                       public const int switchStyle = 2130903418;
+                       
+                       // aapt resource value: 0x7F03017B
+                       public const int switchTextAppearance = 2130903419;
+                       
+                       // aapt resource value: 0x7F03017C
+                       public const int tabBackground = 2130903420;
+                       
+                       // aapt resource value: 0x7F03017D
+                       public const int tabContentStart = 2130903421;
+                       
+                       // aapt resource value: 0x7F03017E
+                       public const int tabGravity = 2130903422;
+                       
+                       // aapt resource value: 0x7F03017F
+                       public const int tabIconTint = 2130903423;
+                       
+                       // aapt resource value: 0x7F030180
+                       public const int tabIconTintMode = 2130903424;
+                       
+                       // aapt resource value: 0x7F030181
+                       public const int tabIndicator = 2130903425;
+                       
+                       // aapt resource value: 0x7F030182
+                       public const int tabIndicatorAnimationDuration = 2130903426;
+                       
+                       // aapt resource value: 0x7F030183
+                       public const int tabIndicatorColor = 2130903427;
+                       
+                       // aapt resource value: 0x7F030184
+                       public const int tabIndicatorFullWidth = 2130903428;
+                       
+                       // aapt resource value: 0x7F030185
+                       public const int tabIndicatorGravity = 2130903429;
+                       
+                       // aapt resource value: 0x7F030186
+                       public const int tabIndicatorHeight = 2130903430;
+                       
+                       // aapt resource value: 0x7F030187
+                       public const int tabInlineLabel = 2130903431;
+                       
+                       // aapt resource value: 0x7F030188
+                       public const int tabMaxWidth = 2130903432;
+                       
+                       // aapt resource value: 0x7F030189
+                       public const int tabMinWidth = 2130903433;
+                       
+                       // aapt resource value: 0x7F03018A
+                       public const int tabMode = 2130903434;
+                       
+                       // aapt resource value: 0x7F03018B
+                       public const int tabPadding = 2130903435;
+                       
+                       // aapt resource value: 0x7F03018C
+                       public const int tabPaddingBottom = 2130903436;
+                       
+                       // aapt resource value: 0x7F03018D
+                       public const int tabPaddingEnd = 2130903437;
+                       
+                       // aapt resource value: 0x7F03018E
+                       public const int tabPaddingStart = 2130903438;
+                       
+                       // aapt resource value: 0x7F03018F
+                       public const int tabPaddingTop = 2130903439;
+                       
+                       // aapt resource value: 0x7F030190
+                       public const int tabRippleColor = 2130903440;
+                       
+                       // aapt resource value: 0x7F030191
+                       public const int tabSelectedTextColor = 2130903441;
+                       
+                       // aapt resource value: 0x7F030192
+                       public const int tabStyle = 2130903442;
+                       
+                       // aapt resource value: 0x7F030193
+                       public const int tabTextAppearance = 2130903443;
+                       
+                       // aapt resource value: 0x7F030194
+                       public const int tabTextColor = 2130903444;
+                       
+                       // aapt resource value: 0x7F030195
+                       public const int tabUnboundedRipple = 2130903445;
+                       
+                       // aapt resource value: 0x7F030196
+                       public const int textAllCaps = 2130903446;
+                       
+                       // aapt resource value: 0x7F030197
+                       public const int textAppearanceBody1 = 2130903447;
+                       
+                       // aapt resource value: 0x7F030198
+                       public const int textAppearanceBody2 = 2130903448;
+                       
+                       // aapt resource value: 0x7F030199
+                       public const int textAppearanceButton = 2130903449;
+                       
+                       // aapt resource value: 0x7F03019A
+                       public const int textAppearanceCaption = 2130903450;
+                       
+                       // aapt resource value: 0x7F03019B
+                       public const int textAppearanceHeadline1 = 2130903451;
+                       
+                       // aapt resource value: 0x7F03019C
+                       public const int textAppearanceHeadline2 = 2130903452;
+                       
+                       // aapt resource value: 0x7F03019D
+                       public const int textAppearanceHeadline3 = 2130903453;
+                       
+                       // aapt resource value: 0x7F03019E
+                       public const int textAppearanceHeadline4 = 2130903454;
+                       
+                       // aapt resource value: 0x7F03019F
+                       public const int textAppearanceHeadline5 = 2130903455;
+                       
+                       // aapt resource value: 0x7F0301A0
+                       public const int textAppearanceHeadline6 = 2130903456;
+                       
+                       // aapt resource value: 0x7F0301A1
+                       public const int textAppearanceLargePopupMenu = 2130903457;
+                       
+                       // aapt resource value: 0x7F0301A2
+                       public const int textAppearanceListItem = 2130903458;
+                       
+                       // aapt resource value: 0x7F0301A3
+                       public const int textAppearanceListItemSecondary = 2130903459;
+                       
+                       // aapt resource value: 0x7F0301A4
+                       public const int textAppearanceListItemSmall = 2130903460;
+                       
+                       // aapt resource value: 0x7F0301A5
+                       public const int textAppearanceOverline = 2130903461;
+                       
+                       // aapt resource value: 0x7F0301A6
+                       public const int textAppearancePopupMenuHeader = 2130903462;
+                       
+                       // aapt resource value: 0x7F0301A7
+                       public const int textAppearanceSearchResultSubtitle = 2130903463;
+                       
+                       // aapt resource value: 0x7F0301A8
+                       public const int textAppearanceSearchResultTitle = 2130903464;
+                       
+                       // aapt resource value: 0x7F0301A9
+                       public const int textAppearanceSmallPopupMenu = 2130903465;
+                       
+                       // aapt resource value: 0x7F0301AA
+                       public const int textAppearanceSubtitle1 = 2130903466;
+                       
+                       // aapt resource value: 0x7F0301AB
+                       public const int textAppearanceSubtitle2 = 2130903467;
+                       
+                       // aapt resource value: 0x7F0301AC
+                       public const int textColorAlertDialogListItem = 2130903468;
+                       
+                       // aapt resource value: 0x7F0301AD
+                       public const int textColorSearchUrl = 2130903469;
+                       
+                       // aapt resource value: 0x7F0301AE
+                       public const int textEndPadding = 2130903470;
+                       
+                       // aapt resource value: 0x7F0301AF
+                       public const int textInputStyle = 2130903471;
+                       
+                       // aapt resource value: 0x7F0301B0
+                       public const int textStartPadding = 2130903472;
+                       
+                       // aapt resource value: 0x7F0301B1
+                       public const int theme = 2130903473;
+                       
+                       // aapt resource value: 0x7F0301B2
+                       public const int thickness = 2130903474;
+                       
+                       // aapt resource value: 0x7F0301B3
+                       public const int thumbTextPadding = 2130903475;
+                       
+                       // aapt resource value: 0x7F0301B4
+                       public const int thumbTint = 2130903476;
+                       
+                       // aapt resource value: 0x7F0301B5
+                       public const int thumbTintMode = 2130903477;
+                       
+                       // aapt resource value: 0x7F0301B6
+                       public const int tickMark = 2130903478;
+                       
+                       // aapt resource value: 0x7F0301B7
+                       public const int tickMarkTint = 2130903479;
+                       
+                       // aapt resource value: 0x7F0301B8
+                       public const int tickMarkTintMode = 2130903480;
+                       
+                       // aapt resource value: 0x7F0301B9
+                       public const int tint = 2130903481;
+                       
+                       // aapt resource value: 0x7F0301BA
+                       public const int tintMode = 2130903482;
+                       
+                       // aapt resource value: 0x7F0301BB
+                       public const int title = 2130903483;
+                       
+                       // aapt resource value: 0x7F0301BC
+                       public const int titleEnabled = 2130903484;
+                       
+                       // aapt resource value: 0x7F0301BD
+                       public const int titleMargin = 2130903485;
+                       
+                       // aapt resource value: 0x7F0301BE
+                       public const int titleMarginBottom = 2130903486;
+                       
+                       // aapt resource value: 0x7F0301BF
+                       public const int titleMarginEnd = 2130903487;
+                       
+                       // aapt resource value: 0x7F0301C2
+                       public const int titleMargins = 2130903490;
+                       
+                       // aapt resource value: 0x7F0301C0
+                       public const int titleMarginStart = 2130903488;
+                       
+                       // aapt resource value: 0x7F0301C1
+                       public const int titleMarginTop = 2130903489;
+                       
+                       // aapt resource value: 0x7F0301C3
+                       public const int titleTextAppearance = 2130903491;
+                       
+                       // aapt resource value: 0x7F0301C4
+                       public const int titleTextColor = 2130903492;
+                       
+                       // aapt resource value: 0x7F0301C5
+                       public const int titleTextStyle = 2130903493;
+                       
+                       // aapt resource value: 0x7F0301C6
+                       public const int toolbarId = 2130903494;
+                       
+                       // aapt resource value: 0x7F0301C7
+                       public const int toolbarNavigationButtonStyle = 2130903495;
+                       
+                       // aapt resource value: 0x7F0301C8
+                       public const int toolbarStyle = 2130903496;
+                       
+                       // aapt resource value: 0x7F0301C9
+                       public const int tooltipForegroundColor = 2130903497;
+                       
+                       // aapt resource value: 0x7F0301CA
+                       public const int tooltipFrameBackground = 2130903498;
+                       
+                       // aapt resource value: 0x7F0301CB
+                       public const int tooltipText = 2130903499;
+                       
+                       // aapt resource value: 0x7F0301CC
+                       public const int track = 2130903500;
+                       
+                       // aapt resource value: 0x7F0301CD
+                       public const int trackTint = 2130903501;
+                       
+                       // aapt resource value: 0x7F0301CE
+                       public const int trackTintMode = 2130903502;
+                       
+                       // aapt resource value: 0x7F0301CF
+                       public const int ttcIndex = 2130903503;
+                       
+                       // aapt resource value: 0x7F0301D0
+                       public const int useCompatPadding = 2130903504;
+                       
+                       // aapt resource value: 0x7F0301D1
+                       public const int viewInflaterClass = 2130903505;
+                       
+                       // aapt resource value: 0x7F0301D2
+                       public const int voiceIcon = 2130903506;
+                       
+                       // aapt resource value: 0x7F0301D3
+                       public const int windowActionBar = 2130903507;
+                       
+                       // aapt resource value: 0x7F0301D4
+                       public const int windowActionBarOverlay = 2130903508;
+                       
+                       // aapt resource value: 0x7F0301D5
+                       public const int windowActionModeOverlay = 2130903509;
+                       
+                       // aapt resource value: 0x7F0301D6
+                       public const int windowFixedHeightMajor = 2130903510;
+                       
+                       // aapt resource value: 0x7F0301D7
+                       public const int windowFixedHeightMinor = 2130903511;
+                       
+                       // aapt resource value: 0x7F0301D8
+                       public const int windowFixedWidthMajor = 2130903512;
+                       
+                       // aapt resource value: 0x7F0301D9
+                       public const int windowFixedWidthMinor = 2130903513;
+                       
+                       // aapt resource value: 0x7F0301DA
+                       public const int windowMinWidthMajor = 2130903514;
+                       
+                       // aapt resource value: 0x7F0301DB
+                       public const int windowMinWidthMinor = 2130903515;
+                       
+                       // aapt resource value: 0x7F0301DC
+                       public const int windowNoTitle = 2130903516;
+                       
+                       static Attribute()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Attribute()
+                       {
+                       }
+               }
+               
+               public partial class Boolean
+               {
+                       
+                       // aapt resource value: 0x7F040000
+                       public const int abc_action_bar_embed_tabs = 2130968576;
+                       
+                       // aapt resource value: 0x7F040001
+                       public const int abc_allow_stacked_button_bar = 2130968577;
+                       
+                       // aapt resource value: 0x7F040002
+                       public const int abc_config_actionMenuItemAllCaps = 2130968578;
+                       
+                       // aapt resource value: 0x7F040003
+                       public const int mtrl_btn_textappearance_all_caps = 2130968579;
+                       
+                       static Boolean()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Boolean()
+                       {
+                       }
+               }
+               
+               public partial class Color
+               {
+                       
+                       // aapt resource value: 0x7F050000
+                       public const int abc_background_cache_hint_selector_material_dark = 2131034112;
+                       
+                       // aapt resource value: 0x7F050001
+                       public const int abc_background_cache_hint_selector_material_light = 2131034113;
+                       
+                       // aapt resource value: 0x7F050002
+                       public const int abc_btn_colored_borderless_text_material = 2131034114;
+                       
+                       // aapt resource value: 0x7F050003
+                       public const int abc_btn_colored_text_material = 2131034115;
+                       
+                       // aapt resource value: 0x7F050004
+                       public const int abc_color_highlight_material = 2131034116;
+                       
+                       // aapt resource value: 0x7F050005
+                       public const int abc_hint_foreground_material_dark = 2131034117;
+                       
+                       // aapt resource value: 0x7F050006
+                       public const int abc_hint_foreground_material_light = 2131034118;
+                       
+                       // aapt resource value: 0x7F050007
+                       public const int abc_input_method_navigation_guard = 2131034119;
+                       
+                       // aapt resource value: 0x7F050008
+                       public const int abc_primary_text_disable_only_material_dark = 2131034120;
+                       
+                       // aapt resource value: 0x7F050009
+                       public const int abc_primary_text_disable_only_material_light = 2131034121;
+                       
+                       // aapt resource value: 0x7F05000A
+                       public const int abc_primary_text_material_dark = 2131034122;
+                       
+                       // aapt resource value: 0x7F05000B
+                       public const int abc_primary_text_material_light = 2131034123;
+                       
+                       // aapt resource value: 0x7F05000C
+                       public const int abc_search_url_text = 2131034124;
+                       
+                       // aapt resource value: 0x7F05000D
+                       public const int abc_search_url_text_normal = 2131034125;
+                       
+                       // aapt resource value: 0x7F05000E
+                       public const int abc_search_url_text_pressed = 2131034126;
+                       
+                       // aapt resource value: 0x7F05000F
+                       public const int abc_search_url_text_selected = 2131034127;
+                       
+                       // aapt resource value: 0x7F050010
+                       public const int abc_secondary_text_material_dark = 2131034128;
+                       
+                       // aapt resource value: 0x7F050011
+                       public const int abc_secondary_text_material_light = 2131034129;
+                       
+                       // aapt resource value: 0x7F050012
+                       public const int abc_tint_btn_checkable = 2131034130;
+                       
+                       // aapt resource value: 0x7F050013
+                       public const int abc_tint_default = 2131034131;
+                       
+                       // aapt resource value: 0x7F050014
+                       public const int abc_tint_edittext = 2131034132;
+                       
+                       // aapt resource value: 0x7F050015
+                       public const int abc_tint_seek_thumb = 2131034133;
+                       
+                       // aapt resource value: 0x7F050016
+                       public const int abc_tint_spinner = 2131034134;
+                       
+                       // aapt resource value: 0x7F050017
+                       public const int abc_tint_switch_track = 2131034135;
+                       
+                       // aapt resource value: 0x7F050018
+                       public const int accent_material_dark = 2131034136;
+                       
+                       // aapt resource value: 0x7F050019
+                       public const int accent_material_light = 2131034137;
+                       
+                       // aapt resource value: 0x7F05001A
+                       public const int background_floating_material_dark = 2131034138;
+                       
+                       // aapt resource value: 0x7F05001B
+                       public const int background_floating_material_light = 2131034139;
+                       
+                       // aapt resource value: 0x7F05001C
+                       public const int background_material_dark = 2131034140;
+                       
+                       // aapt resource value: 0x7F05001D
+                       public const int background_material_light = 2131034141;
+                       
+                       // aapt resource value: 0x7F05001E
+                       public const int bright_foreground_disabled_material_dark = 2131034142;
+                       
+                       // aapt resource value: 0x7F05001F
+                       public const int bright_foreground_disabled_material_light = 2131034143;
+                       
+                       // aapt resource value: 0x7F050020
+                       public const int bright_foreground_inverse_material_dark = 2131034144;
+                       
+                       // aapt resource value: 0x7F050021
+                       public const int bright_foreground_inverse_material_light = 2131034145;
+                       
+                       // aapt resource value: 0x7F050022
+                       public const int bright_foreground_material_dark = 2131034146;
+                       
+                       // aapt resource value: 0x7F050023
+                       public const int bright_foreground_material_light = 2131034147;
+                       
+                       // aapt resource value: 0x7F050024
+                       public const int browser_actions_bg_grey = 2131034148;
+                       
+                       // aapt resource value: 0x7F050025
+                       public const int browser_actions_divider_color = 2131034149;
+                       
+                       // aapt resource value: 0x7F050026
+                       public const int browser_actions_text_color = 2131034150;
+                       
+                       // aapt resource value: 0x7F050027
+                       public const int browser_actions_title_color = 2131034151;
+                       
+                       // aapt resource value: 0x7F050028
+                       public const int button_material_dark = 2131034152;
+                       
+                       // aapt resource value: 0x7F050029
+                       public const int button_material_light = 2131034153;
+                       
+                       // aapt resource value: 0x7F05002A
+                       public const int cardview_dark_background = 2131034154;
+                       
+                       // aapt resource value: 0x7F05002B
+                       public const int cardview_light_background = 2131034155;
+                       
+                       // aapt resource value: 0x7F05002C
+                       public const int cardview_shadow_end_color = 2131034156;
+                       
+                       // aapt resource value: 0x7F05002D
+                       public const int cardview_shadow_start_color = 2131034157;
+                       
+                       // aapt resource value: 0x7F05002E
+                       public const int colorAccent = 2131034158;
+                       
+                       // aapt resource value: 0x7F05002F
+                       public const int colorPrimary = 2131034159;
+                       
+                       // aapt resource value: 0x7F050030
+                       public const int colorPrimaryDark = 2131034160;
+                       
+                       // aapt resource value: 0x7F050031
+                       public const int design_bottom_navigation_shadow_color = 2131034161;
+                       
+                       // aapt resource value: 0x7F050032
+                       public const int design_default_color_primary = 2131034162;
+                       
+                       // aapt resource value: 0x7F050033
+                       public const int design_default_color_primary_dark = 2131034163;
+                       
+                       // aapt resource value: 0x7F050034
+                       public const int design_error = 2131034164;
+                       
+                       // aapt resource value: 0x7F050035
+                       public const int design_fab_shadow_end_color = 2131034165;
+                       
+                       // aapt resource value: 0x7F050036
+                       public const int design_fab_shadow_mid_color = 2131034166;
+                       
+                       // aapt resource value: 0x7F050037
+                       public const int design_fab_shadow_start_color = 2131034167;
+                       
+                       // aapt resource value: 0x7F050038
+                       public const int design_fab_stroke_end_inner_color = 2131034168;
+                       
+                       // aapt resource value: 0x7F050039
+                       public const int design_fab_stroke_end_outer_color = 2131034169;
+                       
+                       // aapt resource value: 0x7F05003A
+                       public const int design_fab_stroke_top_inner_color = 2131034170;
+                       
+                       // aapt resource value: 0x7F05003B
+                       public const int design_fab_stroke_top_outer_color = 2131034171;
+                       
+                       // aapt resource value: 0x7F05003C
+                       public const int design_snackbar_background_color = 2131034172;
+                       
+                       // aapt resource value: 0x7F05003D
+                       public const int design_tint_password_toggle = 2131034173;
+                       
+                       // aapt resource value: 0x7F05003E
+                       public const int dim_foreground_disabled_material_dark = 2131034174;
+                       
+                       // aapt resource value: 0x7F05003F
+                       public const int dim_foreground_disabled_material_light = 2131034175;
+                       
+                       // aapt resource value: 0x7F050040
+                       public const int dim_foreground_material_dark = 2131034176;
+                       
+                       // aapt resource value: 0x7F050041
+                       public const int dim_foreground_material_light = 2131034177;
+                       
+                       // aapt resource value: 0x7F050042
+                       public const int error_color_material_dark = 2131034178;
+                       
+                       // aapt resource value: 0x7F050043
+                       public const int error_color_material_light = 2131034179;
+                       
+                       // aapt resource value: 0x7F050044
+                       public const int foreground_material_dark = 2131034180;
+                       
+                       // aapt resource value: 0x7F050045
+                       public const int foreground_material_light = 2131034181;
+                       
+                       // aapt resource value: 0x7F050046
+                       public const int highlighted_text_material_dark = 2131034182;
+                       
+                       // aapt resource value: 0x7F050047
+                       public const int highlighted_text_material_light = 2131034183;
+                       
+                       // aapt resource value: 0x7F050048
+                       public const int launcher_background = 2131034184;
+                       
+                       // aapt resource value: 0x7F050049
+                       public const int material_blue_grey_800 = 2131034185;
+                       
+                       // aapt resource value: 0x7F05004A
+                       public const int material_blue_grey_900 = 2131034186;
+                       
+                       // aapt resource value: 0x7F05004B
+                       public const int material_blue_grey_950 = 2131034187;
+                       
+                       // aapt resource value: 0x7F05004C
+                       public const int material_deep_teal_200 = 2131034188;
+                       
+                       // aapt resource value: 0x7F05004D
+                       public const int material_deep_teal_500 = 2131034189;
+                       
+                       // aapt resource value: 0x7F05004E
+                       public const int material_grey_100 = 2131034190;
+                       
+                       // aapt resource value: 0x7F05004F
+                       public const int material_grey_300 = 2131034191;
+                       
+                       // aapt resource value: 0x7F050050
+                       public const int material_grey_50 = 2131034192;
+                       
+                       // aapt resource value: 0x7F050051
+                       public const int material_grey_600 = 2131034193;
+                       
+                       // aapt resource value: 0x7F050052
+                       public const int material_grey_800 = 2131034194;
+                       
+                       // aapt resource value: 0x7F050053
+                       public const int material_grey_850 = 2131034195;
+                       
+                       // aapt resource value: 0x7F050054
+                       public const int material_grey_900 = 2131034196;
+                       
+                       // aapt resource value: 0x7F050055
+                       public const int mtrl_bottom_nav_colored_item_tint = 2131034197;
+                       
+                       // aapt resource value: 0x7F050056
+                       public const int mtrl_bottom_nav_item_tint = 2131034198;
+                       
+                       // aapt resource value: 0x7F050057
+                       public const int mtrl_btn_bg_color_disabled = 2131034199;
+                       
+                       // aapt resource value: 0x7F050058
+                       public const int mtrl_btn_bg_color_selector = 2131034200;
+                       
+                       // aapt resource value: 0x7F050059
+                       public const int mtrl_btn_ripple_color = 2131034201;
+                       
+                       // aapt resource value: 0x7F05005A
+                       public const int mtrl_btn_stroke_color_selector = 2131034202;
+                       
+                       // aapt resource value: 0x7F05005B
+                       public const int mtrl_btn_text_btn_ripple_color = 2131034203;
+                       
+                       // aapt resource value: 0x7F05005C
+                       public const int mtrl_btn_text_color_disabled = 2131034204;
+                       
+                       // aapt resource value: 0x7F05005D
+                       public const int mtrl_btn_text_color_selector = 2131034205;
+                       
+                       // aapt resource value: 0x7F05005E
+                       public const int mtrl_btn_transparent_bg_color = 2131034206;
+                       
+                       // aapt resource value: 0x7F05005F
+                       public const int mtrl_chip_background_color = 2131034207;
+                       
+                       // aapt resource value: 0x7F050060
+                       public const int mtrl_chip_close_icon_tint = 2131034208;
+                       
+                       // aapt resource value: 0x7F050061
+                       public const int mtrl_chip_ripple_color = 2131034209;
+                       
+                       // aapt resource value: 0x7F050062
+                       public const int mtrl_chip_text_color = 2131034210;
+                       
+                       // aapt resource value: 0x7F050063
+                       public const int mtrl_fab_ripple_color = 2131034211;
+                       
+                       // aapt resource value: 0x7F050064
+                       public const int mtrl_scrim_color = 2131034212;
+                       
+                       // aapt resource value: 0x7F050065
+                       public const int mtrl_tabs_colored_ripple_color = 2131034213;
+                       
+                       // aapt resource value: 0x7F050066
+                       public const int mtrl_tabs_icon_color_selector = 2131034214;
+                       
+                       // aapt resource value: 0x7F050067
+                       public const int mtrl_tabs_icon_color_selector_colored = 2131034215;
+                       
+                       // aapt resource value: 0x7F050068
+                       public const int mtrl_tabs_legacy_text_color_selector = 2131034216;
+                       
+                       // aapt resource value: 0x7F050069
+                       public const int mtrl_tabs_ripple_color = 2131034217;
+                       
+                       // aapt resource value: 0x7F05006B
+                       public const int mtrl_textinput_default_box_stroke_color = 2131034219;
+                       
+                       // aapt resource value: 0x7F05006C
+                       public const int mtrl_textinput_disabled_color = 2131034220;
+                       
+                       // aapt resource value: 0x7F05006D
+                       public const int mtrl_textinput_filled_box_default_background_color = 2131034221;
+                       
+                       // aapt resource value: 0x7F05006E
+                       public const int mtrl_textinput_hovered_box_stroke_color = 2131034222;
+                       
+                       // aapt resource value: 0x7F05006A
+                       public const int mtrl_text_btn_text_color_selector = 2131034218;
+                       
+                       // aapt resource value: 0x7F05006F
+                       public const int notification_action_color_filter = 2131034223;
+                       
+                       // aapt resource value: 0x7F050070
+                       public const int notification_icon_bg_color = 2131034224;
+                       
+                       // aapt resource value: 0x7F050071
+                       public const int notification_material_background_media_default_color = 2131034225;
+                       
+                       // aapt resource value: 0x7F050072
+                       public const int primary_dark_material_dark = 2131034226;
+                       
+                       // aapt resource value: 0x7F050073
+                       public const int primary_dark_material_light = 2131034227;
+                       
+                       // aapt resource value: 0x7F050074
+                       public const int primary_material_dark = 2131034228;
+                       
+                       // aapt resource value: 0x7F050075
+                       public const int primary_material_light = 2131034229;
+                       
+                       // aapt resource value: 0x7F050076
+                       public const int primary_text_default_material_dark = 2131034230;
+                       
+                       // aapt resource value: 0x7F050077
+                       public const int primary_text_default_material_light = 2131034231;
+                       
+                       // aapt resource value: 0x7F050078
+                       public const int primary_text_disabled_material_dark = 2131034232;
+                       
+                       // aapt resource value: 0x7F050079
+                       public const int primary_text_disabled_material_light = 2131034233;
+                       
+                       // aapt resource value: 0x7F05007A
+                       public const int ripple_material_dark = 2131034234;
+                       
+                       // aapt resource value: 0x7F05007B
+                       public const int ripple_material_light = 2131034235;
+                       
+                       // aapt resource value: 0x7F05007C
+                       public const int secondary_text_default_material_dark = 2131034236;
+                       
+                       // aapt resource value: 0x7F05007D
+                       public const int secondary_text_default_material_light = 2131034237;
+                       
+                       // aapt resource value: 0x7F05007E
+                       public const int secondary_text_disabled_material_dark = 2131034238;
+                       
+                       // aapt resource value: 0x7F05007F
+                       public const int secondary_text_disabled_material_light = 2131034239;
+                       
+                       // aapt resource value: 0x7F050080
+                       public const int switch_thumb_disabled_material_dark = 2131034240;
+                       
+                       // aapt resource value: 0x7F050081
+                       public const int switch_thumb_disabled_material_light = 2131034241;
+                       
+                       // aapt resource value: 0x7F050082
+                       public const int switch_thumb_material_dark = 2131034242;
+                       
+                       // aapt resource value: 0x7F050083
+                       public const int switch_thumb_material_light = 2131034243;
+                       
+                       // aapt resource value: 0x7F050084
+                       public const int switch_thumb_normal_material_dark = 2131034244;
+                       
+                       // aapt resource value: 0x7F050085
+                       public const int switch_thumb_normal_material_light = 2131034245;
+                       
+                       // aapt resource value: 0x7F050086
+                       public const int tooltip_background_dark = 2131034246;
+                       
+                       // aapt resource value: 0x7F050087
+                       public const int tooltip_background_light = 2131034247;
+                       
+                       static Color()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Color()
+                       {
+                       }
+               }
+               
+               public partial class Dimension
+               {
+                       
+                       // aapt resource value: 0x7F060000
+                       public const int abc_action_bar_content_inset_material = 2131099648;
+                       
+                       // aapt resource value: 0x7F060001
+                       public const int abc_action_bar_content_inset_with_nav = 2131099649;
+                       
+                       // aapt resource value: 0x7F060002
+                       public const int abc_action_bar_default_height_material = 2131099650;
+                       
+                       // aapt resource value: 0x7F060003
+                       public const int abc_action_bar_default_padding_end_material = 2131099651;
+                       
+                       // aapt resource value: 0x7F060004
+                       public const int abc_action_bar_default_padding_start_material = 2131099652;
+                       
+                       // aapt resource value: 0x7F060005
+                       public const int abc_action_bar_elevation_material = 2131099653;
+                       
+                       // aapt resource value: 0x7F060006
+                       public const int abc_action_bar_icon_vertical_padding_material = 2131099654;
+                       
+                       // aapt resource value: 0x7F060007
+                       public const int abc_action_bar_overflow_padding_end_material = 2131099655;
+                       
+                       // aapt resource value: 0x7F060008
+                       public const int abc_action_bar_overflow_padding_start_material = 2131099656;
+                       
+                       // aapt resource value: 0x7F060009
+                       public const int abc_action_bar_stacked_max_height = 2131099657;
+                       
+                       // aapt resource value: 0x7F06000A
+                       public const int abc_action_bar_stacked_tab_max_width = 2131099658;
+                       
+                       // aapt resource value: 0x7F06000B
+                       public const int abc_action_bar_subtitle_bottom_margin_material = 2131099659;
+                       
+                       // aapt resource value: 0x7F06000C
+                       public const int abc_action_bar_subtitle_top_margin_material = 2131099660;
+                       
+                       // aapt resource value: 0x7F06000D
+                       public const int abc_action_button_min_height_material = 2131099661;
+                       
+                       // aapt resource value: 0x7F06000E
+                       public const int abc_action_button_min_width_material = 2131099662;
+                       
+                       // aapt resource value: 0x7F06000F
+                       public const int abc_action_button_min_width_overflow_material = 2131099663;
+                       
+                       // aapt resource value: 0x7F060010
+                       public const int abc_alert_dialog_button_bar_height = 2131099664;
+                       
+                       // aapt resource value: 0x7F060011
+                       public const int abc_alert_dialog_button_dimen = 2131099665;
+                       
+                       // aapt resource value: 0x7F060012
+                       public const int abc_button_inset_horizontal_material = 2131099666;
+                       
+                       // aapt resource value: 0x7F060013
+                       public const int abc_button_inset_vertical_material = 2131099667;
+                       
+                       // aapt resource value: 0x7F060014
+                       public const int abc_button_padding_horizontal_material = 2131099668;
+                       
+                       // aapt resource value: 0x7F060015
+                       public const int abc_button_padding_vertical_material = 2131099669;
+                       
+                       // aapt resource value: 0x7F060016
+                       public const int abc_cascading_menus_min_smallest_width = 2131099670;
+                       
+                       // aapt resource value: 0x7F060017
+                       public const int abc_config_prefDialogWidth = 2131099671;
+                       
+                       // aapt resource value: 0x7F060018
+                       public const int abc_control_corner_material = 2131099672;
+                       
+                       // aapt resource value: 0x7F060019
+                       public const int abc_control_inset_material = 2131099673;
+                       
+                       // aapt resource value: 0x7F06001A
+                       public const int abc_control_padding_material = 2131099674;
+                       
+                       // aapt resource value: 0x7F06001B
+                       public const int abc_dialog_corner_radius_material = 2131099675;
+                       
+                       // aapt resource value: 0x7F06001C
+                       public const int abc_dialog_fixed_height_major = 2131099676;
+                       
+                       // aapt resource value: 0x7F06001D
+                       public const int abc_dialog_fixed_height_minor = 2131099677;
+                       
+                       // aapt resource value: 0x7F06001E
+                       public const int abc_dialog_fixed_width_major = 2131099678;
+                       
+                       // aapt resource value: 0x7F06001F
+                       public const int abc_dialog_fixed_width_minor = 2131099679;
+                       
+                       // aapt resource value: 0x7F060020
+                       public const int abc_dialog_list_padding_bottom_no_buttons = 2131099680;
+                       
+                       // aapt resource value: 0x7F060021
+                       public const int abc_dialog_list_padding_top_no_title = 2131099681;
+                       
+                       // aapt resource value: 0x7F060022
+                       public const int abc_dialog_min_width_major = 2131099682;
+                       
+                       // aapt resource value: 0x7F060023
+                       public const int abc_dialog_min_width_minor = 2131099683;
+                       
+                       // aapt resource value: 0x7F060024
+                       public const int abc_dialog_padding_material = 2131099684;
+                       
+                       // aapt resource value: 0x7F060025
+                       public const int abc_dialog_padding_top_material = 2131099685;
+                       
+                       // aapt resource value: 0x7F060026
+                       public const int abc_dialog_title_divider_material = 2131099686;
+                       
+                       // aapt resource value: 0x7F060027
+                       public const int abc_disabled_alpha_material_dark = 2131099687;
+                       
+                       // aapt resource value: 0x7F060028
+                       public const int abc_disabled_alpha_material_light = 2131099688;
+                       
+                       // aapt resource value: 0x7F060029
+                       public const int abc_dropdownitem_icon_width = 2131099689;
+                       
+                       // aapt resource value: 0x7F06002A
+                       public const int abc_dropdownitem_text_padding_left = 2131099690;
+                       
+                       // aapt resource value: 0x7F06002B
+                       public const int abc_dropdownitem_text_padding_right = 2131099691;
+                       
+                       // aapt resource value: 0x7F06002C
+                       public const int abc_edit_text_inset_bottom_material = 2131099692;
+                       
+                       // aapt resource value: 0x7F06002D
+                       public const int abc_edit_text_inset_horizontal_material = 2131099693;
+                       
+                       // aapt resource value: 0x7F06002E
+                       public const int abc_edit_text_inset_top_material = 2131099694;
+                       
+                       // aapt resource value: 0x7F06002F
+                       public const int abc_floating_window_z = 2131099695;
+                       
+                       // aapt resource value: 0x7F060030
+                       public const int abc_list_item_padding_horizontal_material = 2131099696;
+                       
+                       // aapt resource value: 0x7F060031
+                       public const int abc_panel_menu_list_width = 2131099697;
+                       
+                       // aapt resource value: 0x7F060032
+                       public const int abc_progress_bar_height_material = 2131099698;
+                       
+                       // aapt resource value: 0x7F060033
+                       public const int abc_search_view_preferred_height = 2131099699;
+                       
+                       // aapt resource value: 0x7F060034
+                       public const int abc_search_view_preferred_width = 2131099700;
+                       
+                       // aapt resource value: 0x7F060035
+                       public const int abc_seekbar_track_background_height_material = 2131099701;
+                       
+                       // aapt resource value: 0x7F060036
+                       public const int abc_seekbar_track_progress_height_material = 2131099702;
+                       
+                       // aapt resource value: 0x7F060037
+                       public const int abc_select_dialog_padding_start_material = 2131099703;
+                       
+                       // aapt resource value: 0x7F060038
+                       public const int abc_switch_padding = 2131099704;
+                       
+                       // aapt resource value: 0x7F060039
+                       public const int abc_text_size_body_1_material = 2131099705;
+                       
+                       // aapt resource value: 0x7F06003A
+                       public const int abc_text_size_body_2_material = 2131099706;
+                       
+                       // aapt resource value: 0x7F06003B
+                       public const int abc_text_size_button_material = 2131099707;
+                       
+                       // aapt resource value: 0x7F06003C
+                       public const int abc_text_size_caption_material = 2131099708;
+                       
+                       // aapt resource value: 0x7F06003D
+                       public const int abc_text_size_display_1_material = 2131099709;
+                       
+                       // aapt resource value: 0x7F06003E
+                       public const int abc_text_size_display_2_material = 2131099710;
+                       
+                       // aapt resource value: 0x7F06003F
+                       public const int abc_text_size_display_3_material = 2131099711;
+                       
+                       // aapt resource value: 0x7F060040
+                       public const int abc_text_size_display_4_material = 2131099712;
+                       
+                       // aapt resource value: 0x7F060041
+                       public const int abc_text_size_headline_material = 2131099713;
+                       
+                       // aapt resource value: 0x7F060042
+                       public const int abc_text_size_large_material = 2131099714;
+                       
+                       // aapt resource value: 0x7F060043
+                       public const int abc_text_size_medium_material = 2131099715;
+                       
+                       // aapt resource value: 0x7F060044
+                       public const int abc_text_size_menu_header_material = 2131099716;
+                       
+                       // aapt resource value: 0x7F060045
+                       public const int abc_text_size_menu_material = 2131099717;
+                       
+                       // aapt resource value: 0x7F060046
+                       public const int abc_text_size_small_material = 2131099718;
+                       
+                       // aapt resource value: 0x7F060047
+                       public const int abc_text_size_subhead_material = 2131099719;
+                       
+                       // aapt resource value: 0x7F060048
+                       public const int abc_text_size_subtitle_material_toolbar = 2131099720;
+                       
+                       // aapt resource value: 0x7F060049
+                       public const int abc_text_size_title_material = 2131099721;
+                       
+                       // aapt resource value: 0x7F06004A
+                       public const int abc_text_size_title_material_toolbar = 2131099722;
+                       
+                       // aapt resource value: 0x7F06004B
+                       public const int browser_actions_context_menu_max_width = 2131099723;
+                       
+                       // aapt resource value: 0x7F06004C
+                       public const int browser_actions_context_menu_min_padding = 2131099724;
+                       
+                       // aapt resource value: 0x7F06004D
+                       public const int cardview_compat_inset_shadow = 2131099725;
+                       
+                       // aapt resource value: 0x7F06004E
+                       public const int cardview_default_elevation = 2131099726;
+                       
+                       // aapt resource value: 0x7F06004F
+                       public const int cardview_default_radius = 2131099727;
+                       
+                       // aapt resource value: 0x7F060050
+                       public const int compat_button_inset_horizontal_material = 2131099728;
+                       
+                       // aapt resource value: 0x7F060051
+                       public const int compat_button_inset_vertical_material = 2131099729;
+                       
+                       // aapt resource value: 0x7F060052
+                       public const int compat_button_padding_horizontal_material = 2131099730;
+                       
+                       // aapt resource value: 0x7F060053
+                       public const int compat_button_padding_vertical_material = 2131099731;
+                       
+                       // aapt resource value: 0x7F060054
+                       public const int compat_control_corner_material = 2131099732;
+                       
+                       // aapt resource value: 0x7F060055
+                       public const int compat_notification_large_icon_max_height = 2131099733;
+                       
+                       // aapt resource value: 0x7F060056
+                       public const int compat_notification_large_icon_max_width = 2131099734;
+                       
+                       // aapt resource value: 0x7F060057
+                       public const int design_appbar_elevation = 2131099735;
+                       
+                       // aapt resource value: 0x7F060058
+                       public const int design_bottom_navigation_active_item_max_width = 2131099736;
+                       
+                       // aapt resource value: 0x7F060059
+                       public const int design_bottom_navigation_active_item_min_width = 2131099737;
+                       
+                       // aapt resource value: 0x7F06005A
+                       public const int design_bottom_navigation_active_text_size = 2131099738;
+                       
+                       // aapt resource value: 0x7F06005B
+                       public const int design_bottom_navigation_elevation = 2131099739;
+                       
+                       // aapt resource value: 0x7F06005C
+                       public const int design_bottom_navigation_height = 2131099740;
+                       
+                       // aapt resource value: 0x7F06005D
+                       public const int design_bottom_navigation_icon_size = 2131099741;
+                       
+                       // aapt resource value: 0x7F06005E
+                       public const int design_bottom_navigation_item_max_width = 2131099742;
+                       
+                       // aapt resource value: 0x7F06005F
+                       public const int design_bottom_navigation_item_min_width = 2131099743;
+                       
+                       // aapt resource value: 0x7F060060
+                       public const int design_bottom_navigation_margin = 2131099744;
+                       
+                       // aapt resource value: 0x7F060061
+                       public const int design_bottom_navigation_shadow_height = 2131099745;
+                       
+                       // aapt resource value: 0x7F060062
+                       public const int design_bottom_navigation_text_size = 2131099746;
+                       
+                       // aapt resource value: 0x7F060063
+                       public const int design_bottom_sheet_modal_elevation = 2131099747;
+                       
+                       // aapt resource value: 0x7F060064
+                       public const int design_bottom_sheet_peek_height_min = 2131099748;
+                       
+                       // aapt resource value: 0x7F060065
+                       public const int design_fab_border_width = 2131099749;
+                       
+                       // aapt resource value: 0x7F060066
+                       public const int design_fab_elevation = 2131099750;
+                       
+                       // aapt resource value: 0x7F060067
+                       public const int design_fab_image_size = 2131099751;
+                       
+                       // aapt resource value: 0x7F060068
+                       public const int design_fab_size_mini = 2131099752;
+                       
+                       // aapt resource value: 0x7F060069
+                       public const int design_fab_size_normal = 2131099753;
+                       
+                       // aapt resource value: 0x7F06006A
+                       public const int design_fab_translation_z_hovered_focused = 2131099754;
+                       
+                       // aapt resource value: 0x7F06006B
+                       public const int design_fab_translation_z_pressed = 2131099755;
+                       
+                       // aapt resource value: 0x7F06006C
+                       public const int design_navigation_elevation = 2131099756;
+                       
+                       // aapt resource value: 0x7F06006D
+                       public const int design_navigation_icon_padding = 2131099757;
+                       
+                       // aapt resource value: 0x7F06006E
+                       public const int design_navigation_icon_size = 2131099758;
+                       
+                       // aapt resource value: 0x7F06006F
+                       public const int design_navigation_item_horizontal_padding = 2131099759;
+                       
+                       // aapt resource value: 0x7F060070
+                       public const int design_navigation_item_icon_padding = 2131099760;
+                       
+                       // aapt resource value: 0x7F060071
+                       public const int design_navigation_max_width = 2131099761;
+                       
+                       // aapt resource value: 0x7F060072
+                       public const int design_navigation_padding_bottom = 2131099762;
+                       
+                       // aapt resource value: 0x7F060073
+                       public const int design_navigation_separator_vertical_padding = 2131099763;
+                       
+                       // aapt resource value: 0x7F060074
+                       public const int design_snackbar_action_inline_max_width = 2131099764;
+                       
+                       // aapt resource value: 0x7F060075
+                       public const int design_snackbar_background_corner_radius = 2131099765;
+                       
+                       // aapt resource value: 0x7F060076
+                       public const int design_snackbar_elevation = 2131099766;
+                       
+                       // aapt resource value: 0x7F060077
+                       public const int design_snackbar_extra_spacing_horizontal = 2131099767;
+                       
+                       // aapt resource value: 0x7F060078
+                       public const int design_snackbar_max_width = 2131099768;
+                       
+                       // aapt resource value: 0x7F060079
+                       public const int design_snackbar_min_width = 2131099769;
+                       
+                       // aapt resource value: 0x7F06007A
+                       public const int design_snackbar_padding_horizontal = 2131099770;
+                       
+                       // aapt resource value: 0x7F06007B
+                       public const int design_snackbar_padding_vertical = 2131099771;
+                       
+                       // aapt resource value: 0x7F06007C
+                       public const int design_snackbar_padding_vertical_2lines = 2131099772;
+                       
+                       // aapt resource value: 0x7F06007D
+                       public const int design_snackbar_text_size = 2131099773;
+                       
+                       // aapt resource value: 0x7F06007E
+                       public const int design_tab_max_width = 2131099774;
+                       
+                       // aapt resource value: 0x7F06007F
+                       public const int design_tab_scrollable_min_width = 2131099775;
+                       
+                       // aapt resource value: 0x7F060080
+                       public const int design_tab_text_size = 2131099776;
+                       
+                       // aapt resource value: 0x7F060081
+                       public const int design_tab_text_size_2line = 2131099777;
+                       
+                       // aapt resource value: 0x7F060082
+                       public const int design_textinput_caption_translate_y = 2131099778;
+                       
+                       // aapt resource value: 0x7F060083
+                       public const int disabled_alpha_material_dark = 2131099779;
+                       
+                       // aapt resource value: 0x7F060084
+                       public const int disabled_alpha_material_light = 2131099780;
+                       
+                       // aapt resource value: 0x7F060085
+                       public const int fastscroll_default_thickness = 2131099781;
+                       
+                       // aapt resource value: 0x7F060086
+                       public const int fastscroll_margin = 2131099782;
+                       
+                       // aapt resource value: 0x7F060087
+                       public const int fastscroll_minimum_range = 2131099783;
+                       
+                       // aapt resource value: 0x7F060088
+                       public const int highlight_alpha_material_colored = 2131099784;
+                       
+                       // aapt resource value: 0x7F060089
+                       public const int highlight_alpha_material_dark = 2131099785;
+                       
+                       // aapt resource value: 0x7F06008A
+                       public const int highlight_alpha_material_light = 2131099786;
+                       
+                       // aapt resource value: 0x7F06008B
+                       public const int hint_alpha_material_dark = 2131099787;
+                       
+                       // aapt resource value: 0x7F06008C
+                       public const int hint_alpha_material_light = 2131099788;
+                       
+                       // aapt resource value: 0x7F06008D
+                       public const int hint_pressed_alpha_material_dark = 2131099789;
+                       
+                       // aapt resource value: 0x7F06008E
+                       public const int hint_pressed_alpha_material_light = 2131099790;
+                       
+                       // aapt resource value: 0x7F06008F
+                       public const int item_touch_helper_max_drag_scroll_per_frame = 2131099791;
+                       
+                       // aapt resource value: 0x7F060090
+                       public const int item_touch_helper_swipe_escape_max_velocity = 2131099792;
+                       
+                       // aapt resource value: 0x7F060091
+                       public const int item_touch_helper_swipe_escape_velocity = 2131099793;
+                       
+                       // aapt resource value: 0x7F060092
+                       public const int mtrl_bottomappbar_fabOffsetEndMode = 2131099794;
+                       
+                       // aapt resource value: 0x7F060093
+                       public const int mtrl_bottomappbar_fab_cradle_margin = 2131099795;
+                       
+                       // aapt resource value: 0x7F060094
+                       public const int mtrl_bottomappbar_fab_cradle_rounded_corner_radius = 2131099796;
+                       
+                       // aapt resource value: 0x7F060095
+                       public const int mtrl_bottomappbar_fab_cradle_vertical_offset = 2131099797;
+                       
+                       // aapt resource value: 0x7F060096
+                       public const int mtrl_bottomappbar_height = 2131099798;
+                       
+                       // aapt resource value: 0x7F060097
+                       public const int mtrl_btn_corner_radius = 2131099799;
+                       
+                       // aapt resource value: 0x7F060098
+                       public const int mtrl_btn_dialog_btn_min_width = 2131099800;
+                       
+                       // aapt resource value: 0x7F060099
+                       public const int mtrl_btn_disabled_elevation = 2131099801;
+                       
+                       // aapt resource value: 0x7F06009A
+                       public const int mtrl_btn_disabled_z = 2131099802;
+                       
+                       // aapt resource value: 0x7F06009B
+                       public const int mtrl_btn_elevation = 2131099803;
+                       
+                       // aapt resource value: 0x7F06009C
+                       public const int mtrl_btn_focused_z = 2131099804;
+                       
+                       // aapt resource value: 0x7F06009D
+                       public const int mtrl_btn_hovered_z = 2131099805;
+                       
+                       // aapt resource value: 0x7F06009E
+                       public const int mtrl_btn_icon_btn_padding_left = 2131099806;
+                       
+                       // aapt resource value: 0x7F06009F
+                       public const int mtrl_btn_icon_padding = 2131099807;
+                       
+                       // aapt resource value: 0x7F0600A0
+                       public const int mtrl_btn_inset = 2131099808;
+                       
+                       // aapt resource value: 0x7F0600A1
+                       public const int mtrl_btn_letter_spacing = 2131099809;
+                       
+                       // aapt resource value: 0x7F0600A2
+                       public const int mtrl_btn_padding_bottom = 2131099810;
+                       
+                       // aapt resource value: 0x7F0600A3
+                       public const int mtrl_btn_padding_left = 2131099811;
+                       
+                       // aapt resource value: 0x7F0600A4
+                       public const int mtrl_btn_padding_right = 2131099812;
+                       
+                       // aapt resource value: 0x7F0600A5
+                       public const int mtrl_btn_padding_top = 2131099813;
+                       
+                       // aapt resource value: 0x7F0600A6
+                       public const int mtrl_btn_pressed_z = 2131099814;
+                       
+                       // aapt resource value: 0x7F0600A7
+                       public const int mtrl_btn_stroke_size = 2131099815;
+                       
+                       // aapt resource value: 0x7F0600A8
+                       public const int mtrl_btn_text_btn_icon_padding = 2131099816;
+                       
+                       // aapt resource value: 0x7F0600A9
+                       public const int mtrl_btn_text_btn_padding_left = 2131099817;
+                       
+                       // aapt resource value: 0x7F0600AA
+                       public const int mtrl_btn_text_btn_padding_right = 2131099818;
+                       
+                       // aapt resource value: 0x7F0600AB
+                       public const int mtrl_btn_text_size = 2131099819;
+                       
+                       // aapt resource value: 0x7F0600AC
+                       public const int mtrl_btn_z = 2131099820;
+                       
+                       // aapt resource value: 0x7F0600AD
+                       public const int mtrl_card_elevation = 2131099821;
+                       
+                       // aapt resource value: 0x7F0600AE
+                       public const int mtrl_card_spacing = 2131099822;
+                       
+                       // aapt resource value: 0x7F0600AF
+                       public const int mtrl_chip_pressed_translation_z = 2131099823;
+                       
+                       // aapt resource value: 0x7F0600B0
+                       public const int mtrl_chip_text_size = 2131099824;
+                       
+                       // aapt resource value: 0x7F0600B1
+                       public const int mtrl_fab_elevation = 2131099825;
+                       
+                       // aapt resource value: 0x7F0600B2
+                       public const int mtrl_fab_translation_z_hovered_focused = 2131099826;
+                       
+                       // aapt resource value: 0x7F0600B3
+                       public const int mtrl_fab_translation_z_pressed = 2131099827;
+                       
+                       // aapt resource value: 0x7F0600B4
+                       public const int mtrl_navigation_elevation = 2131099828;
+                       
+                       // aapt resource value: 0x7F0600B5
+                       public const int mtrl_navigation_item_horizontal_padding = 2131099829;
+                       
+                       // aapt resource value: 0x7F0600B6
+                       public const int mtrl_navigation_item_icon_padding = 2131099830;
+                       
+                       // aapt resource value: 0x7F0600B7
+                       public const int mtrl_snackbar_background_corner_radius = 2131099831;
+                       
+                       // aapt resource value: 0x7F0600B8
+                       public const int mtrl_snackbar_margin = 2131099832;
+                       
+                       // aapt resource value: 0x7F0600B9
+                       public const int mtrl_textinput_box_bottom_offset = 2131099833;
+                       
+                       // aapt resource value: 0x7F0600BA
+                       public const int mtrl_textinput_box_corner_radius_medium = 2131099834;
+                       
+                       // aapt resource value: 0x7F0600BB
+                       public const int mtrl_textinput_box_corner_radius_small = 2131099835;
+                       
+                       // aapt resource value: 0x7F0600BC
+                       public const int mtrl_textinput_box_label_cutout_padding = 2131099836;
+                       
+                       // aapt resource value: 0x7F0600BD
+                       public const int mtrl_textinput_box_padding_end = 2131099837;
+                       
+                       // aapt resource value: 0x7F0600BE
+                       public const int mtrl_textinput_box_stroke_width_default = 2131099838;
+                       
+                       // aapt resource value: 0x7F0600BF
+                       public const int mtrl_textinput_box_stroke_width_focused = 2131099839;
+                       
+                       // aapt resource value: 0x7F0600C0
+                       public const int mtrl_textinput_outline_box_expanded_padding = 2131099840;
+                       
+                       // aapt resource value: 0x7F0600C1
+                       public const int mtrl_toolbar_default_height = 2131099841;
+                       
+                       // aapt resource value: 0x7F0600C2
+                       public const int notification_action_icon_size = 2131099842;
+                       
+                       // aapt resource value: 0x7F0600C3
+                       public const int notification_action_text_size = 2131099843;
+                       
+                       // aapt resource value: 0x7F0600C4
+                       public const int notification_big_circle_margin = 2131099844;
+                       
+                       // aapt resource value: 0x7F0600C5
+                       public const int notification_content_margin_start = 2131099845;
+                       
+                       // aapt resource value: 0x7F0600C6
+                       public const int notification_large_icon_height = 2131099846;
+                       
+                       // aapt resource value: 0x7F0600C7
+                       public const int notification_large_icon_width = 2131099847;
+                       
+                       // aapt resource value: 0x7F0600C8
+                       public const int notification_main_column_padding_top = 2131099848;
+                       
+                       // aapt resource value: 0x7F0600C9
+                       public const int notification_media_narrow_margin = 2131099849;
+                       
+                       // aapt resource value: 0x7F0600CA
+                       public const int notification_right_icon_size = 2131099850;
+                       
+                       // aapt resource value: 0x7F0600CB
+                       public const int notification_right_side_padding_top = 2131099851;
+                       
+                       // aapt resource value: 0x7F0600CC
+                       public const int notification_small_icon_background_padding = 2131099852;
+                       
+                       // aapt resource value: 0x7F0600CD
+                       public const int notification_small_icon_size_as_large = 2131099853;
+                       
+                       // aapt resource value: 0x7F0600CE
+                       public const int notification_subtext_size = 2131099854;
+                       
+                       // aapt resource value: 0x7F0600CF
+                       public const int notification_top_pad = 2131099855;
+                       
+                       // aapt resource value: 0x7F0600D0
+                       public const int notification_top_pad_large_text = 2131099856;
+                       
+                       // aapt resource value: 0x7F0600D1
+                       public const int subtitle_corner_radius = 2131099857;
+                       
+                       // aapt resource value: 0x7F0600D2
+                       public const int subtitle_outline_width = 2131099858;
+                       
+                       // aapt resource value: 0x7F0600D3
+                       public const int subtitle_shadow_offset = 2131099859;
+                       
+                       // aapt resource value: 0x7F0600D4
+                       public const int subtitle_shadow_radius = 2131099860;
+                       
+                       // aapt resource value: 0x7F0600D5
+                       public const int tooltip_corner_radius = 2131099861;
+                       
+                       // aapt resource value: 0x7F0600D6
+                       public const int tooltip_horizontal_padding = 2131099862;
+                       
+                       // aapt resource value: 0x7F0600D7
+                       public const int tooltip_margin = 2131099863;
+                       
+                       // aapt resource value: 0x7F0600D8
+                       public const int tooltip_precise_anchor_extra_offset = 2131099864;
+                       
+                       // aapt resource value: 0x7F0600D9
+                       public const int tooltip_precise_anchor_threshold = 2131099865;
+                       
+                       // aapt resource value: 0x7F0600DA
+                       public const int tooltip_vertical_padding = 2131099866;
+                       
+                       // aapt resource value: 0x7F0600DB
+                       public const int tooltip_y_offset_non_touch = 2131099867;
+                       
+                       // aapt resource value: 0x7F0600DC
+                       public const int tooltip_y_offset_touch = 2131099868;
+                       
+                       static Dimension()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Dimension()
+                       {
+                       }
+               }
+               
+               public partial class Drawable
+               {
+                       
+                       // aapt resource value: 0x7F070006
+                       public const int abc_ab_share_pack_mtrl_alpha = 2131165190;
+                       
+                       // aapt resource value: 0x7F070007
+                       public const int abc_action_bar_item_background_material = 2131165191;
+                       
+                       // aapt resource value: 0x7F070008
+                       public const int abc_btn_borderless_material = 2131165192;
+                       
+                       // aapt resource value: 0x7F070009
+                       public const int abc_btn_check_material = 2131165193;
+                       
+                       // aapt resource value: 0x7F07000A
+                       public const int abc_btn_check_to_on_mtrl_000 = 2131165194;
+                       
+                       // aapt resource value: 0x7F07000B
+                       public const int abc_btn_check_to_on_mtrl_015 = 2131165195;
+                       
+                       // aapt resource value: 0x7F07000C
+                       public const int abc_btn_colored_material = 2131165196;
+                       
+                       // aapt resource value: 0x7F07000D
+                       public const int abc_btn_default_mtrl_shape = 2131165197;
+                       
+                       // aapt resource value: 0x7F07000E
+                       public const int abc_btn_radio_material = 2131165198;
+                       
+                       // aapt resource value: 0x7F07000F
+                       public const int abc_btn_radio_to_on_mtrl_000 = 2131165199;
+                       
+                       // aapt resource value: 0x7F070010
+                       public const int abc_btn_radio_to_on_mtrl_015 = 2131165200;
+                       
+                       // aapt resource value: 0x7F070011
+                       public const int abc_btn_switch_to_on_mtrl_00001 = 2131165201;
+                       
+                       // aapt resource value: 0x7F070012
+                       public const int abc_btn_switch_to_on_mtrl_00012 = 2131165202;
+                       
+                       // aapt resource value: 0x7F070013
+                       public const int abc_cab_background_internal_bg = 2131165203;
+                       
+                       // aapt resource value: 0x7F070014
+                       public const int abc_cab_background_top_material = 2131165204;
+                       
+                       // aapt resource value: 0x7F070015
+                       public const int abc_cab_background_top_mtrl_alpha = 2131165205;
+                       
+                       // aapt resource value: 0x7F070016
+                       public const int abc_control_background_material = 2131165206;
+                       
+                       // aapt resource value: 0x7F070017
+                       public const int abc_dialog_material_background = 2131165207;
+                       
+                       // aapt resource value: 0x7F070018
+                       public const int abc_edit_text_material = 2131165208;
+                       
+                       // aapt resource value: 0x7F070019
+                       public const int abc_ic_ab_back_material = 2131165209;
+                       
+                       // aapt resource value: 0x7F07001A
+                       public const int abc_ic_arrow_drop_right_black_24dp = 2131165210;
+                       
+                       // aapt resource value: 0x7F07001B
+                       public const int abc_ic_clear_material = 2131165211;
+                       
+                       // aapt resource value: 0x7F07001C
+                       public const int abc_ic_commit_search_api_mtrl_alpha = 2131165212;
+                       
+                       // aapt resource value: 0x7F07001D
+                       public const int abc_ic_go_search_api_material = 2131165213;
+                       
+                       // aapt resource value: 0x7F07001E
+                       public const int abc_ic_menu_copy_mtrl_am_alpha = 2131165214;
+                       
+                       // aapt resource value: 0x7F07001F
+                       public const int abc_ic_menu_cut_mtrl_alpha = 2131165215;
+                       
+                       // aapt resource value: 0x7F070020
+                       public const int abc_ic_menu_overflow_material = 2131165216;
+                       
+                       // aapt resource value: 0x7F070021
+                       public const int abc_ic_menu_paste_mtrl_am_alpha = 2131165217;
+                       
+                       // aapt resource value: 0x7F070022
+                       public const int abc_ic_menu_selectall_mtrl_alpha = 2131165218;
+                       
+                       // aapt resource value: 0x7F070023
+                       public const int abc_ic_menu_share_mtrl_alpha = 2131165219;
+                       
+                       // aapt resource value: 0x7F070024
+                       public const int abc_ic_search_api_material = 2131165220;
+                       
+                       // aapt resource value: 0x7F070025
+                       public const int abc_ic_star_black_16dp = 2131165221;
+                       
+                       // aapt resource value: 0x7F070026
+                       public const int abc_ic_star_black_36dp = 2131165222;
+                       
+                       // aapt resource value: 0x7F070027
+                       public const int abc_ic_star_black_48dp = 2131165223;
+                       
+                       // aapt resource value: 0x7F070028
+                       public const int abc_ic_star_half_black_16dp = 2131165224;
+                       
+                       // aapt resource value: 0x7F070029
+                       public const int abc_ic_star_half_black_36dp = 2131165225;
+                       
+                       // aapt resource value: 0x7F07002A
+                       public const int abc_ic_star_half_black_48dp = 2131165226;
+                       
+                       // aapt resource value: 0x7F07002B
+                       public const int abc_ic_voice_search_api_material = 2131165227;
+                       
+                       // aapt resource value: 0x7F07002C
+                       public const int abc_item_background_holo_dark = 2131165228;
+                       
+                       // aapt resource value: 0x7F07002D
+                       public const int abc_item_background_holo_light = 2131165229;
+                       
+                       // aapt resource value: 0x7F07002E
+                       public const int abc_list_divider_material = 2131165230;
+                       
+                       // aapt resource value: 0x7F07002F
+                       public const int abc_list_divider_mtrl_alpha = 2131165231;
+                       
+                       // aapt resource value: 0x7F070030
+                       public const int abc_list_focused_holo = 2131165232;
+                       
+                       // aapt resource value: 0x7F070031
+                       public const int abc_list_longpressed_holo = 2131165233;
+                       
+                       // aapt resource value: 0x7F070032
+                       public const int abc_list_pressed_holo_dark = 2131165234;
+                       
+                       // aapt resource value: 0x7F070033
+                       public const int abc_list_pressed_holo_light = 2131165235;
+                       
+                       // aapt resource value: 0x7F070034
+                       public const int abc_list_selector_background_transition_holo_dark = 2131165236;
+                       
+                       // aapt resource value: 0x7F070035
+                       public const int abc_list_selector_background_transition_holo_light = 2131165237;
+                       
+                       // aapt resource value: 0x7F070036
+                       public const int abc_list_selector_disabled_holo_dark = 2131165238;
+                       
+                       // aapt resource value: 0x7F070037
+                       public const int abc_list_selector_disabled_holo_light = 2131165239;
+                       
+                       // aapt resource value: 0x7F070038
+                       public const int abc_list_selector_holo_dark = 2131165240;
+                       
+                       // aapt resource value: 0x7F070039
+                       public const int abc_list_selector_holo_light = 2131165241;
+                       
+                       // aapt resource value: 0x7F07003A
+                       public const int abc_menu_hardkey_panel_mtrl_mult = 2131165242;
+                       
+                       // aapt resource value: 0x7F07003B
+                       public const int abc_popup_background_mtrl_mult = 2131165243;
+                       
+                       // aapt resource value: 0x7F07003C
+                       public const int abc_ratingbar_indicator_material = 2131165244;
+                       
+                       // aapt resource value: 0x7F07003D
+                       public const int abc_ratingbar_material = 2131165245;
+                       
+                       // aapt resource value: 0x7F07003E
+                       public const int abc_ratingbar_small_material = 2131165246;
+                       
+                       // aapt resource value: 0x7F07003F
+                       public const int abc_scrubber_control_off_mtrl_alpha = 2131165247;
+                       
+                       // aapt resource value: 0x7F070040
+                       public const int abc_scrubber_control_to_pressed_mtrl_000 = 2131165248;
+                       
+                       // aapt resource value: 0x7F070041
+                       public const int abc_scrubber_control_to_pressed_mtrl_005 = 2131165249;
+                       
+                       // aapt resource value: 0x7F070042
+                       public const int abc_scrubber_primary_mtrl_alpha = 2131165250;
+                       
+                       // aapt resource value: 0x7F070043
+                       public const int abc_scrubber_track_mtrl_alpha = 2131165251;
+                       
+                       // aapt resource value: 0x7F070044
+                       public const int abc_seekbar_thumb_material = 2131165252;
+                       
+                       // aapt resource value: 0x7F070045
+                       public const int abc_seekbar_tick_mark_material = 2131165253;
+                       
+                       // aapt resource value: 0x7F070046
+                       public const int abc_seekbar_track_material = 2131165254;
+                       
+                       // aapt resource value: 0x7F070047
+                       public const int abc_spinner_mtrl_am_alpha = 2131165255;
+                       
+                       // aapt resource value: 0x7F070048
+                       public const int abc_spinner_textfield_background_material = 2131165256;
+                       
+                       // aapt resource value: 0x7F070049
+                       public const int abc_switch_thumb_material = 2131165257;
+                       
+                       // aapt resource value: 0x7F07004A
+                       public const int abc_switch_track_mtrl_alpha = 2131165258;
+                       
+                       // aapt resource value: 0x7F07004B
+                       public const int abc_tab_indicator_material = 2131165259;
+                       
+                       // aapt resource value: 0x7F07004C
+                       public const int abc_tab_indicator_mtrl_alpha = 2131165260;
+                       
+                       // aapt resource value: 0x7F070054
+                       public const int abc_textfield_activated_mtrl_alpha = 2131165268;
+                       
+                       // aapt resource value: 0x7F070055
+                       public const int abc_textfield_default_mtrl_alpha = 2131165269;
+                       
+                       // aapt resource value: 0x7F070056
+                       public const int abc_textfield_search_activated_mtrl_alpha = 2131165270;
+                       
+                       // aapt resource value: 0x7F070057
+                       public const int abc_textfield_search_default_mtrl_alpha = 2131165271;
+                       
+                       // aapt resource value: 0x7F070058
+                       public const int abc_textfield_search_material = 2131165272;
+                       
+                       // aapt resource value: 0x7F07004D
+                       public const int abc_text_cursor_material = 2131165261;
+                       
+                       // aapt resource value: 0x7F07004E
+                       public const int abc_text_select_handle_left_mtrl_dark = 2131165262;
+                       
+                       // aapt resource value: 0x7F07004F
+                       public const int abc_text_select_handle_left_mtrl_light = 2131165263;
+                       
+                       // aapt resource value: 0x7F070050
+                       public const int abc_text_select_handle_middle_mtrl_dark = 2131165264;
+                       
+                       // aapt resource value: 0x7F070051
+                       public const int abc_text_select_handle_middle_mtrl_light = 2131165265;
+                       
+                       // aapt resource value: 0x7F070052
+                       public const int abc_text_select_handle_right_mtrl_dark = 2131165266;
+                       
+                       // aapt resource value: 0x7F070053
+                       public const int abc_text_select_handle_right_mtrl_light = 2131165267;
+                       
+                       // aapt resource value: 0x7F070059
+                       public const int abc_vector_test = 2131165273;
+                       
+                       // aapt resource value: 0x7F07005A
+                       public const int avd_hide_password = 2131165274;
+                       
+                       // aapt resource value: 0x7F07005B
+                       public const int avd_show_password = 2131165275;
+                       
+                       // aapt resource value: 0x7F07005C
+                       public const int design_bottom_navigation_item_background = 2131165276;
+                       
+                       // aapt resource value: 0x7F07005D
+                       public const int design_fab_background = 2131165277;
+                       
+                       // aapt resource value: 0x7F07005E
+                       public const int design_ic_visibility = 2131165278;
+                       
+                       // aapt resource value: 0x7F07005F
+                       public const int design_ic_visibility_off = 2131165279;
+                       
+                       // aapt resource value: 0x7F070060
+                       public const int design_password_eye = 2131165280;
+                       
+                       // aapt resource value: 0x7F070061
+                       public const int design_snackbar_background = 2131165281;
+                       
+                       // aapt resource value: 0x7F070062
+                       public const int ic_mtrl_chip_checked_black = 2131165282;
+                       
+                       // aapt resource value: 0x7F070063
+                       public const int ic_mtrl_chip_checked_circle = 2131165283;
+                       
+                       // aapt resource value: 0x7F070064
+                       public const int ic_mtrl_chip_close_circle = 2131165284;
+                       
+                       // aapt resource value: 0x7F070065
+                       public const int mtrl_snackbar_background = 2131165285;
+                       
+                       // aapt resource value: 0x7F070066
+                       public const int mtrl_tabs_default_indicator = 2131165286;
+                       
+                       // aapt resource value: 0x7F070067
+                       public const int navigation_empty_icon = 2131165287;
+                       
+                       // aapt resource value: 0x7F070068
+                       public const int notification_action_background = 2131165288;
+                       
+                       // aapt resource value: 0x7F070069
+                       public const int notification_bg = 2131165289;
+                       
+                       // aapt resource value: 0x7F07006A
+                       public const int notification_bg_low = 2131165290;
+                       
+                       // aapt resource value: 0x7F07006B
+                       public const int notification_bg_low_normal = 2131165291;
+                       
+                       // aapt resource value: 0x7F07006C
+                       public const int notification_bg_low_pressed = 2131165292;
+                       
+                       // aapt resource value: 0x7F07006D
+                       public const int notification_bg_normal = 2131165293;
+                       
+                       // aapt resource value: 0x7F07006E
+                       public const int notification_bg_normal_pressed = 2131165294;
+                       
+                       // aapt resource value: 0x7F07006F
+                       public const int notification_icon_background = 2131165295;
+                       
+                       // aapt resource value: 0x7F070070
+                       public const int notification_template_icon_bg = 2131165296;
+                       
+                       // aapt resource value: 0x7F070071
+                       public const int notification_template_icon_low_bg = 2131165297;
+                       
+                       // aapt resource value: 0x7F070072
+                       public const int notification_tile_bg = 2131165298;
+                       
+                       // aapt resource value: 0x7F070073
+                       public const int notify_panel_notification_icon_bg = 2131165299;
+                       
+                       // aapt resource value: 0x7F070074
+                       public const int tooltip_frame_dark = 2131165300;
+                       
+                       // aapt resource value: 0x7F070075
+                       public const int tooltip_frame_light = 2131165301;
+                       
+                       static Drawable()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Drawable()
+                       {
+                       }
+               }
+               
+               public partial class Id
+               {
+                       
+                       // aapt resource value: 0x7F080006
+                       public const int action0 = 2131230726;
+                       
+                       // aapt resource value: 0x7F080018
+                       public const int actions = 2131230744;
+                       
+                       // aapt resource value: 0x7F080007
+                       public const int action_bar = 2131230727;
+                       
+                       // aapt resource value: 0x7F080008
+                       public const int action_bar_activity_content = 2131230728;
+                       
+                       // aapt resource value: 0x7F080009
+                       public const int action_bar_container = 2131230729;
+                       
+                       // aapt resource value: 0x7F08000A
+                       public const int action_bar_root = 2131230730;
+                       
+                       // aapt resource value: 0x7F08000B
+                       public const int action_bar_spinner = 2131230731;
+                       
+                       // aapt resource value: 0x7F08000C
+                       public const int action_bar_subtitle = 2131230732;
+                       
+                       // aapt resource value: 0x7F08000D
+                       public const int action_bar_title = 2131230733;
+                       
+                       // aapt resource value: 0x7F08000E
+                       public const int action_container = 2131230734;
+                       
+                       // aapt resource value: 0x7F08000F
+                       public const int action_context_bar = 2131230735;
+                       
+                       // aapt resource value: 0x7F080010
+                       public const int action_divider = 2131230736;
+                       
+                       // aapt resource value: 0x7F080011
+                       public const int action_image = 2131230737;
+                       
+                       // aapt resource value: 0x7F080012
+                       public const int action_menu_divider = 2131230738;
+                       
+                       // aapt resource value: 0x7F080013
+                       public const int action_menu_presenter = 2131230739;
+                       
+                       // aapt resource value: 0x7F080014
+                       public const int action_mode_bar = 2131230740;
+                       
+                       // aapt resource value: 0x7F080015
+                       public const int action_mode_bar_stub = 2131230741;
+                       
+                       // aapt resource value: 0x7F080016
+                       public const int action_mode_close_button = 2131230742;
+                       
+                       // aapt resource value: 0x7F080017
+                       public const int action_text = 2131230743;
+                       
+                       // aapt resource value: 0x7F080019
+                       public const int activity_chooser_view_content = 2131230745;
+                       
+                       // aapt resource value: 0x7F08001A
+                       public const int add = 2131230746;
+                       
+                       // aapt resource value: 0x7F08001B
+                       public const int alertTitle = 2131230747;
+                       
+                       // aapt resource value: 0x7F08001C
+                       public const int all = 2131230748;
+                       
+                       // aapt resource value: 0x7F080000
+                       public const int ALT = 2131230720;
+                       
+                       // aapt resource value: 0x7F08001D
+                       public const int always = 2131230749;
+                       
+                       // aapt resource value: 0x7F08001E
+                       public const int async = 2131230750;
+                       
+                       // aapt resource value: 0x7F08001F
+                       public const int auto = 2131230751;
+                       
+                       // aapt resource value: 0x7F080020
+                       public const int beginning = 2131230752;
+                       
+                       // aapt resource value: 0x7F080021
+                       public const int blocking = 2131230753;
+                       
+                       // aapt resource value: 0x7F080022
+                       public const int bottom = 2131230754;
+                       
+                       // aapt resource value: 0x7F080023
+                       public const int bottomtab_navarea = 2131230755;
+                       
+                       // aapt resource value: 0x7F080024
+                       public const int bottomtab_tabbar = 2131230756;
+                       
+                       // aapt resource value: 0x7F080025
+                       public const int browser_actions_header_text = 2131230757;
+                       
+                       // aapt resource value: 0x7F080028
+                       public const int browser_actions_menu_items = 2131230760;
+                       
+                       // aapt resource value: 0x7F080026
+                       public const int browser_actions_menu_item_icon = 2131230758;
+                       
+                       // aapt resource value: 0x7F080027
+                       public const int browser_actions_menu_item_text = 2131230759;
+                       
+                       // aapt resource value: 0x7F080029
+                       public const int browser_actions_menu_view = 2131230761;
+                       
+                       // aapt resource value: 0x7F08002A
+                       public const int buttonPanel = 2131230762;
+                       
+                       // aapt resource value: 0x7F08002B
+                       public const int cancel_action = 2131230763;
+                       
+                       // aapt resource value: 0x7F08002C
+                       public const int center = 2131230764;
+                       
+                       // aapt resource value: 0x7F08002D
+                       public const int center_horizontal = 2131230765;
+                       
+                       // aapt resource value: 0x7F08002E
+                       public const int center_vertical = 2131230766;
+                       
+                       // aapt resource value: 0x7F08002F
+                       public const int checkbox = 2131230767;
+                       
+                       // aapt resource value: 0x7F080030
+                       public const int chronometer = 2131230768;
+                       
+                       // aapt resource value: 0x7F080031
+                       public const int clip_horizontal = 2131230769;
+                       
+                       // aapt resource value: 0x7F080032
+                       public const int clip_vertical = 2131230770;
+                       
+                       // aapt resource value: 0x7F080033
+                       public const int collapseActionView = 2131230771;
+                       
+                       // aapt resource value: 0x7F080034
+                       public const int container = 2131230772;
+                       
+                       // aapt resource value: 0x7F080035
+                       public const int content = 2131230773;
+                       
+                       // aapt resource value: 0x7F080036
+                       public const int contentPanel = 2131230774;
+                       
+                       // aapt resource value: 0x7F080037
+                       public const int coordinator = 2131230775;
+                       
+                       // aapt resource value: 0x7F080001
+                       public const int CTRL = 2131230721;
+                       
+                       // aapt resource value: 0x7F080038
+                       public const int custom = 2131230776;
+                       
+                       // aapt resource value: 0x7F080039
+                       public const int customPanel = 2131230777;
+                       
+                       // aapt resource value: 0x7F08003A
+                       public const int decor_content_parent = 2131230778;
+                       
+                       // aapt resource value: 0x7F08003B
+                       public const int default_activity_button = 2131230779;
+                       
+                       // aapt resource value: 0x7F08003C
+                       public const int design_bottom_sheet = 2131230780;
+                       
+                       // aapt resource value: 0x7F08003D
+                       public const int design_menu_item_action_area = 2131230781;
+                       
+                       // aapt resource value: 0x7F08003E
+                       public const int design_menu_item_action_area_stub = 2131230782;
+                       
+                       // aapt resource value: 0x7F08003F
+                       public const int design_menu_item_text = 2131230783;
+                       
+                       // aapt resource value: 0x7F080040
+                       public const int design_navigation_view = 2131230784;
+                       
+                       // aapt resource value: 0x7F080041
+                       public const int disableHome = 2131230785;
+                       
+                       // aapt resource value: 0x7F080042
+                       public const int edit_query = 2131230786;
+                       
+                       // aapt resource value: 0x7F080043
+                       public const int end = 2131230787;
+                       
+                       // aapt resource value: 0x7F080044
+                       public const int end_padder = 2131230788;
+                       
+                       // aapt resource value: 0x7F080045
+                       public const int enterAlways = 2131230789;
+                       
+                       // aapt resource value: 0x7F080046
+                       public const int enterAlwaysCollapsed = 2131230790;
+                       
+                       // aapt resource value: 0x7F080047
+                       public const int exitUntilCollapsed = 2131230791;
+                       
+                       // aapt resource value: 0x7F080049
+                       public const int expanded_menu = 2131230793;
+                       
+                       // aapt resource value: 0x7F080048
+                       public const int expand_activities_button = 2131230792;
+                       
+                       // aapt resource value: 0x7F08004A
+                       public const int fill = 2131230794;
+                       
+                       // aapt resource value: 0x7F08004D
+                       public const int filled = 2131230797;
+                       
+                       // aapt resource value: 0x7F08004B
+                       public const int fill_horizontal = 2131230795;
+                       
+                       // aapt resource value: 0x7F08004C
+                       public const int fill_vertical = 2131230796;
+                       
+                       // aapt resource value: 0x7F08004E
+                       public const int @fixed = 2131230798;
+                       
+                       // aapt resource value: 0x7F08004F
+                       public const int flyoutcontent_appbar = 2131230799;
+                       
+                       // aapt resource value: 0x7F080050
+                       public const int flyoutcontent_recycler = 2131230800;
+                       
+                       // aapt resource value: 0x7F080051
+                       public const int forever = 2131230801;
+                       
+                       // aapt resource value: 0x7F080002
+                       public const int FUNCTION = 2131230722;
+                       
+                       // aapt resource value: 0x7F080052
+                       public const int ghost_view = 2131230802;
+                       
+                       // aapt resource value: 0x7F080053
+                       public const int group_divider = 2131230803;
+                       
+                       // aapt resource value: 0x7F080054
+                       public const int home = 2131230804;
+                       
+                       // aapt resource value: 0x7F080055
+                       public const int homeAsUp = 2131230805;
+                       
+                       // aapt resource value: 0x7F080056
+                       public const int icon = 2131230806;
+                       
+                       // aapt resource value: 0x7F080057
+                       public const int icon_group = 2131230807;
+                       
+                       // aapt resource value: 0x7F080058
+                       public const int ifRoom = 2131230808;
+                       
+                       // aapt resource value: 0x7F080059
+                       public const int image = 2131230809;
+                       
+                       // aapt resource value: 0x7F08005A
+                       public const int info = 2131230810;
+                       
+                       // aapt resource value: 0x7F08005B
+                       public const int italic = 2131230811;
+                       
+                       // aapt resource value: 0x7F08005C
+                       public const int item_touch_helper_previous_elevation = 2131230812;
+                       
+                       // aapt resource value: 0x7F08005D
+                       public const int labeled = 2131230813;
+                       
+                       // aapt resource value: 0x7F08005E
+                       public const int largeLabel = 2131230814;
+                       
+                       // aapt resource value: 0x7F08005F
+                       public const int left = 2131230815;
+                       
+                       // aapt resource value: 0x7F080060
+                       public const int line1 = 2131230816;
+                       
+                       // aapt resource value: 0x7F080061
+                       public const int line3 = 2131230817;
+                       
+                       // aapt resource value: 0x7F080062
+                       public const int listMode = 2131230818;
+                       
+                       // aapt resource value: 0x7F080063
+                       public const int list_item = 2131230819;
+                       
+                       // aapt resource value: 0x7F080064
+                       public const int main_appbar = 2131230820;
+                       
+                       // aapt resource value: 0x7F080065
+                       public const int main_tablayout = 2131230821;
+                       
+                       // aapt resource value: 0x7F080066
+                       public const int main_toolbar = 2131230822;
+                       
+                       // aapt resource value: 0x7F080067
+                       public const int main_viewpager = 2131230823;
+                       
+                       // aapt resource value: 0x7F080068
+                       public const int masked = 2131230824;
+                       
+                       // aapt resource value: 0x7F080069
+                       public const int media_actions = 2131230825;
+                       
+                       // aapt resource value: 0x7F08006A
+                       public const int message = 2131230826;
+                       
+                       // aapt resource value: 0x7F080003
+                       public const int META = 2131230723;
+                       
+                       // aapt resource value: 0x7F08006B
+                       public const int middle = 2131230827;
+                       
+                       // aapt resource value: 0x7F08006C
+                       public const int mini = 2131230828;
+                       
+                       // aapt resource value: 0x7F08006D
+                       public const int mtrl_child_content_container = 2131230829;
+                       
+                       // aapt resource value: 0x7F08006E
+                       public const int mtrl_internal_children_alpha_tag = 2131230830;
+                       
+                       // aapt resource value: 0x7F08006F
+                       public const int multiply = 2131230831;
+                       
+                       // aapt resource value: 0x7F080070
+                       public const int navigation_header_container = 2131230832;
+                       
+                       // aapt resource value: 0x7F080071
+                       public const int never = 2131230833;
+                       
+                       // aapt resource value: 0x7F080072
+                       public const int none = 2131230834;
+                       
+                       // aapt resource value: 0x7F080073
+                       public const int normal = 2131230835;
+                       
+                       // aapt resource value: 0x7F080074
+                       public const int notification_background = 2131230836;
+                       
+                       // aapt resource value: 0x7F080075
+                       public const int notification_main_column = 2131230837;
+                       
+                       // aapt resource value: 0x7F080076
+                       public const int notification_main_column_container = 2131230838;
+                       
+                       // aapt resource value: 0x7F080077
+                       public const int outline = 2131230839;
+                       
+                       // aapt resource value: 0x7F080078
+                       public const int parallax = 2131230840;
+                       
+                       // aapt resource value: 0x7F080079
+                       public const int parentPanel = 2131230841;
+                       
+                       // aapt resource value: 0x7F08007A
+                       public const int parent_matrix = 2131230842;
+                       
+                       // aapt resource value: 0x7F08007B
+                       public const int pin = 2131230843;
+                       
+                       // aapt resource value: 0x7F08007C
+                       public const int progress_circular = 2131230844;
+                       
+                       // aapt resource value: 0x7F08007D
+                       public const int progress_horizontal = 2131230845;
+                       
+                       // aapt resource value: 0x7F08007E
+                       public const int radio = 2131230846;
+                       
+                       // aapt resource value: 0x7F08007F
+                       public const int right = 2131230847;
+                       
+                       // aapt resource value: 0x7F080080
+                       public const int right_icon = 2131230848;
+                       
+                       // aapt resource value: 0x7F080081
+                       public const int right_side = 2131230849;
+                       
+                       // aapt resource value: 0x7F080082
+                       public const int save_image_matrix = 2131230850;
+                       
+                       // aapt resource value: 0x7F080083
+                       public const int save_non_transition_alpha = 2131230851;
+                       
+                       // aapt resource value: 0x7F080084
+                       public const int save_scale_type = 2131230852;
+                       
+                       // aapt resource value: 0x7F080085
+                       public const int screen = 2131230853;
+                       
+                       // aapt resource value: 0x7F080086
+                       public const int scroll = 2131230854;
+                       
+                       // aapt resource value: 0x7F08008A
+                       public const int scrollable = 2131230858;
+                       
+                       // aapt resource value: 0x7F080087
+                       public const int scrollIndicatorDown = 2131230855;
+                       
+                       // aapt resource value: 0x7F080088
+                       public const int scrollIndicatorUp = 2131230856;
+                       
+                       // aapt resource value: 0x7F080089
+                       public const int scrollView = 2131230857;
+                       
+                       // aapt resource value: 0x7F08008B
+                       public const int search_badge = 2131230859;
+                       
+                       // aapt resource value: 0x7F08008C
+                       public const int search_bar = 2131230860;
+                       
+                       // aapt resource value: 0x7F08008D
+                       public const int search_button = 2131230861;
+                       
+                       // aapt resource value: 0x7F08008E
+                       public const int search_close_btn = 2131230862;
+                       
+                       // aapt resource value: 0x7F08008F
+                       public const int search_edit_frame = 2131230863;
+                       
+                       // aapt resource value: 0x7F080090
+                       public const int search_go_btn = 2131230864;
+                       
+                       // aapt resource value: 0x7F080091
+                       public const int search_mag_icon = 2131230865;
+                       
+                       // aapt resource value: 0x7F080092
+                       public const int search_plate = 2131230866;
+                       
+                       // aapt resource value: 0x7F080093
+                       public const int search_src_text = 2131230867;
+                       
+                       // aapt resource value: 0x7F080094
+                       public const int search_voice_btn = 2131230868;
+                       
+                       // aapt resource value: 0x7F080096
+                       public const int selected = 2131230870;
+                       
+                       // aapt resource value: 0x7F080095
+                       public const int select_dialog_listview = 2131230869;
+                       
+                       // aapt resource value: 0x7F080097
+                       public const int shellcontent_appbar = 2131230871;
+                       
+                       // aapt resource value: 0x7F080098
+                       public const int shellcontent_toolbar = 2131230872;
+                       
+                       // aapt resource value: 0x7F080004
+                       public const int SHIFT = 2131230724;
+                       
+                       // aapt resource value: 0x7F080099
+                       public const int shortcut = 2131230873;
+                       
+                       // aapt resource value: 0x7F08009A
+                       public const int showCustom = 2131230874;
+                       
+                       // aapt resource value: 0x7F08009B
+                       public const int showHome = 2131230875;
+                       
+                       // aapt resource value: 0x7F08009C
+                       public const int showTitle = 2131230876;
+                       
+                       // aapt resource value: 0x7F08009D
+                       public const int sliding_tabs = 2131230877;
+                       
+                       // aapt resource value: 0x7F08009E
+                       public const int smallLabel = 2131230878;
+                       
+                       // aapt resource value: 0x7F08009F
+                       public const int snackbar_action = 2131230879;
+                       
+                       // aapt resource value: 0x7F0800A0
+                       public const int snackbar_text = 2131230880;
+                       
+                       // aapt resource value: 0x7F0800A1
+                       public const int snap = 2131230881;
+                       
+                       // aapt resource value: 0x7F0800A2
+                       public const int snapMargins = 2131230882;
+                       
+                       // aapt resource value: 0x7F0800A3
+                       public const int spacer = 2131230883;
+                       
+                       // aapt resource value: 0x7F0800A4
+                       public const int split_action_bar = 2131230884;
+                       
+                       // aapt resource value: 0x7F0800A5
+                       public const int src_atop = 2131230885;
+                       
+                       // aapt resource value: 0x7F0800A6
+                       public const int src_in = 2131230886;
+                       
+                       // aapt resource value: 0x7F0800A7
+                       public const int src_over = 2131230887;
+                       
+                       // aapt resource value: 0x7F0800A8
+                       public const int start = 2131230888;
+                       
+                       // aapt resource value: 0x7F0800A9
+                       public const int status_bar_latest_event_content = 2131230889;
+                       
+                       // aapt resource value: 0x7F0800AA
+                       public const int stretch = 2131230890;
+                       
+                       // aapt resource value: 0x7F0800AB
+                       public const int submenuarrow = 2131230891;
+                       
+                       // aapt resource value: 0x7F0800AC
+                       public const int submit_area = 2131230892;
+                       
+                       // aapt resource value: 0x7F080005
+                       public const int SYM = 2131230725;
+                       
+                       // aapt resource value: 0x7F0800AD
+                       public const int tabMode = 2131230893;
+                       
+                       // aapt resource value: 0x7F0800AE
+                       public const int tag_transition_group = 2131230894;
+                       
+                       // aapt resource value: 0x7F0800AF
+                       public const int tag_unhandled_key_event_manager = 2131230895;
+                       
+                       // aapt resource value: 0x7F0800B0
+                       public const int tag_unhandled_key_listeners = 2131230896;
+                       
+                       // aapt resource value: 0x7F0800B1
+                       public const int text = 2131230897;
+                       
+                       // aapt resource value: 0x7F0800B2
+                       public const int text2 = 2131230898;
+                       
+                       // aapt resource value: 0x7F0800B7
+                       public const int textinput_counter = 2131230903;
+                       
+                       // aapt resource value: 0x7F0800B8
+                       public const int textinput_error = 2131230904;
+                       
+                       // aapt resource value: 0x7F0800B9
+                       public const int textinput_helper_text = 2131230905;
+                       
+                       // aapt resource value: 0x7F0800B3
+                       public const int textSpacerNoButtons = 2131230899;
+                       
+                       // aapt resource value: 0x7F0800B4
+                       public const int textSpacerNoTitle = 2131230900;
+                       
+                       // aapt resource value: 0x7F0800B5
+                       public const int textStart = 2131230901;
+                       
+                       // aapt resource value: 0x7F0800B6
+                       public const int text_input_password_toggle = 2131230902;
+                       
+                       // aapt resource value: 0x7F0800BA
+                       public const int time = 2131230906;
+                       
+                       // aapt resource value: 0x7F0800BB
+                       public const int title = 2131230907;
+                       
+                       // aapt resource value: 0x7F0800BC
+                       public const int titleDividerNoCustom = 2131230908;
+                       
+                       // aapt resource value: 0x7F0800BD
+                       public const int title_template = 2131230909;
+                       
+                       // aapt resource value: 0x7F0800BE
+                       public const int toolbar = 2131230910;
+                       
+                       // aapt resource value: 0x7F0800BF
+                       public const int top = 2131230911;
+                       
+                       // aapt resource value: 0x7F0800C0
+                       public const int topPanel = 2131230912;
+                       
+                       // aapt resource value: 0x7F0800C1
+                       public const int touch_outside = 2131230913;
+                       
+                       // aapt resource value: 0x7F0800C2
+                       public const int transition_current_scene = 2131230914;
+                       
+                       // aapt resource value: 0x7F0800C3
+                       public const int transition_layout_save = 2131230915;
+                       
+                       // aapt resource value: 0x7F0800C4
+                       public const int transition_position = 2131230916;
+                       
+                       // aapt resource value: 0x7F0800C5
+                       public const int transition_scene_layoutid_cache = 2131230917;
+                       
+                       // aapt resource value: 0x7F0800C6
+                       public const int transition_transform = 2131230918;
+                       
+                       // aapt resource value: 0x7F0800C7
+                       public const int uniform = 2131230919;
+                       
+                       // aapt resource value: 0x7F0800C8
+                       public const int unlabeled = 2131230920;
+                       
+                       // aapt resource value: 0x7F0800C9
+                       public const int up = 2131230921;
+                       
+                       // aapt resource value: 0x7F0800CA
+                       public const int useLogo = 2131230922;
+                       
+                       // aapt resource value: 0x7F0800CB
+                       public const int view_offset_helper = 2131230923;
+                       
+                       // aapt resource value: 0x7F0800CC
+                       public const int visible = 2131230924;
+                       
+                       // aapt resource value: 0x7F0800CD
+                       public const int withText = 2131230925;
+                       
+                       // aapt resource value: 0x7F0800CE
+                       public const int wrap_content = 2131230926;
+                       
+                       static Id()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Id()
+                       {
+                       }
+               }
+               
+               public partial class Integer
+               {
+                       
+                       // aapt resource value: 0x7F090000
+                       public const int abc_config_activityDefaultDur = 2131296256;
+                       
+                       // aapt resource value: 0x7F090001
+                       public const int abc_config_activityShortDur = 2131296257;
+                       
+                       // aapt resource value: 0x7F090002
+                       public const int app_bar_elevation_anim_duration = 2131296258;
+                       
+                       // aapt resource value: 0x7F090003
+                       public const int bottom_sheet_slide_duration = 2131296259;
+                       
+                       // aapt resource value: 0x7F090004
+                       public const int cancel_button_image_alpha = 2131296260;
+                       
+                       // aapt resource value: 0x7F090005
+                       public const int config_tooltipAnimTime = 2131296261;
+                       
+                       // aapt resource value: 0x7F090006
+                       public const int design_snackbar_text_max_lines = 2131296262;
+                       
+                       // aapt resource value: 0x7F090007
+                       public const int design_tab_indicator_anim_duration_ms = 2131296263;
+                       
+                       // aapt resource value: 0x7F090008
+                       public const int hide_password_duration = 2131296264;
+                       
+                       // aapt resource value: 0x7F090009
+                       public const int mtrl_btn_anim_delay_ms = 2131296265;
+                       
+                       // aapt resource value: 0x7F09000A
+                       public const int mtrl_btn_anim_duration_ms = 2131296266;
+                       
+                       // aapt resource value: 0x7F09000B
+                       public const int mtrl_chip_anim_duration = 2131296267;
+                       
+                       // aapt resource value: 0x7F09000C
+                       public const int mtrl_tab_indicator_anim_duration_ms = 2131296268;
+                       
+                       // aapt resource value: 0x7F09000D
+                       public const int show_password_duration = 2131296269;
+                       
+                       // aapt resource value: 0x7F09000E
+                       public const int status_bar_notification_info_maxnum = 2131296270;
+                       
+                       static Integer()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Integer()
+                       {
+                       }
+               }
+               
+               public partial class Interpolator
+               {
+                       
+                       // aapt resource value: 0x7F0A0000
+                       public const int mtrl_fast_out_linear_in = 2131361792;
+                       
+                       // aapt resource value: 0x7F0A0001
+                       public const int mtrl_fast_out_slow_in = 2131361793;
+                       
+                       // aapt resource value: 0x7F0A0002
+                       public const int mtrl_linear = 2131361794;
+                       
+                       // aapt resource value: 0x7F0A0003
+                       public const int mtrl_linear_out_slow_in = 2131361795;
+                       
+                       static Interpolator()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Interpolator()
+                       {
+                       }
+               }
+               
+               public partial class Layout
+               {
+                       
+                       // aapt resource value: 0x7F0B0000
+                       public const int abc_action_bar_title_item = 2131427328;
+                       
+                       // aapt resource value: 0x7F0B0001
+                       public const int abc_action_bar_up_container = 2131427329;
+                       
+                       // aapt resource value: 0x7F0B0002
+                       public const int abc_action_menu_item_layout = 2131427330;
+                       
+                       // aapt resource value: 0x7F0B0003
+                       public const int abc_action_menu_layout = 2131427331;
+                       
+                       // aapt resource value: 0x7F0B0004
+                       public const int abc_action_mode_bar = 2131427332;
+                       
+                       // aapt resource value: 0x7F0B0005
+                       public const int abc_action_mode_close_item_material = 2131427333;
+                       
+                       // aapt resource value: 0x7F0B0006
+                       public const int abc_activity_chooser_view = 2131427334;
+                       
+                       // aapt resource value: 0x7F0B0007
+                       public const int abc_activity_chooser_view_list_item = 2131427335;
+                       
+                       // aapt resource value: 0x7F0B0008
+                       public const int abc_alert_dialog_button_bar_material = 2131427336;
+                       
+                       // aapt resource value: 0x7F0B0009
+                       public const int abc_alert_dialog_material = 2131427337;
+                       
+                       // aapt resource value: 0x7F0B000A
+                       public const int abc_alert_dialog_title_material = 2131427338;
+                       
+                       // aapt resource value: 0x7F0B000B
+                       public const int abc_cascading_menu_item_layout = 2131427339;
+                       
+                       // aapt resource value: 0x7F0B000C
+                       public const int abc_dialog_title_material = 2131427340;
+                       
+                       // aapt resource value: 0x7F0B000D
+                       public const int abc_expanded_menu_layout = 2131427341;
+                       
+                       // aapt resource value: 0x7F0B000E
+                       public const int abc_list_menu_item_checkbox = 2131427342;
+                       
+                       // aapt resource value: 0x7F0B000F
+                       public const int abc_list_menu_item_icon = 2131427343;
+                       
+                       // aapt resource value: 0x7F0B0010
+                       public const int abc_list_menu_item_layout = 2131427344;
+                       
+                       // aapt resource value: 0x7F0B0011
+                       public const int abc_list_menu_item_radio = 2131427345;
+                       
+                       // aapt resource value: 0x7F0B0012
+                       public const int abc_popup_menu_header_item_layout = 2131427346;
+                       
+                       // aapt resource value: 0x7F0B0013
+                       public const int abc_popup_menu_item_layout = 2131427347;
+                       
+                       // aapt resource value: 0x7F0B0014
+                       public const int abc_screen_content_include = 2131427348;
+                       
+                       // aapt resource value: 0x7F0B0015
+                       public const int abc_screen_simple = 2131427349;
+                       
+                       // aapt resource value: 0x7F0B0016
+                       public const int abc_screen_simple_overlay_action_mode = 2131427350;
+                       
+                       // aapt resource value: 0x7F0B0017
+                       public const int abc_screen_toolbar = 2131427351;
+                       
+                       // aapt resource value: 0x7F0B0018
+                       public const int abc_search_dropdown_item_icons_2line = 2131427352;
+                       
+                       // aapt resource value: 0x7F0B0019
+                       public const int abc_search_view = 2131427353;
+                       
+                       // aapt resource value: 0x7F0B001A
+                       public const int abc_select_dialog_material = 2131427354;
+                       
+                       // aapt resource value: 0x7F0B001B
+                       public const int abc_tooltip = 2131427355;
+                       
+                       // aapt resource value: 0x7F0B001C
+                       public const int BottomTabLayout = 2131427356;
+                       
+                       // aapt resource value: 0x7F0B001D
+                       public const int browser_actions_context_menu_page = 2131427357;
+                       
+                       // aapt resource value: 0x7F0B001E
+                       public const int browser_actions_context_menu_row = 2131427358;
+                       
+                       // aapt resource value: 0x7F0B001F
+                       public const int design_bottom_navigation_item = 2131427359;
+                       
+                       // aapt resource value: 0x7F0B0020
+                       public const int design_bottom_sheet_dialog = 2131427360;
+                       
+                       // aapt resource value: 0x7F0B0021
+                       public const int design_layout_snackbar = 2131427361;
+                       
+                       // aapt resource value: 0x7F0B0022
+                       public const int design_layout_snackbar_include = 2131427362;
+                       
+                       // aapt resource value: 0x7F0B0023
+                       public const int design_layout_tab_icon = 2131427363;
+                       
+                       // aapt resource value: 0x7F0B0024
+                       public const int design_layout_tab_text = 2131427364;
+                       
+                       // aapt resource value: 0x7F0B0025
+                       public const int design_menu_item_action_area = 2131427365;
+                       
+                       // aapt resource value: 0x7F0B0026
+                       public const int design_navigation_item = 2131427366;
+                       
+                       // aapt resource value: 0x7F0B0027
+                       public const int design_navigation_item_header = 2131427367;
+                       
+                       // aapt resource value: 0x7F0B0028
+                       public const int design_navigation_item_separator = 2131427368;
+                       
+                       // aapt resource value: 0x7F0B0029
+                       public const int design_navigation_item_subheader = 2131427369;
+                       
+                       // aapt resource value: 0x7F0B002A
+                       public const int design_navigation_menu = 2131427370;
+                       
+                       // aapt resource value: 0x7F0B002B
+                       public const int design_navigation_menu_item = 2131427371;
+                       
+                       // aapt resource value: 0x7F0B002C
+                       public const int design_text_input_password_icon = 2131427372;
+                       
+                       // aapt resource value: 0x7F0B002D
+                       public const int FlyoutContent = 2131427373;
+                       
+                       // aapt resource value: 0x7F0B002E
+                       public const int mtrl_layout_snackbar = 2131427374;
+                       
+                       // aapt resource value: 0x7F0B002F
+                       public const int mtrl_layout_snackbar_include = 2131427375;
+                       
+                       // aapt resource value: 0x7F0B0030
+                       public const int notification_action = 2131427376;
+                       
+                       // aapt resource value: 0x7F0B0031
+                       public const int notification_action_tombstone = 2131427377;
+                       
+                       // aapt resource value: 0x7F0B0032
+                       public const int notification_media_action = 2131427378;
+                       
+                       // aapt resource value: 0x7F0B0033
+                       public const int notification_media_cancel_action = 2131427379;
+                       
+                       // aapt resource value: 0x7F0B0034
+                       public const int notification_template_big_media = 2131427380;
+                       
+                       // aapt resource value: 0x7F0B0035
+                       public const int notification_template_big_media_custom = 2131427381;
+                       
+                       // aapt resource value: 0x7F0B0036
+                       public const int notification_template_big_media_narrow = 2131427382;
+                       
+                       // aapt resource value: 0x7F0B0037
+                       public const int notification_template_big_media_narrow_custom = 2131427383;
+                       
+                       // aapt resource value: 0x7F0B0038
+                       public const int notification_template_custom_big = 2131427384;
+                       
+                       // aapt resource value: 0x7F0B0039
+                       public const int notification_template_icon_group = 2131427385;
+                       
+                       // aapt resource value: 0x7F0B003A
+                       public const int notification_template_lines_media = 2131427386;
+                       
+                       // aapt resource value: 0x7F0B003B
+                       public const int notification_template_media = 2131427387;
+                       
+                       // aapt resource value: 0x7F0B003C
+                       public const int notification_template_media_custom = 2131427388;
+                       
+                       // aapt resource value: 0x7F0B003D
+                       public const int notification_template_part_chronometer = 2131427389;
+                       
+                       // aapt resource value: 0x7F0B003E
+                       public const int notification_template_part_time = 2131427390;
+                       
+                       // aapt resource value: 0x7F0B003F
+                       public const int RootLayout = 2131427391;
+                       
+                       // aapt resource value: 0x7F0B0040
+                       public const int select_dialog_item_material = 2131427392;
+                       
+                       // aapt resource value: 0x7F0B0041
+                       public const int select_dialog_multichoice_material = 2131427393;
+                       
+                       // aapt resource value: 0x7F0B0042
+                       public const int select_dialog_singlechoice_material = 2131427394;
+                       
+                       // aapt resource value: 0x7F0B0043
+                       public const int ShellContent = 2131427395;
+                       
+                       // aapt resource value: 0x7F0B0044
+                       public const int support_simple_spinner_dropdown_item = 2131427396;
+                       
+                       // aapt resource value: 0x7F0B0045
+                       public const int Tabbar = 2131427397;
+                       
+                       // aapt resource value: 0x7F0B0046
+                       public const int Toolbar = 2131427398;
+                       
+                       static Layout()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Layout()
+                       {
+                       }
+               }
+               
+               public partial class Mipmap
+               {
+                       
+                       // aapt resource value: 0x7F0C0000
+                       public const int icon = 2131492864;
+                       
+                       // aapt resource value: 0x7F0C0001
+                       public const int icon_round = 2131492865;
+                       
+                       // aapt resource value: 0x7F0C0002
+                       public const int launcher_foreground = 2131492866;
+                       
+                       static Mipmap()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Mipmap()
+                       {
+                       }
+               }
+               
+               public partial class String
+               {
+                       
+                       // aapt resource value: 0x7F0D0000
+                       public const int abc_action_bar_home_description = 2131558400;
+                       
+                       // aapt resource value: 0x7F0D0001
+                       public const int abc_action_bar_up_description = 2131558401;
+                       
+                       // aapt resource value: 0x7F0D0002
+                       public const int abc_action_menu_overflow_description = 2131558402;
+                       
+                       // aapt resource value: 0x7F0D0003
+                       public const int abc_action_mode_done = 2131558403;
+                       
+                       // aapt resource value: 0x7F0D0005
+                       public const int abc_activitychooserview_choose_application = 2131558405;
+                       
+                       // aapt resource value: 0x7F0D0004
+                       public const int abc_activity_chooser_view_see_all = 2131558404;
+                       
+                       // aapt resource value: 0x7F0D0006
+                       public const int abc_capital_off = 2131558406;
+                       
+                       // aapt resource value: 0x7F0D0007
+                       public const int abc_capital_on = 2131558407;
+                       
+                       // aapt resource value: 0x7F0D0008
+                       public const int abc_font_family_body_1_material = 2131558408;
+                       
+                       // aapt resource value: 0x7F0D0009
+                       public const int abc_font_family_body_2_material = 2131558409;
+                       
+                       // aapt resource value: 0x7F0D000A
+                       public const int abc_font_family_button_material = 2131558410;
+                       
+                       // aapt resource value: 0x7F0D000B
+                       public const int abc_font_family_caption_material = 2131558411;
+                       
+                       // aapt resource value: 0x7F0D000C
+                       public const int abc_font_family_display_1_material = 2131558412;
+                       
+                       // aapt resource value: 0x7F0D000D
+                       public const int abc_font_family_display_2_material = 2131558413;
+                       
+                       // aapt resource value: 0x7F0D000E
+                       public const int abc_font_family_display_3_material = 2131558414;
+                       
+                       // aapt resource value: 0x7F0D000F
+                       public const int abc_font_family_display_4_material = 2131558415;
+                       
+                       // aapt resource value: 0x7F0D0010
+                       public const int abc_font_family_headline_material = 2131558416;
+                       
+                       // aapt resource value: 0x7F0D0011
+                       public const int abc_font_family_menu_material = 2131558417;
+                       
+                       // aapt resource value: 0x7F0D0012
+                       public const int abc_font_family_subhead_material = 2131558418;
+                       
+                       // aapt resource value: 0x7F0D0013
+                       public const int abc_font_family_title_material = 2131558419;
+                       
+                       // aapt resource value: 0x7F0D0014
+                       public const int abc_menu_alt_shortcut_label = 2131558420;
+                       
+                       // aapt resource value: 0x7F0D0015
+                       public const int abc_menu_ctrl_shortcut_label = 2131558421;
+                       
+                       // aapt resource value: 0x7F0D0016
+                       public const int abc_menu_delete_shortcut_label = 2131558422;
+                       
+                       // aapt resource value: 0x7F0D0017
+                       public const int abc_menu_enter_shortcut_label = 2131558423;
+                       
+                       // aapt resource value: 0x7F0D0018
+                       public const int abc_menu_function_shortcut_label = 2131558424;
+                       
+                       // aapt resource value: 0x7F0D0019
+                       public const int abc_menu_meta_shortcut_label = 2131558425;
+                       
+                       // aapt resource value: 0x7F0D001A
+                       public const int abc_menu_shift_shortcut_label = 2131558426;
+                       
+                       // aapt resource value: 0x7F0D001B
+                       public const int abc_menu_space_shortcut_label = 2131558427;
+                       
+                       // aapt resource value: 0x7F0D001C
+                       public const int abc_menu_sym_shortcut_label = 2131558428;
+                       
+                       // aapt resource value: 0x7F0D001D
+                       public const int abc_prepend_shortcut_label = 2131558429;
+                       
+                       // aapt resource value: 0x7F0D001F
+                       public const int abc_searchview_description_clear = 2131558431;
+                       
+                       // aapt resource value: 0x7F0D0020
+                       public const int abc_searchview_description_query = 2131558432;
+                       
+                       // aapt resource value: 0x7F0D0021
+                       public const int abc_searchview_description_search = 2131558433;
+                       
+                       // aapt resource value: 0x7F0D0022
+                       public const int abc_searchview_description_submit = 2131558434;
+                       
+                       // aapt resource value: 0x7F0D0023
+                       public const int abc_searchview_description_voice = 2131558435;
+                       
+                       // aapt resource value: 0x7F0D001E
+                       public const int abc_search_hint = 2131558430;
+                       
+                       // aapt resource value: 0x7F0D0024
+                       public const int abc_shareactionprovider_share_with = 2131558436;
+                       
+                       // aapt resource value: 0x7F0D0025
+                       public const int abc_shareactionprovider_share_with_application = 2131558437;
+                       
+                       // aapt resource value: 0x7F0D0026
+                       public const int abc_toolbar_collapse_description = 2131558438;
+                       
+                       // aapt resource value: 0x7F0D0027
+                       public const int appbar_scrolling_view_behavior = 2131558439;
+                       
+                       // aapt resource value: 0x7F0D0028
+                       public const int bottom_sheet_behavior = 2131558440;
+                       
+                       // aapt resource value: 0x7F0D0029
+                       public const int character_counter_content_description = 2131558441;
+                       
+                       // aapt resource value: 0x7F0D002A
+                       public const int character_counter_pattern = 2131558442;
+                       
+                       // aapt resource value: 0x7F0D002B
+                       public const int fab_transformation_scrim_behavior = 2131558443;
+                       
+                       // aapt resource value: 0x7F0D002C
+                       public const int fab_transformation_sheet_behavior = 2131558444;
+                       
+                       // aapt resource value: 0x7F0D002D
+                       public const int hide_bottom_view_on_scroll_behavior = 2131558445;
+                       
+                       // aapt resource value: 0x7F0D002E
+                       public const int mtrl_chip_close_icon_content_description = 2131558446;
+                       
+                       // aapt resource value: 0x7F0D002F
+                       public const int password_toggle_content_description = 2131558447;
+                       
+                       // aapt resource value: 0x7F0D0030
+                       public const int path_password_eye = 2131558448;
+                       
+                       // aapt resource value: 0x7F0D0031
+                       public const int path_password_eye_mask_strike_through = 2131558449;
+                       
+                       // aapt resource value: 0x7F0D0032
+                       public const int path_password_eye_mask_visible = 2131558450;
+                       
+                       // aapt resource value: 0x7F0D0033
+                       public const int path_password_strike_through = 2131558451;
+                       
+                       // aapt resource value: 0x7F0D0034
+                       public const int search_menu_title = 2131558452;
+                       
+                       // aapt resource value: 0x7F0D0035
+                       public const int status_bar_notification_info_overflow = 2131558453;
+                       
+                       static String()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private String()
+                       {
+                       }
+               }
+               
+               public partial class Style
+               {
+                       
+                       // aapt resource value: 0x7F0E0000
+                       public const int AlertDialog_AppCompat = 2131623936;
+                       
+                       // aapt resource value: 0x7F0E0001
+                       public const int AlertDialog_AppCompat_Light = 2131623937;
+                       
+                       // aapt resource value: 0x7F0E0002
+                       public const int Animation_AppCompat_Dialog = 2131623938;
+                       
+                       // aapt resource value: 0x7F0E0003
+                       public const int Animation_AppCompat_DropDownUp = 2131623939;
+                       
+                       // aapt resource value: 0x7F0E0004
+                       public const int Animation_AppCompat_Tooltip = 2131623940;
+                       
+                       // aapt resource value: 0x7F0E0005
+                       public const int Animation_Design_BottomSheetDialog = 2131623941;
+                       
+                       // aapt resource value: 0x7F0E0006
+                       public const int AppCompatDialogStyle = 2131623942;
+                       
+                       // aapt resource value: 0x7F0E0007
+                       public const int Base_AlertDialog_AppCompat = 2131623943;
+                       
+                       // aapt resource value: 0x7F0E0008
+                       public const int Base_AlertDialog_AppCompat_Light = 2131623944;
+                       
+                       // aapt resource value: 0x7F0E0009
+                       public const int Base_Animation_AppCompat_Dialog = 2131623945;
+                       
+                       // aapt resource value: 0x7F0E000A
+                       public const int Base_Animation_AppCompat_DropDownUp = 2131623946;
+                       
+                       // aapt resource value: 0x7F0E000B
+                       public const int Base_Animation_AppCompat_Tooltip = 2131623947;
+                       
+                       // aapt resource value: 0x7F0E000C
+                       public const int Base_CardView = 2131623948;
+                       
+                       // aapt resource value: 0x7F0E000E
+                       public const int Base_DialogWindowTitleBackground_AppCompat = 2131623950;
+                       
+                       // aapt resource value: 0x7F0E000D
+                       public const int Base_DialogWindowTitle_AppCompat = 2131623949;
+                       
+                       // aapt resource value: 0x7F0E000F
+                       public const int Base_TextAppearance_AppCompat = 2131623951;
+                       
+                       // aapt resource value: 0x7F0E0010
+                       public const int Base_TextAppearance_AppCompat_Body1 = 2131623952;
+                       
+                       // aapt resource value: 0x7F0E0011
+                       public const int Base_TextAppearance_AppCompat_Body2 = 2131623953;
+                       
+                       // aapt resource value: 0x7F0E0012
+                       public const int Base_TextAppearance_AppCompat_Button = 2131623954;
+                       
+                       // aapt resource value: 0x7F0E0013
+                       public const int Base_TextAppearance_AppCompat_Caption = 2131623955;
+                       
+                       // aapt resource value: 0x7F0E0014
+                       public const int Base_TextAppearance_AppCompat_Display1 = 2131623956;
+                       
+                       // aapt resource value: 0x7F0E0015
+                       public const int Base_TextAppearance_AppCompat_Display2 = 2131623957;
+                       
+                       // aapt resource value: 0x7F0E0016
+                       public const int Base_TextAppearance_AppCompat_Display3 = 2131623958;
+                       
+                       // aapt resource value: 0x7F0E0017
+                       public const int Base_TextAppearance_AppCompat_Display4 = 2131623959;
+                       
+                       // aapt resource value: 0x7F0E0018
+                       public const int Base_TextAppearance_AppCompat_Headline = 2131623960;
+                       
+                       // aapt resource value: 0x7F0E0019
+                       public const int Base_TextAppearance_AppCompat_Inverse = 2131623961;
+                       
+                       // aapt resource value: 0x7F0E001A
+                       public const int Base_TextAppearance_AppCompat_Large = 2131623962;
+                       
+                       // aapt resource value: 0x7F0E001B
+                       public const int Base_TextAppearance_AppCompat_Large_Inverse = 2131623963;
+                       
+                       // aapt resource value: 0x7F0E001C
+                       public const int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large = 2131623964;
+                       
+                       // aapt resource value: 0x7F0E001D
+                       public const int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small = 2131623965;
+                       
+                       // aapt resource value: 0x7F0E001E
+                       public const int Base_TextAppearance_AppCompat_Medium = 2131623966;
+                       
+                       // aapt resource value: 0x7F0E001F
+                       public const int Base_TextAppearance_AppCompat_Medium_Inverse = 2131623967;
+                       
+                       // aapt resource value: 0x7F0E0020
+                       public const int Base_TextAppearance_AppCompat_Menu = 2131623968;
+                       
+                       // aapt resource value: 0x7F0E0021
+                       public const int Base_TextAppearance_AppCompat_SearchResult = 2131623969;
+                       
+                       // aapt resource value: 0x7F0E0022
+                       public const int Base_TextAppearance_AppCompat_SearchResult_Subtitle = 2131623970;
+                       
+                       // aapt resource value: 0x7F0E0023
+                       public const int Base_TextAppearance_AppCompat_SearchResult_Title = 2131623971;
+                       
+                       // aapt resource value: 0x7F0E0024
+                       public const int Base_TextAppearance_AppCompat_Small = 2131623972;
+                       
+                       // aapt resource value: 0x7F0E0025
+                       public const int Base_TextAppearance_AppCompat_Small_Inverse = 2131623973;
+                       
+                       // aapt resource value: 0x7F0E0026
+                       public const int Base_TextAppearance_AppCompat_Subhead = 2131623974;
+                       
+                       // aapt resource value: 0x7F0E0027
+                       public const int Base_TextAppearance_AppCompat_Subhead_Inverse = 2131623975;
+                       
+                       // aapt resource value: 0x7F0E0028
+                       public const int Base_TextAppearance_AppCompat_Title = 2131623976;
+                       
+                       // aapt resource value: 0x7F0E0029
+                       public const int Base_TextAppearance_AppCompat_Title_Inverse = 2131623977;
+                       
+                       // aapt resource value: 0x7F0E002A
+                       public const int Base_TextAppearance_AppCompat_Tooltip = 2131623978;
+                       
+                       // aapt resource value: 0x7F0E002B
+                       public const int Base_TextAppearance_AppCompat_Widget_ActionBar_Menu = 2131623979;
+                       
+                       // aapt resource value: 0x7F0E002C
+                       public const int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle = 2131623980;
+                       
+                       // aapt resource value: 0x7F0E002D
+                       public const int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse = 2131623981;
+                       
+                       // aapt resource value: 0x7F0E002E
+                       public const int Base_TextAppearance_AppCompat_Widget_ActionBar_Title = 2131623982;
+                       
+                       // aapt resource value: 0x7F0E002F
+                       public const int Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse = 2131623983;
+                       
+                       // aapt resource value: 0x7F0E0030
+                       public const int Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle = 2131623984;
+                       
+                       // aapt resource value: 0x7F0E0031
+                       public const int Base_TextAppearance_AppCompat_Widget_ActionMode_Title = 2131623985;
+                       
+                       // aapt resource value: 0x7F0E0032
+                       public const int Base_TextAppearance_AppCompat_Widget_Button = 2131623986;
+                       
+                       // aapt resource value: 0x7F0E0033
+                       public const int Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored = 2131623987;
+                       
+                       // aapt resource value: 0x7F0E0034
+                       public const int Base_TextAppearance_AppCompat_Widget_Button_Colored = 2131623988;
+                       
+                       // aapt resource value: 0x7F0E0035
+                       public const int Base_TextAppearance_AppCompat_Widget_Button_Inverse = 2131623989;
+                       
+                       // aapt resource value: 0x7F0E0036
+                       public const int Base_TextAppearance_AppCompat_Widget_DropDownItem = 2131623990;
+                       
+                       // aapt resource value: 0x7F0E0037
+                       public const int Base_TextAppearance_AppCompat_Widget_PopupMenu_Header = 2131623991;
+                       
+                       // aapt resource value: 0x7F0E0038
+                       public const int Base_TextAppearance_AppCompat_Widget_PopupMenu_Large = 2131623992;
+                       
+                       // aapt resource value: 0x7F0E0039
+                       public const int Base_TextAppearance_AppCompat_Widget_PopupMenu_Small = 2131623993;
+                       
+                       // aapt resource value: 0x7F0E003A
+                       public const int Base_TextAppearance_AppCompat_Widget_Switch = 2131623994;
+                       
+                       // aapt resource value: 0x7F0E003B
+                       public const int Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem = 2131623995;
+                       
+                       // aapt resource value: 0x7F0E003C
+                       public const int Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item = 2131623996;
+                       
+                       // aapt resource value: 0x7F0E003D
+                       public const int Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle = 2131623997;
+                       
+                       // aapt resource value: 0x7F0E003E
+                       public const int Base_TextAppearance_Widget_AppCompat_Toolbar_Title = 2131623998;
+                       
+                       // aapt resource value: 0x7F0E005E
+                       public const int Base_ThemeOverlay_AppCompat = 2131624030;
+                       
+                       // aapt resource value: 0x7F0E005F
+                       public const int Base_ThemeOverlay_AppCompat_ActionBar = 2131624031;
+                       
+                       // aapt resource value: 0x7F0E0060
+                       public const int Base_ThemeOverlay_AppCompat_Dark = 2131624032;
+                       
+                       // aapt resource value: 0x7F0E0061
+                       public const int Base_ThemeOverlay_AppCompat_Dark_ActionBar = 2131624033;
+                       
+                       // aapt resource value: 0x7F0E0062
+                       public const int Base_ThemeOverlay_AppCompat_Dialog = 2131624034;
+                       
+                       // aapt resource value: 0x7F0E0063
+                       public const int Base_ThemeOverlay_AppCompat_Dialog_Alert = 2131624035;
+                       
+                       // aapt resource value: 0x7F0E0064
+                       public const int Base_ThemeOverlay_AppCompat_Light = 2131624036;
+                       
+                       // aapt resource value: 0x7F0E0065
+                       public const int Base_ThemeOverlay_MaterialComponents_Dialog = 2131624037;
+                       
+                       // aapt resource value: 0x7F0E0066
+                       public const int Base_ThemeOverlay_MaterialComponents_Dialog_Alert = 2131624038;
+                       
+                       // aapt resource value: 0x7F0E003F
+                       public const int Base_Theme_AppCompat = 2131623999;
+                       
+                       // aapt resource value: 0x7F0E0040
+                       public const int Base_Theme_AppCompat_CompactMenu = 2131624000;
+                       
+                       // aapt resource value: 0x7F0E0041
+                       public const int Base_Theme_AppCompat_Dialog = 2131624001;
+                       
+                       // aapt resource value: 0x7F0E0045
+                       public const int Base_Theme_AppCompat_DialogWhenLarge = 2131624005;
+                       
+                       // aapt resource value: 0x7F0E0042
+                       public const int Base_Theme_AppCompat_Dialog_Alert = 2131624002;
+                       
+                       // aapt resource value: 0x7F0E0043
+                       public const int Base_Theme_AppCompat_Dialog_FixedSize = 2131624003;
+                       
+                       // aapt resource value: 0x7F0E0044
+                       public const int Base_Theme_AppCompat_Dialog_MinWidth = 2131624004;
+                       
+                       // aapt resource value: 0x7F0E0046
+                       public const int Base_Theme_AppCompat_Light = 2131624006;
+                       
+                       // aapt resource value: 0x7F0E0047
+                       public const int Base_Theme_AppCompat_Light_DarkActionBar = 2131624007;
+                       
+                       // aapt resource value: 0x7F0E0048
+                       public const int Base_Theme_AppCompat_Light_Dialog = 2131624008;
+                       
+                       // aapt resource value: 0x7F0E004C
+                       public const int Base_Theme_AppCompat_Light_DialogWhenLarge = 2131624012;
+                       
+                       // aapt resource value: 0x7F0E0049
+                       public const int Base_Theme_AppCompat_Light_Dialog_Alert = 2131624009;
+                       
+                       // aapt resource value: 0x7F0E004A
+                       public const int Base_Theme_AppCompat_Light_Dialog_FixedSize = 2131624010;
+                       
+                       // aapt resource value: 0x7F0E004B
+                       public const int Base_Theme_AppCompat_Light_Dialog_MinWidth = 2131624011;
+                       
+                       // aapt resource value: 0x7F0E004D
+                       public const int Base_Theme_MaterialComponents = 2131624013;
+                       
+                       // aapt resource value: 0x7F0E004E
+                       public const int Base_Theme_MaterialComponents_Bridge = 2131624014;
+                       
+                       // aapt resource value: 0x7F0E004F
+                       public const int Base_Theme_MaterialComponents_CompactMenu = 2131624015;
+                       
+                       // aapt resource value: 0x7F0E0050
+                       public const int Base_Theme_MaterialComponents_Dialog = 2131624016;
+                       
+                       // aapt resource value: 0x7F0E0054
+                       public const int Base_Theme_MaterialComponents_DialogWhenLarge = 2131624020;
+                       
+                       // aapt resource value: 0x7F0E0051
+                       public const int Base_Theme_MaterialComponents_Dialog_Alert = 2131624017;
+                       
+                       // aapt resource value: 0x7F0E0052
+                       public const int Base_Theme_MaterialComponents_Dialog_FixedSize = 2131624018;
+                       
+                       // aapt resource value: 0x7F0E0053
+                       public const int Base_Theme_MaterialComponents_Dialog_MinWidth = 2131624019;
+                       
+                       // aapt resource value: 0x7F0E0055
+                       public const int Base_Theme_MaterialComponents_Light = 2131624021;
+                       
+                       // aapt resource value: 0x7F0E0056
+                       public const int Base_Theme_MaterialComponents_Light_Bridge = 2131624022;
+                       
+                       // aapt resource value: 0x7F0E0057
+                       public const int Base_Theme_MaterialComponents_Light_DarkActionBar = 2131624023;
+                       
+                       // aapt resource value: 0x7F0E0058
+                       public const int Base_Theme_MaterialComponents_Light_DarkActionBar_Bridge = 2131624024;
+                       
+                       // aapt resource value: 0x7F0E0059
+                       public const int Base_Theme_MaterialComponents_Light_Dialog = 2131624025;
+                       
+                       // aapt resource value: 0x7F0E005D
+                       public const int Base_Theme_MaterialComponents_Light_DialogWhenLarge = 2131624029;
+                       
+                       // aapt resource value: 0x7F0E005A
+                       public const int Base_Theme_MaterialComponents_Light_Dialog_Alert = 2131624026;
+                       
+                       // aapt resource value: 0x7F0E005B
+                       public const int Base_Theme_MaterialComponents_Light_Dialog_FixedSize = 2131624027;
+                       
+                       // aapt resource value: 0x7F0E005C
+                       public const int Base_Theme_MaterialComponents_Light_Dialog_MinWidth = 2131624028;
+                       
+                       // aapt resource value: 0x7F0E006E
+                       public const int Base_V14_ThemeOverlay_MaterialComponents_Dialog = 2131624046;
+                       
+                       // aapt resource value: 0x7F0E006F
+                       public const int Base_V14_ThemeOverlay_MaterialComponents_Dialog_Alert = 2131624047;
+                       
+                       // aapt resource value: 0x7F0E0067
+                       public const int Base_V14_Theme_MaterialComponents = 2131624039;
+                       
+                       // aapt resource value: 0x7F0E0068
+                       public const int Base_V14_Theme_MaterialComponents_Bridge = 2131624040;
+                       
+                       // aapt resource value: 0x7F0E0069
+                       public const int Base_V14_Theme_MaterialComponents_Dialog = 2131624041;
+                       
+                       // aapt resource value: 0x7F0E006A
+                       public const int Base_V14_Theme_MaterialComponents_Light = 2131624042;
+                       
+                       // aapt resource value: 0x7F0E006B
+                       public const int Base_V14_Theme_MaterialComponents_Light_Bridge = 2131624043;
+                       
+                       // aapt resource value: 0x7F0E006C
+                       public const int Base_V14_Theme_MaterialComponents_Light_DarkActionBar_Bridge = 2131624044;
+                       
+                       // aapt resource value: 0x7F0E006D
+                       public const int Base_V14_Theme_MaterialComponents_Light_Dialog = 2131624045;
+                       
+                       // aapt resource value: 0x7F0E0074
+                       public const int Base_V21_ThemeOverlay_AppCompat_Dialog = 2131624052;
+                       
+                       // aapt resource value: 0x7F0E0070
+                       public const int Base_V21_Theme_AppCompat = 2131624048;
+                       
+                       // aapt resource value: 0x7F0E0071
+                       public const int Base_V21_Theme_AppCompat_Dialog = 2131624049;
+                       
+                       // aapt resource value: 0x7F0E0072
+                       public const int Base_V21_Theme_AppCompat_Light = 2131624050;
+                       
+                       // aapt resource value: 0x7F0E0073
+                       public const int Base_V21_Theme_AppCompat_Light_Dialog = 2131624051;
+                       
+                       // aapt resource value: 0x7F0E0075
+                       public const int Base_V22_Theme_AppCompat = 2131624053;
+                       
+                       // aapt resource value: 0x7F0E0076
+                       public const int Base_V22_Theme_AppCompat_Light = 2131624054;
+                       
+                       // aapt resource value: 0x7F0E0077
+                       public const int Base_V23_Theme_AppCompat = 2131624055;
+                       
+                       // aapt resource value: 0x7F0E0078
+                       public const int Base_V23_Theme_AppCompat_Light = 2131624056;
+                       
+                       // aapt resource value: 0x7F0E0079
+                       public const int Base_V26_Theme_AppCompat = 2131624057;
+                       
+                       // aapt resource value: 0x7F0E007A
+                       public const int Base_V26_Theme_AppCompat_Light = 2131624058;
+                       
+                       // aapt resource value: 0x7F0E007B
+                       public const int Base_V26_Widget_AppCompat_Toolbar = 2131624059;
+                       
+                       // aapt resource value: 0x7F0E007C
+                       public const int Base_V28_Theme_AppCompat = 2131624060;
+                       
+                       // aapt resource value: 0x7F0E007D
+                       public const int Base_V28_Theme_AppCompat_Light = 2131624061;
+                       
+                       // aapt resource value: 0x7F0E0082
+                       public const int Base_V7_ThemeOverlay_AppCompat_Dialog = 2131624066;
+                       
+                       // aapt resource value: 0x7F0E007E
+                       public const int Base_V7_Theme_AppCompat = 2131624062;
+                       
+                       // aapt resource value: 0x7F0E007F
+                       public const int Base_V7_Theme_AppCompat_Dialog = 2131624063;
+                       
+                       // aapt resource value: 0x7F0E0080
+                       public const int Base_V7_Theme_AppCompat_Light = 2131624064;
+                       
+                       // aapt resource value: 0x7F0E0081
+                       public const int Base_V7_Theme_AppCompat_Light_Dialog = 2131624065;
+                       
+                       // aapt resource value: 0x7F0E0083
+                       public const int Base_V7_Widget_AppCompat_AutoCompleteTextView = 2131624067;
+                       
+                       // aapt resource value: 0x7F0E0084
+                       public const int Base_V7_Widget_AppCompat_EditText = 2131624068;
+                       
+                       // aapt resource value: 0x7F0E0085
+                       public const int Base_V7_Widget_AppCompat_Toolbar = 2131624069;
+                       
+                       // aapt resource value: 0x7F0E0086
+                       public const int Base_Widget_AppCompat_ActionBar = 2131624070;
+                       
+                       // aapt resource value: 0x7F0E0087
+                       public const int Base_Widget_AppCompat_ActionBar_Solid = 2131624071;
+                       
+                       // aapt resource value: 0x7F0E0088
+                       public const int Base_Widget_AppCompat_ActionBar_TabBar = 2131624072;
+                       
+                       // aapt resource value: 0x7F0E0089
+                       public const int Base_Widget_AppCompat_ActionBar_TabText = 2131624073;
+                       
+                       // aapt resource value: 0x7F0E008A
+                       public const int Base_Widget_AppCompat_ActionBar_TabView = 2131624074;
+                       
+                       // aapt resource value: 0x7F0E008B
+                       public const int Base_Widget_AppCompat_ActionButton = 2131624075;
+                       
+                       // aapt resource value: 0x7F0E008C
+                       public const int Base_Widget_AppCompat_ActionButton_CloseMode = 2131624076;
+                       
+                       // aapt resource value: 0x7F0E008D
+                       public const int Base_Widget_AppCompat_ActionButton_Overflow = 2131624077;
+                       
+                       // aapt resource value: 0x7F0E008E
+                       public const int Base_Widget_AppCompat_ActionMode = 2131624078;
+                       
+                       // aapt resource value: 0x7F0E008F
+                       public const int Base_Widget_AppCompat_ActivityChooserView = 2131624079;
+                       
+                       // aapt resource value: 0x7F0E0090
+                       public const int Base_Widget_AppCompat_AutoCompleteTextView = 2131624080;
+                       
+                       // aapt resource value: 0x7F0E0091
+                       public const int Base_Widget_AppCompat_Button = 2131624081;
+                       
+                       // aapt resource value: 0x7F0E0097
+                       public const int Base_Widget_AppCompat_ButtonBar = 2131624087;
+                       
+                       // aapt resource value: 0x7F0E0098
+                       public const int Base_Widget_AppCompat_ButtonBar_AlertDialog = 2131624088;
+                       
+                       // aapt resource value: 0x7F0E0092
+                       public const int Base_Widget_AppCompat_Button_Borderless = 2131624082;
+                       
+                       // aapt resource value: 0x7F0E0093
+                       public const int Base_Widget_AppCompat_Button_Borderless_Colored = 2131624083;
+                       
+                       // aapt resource value: 0x7F0E0094
+                       public const int Base_Widget_AppCompat_Button_ButtonBar_AlertDialog = 2131624084;
+                       
+                       // aapt resource value: 0x7F0E0095
+                       public const int Base_Widget_AppCompat_Button_Colored = 2131624085;
+                       
+                       // aapt resource value: 0x7F0E0096
+                       public const int Base_Widget_AppCompat_Button_Small = 2131624086;
+                       
+                       // aapt resource value: 0x7F0E0099
+                       public const int Base_Widget_AppCompat_CompoundButton_CheckBox = 2131624089;
+                       
+                       // aapt resource value: 0x7F0E009A
+                       public const int Base_Widget_AppCompat_CompoundButton_RadioButton = 2131624090;
+                       
+                       // aapt resource value: 0x7F0E009B
+                       public const int Base_Widget_AppCompat_CompoundButton_Switch = 2131624091;
+                       
+                       // aapt resource value: 0x7F0E009C
+                       public const int Base_Widget_AppCompat_DrawerArrowToggle = 2131624092;
+                       
+                       // aapt resource value: 0x7F0E009D
+                       public const int Base_Widget_AppCompat_DrawerArrowToggle_Common = 2131624093;
+                       
+                       // aapt resource value: 0x7F0E009E
+                       public const int Base_Widget_AppCompat_DropDownItem_Spinner = 2131624094;
+                       
+                       // aapt resource value: 0x7F0E009F
+                       public const int Base_Widget_AppCompat_EditText = 2131624095;
+                       
+                       // aapt resource value: 0x7F0E00A0
+                       public const int Base_Widget_AppCompat_ImageButton = 2131624096;
+                       
+                       // aapt resource value: 0x7F0E00A1
+                       public const int Base_Widget_AppCompat_Light_ActionBar = 2131624097;
+                       
+                       // aapt resource value: 0x7F0E00A2
+                       public const int Base_Widget_AppCompat_Light_ActionBar_Solid = 2131624098;
+                       
+                       // aapt resource value: 0x7F0E00A3
+                       public const int Base_Widget_AppCompat_Light_ActionBar_TabBar = 2131624099;
+                       
+                       // aapt resource value: 0x7F0E00A4
+                       public const int Base_Widget_AppCompat_Light_ActionBar_TabText = 2131624100;
+                       
+                       // aapt resource value: 0x7F0E00A5
+                       public const int Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse = 2131624101;
+                       
+                       // aapt resource value: 0x7F0E00A6
+                       public const int Base_Widget_AppCompat_Light_ActionBar_TabView = 2131624102;
+                       
+                       // aapt resource value: 0x7F0E00A7
+                       public const int Base_Widget_AppCompat_Light_PopupMenu = 2131624103;
+                       
+                       // aapt resource value: 0x7F0E00A8
+                       public const int Base_Widget_AppCompat_Light_PopupMenu_Overflow = 2131624104;
+                       
+                       // aapt resource value: 0x7F0E00A9
+                       public const int Base_Widget_AppCompat_ListMenuView = 2131624105;
+                       
+                       // aapt resource value: 0x7F0E00AA
+                       public const int Base_Widget_AppCompat_ListPopupWindow = 2131624106;
+                       
+                       // aapt resource value: 0x7F0E00AB
+                       public const int Base_Widget_AppCompat_ListView = 2131624107;
+                       
+                       // aapt resource value: 0x7F0E00AC
+                       public const int Base_Widget_AppCompat_ListView_DropDown = 2131624108;
+                       
+                       // aapt resource value: 0x7F0E00AD
+                       public const int Base_Widget_AppCompat_ListView_Menu = 2131624109;
+                       
+                       // aapt resource value: 0x7F0E00AE
+                       public const int Base_Widget_AppCompat_PopupMenu = 2131624110;
+                       
+                       // aapt resource value: 0x7F0E00AF
+                       public const int Base_Widget_AppCompat_PopupMenu_Overflow = 2131624111;
+                       
+                       // aapt resource value: 0x7F0E00B0
+                       public const int Base_Widget_AppCompat_PopupWindow = 2131624112;
+                       
+                       // aapt resource value: 0x7F0E00B1
+                       public const int Base_Widget_AppCompat_ProgressBar = 2131624113;
+                       
+                       // aapt resource value: 0x7F0E00B2
+                       public const int Base_Widget_AppCompat_ProgressBar_Horizontal = 2131624114;
+                       
+                       // aapt resource value: 0x7F0E00B3
+                       public const int Base_Widget_AppCompat_RatingBar = 2131624115;
+                       
+                       // aapt resource value: 0x7F0E00B4
+                       public const int Base_Widget_AppCompat_RatingBar_Indicator = 2131624116;
+                       
+                       // aapt resource value: 0x7F0E00B5
+                       public const int Base_Widget_AppCompat_RatingBar_Small = 2131624117;
+                       
+                       // aapt resource value: 0x7F0E00B6
+                       public const int Base_Widget_AppCompat_SearchView = 2131624118;
+                       
+                       // aapt resource value: 0x7F0E00B7
+                       public const int Base_Widget_AppCompat_SearchView_ActionBar = 2131624119;
+                       
+                       // aapt resource value: 0x7F0E00B8
+                       public const int Base_Widget_AppCompat_SeekBar = 2131624120;
+                       
+                       // aapt resource value: 0x7F0E00B9
+                       public const int Base_Widget_AppCompat_SeekBar_Discrete = 2131624121;
+                       
+                       // aapt resource value: 0x7F0E00BA
+                       public const int Base_Widget_AppCompat_Spinner = 2131624122;
+                       
+                       // aapt resource value: 0x7F0E00BB
+                       public const int Base_Widget_AppCompat_Spinner_Underlined = 2131624123;
+                       
+                       // aapt resource value: 0x7F0E00BC
+                       public const int Base_Widget_AppCompat_TextView_SpinnerItem = 2131624124;
+                       
+                       // aapt resource value: 0x7F0E00BD
+                       public const int Base_Widget_AppCompat_Toolbar = 2131624125;
+                       
+                       // aapt resource value: 0x7F0E00BE
+                       public const int Base_Widget_AppCompat_Toolbar_Button_Navigation = 2131624126;
+                       
+                       // aapt resource value: 0x7F0E00BF
+                       public const int Base_Widget_Design_TabLayout = 2131624127;
+                       
+                       // aapt resource value: 0x7F0E00C0
+                       public const int Base_Widget_MaterialComponents_Chip = 2131624128;
+                       
+                       // aapt resource value: 0x7F0E00C1
+                       public const int Base_Widget_MaterialComponents_TextInputEditText = 2131624129;
+                       
+                       // aapt resource value: 0x7F0E00C2
+                       public const int Base_Widget_MaterialComponents_TextInputLayout = 2131624130;
+                       
+                       // aapt resource value: 0x7F0E00C3
+                       public const int CardView = 2131624131;
+                       
+                       // aapt resource value: 0x7F0E00C4
+                       public const int CardView_Dark = 2131624132;
+                       
+                       // aapt resource value: 0x7F0E00C5
+                       public const int CardView_Light = 2131624133;
+                       
+                       // aapt resource value: 0x7F0E01F7
+                       public const int collectionViewStyle = 2131624439;
+                       
+                       // aapt resource value: 0x7F0E00C6
+                       public const int MainTheme = 2131624134;
+                       
+                       // aapt resource value: 0x7F0E00C7
+                       public const int MainTheme_Base = 2131624135;
+                       
+                       // aapt resource value: 0x7F0E00C8
+                       public const int Platform_AppCompat = 2131624136;
+                       
+                       // aapt resource value: 0x7F0E00C9
+                       public const int Platform_AppCompat_Light = 2131624137;
+                       
+                       // aapt resource value: 0x7F0E00CA
+                       public const int Platform_MaterialComponents = 2131624138;
+                       
+                       // aapt resource value: 0x7F0E00CB
+                       public const int Platform_MaterialComponents_Dialog = 2131624139;
+                       
+                       // aapt resource value: 0x7F0E00CC
+                       public const int Platform_MaterialComponents_Light = 2131624140;
+                       
+                       // aapt resource value: 0x7F0E00CD
+                       public const int Platform_MaterialComponents_Light_Dialog = 2131624141;
+                       
+                       // aapt resource value: 0x7F0E00CE
+                       public const int Platform_ThemeOverlay_AppCompat = 2131624142;
+                       
+                       // aapt resource value: 0x7F0E00CF
+                       public const int Platform_ThemeOverlay_AppCompat_Dark = 2131624143;
+                       
+                       // aapt resource value: 0x7F0E00D0
+                       public const int Platform_ThemeOverlay_AppCompat_Light = 2131624144;
+                       
+                       // aapt resource value: 0x7F0E00D1
+                       public const int Platform_V21_AppCompat = 2131624145;
+                       
+                       // aapt resource value: 0x7F0E00D2
+                       public const int Platform_V21_AppCompat_Light = 2131624146;
+                       
+                       // aapt resource value: 0x7F0E00D3
+                       public const int Platform_V25_AppCompat = 2131624147;
+                       
+                       // aapt resource value: 0x7F0E00D4
+                       public const int Platform_V25_AppCompat_Light = 2131624148;
+                       
+                       // aapt resource value: 0x7F0E00D5
+                       public const int Platform_Widget_AppCompat_Spinner = 2131624149;
+                       
+                       // aapt resource value: 0x7F0E00D6
+                       public const int RtlOverlay_DialogWindowTitle_AppCompat = 2131624150;
+                       
+                       // aapt resource value: 0x7F0E00D7
+                       public const int RtlOverlay_Widget_AppCompat_ActionBar_TitleItem = 2131624151;
+                       
+                       // aapt resource value: 0x7F0E00D8
+                       public const int RtlOverlay_Widget_AppCompat_DialogTitle_Icon = 2131624152;
+                       
+                       // aapt resource value: 0x7F0E00D9
+                       public const int RtlOverlay_Widget_AppCompat_PopupMenuItem = 2131624153;
+                       
+                       // aapt resource value: 0x7F0E00DA
+                       public const int RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup = 2131624154;
+                       
+                       // aapt resource value: 0x7F0E00DB
+                       public const int RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut = 2131624155;
+                       
+                       // aapt resource value: 0x7F0E00DC
+                       public const int RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow = 2131624156;
+                       
+                       // aapt resource value: 0x7F0E00DD
+                       public const int RtlOverlay_Widget_AppCompat_PopupMenuItem_Text = 2131624157;
+                       
+                       // aapt resource value: 0x7F0E00DE
+                       public const int RtlOverlay_Widget_AppCompat_PopupMenuItem_Title = 2131624158;
+                       
+                       // aapt resource value: 0x7F0E00E4
+                       public const int RtlOverlay_Widget_AppCompat_SearchView_MagIcon = 2131624164;
+                       
+                       // aapt resource value: 0x7F0E00DF
+                       public const int RtlOverlay_Widget_AppCompat_Search_DropDown = 2131624159;
+                       
+                       // aapt resource value: 0x7F0E00E0
+                       public const int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 = 2131624160;
+                       
+                       // aapt resource value: 0x7F0E00E1
+                       public const int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 = 2131624161;
+                       
+                       // aapt resource value: 0x7F0E00E2
+                       public const int RtlOverlay_Widget_AppCompat_Search_DropDown_Query = 2131624162;
+                       
+                       // aapt resource value: 0x7F0E00E3
+                       public const int RtlOverlay_Widget_AppCompat_Search_DropDown_Text = 2131624163;
+                       
+                       // aapt resource value: 0x7F0E00E5
+                       public const int RtlUnderlay_Widget_AppCompat_ActionButton = 2131624165;
+                       
+                       // aapt resource value: 0x7F0E00E6
+                       public const int RtlUnderlay_Widget_AppCompat_ActionButton_Overflow = 2131624166;
+                       
+                       // aapt resource value: 0x7F0E00E7
+                       public const int TextAppearance_AppCompat = 2131624167;
+                       
+                       // aapt resource value: 0x7F0E00E8
+                       public const int TextAppearance_AppCompat_Body1 = 2131624168;
+                       
+                       // aapt resource value: 0x7F0E00E9
+                       public const int TextAppearance_AppCompat_Body2 = 2131624169;
+                       
+                       // aapt resource value: 0x7F0E00EA
+                       public const int TextAppearance_AppCompat_Button = 2131624170;
+                       
+                       // aapt resource value: 0x7F0E00EB
+                       public const int TextAppearance_AppCompat_Caption = 2131624171;
+                       
+                       // aapt resource value: 0x7F0E00EC
+                       public const int TextAppearance_AppCompat_Display1 = 2131624172;
+                       
+                       // aapt resource value: 0x7F0E00ED
+                       public const int TextAppearance_AppCompat_Display2 = 2131624173;
+                       
+                       // aapt resource value: 0x7F0E00EE
+                       public const int TextAppearance_AppCompat_Display3 = 2131624174;
+                       
+                       // aapt resource value: 0x7F0E00EF
+                       public const int TextAppearance_AppCompat_Display4 = 2131624175;
+                       
+                       // aapt resource value: 0x7F0E00F0
+                       public const int TextAppearance_AppCompat_Headline = 2131624176;
+                       
+                       // aapt resource value: 0x7F0E00F1
+                       public const int TextAppearance_AppCompat_Inverse = 2131624177;
+                       
+                       // aapt resource value: 0x7F0E00F2
+                       public const int TextAppearance_AppCompat_Large = 2131624178;
+                       
+                       // aapt resource value: 0x7F0E00F3
+                       public const int TextAppearance_AppCompat_Large_Inverse = 2131624179;
+                       
+                       // aapt resource value: 0x7F0E00F4
+                       public const int TextAppearance_AppCompat_Light_SearchResult_Subtitle = 2131624180;
+                       
+                       // aapt resource value: 0x7F0E00F5
+                       public const int TextAppearance_AppCompat_Light_SearchResult_Title = 2131624181;
+                       
+                       // aapt resource value: 0x7F0E00F6
+                       public const int TextAppearance_AppCompat_Light_Widget_PopupMenu_Large = 2131624182;
+                       
+                       // aapt resource value: 0x7F0E00F7
+                       public const int TextAppearance_AppCompat_Light_Widget_PopupMenu_Small = 2131624183;
+                       
+                       // aapt resource value: 0x7F0E00F8
+                       public const int TextAppearance_AppCompat_Medium = 2131624184;
+                       
+                       // aapt resource value: 0x7F0E00F9
+                       public const int TextAppearance_AppCompat_Medium_Inverse = 2131624185;
+                       
+                       // aapt resource value: 0x7F0E00FA
+                       public const int TextAppearance_AppCompat_Menu = 2131624186;
+                       
+                       // aapt resource value: 0x7F0E00FB
+                       public const int TextAppearance_AppCompat_SearchResult_Subtitle = 2131624187;
+                       
+                       // aapt resource value: 0x7F0E00FC
+                       public const int TextAppearance_AppCompat_SearchResult_Title = 2131624188;
+                       
+                       // aapt resource value: 0x7F0E00FD
+                       public const int TextAppearance_AppCompat_Small = 2131624189;
+                       
+                       // aapt resource value: 0x7F0E00FE
+                       public const int TextAppearance_AppCompat_Small_Inverse = 2131624190;
+                       
+                       // aapt resource value: 0x7F0E00FF
+                       public const int TextAppearance_AppCompat_Subhead = 2131624191;
+                       
+                       // aapt resource value: 0x7F0E0100
+                       public const int TextAppearance_AppCompat_Subhead_Inverse = 2131624192;
+                       
+                       // aapt resource value: 0x7F0E0101
+                       public const int TextAppearance_AppCompat_Title = 2131624193;
+                       
+                       // aapt resource value: 0x7F0E0102
+                       public const int TextAppearance_AppCompat_Title_Inverse = 2131624194;
+                       
+                       // aapt resource value: 0x7F0E0103
+                       public const int TextAppearance_AppCompat_Tooltip = 2131624195;
+                       
+                       // aapt resource value: 0x7F0E0104
+                       public const int TextAppearance_AppCompat_Widget_ActionBar_Menu = 2131624196;
+                       
+                       // aapt resource value: 0x7F0E0105
+                       public const int TextAppearance_AppCompat_Widget_ActionBar_Subtitle = 2131624197;
+                       
+                       // aapt resource value: 0x7F0E0106
+                       public const int TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse = 2131624198;
+                       
+                       // aapt resource value: 0x7F0E0107
+                       public const int TextAppearance_AppCompat_Widget_ActionBar_Title = 2131624199;
+                       
+                       // aapt resource value: 0x7F0E0108
+                       public const int TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse = 2131624200;
+                       
+                       // aapt resource value: 0x7F0E0109
+                       public const int TextAppearance_AppCompat_Widget_ActionMode_Subtitle = 2131624201;
+                       
+                       // aapt resource value: 0x7F0E010A
+                       public const int TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse = 2131624202;
+                       
+                       // aapt resource value: 0x7F0E010B
+                       public const int TextAppearance_AppCompat_Widget_ActionMode_Title = 2131624203;
+                       
+                       // aapt resource value: 0x7F0E010C
+                       public const int TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse = 2131624204;
+                       
+                       // aapt resource value: 0x7F0E010D
+                       public const int TextAppearance_AppCompat_Widget_Button = 2131624205;
+                       
+                       // aapt resource value: 0x7F0E010E
+                       public const int TextAppearance_AppCompat_Widget_Button_Borderless_Colored = 2131624206;
+                       
+                       // aapt resource value: 0x7F0E010F
+                       public const int TextAppearance_AppCompat_Widget_Button_Colored = 2131624207;
+                       
+                       // aapt resource value: 0x7F0E0110
+                       public const int TextAppearance_AppCompat_Widget_Button_Inverse = 2131624208;
+                       
+                       // aapt resource value: 0x7F0E0111
+                       public const int TextAppearance_AppCompat_Widget_DropDownItem = 2131624209;
+                       
+                       // aapt resource value: 0x7F0E0112
+                       public const int TextAppearance_AppCompat_Widget_PopupMenu_Header = 2131624210;
+                       
+                       // aapt resource value: 0x7F0E0113
+                       public const int TextAppearance_AppCompat_Widget_PopupMenu_Large = 2131624211;
+                       
+                       // aapt resource value: 0x7F0E0114
+                       public const int TextAppearance_AppCompat_Widget_PopupMenu_Small = 2131624212;
+                       
+                       // aapt resource value: 0x7F0E0115
+                       public const int TextAppearance_AppCompat_Widget_Switch = 2131624213;
+                       
+                       // aapt resource value: 0x7F0E0116
+                       public const int TextAppearance_AppCompat_Widget_TextView_SpinnerItem = 2131624214;
+                       
+                       // aapt resource value: 0x7F0E0117
+                       public const int TextAppearance_Compat_Notification = 2131624215;
+                       
+                       // aapt resource value: 0x7F0E0118
+                       public const int TextAppearance_Compat_Notification_Info = 2131624216;
+                       
+                       // aapt resource value: 0x7F0E0119
+                       public const int TextAppearance_Compat_Notification_Info_Media = 2131624217;
+                       
+                       // aapt resource value: 0x7F0E011A
+                       public const int TextAppearance_Compat_Notification_Line2 = 2131624218;
+                       
+                       // aapt resource value: 0x7F0E011B
+                       public const int TextAppearance_Compat_Notification_Line2_Media = 2131624219;
+                       
+                       // aapt resource value: 0x7F0E011C
+                       public const int TextAppearance_Compat_Notification_Media = 2131624220;
+                       
+                       // aapt resource value: 0x7F0E011D
+                       public const int TextAppearance_Compat_Notification_Time = 2131624221;
+                       
+                       // aapt resource value: 0x7F0E011E
+                       public const int TextAppearance_Compat_Notification_Time_Media = 2131624222;
+                       
+                       // aapt resource value: 0x7F0E011F
+                       public const int TextAppearance_Compat_Notification_Title = 2131624223;
+                       
+                       // aapt resource value: 0x7F0E0120
+                       public const int TextAppearance_Compat_Notification_Title_Media = 2131624224;
+                       
+                       // aapt resource value: 0x7F0E0121
+                       public const int TextAppearance_Design_CollapsingToolbar_Expanded = 2131624225;
+                       
+                       // aapt resource value: 0x7F0E0122
+                       public const int TextAppearance_Design_Counter = 2131624226;
+                       
+                       // aapt resource value: 0x7F0E0123
+                       public const int TextAppearance_Design_Counter_Overflow = 2131624227;
+                       
+                       // aapt resource value: 0x7F0E0124
+                       public const int TextAppearance_Design_Error = 2131624228;
+                       
+                       // aapt resource value: 0x7F0E0125
+                       public const int TextAppearance_Design_HelperText = 2131624229;
+                       
+                       // aapt resource value: 0x7F0E0126
+                       public const int TextAppearance_Design_Hint = 2131624230;
+                       
+                       // aapt resource value: 0x7F0E0127
+                       public const int TextAppearance_Design_Snackbar_Message = 2131624231;
+                       
+                       // aapt resource value: 0x7F0E0128
+                       public const int TextAppearance_Design_Tab = 2131624232;
+                       
+                       // aapt resource value: 0x7F0E0129
+                       public const int TextAppearance_MaterialComponents_Body1 = 2131624233;
+                       
+                       // aapt resource value: 0x7F0E012A
+                       public const int TextAppearance_MaterialComponents_Body2 = 2131624234;
+                       
+                       // aapt resource value: 0x7F0E012B
+                       public const int TextAppearance_MaterialComponents_Button = 2131624235;
+                       
+                       // aapt resource value: 0x7F0E012C
+                       public const int TextAppearance_MaterialComponents_Caption = 2131624236;
+                       
+                       // aapt resource value: 0x7F0E012D
+                       public const int TextAppearance_MaterialComponents_Chip = 2131624237;
+                       
+                       // aapt resource value: 0x7F0E012E
+                       public const int TextAppearance_MaterialComponents_Headline1 = 2131624238;
+                       
+                       // aapt resource value: 0x7F0E012F
+                       public const int TextAppearance_MaterialComponents_Headline2 = 2131624239;
+                       
+                       // aapt resource value: 0x7F0E0130
+                       public const int TextAppearance_MaterialComponents_Headline3 = 2131624240;
+                       
+                       // aapt resource value: 0x7F0E0131
+                       public const int TextAppearance_MaterialComponents_Headline4 = 2131624241;
+                       
+                       // aapt resource value: 0x7F0E0132
+                       public const int TextAppearance_MaterialComponents_Headline5 = 2131624242;
+                       
+                       // aapt resource value: 0x7F0E0133
+                       public const int TextAppearance_MaterialComponents_Headline6 = 2131624243;
+                       
+                       // aapt resource value: 0x7F0E0134
+                       public const int TextAppearance_MaterialComponents_Overline = 2131624244;
+                       
+                       // aapt resource value: 0x7F0E0135
+                       public const int TextAppearance_MaterialComponents_Subtitle1 = 2131624245;
+                       
+                       // aapt resource value: 0x7F0E0136
+                       public const int TextAppearance_MaterialComponents_Subtitle2 = 2131624246;
+                       
+                       // aapt resource value: 0x7F0E0137
+                       public const int TextAppearance_MaterialComponents_Tab = 2131624247;
+                       
+                       // aapt resource value: 0x7F0E0138
+                       public const int TextAppearance_Widget_AppCompat_ExpandedMenu_Item = 2131624248;
+                       
+                       // aapt resource value: 0x7F0E0139
+                       public const int TextAppearance_Widget_AppCompat_Toolbar_Subtitle = 2131624249;
+                       
+                       // aapt resource value: 0x7F0E013A
+                       public const int TextAppearance_Widget_AppCompat_Toolbar_Title = 2131624250;
+                       
+                       // aapt resource value: 0x7F0E016B
+                       public const int ThemeOverlay_AppCompat = 2131624299;
+                       
+                       // aapt resource value: 0x7F0E016C
+                       public const int ThemeOverlay_AppCompat_ActionBar = 2131624300;
+                       
+                       // aapt resource value: 0x7F0E016D
+                       public const int ThemeOverlay_AppCompat_Dark = 2131624301;
+                       
+                       // aapt resource value: 0x7F0E016E
+                       public const int ThemeOverlay_AppCompat_Dark_ActionBar = 2131624302;
+                       
+                       // aapt resource value: 0x7F0E016F
+                       public const int ThemeOverlay_AppCompat_Dialog = 2131624303;
+                       
+                       // aapt resource value: 0x7F0E0170
+                       public const int ThemeOverlay_AppCompat_Dialog_Alert = 2131624304;
+                       
+                       // aapt resource value: 0x7F0E0171
+                       public const int ThemeOverlay_AppCompat_Light = 2131624305;
+                       
+                       // aapt resource value: 0x7F0E0172
+                       public const int ThemeOverlay_MaterialComponents = 2131624306;
+                       
+                       // aapt resource value: 0x7F0E0173
+                       public const int ThemeOverlay_MaterialComponents_ActionBar = 2131624307;
+                       
+                       // aapt resource value: 0x7F0E0174
+                       public const int ThemeOverlay_MaterialComponents_Dark = 2131624308;
+                       
+                       // aapt resource value: 0x7F0E0175
+                       public const int ThemeOverlay_MaterialComponents_Dark_ActionBar = 2131624309;
+                       
+                       // aapt resource value: 0x7F0E0176
+                       public const int ThemeOverlay_MaterialComponents_Dialog = 2131624310;
+                       
+                       // aapt resource value: 0x7F0E0177
+                       public const int ThemeOverlay_MaterialComponents_Dialog_Alert = 2131624311;
+                       
+                       // aapt resource value: 0x7F0E0178
+                       public const int ThemeOverlay_MaterialComponents_Light = 2131624312;
+                       
+                       // aapt resource value: 0x7F0E0179
+                       public const int ThemeOverlay_MaterialComponents_TextInputEditText = 2131624313;
+                       
+                       // aapt resource value: 0x7F0E017A
+                       public const int ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox = 2131624314;
+                       
+                       // aapt resource value: 0x7F0E017B
+                       public const int ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox_Dense = 2131624315;
+                       
+                       // aapt resource value: 0x7F0E017C
+                       public const int ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox = 2131624316;
+                       
+                       // aapt resource value: 0x7F0E017D
+                       public const int ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox_Dense = 2131624317;
+                       
+                       // aapt resource value: 0x7F0E013B
+                       public const int Theme_AppCompat = 2131624251;
+                       
+                       // aapt resource value: 0x7F0E013C
+                       public const int Theme_AppCompat_CompactMenu = 2131624252;
+                       
+                       // aapt resource value: 0x7F0E013D
+                       public const int Theme_AppCompat_DayNight = 2131624253;
+                       
+                       // aapt resource value: 0x7F0E013E
+                       public const int Theme_AppCompat_DayNight_DarkActionBar = 2131624254;
+                       
+                       // aapt resource value: 0x7F0E013F
+                       public const int Theme_AppCompat_DayNight_Dialog = 2131624255;
+                       
+                       // aapt resource value: 0x7F0E0142
+                       public const int Theme_AppCompat_DayNight_DialogWhenLarge = 2131624258;
+                       
+                       // aapt resource value: 0x7F0E0140
+                       public const int Theme_AppCompat_DayNight_Dialog_Alert = 2131624256;
+                       
+                       // aapt resource value: 0x7F0E0141
+                       public const int Theme_AppCompat_DayNight_Dialog_MinWidth = 2131624257;
+                       
+                       // aapt resource value: 0x7F0E0143
+                       public const int Theme_AppCompat_DayNight_NoActionBar = 2131624259;
+                       
+                       // aapt resource value: 0x7F0E0144
+                       public const int Theme_AppCompat_Dialog = 2131624260;
+                       
+                       // aapt resource value: 0x7F0E0147
+                       public const int Theme_AppCompat_DialogWhenLarge = 2131624263;
+                       
+                       // aapt resource value: 0x7F0E0145
+                       public const int Theme_AppCompat_Dialog_Alert = 2131624261;
+                       
+                       // aapt resource value: 0x7F0E0146
+                       public const int Theme_AppCompat_Dialog_MinWidth = 2131624262;
+                       
+                       // aapt resource value: 0x7F0E0148
+                       public const int Theme_AppCompat_Light = 2131624264;
+                       
+                       // aapt resource value: 0x7F0E0149
+                       public const int Theme_AppCompat_Light_DarkActionBar = 2131624265;
+                       
+                       // aapt resource value: 0x7F0E014A
+                       public const int Theme_AppCompat_Light_Dialog = 2131624266;
+                       
+                       // aapt resource value: 0x7F0E014D
+                       public const int Theme_AppCompat_Light_DialogWhenLarge = 2131624269;
+                       
+                       // aapt resource value: 0x7F0E014B
+                       public const int Theme_AppCompat_Light_Dialog_Alert = 2131624267;
+                       
+                       // aapt resource value: 0x7F0E014C
+                       public const int Theme_AppCompat_Light_Dialog_MinWidth = 2131624268;
+                       
+                       // aapt resource value: 0x7F0E014E
+                       public const int Theme_AppCompat_Light_NoActionBar = 2131624270;
+                       
+                       // aapt resource value: 0x7F0E014F
+                       public const int Theme_AppCompat_NoActionBar = 2131624271;
+                       
+                       // aapt resource value: 0x7F0E0150
+                       public const int Theme_Design = 2131624272;
+                       
+                       // aapt resource value: 0x7F0E0151
+                       public const int Theme_Design_BottomSheetDialog = 2131624273;
+                       
+                       // aapt resource value: 0x7F0E0152
+                       public const int Theme_Design_Light = 2131624274;
+                       
+                       // aapt resource value: 0x7F0E0153
+                       public const int Theme_Design_Light_BottomSheetDialog = 2131624275;
+                       
+                       // aapt resource value: 0x7F0E0154
+                       public const int Theme_Design_Light_NoActionBar = 2131624276;
+                       
+                       // aapt resource value: 0x7F0E0155
+                       public const int Theme_Design_NoActionBar = 2131624277;
+                       
+                       // aapt resource value: 0x7F0E0156
+                       public const int Theme_MaterialComponents = 2131624278;
+                       
+                       // aapt resource value: 0x7F0E0157
+                       public const int Theme_MaterialComponents_BottomSheetDialog = 2131624279;
+                       
+                       // aapt resource value: 0x7F0E0158
+                       public const int Theme_MaterialComponents_Bridge = 2131624280;
+                       
+                       // aapt resource value: 0x7F0E0159
+                       public const int Theme_MaterialComponents_CompactMenu = 2131624281;
+                       
+                       // aapt resource value: 0x7F0E015A
+                       public const int Theme_MaterialComponents_Dialog = 2131624282;
+                       
+                       // aapt resource value: 0x7F0E015D
+                       public const int Theme_MaterialComponents_DialogWhenLarge = 2131624285;
+                       
+                       // aapt resource value: 0x7F0E015B
+                       public const int Theme_MaterialComponents_Dialog_Alert = 2131624283;
+                       
+                       // aapt resource value: 0x7F0E015C
+                       public const int Theme_MaterialComponents_Dialog_MinWidth = 2131624284;
+                       
+                       // aapt resource value: 0x7F0E015E
+                       public const int Theme_MaterialComponents_Light = 2131624286;
+                       
+                       // aapt resource value: 0x7F0E015F
+                       public const int Theme_MaterialComponents_Light_BottomSheetDialog = 2131624287;
+                       
+                       // aapt resource value: 0x7F0E0160
+                       public const int Theme_MaterialComponents_Light_Bridge = 2131624288;
+                       
+                       // aapt resource value: 0x7F0E0161
+                       public const int Theme_MaterialComponents_Light_DarkActionBar = 2131624289;
+                       
+                       // aapt resource value: 0x7F0E0162
+                       public const int Theme_MaterialComponents_Light_DarkActionBar_Bridge = 2131624290;
+                       
+                       // aapt resource value: 0x7F0E0163
+                       public const int Theme_MaterialComponents_Light_Dialog = 2131624291;
+                       
+                       // aapt resource value: 0x7F0E0166
+                       public const int Theme_MaterialComponents_Light_DialogWhenLarge = 2131624294;
+                       
+                       // aapt resource value: 0x7F0E0164
+                       public const int Theme_MaterialComponents_Light_Dialog_Alert = 2131624292;
+                       
+                       // aapt resource value: 0x7F0E0165
+                       public const int Theme_MaterialComponents_Light_Dialog_MinWidth = 2131624293;
+                       
+                       // aapt resource value: 0x7F0E0167
+                       public const int Theme_MaterialComponents_Light_NoActionBar = 2131624295;
+                       
+                       // aapt resource value: 0x7F0E0168
+                       public const int Theme_MaterialComponents_Light_NoActionBar_Bridge = 2131624296;
+                       
+                       // aapt resource value: 0x7F0E0169
+                       public const int Theme_MaterialComponents_NoActionBar = 2131624297;
+                       
+                       // aapt resource value: 0x7F0E016A
+                       public const int Theme_MaterialComponents_NoActionBar_Bridge = 2131624298;
+                       
+                       // aapt resource value: 0x7F0E017E
+                       public const int Widget_AppCompat_ActionBar = 2131624318;
+                       
+                       // aapt resource value: 0x7F0E017F
+                       public const int Widget_AppCompat_ActionBar_Solid = 2131624319;
+                       
+                       // aapt resource value: 0x7F0E0180
+                       public const int Widget_AppCompat_ActionBar_TabBar = 2131624320;
+                       
+                       // aapt resource value: 0x7F0E0181
+                       public const int Widget_AppCompat_ActionBar_TabText = 2131624321;
+                       
+                       // aapt resource value: 0x7F0E0182
+                       public const int Widget_AppCompat_ActionBar_TabView = 2131624322;
+                       
+                       // aapt resource value: 0x7F0E0183
+                       public const int Widget_AppCompat_ActionButton = 2131624323;
+                       
+                       // aapt resource value: 0x7F0E0184
+                       public const int Widget_AppCompat_ActionButton_CloseMode = 2131624324;
+                       
+                       // aapt resource value: 0x7F0E0185
+                       public const int Widget_AppCompat_ActionButton_Overflow = 2131624325;
+                       
+                       // aapt resource value: 0x7F0E0186
+                       public const int Widget_AppCompat_ActionMode = 2131624326;
+                       
+                       // aapt resource value: 0x7F0E0187
+                       public const int Widget_AppCompat_ActivityChooserView = 2131624327;
+                       
+                       // aapt resource value: 0x7F0E0188
+                       public const int Widget_AppCompat_AutoCompleteTextView = 2131624328;
+                       
+                       // aapt resource value: 0x7F0E0189
+                       public const int Widget_AppCompat_Button = 2131624329;
+                       
+                       // aapt resource value: 0x7F0E018F
+                       public const int Widget_AppCompat_ButtonBar = 2131624335;
+                       
+                       // aapt resource value: 0x7F0E0190
+                       public const int Widget_AppCompat_ButtonBar_AlertDialog = 2131624336;
+                       
+                       // aapt resource value: 0x7F0E018A
+                       public const int Widget_AppCompat_Button_Borderless = 2131624330;
+                       
+                       // aapt resource value: 0x7F0E018B
+                       public const int Widget_AppCompat_Button_Borderless_Colored = 2131624331;
+                       
+                       // aapt resource value: 0x7F0E018C
+                       public const int Widget_AppCompat_Button_ButtonBar_AlertDialog = 2131624332;
+                       
+                       // aapt resource value: 0x7F0E018D
+                       public const int Widget_AppCompat_Button_Colored = 2131624333;
+                       
+                       // aapt resource value: 0x7F0E018E
+                       public const int Widget_AppCompat_Button_Small = 2131624334;
+                       
+                       // aapt resource value: 0x7F0E0191
+                       public const int Widget_AppCompat_CompoundButton_CheckBox = 2131624337;
+                       
+                       // aapt resource value: 0x7F0E0192
+                       public const int Widget_AppCompat_CompoundButton_RadioButton = 2131624338;
+                       
+                       // aapt resource value: 0x7F0E0193
+                       public const int Widget_AppCompat_CompoundButton_Switch = 2131624339;
+                       
+                       // aapt resource value: 0x7F0E0194
+                       public const int Widget_AppCompat_DrawerArrowToggle = 2131624340;
+                       
+                       // aapt resource value: 0x7F0E0195
+                       public const int Widget_AppCompat_DropDownItem_Spinner = 2131624341;
+                       
+                       // aapt resource value: 0x7F0E0196
+                       public const int Widget_AppCompat_EditText = 2131624342;
+                       
+                       // aapt resource value: 0x7F0E0197
+                       public const int Widget_AppCompat_ImageButton = 2131624343;
+                       
+                       // aapt resource value: 0x7F0E0198
+                       public const int Widget_AppCompat_Light_ActionBar = 2131624344;
+                       
+                       // aapt resource value: 0x7F0E0199
+                       public const int Widget_AppCompat_Light_ActionBar_Solid = 2131624345;
+                       
+                       // aapt resource value: 0x7F0E019A
+                       public const int Widget_AppCompat_Light_ActionBar_Solid_Inverse = 2131624346;
+                       
+                       // aapt resource value: 0x7F0E019B
+                       public const int Widget_AppCompat_Light_ActionBar_TabBar = 2131624347;
+                       
+                       // aapt resource value: 0x7F0E019C
+                       public const int Widget_AppCompat_Light_ActionBar_TabBar_Inverse = 2131624348;
+                       
+                       // aapt resource value: 0x7F0E019D
+                       public const int Widget_AppCompat_Light_ActionBar_TabText = 2131624349;
+                       
+                       // aapt resource value: 0x7F0E019E
+                       public const int Widget_AppCompat_Light_ActionBar_TabText_Inverse = 2131624350;
+                       
+                       // aapt resource value: 0x7F0E019F
+                       public const int Widget_AppCompat_Light_ActionBar_TabView = 2131624351;
+                       
+                       // aapt resource value: 0x7F0E01A0
+                       public const int Widget_AppCompat_Light_ActionBar_TabView_Inverse = 2131624352;
+                       
+                       // aapt resource value: 0x7F0E01A1
+                       public const int Widget_AppCompat_Light_ActionButton = 2131624353;
+                       
+                       // aapt resource value: 0x7F0E01A2
+                       public const int Widget_AppCompat_Light_ActionButton_CloseMode = 2131624354;
+                       
+                       // aapt resource value: 0x7F0E01A3
+                       public const int Widget_AppCompat_Light_ActionButton_Overflow = 2131624355;
+                       
+                       // aapt resource value: 0x7F0E01A4
+                       public const int Widget_AppCompat_Light_ActionMode_Inverse = 2131624356;
+                       
+                       // aapt resource value: 0x7F0E01A5
+                       public const int Widget_AppCompat_Light_ActivityChooserView = 2131624357;
+                       
+                       // aapt resource value: 0x7F0E01A6
+                       public const int Widget_AppCompat_Light_AutoCompleteTextView = 2131624358;
+                       
+                       // aapt resource value: 0x7F0E01A7
+                       public const int Widget_AppCompat_Light_DropDownItem_Spinner = 2131624359;
+                       
+                       // aapt resource value: 0x7F0E01A8
+                       public const int Widget_AppCompat_Light_ListPopupWindow = 2131624360;
+                       
+                       // aapt resource value: 0x7F0E01A9
+                       public const int Widget_AppCompat_Light_ListView_DropDown = 2131624361;
+                       
+                       // aapt resource value: 0x7F0E01AA
+                       public const int Widget_AppCompat_Light_PopupMenu = 2131624362;
+                       
+                       // aapt resource value: 0x7F0E01AB
+                       public const int Widget_AppCompat_Light_PopupMenu_Overflow = 2131624363;
+                       
+                       // aapt resource value: 0x7F0E01AC
+                       public const int Widget_AppCompat_Light_SearchView = 2131624364;
+                       
+                       // aapt resource value: 0x7F0E01AD
+                       public const int Widget_AppCompat_Light_Spinner_DropDown_ActionBar = 2131624365;
+                       
+                       // aapt resource value: 0x7F0E01AE
+                       public const int Widget_AppCompat_ListMenuView = 2131624366;
+                       
+                       // aapt resource value: 0x7F0E01AF
+                       public const int Widget_AppCompat_ListPopupWindow = 2131624367;
+                       
+                       // aapt resource value: 0x7F0E01B0
+                       public const int Widget_AppCompat_ListView = 2131624368;
+                       
+                       // aapt resource value: 0x7F0E01B1
+                       public const int Widget_AppCompat_ListView_DropDown = 2131624369;
+                       
+                       // aapt resource value: 0x7F0E01B2
+                       public const int Widget_AppCompat_ListView_Menu = 2131624370;
+                       
+                       // aapt resource value: 0x7F0E01B3
+                       public const int Widget_AppCompat_PopupMenu = 2131624371;
+                       
+                       // aapt resource value: 0x7F0E01B4
+                       public const int Widget_AppCompat_PopupMenu_Overflow = 2131624372;
+                       
+                       // aapt resource value: 0x7F0E01B5
+                       public const int Widget_AppCompat_PopupWindow = 2131624373;
+                       
+                       // aapt resource value: 0x7F0E01B6
+                       public const int Widget_AppCompat_ProgressBar = 2131624374;
+                       
+                       // aapt resource value: 0x7F0E01B7
+                       public const int Widget_AppCompat_ProgressBar_Horizontal = 2131624375;
+                       
+                       // aapt resource value: 0x7F0E01B8
+                       public const int Widget_AppCompat_RatingBar = 2131624376;
+                       
+                       // aapt resource value: 0x7F0E01B9
+                       public const int Widget_AppCompat_RatingBar_Indicator = 2131624377;
+                       
+                       // aapt resource value: 0x7F0E01BA
+                       public const int Widget_AppCompat_RatingBar_Small = 2131624378;
+                       
+                       // aapt resource value: 0x7F0E01BB
+                       public const int Widget_AppCompat_SearchView = 2131624379;
+                       
+                       // aapt resource value: 0x7F0E01BC
+                       public const int Widget_AppCompat_SearchView_ActionBar = 2131624380;
+                       
+                       // aapt resource value: 0x7F0E01BD
+                       public const int Widget_AppCompat_SeekBar = 2131624381;
+                       
+                       // aapt resource value: 0x7F0E01BE
+                       public const int Widget_AppCompat_SeekBar_Discrete = 2131624382;
+                       
+                       // aapt resource value: 0x7F0E01BF
+                       public const int Widget_AppCompat_Spinner = 2131624383;
+                       
+                       // aapt resource value: 0x7F0E01C0
+                       public const int Widget_AppCompat_Spinner_DropDown = 2131624384;
+                       
+                       // aapt resource value: 0x7F0E01C1
+                       public const int Widget_AppCompat_Spinner_DropDown_ActionBar = 2131624385;
+                       
+                       // aapt resource value: 0x7F0E01C2
+                       public const int Widget_AppCompat_Spinner_Underlined = 2131624386;
+                       
+                       // aapt resource value: 0x7F0E01C3
+                       public const int Widget_AppCompat_TextView_SpinnerItem = 2131624387;
+                       
+                       // aapt resource value: 0x7F0E01C4
+                       public const int Widget_AppCompat_Toolbar = 2131624388;
+                       
+                       // aapt resource value: 0x7F0E01C5
+                       public const int Widget_AppCompat_Toolbar_Button_Navigation = 2131624389;
+                       
+                       // aapt resource value: 0x7F0E01C6
+                       public const int Widget_Compat_NotificationActionContainer = 2131624390;
+                       
+                       // aapt resource value: 0x7F0E01C7
+                       public const int Widget_Compat_NotificationActionText = 2131624391;
+                       
+                       // aapt resource value: 0x7F0E01C8
+                       public const int Widget_Design_AppBarLayout = 2131624392;
+                       
+                       // aapt resource value: 0x7F0E01C9
+                       public const int Widget_Design_BottomNavigationView = 2131624393;
+                       
+                       // aapt resource value: 0x7F0E01CA
+                       public const int Widget_Design_BottomSheet_Modal = 2131624394;
+                       
+                       // aapt resource value: 0x7F0E01CB
+                       public const int Widget_Design_CollapsingToolbar = 2131624395;
+                       
+                       // aapt resource value: 0x7F0E01CC
+                       public const int Widget_Design_FloatingActionButton = 2131624396;
+                       
+                       // aapt resource value: 0x7F0E01CD
+                       public const int Widget_Design_NavigationView = 2131624397;
+                       
+                       // aapt resource value: 0x7F0E01CE
+                       public const int Widget_Design_ScrimInsetsFrameLayout = 2131624398;
+                       
+                       // aapt resource value: 0x7F0E01CF
+                       public const int Widget_Design_Snackbar = 2131624399;
+                       
+                       // aapt resource value: 0x7F0E01D0
+                       public const int Widget_Design_TabLayout = 2131624400;
+                       
+                       // aapt resource value: 0x7F0E01D1
+                       public const int Widget_Design_TextInputLayout = 2131624401;
+                       
+                       // aapt resource value: 0x7F0E01D2
+                       public const int Widget_MaterialComponents_BottomAppBar = 2131624402;
+                       
+                       // aapt resource value: 0x7F0E01D3
+                       public const int Widget_MaterialComponents_BottomAppBar_Colored = 2131624403;
+                       
+                       // aapt resource value: 0x7F0E01D4
+                       public const int Widget_MaterialComponents_BottomNavigationView = 2131624404;
+                       
+                       // aapt resource value: 0x7F0E01D5
+                       public const int Widget_MaterialComponents_BottomNavigationView_Colored = 2131624405;
+                       
+                       // aapt resource value: 0x7F0E01D6
+                       public const int Widget_MaterialComponents_BottomSheet_Modal = 2131624406;
+                       
+                       // aapt resource value: 0x7F0E01D7
+                       public const int Widget_MaterialComponents_Button = 2131624407;
+                       
+                       // aapt resource value: 0x7F0E01D8
+                       public const int Widget_MaterialComponents_Button_Icon = 2131624408;
+                       
+                       // aapt resource value: 0x7F0E01D9
+                       public const int Widget_MaterialComponents_Button_OutlinedButton = 2131624409;
+                       
+                       // aapt resource value: 0x7F0E01DA
+                       public const int Widget_MaterialComponents_Button_OutlinedButton_Icon = 2131624410;
+                       
+                       // aapt resource value: 0x7F0E01DB
+                       public const int Widget_MaterialComponents_Button_TextButton = 2131624411;
+                       
+                       // aapt resource value: 0x7F0E01DC
+                       public const int Widget_MaterialComponents_Button_TextButton_Dialog = 2131624412;
+                       
+                       // aapt resource value: 0x7F0E01DD
+                       public const int Widget_MaterialComponents_Button_TextButton_Dialog_Icon = 2131624413;
+                       
+                       // aapt resource value: 0x7F0E01DE
+                       public const int Widget_MaterialComponents_Button_TextButton_Icon = 2131624414;
+                       
+                       // aapt resource value: 0x7F0E01DF
+                       public const int Widget_MaterialComponents_Button_UnelevatedButton = 2131624415;
+                       
+                       // aapt resource value: 0x7F0E01E0
+                       public const int Widget_MaterialComponents_Button_UnelevatedButton_Icon = 2131624416;
+                       
+                       // aapt resource value: 0x7F0E01E1
+                       public const int Widget_MaterialComponents_CardView = 2131624417;
+                       
+                       // aapt resource value: 0x7F0E01E6
+                       public const int Widget_MaterialComponents_ChipGroup = 2131624422;
+                       
+                       // aapt resource value: 0x7F0E01E2
+                       public const int Widget_MaterialComponents_Chip_Action = 2131624418;
+                       
+                       // aapt resource value: 0x7F0E01E3
+                       public const int Widget_MaterialComponents_Chip_Choice = 2131624419;
+                       
+                       // aapt resource value: 0x7F0E01E4
+                       public const int Widget_MaterialComponents_Chip_Entry = 2131624420;
+                       
+                       // aapt resource value: 0x7F0E01E5
+                       public const int Widget_MaterialComponents_Chip_Filter = 2131624421;
+                       
+                       // aapt resource value: 0x7F0E01E7
+                       public const int Widget_MaterialComponents_FloatingActionButton = 2131624423;
+                       
+                       // aapt resource value: 0x7F0E01E8
+                       public const int Widget_MaterialComponents_NavigationView = 2131624424;
+                       
+                       // aapt resource value: 0x7F0E01E9
+                       public const int Widget_MaterialComponents_Snackbar = 2131624425;
+                       
+                       // aapt resource value: 0x7F0E01EA
+                       public const int Widget_MaterialComponents_Snackbar_FullWidth = 2131624426;
+                       
+                       // aapt resource value: 0x7F0E01EB
+                       public const int Widget_MaterialComponents_TabLayout = 2131624427;
+                       
+                       // aapt resource value: 0x7F0E01EC
+                       public const int Widget_MaterialComponents_TabLayout_Colored = 2131624428;
+                       
+                       // aapt resource value: 0x7F0E01ED
+                       public const int Widget_MaterialComponents_TextInputEditText_FilledBox = 2131624429;
+                       
+                       // aapt resource value: 0x7F0E01EE
+                       public const int Widget_MaterialComponents_TextInputEditText_FilledBox_Dense = 2131624430;
+                       
+                       // aapt resource value: 0x7F0E01EF
+                       public const int Widget_MaterialComponents_TextInputEditText_OutlinedBox = 2131624431;
+                       
+                       // aapt resource value: 0x7F0E01F0
+                       public const int Widget_MaterialComponents_TextInputEditText_OutlinedBox_Dense = 2131624432;
+                       
+                       // aapt resource value: 0x7F0E01F1
+                       public const int Widget_MaterialComponents_TextInputLayout_FilledBox = 2131624433;
+                       
+                       // aapt resource value: 0x7F0E01F2
+                       public const int Widget_MaterialComponents_TextInputLayout_FilledBox_Dense = 2131624434;
+                       
+                       // aapt resource value: 0x7F0E01F3
+                       public const int Widget_MaterialComponents_TextInputLayout_OutlinedBox = 2131624435;
+                       
+                       // aapt resource value: 0x7F0E01F4
+                       public const int Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense = 2131624436;
+                       
+                       // aapt resource value: 0x7F0E01F5
+                       public const int Widget_MaterialComponents_Toolbar = 2131624437;
+                       
+                       // aapt resource value: 0x7F0E01F6
+                       public const int Widget_Support_CoordinatorLayout = 2131624438;
+                       
+                       static Style()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Style()
+                       {
+                       }
+               }
+               
+               public partial class Styleable
+               {
+                       
+                       // aapt resource value: { 0x7F030031,0x7F030032,0x7F030033,0x7F030091,0x7F030092,0x7F030093,0x7F030094,0x7F030095,0x7F030096,0x7F0300A4,0x7F0300A9,0x7F0300AA,0x7F0300B5,0x7F0300DF,0x7F0300E4,0x7F0300E9,0x7F0300EA,0x7F0300EC,0x7F0300F6,0x7F030100,0x7F030123,0x7F03012F,0x7F030140,0x7F030144,0x7F030145,0x7F030173,0x7F030176,0x7F0301BB,0x7F0301C5 }
+                       public static int[] ActionBar = new int[] {
+                                       2130903089,
+                                       2130903090,
+                                       2130903091,
+                                       2130903185,
+                                       2130903186,
+                                       2130903187,
+                                       2130903188,
+                                       2130903189,
+                                       2130903190,
+                                       2130903204,
+                                       2130903209,
+                                       2130903210,
+                                       2130903221,
+                                       2130903263,
+                                       2130903268,
+                                       2130903273,
+                                       2130903274,
+                                       2130903276,
+                                       2130903286,
+                                       2130903296,
+                                       2130903331,
+                                       2130903343,
+                                       2130903360,
+                                       2130903364,
+                                       2130903365,
+                                       2130903411,
+                                       2130903414,
+                                       2130903483,
+                                       2130903493};
+                       
+                       // aapt resource value: { 0x10100B3 }
+                       public static int[] ActionBarLayout = new int[] {
+                                       16842931};
+                       
+                       // aapt resource value: 0
+                       public const int ActionBarLayout_android_layout_gravity = 0;
+                       
+                       // aapt resource value: 0
+                       public const int ActionBar_background = 0;
+                       
+                       // aapt resource value: 1
+                       public const int ActionBar_backgroundSplit = 1;
+                       
+                       // aapt resource value: 2
+                       public const int ActionBar_backgroundStacked = 2;
+                       
+                       // aapt resource value: 3
+                       public const int ActionBar_contentInsetEnd = 3;
+                       
+                       // aapt resource value: 4
+                       public const int ActionBar_contentInsetEndWithActions = 4;
+                       
+                       // aapt resource value: 5
+                       public const int ActionBar_contentInsetLeft = 5;
+                       
+                       // aapt resource value: 6
+                       public const int ActionBar_contentInsetRight = 6;
+                       
+                       // aapt resource value: 7
+                       public const int ActionBar_contentInsetStart = 7;
+                       
+                       // aapt resource value: 8
+                       public const int ActionBar_contentInsetStartWithNavigation = 8;
+                       
+                       // aapt resource value: 9
+                       public const int ActionBar_customNavigationLayout = 9;
+                       
+                       // aapt resource value: 10
+                       public const int ActionBar_displayOptions = 10;
+                       
+                       // aapt resource value: 11
+                       public const int ActionBar_divider = 11;
+                       
+                       // aapt resource value: 12
+                       public const int ActionBar_elevation = 12;
+                       
+                       // aapt resource value: 13
+                       public const int ActionBar_height = 13;
+                       
+                       // aapt resource value: 14
+                       public const int ActionBar_hideOnContentScroll = 14;
+                       
+                       // aapt resource value: 15
+                       public const int ActionBar_homeAsUpIndicator = 15;
+                       
+                       // aapt resource value: 16
+                       public const int ActionBar_homeLayout = 16;
+                       
+                       // aapt resource value: 17
+                       public const int ActionBar_icon = 17;
+                       
+                       // aapt resource value: 18
+                       public const int ActionBar_indeterminateProgressStyle = 18;
+                       
+                       // aapt resource value: 19
+                       public const int ActionBar_itemPadding = 19;
+                       
+                       // aapt resource value: 20
+                       public const int ActionBar_logo = 20;
+                       
+                       // aapt resource value: 21
+                       public const int ActionBar_navigationMode = 21;
+                       
+                       // aapt resource value: 22
+                       public const int ActionBar_popupTheme = 22;
+                       
+                       // aapt resource value: 23
+                       public const int ActionBar_progressBarPadding = 23;
+                       
+                       // aapt resource value: 24
+                       public const int ActionBar_progressBarStyle = 24;
+                       
+                       // aapt resource value: 25
+                       public const int ActionBar_subtitle = 25;
+                       
+                       // aapt resource value: 26
+                       public const int ActionBar_subtitleTextStyle = 26;
+                       
+                       // aapt resource value: 27
+                       public const int ActionBar_title = 27;
+                       
+                       // aapt resource value: 28
+                       public const int ActionBar_titleTextStyle = 28;
+                       
+                       // aapt resource value: { 0x101013F }
+                       public static int[] ActionMenuItemView = new int[] {
+                                       16843071};
+                       
+                       // aapt resource value: 0
+                       public const int ActionMenuItemView_android_minWidth = 0;
+                       
+                       // aapt resource value: { 0xFFFFFFFF }
+                       public static int[] ActionMenuView = new int[] {
+                                       -1};
+                       
+                       // aapt resource value: { 0x7F030031,0x7F030032,0x7F03007E,0x7F0300DF,0x7F030176,0x7F0301C5 }
+                       public static int[] ActionMode = new int[] {
+                                       2130903089,
+                                       2130903090,
+                                       2130903166,
+                                       2130903263,
+                                       2130903414,
+                                       2130903493};
+                       
+                       // aapt resource value: 0
+                       public const int ActionMode_background = 0;
+                       
+                       // aapt resource value: 1
+                       public const int ActionMode_backgroundSplit = 1;
+                       
+                       // aapt resource value: 2
+                       public const int ActionMode_closeItemLayout = 2;
+                       
+                       // aapt resource value: 3
+                       public const int ActionMode_height = 3;
+                       
+                       // aapt resource value: 4
+                       public const int ActionMode_subtitleTextStyle = 4;
+                       
+                       // aapt resource value: 5
+                       public const int ActionMode_titleTextStyle = 5;
+                       
+                       // aapt resource value: { 0x7F0300BA,0x7F0300F7 }
+                       public static int[] ActivityChooserView = new int[] {
+                                       2130903226,
+                                       2130903287};
+                       
+                       // aapt resource value: 0
+                       public const int ActivityChooserView_expandActivityOverflowButtonDrawable = 0;
+                       
+                       // aapt resource value: 1
+                       public const int ActivityChooserView_initialActivityCount = 1;
+                       
+                       // aapt resource value: { 0x10100F2,0x7F030052,0x7F030053,0x7F03011A,0x7F03011B,0x7F03012C,0x7F03015B,0x7F03015C }
+                       public static int[] AlertDialog = new int[] {
+                                       16842994,
+                                       2130903122,
+                                       2130903123,
+                                       2130903322,
+                                       2130903323,
+                                       2130903340,
+                                       2130903387,
+                                       2130903388};
+                       
+                       // aapt resource value: 0
+                       public const int AlertDialog_android_layout = 0;
+                       
+                       // aapt resource value: 1
+                       public const int AlertDialog_buttonIconDimen = 1;
+                       
+                       // aapt resource value: 2
+                       public const int AlertDialog_buttonPanelSideLayout = 2;
+                       
+                       // aapt resource value: 3
+                       public const int AlertDialog_listItemLayout = 3;
+                       
+                       // aapt resource value: 4
+                       public const int AlertDialog_listLayout = 4;
+                       
+                       // aapt resource value: 5
+                       public const int AlertDialog_multiChoiceItemLayout = 5;
+                       
+                       // aapt resource value: 6
+                       public const int AlertDialog_showTitle = 6;
+                       
+                       // aapt resource value: 7
+                       public const int AlertDialog_singleChoiceItemLayout = 7;
+                       
+                       // aapt resource value: { 0x101011C,0x1010194,0x1010195,0x1010196,0x101030C,0x101030D }
+                       public static int[] AnimatedStateListDrawableCompat = new int[] {
+                                       16843036,
+                                       16843156,
+                                       16843157,
+                                       16843158,
+                                       16843532,
+                                       16843533};
+                       
+                       // aapt resource value: 3
+                       public const int AnimatedStateListDrawableCompat_android_constantSize = 3;
+                       
+                       // aapt resource value: 0
+                       public const int AnimatedStateListDrawableCompat_android_dither = 0;
+                       
+                       // aapt resource value: 4
+                       public const int AnimatedStateListDrawableCompat_android_enterFadeDuration = 4;
+                       
+                       // aapt resource value: 5
+                       public const int AnimatedStateListDrawableCompat_android_exitFadeDuration = 5;
+                       
+                       // aapt resource value: 2
+                       public const int AnimatedStateListDrawableCompat_android_variablePadding = 2;
+                       
+                       // aapt resource value: 1
+                       public const int AnimatedStateListDrawableCompat_android_visible = 1;
+                       
+                       // aapt resource value: { 0x10100D0,0x1010199 }
+                       public static int[] AnimatedStateListDrawableItem = new int[] {
+                                       16842960,
+                                       16843161};
+                       
+                       // aapt resource value: 1
+                       public const int AnimatedStateListDrawableItem_android_drawable = 1;
+                       
+                       // aapt resource value: 0
+                       public const int AnimatedStateListDrawableItem_android_id = 0;
+                       
+                       // aapt resource value: { 0x1010199,0x1010449,0x101044A,0x101044B }
+                       public static int[] AnimatedStateListDrawableTransition = new int[] {
+                                       16843161,
+                                       16843849,
+                                       16843850,
+                                       16843851};
+                       
+                       // aapt resource value: 0
+                       public const int AnimatedStateListDrawableTransition_android_drawable = 0;
+                       
+                       // aapt resource value: 2
+                       public const int AnimatedStateListDrawableTransition_android_fromId = 2;
+                       
+                       // aapt resource value: 3
+                       public const int AnimatedStateListDrawableTransition_android_reversible = 3;
+                       
+                       // aapt resource value: 1
+                       public const int AnimatedStateListDrawableTransition_android_toId = 1;
+                       
+                       // aapt resource value: { 0x10100D4,0x101048F,0x1010540,0x7F0300B5,0x7F0300BB,0x7F030115 }
+                       public static int[] AppBarLayout = new int[] {
+                                       16842964,
+                                       16843919,
+                                       16844096,
+                                       2130903221,
+                                       2130903227,
+                                       2130903317};
+                       
+                       // aapt resource value: { 0x7F030169,0x7F03016A,0x7F03016B,0x7F03016C }
+                       public static int[] AppBarLayoutStates = new int[] {
+                                       2130903401,
+                                       2130903402,
+                                       2130903403,
+                                       2130903404};
+                       
+                       // aapt resource value: 0
+                       public const int AppBarLayoutStates_state_collapsed = 0;
+                       
+                       // aapt resource value: 1
+                       public const int AppBarLayoutStates_state_collapsible = 1;
+                       
+                       // aapt resource value: 2
+                       public const int AppBarLayoutStates_state_liftable = 2;
+                       
+                       // aapt resource value: 3
+                       public const int AppBarLayoutStates_state_lifted = 3;
+                       
+                       // aapt resource value: 0
+                       public const int AppBarLayout_android_background = 0;
+                       
+                       // aapt resource value: 2
+                       public const int AppBarLayout_android_keyboardNavigationCluster = 2;
+                       
+                       // aapt resource value: 1
+                       public const int AppBarLayout_android_touchscreenBlocksFocus = 1;
+                       
+                       // aapt resource value: 3
+                       public const int AppBarLayout_elevation = 3;
+                       
+                       // aapt resource value: 4
+                       public const int AppBarLayout_expanded = 4;
+                       
+                       // aapt resource value: { 0x7F030113,0x7F030114 }
+                       public static int[] AppBarLayout_Layout = new int[] {
+                                       2130903315,
+                                       2130903316};
+                       
+                       // aapt resource value: 0
+                       public const int AppBarLayout_Layout_layout_scrollFlags = 0;
+                       
+                       // aapt resource value: 1
+                       public const int AppBarLayout_Layout_layout_scrollInterpolator = 1;
+                       
+                       // aapt resource value: 5
+                       public const int AppBarLayout_liftOnScroll = 5;
+                       
+                       // aapt resource value: { 0x1010119,0x7F030166,0x7F0301B9,0x7F0301BA }
+                       public static int[] AppCompatImageView = new int[] {
+                                       16843033,
+                                       2130903398,
+                                       2130903481,
+                                       2130903482};
+                       
+                       // aapt resource value: 0
+                       public const int AppCompatImageView_android_src = 0;
+                       
+                       // aapt resource value: 1
+                       public const int AppCompatImageView_srcCompat = 1;
+                       
+                       // aapt resource value: 2
+                       public const int AppCompatImageView_tint = 2;
+                       
+                       // aapt resource value: 3
+                       public const int AppCompatImageView_tintMode = 3;
+                       
+                       // aapt resource value: { 0x1010142,0x7F0301B6,0x7F0301B7,0x7F0301B8 }
+                       public static int[] AppCompatSeekBar = new int[] {
+                                       16843074,
+                                       2130903478,
+                                       2130903479,
+                                       2130903480};
+                       
+                       // aapt resource value: 0
+                       public const int AppCompatSeekBar_android_thumb = 0;
+                       
+                       // aapt resource value: 1
+                       public const int AppCompatSeekBar_tickMark = 1;
+                       
+                       // aapt resource value: 2
+                       public const int AppCompatSeekBar_tickMarkTint = 2;
+                       
+                       // aapt resource value: 3
+                       public const int AppCompatSeekBar_tickMarkTintMode = 3;
+                       
+                       // aapt resource value: { 0x1010034,0x101016D,0x101016E,0x101016F,0x1010170,0x1010392,0x1010393 }
+                       public static int[] AppCompatTextHelper = new int[] {
+                                       16842804,
+                                       16843117,
+                                       16843118,
+                                       16843119,
+                                       16843120,
+                                       16843666,
+                                       16843667};
+                       
+                       // aapt resource value: 2
+                       public const int AppCompatTextHelper_android_drawableBottom = 2;
+                       
+                       // aapt resource value: 6
+                       public const int AppCompatTextHelper_android_drawableEnd = 6;
+                       
+                       // aapt resource value: 3
+                       public const int AppCompatTextHelper_android_drawableLeft = 3;
+                       
+                       // aapt resource value: 4
+                       public const int AppCompatTextHelper_android_drawableRight = 4;
+                       
+                       // aapt resource value: 5
+                       public const int AppCompatTextHelper_android_drawableStart = 5;
+                       
+                       // aapt resource value: 1
+                       public const int AppCompatTextHelper_android_drawableTop = 1;
+                       
+                       // aapt resource value: 0
+                       public const int AppCompatTextHelper_android_textAppearance = 0;
+                       
+                       // aapt resource value: { 0x1010034,0x7F03002C,0x7F03002D,0x7F03002E,0x7F03002F,0x7F030030,0x7F0300CE,0x7F0300D1,0x7F030108,0x7F030116,0x7F030196 }
+                       public static int[] AppCompatTextView = new int[] {
+                                       16842804,
+                                       2130903084,
+                                       2130903085,
+                                       2130903086,
+                                       2130903087,
+                                       2130903088,
+                                       2130903246,
+                                       2130903249,
+                                       2130903304,
+                                       2130903318,
+                                       2130903446};
+                       
+                       // aapt resource value: 0
+                       public const int AppCompatTextView_android_textAppearance = 0;
+                       
+                       // aapt resource value: 1
+                       public const int AppCompatTextView_autoSizeMaxTextSize = 1;
+                       
+                       // aapt resource value: 2
+                       public const int AppCompatTextView_autoSizeMinTextSize = 2;
+                       
+                       // aapt resource value: 3
+                       public const int AppCompatTextView_autoSizePresetSizes = 3;
+                       
+                       // aapt resource value: 4
+                       public const int AppCompatTextView_autoSizeStepGranularity = 4;
+                       
+                       // aapt resource value: 5
+                       public const int AppCompatTextView_autoSizeTextType = 5;
+                       
+                       // aapt resource value: 6
+                       public const int AppCompatTextView_firstBaselineToTopHeight = 6;
+                       
+                       // aapt resource value: 7
+                       public const int AppCompatTextView_fontFamily = 7;
+                       
+                       // aapt resource value: 8
+                       public const int AppCompatTextView_lastBaselineToBottomHeight = 8;
+                       
+                       // aapt resource value: 9
+                       public const int AppCompatTextView_lineHeight = 9;
+                       
+                       // aapt resource value: 10
+                       public const int AppCompatTextView_textAllCaps = 10;
+                       
+                       // aapt resource value: { 0x1010057,0x10100AE,0x7F030000,0x7F030001,0x7F030002,0x7F030003,0x7F030004,0x7F030005,0x7F030006,0x7F030007,0x7F030008,0x7F030009,0x7F03000A,0x7F03000B,0x7F03000C,0x7F03000E,0x7F03000F,0x7F030010,0x7F030011,0x7F030012,0x7F030013,0x7F030014,0x7F030015,0x7F030016,0x7F030017,0x7F030018,0x7F030019,0x7F03001A,0x7F03001B,0x7F03001C,0x7F03001D,0x7F03001E,0x7F030021,0x7F030022,0x7F030023,0x7F030024,0x7F030025,0x7F03002B,0x7F03003E,0x7F03004C,0x7F03004D,0x7F03004E,0x7F03004F,0x7F030050,0x7F030054,0x7F030055,0x7F03005F,0x7F030064,0x7F030084,0x7F030085,0x7F030086,0x7F030087,0x7F030088,0x7F030089,0x7F03008A,0x7F03008B,0x7F03008C,0x7F03008E,0x7F03009D,0x7F0300A6,0x7F0300A7,0x7F0300A8,0x7F0300AB,0x7F0300AD,0x7F0300B0,0x7F0300B1,0x7F0300B2,0x7F0300B3,0x7F0300B4,0x7F0300E9,0x7F0300F5,0x7F030118,0x7F030119,0x7F03011C,0x7F03011D,0x7F03011E,0x7F03011F,0x7F030120,0x7F030121,0x7F030122,0x7F030137,0x7F030138,0x7F030139,0x7F03013F,0x7F030141,0x7F030148,0x7F030149,0x7F03014A,0x7F03014B,0x7F030153,0x7F030154,0x7F030155,0x7F030156,0x7F030163,0x7F030164,0x7F03017A,0x7F0301A1,0x7F0301A2,0x7F0301A3,0x7F0301A4,0x7F0301A6,0x7F0301A7,0x7F0301A8,0x7F0301A9,0x7F0301AC,0x7F0301AD,0x7F0301C7,0x7F0301C8,0x7F0301C9,0x7F0301CA,0x7F0301D1,0x7F0301D3,0x7F0301D4,0x7F0301D5,0x7F0301D6,0x7F0301D7,0x7F0301D8,0x7F0301D9,0x7F0301DA,0x7F0301DB,0x7F0301DC }
+                       public static int[] AppCompatTheme = new int[] {
+                                       16842839,
+                                       16842926,
+                                       2130903040,
+                                       2130903041,
+                                       2130903042,
+                                       2130903043,
+                                       2130903044,
+                                       2130903045,
+                                       2130903046,
+                                       2130903047,
+                                       2130903048,
+                                       2130903049,
+                                       2130903050,
+                                       2130903051,
+                                       2130903052,
+                                       2130903054,
+                                       2130903055,
+                                       2130903056,
+                                       2130903057,
+                                       2130903058,
+                                       2130903059,
+                                       2130903060,
+                                       2130903061,
+                                       2130903062,
+                                       2130903063,
+                                       2130903064,
+                                       2130903065,
+                                       2130903066,
+                                       2130903067,
+                                       2130903068,
+                                       2130903069,
+                                       2130903070,
+                                       2130903073,
+                                       2130903074,
+                                       2130903075,
+                                       2130903076,
+                                       2130903077,
+                                       2130903083,
+                                       2130903102,
+                                       2130903116,
+                                       2130903117,
+                                       2130903118,
+                                       2130903119,
+                                       2130903120,
+                                       2130903124,
+                                       2130903125,
+                                       2130903135,
+                                       2130903140,
+                                       2130903172,
+                                       2130903173,
+                                       2130903174,
+                                       2130903175,
+                                       2130903176,
+                                       2130903177,
+                                       2130903178,
+                                       2130903179,
+                                       2130903180,
+                                       2130903182,
+                                       2130903197,
+                                       2130903206,
+                                       2130903207,
+                                       2130903208,
+                                       2130903211,
+                                       2130903213,
+                                       2130903216,
+                                       2130903217,
+                                       2130903218,
+                                       2130903219,
+                                       2130903220,
+                                       2130903273,
+                                       2130903285,
+                                       2130903320,
+                                       2130903321,
+                                       2130903324,
+                                       2130903325,
+                                       2130903326,
+                                       2130903327,
+                                       2130903328,
+                                       2130903329,
+                                       2130903330,
+                                       2130903351,
+                                       2130903352,
+                                       2130903353,
+                                       2130903359,
+                                       2130903361,
+                                       2130903368,
+                                       2130903369,
+                                       2130903370,
+                                       2130903371,
+                                       2130903379,
+                                       2130903380,
+                                       2130903381,
+                                       2130903382,
+                                       2130903395,
+                                       2130903396,
+                                       2130903418,
+                                       2130903457,
+                                       2130903458,
+                                       2130903459,
+                                       2130903460,
+                                       2130903462,
+                                       2130903463,
+                                       2130903464,
+                                       2130903465,
+                                       2130903468,
+                                       2130903469,
+                                       2130903495,
+                                       2130903496,
+                                       2130903497,
+                                       2130903498,
+                                       2130903505,
+                                       2130903507,
+                                       2130903508,
+                                       2130903509,
+                                       2130903510,
+                                       2130903511,
+                                       2130903512,
+                                       2130903513,
+                                       2130903514,
+                                       2130903515,
+                                       2130903516};
+                       
+                       // aapt resource value: 2
+                       public const int AppCompatTheme_actionBarDivider = 2;
+                       
+                       // aapt resource value: 3
+                       public const int AppCompatTheme_actionBarItemBackground = 3;
+                       
+                       // aapt resource value: 4
+                       public const int AppCompatTheme_actionBarPopupTheme = 4;
+                       
+                       // aapt resource value: 5
+                       public const int AppCompatTheme_actionBarSize = 5;
+                       
+                       // aapt resource value: 6
+                       public const int AppCompatTheme_actionBarSplitStyle = 6;
+                       
+                       // aapt resource value: 7
+                       public const int AppCompatTheme_actionBarStyle = 7;
+                       
+                       // aapt resource value: 8
+                       public const int AppCompatTheme_actionBarTabBarStyle = 8;
+                       
+                       // aapt resource value: 9
+                       public const int AppCompatTheme_actionBarTabStyle = 9;
+                       
+                       // aapt resource value: 10
+                       public const int AppCompatTheme_actionBarTabTextStyle = 10;
+                       
+                       // aapt resource value: 11
+                       public const int AppCompatTheme_actionBarTheme = 11;
+                       
+                       // aapt resource value: 12
+                       public const int AppCompatTheme_actionBarWidgetTheme = 12;
+                       
+                       // aapt resource value: 13
+                       public const int AppCompatTheme_actionButtonStyle = 13;
+                       
+                       // aapt resource value: 14
+                       public const int AppCompatTheme_actionDropDownStyle = 14;
+                       
+                       // aapt resource value: 15
+                       public const int AppCompatTheme_actionMenuTextAppearance = 15;
+                       
+                       // aapt resource value: 16
+                       public const int AppCompatTheme_actionMenuTextColor = 16;
+                       
+                       // aapt resource value: 17
+                       public const int AppCompatTheme_actionModeBackground = 17;
+                       
+                       // aapt resource value: 18
+                       public const int AppCompatTheme_actionModeCloseButtonStyle = 18;
+                       
+                       // aapt resource value: 19
+                       public const int AppCompatTheme_actionModeCloseDrawable = 19;
+                       
+                       // aapt resource value: 20
+                       public const int AppCompatTheme_actionModeCopyDrawable = 20;
+                       
+                       // aapt resource value: 21
+                       public const int AppCompatTheme_actionModeCutDrawable = 21;
+                       
+                       // aapt resource value: 22
+                       public const int AppCompatTheme_actionModeFindDrawable = 22;
+                       
+                       // aapt resource value: 23
+                       public const int AppCompatTheme_actionModePasteDrawable = 23;
+                       
+                       // aapt resource value: 24
+                       public const int AppCompatTheme_actionModePopupWindowStyle = 24;
+                       
+                       // aapt resource value: 25
+                       public const int AppCompatTheme_actionModeSelectAllDrawable = 25;
+                       
+                       // aapt resource value: 26
+                       public const int AppCompatTheme_actionModeShareDrawable = 26;
+                       
+                       // aapt resource value: 27
+                       public const int AppCompatTheme_actionModeSplitBackground = 27;
+                       
+                       // aapt resource value: 28
+                       public const int AppCompatTheme_actionModeStyle = 28;
+                       
+                       // aapt resource value: 29
+                       public const int AppCompatTheme_actionModeWebSearchDrawable = 29;
+                       
+                       // aapt resource value: 30
+                       public const int AppCompatTheme_actionOverflowButtonStyle = 30;
+                       
+                       // aapt resource value: 31
+                       public const int AppCompatTheme_actionOverflowMenuStyle = 31;
+                       
+                       // aapt resource value: 32
+                       public const int AppCompatTheme_activityChooserViewStyle = 32;
+                       
+                       // aapt resource value: 33
+                       public const int AppCompatTheme_alertDialogButtonGroupStyle = 33;
+                       
+                       // aapt resource value: 34
+                       public const int AppCompatTheme_alertDialogCenterButtons = 34;
+                       
+                       // aapt resource value: 35
+                       public const int AppCompatTheme_alertDialogStyle = 35;
+                       
+                       // aapt resource value: 36
+                       public const int AppCompatTheme_alertDialogTheme = 36;
+                       
+                       // aapt resource value: 1
+                       public const int AppCompatTheme_android_windowAnimationStyle = 1;
+                       
+                       // aapt resource value: 0
+                       public const int AppCompatTheme_android_windowIsFloating = 0;
+                       
+                       // aapt resource value: 37
+                       public const int AppCompatTheme_autoCompleteTextViewStyle = 37;
+                       
+                       // aapt resource value: 38
+                       public const int AppCompatTheme_borderlessButtonStyle = 38;
+                       
+                       // aapt resource value: 39
+                       public const int AppCompatTheme_buttonBarButtonStyle = 39;
+                       
+                       // aapt resource value: 40
+                       public const int AppCompatTheme_buttonBarNegativeButtonStyle = 40;
+                       
+                       // aapt resource value: 41
+                       public const int AppCompatTheme_buttonBarNeutralButtonStyle = 41;
+                       
+                       // aapt resource value: 42
+                       public const int AppCompatTheme_buttonBarPositiveButtonStyle = 42;
+                       
+                       // aapt resource value: 43
+                       public const int AppCompatTheme_buttonBarStyle = 43;
+                       
+                       // aapt resource value: 44
+                       public const int AppCompatTheme_buttonStyle = 44;
+                       
+                       // aapt resource value: 45
+                       public const int AppCompatTheme_buttonStyleSmall = 45;
+                       
+                       // aapt resource value: 46
+                       public const int AppCompatTheme_checkboxStyle = 46;
+                       
+                       // aapt resource value: 47
+                       public const int AppCompatTheme_checkedTextViewStyle = 47;
+                       
+                       // aapt resource value: 48
+                       public const int AppCompatTheme_colorAccent = 48;
+                       
+                       // aapt resource value: 49
+                       public const int AppCompatTheme_colorBackgroundFloating = 49;
+                       
+                       // aapt resource value: 50
+                       public const int AppCompatTheme_colorButtonNormal = 50;
+                       
+                       // aapt resource value: 51
+                       public const int AppCompatTheme_colorControlActivated = 51;
+                       
+                       // aapt resource value: 52
+                       public const int AppCompatTheme_colorControlHighlight = 52;
+                       
+                       // aapt resource value: 53
+                       public const int AppCompatTheme_colorControlNormal = 53;
+                       
+                       // aapt resource value: 54
+                       public const int AppCompatTheme_colorError = 54;
+                       
+                       // aapt resource value: 55
+                       public const int AppCompatTheme_colorPrimary = 55;
+                       
+                       // aapt resource value: 56
+                       public const int AppCompatTheme_colorPrimaryDark = 56;
+                       
+                       // aapt resource value: 57
+                       public const int AppCompatTheme_colorSwitchThumbNormal = 57;
+                       
+                       // aapt resource value: 58
+                       public const int AppCompatTheme_controlBackground = 58;
+                       
+                       // aapt resource value: 59
+                       public const int AppCompatTheme_dialogCornerRadius = 59;
+                       
+                       // aapt resource value: 60
+                       public const int AppCompatTheme_dialogPreferredPadding = 60;
+                       
+                       // aapt resource value: 61
+                       public const int AppCompatTheme_dialogTheme = 61;
+                       
+                       // aapt resource value: 62
+                       public const int AppCompatTheme_dividerHorizontal = 62;
+                       
+                       // aapt resource value: 63
+                       public const int AppCompatTheme_dividerVertical = 63;
+                       
+                       // aapt resource value: 65
+                       public const int AppCompatTheme_dropdownListPreferredItemHeight = 65;
+                       
+                       // aapt resource value: 64
+                       public const int AppCompatTheme_dropDownListViewStyle = 64;
+                       
+                       // aapt resource value: 66
+                       public const int AppCompatTheme_editTextBackground = 66;
+                       
+                       // aapt resource value: 67
+                       public const int AppCompatTheme_editTextColor = 67;
+                       
+                       // aapt resource value: 68
+                       public const int AppCompatTheme_editTextStyle = 68;
+                       
+                       // aapt resource value: 69
+                       public const int AppCompatTheme_homeAsUpIndicator = 69;
+                       
+                       // aapt resource value: 70
+                       public const int AppCompatTheme_imageButtonStyle = 70;
+                       
+                       // aapt resource value: 71
+                       public const int AppCompatTheme_listChoiceBackgroundIndicator = 71;
+                       
+                       // aapt resource value: 72
+                       public const int AppCompatTheme_listDividerAlertDialog = 72;
+                       
+                       // aapt resource value: 73
+                       public const int AppCompatTheme_listMenuViewStyle = 73;
+                       
+                       // aapt resource value: 74
+                       public const int AppCompatTheme_listPopupWindowStyle = 74;
+                       
+                       // aapt resource value: 75
+                       public const int AppCompatTheme_listPreferredItemHeight = 75;
+                       
+                       // aapt resource value: 76
+                       public const int AppCompatTheme_listPreferredItemHeightLarge = 76;
+                       
+                       // aapt resource value: 77
+                       public const int AppCompatTheme_listPreferredItemHeightSmall = 77;
+                       
+                       // aapt resource value: 78
+                       public const int AppCompatTheme_listPreferredItemPaddingLeft = 78;
+                       
+                       // aapt resource value: 79
+                       public const int AppCompatTheme_listPreferredItemPaddingRight = 79;
+                       
+                       // aapt resource value: 80
+                       public const int AppCompatTheme_panelBackground = 80;
+                       
+                       // aapt resource value: 81
+                       public const int AppCompatTheme_panelMenuListTheme = 81;
+                       
+                       // aapt resource value: 82
+                       public const int AppCompatTheme_panelMenuListWidth = 82;
+                       
+                       // aapt resource value: 83
+                       public const int AppCompatTheme_popupMenuStyle = 83;
+                       
+                       // aapt resource value: 84
+                       public const int AppCompatTheme_popupWindowStyle = 84;
+                       
+                       // aapt resource value: 85
+                       public const int AppCompatTheme_radioButtonStyle = 85;
+                       
+                       // aapt resource value: 86
+                       public const int AppCompatTheme_ratingBarStyle = 86;
+                       
+                       // aapt resource value: 87
+                       public const int AppCompatTheme_ratingBarStyleIndicator = 87;
+                       
+                       // aapt resource value: 88
+                       public const int AppCompatTheme_ratingBarStyleSmall = 88;
+                       
+                       // aapt resource value: 89
+                       public const int AppCompatTheme_searchViewStyle = 89;
+                       
+                       // aapt resource value: 90
+                       public const int AppCompatTheme_seekBarStyle = 90;
+                       
+                       // aapt resource value: 91
+                       public const int AppCompatTheme_selectableItemBackground = 91;
+                       
+                       // aapt resource value: 92
+                       public const int AppCompatTheme_selectableItemBackgroundBorderless = 92;
+                       
+                       // aapt resource value: 93
+                       public const int AppCompatTheme_spinnerDropDownItemStyle = 93;
+                       
+                       // aapt resource value: 94
+                       public const int AppCompatTheme_spinnerStyle = 94;
+                       
+                       // aapt resource value: 95
+                       public const int AppCompatTheme_switchStyle = 95;
+                       
+                       // aapt resource value: 96
+                       public const int AppCompatTheme_textAppearanceLargePopupMenu = 96;
+                       
+                       // aapt resource value: 97
+                       public const int AppCompatTheme_textAppearanceListItem = 97;
+                       
+                       // aapt resource value: 98
+                       public const int AppCompatTheme_textAppearanceListItemSecondary = 98;
+                       
+                       // aapt resource value: 99
+                       public const int AppCompatTheme_textAppearanceListItemSmall = 99;
+                       
+                       // aapt resource value: 100
+                       public const int AppCompatTheme_textAppearancePopupMenuHeader = 100;
+                       
+                       // aapt resource value: 101
+                       public const int AppCompatTheme_textAppearanceSearchResultSubtitle = 101;
+                       
+                       // aapt resource value: 102
+                       public const int AppCompatTheme_textAppearanceSearchResultTitle = 102;
+                       
+                       // aapt resource value: 103
+                       public const int AppCompatTheme_textAppearanceSmallPopupMenu = 103;
+                       
+                       // aapt resource value: 104
+                       public const int AppCompatTheme_textColorAlertDialogListItem = 104;
+                       
+                       // aapt resource value: 105
+                       public const int AppCompatTheme_textColorSearchUrl = 105;
+                       
+                       // aapt resource value: 106
+                       public const int AppCompatTheme_toolbarNavigationButtonStyle = 106;
+                       
+                       // aapt resource value: 107
+                       public const int AppCompatTheme_toolbarStyle = 107;
+                       
+                       // aapt resource value: 108
+                       public const int AppCompatTheme_tooltipForegroundColor = 108;
+                       
+                       // aapt resource value: 109
+                       public const int AppCompatTheme_tooltipFrameBackground = 109;
+                       
+                       // aapt resource value: 110
+                       public const int AppCompatTheme_viewInflaterClass = 110;
+                       
+                       // aapt resource value: 111
+                       public const int AppCompatTheme_windowActionBar = 111;
+                       
+                       // aapt resource value: 112
+                       public const int AppCompatTheme_windowActionBarOverlay = 112;
+                       
+                       // aapt resource value: 113
+                       public const int AppCompatTheme_windowActionModeOverlay = 113;
+                       
+                       // aapt resource value: 114
+                       public const int AppCompatTheme_windowFixedHeightMajor = 114;
+                       
+                       // aapt resource value: 115
+                       public const int AppCompatTheme_windowFixedHeightMinor = 115;
+                       
+                       // aapt resource value: 116
+                       public const int AppCompatTheme_windowFixedWidthMajor = 116;
+                       
+                       // aapt resource value: 117
+                       public const int AppCompatTheme_windowFixedWidthMinor = 117;
+                       
+                       // aapt resource value: 118
+                       public const int AppCompatTheme_windowMinWidthMajor = 118;
+                       
+                       // aapt resource value: 119
+                       public const int AppCompatTheme_windowMinWidthMinor = 119;
+                       
+                       // aapt resource value: 120
+                       public const int AppCompatTheme_windowNoTitle = 120;
+                       
+                       // aapt resource value: { 0x7F030034,0x7F0300C3,0x7F0300C4,0x7F0300C5,0x7F0300C6,0x7F0300E5 }
+                       public static int[] BottomAppBar = new int[] {
+                                       2130903092,
+                                       2130903235,
+                                       2130903236,
+                                       2130903237,
+                                       2130903238,
+                                       2130903269};
+                       
+                       // aapt resource value: 0
+                       public const int BottomAppBar_backgroundTint = 0;
+                       
+                       // aapt resource value: 1
+                       public const int BottomAppBar_fabAlignmentMode = 1;
+                       
+                       // aapt resource value: 2
+                       public const int BottomAppBar_fabCradleMargin = 2;
+                       
+                       // aapt resource value: 3
+                       public const int BottomAppBar_fabCradleRoundedCornerRadius = 3;
+                       
+                       // aapt resource value: 4
+                       public const int BottomAppBar_fabCradleVerticalOffset = 4;
+                       
+                       // aapt resource value: 5
+                       public const int BottomAppBar_hideOnScroll = 5;
+                       
+                       // aapt resource value: { 0x7F0300B5,0x7F0300FA,0x7F0300FC,0x7F0300FE,0x7F0300FF,0x7F030103,0x7F030104,0x7F030105,0x7F030107,0x7F03012B }
+                       public static int[] BottomNavigationView = new int[] {
+                                       2130903221,
+                                       2130903290,
+                                       2130903292,
+                                       2130903294,
+                                       2130903295,
+                                       2130903299,
+                                       2130903300,
+                                       2130903301,
+                                       2130903303,
+                                       2130903339};
+                       
+                       // aapt resource value: 0
+                       public const int BottomNavigationView_elevation = 0;
+                       
+                       // aapt resource value: 1
+                       public const int BottomNavigationView_itemBackground = 1;
+                       
+                       // aapt resource value: 2
+                       public const int BottomNavigationView_itemHorizontalTranslationEnabled = 2;
+                       
+                       // aapt resource value: 3
+                       public const int BottomNavigationView_itemIconSize = 3;
+                       
+                       // aapt resource value: 4
+                       public const int BottomNavigationView_itemIconTint = 4;
+                       
+                       // aapt resource value: 5
+                       public const int BottomNavigationView_itemTextAppearanceActive = 5;
+                       
+                       // aapt resource value: 6
+                       public const int BottomNavigationView_itemTextAppearanceInactive = 6;
+                       
+                       // aapt resource value: 7
+                       public const int BottomNavigationView_itemTextColor = 7;
+                       
+                       // aapt resource value: 8
+                       public const int BottomNavigationView_labelVisibilityMode = 8;
+                       
+                       // aapt resource value: 9
+                       public const int BottomNavigationView_menu = 9;
+                       
+                       // aapt resource value: { 0x7F030038,0x7F030039,0x7F03003B,0x7F03003C }
+                       public static int[] BottomSheetBehavior_Layout = new int[] {
+                                       2130903096,
+                                       2130903097,
+                                       2130903099,
+                                       2130903100};
+                       
+                       // aapt resource value: 0
+                       public const int BottomSheetBehavior_Layout_behavior_fitToContents = 0;
+                       
+                       // aapt resource value: 1
+                       public const int BottomSheetBehavior_Layout_behavior_hideable = 1;
+                       
+                       // aapt resource value: 2
+                       public const int BottomSheetBehavior_Layout_behavior_peekHeight = 2;
+                       
+                       // aapt resource value: 3
+                       public const int BottomSheetBehavior_Layout_behavior_skipCollapsed = 3;
+                       
+                       // aapt resource value: { 0x7F030026 }
+                       public static int[] ButtonBarLayout = new int[] {
+                                       2130903078};
+                       
+                       // aapt resource value: 0
+                       public const int ButtonBarLayout_allowStacking = 0;
+                       
+                       // aapt resource value: { 0x101013F,0x1010140,0x7F030058,0x7F030059,0x7F03005A,0x7F03005B,0x7F03005C,0x7F03005D,0x7F030097,0x7F030098,0x7F030099,0x7F03009A,0x7F03009B }
+                       public static int[] CardView = new int[] {
+                                       16843071,
+                                       16843072,
+                                       2130903128,
+                                       2130903129,
+                                       2130903130,
+                                       2130903131,
+                                       2130903132,
+                                       2130903133,
+                                       2130903191,
+                                       2130903192,
+                                       2130903193,
+                                       2130903194,
+                                       2130903195};
+                       
+                       // aapt resource value: 1
+                       public const int CardView_android_minHeight = 1;
+                       
+                       // aapt resource value: 0
+                       public const int CardView_android_minWidth = 0;
+                       
+                       // aapt resource value: 2
+                       public const int CardView_cardBackgroundColor = 2;
+                       
+                       // aapt resource value: 3
+                       public const int CardView_cardCornerRadius = 3;
+                       
+                       // aapt resource value: 4
+                       public const int CardView_cardElevation = 4;
+                       
+                       // aapt resource value: 5
+                       public const int CardView_cardMaxElevation = 5;
+                       
+                       // aapt resource value: 6
+                       public const int CardView_cardPreventCornerOverlap = 6;
+                       
+                       // aapt resource value: 7
+                       public const int CardView_cardUseCompatPadding = 7;
+                       
+                       // aapt resource value: 8
+                       public const int CardView_contentPadding = 8;
+                       
+                       // aapt resource value: 9
+                       public const int CardView_contentPaddingBottom = 9;
+                       
+                       // aapt resource value: 10
+                       public const int CardView_contentPaddingLeft = 10;
+                       
+                       // aapt resource value: 11
+                       public const int CardView_contentPaddingRight = 11;
+                       
+                       // aapt resource value: 12
+                       public const int CardView_contentPaddingTop = 12;
+                       
+                       // aapt resource value: { 0x1010034,0x10100AB,0x101011F,0x101014F,0x10101E5,0x7F030061,0x7F030062,0x7F030063,0x7F030065,0x7F030066,0x7F030067,0x7F030069,0x7F03006A,0x7F03006B,0x7F03006C,0x7F03006D,0x7F03006E,0x7F030073,0x7F030074,0x7F030075,0x7F030077,0x7F030078,0x7F030079,0x7F03007A,0x7F03007B,0x7F03007C,0x7F03007D,0x7F0300E3,0x7F0300ED,0x7F0300F1,0x7F03014D,0x7F030159,0x7F0301AE,0x7F0301B0 }
+                       public static int[] Chip = new int[] {
+                                       16842804,
+                                       16842923,
+                                       16843039,
+                                       16843087,
+                                       16843237,
+                                       2130903137,
+                                       2130903138,
+                                       2130903139,
+                                       2130903141,
+                                       2130903142,
+                                       2130903143,
+                                       2130903145,
+                                       2130903146,
+                                       2130903147,
+                                       2130903148,
+                                       2130903149,
+                                       2130903150,
+                                       2130903155,
+                                       2130903156,
+                                       2130903157,
+                                       2130903159,
+                                       2130903160,
+                                       2130903161,
+                                       2130903162,
+                                       2130903163,
+                                       2130903164,
+                                       2130903165,
+                                       2130903267,
+                                       2130903277,
+                                       2130903281,
+                                       2130903373,
+                                       2130903385,
+                                       2130903470,
+                                       2130903472};
+                       
+                       // aapt resource value: { 0x7F030060,0x7F03006F,0x7F030070,0x7F030071,0x7F03015D,0x7F03015E }
+                       public static int[] ChipGroup = new int[] {
+                                       2130903136,
+                                       2130903151,
+                                       2130903152,
+                                       2130903153,
+                                       2130903389,
+                                       2130903390};
+                       
+                       // aapt resource value: 0
+                       public const int ChipGroup_checkedChip = 0;
+                       
+                       // aapt resource value: 1
+                       public const int ChipGroup_chipSpacing = 1;
+                       
+                       // aapt resource value: 2
+                       public const int ChipGroup_chipSpacingHorizontal = 2;
+                       
+                       // aapt resource value: 3
+                       public const int ChipGroup_chipSpacingVertical = 3;
+                       
+                       // aapt resource value: 4
+                       public const int ChipGroup_singleLine = 4;
+                       
+                       // aapt resource value: 5
+                       public const int ChipGroup_singleSelection = 5;
+                       
+                       // aapt resource value: 4
+                       public const int Chip_android_checkable = 4;
+                       
+                       // aapt resource value: 1
+                       public const int Chip_android_ellipsize = 1;
+                       
+                       // aapt resource value: 2
+                       public const int Chip_android_maxWidth = 2;
+                       
+                       // aapt resource value: 3
+                       public const int Chip_android_text = 3;
+                       
+                       // aapt resource value: 0
+                       public const int Chip_android_textAppearance = 0;
+                       
+                       // aapt resource value: 5
+                       public const int Chip_checkedIcon = 5;
+                       
+                       // aapt resource value: 6
+                       public const int Chip_checkedIconEnabled = 6;
+                       
+                       // aapt resource value: 7
+                       public const int Chip_checkedIconVisible = 7;
+                       
+                       // aapt resource value: 8
+                       public const int Chip_chipBackgroundColor = 8;
+                       
+                       // aapt resource value: 9
+                       public const int Chip_chipCornerRadius = 9;
+                       
+                       // aapt resource value: 10
+                       public const int Chip_chipEndPadding = 10;
+                       
+                       // aapt resource value: 11
+                       public const int Chip_chipIcon = 11;
+                       
+                       // aapt resource value: 12
+                       public const int Chip_chipIconEnabled = 12;
+                       
+                       // aapt resource value: 13
+                       public const int Chip_chipIconSize = 13;
+                       
+                       // aapt resource value: 14
+                       public const int Chip_chipIconTint = 14;
+                       
+                       // aapt resource value: 15
+                       public const int Chip_chipIconVisible = 15;
+                       
+                       // aapt resource value: 16
+                       public const int Chip_chipMinHeight = 16;
+                       
+                       // aapt resource value: 17
+                       public const int Chip_chipStartPadding = 17;
+                       
+                       // aapt resource value: 18
+                       public const int Chip_chipStrokeColor = 18;
+                       
+                       // aapt resource value: 19
+                       public const int Chip_chipStrokeWidth = 19;
+                       
+                       // aapt resource value: 20
+                       public const int Chip_closeIcon = 20;
+                       
+                       // aapt resource value: 21
+                       public const int Chip_closeIconEnabled = 21;
+                       
+                       // aapt resource value: 22
+                       public const int Chip_closeIconEndPadding = 22;
+                       
+                       // aapt resource value: 23
+                       public const int Chip_closeIconSize = 23;
+                       
+                       // aapt resource value: 24
+                       public const int Chip_closeIconStartPadding = 24;
+                       
+                       // aapt resource value: 25
+                       public const int Chip_closeIconTint = 25;
+                       
+                       // aapt resource value: 26
+                       public const int Chip_closeIconVisible = 26;
+                       
+                       // aapt resource value: 27
+                       public const int Chip_hideMotionSpec = 27;
+                       
+                       // aapt resource value: 28
+                       public const int Chip_iconEndPadding = 28;
+                       
+                       // aapt resource value: 29
+                       public const int Chip_iconStartPadding = 29;
+                       
+                       // aapt resource value: 30
+                       public const int Chip_rippleColor = 30;
+                       
+                       // aapt resource value: 31
+                       public const int Chip_showMotionSpec = 31;
+                       
+                       // aapt resource value: 32
+                       public const int Chip_textEndPadding = 32;
+                       
+                       // aapt resource value: 33
+                       public const int Chip_textStartPadding = 33;
+                       
+                       // aapt resource value: { 0x7F030081,0x7F030082,0x7F03009C,0x7F0300BC,0x7F0300BD,0x7F0300BE,0x7F0300BF,0x7F0300C0,0x7F0300C1,0x7F0300C2,0x7F03014E,0x7F030150,0x7F03016E,0x7F0301BB,0x7F0301BC,0x7F0301C6 }
+                       public static int[] CollapsingToolbarLayout = new int[] {
+                                       2130903169,
+                                       2130903170,
+                                       2130903196,
+                                       2130903228,
+                                       2130903229,
+                                       2130903230,
+                                       2130903231,
+                                       2130903232,
+                                       2130903233,
+                                       2130903234,
+                                       2130903374,
+                                       2130903376,
+                                       2130903406,
+                                       2130903483,
+                                       2130903484,
+                                       2130903494};
+                       
+                       // aapt resource value: 0
+                       public const int CollapsingToolbarLayout_collapsedTitleGravity = 0;
+                       
+                       // aapt resource value: 1
+                       public const int CollapsingToolbarLayout_collapsedTitleTextAppearance = 1;
+                       
+                       // aapt resource value: 2
+                       public const int CollapsingToolbarLayout_contentScrim = 2;
+                       
+                       // aapt resource value: 3
+                       public const int CollapsingToolbarLayout_expandedTitleGravity = 3;
+                       
+                       // aapt resource value: 4
+                       public const int CollapsingToolbarLayout_expandedTitleMargin = 4;
+                       
+                       // aapt resource value: 5
+                       public const int CollapsingToolbarLayout_expandedTitleMarginBottom = 5;
+                       
+                       // aapt resource value: 6
+                       public const int CollapsingToolbarLayout_expandedTitleMarginEnd = 6;
+                       
+                       // aapt resource value: 7
+                       public const int CollapsingToolbarLayout_expandedTitleMarginStart = 7;
+                       
+                       // aapt resource value: 8
+                       public const int CollapsingToolbarLayout_expandedTitleMarginTop = 8;
+                       
+                       // aapt resource value: 9
+                       public const int CollapsingToolbarLayout_expandedTitleTextAppearance = 9;
+                       
+                       // aapt resource value: { 0x7F03010E,0x7F03010F }
+                       public static int[] CollapsingToolbarLayout_Layout = new int[] {
+                                       2130903310,
+                                       2130903311};
+                       
+                       // aapt resource value: 0
+                       public const int CollapsingToolbarLayout_Layout_layout_collapseMode = 0;
+                       
+                       // aapt resource value: 1
+                       public const int CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier = 1;
+                       
+                       // aapt resource value: 10
+                       public const int CollapsingToolbarLayout_scrimAnimationDuration = 10;
+                       
+                       // aapt resource value: 11
+                       public const int CollapsingToolbarLayout_scrimVisibleHeightTrigger = 11;
+                       
+                       // aapt resource value: 12
+                       public const int CollapsingToolbarLayout_statusBarScrim = 12;
+                       
+                       // aapt resource value: 13
+                       public const int CollapsingToolbarLayout_title = 13;
+                       
+                       // aapt resource value: 14
+                       public const int CollapsingToolbarLayout_titleEnabled = 14;
+                       
+                       // aapt resource value: 15
+                       public const int CollapsingToolbarLayout_toolbarId = 15;
+                       
+                       // aapt resource value: { 0x10101A5,0x101031F,0x7F030027 }
+                       public static int[] ColorStateListItem = new int[] {
+                                       16843173,
+                                       16843551,
+                                       2130903079};
+                       
+                       // aapt resource value: 2
+                       public const int ColorStateListItem_alpha = 2;
+                       
+                       // aapt resource value: 1
+                       public const int ColorStateListItem_android_alpha = 1;
+                       
+                       // aapt resource value: 0
+                       public const int ColorStateListItem_android_color = 0;
+                       
+                       // aapt resource value: { 0x1010107,0x7F030056,0x7F030057 }
+                       public static int[] CompoundButton = new int[] {
+                                       16843015,
+                                       2130903126,
+                                       2130903127};
+                       
+                       // aapt resource value: 0
+                       public const int CompoundButton_android_button = 0;
+                       
+                       // aapt resource value: 1
+                       public const int CompoundButton_buttonTint = 1;
+                       
+                       // aapt resource value: 2
+                       public const int CompoundButton_buttonTintMode = 2;
+                       
+                       // aapt resource value: { 0x7F030106,0x7F03016D }
+                       public static int[] CoordinatorLayout = new int[] {
+                                       2130903302,
+                                       2130903405};
+                       
+                       // aapt resource value: 0
+                       public const int CoordinatorLayout_keylines = 0;
+                       
+                       // aapt resource value: { 0x10100B3,0x7F03010B,0x7F03010C,0x7F03010D,0x7F030110,0x7F030111,0x7F030112 }
+                       public static int[] CoordinatorLayout_Layout = new int[] {
+                                       16842931,
+                                       2130903307,
+                                       2130903308,
+                                       2130903309,
+                                       2130903312,
+                                       2130903313,
+                                       2130903314};
+                       
+                       // aapt resource value: 0
+                       public const int CoordinatorLayout_Layout_android_layout_gravity = 0;
+                       
+                       // aapt resource value: 1
+                       public const int CoordinatorLayout_Layout_layout_anchor = 1;
+                       
+                       // aapt resource value: 2
+                       public const int CoordinatorLayout_Layout_layout_anchorGravity = 2;
+                       
+                       // aapt resource value: 3
+                       public const int CoordinatorLayout_Layout_layout_behavior = 3;
+                       
+                       // aapt resource value: 4
+                       public const int CoordinatorLayout_Layout_layout_dodgeInsetEdges = 4;
+                       
+                       // aapt resource value: 5
+                       public const int CoordinatorLayout_Layout_layout_insetEdge = 5;
+                       
+                       // aapt resource value: 6
+                       public const int CoordinatorLayout_Layout_layout_keyline = 6;
+                       
+                       // aapt resource value: 1
+                       public const int CoordinatorLayout_statusBarBackground = 1;
+                       
+                       // aapt resource value: { 0x7F030041,0x7F030042 }
+                       public static int[] DesignTheme = new int[] {
+                                       2130903105,
+                                       2130903106};
+                       
+                       // aapt resource value: 0
+                       public const int DesignTheme_bottomSheetDialogTheme = 0;
+                       
+                       // aapt resource value: 1
+                       public const int DesignTheme_bottomSheetStyle = 1;
+                       
+                       // aapt resource value: { 0x7F030029,0x7F03002A,0x7F030036,0x7F030083,0x7F0300AE,0x7F0300DC,0x7F030162,0x7F0301B2 }
+                       public static int[] DrawerArrowToggle = new int[] {
+                                       2130903081,
+                                       2130903082,
+                                       2130903094,
+                                       2130903171,
+                                       2130903214,
+                                       2130903260,
+                                       2130903394,
+                                       2130903474};
+                       
+                       // aapt resource value: 0
+                       public const int DrawerArrowToggle_arrowHeadLength = 0;
+                       
+                       // aapt resource value: 1
+                       public const int DrawerArrowToggle_arrowShaftLength = 1;
+                       
+                       // aapt resource value: 2
+                       public const int DrawerArrowToggle_barLength = 2;
+                       
+                       // aapt resource value: 3
+                       public const int DrawerArrowToggle_color = 3;
+                       
+                       // aapt resource value: 4
+                       public const int DrawerArrowToggle_drawableSize = 4;
+                       
+                       // aapt resource value: 5
+                       public const int DrawerArrowToggle_gapBetweenBars = 5;
+                       
+                       // aapt resource value: 6
+                       public const int DrawerArrowToggle_spinBars = 6;
+                       
+                       // aapt resource value: 7
+                       public const int DrawerArrowToggle_thickness = 7;
+                       
+                       // aapt resource value: { 0x7F030034,0x7F030035,0x7F03003D,0x7F0300B5,0x7F0300C7,0x7F0300C8,0x7F0300E3,0x7F0300EB,0x7F030129,0x7F030143,0x7F03014D,0x7F030159,0x7F0301D0 }
+                       public static int[] FloatingActionButton = new int[] {
+                                       2130903092,
+                                       2130903093,
+                                       2130903101,
+                                       2130903221,
+                                       2130903239,
+                                       2130903240,
+                                       2130903267,
+                                       2130903275,
+                                       2130903337,
+                                       2130903363,
+                                       2130903373,
+                                       2130903385,
+                                       2130903504};
+                       
+                       // aapt resource value: 0
+                       public const int FloatingActionButton_backgroundTint = 0;
+                       
+                       // aapt resource value: 1
+                       public const int FloatingActionButton_backgroundTintMode = 1;
+                       
+                       // aapt resource value: { 0x7F030037 }
+                       public static int[] FloatingActionButton_Behavior_Layout = new int[] {
+                                       2130903095};
+                       
+                       // aapt resource value: 0
+                       public const int FloatingActionButton_Behavior_Layout_behavior_autoHide = 0;
+                       
+                       // aapt resource value: 2
+                       public const int FloatingActionButton_borderWidth = 2;
+                       
+                       // aapt resource value: 3
+                       public const int FloatingActionButton_elevation = 3;
+                       
+                       // aapt resource value: 4
+                       public const int FloatingActionButton_fabCustomSize = 4;
+                       
+                       // aapt resource value: 5
+                       public const int FloatingActionButton_fabSize = 5;
+                       
+                       // aapt resource value: 6
+                       public const int FloatingActionButton_hideMotionSpec = 6;
+                       
+                       // aapt resource value: 7
+                       public const int FloatingActionButton_hoveredFocusedTranslationZ = 7;
+                       
+                       // aapt resource value: 8
+                       public const int FloatingActionButton_maxImageSize = 8;
+                       
+                       // aapt resource value: 9
+                       public const int FloatingActionButton_pressedTranslationZ = 9;
+                       
+                       // aapt resource value: 10
+                       public const int FloatingActionButton_rippleColor = 10;
+                       
+                       // aapt resource value: 11
+                       public const int FloatingActionButton_showMotionSpec = 11;
+                       
+                       // aapt resource value: 12
+                       public const int FloatingActionButton_useCompatPadding = 12;
+                       
+                       // aapt resource value: { 0x7F030101,0x7F030117 }
+                       public static int[] FlowLayout = new int[] {
+                                       2130903297,
+                                       2130903319};
+                       
+                       // aapt resource value: 0
+                       public const int FlowLayout_itemSpacing = 0;
+                       
+                       // aapt resource value: 1
+                       public const int FlowLayout_lineSpacing = 1;
+                       
+                       // aapt resource value: { 0x7F0300D2,0x7F0300D3,0x7F0300D4,0x7F0300D5,0x7F0300D6,0x7F0300D7 }
+                       public static int[] FontFamily = new int[] {
+                                       2130903250,
+                                       2130903251,
+                                       2130903252,
+                                       2130903253,
+                                       2130903254,
+                                       2130903255};
+                       
+                       // aapt resource value: { 0x1010532,0x1010533,0x101053F,0x101056F,0x1010570,0x7F0300D0,0x7F0300D8,0x7F0300D9,0x7F0300DA,0x7F0301CF }
+                       public static int[] FontFamilyFont = new int[] {
+                                       16844082,
+                                       16844083,
+                                       16844095,
+                                       16844143,
+                                       16844144,
+                                       2130903248,
+                                       2130903256,
+                                       2130903257,
+                                       2130903258,
+                                       2130903503};
+                       
+                       // aapt resource value: 0
+                       public const int FontFamilyFont_android_font = 0;
+                       
+                       // aapt resource value: 2
+                       public const int FontFamilyFont_android_fontStyle = 2;
+                       
+                       // aapt resource value: 4
+                       public const int FontFamilyFont_android_fontVariationSettings = 4;
+                       
+                       // aapt resource value: 1
+                       public const int FontFamilyFont_android_fontWeight = 1;
+                       
+                       // aapt resource value: 3
+                       public const int FontFamilyFont_android_ttcIndex = 3;
+                       
+                       // aapt resource value: 5
+                       public const int FontFamilyFont_font = 5;
+                       
+                       // aapt resource value: 6
+                       public const int FontFamilyFont_fontStyle = 6;
+                       
+                       // aapt resource value: 7
+                       public const int FontFamilyFont_fontVariationSettings = 7;
+                       
+                       // aapt resource value: 8
+                       public const int FontFamilyFont_fontWeight = 8;
+                       
+                       // aapt resource value: 9
+                       public const int FontFamilyFont_ttcIndex = 9;
+                       
+                       // aapt resource value: 0
+                       public const int FontFamily_fontProviderAuthority = 0;
+                       
+                       // aapt resource value: 1
+                       public const int FontFamily_fontProviderCerts = 1;
+                       
+                       // aapt resource value: 2
+                       public const int FontFamily_fontProviderFetchStrategy = 2;
+                       
+                       // aapt resource value: 3
+                       public const int FontFamily_fontProviderFetchTimeout = 3;
+                       
+                       // aapt resource value: 4
+                       public const int FontFamily_fontProviderPackage = 4;
+                       
+                       // aapt resource value: 5
+                       public const int FontFamily_fontProviderQuery = 5;
+                       
+                       // aapt resource value: { 0x1010109,0x1010200,0x7F0300DB }
+                       public static int[] ForegroundLinearLayout = new int[] {
+                                       16843017,
+                                       16843264,
+                                       2130903259};
+                       
+                       // aapt resource value: 0
+                       public const int ForegroundLinearLayout_android_foreground = 0;
+                       
+                       // aapt resource value: 1
+                       public const int ForegroundLinearLayout_android_foregroundGravity = 1;
+                       
+                       // aapt resource value: 2
+                       public const int ForegroundLinearLayout_foregroundInsidePadding = 2;
+                       
+                       // aapt resource value: { 0x101019D,0x101019E,0x10101A1,0x10101A2,0x10101A3,0x10101A4,0x1010201,0x101020B,0x1010510,0x1010511,0x1010512,0x1010513 }
+                       public static int[] GradientColor = new int[] {
+                                       16843165,
+                                       16843166,
+                                       16843169,
+                                       16843170,
+                                       16843171,
+                                       16843172,
+                                       16843265,
+                                       16843275,
+                                       16844048,
+                                       16844049,
+                                       16844050,
+                                       16844051};
+                       
+                       // aapt resource value: { 0x10101A5,0x1010514 }
+                       public static int[] GradientColorItem = new int[] {
+                                       16843173,
+                                       16844052};
+                       
+                       // aapt resource value: 0
+                       public const int GradientColorItem_android_color = 0;
+                       
+                       // aapt resource value: 1
+                       public const int GradientColorItem_android_offset = 1;
+                       
+                       // aapt resource value: 7
+                       public const int GradientColor_android_centerColor = 7;
+                       
+                       // aapt resource value: 3
+                       public const int GradientColor_android_centerX = 3;
+                       
+                       // aapt resource value: 4
+                       public const int GradientColor_android_centerY = 4;
+                       
+                       // aapt resource value: 1
+                       public const int GradientColor_android_endColor = 1;
+                       
+                       // aapt resource value: 10
+                       public const int GradientColor_android_endX = 10;
+                       
+                       // aapt resource value: 11
+                       public const int GradientColor_android_endY = 11;
+                       
+                       // aapt resource value: 5
+                       public const int GradientColor_android_gradientRadius = 5;
+                       
+                       // aapt resource value: 0
+                       public const int GradientColor_android_startColor = 0;
+                       
+                       // aapt resource value: 8
+                       public const int GradientColor_android_startX = 8;
+                       
+                       // aapt resource value: 9
+                       public const int GradientColor_android_startY = 9;
+                       
+                       // aapt resource value: 6
+                       public const int GradientColor_android_tileMode = 6;
+                       
+                       // aapt resource value: 2
+                       public const int GradientColor_android_type = 2;
+                       
+                       // aapt resource value: { 0x10100AF,0x10100C4,0x1010126,0x1010127,0x1010128,0x7F0300AA,0x7F0300AC,0x7F03012A,0x7F030158 }
+                       public static int[] LinearLayoutCompat = new int[] {
+                                       16842927,
+                                       16842948,
+                                       16843046,
+                                       16843047,
+                                       16843048,
+                                       2130903210,
+                                       2130903212,
+                                       2130903338,
+                                       2130903384};
+                       
+                       // aapt resource value: 2
+                       public const int LinearLayoutCompat_android_baselineAligned = 2;
+                       
+                       // aapt resource value: 3
+                       public const int LinearLayoutCompat_android_baselineAlignedChildIndex = 3;
+                       
+                       // aapt resource value: 0
+                       public const int LinearLayoutCompat_android_gravity = 0;
+                       
+                       // aapt resource value: 1
+                       public const int LinearLayoutCompat_android_orientation = 1;
+                       
+                       // aapt resource value: 4
+                       public const int LinearLayoutCompat_android_weightSum = 4;
+                       
+                       // aapt resource value: 5
+                       public const int LinearLayoutCompat_divider = 5;
+                       
+                       // aapt resource value: 6
+                       public const int LinearLayoutCompat_dividerPadding = 6;
+                       
+                       // aapt resource value: { 0x10100B3,0x10100F4,0x10100F5,0x1010181 }
+                       public static int[] LinearLayoutCompat_Layout = new int[] {
+                                       16842931,
+                                       16842996,
+                                       16842997,
+                                       16843137};
+                       
+                       // aapt resource value: 0
+                       public const int LinearLayoutCompat_Layout_android_layout_gravity = 0;
+                       
+                       // aapt resource value: 2
+                       public const int LinearLayoutCompat_Layout_android_layout_height = 2;
+                       
+                       // aapt resource value: 3
+                       public const int LinearLayoutCompat_Layout_android_layout_weight = 3;
+                       
+                       // aapt resource value: 1
+                       public const int LinearLayoutCompat_Layout_android_layout_width = 1;
+                       
+                       // aapt resource value: 7
+                       public const int LinearLayoutCompat_measureWithLargestChild = 7;
+                       
+                       // aapt resource value: 8
+                       public const int LinearLayoutCompat_showDividers = 8;
+                       
+                       // aapt resource value: { 0x10102AC,0x10102AD }
+                       public static int[] ListPopupWindow = new int[] {
+                                       16843436,
+                                       16843437};
+                       
+                       // aapt resource value: 0
+                       public const int ListPopupWindow_android_dropDownHorizontalOffset = 0;
+                       
+                       // aapt resource value: 1
+                       public const int ListPopupWindow_android_dropDownVerticalOffset = 1;
+                       
+                       // aapt resource value: { 0x10101B7,0x10101B8,0x10101B9,0x10101BA,0x7F030034,0x7F030035,0x7F03009F,0x7F0300EC,0x7F0300EE,0x7F0300EF,0x7F0300F0,0x7F0300F2,0x7F0300F3,0x7F03014D,0x7F03016F,0x7F030170 }
+                       public static int[] MaterialButton = new int[] {
+                                       16843191,
+                                       16843192,
+                                       16843193,
+                                       16843194,
+                                       2130903092,
+                                       2130903093,
+                                       2130903199,
+                                       2130903276,
+                                       2130903278,
+                                       2130903279,
+                                       2130903280,
+                                       2130903282,
+                                       2130903283,
+                                       2130903373,
+                                       2130903407,
+                                       2130903408};
+                       
+                       // aapt resource value: 3
+                       public const int MaterialButton_android_insetBottom = 3;
+                       
+                       // aapt resource value: 0
+                       public const int MaterialButton_android_insetLeft = 0;
+                       
+                       // aapt resource value: 1
+                       public const int MaterialButton_android_insetRight = 1;
+                       
+                       // aapt resource value: 2
+                       public const int MaterialButton_android_insetTop = 2;
+                       
+                       // aapt resource value: 4
+                       public const int MaterialButton_backgroundTint = 4;
+                       
+                       // aapt resource value: 5
+                       public const int MaterialButton_backgroundTintMode = 5;
+                       
+                       // aapt resource value: 6
+                       public const int MaterialButton_cornerRadius = 6;
+                       
+                       // aapt resource value: 7
+                       public const int MaterialButton_icon = 7;
+                       
+                       // aapt resource value: 8
+                       public const int MaterialButton_iconGravity = 8;
+                       
+                       // aapt resource value: 9
+                       public const int MaterialButton_iconPadding = 9;
+                       
+                       // aapt resource value: 10
+                       public const int MaterialButton_iconSize = 10;
+                       
+                       // aapt resource value: 11
+                       public const int MaterialButton_iconTint = 11;
+                       
+                       // aapt resource value: 12
+                       public const int MaterialButton_iconTintMode = 12;
+                       
+                       // aapt resource value: 13
+                       public const int MaterialButton_rippleColor = 13;
+                       
+                       // aapt resource value: 14
+                       public const int MaterialButton_strokeColor = 14;
+                       
+                       // aapt resource value: 15
+                       public const int MaterialButton_strokeWidth = 15;
+                       
+                       // aapt resource value: { 0x7F03016F,0x7F030170 }
+                       public static int[] MaterialCardView = new int[] {
+                                       2130903407,
+                                       2130903408};
+                       
+                       // aapt resource value: 0
+                       public const int MaterialCardView_strokeColor = 0;
+                       
+                       // aapt resource value: 1
+                       public const int MaterialCardView_strokeWidth = 1;
+                       
+                       // aapt resource value: { 0x7F030041,0x7F030042,0x7F030068,0x7F030072,0x7F030076,0x7F030084,0x7F030085,0x7F03008B,0x7F03008C,0x7F03008D,0x7F0300B4,0x7F0300CF,0x7F030125,0x7F030126,0x7F030130,0x7F03014F,0x7F03015F,0x7F030192,0x7F030197,0x7F030198,0x7F030199,0x7F03019A,0x7F03019B,0x7F03019C,0x7F03019D,0x7F03019E,0x7F03019F,0x7F0301A0,0x7F0301A5,0x7F0301AA,0x7F0301AB,0x7F0301AF }
+                       public static int[] MaterialComponentsTheme = new int[] {
+                                       2130903105,
+                                       2130903106,
+                                       2130903144,
+                                       2130903154,
+                                       2130903158,
+                                       2130903172,
+                                       2130903173,
+                                       2130903179,
+                                       2130903180,
+                                       2130903181,
+                                       2130903220,
+                                       2130903247,
+                                       2130903333,
+                                       2130903334,
+                                       2130903344,
+                                       2130903375,
+                                       2130903391,
+                                       2130903442,
+                                       2130903447,
+                                       2130903448,
+                                       2130903449,
+                                       2130903450,
+                                       2130903451,
+                                       2130903452,
+                                       2130903453,
+                                       2130903454,
+                                       2130903455,
+                                       2130903456,
+                                       2130903461,
+                                       2130903466,
+                                       2130903467,
+                                       2130903471};
+                       
+                       // aapt resource value: 0
+                       public const int MaterialComponentsTheme_bottomSheetDialogTheme = 0;
+                       
+                       // aapt resource value: 1
+                       public const int MaterialComponentsTheme_bottomSheetStyle = 1;
+                       
+                       // aapt resource value: 2
+                       public const int MaterialComponentsTheme_chipGroupStyle = 2;
+                       
+                       // aapt resource value: 3
+                       public const int MaterialComponentsTheme_chipStandaloneStyle = 3;
+                       
+                       // aapt resource value: 4
+                       public const int MaterialComponentsTheme_chipStyle = 4;
+                       
+                       // aapt resource value: 5
+                       public const int MaterialComponentsTheme_colorAccent = 5;
+                       
+                       // aapt resource value: 6
+                       public const int MaterialComponentsTheme_colorBackgroundFloating = 6;
+                       
+                       // aapt resource value: 7
+                       public const int MaterialComponentsTheme_colorPrimary = 7;
+                       
+                       // aapt resource value: 8
+                       public const int MaterialComponentsTheme_colorPrimaryDark = 8;
+                       
+                       // aapt resource value: 9
+                       public const int MaterialComponentsTheme_colorSecondary = 9;
+                       
+                       // aapt resource value: 10
+                       public const int MaterialComponentsTheme_editTextStyle = 10;
+                       
+                       // aapt resource value: 11
+                       public const int MaterialComponentsTheme_floatingActionButtonStyle = 11;
+                       
+                       // aapt resource value: 12
+                       public const int MaterialComponentsTheme_materialButtonStyle = 12;
+                       
+                       // aapt resource value: 13
+                       public const int MaterialComponentsTheme_materialCardViewStyle = 13;
+                       
+                       // aapt resource value: 14
+                       public const int MaterialComponentsTheme_navigationViewStyle = 14;
+                       
+                       // aapt resource value: 15
+                       public const int MaterialComponentsTheme_scrimBackground = 15;
+                       
+                       // aapt resource value: 16
+                       public const int MaterialComponentsTheme_snackbarButtonStyle = 16;
+                       
+                       // aapt resource value: 17
+                       public const int MaterialComponentsTheme_tabStyle = 17;
+                       
+                       // aapt resource value: 18
+                       public const int MaterialComponentsTheme_textAppearanceBody1 = 18;
+                       
+                       // aapt resource value: 19
+                       public const int MaterialComponentsTheme_textAppearanceBody2 = 19;
+                       
+                       // aapt resource value: 20
+                       public const int MaterialComponentsTheme_textAppearanceButton = 20;
+                       
+                       // aapt resource value: 21
+                       public const int MaterialComponentsTheme_textAppearanceCaption = 21;
+                       
+                       // aapt resource value: 22
+                       public const int MaterialComponentsTheme_textAppearanceHeadline1 = 22;
+                       
+                       // aapt resource value: 23
+                       public const int MaterialComponentsTheme_textAppearanceHeadline2 = 23;
+                       
+                       // aapt resource value: 24
+                       public const int MaterialComponentsTheme_textAppearanceHeadline3 = 24;
+                       
+                       // aapt resource value: 25
+                       public const int MaterialComponentsTheme_textAppearanceHeadline4 = 25;
+                       
+                       // aapt resource value: 26
+                       public const int MaterialComponentsTheme_textAppearanceHeadline5 = 26;
+                       
+                       // aapt resource value: 27
+                       public const int MaterialComponentsTheme_textAppearanceHeadline6 = 27;
+                       
+                       // aapt resource value: 28
+                       public const int MaterialComponentsTheme_textAppearanceOverline = 28;
+                       
+                       // aapt resource value: 29
+                       public const int MaterialComponentsTheme_textAppearanceSubtitle1 = 29;
+                       
+                       // aapt resource value: 30
+                       public const int MaterialComponentsTheme_textAppearanceSubtitle2 = 30;
+                       
+                       // aapt resource value: 31
+                       public const int MaterialComponentsTheme_textInputStyle = 31;
+                       
+                       // aapt resource value: { 0x101000E,0x10100D0,0x1010194,0x10101DE,0x10101DF,0x10101E0 }
+                       public static int[] MenuGroup = new int[] {
+                                       16842766,
+                                       16842960,
+                                       16843156,
+                                       16843230,
+                                       16843231,
+                                       16843232};
+                       
+                       // aapt resource value: 5
+                       public const int MenuGroup_android_checkableBehavior = 5;
+                       
+                       // aapt resource value: 0
+                       public const int MenuGroup_android_enabled = 0;
+                       
+                       // aapt resource value: 1
+                       public const int MenuGroup_android_id = 1;
+                       
+                       // aapt resource value: 3
+                       public const int MenuGroup_android_menuCategory = 3;
+                       
+                       // aapt resource value: 4
+                       public const int MenuGroup_android_orderInCategory = 4;
+                       
+                       // aapt resource value: 2
+                       public const int MenuGroup_android_visible = 2;
+                       
+                       // aapt resource value: { 0x1010002,0x101000E,0x10100D0,0x1010106,0x1010194,0x10101DE,0x10101DF,0x10101E1,0x10101E2,0x10101E3,0x10101E4,0x10101E5,0x101026F,0x7F03000D,0x7F03001F,0x7F030020,0x7F030028,0x7F030090,0x7F0300F2,0x7F0300F3,0x7F030131,0x7F030157,0x7F0301CB }
+                       public static int[] MenuItem = new int[] {
+                                       16842754,
+                                       16842766,
+                                       16842960,
+                                       16843014,
+                                       16843156,
+                                       16843230,
+                                       16843231,
+                                       16843233,
+                                       16843234,
+                                       16843235,
+                                       16843236,
+                                       16843237,
+                                       16843375,
+                                       2130903053,
+                                       2130903071,
+                                       2130903072,
+                                       2130903080,
+                                       2130903184,
+                                       2130903282,
+                                       2130903283,
+                                       2130903345,
+                                       2130903383,
+                                       2130903499};
+                       
+                       // aapt resource value: 13
+                       public const int MenuItem_actionLayout = 13;
+                       
+                       // aapt resource value: 14
+                       public const int MenuItem_actionProviderClass = 14;
+                       
+                       // aapt resource value: 15
+                       public const int MenuItem_actionViewClass = 15;
+                       
+                       // aapt resource value: 16
+                       public const int MenuItem_alphabeticModifiers = 16;
+                       
+                       // aapt resource value: 9
+                       public const int MenuItem_android_alphabeticShortcut = 9;
+                       
+                       // aapt resource value: 11
+                       public const int MenuItem_android_checkable = 11;
+                       
+                       // aapt resource value: 3
+                       public const int MenuItem_android_checked = 3;
+                       
+                       // aapt resource value: 1
+                       public const int MenuItem_android_enabled = 1;
+                       
+                       // aapt resource value: 0
+                       public const int MenuItem_android_icon = 0;
+                       
+                       // aapt resource value: 2
+                       public const int MenuItem_android_id = 2;
+                       
+                       // aapt resource value: 5
+                       public const int MenuItem_android_menuCategory = 5;
+                       
+                       // aapt resource value: 10
+                       public const int MenuItem_android_numericShortcut = 10;
+                       
+                       // aapt resource value: 12
+                       public const int MenuItem_android_onClick = 12;
+                       
+                       // aapt resource value: 6
+                       public const int MenuItem_android_orderInCategory = 6;
+                       
+                       // aapt resource value: 7
+                       public const int MenuItem_android_title = 7;
+                       
+                       // aapt resource value: 8
+                       public const int MenuItem_android_titleCondensed = 8;
+                       
+                       // aapt resource value: 4
+                       public const int MenuItem_android_visible = 4;
+                       
+                       // aapt resource value: 17
+                       public const int MenuItem_contentDescription = 17;
+                       
+                       // aapt resource value: 18
+                       public const int MenuItem_iconTint = 18;
+                       
+                       // aapt resource value: 19
+                       public const int MenuItem_iconTintMode = 19;
+                       
+                       // aapt resource value: 20
+                       public const int MenuItem_numericModifiers = 20;
+                       
+                       // aapt resource value: 21
+                       public const int MenuItem_showAsAction = 21;
+                       
+                       // aapt resource value: 22
+                       public const int MenuItem_tooltipText = 22;
+                       
+                       // aapt resource value: { 0x10100AE,0x101012C,0x101012D,0x101012E,0x101012F,0x1010130,0x1010131,0x7F030142,0x7F030171 }
+                       public static int[] MenuView = new int[] {
+                                       16842926,
+                                       16843052,
+                                       16843053,
+                                       16843054,
+                                       16843055,
+                                       16843056,
+                                       16843057,
+                                       2130903362,
+                                       2130903409};
+                       
+                       // aapt resource value: 4
+                       public const int MenuView_android_headerBackground = 4;
+                       
+                       // aapt resource value: 2
+                       public const int MenuView_android_horizontalDivider = 2;
+                       
+                       // aapt resource value: 5
+                       public const int MenuView_android_itemBackground = 5;
+                       
+                       // aapt resource value: 6
+                       public const int MenuView_android_itemIconDisabledAlpha = 6;
+                       
+                       // aapt resource value: 1
+                       public const int MenuView_android_itemTextAppearance = 1;
+                       
+                       // aapt resource value: 3
+                       public const int MenuView_android_verticalDivider = 3;
+                       
+                       // aapt resource value: 0
+                       public const int MenuView_android_windowAnimationStyle = 0;
+                       
+                       // aapt resource value: 7
+                       public const int MenuView_preserveIconSpacing = 7;
+                       
+                       // aapt resource value: 8
+                       public const int MenuView_subMenuArrow = 8;
+                       
+                       // aapt resource value: { 0x10100D4,0x10100DD,0x101011F,0x7F0300B5,0x7F0300DE,0x7F0300FA,0x7F0300FB,0x7F0300FD,0x7F0300FF,0x7F030102,0x7F030105,0x7F03012B }
+                       public static int[] NavigationView = new int[] {
+                                       16842964,
+                                       16842973,
+                                       16843039,
+                                       2130903221,
+                                       2130903262,
+                                       2130903290,
+                                       2130903291,
+                                       2130903293,
+                                       2130903295,
+                                       2130903298,
+                                       2130903301,
+                                       2130903339};
+                       
+                       // aapt resource value: 0
+                       public const int NavigationView_android_background = 0;
+                       
+                       // aapt resource value: 1
+                       public const int NavigationView_android_fitsSystemWindows = 1;
+                       
+                       // aapt resource value: 2
+                       public const int NavigationView_android_maxWidth = 2;
+                       
+                       // aapt resource value: 3
+                       public const int NavigationView_elevation = 3;
+                       
+                       // aapt resource value: 4
+                       public const int NavigationView_headerLayout = 4;
+                       
+                       // aapt resource value: 5
+                       public const int NavigationView_itemBackground = 5;
+                       
+                       // aapt resource value: 6
+                       public const int NavigationView_itemHorizontalPadding = 6;
+                       
+                       // aapt resource value: 7
+                       public const int NavigationView_itemIconPadding = 7;
+                       
+                       // aapt resource value: 8
+                       public const int NavigationView_itemIconTint = 8;
+                       
+                       // aapt resource value: 9
+                       public const int NavigationView_itemTextAppearance = 9;
+                       
+                       // aapt resource value: 10
+                       public const int NavigationView_itemTextColor = 10;
+                       
+                       // aapt resource value: 11
+                       public const int NavigationView_menu = 11;
+                       
+                       // aapt resource value: { 0x1010176,0x10102C9,0x7F030132 }
+                       public static int[] PopupWindow = new int[] {
+                                       16843126,
+                                       16843465,
+                                       2130903346};
+                       
+                       // aapt resource value: { 0x7F030168 }
+                       public static int[] PopupWindowBackgroundState = new int[] {
+                                       2130903400};
+                       
+                       // aapt resource value: 0
+                       public const int PopupWindowBackgroundState_state_above_anchor = 0;
+                       
+                       // aapt resource value: 1
+                       public const int PopupWindow_android_popupAnimationStyle = 1;
+                       
+                       // aapt resource value: 0
+                       public const int PopupWindow_android_popupBackground = 0;
+                       
+                       // aapt resource value: 2
+                       public const int PopupWindow_overlapAnchor = 2;
+                       
+                       // aapt resource value: { 0x7F030133,0x7F030136 }
+                       public static int[] RecycleListView = new int[] {
+                                       2130903347,
+                                       2130903350};
+                       
+                       // aapt resource value: 0
+                       public const int RecycleListView_paddingBottomNoButtons = 0;
+                       
+                       // aapt resource value: 1
+                       public const int RecycleListView_paddingTopNoTitle = 1;
+                       
+                       // aapt resource value: { 0x10100C4,0x10100F1,0x7F0300C9,0x7F0300CA,0x7F0300CB,0x7F0300CC,0x7F0300CD,0x7F03010A,0x7F03014C,0x7F030161,0x7F030167 }
+                       public static int[] RecyclerView = new int[] {
+                                       16842948,
+                                       16842993,
+                                       2130903241,
+                                       2130903242,
+                                       2130903243,
+                                       2130903244,
+                                       2130903245,
+                                       2130903306,
+                                       2130903372,
+                                       2130903393,
+                                       2130903399};
+                       
+                       // aapt resource value: 1
+                       public const int RecyclerView_android_descendantFocusability = 1;
+                       
+                       // aapt resource value: 0
+                       public const int RecyclerView_android_orientation = 0;
+                       
+                       // aapt resource value: 2
+                       public const int RecyclerView_fastScrollEnabled = 2;
+                       
+                       // aapt resource value: 3
+                       public const int RecyclerView_fastScrollHorizontalThumbDrawable = 3;
+                       
+                       // aapt resource value: 4
+                       public const int RecyclerView_fastScrollHorizontalTrackDrawable = 4;
+                       
+                       // aapt resource value: 5
+                       public const int RecyclerView_fastScrollVerticalThumbDrawable = 5;
+                       
+                       // aapt resource value: 6
+                       public const int RecyclerView_fastScrollVerticalTrackDrawable = 6;
+                       
+                       // aapt resource value: 7
+                       public const int RecyclerView_layoutManager = 7;
+                       
+                       // aapt resource value: 8
+                       public const int RecyclerView_reverseLayout = 8;
+                       
+                       // aapt resource value: 9
+                       public const int RecyclerView_spanCount = 9;
+                       
+                       // aapt resource value: 10
+                       public const int RecyclerView_stackFromEnd = 10;
+                       
+                       // aapt resource value: { 0x7F0300F8 }
+                       public static int[] ScrimInsetsFrameLayout = new int[] {
+                                       2130903288};
+                       
+                       // aapt resource value: 0
+                       public const int ScrimInsetsFrameLayout_insetForeground = 0;
+                       
+                       // aapt resource value: { 0x7F03003A }
+                       public static int[] ScrollingViewBehavior_Layout = new int[] {
+                                       2130903098};
+                       
+                       // aapt resource value: 0
+                       public const int ScrollingViewBehavior_Layout_behavior_overlapTop = 0;
+                       
+                       // aapt resource value: { 0x10100DA,0x101011F,0x1010220,0x1010264,0x7F030077,0x7F03008F,0x7F0300A5,0x7F0300DD,0x7F0300F4,0x7F030109,0x7F030146,0x7F030147,0x7F030151,0x7F030152,0x7F030172,0x7F030177,0x7F0301D2 }
+                       public static int[] SearchView = new int[] {
+                                       16842970,
+                                       16843039,
+                                       16843296,
+                                       16843364,
+                                       2130903159,
+                                       2130903183,
+                                       2130903205,
+                                       2130903261,
+                                       2130903284,
+                                       2130903305,
+                                       2130903366,
+                                       2130903367,
+                                       2130903377,
+                                       2130903378,
+                                       2130903410,
+                                       2130903415,
+                                       2130903506};
+                       
+                       // aapt resource value: 0
+                       public const int SearchView_android_focusable = 0;
+                       
+                       // aapt resource value: 3
+                       public const int SearchView_android_imeOptions = 3;
+                       
+                       // aapt resource value: 2
+                       public const int SearchView_android_inputType = 2;
+                       
+                       // aapt resource value: 1
+                       public const int SearchView_android_maxWidth = 1;
+                       
+                       // aapt resource value: 4
+                       public const int SearchView_closeIcon = 4;
+                       
+                       // aapt resource value: 5
+                       public const int SearchView_commitIcon = 5;
+                       
+                       // aapt resource value: 6
+                       public const int SearchView_defaultQueryHint = 6;
+                       
+                       // aapt resource value: 7
+                       public const int SearchView_goIcon = 7;
+                       
+                       // aapt resource value: 8
+                       public const int SearchView_iconifiedByDefault = 8;
+                       
+                       // aapt resource value: 9
+                       public const int SearchView_layout = 9;
+                       
+                       // aapt resource value: 10
+                       public const int SearchView_queryBackground = 10;
+                       
+                       // aapt resource value: 11
+                       public const int SearchView_queryHint = 11;
+                       
+                       // aapt resource value: 12
+                       public const int SearchView_searchHintIcon = 12;
+                       
+                       // aapt resource value: 13
+                       public const int SearchView_searchIcon = 13;
+                       
+                       // aapt resource value: 14
+                       public const int SearchView_submitBackground = 14;
+                       
+                       // aapt resource value: 15
+                       public const int SearchView_suggestionRowLayout = 15;
+                       
+                       // aapt resource value: 16
+                       public const int SearchView_voiceIcon = 16;
+                       
+                       // aapt resource value: { 0x7F03015F,0x7F030160 }
+                       public static int[] Snackbar = new int[] {
+                                       2130903391,
+                                       2130903392};
+                       
+                       // aapt resource value: { 0x101011F,0x7F0300B5,0x7F030127 }
+                       public static int[] SnackbarLayout = new int[] {
+                                       16843039,
+                                       2130903221,
+                                       2130903335};
+                       
+                       // aapt resource value: 0
+                       public const int SnackbarLayout_android_maxWidth = 0;
+                       
+                       // aapt resource value: 1
+                       public const int SnackbarLayout_elevation = 1;
+                       
+                       // aapt resource value: 2
+                       public const int SnackbarLayout_maxActionInlineWidth = 2;
+                       
+                       // aapt resource value: 0
+                       public const int Snackbar_snackbarButtonStyle = 0;
+                       
+                       // aapt resource value: 1
+                       public const int Snackbar_snackbarStyle = 1;
+                       
+                       // aapt resource value: { 0x10100B2,0x1010176,0x101017B,0x1010262,0x7F030140 }
+                       public static int[] Spinner = new int[] {
+                                       16842930,
+                                       16843126,
+                                       16843131,
+                                       16843362,
+                                       2130903360};
+                       
+                       // aapt resource value: 3
+                       public const int Spinner_android_dropDownWidth = 3;
+                       
+                       // aapt resource value: 0
+                       public const int Spinner_android_entries = 0;
+                       
+                       // aapt resource value: 1
+                       public const int Spinner_android_popupBackground = 1;
+                       
+                       // aapt resource value: 2
+                       public const int Spinner_android_prompt = 2;
+                       
+                       // aapt resource value: 4
+                       public const int Spinner_popupTheme = 4;
+                       
+                       // aapt resource value: { 0x101011C,0x1010194,0x1010195,0x1010196,0x101030C,0x101030D }
+                       public static int[] StateListDrawable = new int[] {
+                                       16843036,
+                                       16843156,
+                                       16843157,
+                                       16843158,
+                                       16843532,
+                                       16843533};
+                       
+                       // aapt resource value: { 0x1010199 }
+                       public static int[] StateListDrawableItem = new int[] {
+                                       16843161};
+                       
+                       // aapt resource value: 0
+                       public const int StateListDrawableItem_android_drawable = 0;
+                       
+                       // aapt resource value: 3
+                       public const int StateListDrawable_android_constantSize = 3;
+                       
+                       // aapt resource value: 0
+                       public const int StateListDrawable_android_dither = 0;
+                       
+                       // aapt resource value: 4
+                       public const int StateListDrawable_android_enterFadeDuration = 4;
+                       
+                       // aapt resource value: 5
+                       public const int StateListDrawable_android_exitFadeDuration = 5;
+                       
+                       // aapt resource value: 2
+                       public const int StateListDrawable_android_variablePadding = 2;
+                       
+                       // aapt resource value: 1
+                       public const int StateListDrawable_android_visible = 1;
+                       
+                       // aapt resource value: { 0x1010124,0x1010125,0x1010142,0x7F03015A,0x7F030165,0x7F030178,0x7F030179,0x7F03017B,0x7F0301B3,0x7F0301B4,0x7F0301B5,0x7F0301CC,0x7F0301CD,0x7F0301CE }
+                       public static int[] SwitchCompat = new int[] {
+                                       16843044,
+                                       16843045,
+                                       16843074,
+                                       2130903386,
+                                       2130903397,
+                                       2130903416,
+                                       2130903417,
+                                       2130903419,
+                                       2130903475,
+                                       2130903476,
+                                       2130903477,
+                                       2130903500,
+                                       2130903501,
+                                       2130903502};
+                       
+                       // aapt resource value: 1
+                       public const int SwitchCompat_android_textOff = 1;
+                       
+                       // aapt resource value: 0
+                       public const int SwitchCompat_android_textOn = 0;
+                       
+                       // aapt resource value: 2
+                       public const int SwitchCompat_android_thumb = 2;
+                       
+                       // aapt resource value: 3
+                       public const int SwitchCompat_showText = 3;
+                       
+                       // aapt resource value: 4
+                       public const int SwitchCompat_splitTrack = 4;
+                       
+                       // aapt resource value: 5
+                       public const int SwitchCompat_switchMinWidth = 5;
+                       
+                       // aapt resource value: 6
+                       public const int SwitchCompat_switchPadding = 6;
+                       
+                       // aapt resource value: 7
+                       public const int SwitchCompat_switchTextAppearance = 7;
+                       
+                       // aapt resource value: 8
+                       public const int SwitchCompat_thumbTextPadding = 8;
+                       
+                       // aapt resource value: 9
+                       public const int SwitchCompat_thumbTint = 9;
+                       
+                       // aapt resource value: 10
+                       public const int SwitchCompat_thumbTintMode = 10;
+                       
+                       // aapt resource value: 11
+                       public const int SwitchCompat_track = 11;
+                       
+                       // aapt resource value: 12
+                       public const int SwitchCompat_trackTint = 12;
+                       
+                       // aapt resource value: 13
+                       public const int SwitchCompat_trackTintMode = 13;
+                       
+                       // aapt resource value: { 0x1010002,0x10100F2,0x101014F }
+                       public static int[] TabItem = new int[] {
+                                       16842754,
+                                       16842994,
+                                       16843087};
+                       
+                       // aapt resource value: 0
+                       public const int TabItem_android_icon = 0;
+                       
+                       // aapt resource value: 1
+                       public const int TabItem_android_layout = 1;
+                       
+                       // aapt resource value: 2
+                       public const int TabItem_android_text = 2;
+                       
+                       // aapt resource value: { 0x7F03017C,0x7F03017D,0x7F03017E,0x7F03017F,0x7F030180,0x7F030181,0x7F030182,0x7F030183,0x7F030184,0x7F030185,0x7F030186,0x7F030187,0x7F030188,0x7F030189,0x7F03018A,0x7F03018B,0x7F03018C,0x7F03018D,0x7F03018E,0x7F03018F,0x7F030190,0x7F030191,0x7F030193,0x7F030194,0x7F030195 }
+                       public static int[] TabLayout = new int[] {
+                                       2130903420,
+                                       2130903421,
+                                       2130903422,
+                                       2130903423,
+                                       2130903424,
+                                       2130903425,
+                                       2130903426,
+                                       2130903427,
+                                       2130903428,
+                                       2130903429,
+                                       2130903430,
+                                       2130903431,
+                                       2130903432,
+                                       2130903433,
+                                       2130903434,
+                                       2130903435,
+                                       2130903436,
+                                       2130903437,
+                                       2130903438,
+                                       2130903439,
+                                       2130903440,
+                                       2130903441,
+                                       2130903443,
+                                       2130903444,
+                                       2130903445};
+                       
+                       // aapt resource value: 0
+                       public const int TabLayout_tabBackground = 0;
+                       
+                       // aapt resource value: 1
+                       public const int TabLayout_tabContentStart = 1;
+                       
+                       // aapt resource value: 2
+                       public const int TabLayout_tabGravity = 2;
+                       
+                       // aapt resource value: 3
+                       public const int TabLayout_tabIconTint = 3;
+                       
+                       // aapt resource value: 4
+                       public const int TabLayout_tabIconTintMode = 4;
+                       
+                       // aapt resource value: 5
+                       public const int TabLayout_tabIndicator = 5;
+                       
+                       // aapt resource value: 6
+                       public const int TabLayout_tabIndicatorAnimationDuration = 6;
+                       
+                       // aapt resource value: 7
+                       public const int TabLayout_tabIndicatorColor = 7;
+                       
+                       // aapt resource value: 8
+                       public const int TabLayout_tabIndicatorFullWidth = 8;
+                       
+                       // aapt resource value: 9
+                       public const int TabLayout_tabIndicatorGravity = 9;
+                       
+                       // aapt resource value: 10
+                       public const int TabLayout_tabIndicatorHeight = 10;
+                       
+                       // aapt resource value: 11
+                       public const int TabLayout_tabInlineLabel = 11;
+                       
+                       // aapt resource value: 12
+                       public const int TabLayout_tabMaxWidth = 12;
+                       
+                       // aapt resource value: 13
+                       public const int TabLayout_tabMinWidth = 13;
+                       
+                       // aapt resource value: 14
+                       public const int TabLayout_tabMode = 14;
+                       
+                       // aapt resource value: 15
+                       public const int TabLayout_tabPadding = 15;
+                       
+                       // aapt resource value: 16
+                       public const int TabLayout_tabPaddingBottom = 16;
+                       
+                       // aapt resource value: 17
+                       public const int TabLayout_tabPaddingEnd = 17;
+                       
+                       // aapt resource value: 18
+                       public const int TabLayout_tabPaddingStart = 18;
+                       
+                       // aapt resource value: 19
+                       public const int TabLayout_tabPaddingTop = 19;
+                       
+                       // aapt resource value: 20
+                       public const int TabLayout_tabRippleColor = 20;
+                       
+                       // aapt resource value: 21
+                       public const int TabLayout_tabSelectedTextColor = 21;
+                       
+                       // aapt resource value: 22
+                       public const int TabLayout_tabTextAppearance = 22;
+                       
+                       // aapt resource value: 23
+                       public const int TabLayout_tabTextColor = 23;
+                       
+                       // aapt resource value: 24
+                       public const int TabLayout_tabUnboundedRipple = 24;
+                       
+                       // aapt resource value: { 0x1010095,0x1010096,0x1010097,0x1010098,0x101009A,0x101009B,0x1010161,0x1010162,0x1010163,0x1010164,0x10103AC,0x7F0300D1,0x7F030196 }
+                       public static int[] TextAppearance = new int[] {
+                                       16842901,
+                                       16842902,
+                                       16842903,
+                                       16842904,
+                                       16842906,
+                                       16842907,
+                                       16843105,
+                                       16843106,
+                                       16843107,
+                                       16843108,
+                                       16843692,
+                                       2130903249,
+                                       2130903446};
+                       
+                       // aapt resource value: 10
+                       public const int TextAppearance_android_fontFamily = 10;
+                       
+                       // aapt resource value: 6
+                       public const int TextAppearance_android_shadowColor = 6;
+                       
+                       // aapt resource value: 7
+                       public const int TextAppearance_android_shadowDx = 7;
+                       
+                       // aapt resource value: 8
+                       public const int TextAppearance_android_shadowDy = 8;
+                       
+                       // aapt resource value: 9
+                       public const int TextAppearance_android_shadowRadius = 9;
+                       
+                       // aapt resource value: 3
+                       public const int TextAppearance_android_textColor = 3;
+                       
+                       // aapt resource value: 4
+                       public const int TextAppearance_android_textColorHint = 4;
+                       
+                       // aapt resource value: 5
+                       public const int TextAppearance_android_textColorLink = 5;
+                       
+                       // aapt resource value: 0
+                       public const int TextAppearance_android_textSize = 0;
+                       
+                       // aapt resource value: 2
+                       public const int TextAppearance_android_textStyle = 2;
+                       
+                       // aapt resource value: 1
+                       public const int TextAppearance_android_typeface = 1;
+                       
+                       // aapt resource value: 11
+                       public const int TextAppearance_fontFamily = 11;
+                       
+                       // aapt resource value: 12
+                       public const int TextAppearance_textAllCaps = 12;
+                       
+                       // aapt resource value: { 0x101009A,0x1010150,0x7F030043,0x7F030044,0x7F030045,0x7F030046,0x7F030047,0x7F030048,0x7F030049,0x7F03004A,0x7F03004B,0x7F0300A0,0x7F0300A1,0x7F0300A2,0x7F0300A3,0x7F0300B8,0x7F0300B9,0x7F0300E0,0x7F0300E1,0x7F0300E2,0x7F0300E6,0x7F0300E7,0x7F0300E8,0x7F03013A,0x7F03013B,0x7F03013C,0x7F03013D,0x7F03013E }
+                       public static int[] TextInputLayout = new int[] {
+                                       16842906,
+                                       16843088,
+                                       2130903107,
+                                       2130903108,
+                                       2130903109,
+                                       2130903110,
+                                       2130903111,
+                                       2130903112,
+                                       2130903113,
+                                       2130903114,
+                                       2130903115,
+                                       2130903200,
+                                       2130903201,
+                                       2130903202,
+                                       2130903203,
+                                       2130903224,
+                                       2130903225,
+                                       2130903264,
+                                       2130903265,
+                                       2130903266,
+                                       2130903270,
+                                       2130903271,
+                                       2130903272,
+                                       2130903354,
+                                       2130903355,
+                                       2130903356,
+                                       2130903357,
+                                       2130903358};
+                       
+                       // aapt resource value: 1
+                       public const int TextInputLayout_android_hint = 1;
+                       
+                       // aapt resource value: 0
+                       public const int TextInputLayout_android_textColorHint = 0;
+                       
+                       // aapt resource value: 2
+                       public const int TextInputLayout_boxBackgroundColor = 2;
+                       
+                       // aapt resource value: 3
+                       public const int TextInputLayout_boxBackgroundMode = 3;
+                       
+                       // aapt resource value: 4
+                       public const int TextInputLayout_boxCollapsedPaddingTop = 4;
+                       
+                       // aapt resource value: 5
+                       public const int TextInputLayout_boxCornerRadiusBottomEnd = 5;
+                       
+                       // aapt resource value: 6
+                       public const int TextInputLayout_boxCornerRadiusBottomStart = 6;
+                       
+                       // aapt resource value: 7
+                       public const int TextInputLayout_boxCornerRadiusTopEnd = 7;
+                       
+                       // aapt resource value: 8
+                       public const int TextInputLayout_boxCornerRadiusTopStart = 8;
+                       
+                       // aapt resource value: 9
+                       public const int TextInputLayout_boxStrokeColor = 9;
+                       
+                       // aapt resource value: 10
+                       public const int TextInputLayout_boxStrokeWidth = 10;
+                       
+                       // aapt resource value: 11
+                       public const int TextInputLayout_counterEnabled = 11;
+                       
+                       // aapt resource value: 12
+                       public const int TextInputLayout_counterMaxLength = 12;
+                       
+                       // aapt resource value: 13
+                       public const int TextInputLayout_counterOverflowTextAppearance = 13;
+                       
+                       // aapt resource value: 14
+                       public const int TextInputLayout_counterTextAppearance = 14;
+                       
+                       // aapt resource value: 15
+                       public const int TextInputLayout_errorEnabled = 15;
+                       
+                       // aapt resource value: 16
+                       public const int TextInputLayout_errorTextAppearance = 16;
+                       
+                       // aapt resource value: 17
+                       public const int TextInputLayout_helperText = 17;
+                       
+                       // aapt resource value: 18
+                       public const int TextInputLayout_helperTextEnabled = 18;
+                       
+                       // aapt resource value: 19
+                       public const int TextInputLayout_helperTextTextAppearance = 19;
+                       
+                       // aapt resource value: 20
+                       public const int TextInputLayout_hintAnimationEnabled = 20;
+                       
+                       // aapt resource value: 21
+                       public const int TextInputLayout_hintEnabled = 21;
+                       
+                       // aapt resource value: 22
+                       public const int TextInputLayout_hintTextAppearance = 22;
+                       
+                       // aapt resource value: 23
+                       public const int TextInputLayout_passwordToggleContentDescription = 23;
+                       
+                       // aapt resource value: 24
+                       public const int TextInputLayout_passwordToggleDrawable = 24;
+                       
+                       // aapt resource value: 25
+                       public const int TextInputLayout_passwordToggleEnabled = 25;
+                       
+                       // aapt resource value: 26
+                       public const int TextInputLayout_passwordToggleTint = 26;
+                       
+                       // aapt resource value: 27
+                       public const int TextInputLayout_passwordToggleTintMode = 27;
+                       
+                       // aapt resource value: { 0x1010034,0x7F0300B6,0x7F0300B7 }
+                       public static int[] ThemeEnforcement = new int[] {
+                                       16842804,
+                                       2130903222,
+                                       2130903223};
+                       
+                       // aapt resource value: 0
+                       public const int ThemeEnforcement_android_textAppearance = 0;
+                       
+                       // aapt resource value: 1
+                       public const int ThemeEnforcement_enforceMaterialTheme = 1;
+                       
+                       // aapt resource value: 2
+                       public const int ThemeEnforcement_enforceTextAppearance = 2;
+                       
+                       // aapt resource value: { 0x10100AF,0x1010140,0x7F030051,0x7F03007F,0x7F030080,0x7F030091,0x7F030092,0x7F030093,0x7F030094,0x7F030095,0x7F030096,0x7F030123,0x7F030124,0x7F030128,0x7F03012D,0x7F03012E,0x7F030140,0x7F030173,0x7F030174,0x7F030175,0x7F0301BB,0x7F0301BD,0x7F0301BE,0x7F0301BF,0x7F0301C0,0x7F0301C1,0x7F0301C2,0x7F0301C3,0x7F0301C4 }
+                       public static int[] Toolbar = new int[] {
+                                       16842927,
+                                       16843072,
+                                       2130903121,
+                                       2130903167,
+                                       2130903168,
+                                       2130903185,
+                                       2130903186,
+                                       2130903187,
+                                       2130903188,
+                                       2130903189,
+                                       2130903190,
+                                       2130903331,
+                                       2130903332,
+                                       2130903336,
+                                       2130903341,
+                                       2130903342,
+                                       2130903360,
+                                       2130903411,
+                                       2130903412,
+                                       2130903413,
+                                       2130903483,
+                                       2130903485,
+                                       2130903486,
+                                       2130903487,
+                                       2130903488,
+                                       2130903489,
+                                       2130903490,
+                                       2130903491,
+                                       2130903492};
+                       
+                       // aapt resource value: 0
+                       public const int Toolbar_android_gravity = 0;
+                       
+                       // aapt resource value: 1
+                       public const int Toolbar_android_minHeight = 1;
+                       
+                       // aapt resource value: 2
+                       public const int Toolbar_buttonGravity = 2;
+                       
+                       // aapt resource value: 3
+                       public const int Toolbar_collapseContentDescription = 3;
+                       
+                       // aapt resource value: 4
+                       public const int Toolbar_collapseIcon = 4;
+                       
+                       // aapt resource value: 5
+                       public const int Toolbar_contentInsetEnd = 5;
+                       
+                       // aapt resource value: 6
+                       public const int Toolbar_contentInsetEndWithActions = 6;
+                       
+                       // aapt resource value: 7
+                       public const int Toolbar_contentInsetLeft = 7;
+                       
+                       // aapt resource value: 8
+                       public const int Toolbar_contentInsetRight = 8;
+                       
+                       // aapt resource value: 9
+                       public const int Toolbar_contentInsetStart = 9;
+                       
+                       // aapt resource value: 10
+                       public const int Toolbar_contentInsetStartWithNavigation = 10;
+                       
+                       // aapt resource value: 11
+                       public const int Toolbar_logo = 11;
+                       
+                       // aapt resource value: 12
+                       public const int Toolbar_logoDescription = 12;
+                       
+                       // aapt resource value: 13
+                       public const int Toolbar_maxButtonHeight = 13;
+                       
+                       // aapt resource value: 14
+                       public const int Toolbar_navigationContentDescription = 14;
+                       
+                       // aapt resource value: 15
+                       public const int Toolbar_navigationIcon = 15;
+                       
+                       // aapt resource value: 16
+                       public const int Toolbar_popupTheme = 16;
+                       
+                       // aapt resource value: 17
+                       public const int Toolbar_subtitle = 17;
+                       
+                       // aapt resource value: 18
+                       public const int Toolbar_subtitleTextAppearance = 18;
+                       
+                       // aapt resource value: 19
+                       public const int Toolbar_subtitleTextColor = 19;
+                       
+                       // aapt resource value: 20
+                       public const int Toolbar_title = 20;
+                       
+                       // aapt resource value: 21
+                       public const int Toolbar_titleMargin = 21;
+                       
+                       // aapt resource value: 22
+                       public const int Toolbar_titleMarginBottom = 22;
+                       
+                       // aapt resource value: 23
+                       public const int Toolbar_titleMarginEnd = 23;
+                       
+                       // aapt resource value: 26
+                       public const int Toolbar_titleMargins = 26;
+                       
+                       // aapt resource value: 24
+                       public const int Toolbar_titleMarginStart = 24;
+                       
+                       // aapt resource value: 25
+                       public const int Toolbar_titleMarginTop = 25;
+                       
+                       // aapt resource value: 27
+                       public const int Toolbar_titleTextAppearance = 27;
+                       
+                       // aapt resource value: 28
+                       public const int Toolbar_titleTextColor = 28;
+                       
+                       // aapt resource value: { 0x1010000,0x10100DA,0x7F030134,0x7F030135,0x7F0301B1 }
+                       public static int[] View = new int[] {
+                                       16842752,
+                                       16842970,
+                                       2130903348,
+                                       2130903349,
+                                       2130903473};
+                       
+                       // aapt resource value: { 0x10100D4,0x7F030034,0x7F030035 }
+                       public static int[] ViewBackgroundHelper = new int[] {
+                                       16842964,
+                                       2130903092,
+                                       2130903093};
+                       
+                       // aapt resource value: 0
+                       public const int ViewBackgroundHelper_android_background = 0;
+                       
+                       // aapt resource value: 1
+                       public const int ViewBackgroundHelper_backgroundTint = 1;
+                       
+                       // aapt resource value: 2
+                       public const int ViewBackgroundHelper_backgroundTintMode = 2;
+                       
+                       // aapt resource value: { 0x10100D0,0x10100F2,0x10100F3 }
+                       public static int[] ViewStubCompat = new int[] {
+                                       16842960,
+                                       16842994,
+                                       16842995};
+                       
+                       // aapt resource value: 0
+                       public const int ViewStubCompat_android_id = 0;
+                       
+                       // aapt resource value: 2
+                       public const int ViewStubCompat_android_inflatedId = 2;
+                       
+                       // aapt resource value: 1
+                       public const int ViewStubCompat_android_layout = 1;
+                       
+                       // aapt resource value: 1
+                       public const int View_android_focusable = 1;
+                       
+                       // aapt resource value: 0
+                       public const int View_android_theme = 0;
+                       
+                       // aapt resource value: 2
+                       public const int View_paddingEnd = 2;
+                       
+                       // aapt resource value: 3
+                       public const int View_paddingStart = 3;
+                       
+                       // aapt resource value: 4
+                       public const int View_theme = 4;
+                       
+                       static Styleable()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Styleable()
+                       {
+                       }
+               }
+               
+               public partial class Xml
+               {
+                       
+                       // aapt resource value: 0x7F100000
+                       public const int xamarin_essentials_fileprovider_file_paths = 2131755008;
+                       
+                       static Xml()
+                       {
+                               global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+                       }
+                       
+                       private Xml()
+                       {
+                       }
+               }
+       }
+}
+#pragma warning restore 1591
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/layout/Tabbar.xml b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/layout/Tabbar.xml
new file mode 100644 (file)
index 0000000..ad1f87d
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.TabLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/sliding_tabs"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?attr/colorPrimary"
+    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+    app:tabIndicatorColor="@android:color/white"
+    app:tabGravity="fill"
+    app:tabMode="fixed" />
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/layout/Toolbar.xml b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/layout/Toolbar.xml
new file mode 100644 (file)
index 0000000..aabd0a3
--- /dev/null
@@ -0,0 +1,9 @@
+<android.support.v7.widget.Toolbar
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/toolbar"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?attr/colorPrimary"
+    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+    android:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
+
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-anydpi-v26/icon.xml b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-anydpi-v26/icon.xml
new file mode 100644 (file)
index 0000000..88d1d0a
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/launcher_background" />
+    <foreground android:drawable="@mipmap/launcher_foreground" />
+</adaptive-icon>
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-anydpi-v26/icon_round.xml b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-anydpi-v26/icon_round.xml
new file mode 100644 (file)
index 0000000..88d1d0a
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/launcher_background" />
+    <foreground android:drawable="@mipmap/launcher_foreground" />
+</adaptive-icon>
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-hdpi/icon.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-hdpi/icon.png
new file mode 100644 (file)
index 0000000..4623ca2
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-hdpi/icon.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-hdpi/launcher_foreground.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-hdpi/launcher_foreground.png
new file mode 100644 (file)
index 0000000..a89e5bb
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-hdpi/launcher_foreground.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-mdpi/icon.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-mdpi/icon.png
new file mode 100644 (file)
index 0000000..9b1d25e
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-mdpi/icon.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-mdpi/launcher_foreground.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-mdpi/launcher_foreground.png
new file mode 100644 (file)
index 0000000..431a8a0
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-mdpi/launcher_foreground.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xhdpi/icon.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xhdpi/icon.png
new file mode 100644 (file)
index 0000000..844dfe5
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xhdpi/icon.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xhdpi/launcher_foreground.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xhdpi/launcher_foreground.png
new file mode 100644 (file)
index 0000000..9e9e4f8
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xhdpi/launcher_foreground.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxhdpi/icon.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxhdpi/icon.png
new file mode 100644 (file)
index 0000000..e20ec9a
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxhdpi/icon.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxhdpi/launcher_foreground.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxhdpi/launcher_foreground.png
new file mode 100644 (file)
index 0000000..5f1e135
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxhdpi/launcher_foreground.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxxhdpi/icon.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxxhdpi/icon.png
new file mode 100644 (file)
index 0000000..8a08bf7
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxxhdpi/icon.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png
new file mode 100644 (file)
index 0000000..aca9f8d
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/values/colors.xml b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/values/colors.xml
new file mode 100644 (file)
index 0000000..d9f6e0b
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="launcher_background">#FFFFFF</color>
+    <color name="colorPrimary">#3F51B5</color>
+    <color name="colorPrimaryDark">#303F9F</color>
+    <color name="colorAccent">#FF4081</color>
+</resources>
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/values/styles.xml b/examples/csharp/HelloworldXamarin/HelloworldXamarin.Android/Resources/values/styles.xml
new file mode 100644 (file)
index 0000000..4b9805f
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<resources>
+
+  <style name="MainTheme" parent="MainTheme.Base">
+    <!-- As of Xamarin.Forms 4.6 the theme has moved into the Forms binary -->
+    <!-- If you want to override anything you can do that here. -->
+    <!-- Underneath are a couple of entries to get you started. -->
+
+    <!-- Set theme colors from https://aka.ms/material-colors -->
+    <!-- colorPrimary is used for the default action bar background -->
+    <!--<item name="colorPrimary">#2196F3</item>-->
+    <!-- colorPrimaryDark is used for the status bar -->
+    <!--<item name="colorPrimaryDark">#1976D2</item>-->
+    <!-- colorAccent is used as the default value for colorControlActivated
+         which is used to tint widgets -->
+    <!--<item name="colorAccent">#FF4081</item>-->
+  </style>
+</resources>
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/AppDelegate.cs b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/AppDelegate.cs
new file mode 100644 (file)
index 0000000..4adb6ae
--- /dev/null
@@ -0,0 +1,47 @@
+#region Copyright notice and license
+// Copyright 2020 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace HelloworldXamarin.iOS
+{
+    // The UIApplicationDelegate for the application. This class is responsible for launching the 
+    // User Interface of the application, as well as listening (and optionally responding) to 
+    // application events from iOS.
+    [Register("AppDelegate")]
+    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
+    {
+        //
+        // This method is invoked when the application has loaded and is ready to run. In this 
+        // method you should instantiate the window, load the UI into it and then make the window
+        // visible.
+        //
+        // You have 17 seconds to return from this method, or iOS will terminate your application.
+        //
+        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
+        {
+            global::Xamarin.Forms.Forms.Init();
+            LoadApplication(new App());
+
+            return base.FinishedLaunching(app, options);
+        }
+    }
+}
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644 (file)
index 0000000..98f4d03
--- /dev/null
@@ -0,0 +1,117 @@
+{
+  "images": [
+    {
+      "scale": "2x",
+      "size": "20x20",
+      "idiom": "iphone",
+      "filename": "Icon40.png"
+    },
+    {
+      "scale": "3x",
+      "size": "20x20",
+      "idiom": "iphone",
+      "filename": "Icon60.png"
+    },
+    {
+      "scale": "2x",
+      "size": "29x29",
+      "idiom": "iphone",
+      "filename": "Icon58.png"
+    },
+    {
+      "scale": "3x",
+      "size": "29x29",
+      "idiom": "iphone",
+      "filename": "Icon87.png"
+    },
+    {
+      "scale": "2x",
+      "size": "40x40",
+      "idiom": "iphone",
+      "filename": "Icon80.png"
+    },
+    {
+      "scale": "3x",
+      "size": "40x40",
+      "idiom": "iphone",
+      "filename": "Icon120.png"
+    },
+    {
+      "scale": "2x",
+      "size": "60x60",
+      "idiom": "iphone",
+      "filename": "Icon120.png"
+    },
+    {
+      "scale": "3x",
+      "size": "60x60",
+      "idiom": "iphone",
+      "filename": "Icon180.png"
+    },
+    {
+      "scale": "1x",
+      "size": "20x20",
+      "idiom": "ipad",
+      "filename": "Icon20.png"
+    },
+    {
+      "scale": "2x",
+      "size": "20x20",
+      "idiom": "ipad",
+      "filename": "Icon40.png"
+    },
+    {
+      "scale": "1x",
+      "size": "29x29",
+      "idiom": "ipad",
+      "filename": "Icon29.png"
+    },
+    {
+      "scale": "2x",
+      "size": "29x29",
+      "idiom": "ipad",
+      "filename": "Icon58.png"
+    },
+    {
+      "scale": "1x",
+      "size": "40x40",
+      "idiom": "ipad",
+      "filename": "Icon40.png"
+    },
+    {
+      "scale": "2x",
+      "size": "40x40",
+      "idiom": "ipad",
+      "filename": "Icon80.png"
+    },
+    {
+      "scale": "1x",
+      "size": "76x76",
+      "idiom": "ipad",
+      "filename": "Icon76.png"
+    },
+    {
+      "scale": "2x",
+      "size": "76x76",
+      "idiom": "ipad",
+      "filename": "Icon152.png"
+    },
+    {
+      "scale": "2x",
+      "size": "83.5x83.5",
+      "idiom": "ipad",
+      "filename": "Icon167.png"
+    },
+    {
+      "scale": "1x",
+      "size": "1024x1024",
+      "idiom": "ios-marketing",
+      "filename": "Icon1024.png"
+    }
+  ],
+  "properties": {},
+  "info": {
+    "version": 1,
+    "author": "xcode"
+  }
+}
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png
new file mode 100644 (file)
index 0000000..9174c98
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png
new file mode 100644 (file)
index 0000000..9c60a17
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png
new file mode 100644 (file)
index 0000000..448d6ef
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png
new file mode 100644 (file)
index 0000000..8524768
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png
new file mode 100644 (file)
index 0000000..60a6470
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png
new file mode 100644 (file)
index 0000000..45268a6
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png
new file mode 100644 (file)
index 0000000..6a6c77a
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png
new file mode 100644 (file)
index 0000000..cc7edcf
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png
new file mode 100644 (file)
index 0000000..1ad04f0
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png
new file mode 100644 (file)
index 0000000..2dd5262
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png
new file mode 100644 (file)
index 0000000..b058cae
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png
new file mode 100644 (file)
index 0000000..02e47a2
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png
new file mode 100644 (file)
index 0000000..4954a4b
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/HelloworldXamarin.iOS.csproj b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/HelloworldXamarin.iOS.csproj
new file mode 100644 (file)
index 0000000..cfa5e9f
--- /dev/null
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">iPhoneSimulator</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{101480C8-667F-45F0-9E3B-1201CE5F3D9F}</ProjectGuid>
+    <ProjectTypeGuids>{FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <TemplateGuid>{6143fdea-f3c2-4a09-aafa-6e230626515e}</TemplateGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>HelloworldXamarin.iOS</RootNamespace>
+    <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
+    <AssemblyName>HelloworldXamarin.iOS</AssemblyName>
+    <MtouchEnableSGenConc>true</MtouchEnableSGenConc>
+    <MtouchHttpClientHandler>NSUrlSessionHandler</MtouchHttpClientHandler>
+    <ProvisioningType>automatic</ProvisioningType>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhoneSimulator' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\iPhoneSimulator\Debug</OutputPath>
+    <DefineConstants>DEBUG</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <MtouchArch>x86_64</MtouchArch>
+    <MtouchLink>None</MtouchLink>
+    <MtouchDebug>true</MtouchDebug>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' ">
+    <DebugType>none</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\iPhoneSimulator\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <MtouchLink>None</MtouchLink>
+    <MtouchArch>x86_64</MtouchArch>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhone' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\iPhone\Debug</OutputPath>
+    <DefineConstants>DEBUG</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <MtouchArch>ARM64</MtouchArch>
+    <CodesignKey>iPhone Developer</CodesignKey>
+    <MtouchDebug>true</MtouchDebug>
+    <CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
+    <MtouchLink>None</MtouchLink>
+    <MtouchInterpreter>-all</MtouchInterpreter>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
+    <DebugType>none</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\iPhone\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <MtouchArch>ARM64</MtouchArch>
+    <CodesignKey>iPhone Developer</CodesignKey>
+    <CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
+  </PropertyGroup>
+  <ItemGroup>
+    <Compile Include="Main.cs" />
+    <Compile Include="AppDelegate.cs" />
+    <None Include="Entitlements.plist" />
+    <None Include="Info.plist" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <InterfaceDefinition Include="Resources\LaunchScreen.storyboard" />
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Contents.json">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon1024.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon180.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon167.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon152.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon120.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon87.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon80.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon76.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon60.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon58.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon40.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon29.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon20.png">
+      <Visible>false</Visible>
+    </ImageAsset>
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="Xamarin.iOS" />
+    <Reference Include="System.Numerics" />
+    <Reference Include="System.Numerics.Vectors" />
+  </ItemGroup>
+  <ItemGroup>
+    <PackageReference Include="Grpc.Core">
+      <Version>2.32.0</Version>
+    </PackageReference>
+    <PackageReference Include="Xamarin.Forms" Version="4.6.0.1141" />
+    <PackageReference Include="Xamarin.Essentials" Version="1.5.3.2" />
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
+  <ItemGroup>
+    <ProjectReference Include="..\HelloworldXamarin\HelloworldXamarin.csproj">
+      <Project>{5900A2BD-3407-4F05-8CF2-DFF2A98B54F3}</Project>
+      <Name>HelloworldXamarin</Name>
+    </ProjectReference>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Info.plist b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Info.plist
new file mode 100644 (file)
index 0000000..45e5890
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+    <key>UIDeviceFamily</key>
+    <array>
+        <integer>1</integer>
+        <integer>2</integer>
+    </array>
+    <key>UISupportedInterfaceOrientations</key>
+    <array>
+        <string>UIInterfaceOrientationPortrait</string>
+        <string>UIInterfaceOrientationLandscapeLeft</string>
+        <string>UIInterfaceOrientationLandscapeRight</string>
+    </array>
+    <key>UISupportedInterfaceOrientations~ipad</key>
+    <array>
+        <string>UIInterfaceOrientationPortrait</string>
+        <string>UIInterfaceOrientationPortraitUpsideDown</string>
+        <string>UIInterfaceOrientationLandscapeLeft</string>
+        <string>UIInterfaceOrientationLandscapeRight</string>
+    </array>
+    <key>MinimumOSVersion</key>
+    <string>8.0</string>
+    <key>CFBundleDisplayName</key>
+    <string>HelloworldXamarin</string>
+    <key>CFBundleIdentifier</key>
+    <string>com.companyname.HelloworldXamarin</string>
+    <key>CFBundleVersion</key>
+    <string>1.0</string>
+    <key>UILaunchStoryboardName</key>
+    <string>LaunchScreen</string>
+    <key>CFBundleName</key>
+    <string>HelloworldXamarin</string>
+    <key>XSAppIconAssets</key>
+    <string>Assets.xcassets/AppIcon.appiconset</string>
+</dict>
+</plist>
@@ -1,6 +1,5 @@
 #region Copyright notice and license
-
-// Copyright 2018 The gRPC Authors
+// Copyright 2020 The gRPC Authors
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -13,7 +12,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-
 #endregion
 
 using System;
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Properties/AssemblyInfo.cs b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Properties/AssemblyInfo.cs
new file mode 100644 (file)
index 0000000..8cc293a
--- /dev/null
@@ -0,0 +1,52 @@
+#region Copyright notice and license
+// Copyright 2020 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HelloworldXamarin.iOS")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HelloworldXamarin.iOS")]
+[assembly: AssemblyCopyright("Copyright ©  2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default-568h@2x.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default-568h@2x.png
new file mode 100644 (file)
index 0000000..26c6461
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default-568h@2x.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default-Portrait.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default-Portrait.png
new file mode 100644 (file)
index 0000000..5d0d1ab
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default-Portrait.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default-Portrait@2x.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default-Portrait@2x.png
new file mode 100644 (file)
index 0000000..0ee2688
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default-Portrait@2x.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default.png
new file mode 100644 (file)
index 0000000..b74643c
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default@2x.png b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default@2x.png
new file mode 100644 (file)
index 0000000..dbd6bd3
Binary files /dev/null and b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/Default@2x.png differ
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/LaunchScreen.storyboard b/examples/csharp/HelloworldXamarin/HelloworldXamarin.iOS/Resources/LaunchScreen.storyboard
new file mode 100644 (file)
index 0000000..a639c2f
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6245" systemVersion="13F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="X5k-f2-b5h">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="gAE-YM-kbH">
+            <objects>
+                <viewController id="X5k-f2-b5h" sceneMemberID="viewController">
+                    <layoutGuides>
+                        <viewControllerLayoutGuide type="top" id="Y8P-hJ-Z43"/>
+                        <viewControllerLayoutGuide type="bottom" id="9ZL-r4-8FZ"/>
+                    </layoutGuides>
+                    <view key="view" contentMode="scaleToFill" id="yd7-JS-zBw">
+                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" misplaced="YES" image="Icon-60.png" translatesAutoresizingMaskIntoConstraints="NO" id="23">
+                                <rect key="frame" x="270" y="270" width="60" height="60"/>
+                                <rect key="contentStretch" x="0.0" y="0.0" width="0.0" height="0.0"/>
+                            </imageView>
+                        </subviews>
+                        <color key="backgroundColor" red="0.20392156862745098" green="0.59607843137254901" blue="0.85882352941176465" alpha="1" colorSpace="calibratedRGB"/>
+                        <constraints>
+                            <constraint firstItem="23" firstAttribute="centerY" secondItem="yd7-JS-zBw" secondAttribute="centerY" priority="1" id="39"/>
+                            <constraint firstItem="23" firstAttribute="centerX" secondItem="yd7-JS-zBw" secondAttribute="centerX" priority="1" id="41"/>
+                        </constraints>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="XAI-xm-WK6" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="349" y="339"/>
+        </scene>
+    </scenes>
+    <resources>
+        <image name="Icon-60.png" width="180" height="180"/>
+    </resources>
+</document>
index ee3ea5c..cb5c481 100644 (file)
@@ -1,19 +1,15 @@
+\r
 Microsoft Visual Studio Solution File, Format Version 12.00\r
-# Visual Studio 15\r
-VisualStudioVersion = 15.0.28307.329\r
+# Visual Studio Version 16\r
+VisualStudioVersion = 16.0.30523.141\r
 MinimumVisualStudioVersion = 10.0.40219.1\r
-Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "HelloworldXamarin", "HelloworldXamarin\HelloworldXamarin.shproj", "{42FFF3D8-934F-4475-8E68-08DA340BF6E8}"\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloworldXamarin.Android", "HelloworldXamarin.Android\HelloworldXamarin.Android.csproj", "{FB8D18D2-51AF-432C-8EA0-21B4454F45A9}"\r
 EndProject\r
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloworldXamarin.Droid", "Droid\HelloworldXamarin.Droid.csproj", "{B9B0D41C-1C07-4590-A919-5865E741B2EA}"\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloworldXamarin.iOS", "HelloworldXamarin.iOS\HelloworldXamarin.iOS.csproj", "{101480C8-667F-45F0-9E3B-1201CE5F3D9F}"\r
 EndProject\r
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloworldXamarin.iOS", "iOS\HelloworldXamarin.iOS.csproj", "{62336DF0-60D8-478F-8140-B3CB089B417E}"\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloworldXamarin", "HelloworldXamarin\HelloworldXamarin.csproj", "{5C8483A1-8135-481A-880A-6C83DF3D92C4}"\r
 EndProject\r
 Global\r
-       GlobalSection(SharedMSBuildProjectFiles) = preSolution\r
-               HelloworldXamarin\HelloworldXamarin.projitems*{42fff3d8-934f-4475-8e68-08da340bf6e8}*SharedItemsImports = 13\r
-               HelloworldXamarin\HelloworldXamarin.projitems*{62336df0-60d8-478f-8140-b3cb089b417e}*SharedItemsImports = 4\r
-               HelloworldXamarin\HelloworldXamarin.projitems*{b9b0d41c-1c07-4590-a919-5865e741b2ea}*SharedItemsImports = 4\r
-       EndGlobalSection\r
        GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
                Debug|Any CPU = Debug|Any CPU\r
                Debug|iPhone = Debug|iPhone\r
@@ -23,35 +19,65 @@ Global
                Release|iPhoneSimulator = Release|iPhoneSimulator\r
        EndGlobalSection\r
        GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
-               {B9B0D41C-1C07-4590-A919-5865E741B2EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
-               {B9B0D41C-1C07-4590-A919-5865E741B2EA}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
-               {B9B0D41C-1C07-4590-A919-5865E741B2EA}.Debug|iPhone.ActiveCfg = Debug|Any CPU\r
-               {B9B0D41C-1C07-4590-A919-5865E741B2EA}.Debug|iPhone.Build.0 = Debug|Any CPU\r
-               {B9B0D41C-1C07-4590-A919-5865E741B2EA}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU\r
-               {B9B0D41C-1C07-4590-A919-5865E741B2EA}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU\r
-               {B9B0D41C-1C07-4590-A919-5865E741B2EA}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
-               {B9B0D41C-1C07-4590-A919-5865E741B2EA}.Release|Any CPU.Build.0 = Release|Any CPU\r
-               {B9B0D41C-1C07-4590-A919-5865E741B2EA}.Release|iPhone.ActiveCfg = Release|Any CPU\r
-               {B9B0D41C-1C07-4590-A919-5865E741B2EA}.Release|iPhone.Build.0 = Release|Any CPU\r
-               {B9B0D41C-1C07-4590-A919-5865E741B2EA}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU\r
-               {B9B0D41C-1C07-4590-A919-5865E741B2EA}.Release|iPhoneSimulator.Build.0 = Release|Any CPU\r
-               {62336DF0-60D8-478F-8140-B3CB089B417E}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator\r
-               {62336DF0-60D8-478F-8140-B3CB089B417E}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator\r
-               {62336DF0-60D8-478F-8140-B3CB089B417E}.Debug|iPhone.ActiveCfg = Debug|iPhone\r
-               {62336DF0-60D8-478F-8140-B3CB089B417E}.Debug|iPhone.Build.0 = Debug|iPhone\r
-               {62336DF0-60D8-478F-8140-B3CB089B417E}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator\r
-               {62336DF0-60D8-478F-8140-B3CB089B417E}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator\r
-               {62336DF0-60D8-478F-8140-B3CB089B417E}.Release|Any CPU.ActiveCfg = Release|iPhone\r
-               {62336DF0-60D8-478F-8140-B3CB089B417E}.Release|Any CPU.Build.0 = Release|iPhone\r
-               {62336DF0-60D8-478F-8140-B3CB089B417E}.Release|iPhone.ActiveCfg = Release|iPhone\r
-               {62336DF0-60D8-478F-8140-B3CB089B417E}.Release|iPhone.Build.0 = Release|iPhone\r
-               {62336DF0-60D8-478F-8140-B3CB089B417E}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator\r
-               {62336DF0-60D8-478F-8140-B3CB089B417E}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Debug|Any CPU.Deploy.0 = Debug|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Debug|iPhone.ActiveCfg = Debug|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Debug|iPhone.Build.0 = Debug|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Debug|iPhone.Deploy.0 = Debug|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Release|Any CPU.Build.0 = Release|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Release|Any CPU.Deploy.0 = Release|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Release|iPhone.ActiveCfg = Release|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Release|iPhone.Build.0 = Release|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Release|iPhone.Deploy.0 = Release|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Release|iPhoneSimulator.Build.0 = Release|Any CPU\r
+               {FB8D18D2-51AF-432C-8EA0-21B4454F45A9}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Debug|Any CPU.ActiveCfg = Debug|iPhone\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Debug|Any CPU.Build.0 = Debug|iPhone\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Debug|Any CPU.Deploy.0 = Debug|iPhone\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Debug|iPhone.ActiveCfg = Debug|iPhone\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Debug|iPhone.Build.0 = Debug|iPhone\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Debug|iPhone.Deploy.0 = Debug|iPhone\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Debug|iPhoneSimulator.Deploy.0 = Debug|iPhoneSimulator\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Release|Any CPU.Build.0 = Release|iPhoneSimulator\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Release|Any CPU.Deploy.0 = Release|iPhoneSimulator\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Release|iPhone.ActiveCfg = Release|iPhone\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Release|iPhone.Build.0 = Release|iPhone\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Release|iPhone.Deploy.0 = Release|iPhone\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator\r
+               {101480C8-667F-45F0-9E3B-1201CE5F3D9F}.Release|iPhoneSimulator.Deploy.0 = Release|iPhoneSimulator\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Debug|Any CPU.Deploy.0 = Debug|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Debug|iPhone.ActiveCfg = Debug|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Debug|iPhone.Build.0 = Debug|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Debug|iPhone.Deploy.0 = Debug|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Release|Any CPU.Build.0 = Release|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Release|Any CPU.Deploy.0 = Release|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Release|iPhone.ActiveCfg = Release|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Release|iPhone.Build.0 = Release|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Release|iPhone.Deploy.0 = Release|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Release|iPhoneSimulator.Build.0 = Release|Any CPU\r
+               {5C8483A1-8135-481A-880A-6C83DF3D92C4}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU\r
        EndGlobalSection\r
        GlobalSection(SolutionProperties) = preSolution\r
                HideSolutionNode = FALSE\r
        EndGlobalSection\r
        GlobalSection(ExtensibilityGlobals) = postSolution\r
-               SolutionGuid = {CDC6F6DC-E1C6-45A7-ACC2-A61CDCCA1436}\r
+               SolutionGuid = {1C99C057-EAF9-413C-AC67-2595665C0444}\r
        EndGlobalSection\r
 EndGlobal\r
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin/App.xaml b/examples/csharp/HelloworldXamarin/HelloworldXamarin/App.xaml
new file mode 100644 (file)
index 0000000..dbd3dd2
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Application xmlns="http://xamarin.com/schemas/2014/forms"
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             x:Class="HelloworldXamarin.App">
+    <Application.Resources>
+
+    </Application.Resources>
+</Application>
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin/App.xaml.cs b/examples/csharp/HelloworldXamarin/HelloworldXamarin/App.xaml.cs
new file mode 100644 (file)
index 0000000..9ae7a8c
--- /dev/null
@@ -0,0 +1,44 @@
+#region Copyright notice and license
+// Copyright 2020 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#endregion
+
+using System;
+using Xamarin.Forms;
+using Xamarin.Forms.Xaml;
+
+namespace HelloworldXamarin
+{
+    public partial class App : Application
+    {
+        public App()
+        {
+            InitializeComponent();
+
+            MainPage = new MainPage();
+        }
+
+        protected override void OnStart()
+        {
+        }
+
+        protected override void OnSleep()
+        {
+        }
+
+        protected override void OnResume()
+        {
+        }
+    }
+}
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin/AssemblyInfo.cs b/examples/csharp/HelloworldXamarin/HelloworldXamarin/AssemblyInfo.cs
new file mode 100644 (file)
index 0000000..aeb826c
--- /dev/null
@@ -0,0 +1,19 @@
+#region Copyright notice and license
+// Copyright 2020 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#endregion
+
+using Xamarin.Forms.Xaml;
+
+[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin/HelloworldXamarin.csproj b/examples/csharp/HelloworldXamarin/HelloworldXamarin/HelloworldXamarin.csproj
new file mode 100644 (file)
index 0000000..039debc
--- /dev/null
@@ -0,0 +1,19 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+    <ProduceReferenceAssembly>true</ProduceReferenceAssembly>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
+    <DebugType>portable</DebugType>
+    <DebugSymbols>true</DebugSymbols>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Google.Protobuf" Version="3.13.0" />
+    <PackageReference Include="Grpc.Core" Version="2.32.0" />
+    <PackageReference Include="Xamarin.Forms" Version="4.6.0.1141" />
+    <PackageReference Include="Xamarin.Essentials" Version="1.5.3.2" />
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin/HelloworldXamarin.projitems b/examples/csharp/HelloworldXamarin/HelloworldXamarin/HelloworldXamarin.projitems
deleted file mode 100644 (file)
index 25f5478..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
-  <PropertyGroup>\r
-    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>\r
-    <HasSharedItems>true</HasSharedItems>\r
-    <SharedGUID>{42FFF3D8-934F-4475-8E68-08DA340BF6E8}</SharedGUID>\r
-  </PropertyGroup>\r
-  <PropertyGroup Label="Configuration">\r
-    <Import_RootNamespace>HelloworldXamarin</Import_RootNamespace>\r
-  </PropertyGroup>\r
-  <ItemGroup>\r
-    <Compile Include="$(MSBuildThisFileDirectory)Helloworld.cs" />\r
-    <Compile Include="$(MSBuildThisFileDirectory)HelloworldGrpc.cs" />\r
-  </ItemGroup>\r
-</Project>
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin/HelloworldXamarin.shproj b/examples/csharp/HelloworldXamarin/HelloworldXamarin/HelloworldXamarin.shproj
deleted file mode 100644 (file)
index 0eb2448..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
-  <PropertyGroup>\r
-    <ProjectGuid>{42FFF3D8-934F-4475-8E68-08DA340BF6E8}</ProjectGuid>\r
-  </PropertyGroup>\r
-  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />\r
-  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.Default.props" />\r
-  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.props" />\r
-  <Import Project="HelloworldXamarin.projitems" Label="Shared" />\r
-  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.CSharp.targets" />\r
-</Project>
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/HelloworldXamarin/MainPage.xaml b/examples/csharp/HelloworldXamarin/HelloworldXamarin/MainPage.xaml
new file mode 100644 (file)
index 0000000..2940874
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             x:Class="HelloworldXamarin.MainPage">
+
+    <StackLayout>
+        <Frame BackgroundColor="#2196F3" Padding="24" CornerRadius="0">
+            <Label Text="Helloworld, gRPC + Xamarin" HorizontalTextAlignment="Center" TextColor="White" FontSize="36"/>
+        </Frame>
+        <Label Text="Click the button to try gRPC on Xamarin" FontSize="16" Padding="30,0,30,0"/>
+        <Button Text="Click here!" Clicked="Button_Clicked"/>
+    </StackLayout>
+
+</ContentPage>
@@ -1,6 +1,5 @@
 #region Copyright notice and license
-
-// Copyright 2018 The gRPC Authors
+// Copyright 2020 The gRPC Authors
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-
 #endregion
 
 using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
 using System.Threading.Tasks;
-
+using Xamarin.Forms;
 using Grpc.Core;
 using Helloworld;
 
-using UIKit;
-
-namespace HelloworldXamarin.iOS
+namespace HelloworldXamarin
 {
-    public partial class ViewController : UIViewController
+    public partial class MainPage : ContentPage
     {
         const int Port = 30051;
         int count = 1;
 
-        public ViewController(IntPtr handle) : base(handle)
+        public MainPage()
         {
+            InitializeComponent();
         }
 
-        public override void ViewDidLoad()
+        private void Button_Clicked(object sender, EventArgs e)
         {
-            base.ViewDidLoad();
-
-            // Perform any additional setup after loading the view, typically from a nib.
-            Button.AccessibilityIdentifier = "myButton";
-            Button.TouchUpInside += delegate
-            {
-                var title = SayHello();
-                Button.SetTitle(title, UIControlState.Normal);
-            };
+            SayHello(sender as Button);
         }
 
-        public override void DidReceiveMemoryWarning()
-        {
-            base.DidReceiveMemoryWarning();
-            // Release any cached data, images, etc that aren't in use.                
-        }
-
-        private string SayHello()
+        private void SayHello(Button button)
         {
             Server server = new Server
             {
@@ -63,6 +50,8 @@ namespace HelloworldXamarin.iOS
             };
             server.Start();
 
+            // use loopback on host machine: https://developer.android.com/studio/run/emulator-networking
+            // 10.0.2.2:30051
             Channel channel = new Channel("localhost:30051", ChannelCredentials.Insecure);
 
             var client = new Greeter.GreeterClient(channel);
@@ -70,21 +59,20 @@ namespace HelloworldXamarin.iOS
 
             var reply = client.SayHello(new HelloRequest { Name = user });
 
+            button.Text = "Greeting: " + reply.Message;
+
             channel.ShutdownAsync().Wait();
             server.ShutdownAsync().Wait();
 
             count++;
-
-            return "Greeting: " + reply.Message;
         }
 
-
         class GreeterImpl : Greeter.GreeterBase
         {
             // Server side handler of the SayHello RPC
             public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
             {
-              return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
+                return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
             }
         }
     }
diff --git a/examples/csharp/HelloworldXamarin/iOS/AppDelegate.cs b/examples/csharp/HelloworldXamarin/iOS/AppDelegate.cs
deleted file mode 100644 (file)
index 53835f8..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2018 The gRPC Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using Foundation;
-using UIKit;
-
-namespace HelloworldXamarin.iOS
-{
-    // The UIApplicationDelegate for the application. This class is responsible for launching the
-    // User Interface of the application, as well as listening (and optionally responding) to application events from iOS.
-    [Register("AppDelegate")]
-    public class AppDelegate : UIApplicationDelegate
-    {
-        // class-level declarations
-
-        public override UIWindow Window
-        {
-            get;
-            set;
-        }
-
-        public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
-        {
-            // Override point for customization after application launch.
-            // If not required for your application you can safely delete this method
-
-            return true;
-        }
-
-        public override void OnResignActivation(UIApplication application)
-        {
-            // Invoked when the application is about to move from active to inactive state.
-            // This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) 
-            // or when the user quits the application and it begins the transition to the background state.
-            // Games should use this method to pause the game.
-        }
-
-        public override void DidEnterBackground(UIApplication application)
-        {
-            // Use this method to release shared resources, save user data, invalidate timers and store the application state.
-            // If your application supports background execution this method is called instead of WillTerminate when the user quits.
-        }
-
-        public override void WillEnterForeground(UIApplication application)
-        {
-            // Called as part of the transition from background to active state.
-            // Here you can undo many of the changes made on entering the background.
-        }
-
-        public override void OnActivated(UIApplication application)
-        {
-            // Restart any tasks that were paused (or not yet started) while the application was inactive. 
-            // If the application was previously in the background, optionally refresh the user interface.
-        }
-
-        public override void WillTerminate(UIApplication application)
-        {
-            // Called when the application is about to terminate. Save data, if needed. See also DidEnterBackground.
-        }
-    }
-}
-
diff --git a/examples/csharp/HelloworldXamarin/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/csharp/HelloworldXamarin/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644 (file)
index 64d0e3d..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-{
-  "images" : [
-    {
-      "idiom" : "iphone",
-      "size" : "20x20",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "20x20",
-      "scale" : "3x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "29x29",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "29x29",
-      "scale" : "3x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "40x40",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "40x40",
-      "scale" : "3x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "60x60",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "60x60",
-      "scale" : "3x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "20x20",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "20x20",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "29x29",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "29x29",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "40x40",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "40x40",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "76x76",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "76x76",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "83.5x83.5",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "ios-marketing",
-      "size" : "1024x1024",
-      "scale" : "1x"
-    },
-    {
-      "size" : "24x24",
-      "idiom" : "watch",
-      "scale" : "2x",
-      "role" : "notificationCenter",
-      "subtype" : "38mm"
-    },
-    {
-      "size" : "27.5x27.5",
-      "idiom" : "watch",
-      "scale" : "2x",
-      "role" : "notificationCenter",
-      "subtype" : "42mm"
-    },
-    {
-      "size" : "29x29",
-      "idiom" : "watch",
-      "role" : "companionSettings",
-      "scale" : "2x"
-    },
-    {
-      "size" : "29x29",
-      "idiom" : "watch",
-      "role" : "companionSettings",
-      "scale" : "3x"
-    },
-    {
-      "size" : "40x40",
-      "idiom" : "watch",
-      "scale" : "2x",
-      "role" : "appLauncher",
-      "subtype" : "38mm"
-    },
-    {
-      "size" : "44x44",
-      "idiom" : "watch",
-      "scale" : "2x",
-      "role" : "longLook",
-      "subtype" : "42mm"
-    },
-    {
-      "size" : "86x86",
-      "idiom" : "watch",
-      "scale" : "2x",
-      "role" : "quickLook",
-      "subtype" : "38mm"
-    },
-    {
-      "size" : "98x98",
-      "idiom" : "watch",
-      "scale" : "2x",
-      "role" : "quickLook",
-      "subtype" : "42mm"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "16x16",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "16x16",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "32x32",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "32x32",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "128x128",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "128x128",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "256x256",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "256x256",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "512x512",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "512x512",
-      "scale" : "2x"
-    }
-  ],
-  "info" : {
-    "version" : 1,
-    "author" : "xcode"
-  }
-}
diff --git a/examples/csharp/HelloworldXamarin/iOS/Assets.xcassets/Contents.json b/examples/csharp/HelloworldXamarin/iOS/Assets.xcassets/Contents.json
deleted file mode 100644 (file)
index 4caf392..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "info" : {
-    "version" : 1,
-    "author" : "xcode"
-  }
-}
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/iOS/HelloworldXamarin.iOS.csproj b/examples/csharp/HelloworldXamarin/iOS/HelloworldXamarin.iOS.csproj
deleted file mode 100644 (file)
index 844e06c..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
-  <PropertyGroup>\r
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
-    <Platform Condition=" '$(Platform)' == '' ">iPhoneSimulator</Platform>\r
-    <ProjectGuid>{62336DF0-60D8-478F-8140-B3CB089B417E}</ProjectGuid>\r
-    <ProjectTypeGuids>{FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\r
-    <OutputType>Exe</OutputType>\r
-    <RootNamespace>HelloworldXamarin.iOS</RootNamespace>\r
-    <AssemblyName>HelloworldXamarin.iOS</AssemblyName>\r
-    <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>\r
-    <NuGetPackageImportStamp>\r
-    </NuGetPackageImportStamp>\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhoneSimulator' ">\r
-    <DebugSymbols>true</DebugSymbols>\r
-    <DebugType>full</DebugType>\r
-    <Optimize>false</Optimize>\r
-    <OutputPath>bin\iPhoneSimulator\Debug</OutputPath>\r
-    <DefineConstants>DEBUG;ENABLE_TEST_CLOUD;</DefineConstants>\r
-    <ErrorReport>prompt</ErrorReport>\r
-    <WarningLevel>4</WarningLevel>\r
-    <CodesignKey>iPhone Developer</CodesignKey>\r
-    <MtouchDebug>true</MtouchDebug>\r
-    <MtouchNoSymbolStrip>true</MtouchNoSymbolStrip>\r
-    <MtouchFastDev>true</MtouchFastDev>\r
-    <IOSDebuggerPort>45216</IOSDebuggerPort>\r
-    <MtouchLink>None</MtouchLink>\r
-    <MtouchArch>x86_64</MtouchArch>\r
-    <MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler>\r
-    <PlatformTarget>x86</PlatformTarget>\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">\r
-    <DebugType>pdbonly</DebugType>\r
-    <Optimize>true</Optimize>\r
-    <OutputPath>bin\iPhone\Release</OutputPath>\r
-    <ErrorReport>prompt</ErrorReport>\r
-    <WarningLevel>4</WarningLevel>\r
-    <CodesignKey>iPhone Developer</CodesignKey>\r
-    <MtouchFloat32>true</MtouchFloat32>\r
-    <CodesignEntitlements>Entitlements.plist</CodesignEntitlements>\r
-    <MtouchLink>SdkOnly</MtouchLink>\r
-    <MtouchArch>ARM64</MtouchArch>\r
-    <MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler>\r
-    <PlatformTarget>x86</PlatformTarget>\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' ">\r
-    <DebugType>pdbonly</DebugType>\r
-    <Optimize>true</Optimize>\r
-    <OutputPath>bin\iPhoneSimulator\Release</OutputPath>\r
-    <ErrorReport>prompt</ErrorReport>\r
-    <WarningLevel>4</WarningLevel>\r
-    <CodesignKey>iPhone Developer</CodesignKey>\r
-    <MtouchNoSymbolStrip>true</MtouchNoSymbolStrip>\r
-    <MtouchLink>None</MtouchLink>\r
-    <MtouchArch>x86_64</MtouchArch>\r
-    <MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler>\r
-    <PlatformTarget>x86</PlatformTarget>\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhone' ">\r
-    <DebugSymbols>true</DebugSymbols>\r
-    <DebugType>full</DebugType>\r
-    <Optimize>false</Optimize>\r
-    <OutputPath>bin\iPhone\Debug</OutputPath>\r
-    <DefineConstants>DEBUG;ENABLE_TEST_CLOUD;</DefineConstants>\r
-    <ErrorReport>prompt</ErrorReport>\r
-    <WarningLevel>4</WarningLevel>\r
-    <CodesignKey>iPhone Developer</CodesignKey>\r
-    <DeviceSpecificBuild>true</DeviceSpecificBuild>\r
-    <MtouchDebug>true</MtouchDebug>\r
-    <MtouchNoSymbolStrip>true</MtouchNoSymbolStrip>\r
-    <MtouchFastDev>true</MtouchFastDev>\r
-    <MtouchFloat32>true</MtouchFloat32>\r
-    <CodesignEntitlements>Entitlements.plist</CodesignEntitlements>\r
-    <IOSDebuggerPort>35164</IOSDebuggerPort>\r
-    <MtouchLink>SdkOnly</MtouchLink>\r
-    <MtouchArch>ARM64</MtouchArch>\r
-    <MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler>\r
-    <PlatformTarget>x86</PlatformTarget>\r
-  </PropertyGroup>\r
-  <ItemGroup>\r
-    <Reference Include="Google.Protobuf, Version=3.8.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">\r
-      <HintPath>..\packages\Google.Protobuf.3.8.0\lib\netstandard2.0\Google.Protobuf.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="Grpc.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=d754f35622e28bad, processorArchitecture=MSIL">\r
-      <HintPath>..\packages\Grpc.Core.2.23.0\lib\netstandard2.0\Grpc.Core.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="Grpc.Core.Api, Version=2.0.0.0, Culture=neutral, PublicKeyToken=d754f35622e28bad, processorArchitecture=MSIL">\r
-      <HintPath>..\packages\Grpc.Core.Api.2.23.0\lib\netstandard2.0\Grpc.Core.Api.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="System" />\r
-    <Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">\r
-      <HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">\r
-      <HintPath>..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">\r
-      <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="System.Xml" />\r
-    <Reference Include="System.Core" />\r
-    <Reference Include="Xamarin.iOS" />\r
-    <Reference Include="System.IO.Compression" />\r
-    <Reference Include="System.Net.Http" />\r
-    <Reference Include="System.Runtime.Loader">\r
-      <HintPath>..\packages\System.Runtime.Loader.4.0.0\lib\netstandard1.5\System.Runtime.Loader.dll</HintPath>\r
-    </Reference>\r
-    <Reference Include="System.Interactive.Async">\r
-      <HintPath>..\packages\System.Interactive.Async.3.1.1\lib\netstandard1.3\System.Interactive.Async.dll</HintPath>\r
-    </Reference>\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Contents.json">\r
-      <Visible>false</Visible>\r
-    </ImageAsset>\r
-    <ImageAsset Include="Assets.xcassets\Contents.json">\r
-      <Visible>false</Visible>\r
-    </ImageAsset>\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <Folder Include="Resources\" />\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <InterfaceDefinition Include="LaunchScreen.storyboard" />\r
-    <InterfaceDefinition Include="Main.storyboard" />\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <None Include="app.config" />\r
-    <None Include="Info.plist" />\r
-    <None Include="Entitlements.plist" />\r
-    <None Include="packages.config" />\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <Compile Include="Main.cs" />\r
-    <Compile Include="AppDelegate.cs" />\r
-    <Compile Include="ViewController.cs" />\r
-    <Compile Include="ViewController.designer.cs">\r
-      <DependentUpon>ViewController.cs</DependentUpon>\r
-    </Compile>\r
-  </ItemGroup>\r
-  <Import Project="..\HelloworldXamarin\HelloworldXamarin.projitems" Label="Shared" Condition="Exists('..\HelloworldXamarin\HelloworldXamarin.projitems')" />\r
-  <Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />\r
-  <Import Project="..\packages\Grpc.Core.2.23.0\build\Xamarin.iOS10\Grpc.Core.targets" Condition="Exists('..\packages\Grpc.Core.2.23.0\build\Xamarin.iOS10\Grpc.Core.targets')" />\r
-  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">\r
-    <PropertyGroup>\r
-      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\r
-    </PropertyGroup>\r
-    <Error Condition="!Exists('..\packages\Grpc.Core.2.23.0\build\Xamarin.iOS10\Grpc.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Grpc.Core.2.23.0\build\Xamarin.iOS10\Grpc.Core.targets'))" />\r
-  </Target>\r
-</Project>
\ No newline at end of file
diff --git a/examples/csharp/HelloworldXamarin/iOS/Info.plist b/examples/csharp/HelloworldXamarin/iOS/Info.plist
deleted file mode 100644 (file)
index 1663f19..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>CFBundleName</key>
-       <string>HelloworldXamarin</string>
-       <key>CFBundleIdentifier</key>
-       <string>io.grpc.examples.HelloworldXamarin</string>
-       <key>CFBundleShortVersionString</key>
-       <string>1.0</string>
-       <key>CFBundleVersion</key>
-       <string>1.0</string>
-       <key>LSRequiresIPhoneOS</key>
-       <true/>
-       <key>MinimumOSVersion</key>
-       <string>8.0</string>
-       <key>UIDeviceFamily</key>
-       <array>
-               <integer>1</integer>
-               <integer>2</integer>
-       </array>
-       <key>UILaunchStoryboardName</key>
-       <string>LaunchScreen</string>
-       <key>UIMainStoryboardFile</key>
-       <string>Main</string>
-       <key>UIMainStoryboardFile~ipad</key>
-       <string>Main</string>
-       <key>UIRequiredDeviceCapabilities</key>
-       <array>
-               <string>armv7</string>
-       </array>
-       <key>UISupportedInterfaceOrientations</key>
-       <array>
-               <string>UIInterfaceOrientationPortrait</string>
-               <string>UIInterfaceOrientationLandscapeLeft</string>
-               <string>UIInterfaceOrientationLandscapeRight</string>
-       </array>
-       <key>UISupportedInterfaceOrientations~ipad</key>
-       <array>
-               <string>UIInterfaceOrientationPortrait</string>
-               <string>UIInterfaceOrientationPortraitUpsideDown</string>
-               <string>UIInterfaceOrientationLandscapeLeft</string>
-               <string>UIInterfaceOrientationLandscapeRight</string>
-       </array>
-       <key>XSAppIconAssets</key>
-       <string>Assets.xcassets/AppIcon.appiconset</string>
-</dict>
-</plist>
diff --git a/examples/csharp/HelloworldXamarin/iOS/LaunchScreen.storyboard b/examples/csharp/HelloworldXamarin/iOS/LaunchScreen.storyboard
deleted file mode 100644 (file)
index 5d2e905..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9532" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
-    <dependencies>
-        <deployment identifier="iOS" />
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9530" />
-    </dependencies>
-    <scenes>
-        <!--View Controller-->
-        <scene sceneID="EHf-IW-A2E">
-            <objects>
-                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
-                    <layoutGuides>
-                        <viewControllerLayoutGuide type="top" id="Llm-lL-Icb" />
-                        <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok" />
-                    </layoutGuides>
-                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
-                        <rect key="frame" x="0.0" y="0.0" width="600" height="600" />
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" />
-                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite" />
-                    </view>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder" />
-            </objects>
-            <point key="canvasLocation" x="53" y="375" />
-        </scene>
-    </scenes>
-</document>
diff --git a/examples/csharp/HelloworldXamarin/iOS/Main.storyboard b/examples/csharp/HelloworldXamarin/iOS/Main.storyboard
deleted file mode 100644 (file)
index 92a28ce..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6750" systemVersion="14C109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
-    <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6735" />
-    </dependencies>
-    <scenes>
-        <!--View Controller-->
-        <scene sceneID="tne-QT-ifu">
-            <objects>
-                <viewController id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController">
-                    <layoutGuides>
-                        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ" />
-                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE" />
-                    </layoutGuides>
-                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
-                        <rect key="frame" x="0.0" y="0.0" width="600" height="600" />
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" />
-                        <subviews>
-                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="oBE-Ac-vcx">
-                                <rect key="frame" x="224" y="285" width="152" height="30" />
-                                <state key="normal" title="Hello World, Click Me!">
-                                    <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite" />
-                                </state>
-                            </button>
-                        </subviews>
-                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite" />
-                        <constraints>
-                            <constraint firstItem="oBE-Ac-vcx" firstAttribute="centerX" secondItem="8bC-Xf-vdC" secondAttribute="centerX" id="HiD-uS-i16" />
-                            <constraint firstItem="oBE-Ac-vcx" firstAttribute="centerY" secondItem="8bC-Xf-vdC" secondAttribute="centerY" id="YgX-7e-bMc" />
-                        </constraints>
-                    </view>
-                    <connections>
-                        <outlet property="Button" destination="oBE-Ac-vcx" id="OkX-0Z-gth" />
-                    </connections>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder" />
-            </objects>
-        </scene>
-    </scenes>
-</document>
diff --git a/examples/csharp/HelloworldXamarin/iOS/ViewController.designer.cs b/examples/csharp/HelloworldXamarin/iOS/ViewController.designer.cs
deleted file mode 100644 (file)
index 2677a06..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-//          
-// This file has been generated automatically by MonoDevelop to store outlets and              
-// actions made in the Xcode designer. If it is removed, they will be lost.            
-// Manual changes to this file may not be handled correctly.           
-//             
-using Foundation;
-
-namespace HelloworldXamarin.iOS
-{
-    [Register("ViewController")]
-    partial class ViewController
-    {
-        [Outlet]
-        UIKit.UIButton Button { get; set; }
-
-        void ReleaseDesignerOutlets()
-        {
-            if (Button != null)
-            {
-                Button.Dispose();
-                Button = null;
-            }
-        }
-    }
-}
diff --git a/examples/csharp/HelloworldXamarin/iOS/packages.config b/examples/csharp/HelloworldXamarin/iOS/packages.config
deleted file mode 100644 (file)
index 80802a8..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
-  <package id="Google.Protobuf" version="3.8.0" targetFramework="xamarinios10" />
-  <package id="Grpc.Core" version="2.23.0" targetFramework="xamarinios10" />
-  <package id="Grpc.Core.Api" version="2.23.0" targetFramework="xamarinios10" />
-  <package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="xamarinios10" />
-  <package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="NETStandard.Library" version="1.6.1" targetFramework="xamarinios10" />
-  <package id="System.AppContext" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Buffers" version="4.4.0" targetFramework="xamarinios10" />
-  <package id="System.Collections" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Collections.Concurrent" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Console" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Globalization" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Globalization.Calendars" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Interactive.Async" version="3.1.1" targetFramework="xamarinios10" />
-  <package id="System.IO" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.IO.Compression" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.IO.FileSystem" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Linq" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Linq.Expressions" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Memory" version="4.5.3" targetFramework="xamarinios10" />
-  <package id="System.Net.Http" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Net.Primitives" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Net.Sockets" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.ObjectModel" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Reflection" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Reflection.Extensions" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Reflection.Primitives" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Runtime" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="xamarinios10" />
-  <package id="System.Runtime.Extensions" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Runtime.Handles" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Runtime.Loader" version="4.0.0" targetFramework="xamarinios10" />
-  <package id="System.Runtime.Numerics" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Text.Encoding" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Threading" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Threading.Tasks" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Threading.Thread" version="4.0.0" targetFramework="xamarinios10" />
-  <package id="System.Threading.ThreadPool" version="4.0.10" targetFramework="xamarinios10" />
-  <package id="System.Threading.Timer" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Xml.ReaderWriter" version="4.3.0" targetFramework="xamarinios10" />
-  <package id="System.Xml.XDocument" version="4.3.0" targetFramework="xamarinios10" />
-</packages>
\ No newline at end of file
index c289f50..c1274b1 100644 (file)
@@ -18,7 +18,8 @@
 
 var PROTO_PATH = __dirname + '/../../protos/helloworld.proto';
 
-var grpc = require('grpc');
+var parseArgs = require('minimist');
+var grpc = require('@grpc/grpc-js');
 var protoLoader = require('@grpc/proto-loader');
 var packageDefinition = protoLoader.loadSync(
     PROTO_PATH,
@@ -31,11 +32,20 @@ var packageDefinition = protoLoader.loadSync(
 var hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld;
 
 function main() {
-  var client = new hello_proto.Greeter('localhost:50051',
+  var argv = parseArgs(process.argv.slice(2), {
+    string: 'target'
+  });
+  var target;
+  if (argv.target) {
+    target = argv.target;
+  } else {
+    target = 'localhost:50051';
+  }
+  var client = new hello_proto.Greeter(target,
                                        grpc.credentials.createInsecure());
   var user;
-  if (process.argv.length >= 3) {
-    user = process.argv[2];
+  if (argv._.length > 0) {
+    user = argv._[0]; 
   } else {
     user = 'world';
   }
index 023257e..c606cd8 100644 (file)
@@ -18,7 +18,7 @@
 
 var PROTO_PATH = __dirname + '/../../protos/helloworld.proto';
 
-var grpc = require('grpc');
+var grpc = require('@grpc/grpc-js');
 var protoLoader = require('@grpc/proto-loader');
 var packageDefinition = protoLoader.loadSync(
     PROTO_PATH,
@@ -44,8 +44,9 @@ function sayHello(call, callback) {
 function main() {
   var server = new grpc.Server();
   server.addService(hello_proto.Greeter.service, {sayHello: sayHello});
-  server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
-  server.start();
+  server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
+    server.start();
+  });
 }
 
 main();
index 34a44bd..3af8858 100644 (file)
@@ -23,7 +23,7 @@ var fs = require('fs');
 var parseArgs = require('minimist');
 var path = require('path');
 var _ = require('lodash');
-var grpc = require('grpc');
+var grpc = require('@grpc/grpc-js');
 var protoLoader = require('@grpc/proto-loader');
 var packageDefinition = protoLoader.loadSync(
     PROTO_PATH,
index 106491c..b464538 100644 (file)
@@ -22,7 +22,7 @@ var fs = require('fs');
 var parseArgs = require('minimist');
 var path = require('path');
 var _ = require('lodash');
-var grpc = require('grpc');
+var grpc = require('@grpc/grpc-js');
 var protoLoader = require('@grpc/proto-loader');
 var packageDefinition = protoLoader.loadSync(
     PROTO_PATH,
@@ -230,14 +230,15 @@ function getServer() {
 if (require.main === module) {
   // If this is run as a script, start a server on an unused port
   var routeServer = getServer();
-  routeServer.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
-  var argv = parseArgs(process.argv, {
-    string: 'db_path'
-  });
-  fs.readFile(path.resolve(argv.db_path), function(err, data) {
-    if (err) throw err;
-    feature_list = JSON.parse(data);
-    routeServer.start();
+  routeServer.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
+    var argv = parseArgs(process.argv, {
+      string: 'db_path'
+    });
+    fs.readFile(path.resolve(argv.db_path), function(err, data) {
+      if (err) throw err;
+      feature_list = JSON.parse(data);
+      routeServer.start();
+    });
   });
 }
 
diff --git a/examples/node/package-lock.json b/examples/node/package-lock.json
new file mode 100644 (file)
index 0000000..24dcc67
--- /dev/null
@@ -0,0 +1,570 @@
+{
+  "name": "grpc-examples",
+  "version": "0.1.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@grpc/grpc-js": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.1.8.tgz",
+      "integrity": "sha512-64hg5rmEm6F/NvlWERhHmmgxbWU8nD2TMWE+9TvG7/WcOrFT3fzg/Uu631pXRFwmJ4aWO/kp9vVSlr8FUjBDLA==",
+      "requires": {
+        "@grpc/proto-loader": "^0.6.0-pre14",
+        "@types/node": "^12.12.47",
+        "google-auth-library": "^6.0.0",
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "@grpc/proto-loader": {
+          "version": "0.6.0-pre9",
+          "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.0-pre9.tgz",
+          "integrity": "sha512-oM+LjpEjNzW5pNJjt4/hq1HYayNeQT+eGrOPABJnYHv7TyNPDNzkQ76rDYZF86X5swJOa4EujEMzQ9iiTdPgww==",
+          "requires": {
+            "@types/long": "^4.0.1",
+            "lodash.camelcase": "^4.3.0",
+            "long": "^4.0.0",
+            "protobufjs": "^6.9.0",
+            "yargs": "^15.3.1"
+          }
+        },
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "y18n": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+          "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        }
+      }
+    },
+    "@grpc/proto-loader": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.5.tgz",
+      "integrity": "sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ==",
+      "requires": {
+        "lodash.camelcase": "^4.3.0",
+        "protobufjs": "^6.8.6"
+      }
+    },
+    "@protobufjs/aspromise": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+      "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
+    },
+    "@protobufjs/base64": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+      "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+    },
+    "@protobufjs/codegen": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+      "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+    },
+    "@protobufjs/eventemitter": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+      "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
+    },
+    "@protobufjs/fetch": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+      "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
+      "requires": {
+        "@protobufjs/aspromise": "^1.1.1",
+        "@protobufjs/inquire": "^1.1.0"
+      }
+    },
+    "@protobufjs/float": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+      "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
+    },
+    "@protobufjs/inquire": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+      "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
+    },
+    "@protobufjs/path": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+      "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
+    },
+    "@protobufjs/pool": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+      "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
+    },
+    "@protobufjs/utf8": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+      "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
+    },
+    "@types/long": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
+      "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
+    },
+    "@types/node": {
+      "version": "12.19.3",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.3.tgz",
+      "integrity": "sha512-8Jduo8wvvwDzEVJCOvS/G6sgilOLvvhn1eMmK3TW8/T217O7u1jdrK6ImKLv80tVryaPSVeKu6sjDEiFjd4/eg=="
+    },
+    "abort-controller": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+      "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+      "requires": {
+        "event-target-shim": "^5.0.0"
+      }
+    },
+    "agent-base": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+      "requires": {
+        "debug": "4"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+          "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        }
+      }
+    },
+    "ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "requires": {
+        "color-convert": "^2.0.1"
+      }
+    },
+    "arrify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+      "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="
+    },
+    "async": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
+    },
+    "base64-js": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
+      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
+    },
+    "bignumber.js": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz",
+      "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA=="
+    },
+    "buffer-equal-constant-time": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+      "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
+    },
+    "color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "requires": {
+        "color-name": "~1.1.4"
+      }
+    },
+    "color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+    },
+    "ecdsa-sig-formatter": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+      "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+    },
+    "event-target-shim": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+    },
+    "fast-text-encoding": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz",
+      "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig=="
+    },
+    "find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "requires": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      }
+    },
+    "gaxios": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.0.1.tgz",
+      "integrity": "sha512-jOin8xRZ/UytQeBpSXFqIzqU7Fi5TqgPNLlUsSB8kjJ76+FiGBfImF8KJu++c6J4jOldfJUtt0YmkRj2ZpSHTQ==",
+      "requires": {
+        "abort-controller": "^3.0.0",
+        "extend": "^3.0.2",
+        "https-proxy-agent": "^5.0.0",
+        "is-stream": "^2.0.0",
+        "node-fetch": "^2.3.0"
+      }
+    },
+    "gcp-metadata": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.2.1.tgz",
+      "integrity": "sha512-tSk+REe5iq/N+K+SK1XjZJUrFPuDqGZVzCy2vocIHIGmPlTGsa8owXMJwGkrXr73NO0AzhPW4MF2DEHz7P2AVw==",
+      "requires": {
+        "gaxios": "^4.0.0",
+        "json-bigint": "^1.0.0"
+      }
+    },
+    "get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+    },
+    "google-auth-library": {
+      "version": "6.1.3",
+      "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.3.tgz",
+      "integrity": "sha512-m9mwvY3GWbr7ZYEbl61isWmk+fvTmOt0YNUfPOUY2VH8K5pZlAIWJjxEi0PqR3OjMretyiQLI6GURMrPSwHQ2g==",
+      "requires": {
+        "arrify": "^2.0.0",
+        "base64-js": "^1.3.0",
+        "ecdsa-sig-formatter": "^1.0.11",
+        "fast-text-encoding": "^1.0.0",
+        "gaxios": "^4.0.0",
+        "gcp-metadata": "^4.2.0",
+        "gtoken": "^5.0.4",
+        "jws": "^4.0.0",
+        "lru-cache": "^6.0.0"
+      }
+    },
+    "google-p12-pem": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz",
+      "integrity": "sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA==",
+      "requires": {
+        "node-forge": "^0.10.0"
+      }
+    },
+    "google-protobuf": {
+      "version": "3.13.0",
+      "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.13.0.tgz",
+      "integrity": "sha512-ZIf3qfLFayVrPvAjeKKxO5FRF1/NwRxt6Dko+fWEMuHwHbZx8/fcaAao9b0wCM6kr8qeg2te8XTpyuvKuD9aKw=="
+    },
+    "gtoken": {
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.5.tgz",
+      "integrity": "sha512-wvjkecutFh8kVfbcdBdUWqDRrXb+WrgD79DBDEYf1Om8S1FluhylhtFjrL7Tx69vNhh259qA3Q1P4sPtb+kUYw==",
+      "requires": {
+        "gaxios": "^4.0.0",
+        "google-p12-pem": "^3.0.3",
+        "jws": "^4.0.0",
+        "mime": "^2.2.0"
+      }
+    },
+    "https-proxy-agent": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
+      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+      "requires": {
+        "agent-base": "6",
+        "debug": "4"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+          "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        }
+      }
+    },
+    "is-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
+    },
+    "json-bigint": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+      "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+      "requires": {
+        "bignumber.js": "^9.0.0"
+      }
+    },
+    "jwa": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
+      "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
+      "requires": {
+        "buffer-equal-constant-time": "1.0.1",
+        "ecdsa-sig-formatter": "1.0.11",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "jws": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
+      "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+      "requires": {
+        "jwa": "^2.0.0",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "requires": {
+        "p-locate": "^4.1.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.20",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+    },
+    "lodash.camelcase": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+      "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
+    },
+    "long": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+      "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+    },
+    "lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "requires": {
+        "yallist": "^4.0.0"
+      },
+      "dependencies": {
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        }
+      }
+    },
+    "mime": {
+      "version": "2.4.6",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+      "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA=="
+    },
+    "minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "node-fetch": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+      "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+    },
+    "node-forge": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
+      "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA=="
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "requires": {
+        "p-limit": "^2.2.0"
+      }
+    },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+    },
+    "path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+    },
+    "protobufjs": {
+      "version": "6.10.1",
+      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.1.tgz",
+      "integrity": "sha512-pb8kTchL+1Ceg4lFd5XUpK8PdWacbvV5SK2ULH2ebrYtl4GjJmS24m6CKME67jzV53tbJxHlnNOSqQHbTsR9JQ==",
+      "requires": {
+        "@protobufjs/aspromise": "^1.1.2",
+        "@protobufjs/base64": "^1.1.2",
+        "@protobufjs/codegen": "^2.0.4",
+        "@protobufjs/eventemitter": "^1.1.0",
+        "@protobufjs/fetch": "^1.1.0",
+        "@protobufjs/float": "^1.0.2",
+        "@protobufjs/inquire": "^1.1.0",
+        "@protobufjs/path": "^1.1.2",
+        "@protobufjs/pool": "^1.1.0",
+        "@protobufjs/utf8": "^1.1.0",
+        "@types/long": "^4.0.1",
+        "@types/node": "^13.7.0",
+        "long": "^4.0.0"
+      },
+      "dependencies": {
+        "@types/node": {
+          "version": "13.13.30",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.30.tgz",
+          "integrity": "sha512-HmqFpNzp3TSELxU/bUuRK+xzarVOAsR00hzcvM0TXrMlt/+wcSLa5q6YhTb6/cA6wqDCZLDcfd8fSL95x5h7AA=="
+        }
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+    },
+    "require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+    },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+    },
+    "yargs-parser": {
+      "version": "18.1.3",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+      "requires": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+        }
+      }
+    }
+  }
+}
index 3af6a11..73153de 100644 (file)
@@ -2,10 +2,10 @@
   "name": "grpc-examples",
   "version": "0.1.0",
   "dependencies": {
-    "@grpc/proto-loader": "^0.1.0",
+    "@grpc/proto-loader": "^0.5.0",
     "async": "^1.5.2",
     "google-protobuf": "^3.0.0",
-    "grpc": "^1.11.0",
+    "@grpc/grpc-js": "^1.1.0",
     "lodash": "^4.6.1",
     "minimist": "^1.2.0"
   }
index 0441b27..bc087ec 100644 (file)
@@ -3,6 +3,6 @@ This is the static code generation variant of the Node examples. Code in these e
 ```sh
 cd ../../protos
 npm install -g grpc-tools
-grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../node/static_codegen/ --grpc_out=../node/static_codegen --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` helloworld.proto
-grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../node/static_codegen/route_guide/ --grpc_out=../node/static_codegen/route_guide/ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` route_guide.proto
+grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../node/static_codegen/ --grpc_out=grpc_js:../node/static_codegen helloworld.proto
+grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../node/static_codegen/route_guide/ --grpc_out=grpc_js:../node/static_codegen/route_guide/ route_guide.proto
 ```
index 3f85f9b..a647140 100644 (file)
 var messages = require('./helloworld_pb');
 var services = require('./helloworld_grpc_pb');
 
-var grpc = require('grpc');
+var grpc = require('@grpc/grpc-js');
 
 function main() {
-  var client = new services.GreeterClient('localhost:50051',
+  var argv = parseArgs(process.argv.slice(2), {
+    string: 'target'
+  });
+  var target;
+  if (argv.target) {
+    target = argv.target;
+  } else {
+    target = 'localhost:50051';
+  }
+  var client = new services.GreeterClient(target,
                                           grpc.credentials.createInsecure());
   var request = new messages.HelloRequest();
   var user;
-  if (process.argv.length >= 3) {
-    user = process.argv[2];
+  if (argv._.length > 0) {
+    user = argv._[0]; 
   } else {
     user = 'world';
   }
index 930f506..7a3e87d 100644 (file)
@@ -19,7 +19,7 @@
 var messages = require('./helloworld_pb');
 var services = require('./helloworld_grpc_pb');
 
-var grpc = require('grpc');
+var grpc = require('@grpc/grpc-js');
 
 /**
  * Implements the SayHello RPC method.
@@ -37,8 +37,9 @@ function sayHello(call, callback) {
 function main() {
   var server = new grpc.Server();
   server.addService(services.GreeterService, {sayHello: sayHello});
-  server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
-  server.start();
+  server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
+    server.start();
+  });
 }
 
 main();
index 2605e2d..85dc0f0 100644 (file)
 // limitations under the License.
 //
 'use strict';
-var grpc = require('grpc');
+var grpc = require('@grpc/grpc-js');
 var helloworld_pb = require('./helloworld_pb.js');
 
-function serialize_HelloReply(arg) {
+function serialize_helloworld_HelloReply(arg) {
   if (!(arg instanceof helloworld_pb.HelloReply)) {
-    throw new Error('Expected argument of type HelloReply');
+    throw new Error('Expected argument of type helloworld.HelloReply');
   }
-  return new Buffer(arg.serializeBinary());
+  return Buffer.from(arg.serializeBinary());
 }
 
-function deserialize_HelloReply(buffer_arg) {
+function deserialize_helloworld_HelloReply(buffer_arg) {
   return helloworld_pb.HelloReply.deserializeBinary(new Uint8Array(buffer_arg));
 }
 
-function serialize_HelloRequest(arg) {
+function serialize_helloworld_HelloRequest(arg) {
   if (!(arg instanceof helloworld_pb.HelloRequest)) {
-    throw new Error('Expected argument of type HelloRequest');
+    throw new Error('Expected argument of type helloworld.HelloRequest');
   }
-  return new Buffer(arg.serializeBinary());
+  return Buffer.from(arg.serializeBinary());
 }
 
-function deserialize_HelloRequest(buffer_arg) {
+function deserialize_helloworld_HelloRequest(buffer_arg) {
   return helloworld_pb.HelloRequest.deserializeBinary(new Uint8Array(buffer_arg));
 }
 
@@ -45,16 +45,16 @@ function deserialize_HelloRequest(buffer_arg) {
 // The greeting service definition.
 var GreeterService = exports.GreeterService = {
   // Sends a greeting
-  sayHello: {
+sayHello: {
     path: '/helloworld.Greeter/SayHello',
     requestStream: false,
     responseStream: false,
     requestType: helloworld_pb.HelloRequest,
     responseType: helloworld_pb.HelloReply,
-    requestSerialize: serialize_HelloRequest,
-    requestDeserialize: deserialize_HelloRequest,
-    responseSerialize: serialize_HelloReply,
-    responseDeserialize: deserialize_HelloReply,
+    requestSerialize: serialize_helloworld_HelloRequest,
+    requestDeserialize: deserialize_helloworld_HelloRequest,
+    responseSerialize: serialize_helloworld_HelloReply,
+    responseDeserialize: deserialize_helloworld_HelloReply,
   },
 };
 
index d1e50c9..e676802 100644 (file)
@@ -1,6 +1,9 @@
+// source: helloworld.proto
 /**
  * @fileoverview
  * @enhanceable
+ * @suppress {messageConventions} JS Compiler reports an error if a variable or
+ *     field starts with 'MSG_' and isn't a translatable message.
  * @public
  */
 // GENERATED CODE -- DO NOT EDIT!
@@ -11,7 +14,6 @@ var global = Function('return this')();
 
 goog.exportSymbol('proto.helloworld.HelloReply', null, global);
 goog.exportSymbol('proto.helloworld.HelloRequest', null, global);
-
 /**
  * Generated by JsPbCodeGenerator.
  * @param {Array=} opt_data Optional initial data array, typically from a
@@ -27,19 +29,47 @@ proto.helloworld.HelloRequest = function(opt_data) {
 };
 goog.inherits(proto.helloworld.HelloRequest, jspb.Message);
 if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
   proto.helloworld.HelloRequest.displayName = 'proto.helloworld.HelloRequest';
 }
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.helloworld.HelloReply = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.helloworld.HelloReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.helloworld.HelloReply.displayName = 'proto.helloworld.HelloReply';
+}
+
 
 
 if (jspb.Message.GENERATE_TO_OBJECT) {
 /**
- * Creates an object representation of this proto suitable for use in Soy templates.
+ * Creates an object representation of this proto.
  * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
  * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
  * For the list of reserved names please see:
- *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
- * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
- *     for transitional soy proto support: http://goto/soy-param-migration
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
  * @return {!Object}
  */
 proto.helloworld.HelloRequest.prototype.toObject = function(opt_includeInstance) {
@@ -49,15 +79,16 @@ proto.helloworld.HelloRequest.prototype.toObject = function(opt_includeInstance)
 
 /**
  * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Whether to include the JSPB
- *     instance for transitional soy proto support:
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
  *     http://goto/soy-param-migration
  * @param {!proto.helloworld.HelloRequest} msg The msg instance to transform.
  * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
 proto.helloworld.HelloRequest.toObject = function(includeInstance, msg) {
   var f, obj = {
-    name: msg.getName()
+    name: jspb.Message.getFieldWithDefault(msg, 1, "")
   };
 
   if (includeInstance) {
@@ -108,35 +139,26 @@ proto.helloworld.HelloRequest.deserializeBinaryFromReader = function(msg, reader
 
 
 /**
- * Class method variant: serializes the given message to binary data
- * (in protobuf wire format), writing to the given BinaryWriter.
- * @param {!proto.helloworld.HelloRequest} message
- * @param {!jspb.BinaryWriter} writer
- */
-proto.helloworld.HelloRequest.serializeBinaryToWriter = function(message, writer) {
-  message.serializeBinaryToWriter(writer);
-};
-
-
-/**
  * Serializes the message to binary data (in protobuf wire format).
  * @return {!Uint8Array}
  */
 proto.helloworld.HelloRequest.prototype.serializeBinary = function() {
   var writer = new jspb.BinaryWriter();
-  this.serializeBinaryToWriter(writer);
+  proto.helloworld.HelloRequest.serializeBinaryToWriter(this, writer);
   return writer.getResultBuffer();
 };
 
 
 /**
- * Serializes the message to binary data (in protobuf wire format),
- * writing to the given BinaryWriter.
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.helloworld.HelloRequest} message
  * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
-proto.helloworld.HelloRequest.prototype.serializeBinaryToWriter = function (writer) {
+proto.helloworld.HelloRequest.serializeBinaryToWriter = function(message, writer) {
   var f = undefined;
-  f = this.getName();
+  f = message.getName();
   if (f.length > 0) {
     writer.writeString(
       1,
@@ -147,58 +169,37 @@ proto.helloworld.HelloRequest.prototype.serializeBinaryToWriter = function (writ
 
 
 /**
- * Creates a deep clone of this proto. No data is shared with the original.
- * @return {!proto.helloworld.HelloRequest} The clone.
- */
-proto.helloworld.HelloRequest.prototype.cloneMessage = function() {
-  return /** @type {!proto.helloworld.HelloRequest} */ (jspb.Message.cloneMessage(this));
-};
-
-
-/**
  * optional string name = 1;
  * @return {string}
  */
 proto.helloworld.HelloRequest.prototype.getName = function() {
-  return /** @type {string} */ (jspb.Message.getFieldProto3(this, 1, ""));
+  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
 };
 
 
-/** @param {string} value  */
+/**
+ * @param {string} value
+ * @return {!proto.helloworld.HelloRequest} returns this
+ */
 proto.helloworld.HelloRequest.prototype.setName = function(value) {
-  jspb.Message.setField(this, 1, value);
+  return jspb.Message.setProto3StringField(this, 1, value);
 };
 
 
 
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.helloworld.HelloReply = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.helloworld.HelloReply, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  proto.helloworld.HelloReply.displayName = 'proto.helloworld.HelloReply';
-}
 
 
 if (jspb.Message.GENERATE_TO_OBJECT) {
 /**
- * Creates an object representation of this proto suitable for use in Soy templates.
+ * Creates an object representation of this proto.
  * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
  * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
  * For the list of reserved names please see:
- *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
- * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
- *     for transitional soy proto support: http://goto/soy-param-migration
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
  * @return {!Object}
  */
 proto.helloworld.HelloReply.prototype.toObject = function(opt_includeInstance) {
@@ -208,15 +209,16 @@ proto.helloworld.HelloReply.prototype.toObject = function(opt_includeInstance) {
 
 /**
  * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Whether to include the JSPB
- *     instance for transitional soy proto support:
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
  *     http://goto/soy-param-migration
  * @param {!proto.helloworld.HelloReply} msg The msg instance to transform.
  * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
 proto.helloworld.HelloReply.toObject = function(includeInstance, msg) {
   var f, obj = {
-    message: msg.getMessage()
+    message: jspb.Message.getFieldWithDefault(msg, 1, "")
   };
 
   if (includeInstance) {
@@ -267,35 +269,26 @@ proto.helloworld.HelloReply.deserializeBinaryFromReader = function(msg, reader)
 
 
 /**
- * Class method variant: serializes the given message to binary data
- * (in protobuf wire format), writing to the given BinaryWriter.
- * @param {!proto.helloworld.HelloReply} message
- * @param {!jspb.BinaryWriter} writer
- */
-proto.helloworld.HelloReply.serializeBinaryToWriter = function(message, writer) {
-  message.serializeBinaryToWriter(writer);
-};
-
-
-/**
  * Serializes the message to binary data (in protobuf wire format).
  * @return {!Uint8Array}
  */
 proto.helloworld.HelloReply.prototype.serializeBinary = function() {
   var writer = new jspb.BinaryWriter();
-  this.serializeBinaryToWriter(writer);
+  proto.helloworld.HelloReply.serializeBinaryToWriter(this, writer);
   return writer.getResultBuffer();
 };
 
 
 /**
- * Serializes the message to binary data (in protobuf wire format),
- * writing to the given BinaryWriter.
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.helloworld.HelloReply} message
  * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
-proto.helloworld.HelloReply.prototype.serializeBinaryToWriter = function (writer) {
+proto.helloworld.HelloReply.serializeBinaryToWriter = function(message, writer) {
   var f = undefined;
-  f = this.getMessage();
+  f = message.getMessage();
   if (f.length > 0) {
     writer.writeString(
       1,
@@ -306,26 +299,20 @@ proto.helloworld.HelloReply.prototype.serializeBinaryToWriter = function (writer
 
 
 /**
- * Creates a deep clone of this proto. No data is shared with the original.
- * @return {!proto.helloworld.HelloReply} The clone.
- */
-proto.helloworld.HelloReply.prototype.cloneMessage = function() {
-  return /** @type {!proto.helloworld.HelloReply} */ (jspb.Message.cloneMessage(this));
-};
-
-
-/**
  * optional string message = 1;
  * @return {string}
  */
 proto.helloworld.HelloReply.prototype.getMessage = function() {
-  return /** @type {string} */ (jspb.Message.getFieldProto3(this, 1, ""));
+  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
 };
 
 
-/** @param {string} value  */
+/**
+ * @param {string} value
+ * @return {!proto.helloworld.HelloReply} returns this
+ */
 proto.helloworld.HelloReply.prototype.setMessage = function(value) {
-  jspb.Message.setField(this, 1, value);
+  return jspb.Message.setProto3StringField(this, 1, value);
 };
 
 
index b65e3f8..0ab40a8 100644 (file)
@@ -24,7 +24,7 @@ var fs = require('fs');
 var parseArgs = require('minimist');
 var path = require('path');
 var _ = require('lodash');
-var grpc = require('grpc');
+var grpc = require('@grpc/grpc-js');
 
 var client = new services.RouteGuideClient('localhost:50051',
                                            grpc.credentials.createInsecure());
index 7765bf9..83c839d 100644 (file)
 // limitations under the License.
 //
 'use strict';
-var grpc = require('grpc');
+var grpc = require('@grpc/grpc-js');
 var route_guide_pb = require('./route_guide_pb.js');
 
-function serialize_Feature(arg) {
+function serialize_routeguide_Feature(arg) {
   if (!(arg instanceof route_guide_pb.Feature)) {
-    throw new Error('Expected argument of type Feature');
+    throw new Error('Expected argument of type routeguide.Feature');
   }
-  return new Buffer(arg.serializeBinary());
+  return Buffer.from(arg.serializeBinary());
 }
 
-function deserialize_Feature(buffer_arg) {
+function deserialize_routeguide_Feature(buffer_arg) {
   return route_guide_pb.Feature.deserializeBinary(new Uint8Array(buffer_arg));
 }
 
-function serialize_Point(arg) {
+function serialize_routeguide_Point(arg) {
   if (!(arg instanceof route_guide_pb.Point)) {
-    throw new Error('Expected argument of type Point');
+    throw new Error('Expected argument of type routeguide.Point');
   }
-  return new Buffer(arg.serializeBinary());
+  return Buffer.from(arg.serializeBinary());
 }
 
-function deserialize_Point(buffer_arg) {
+function deserialize_routeguide_Point(buffer_arg) {
   return route_guide_pb.Point.deserializeBinary(new Uint8Array(buffer_arg));
 }
 
-function serialize_Rectangle(arg) {
+function serialize_routeguide_Rectangle(arg) {
   if (!(arg instanceof route_guide_pb.Rectangle)) {
-    throw new Error('Expected argument of type Rectangle');
+    throw new Error('Expected argument of type routeguide.Rectangle');
   }
-  return new Buffer(arg.serializeBinary());
+  return Buffer.from(arg.serializeBinary());
 }
 
-function deserialize_Rectangle(buffer_arg) {
+function deserialize_routeguide_Rectangle(buffer_arg) {
   return route_guide_pb.Rectangle.deserializeBinary(new Uint8Array(buffer_arg));
 }
 
-function serialize_RouteNote(arg) {
+function serialize_routeguide_RouteNote(arg) {
   if (!(arg instanceof route_guide_pb.RouteNote)) {
-    throw new Error('Expected argument of type RouteNote');
+    throw new Error('Expected argument of type routeguide.RouteNote');
   }
-  return new Buffer(arg.serializeBinary());
+  return Buffer.from(arg.serializeBinary());
 }
 
-function deserialize_RouteNote(buffer_arg) {
+function deserialize_routeguide_RouteNote(buffer_arg) {
   return route_guide_pb.RouteNote.deserializeBinary(new Uint8Array(buffer_arg));
 }
 
-function serialize_RouteSummary(arg) {
+function serialize_routeguide_RouteSummary(arg) {
   if (!(arg instanceof route_guide_pb.RouteSummary)) {
-    throw new Error('Expected argument of type RouteSummary');
+    throw new Error('Expected argument of type routeguide.RouteSummary');
   }
-  return new Buffer(arg.serializeBinary());
+  return Buffer.from(arg.serializeBinary());
 }
 
-function deserialize_RouteSummary(buffer_arg) {
+function deserialize_routeguide_RouteSummary(buffer_arg) {
   return route_guide_pb.RouteSummary.deserializeBinary(new Uint8Array(buffer_arg));
 }
 
@@ -78,68 +78,68 @@ function deserialize_RouteSummary(buffer_arg) {
 // Interface exported by the server.
 var RouteGuideService = exports.RouteGuideService = {
   // A simple RPC.
-  //
-  // Obtains the feature at a given position.
-  //
-  // A feature with an empty name is returned if there's no feature at the given
-  // position.
-  getFeature: {
+//
+// Obtains the feature at a given position.
+//
+// A feature with an empty name is returned if there's no feature at the given
+// position.
+getFeature: {
     path: '/routeguide.RouteGuide/GetFeature',
     requestStream: false,
     responseStream: false,
     requestType: route_guide_pb.Point,
     responseType: route_guide_pb.Feature,
-    requestSerialize: serialize_Point,
-    requestDeserialize: deserialize_Point,
-    responseSerialize: serialize_Feature,
-    responseDeserialize: deserialize_Feature,
+    requestSerialize: serialize_routeguide_Point,
+    requestDeserialize: deserialize_routeguide_Point,
+    responseSerialize: serialize_routeguide_Feature,
+    responseDeserialize: deserialize_routeguide_Feature,
   },
   // A server-to-client streaming RPC.
-  //
-  // Obtains the Features available within the given Rectangle.  Results are
-  // streamed rather than returned at once (e.g. in a response message with a
-  // repeated field), as the rectangle may cover a large area and contain a
-  // huge number of features.
-  listFeatures: {
+//
+// Obtains the Features available within the given Rectangle.  Results are
+// streamed rather than returned at once (e.g. in a response message with a
+// repeated field), as the rectangle may cover a large area and contain a
+// huge number of features.
+listFeatures: {
     path: '/routeguide.RouteGuide/ListFeatures',
     requestStream: false,
     responseStream: true,
     requestType: route_guide_pb.Rectangle,
     responseType: route_guide_pb.Feature,
-    requestSerialize: serialize_Rectangle,
-    requestDeserialize: deserialize_Rectangle,
-    responseSerialize: serialize_Feature,
-    responseDeserialize: deserialize_Feature,
+    requestSerialize: serialize_routeguide_Rectangle,
+    requestDeserialize: deserialize_routeguide_Rectangle,
+    responseSerialize: serialize_routeguide_Feature,
+    responseDeserialize: deserialize_routeguide_Feature,
   },
   // A client-to-server streaming RPC.
-  //
-  // Accepts a stream of Points on a route being traversed, returning a
-  // RouteSummary when traversal is completed.
-  recordRoute: {
+//
+// Accepts a stream of Points on a route being traversed, returning a
+// RouteSummary when traversal is completed.
+recordRoute: {
     path: '/routeguide.RouteGuide/RecordRoute',
     requestStream: true,
     responseStream: false,
     requestType: route_guide_pb.Point,
     responseType: route_guide_pb.RouteSummary,
-    requestSerialize: serialize_Point,
-    requestDeserialize: deserialize_Point,
-    responseSerialize: serialize_RouteSummary,
-    responseDeserialize: deserialize_RouteSummary,
+    requestSerialize: serialize_routeguide_Point,
+    requestDeserialize: deserialize_routeguide_Point,
+    responseSerialize: serialize_routeguide_RouteSummary,
+    responseDeserialize: deserialize_routeguide_RouteSummary,
   },
   // A Bidirectional streaming RPC.
-  //
-  // Accepts a stream of RouteNotes sent while a route is being traversed,
-  // while receiving other RouteNotes (e.g. from other users).
-  routeChat: {
+//
+// Accepts a stream of RouteNotes sent while a route is being traversed,
+// while receiving other RouteNotes (e.g. from other users).
+routeChat: {
     path: '/routeguide.RouteGuide/RouteChat',
     requestStream: true,
     responseStream: true,
     requestType: route_guide_pb.RouteNote,
     responseType: route_guide_pb.RouteNote,
-    requestSerialize: serialize_RouteNote,
-    requestDeserialize: deserialize_RouteNote,
-    responseSerialize: serialize_RouteNote,
-    responseDeserialize: deserialize_RouteNote,
+    requestSerialize: serialize_routeguide_RouteNote,
+    requestDeserialize: deserialize_routeguide_RouteNote,
+    responseSerialize: serialize_routeguide_RouteNote,
+    responseDeserialize: deserialize_routeguide_RouteNote,
   },
 };
 
index 2e2f9a1..a032bec 100644 (file)
@@ -1,6 +1,9 @@
+// source: route_guide.proto
 /**
  * @fileoverview
  * @enhanceable
+ * @suppress {messageConventions} JS Compiler reports an error if a variable or
+ *     field starts with 'MSG_' and isn't a translatable message.
  * @public
  */
 // GENERATED CODE -- DO NOT EDIT!
@@ -14,7 +17,6 @@ goog.exportSymbol('proto.routeguide.Point', null, global);
 goog.exportSymbol('proto.routeguide.Rectangle', null, global);
 goog.exportSymbol('proto.routeguide.RouteNote', null, global);
 goog.exportSymbol('proto.routeguide.RouteSummary', null, global);
-
 /**
  * Generated by JsPbCodeGenerator.
  * @param {Array=} opt_data Optional initial data array, typically from a
@@ -30,19 +32,110 @@ proto.routeguide.Point = function(opt_data) {
 };
 goog.inherits(proto.routeguide.Point, jspb.Message);
 if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
   proto.routeguide.Point.displayName = 'proto.routeguide.Point';
 }
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.routeguide.Rectangle = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.routeguide.Rectangle, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.routeguide.Rectangle.displayName = 'proto.routeguide.Rectangle';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.routeguide.Feature = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.routeguide.Feature, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.routeguide.Feature.displayName = 'proto.routeguide.Feature';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.routeguide.RouteNote = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.routeguide.RouteNote, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.routeguide.RouteNote.displayName = 'proto.routeguide.RouteNote';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.routeguide.RouteSummary = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.routeguide.RouteSummary, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.routeguide.RouteSummary.displayName = 'proto.routeguide.RouteSummary';
+}
+
 
 
 if (jspb.Message.GENERATE_TO_OBJECT) {
 /**
- * Creates an object representation of this proto suitable for use in Soy templates.
+ * Creates an object representation of this proto.
  * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
  * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
  * For the list of reserved names please see:
- *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
- * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
- *     for transitional soy proto support: http://goto/soy-param-migration
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
  * @return {!Object}
  */
 proto.routeguide.Point.prototype.toObject = function(opt_includeInstance) {
@@ -52,16 +145,17 @@ proto.routeguide.Point.prototype.toObject = function(opt_includeInstance) {
 
 /**
  * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Whether to include the JSPB
- *     instance for transitional soy proto support:
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
  *     http://goto/soy-param-migration
  * @param {!proto.routeguide.Point} msg The msg instance to transform.
  * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
 proto.routeguide.Point.toObject = function(includeInstance, msg) {
   var f, obj = {
-    latitude: msg.getLatitude(),
-    longitude: msg.getLongitude()
+    latitude: jspb.Message.getFieldWithDefault(msg, 1, 0),
+    longitude: jspb.Message.getFieldWithDefault(msg, 2, 0)
   };
 
   if (includeInstance) {
@@ -116,42 +210,33 @@ proto.routeguide.Point.deserializeBinaryFromReader = function(msg, reader) {
 
 
 /**
- * Class method variant: serializes the given message to binary data
- * (in protobuf wire format), writing to the given BinaryWriter.
- * @param {!proto.routeguide.Point} message
- * @param {!jspb.BinaryWriter} writer
- */
-proto.routeguide.Point.serializeBinaryToWriter = function(message, writer) {
-  message.serializeBinaryToWriter(writer);
-};
-
-
-/**
  * Serializes the message to binary data (in protobuf wire format).
  * @return {!Uint8Array}
  */
 proto.routeguide.Point.prototype.serializeBinary = function() {
   var writer = new jspb.BinaryWriter();
-  this.serializeBinaryToWriter(writer);
+  proto.routeguide.Point.serializeBinaryToWriter(this, writer);
   return writer.getResultBuffer();
 };
 
 
 /**
- * Serializes the message to binary data (in protobuf wire format),
- * writing to the given BinaryWriter.
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.routeguide.Point} message
  * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
-proto.routeguide.Point.prototype.serializeBinaryToWriter = function (writer) {
+proto.routeguide.Point.serializeBinaryToWriter = function(message, writer) {
   var f = undefined;
-  f = this.getLatitude();
+  f = message.getLatitude();
   if (f !== 0) {
     writer.writeInt32(
       1,
       f
     );
   }
-  f = this.getLongitude();
+  f = message.getLongitude();
   if (f !== 0) {
     writer.writeInt32(
       2,
@@ -162,26 +247,20 @@ proto.routeguide.Point.prototype.serializeBinaryToWriter = function (writer) {
 
 
 /**
- * Creates a deep clone of this proto. No data is shared with the original.
- * @return {!proto.routeguide.Point} The clone.
- */
-proto.routeguide.Point.prototype.cloneMessage = function() {
-  return /** @type {!proto.routeguide.Point} */ (jspb.Message.cloneMessage(this));
-};
-
-
-/**
  * optional int32 latitude = 1;
  * @return {number}
  */
 proto.routeguide.Point.prototype.getLatitude = function() {
-  return /** @type {number} */ (jspb.Message.getFieldProto3(this, 1, 0));
+  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
 };
 
 
-/** @param {number} value  */
+/**
+ * @param {number} value
+ * @return {!proto.routeguide.Point} returns this
+ */
 proto.routeguide.Point.prototype.setLatitude = function(value) {
-  jspb.Message.setField(this, 1, value);
+  return jspb.Message.setProto3IntField(this, 1, value);
 };
 
 
@@ -190,45 +269,33 @@ proto.routeguide.Point.prototype.setLatitude = function(value) {
  * @return {number}
  */
 proto.routeguide.Point.prototype.getLongitude = function() {
-  return /** @type {number} */ (jspb.Message.getFieldProto3(this, 2, 0));
+  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
 };
 
 
-/** @param {number} value  */
+/**
+ * @param {number} value
+ * @return {!proto.routeguide.Point} returns this
+ */
 proto.routeguide.Point.prototype.setLongitude = function(value) {
-  jspb.Message.setField(this, 2, value);
+  return jspb.Message.setProto3IntField(this, 2, value);
 };
 
 
 
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.routeguide.Rectangle = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.routeguide.Rectangle, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  proto.routeguide.Rectangle.displayName = 'proto.routeguide.Rectangle';
-}
 
 
 if (jspb.Message.GENERATE_TO_OBJECT) {
 /**
- * Creates an object representation of this proto suitable for use in Soy templates.
+ * Creates an object representation of this proto.
  * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
  * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
  * For the list of reserved names please see:
- *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
- * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
- *     for transitional soy proto support: http://goto/soy-param-migration
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
  * @return {!Object}
  */
 proto.routeguide.Rectangle.prototype.toObject = function(opt_includeInstance) {
@@ -238,11 +305,12 @@ proto.routeguide.Rectangle.prototype.toObject = function(opt_includeInstance) {
 
 /**
  * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Whether to include the JSPB
- *     instance for transitional soy proto support:
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
  *     http://goto/soy-param-migration
  * @param {!proto.routeguide.Rectangle} msg The msg instance to transform.
  * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
 proto.routeguide.Rectangle.toObject = function(includeInstance, msg) {
   var f, obj = {
@@ -304,35 +372,26 @@ proto.routeguide.Rectangle.deserializeBinaryFromReader = function(msg, reader) {
 
 
 /**
- * Class method variant: serializes the given message to binary data
- * (in protobuf wire format), writing to the given BinaryWriter.
- * @param {!proto.routeguide.Rectangle} message
- * @param {!jspb.BinaryWriter} writer
- */
-proto.routeguide.Rectangle.serializeBinaryToWriter = function(message, writer) {
-  message.serializeBinaryToWriter(writer);
-};
-
-
-/**
  * Serializes the message to binary data (in protobuf wire format).
  * @return {!Uint8Array}
  */
 proto.routeguide.Rectangle.prototype.serializeBinary = function() {
   var writer = new jspb.BinaryWriter();
-  this.serializeBinaryToWriter(writer);
+  proto.routeguide.Rectangle.serializeBinaryToWriter(this, writer);
   return writer.getResultBuffer();
 };
 
 
 /**
- * Serializes the message to binary data (in protobuf wire format),
- * writing to the given BinaryWriter.
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.routeguide.Rectangle} message
  * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
-proto.routeguide.Rectangle.prototype.serializeBinaryToWriter = function (writer) {
+proto.routeguide.Rectangle.serializeBinaryToWriter = function(message, writer) {
   var f = undefined;
-  f = this.getLo();
+  f = message.getLo();
   if (f != null) {
     writer.writeMessage(
       1,
@@ -340,7 +399,7 @@ proto.routeguide.Rectangle.prototype.serializeBinaryToWriter = function (writer)
       proto.routeguide.Point.serializeBinaryToWriter
     );
   }
-  f = this.getHi();
+  f = message.getHi();
   if (f != null) {
     writer.writeMessage(
       2,
@@ -352,85 +411,93 @@ proto.routeguide.Rectangle.prototype.serializeBinaryToWriter = function (writer)
 
 
 /**
- * Creates a deep clone of this proto. No data is shared with the original.
- * @return {!proto.routeguide.Rectangle} The clone.
- */
-proto.routeguide.Rectangle.prototype.cloneMessage = function() {
-  return /** @type {!proto.routeguide.Rectangle} */ (jspb.Message.cloneMessage(this));
-};
-
-
-/**
  * optional Point lo = 1;
- * @return {proto.routeguide.Point}
+ * @return {?proto.routeguide.Point}
  */
 proto.routeguide.Rectangle.prototype.getLo = function() {
-  return /** @type{proto.routeguide.Point} */ (
+  return /** @type{?proto.routeguide.Point} */ (
     jspb.Message.getWrapperField(this, proto.routeguide.Point, 1));
 };
 
 
-/** @param {proto.routeguide.Point|undefined} value  */
+/**
+ * @param {?proto.routeguide.Point|undefined} value
+ * @return {!proto.routeguide.Rectangle} returns this
+*/
 proto.routeguide.Rectangle.prototype.setLo = function(value) {
-  jspb.Message.setWrapperField(this, 1, value);
+  return jspb.Message.setWrapperField(this, 1, value);
 };
 
 
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.routeguide.Rectangle} returns this
+ */
 proto.routeguide.Rectangle.prototype.clearLo = function() {
-  this.setLo(undefined);
+  return this.setLo(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.routeguide.Rectangle.prototype.hasLo = function() {
+  return jspb.Message.getField(this, 1) != null;
 };
 
 
 /**
  * optional Point hi = 2;
- * @return {proto.routeguide.Point}
+ * @return {?proto.routeguide.Point}
  */
 proto.routeguide.Rectangle.prototype.getHi = function() {
-  return /** @type{proto.routeguide.Point} */ (
+  return /** @type{?proto.routeguide.Point} */ (
     jspb.Message.getWrapperField(this, proto.routeguide.Point, 2));
 };
 
 
-/** @param {proto.routeguide.Point|undefined} value  */
+/**
+ * @param {?proto.routeguide.Point|undefined} value
+ * @return {!proto.routeguide.Rectangle} returns this
+*/
 proto.routeguide.Rectangle.prototype.setHi = function(value) {
-  jspb.Message.setWrapperField(this, 2, value);
+  return jspb.Message.setWrapperField(this, 2, value);
 };
 
 
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.routeguide.Rectangle} returns this
+ */
 proto.routeguide.Rectangle.prototype.clearHi = function() {
-  this.setHi(undefined);
+  return this.setHi(undefined);
 };
 
 
-
 /**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
+ * Returns whether this field is set.
+ * @return {boolean}
  */
-proto.routeguide.Feature = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+proto.routeguide.Rectangle.prototype.hasHi = function() {
+  return jspb.Message.getField(this, 2) != null;
 };
-goog.inherits(proto.routeguide.Feature, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  proto.routeguide.Feature.displayName = 'proto.routeguide.Feature';
-}
+
+
+
 
 
 if (jspb.Message.GENERATE_TO_OBJECT) {
 /**
- * Creates an object representation of this proto suitable for use in Soy templates.
+ * Creates an object representation of this proto.
  * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
  * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
  * For the list of reserved names please see:
- *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
- * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
- *     for transitional soy proto support: http://goto/soy-param-migration
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
  * @return {!Object}
  */
 proto.routeguide.Feature.prototype.toObject = function(opt_includeInstance) {
@@ -440,15 +507,16 @@ proto.routeguide.Feature.prototype.toObject = function(opt_includeInstance) {
 
 /**
  * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Whether to include the JSPB
- *     instance for transitional soy proto support:
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
  *     http://goto/soy-param-migration
  * @param {!proto.routeguide.Feature} msg The msg instance to transform.
  * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
 proto.routeguide.Feature.toObject = function(includeInstance, msg) {
   var f, obj = {
-    name: msg.getName(),
+    name: jspb.Message.getFieldWithDefault(msg, 1, ""),
     location: (f = msg.getLocation()) && proto.routeguide.Point.toObject(includeInstance, f)
   };
 
@@ -505,42 +573,33 @@ proto.routeguide.Feature.deserializeBinaryFromReader = function(msg, reader) {
 
 
 /**
- * Class method variant: serializes the given message to binary data
- * (in protobuf wire format), writing to the given BinaryWriter.
- * @param {!proto.routeguide.Feature} message
- * @param {!jspb.BinaryWriter} writer
- */
-proto.routeguide.Feature.serializeBinaryToWriter = function(message, writer) {
-  message.serializeBinaryToWriter(writer);
-};
-
-
-/**
  * Serializes the message to binary data (in protobuf wire format).
  * @return {!Uint8Array}
  */
 proto.routeguide.Feature.prototype.serializeBinary = function() {
   var writer = new jspb.BinaryWriter();
-  this.serializeBinaryToWriter(writer);
+  proto.routeguide.Feature.serializeBinaryToWriter(this, writer);
   return writer.getResultBuffer();
 };
 
 
 /**
- * Serializes the message to binary data (in protobuf wire format),
- * writing to the given BinaryWriter.
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.routeguide.Feature} message
  * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
-proto.routeguide.Feature.prototype.serializeBinaryToWriter = function (writer) {
+proto.routeguide.Feature.serializeBinaryToWriter = function(message, writer) {
   var f = undefined;
-  f = this.getName();
+  f = message.getName();
   if (f.length > 0) {
     writer.writeString(
       1,
       f
     );
   }
-  f = this.getLocation();
+  f = message.getLocation();
   if (f != null) {
     writer.writeMessage(
       2,
@@ -552,79 +611,74 @@ proto.routeguide.Feature.prototype.serializeBinaryToWriter = function (writer) {
 
 
 /**
- * Creates a deep clone of this proto. No data is shared with the original.
- * @return {!proto.routeguide.Feature} The clone.
- */
-proto.routeguide.Feature.prototype.cloneMessage = function() {
-  return /** @type {!proto.routeguide.Feature} */ (jspb.Message.cloneMessage(this));
-};
-
-
-/**
  * optional string name = 1;
  * @return {string}
  */
 proto.routeguide.Feature.prototype.getName = function() {
-  return /** @type {string} */ (jspb.Message.getFieldProto3(this, 1, ""));
+  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
 };
 
 
-/** @param {string} value  */
+/**
+ * @param {string} value
+ * @return {!proto.routeguide.Feature} returns this
+ */
 proto.routeguide.Feature.prototype.setName = function(value) {
-  jspb.Message.setField(this, 1, value);
+  return jspb.Message.setProto3StringField(this, 1, value);
 };
 
 
 /**
  * optional Point location = 2;
- * @return {proto.routeguide.Point}
+ * @return {?proto.routeguide.Point}
  */
 proto.routeguide.Feature.prototype.getLocation = function() {
-  return /** @type{proto.routeguide.Point} */ (
+  return /** @type{?proto.routeguide.Point} */ (
     jspb.Message.getWrapperField(this, proto.routeguide.Point, 2));
 };
 
 
-/** @param {proto.routeguide.Point|undefined} value  */
+/**
+ * @param {?proto.routeguide.Point|undefined} value
+ * @return {!proto.routeguide.Feature} returns this
+*/
 proto.routeguide.Feature.prototype.setLocation = function(value) {
-  jspb.Message.setWrapperField(this, 2, value);
+  return jspb.Message.setWrapperField(this, 2, value);
 };
 
 
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.routeguide.Feature} returns this
+ */
 proto.routeguide.Feature.prototype.clearLocation = function() {
-  this.setLocation(undefined);
+  return this.setLocation(undefined);
 };
 
 
-
 /**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
+ * Returns whether this field is set.
+ * @return {boolean}
  */
-proto.routeguide.RouteNote = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+proto.routeguide.Feature.prototype.hasLocation = function() {
+  return jspb.Message.getField(this, 2) != null;
 };
-goog.inherits(proto.routeguide.RouteNote, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  proto.routeguide.RouteNote.displayName = 'proto.routeguide.RouteNote';
-}
+
+
+
 
 
 if (jspb.Message.GENERATE_TO_OBJECT) {
 /**
- * Creates an object representation of this proto suitable for use in Soy templates.
+ * Creates an object representation of this proto.
  * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
  * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
  * For the list of reserved names please see:
- *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
- * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
- *     for transitional soy proto support: http://goto/soy-param-migration
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
  * @return {!Object}
  */
 proto.routeguide.RouteNote.prototype.toObject = function(opt_includeInstance) {
@@ -634,16 +688,17 @@ proto.routeguide.RouteNote.prototype.toObject = function(opt_includeInstance) {
 
 /**
  * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Whether to include the JSPB
- *     instance for transitional soy proto support:
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
  *     http://goto/soy-param-migration
  * @param {!proto.routeguide.RouteNote} msg The msg instance to transform.
  * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
 proto.routeguide.RouteNote.toObject = function(includeInstance, msg) {
   var f, obj = {
     location: (f = msg.getLocation()) && proto.routeguide.Point.toObject(includeInstance, f),
-    message: msg.getMessage()
+    message: jspb.Message.getFieldWithDefault(msg, 2, "")
   };
 
   if (includeInstance) {
@@ -699,35 +754,26 @@ proto.routeguide.RouteNote.deserializeBinaryFromReader = function(msg, reader) {
 
 
 /**
- * Class method variant: serializes the given message to binary data
- * (in protobuf wire format), writing to the given BinaryWriter.
- * @param {!proto.routeguide.RouteNote} message
- * @param {!jspb.BinaryWriter} writer
- */
-proto.routeguide.RouteNote.serializeBinaryToWriter = function(message, writer) {
-  message.serializeBinaryToWriter(writer);
-};
-
-
-/**
  * Serializes the message to binary data (in protobuf wire format).
  * @return {!Uint8Array}
  */
 proto.routeguide.RouteNote.prototype.serializeBinary = function() {
   var writer = new jspb.BinaryWriter();
-  this.serializeBinaryToWriter(writer);
+  proto.routeguide.RouteNote.serializeBinaryToWriter(this, writer);
   return writer.getResultBuffer();
 };
 
 
 /**
- * Serializes the message to binary data (in protobuf wire format),
- * writing to the given BinaryWriter.
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.routeguide.RouteNote} message
  * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
-proto.routeguide.RouteNote.prototype.serializeBinaryToWriter = function (writer) {
+proto.routeguide.RouteNote.serializeBinaryToWriter = function(message, writer) {
   var f = undefined;
-  f = this.getLocation();
+  f = message.getLocation();
   if (f != null) {
     writer.writeMessage(
       1,
@@ -735,7 +781,7 @@ proto.routeguide.RouteNote.prototype.serializeBinaryToWriter = function (writer)
       proto.routeguide.Point.serializeBinaryToWriter
     );
   }
-  f = this.getMessage();
+  f = message.getMessage();
   if (f.length > 0) {
     writer.writeString(
       2,
@@ -746,32 +792,39 @@ proto.routeguide.RouteNote.prototype.serializeBinaryToWriter = function (writer)
 
 
 /**
- * Creates a deep clone of this proto. No data is shared with the original.
- * @return {!proto.routeguide.RouteNote} The clone.
- */
-proto.routeguide.RouteNote.prototype.cloneMessage = function() {
-  return /** @type {!proto.routeguide.RouteNote} */ (jspb.Message.cloneMessage(this));
-};
-
-
-/**
  * optional Point location = 1;
- * @return {proto.routeguide.Point}
+ * @return {?proto.routeguide.Point}
  */
 proto.routeguide.RouteNote.prototype.getLocation = function() {
-  return /** @type{proto.routeguide.Point} */ (
+  return /** @type{?proto.routeguide.Point} */ (
     jspb.Message.getWrapperField(this, proto.routeguide.Point, 1));
 };
 
 
-/** @param {proto.routeguide.Point|undefined} value  */
+/**
+ * @param {?proto.routeguide.Point|undefined} value
+ * @return {!proto.routeguide.RouteNote} returns this
+*/
 proto.routeguide.RouteNote.prototype.setLocation = function(value) {
-  jspb.Message.setWrapperField(this, 1, value);
+  return jspb.Message.setWrapperField(this, 1, value);
 };
 
 
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.routeguide.RouteNote} returns this
+ */
 proto.routeguide.RouteNote.prototype.clearLocation = function() {
-  this.setLocation(undefined);
+  return this.setLocation(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.routeguide.RouteNote.prototype.hasLocation = function() {
+  return jspb.Message.getField(this, 1) != null;
 };
 
 
@@ -780,45 +833,33 @@ proto.routeguide.RouteNote.prototype.clearLocation = function() {
  * @return {string}
  */
 proto.routeguide.RouteNote.prototype.getMessage = function() {
-  return /** @type {string} */ (jspb.Message.getFieldProto3(this, 2, ""));
+  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
 };
 
 
-/** @param {string} value  */
+/**
+ * @param {string} value
+ * @return {!proto.routeguide.RouteNote} returns this
+ */
 proto.routeguide.RouteNote.prototype.setMessage = function(value) {
-  jspb.Message.setField(this, 2, value);
+  return jspb.Message.setProto3StringField(this, 2, value);
 };
 
 
 
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.routeguide.RouteSummary = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.routeguide.RouteSummary, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  proto.routeguide.RouteSummary.displayName = 'proto.routeguide.RouteSummary';
-}
 
 
 if (jspb.Message.GENERATE_TO_OBJECT) {
 /**
- * Creates an object representation of this proto suitable for use in Soy templates.
+ * Creates an object representation of this proto.
  * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
  * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
  * For the list of reserved names please see:
- *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
- * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
- *     for transitional soy proto support: http://goto/soy-param-migration
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
  * @return {!Object}
  */
 proto.routeguide.RouteSummary.prototype.toObject = function(opt_includeInstance) {
@@ -828,18 +869,19 @@ proto.routeguide.RouteSummary.prototype.toObject = function(opt_includeInstance)
 
 /**
  * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Whether to include the JSPB
- *     instance for transitional soy proto support:
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
  *     http://goto/soy-param-migration
  * @param {!proto.routeguide.RouteSummary} msg The msg instance to transform.
  * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
 proto.routeguide.RouteSummary.toObject = function(includeInstance, msg) {
   var f, obj = {
-    pointCount: msg.getPointCount(),
-    featureCount: msg.getFeatureCount(),
-    distance: msg.getDistance(),
-    elapsedTime: msg.getElapsedTime()
+    pointCount: jspb.Message.getFieldWithDefault(msg, 1, 0),
+    featureCount: jspb.Message.getFieldWithDefault(msg, 2, 0),
+    distance: jspb.Message.getFieldWithDefault(msg, 3, 0),
+    elapsedTime: jspb.Message.getFieldWithDefault(msg, 4, 0)
   };
 
   if (includeInstance) {
@@ -902,56 +944,47 @@ proto.routeguide.RouteSummary.deserializeBinaryFromReader = function(msg, reader
 
 
 /**
- * Class method variant: serializes the given message to binary data
- * (in protobuf wire format), writing to the given BinaryWriter.
- * @param {!proto.routeguide.RouteSummary} message
- * @param {!jspb.BinaryWriter} writer
- */
-proto.routeguide.RouteSummary.serializeBinaryToWriter = function(message, writer) {
-  message.serializeBinaryToWriter(writer);
-};
-
-
-/**
  * Serializes the message to binary data (in protobuf wire format).
  * @return {!Uint8Array}
  */
 proto.routeguide.RouteSummary.prototype.serializeBinary = function() {
   var writer = new jspb.BinaryWriter();
-  this.serializeBinaryToWriter(writer);
+  proto.routeguide.RouteSummary.serializeBinaryToWriter(this, writer);
   return writer.getResultBuffer();
 };
 
 
 /**
- * Serializes the message to binary data (in protobuf wire format),
- * writing to the given BinaryWriter.
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.routeguide.RouteSummary} message
  * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
  */
-proto.routeguide.RouteSummary.prototype.serializeBinaryToWriter = function (writer) {
+proto.routeguide.RouteSummary.serializeBinaryToWriter = function(message, writer) {
   var f = undefined;
-  f = this.getPointCount();
+  f = message.getPointCount();
   if (f !== 0) {
     writer.writeInt32(
       1,
       f
     );
   }
-  f = this.getFeatureCount();
+  f = message.getFeatureCount();
   if (f !== 0) {
     writer.writeInt32(
       2,
       f
     );
   }
-  f = this.getDistance();
+  f = message.getDistance();
   if (f !== 0) {
     writer.writeInt32(
       3,
       f
     );
   }
-  f = this.getElapsedTime();
+  f = message.getElapsedTime();
   if (f !== 0) {
     writer.writeInt32(
       4,
@@ -962,26 +995,20 @@ proto.routeguide.RouteSummary.prototype.serializeBinaryToWriter = function (writ
 
 
 /**
- * Creates a deep clone of this proto. No data is shared with the original.
- * @return {!proto.routeguide.RouteSummary} The clone.
- */
-proto.routeguide.RouteSummary.prototype.cloneMessage = function() {
-  return /** @type {!proto.routeguide.RouteSummary} */ (jspb.Message.cloneMessage(this));
-};
-
-
-/**
  * optional int32 point_count = 1;
  * @return {number}
  */
 proto.routeguide.RouteSummary.prototype.getPointCount = function() {
-  return /** @type {number} */ (jspb.Message.getFieldProto3(this, 1, 0));
+  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
 };
 
 
-/** @param {number} value  */
+/**
+ * @param {number} value
+ * @return {!proto.routeguide.RouteSummary} returns this
+ */
 proto.routeguide.RouteSummary.prototype.setPointCount = function(value) {
-  jspb.Message.setField(this, 1, value);
+  return jspb.Message.setProto3IntField(this, 1, value);
 };
 
 
@@ -990,13 +1017,16 @@ proto.routeguide.RouteSummary.prototype.setPointCount = function(value) {
  * @return {number}
  */
 proto.routeguide.RouteSummary.prototype.getFeatureCount = function() {
-  return /** @type {number} */ (jspb.Message.getFieldProto3(this, 2, 0));
+  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
 };
 
 
-/** @param {number} value  */
+/**
+ * @param {number} value
+ * @return {!proto.routeguide.RouteSummary} returns this
+ */
 proto.routeguide.RouteSummary.prototype.setFeatureCount = function(value) {
-  jspb.Message.setField(this, 2, value);
+  return jspb.Message.setProto3IntField(this, 2, value);
 };
 
 
@@ -1005,13 +1035,16 @@ proto.routeguide.RouteSummary.prototype.setFeatureCount = function(value) {
  * @return {number}
  */
 proto.routeguide.RouteSummary.prototype.getDistance = function() {
-  return /** @type {number} */ (jspb.Message.getFieldProto3(this, 3, 0));
+  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
 };
 
 
-/** @param {number} value  */
+/**
+ * @param {number} value
+ * @return {!proto.routeguide.RouteSummary} returns this
+ */
 proto.routeguide.RouteSummary.prototype.setDistance = function(value) {
-  jspb.Message.setField(this, 3, value);
+  return jspb.Message.setProto3IntField(this, 3, value);
 };
 
 
@@ -1020,13 +1053,16 @@ proto.routeguide.RouteSummary.prototype.setDistance = function(value) {
  * @return {number}
  */
 proto.routeguide.RouteSummary.prototype.getElapsedTime = function() {
-  return /** @type {number} */ (jspb.Message.getFieldProto3(this, 4, 0));
+  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
 };
 
 
-/** @param {number} value  */
+/**
+ * @param {number} value
+ * @return {!proto.routeguide.RouteSummary} returns this
+ */
 proto.routeguide.RouteSummary.prototype.setElapsedTime = function(value) {
-  jspb.Message.setField(this, 4, value);
+  return jspb.Message.setProto3IntField(this, 4, value);
 };
 
 
index eecac62..eb1fd28 100644 (file)
@@ -23,7 +23,7 @@ var fs = require('fs');
 var parseArgs = require('minimist');
 var path = require('path');
 var _ = require('lodash');
-var grpc = require('grpc');
+var grpc = require('@grpc/grpc-js');
 
 var COORD_FACTOR = 1e7;
 
@@ -220,23 +220,24 @@ function getServer() {
 if (require.main === module) {
   // If this is run as a script, start a server on an unused port
   var routeServer = getServer();
-  routeServer.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
-  var argv = parseArgs(process.argv, {
-    string: 'db_path'
-  });
-  fs.readFile(path.resolve(argv.db_path), function(err, data) {
-    if (err) throw err;
-    // Transform the loaded features to Feature objects
-    feature_list = _.map(JSON.parse(data), function(value) {
-      var feature = new messages.Feature();
-      feature.setName(value.name);
-      var location = new messages.Point();
-      location.setLatitude(value.location.latitude);
-      location.setLongitude(value.location.longitude);
-      feature.setLocation(location);
-      return feature;
+  routeServer.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
+    var argv = parseArgs(process.argv, {
+      string: 'db_path'
+    });
+    fs.readFile(path.resolve(argv.db_path), function(err, data) {
+      if (err) throw err;
+      // Transform the loaded features to Feature objects
+      feature_list = _.map(JSON.parse(data), function(value) {
+        var feature = new messages.Feature();
+        feature.setName(value.name);
+        var location = new messages.Point();
+        location.setLatitude(value.location.latitude);
+        location.setLongitude(value.location.longitude);
+        feature.setLocation(location);
+        return feature;
+      });
+      routeServer.start();
     });
-    routeServer.start();
   });
 }
 
diff --git a/examples/node/xds/greeter_client.js b/examples/node/xds/greeter_client.js
new file mode 100644 (file)
index 0000000..986a38f
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ *
+ * Copyright 2015 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+var PROTO_PATH = __dirname + '/../../protos/helloworld.proto';
+
+var parseArgs = require('minimist');
+var grpc = require('@grpc/grpc-js');
+var grpc_xds = require('@grpc/grpc-js-xds');
+grpc_xds.register();
+
+var protoLoader = require('@grpc/proto-loader');
+var packageDefinition = protoLoader.loadSync(
+    PROTO_PATH,
+    {keepCase: true,
+     longs: String,
+     enums: String,
+     defaults: true,
+     oneofs: true
+    });
+var hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld;
+
+function main() {
+  var argv = parseArgs(process.argv.slice(2), {
+    string: 'target'
+  });
+  var target;
+  if (argv.target) {
+    target = argv.target;
+  } else {
+    target = 'localhost:50051';
+  }
+  var client = new hello_proto.Greeter(target,
+                                       grpc.credentials.createInsecure());
+  var user;
+  if (argv._.length > 0) {
+    user = argv._[0]; 
+  } else {
+    user = 'world';
+  }
+  client.sayHello({name: user}, function(err, response) {
+    if (err) throw err;
+    console.log('Greeting:', response.message);
+    client.close();
+  });
+}
+
+main();
diff --git a/examples/node/xds/package.json b/examples/node/xds/package.json
new file mode 100644 (file)
index 0000000..bbedf6b
--- /dev/null
@@ -0,0 +1,10 @@
+{
+  "name": "grpc-examples-xds",
+  "version": "0.1.0",
+  "dependencies": {
+    "@grpc/proto-loader": "^0.5.0",
+    "@grpc/grpc-js": "^1.2.0",
+    "@grpc/grpc-js-xds": "^1.2.0",
+    "minimist": "^1.2.0"
+  }
+}
index 6f23310..988a317 100644 (file)
@@ -56,7 +56,7 @@ ios_application(
         "ipad",
     ],
     infoplists = ["helloworld/HelloWorld/Info.plist"],
-    minimum_os_version = "8.0",
+    minimum_os_version = "9.0",
     tags = ["manual"],
     deps = [":HelloWorld-lib"],
 )
@@ -113,7 +113,7 @@ ios_application(
         "ipad",
     ],
     infoplists = ["route_guide/Misc/Info.plist"],
-    minimum_os_version = "8.0",
+    minimum_os_version = "9.0",
     tags = ["manual"],
     deps = [":RouteGuideClient-lib"],
 )
index ab7419c..7a82f67 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.3;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.3;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = iphoneos;
                                TARGETED_DEVICE_FAMILY = "1,2";
index d603c2e..4fa7641 100644 (file)
@@ -7,8 +7,8 @@ Pod::Spec.new do |s|
   s.summary = "AuthTestService example"
   s.source = { :git => 'https://github.com/grpc/grpc.git' }
 
-  s.ios.deployment_target = "7.1"
-  s.osx.deployment_target = "10.9"
+  s.ios.deployment_target = "9.0"
+  s.osx.deployment_target = "10.10"
 
   # Base directory where the .proto files are.
   src = "../../protos"
index fc671ef..523cca8 100644 (file)
@@ -7,8 +7,8 @@ Pod::Spec.new do |s|
   s.summary = "HelloWorld example"
   s.source = { :git => 'https://github.com/grpc/grpc.git' }
 
-  s.ios.deployment_target = "7.1"
-  s.osx.deployment_target = "10.9"
+  s.ios.deployment_target = "9.0"
+  s.osx.deployment_target = "10.10"
 
   # Base directory where the .proto files are.
   src = "../../protos"
index e067e82..6e2f1f3 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.2;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.2;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = iphoneos;
                                TARGETED_DEVICE_FAMILY = "1,2";
index 0c3feaa..6dbfe81 100644 (file)
@@ -1,5 +1,5 @@
 source 'https://github.com/CocoaPods/Specs.git'
-platform :ios, '8.0'
+platform :ios, '9.0'
 
 install! 'cocoapods', :deterministic_uuids => false
 
index fc671ef..523cca8 100644 (file)
@@ -7,8 +7,8 @@ Pod::Spec.new do |s|
   s.summary = "HelloWorld example"
   s.source = { :git => 'https://github.com/grpc/grpc.git' }
 
-  s.ios.deployment_target = "7.1"
-  s.osx.deployment_target = "10.9"
+  s.ios.deployment_target = "9.0"
+  s.osx.deployment_target = "10.10"
 
   # Base directory where the .proto files are.
   src = "../../protos"
index 06f0629..c068750 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               MACOSX_DEPLOYMENT_TARGET = 10.13;
+                               MACOSX_DEPLOYMENT_TARGET = 10.10;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = macosx;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               MACOSX_DEPLOYMENT_TARGET = 10.13;
+                               MACOSX_DEPLOYMENT_TARGET = 10.10;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = macosx;
                        };
index bf1488c..943b87d 100644 (file)
@@ -1,5 +1,5 @@
 source 'https://github.com/CocoaPods/Specs.git'
-platform :macos, '10.9'
+platform :macos, '10.10'
 
 install! 'cocoapods', :deterministic_uuids => false
 
index b77eb1b..1cc4e46 100644 (file)
@@ -1,5 +1,5 @@
 source 'https://github.com/CocoaPods/Specs.git'
-platform :ios, '8.0'
+platform :ios, '9.0'
 
 install! 'cocoapods', :deterministic_uuids => false
 
index 5963959..e50e824 100644 (file)
@@ -7,8 +7,8 @@ Pod::Spec.new do |s|
   s.summary = "RouteGuide example"
   s.source = { :git => 'https://github.com/grpc/grpc.git' }
 
-  s.ios.deployment_target = "7.1"
-  s.osx.deployment_target = "10.9"
+  s.ios.deployment_target = "9.0"
+  s.osx.deployment_target = "10.10"
 
   # Base directory where the .proto files are.
   src = "../../protos"
index 0bb84b3..1ed66e9 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.3;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.3;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = iphoneos;
                                TARGETED_DEVICE_FAMILY = "1,2";
index a31d97d..9b8ea77 100644 (file)
@@ -22,7 +22,7 @@
 Pod::Spec.new do |s|
   s.name     = 'gRPC-C++'
   # TODO (mxyan): use version that match gRPC version when pod is stabilized
-  version = '1.33.2'
+  version = '1.34.0'
   s.version  = version
   s.summary  = 'gRPC C++ library'
   s.homepage = 'https://grpc.io'
@@ -34,8 +34,8 @@ Pod::Spec.new do |s|
     :tag => "v#{version}",
   }
 
-  s.ios.deployment_target = '7.0'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
   s.tvos.deployment_target = '10.0'
 
   s.requires_arc = false
@@ -150,6 +150,7 @@ Pod::Spec.new do |s|
                       'include/grpcpp/security/auth_metadata_processor.h',
                       'include/grpcpp/security/credentials.h',
                       'include/grpcpp/security/server_credentials.h',
+                      'include/grpcpp/security/tls_certificate_provider.h',
                       'include/grpcpp/security/tls_credentials_options.h',
                       'include/grpcpp/server.h',
                       'include/grpcpp/server_builder.h',
@@ -183,10 +184,11 @@ Pod::Spec.new do |s|
     ss.header_mappings_dir = '.'
     ss.dependency "#{s.name}/Interface", version
     ss.dependency 'gRPC-Core', version
-    abseil_version = '1.20200225.0'
+    abseil_version = '1.20200923.2'
     ss.dependency 'abseil/base/base', abseil_version
     ss.dependency 'abseil/container/flat_hash_set', abseil_version
     ss.dependency 'abseil/container/inlined_vector', abseil_version
+    ss.dependency 'abseil/functional/bind_front', abseil_version
     ss.dependency 'abseil/memory/memory', abseil_version
     ss.dependency 'abseil/status/status', abseil_version
     ss.dependency 'abseil/strings/str_format', abseil_version
@@ -363,12 +365,92 @@ Pod::Spec.new do |s|
                       'src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h',
                       'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h',
                       'src/core/ext/upb-generated/validate/validate.upb.h',
+                      'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/api/http.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/validate/validate.upbdefs.h',
                       'src/core/ext/xds/certificate_provider_factory.h',
                       'src/core/ext/xds/certificate_provider_registry.h',
                       'src/core/ext/xds/certificate_provider_store.h',
+                      'src/core/ext/xds/file_watcher_certificate_provider_factory.h',
                       'src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h',
                       'src/core/ext/xds/xds_api.h',
                       'src/core/ext/xds/xds_bootstrap.h',
+                      'src/core/ext/xds/xds_certificate_provider.h',
                       'src/core/ext/xds/xds_channel_args.h',
                       'src/core/ext/xds/xds_client.h',
                       'src/core/ext/xds/xds_client_stats.h',
@@ -408,12 +490,14 @@ Pod::Spec.new do |s|
                       'src/core/lib/gpr/tls_gcc.h',
                       'src/core/lib/gpr/tls_msvc.h',
                       'src/core/lib/gpr/tls_pthread.h',
+                      'src/core/lib/gpr/tls_stdcpp.h',
                       'src/core/lib/gpr/tmpfile.h',
                       'src/core/lib/gpr/useful.h',
                       'src/core/lib/gprpp/arena.h',
                       'src/core/lib/gprpp/atomic.h',
                       'src/core/lib/gprpp/debug_location.h',
                       'src/core/lib/gprpp/dual_ref_counted.h',
+                      'src/core/lib/gprpp/examine_stack.h',
                       'src/core/lib/gprpp/fork.h',
                       'src/core/lib/gprpp/global_config.h',
                       'src/core/lib/gprpp/global_config_custom.h',
@@ -427,6 +511,7 @@ Pod::Spec.new do |s|
                       'src/core/lib/gprpp/orphanable.h',
                       'src/core/lib/gprpp/ref_counted.h',
                       'src/core/lib/gprpp/ref_counted_ptr.h',
+                      'src/core/lib/gprpp/stat.h',
                       'src/core/lib/gprpp/sync.h',
                       'src/core/lib/gprpp/thd.h',
                       'src/core/lib/http/format_request.h',
@@ -521,14 +606,16 @@ Pod::Spec.new do |s|
                       'src/core/lib/security/authorization/mock_cel/cel_value.h',
                       'src/core/lib/security/authorization/mock_cel/evaluator_core.h',
                       'src/core/lib/security/authorization/mock_cel/flat_expr_builder.h',
-                      'src/core/lib/security/authorization/mock_cel/statusor.h',
-                      'src/core/lib/security/certificate_provider.h',
                       'src/core/lib/security/context/security_context.h',
                       'src/core/lib/security/credentials/alts/alts_credentials.h',
                       'src/core/lib/security/credentials/alts/check_gcp_environment.h',
                       'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h',
                       'src/core/lib/security/credentials/composite/composite_credentials.h',
                       'src/core/lib/security/credentials/credentials.h',
+                      'src/core/lib/security/credentials/external/aws_request_signer.h',
+                      'src/core/lib/security/credentials/external/external_account_credentials.h',
+                      'src/core/lib/security/credentials/external/file_external_account_credentials.h',
+                      'src/core/lib/security/credentials/external/url_external_account_credentials.h',
                       'src/core/lib/security/credentials/fake/fake_credentials.h',
                       'src/core/lib/security/credentials/google_default/google_default_credentials.h',
                       'src/core/lib/security/credentials/iam/iam_credentials.h',
@@ -540,11 +627,13 @@ Pod::Spec.new do |s|
                       'src/core/lib/security/credentials/plugin/plugin_credentials.h',
                       'src/core/lib/security/credentials/ssl/ssl_credentials.h',
                       'src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h',
+                      'src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h',
                       'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h',
                       'src/core/lib/security/credentials/tls/tls_credentials.h',
                       'src/core/lib/security/credentials/xds/xds_credentials.h',
                       'src/core/lib/security/security_connector/alts/alts_security_connector.h',
                       'src/core/lib/security/security_connector/fake/fake_security_connector.h',
+                      'src/core/lib/security/security_connector/insecure/insecure_security_connector.h',
                       'src/core/lib/security/security_connector/load_system_roots.h',
                       'src/core/lib/security/security_connector/load_system_roots_linux.h',
                       'src/core/lib/security/security_connector/local/local_security_connector.h',
@@ -631,6 +720,7 @@ Pod::Spec.new do |s|
                       'src/cpp/client/insecure_credentials.cc',
                       'src/cpp/client/secure_credentials.cc',
                       'src/cpp/client/secure_credentials.h',
+                      'src/cpp/client/xds_credentials.cc',
                       'src/cpp/codegen/codegen_init.cc',
                       'src/cpp/common/alarm.cc',
                       'src/cpp/common/auth_property_iterator.cc',
@@ -645,6 +735,7 @@ Pod::Spec.new do |s|
                       'src/cpp/common/secure_auth_context.h',
                       'src/cpp/common/secure_channel_arguments.cc',
                       'src/cpp/common/secure_create_auth_context.cc',
+                      'src/cpp/common/tls_certificate_provider.cc',
                       'src/cpp/common/tls_credentials_options.cc',
                       'src/cpp/common/tls_credentials_options_util.cc',
                       'src/cpp/common/tls_credentials_options_util.h',
@@ -704,11 +795,15 @@ Pod::Spec.new do |s|
                       'third_party/re2/util/utf.h',
                       'third_party/re2/util/util.h',
                       'third_party/upb/upb/decode.h',
+                      'third_party/upb/upb/def.h',
+                      'third_party/upb/upb/def.hpp',
                       'third_party/upb/upb/encode.h',
                       'third_party/upb/upb/msg.h',
                       'third_party/upb/upb/port_def.inc',
                       'third_party/upb/upb/port_undef.inc',
+                      'third_party/upb/upb/reflection.h',
                       'third_party/upb/upb/table.int.h',
+                      'third_party/upb/upb/text_encode.h',
                       'third_party/upb/upb/upb.h',
                       'third_party/upb/upb/upb.hpp'
 
@@ -880,12 +975,92 @@ Pod::Spec.new do |s|
                               'src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h',
                               'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h',
                               'src/core/ext/upb-generated/validate/validate.upb.h',
+                              'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/api/http.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/validate/validate.upbdefs.h',
                               'src/core/ext/xds/certificate_provider_factory.h',
                               'src/core/ext/xds/certificate_provider_registry.h',
                               'src/core/ext/xds/certificate_provider_store.h',
+                              'src/core/ext/xds/file_watcher_certificate_provider_factory.h',
                               'src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h',
                               'src/core/ext/xds/xds_api.h',
                               'src/core/ext/xds/xds_bootstrap.h',
+                              'src/core/ext/xds/xds_certificate_provider.h',
                               'src/core/ext/xds/xds_channel_args.h',
                               'src/core/ext/xds/xds_client.h',
                               'src/core/ext/xds/xds_client_stats.h',
@@ -925,12 +1100,14 @@ Pod::Spec.new do |s|
                               'src/core/lib/gpr/tls_gcc.h',
                               'src/core/lib/gpr/tls_msvc.h',
                               'src/core/lib/gpr/tls_pthread.h',
+                              'src/core/lib/gpr/tls_stdcpp.h',
                               'src/core/lib/gpr/tmpfile.h',
                               'src/core/lib/gpr/useful.h',
                               'src/core/lib/gprpp/arena.h',
                               'src/core/lib/gprpp/atomic.h',
                               'src/core/lib/gprpp/debug_location.h',
                               'src/core/lib/gprpp/dual_ref_counted.h',
+                              'src/core/lib/gprpp/examine_stack.h',
                               'src/core/lib/gprpp/fork.h',
                               'src/core/lib/gprpp/global_config.h',
                               'src/core/lib/gprpp/global_config_custom.h',
@@ -944,6 +1121,7 @@ Pod::Spec.new do |s|
                               'src/core/lib/gprpp/orphanable.h',
                               'src/core/lib/gprpp/ref_counted.h',
                               'src/core/lib/gprpp/ref_counted_ptr.h',
+                              'src/core/lib/gprpp/stat.h',
                               'src/core/lib/gprpp/sync.h',
                               'src/core/lib/gprpp/thd.h',
                               'src/core/lib/http/format_request.h',
@@ -1038,14 +1216,16 @@ Pod::Spec.new do |s|
                               'src/core/lib/security/authorization/mock_cel/cel_value.h',
                               'src/core/lib/security/authorization/mock_cel/evaluator_core.h',
                               'src/core/lib/security/authorization/mock_cel/flat_expr_builder.h',
-                              'src/core/lib/security/authorization/mock_cel/statusor.h',
-                              'src/core/lib/security/certificate_provider.h',
                               'src/core/lib/security/context/security_context.h',
                               'src/core/lib/security/credentials/alts/alts_credentials.h',
                               'src/core/lib/security/credentials/alts/check_gcp_environment.h',
                               'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h',
                               'src/core/lib/security/credentials/composite/composite_credentials.h',
                               'src/core/lib/security/credentials/credentials.h',
+                              'src/core/lib/security/credentials/external/aws_request_signer.h',
+                              'src/core/lib/security/credentials/external/external_account_credentials.h',
+                              'src/core/lib/security/credentials/external/file_external_account_credentials.h',
+                              'src/core/lib/security/credentials/external/url_external_account_credentials.h',
                               'src/core/lib/security/credentials/fake/fake_credentials.h',
                               'src/core/lib/security/credentials/google_default/google_default_credentials.h',
                               'src/core/lib/security/credentials/iam/iam_credentials.h',
@@ -1057,11 +1237,13 @@ Pod::Spec.new do |s|
                               'src/core/lib/security/credentials/plugin/plugin_credentials.h',
                               'src/core/lib/security/credentials/ssl/ssl_credentials.h',
                               'src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h',
+                              'src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h',
                               'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h',
                               'src/core/lib/security/credentials/tls/tls_credentials.h',
                               'src/core/lib/security/credentials/xds/xds_credentials.h',
                               'src/core/lib/security/security_connector/alts/alts_security_connector.h',
                               'src/core/lib/security/security_connector/fake/fake_security_connector.h',
+                              'src/core/lib/security/security_connector/insecure/insecure_security_connector.h',
                               'src/core/lib/security/security_connector/load_system_roots.h',
                               'src/core/lib/security/security_connector/load_system_roots_linux.h',
                               'src/core/lib/security/security_connector/local/local_security_connector.h',
@@ -1174,11 +1356,15 @@ Pod::Spec.new do |s|
                               'third_party/re2/util/utf.h',
                               'third_party/re2/util/util.h',
                               'third_party/upb/upb/decode.h',
+                              'third_party/upb/upb/def.h',
+                              'third_party/upb/upb/def.hpp',
                               'third_party/upb/upb/encode.h',
                               'third_party/upb/upb/msg.h',
                               'third_party/upb/upb/port_def.inc',
                               'third_party/upb/upb/port_undef.inc',
+                              'third_party/upb/upb/reflection.h',
                               'third_party/upb/upb/table.int.h',
+                              'third_party/upb/upb/text_encode.h',
                               'third_party/upb/upb/upb.h',
                               'third_party/upb/upb/upb.hpp'
   end
index cec98e9..8c6673f 100644 (file)
@@ -21,7 +21,7 @@
 
 Pod::Spec.new do |s|
   s.name     = 'gRPC-Core'
-  version = '1.33.2'
+  version = '1.34.0'
   s.version  = version
   s.summary  = 'Core cross-platform gRPC library, written in C'
   s.homepage = 'https://grpc.io'
@@ -38,15 +38,15 @@ Pod::Spec.new do |s|
   # which was released in Cocoapods v1.2.0.
   s.cocoapods_version = '>= 1.2.0'
 
-  s.ios.deployment_target = '7.0'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
   s.tvos.deployment_target = '10.0'
   s.watchos.deployment_target = '4.0'
 
   s.requires_arc = false
 
   name = 'grpc'
-  abseil_version = '1.20200225.0'
+  abseil_version = '1.20200923.2'
 
   # When creating a dynamic framework, name it grpc.framework instead of gRPC-Core.framework.
   # This lets users write their includes like `#include <grpc/grpc.h>` as opposed to `#include
@@ -173,10 +173,11 @@ Pod::Spec.new do |s|
     ss.header_mappings_dir = '.'
     ss.libraries = 'z'
     ss.dependency "#{s.name}/Interface", version
-    ss.dependency 'BoringSSL-GRPC', '0.0.13'
+    ss.dependency 'BoringSSL-GRPC', '0.0.14'
     ss.dependency 'abseil/base/base', abseil_version
     ss.dependency 'abseil/container/flat_hash_set', abseil_version
     ss.dependency 'abseil/container/inlined_vector', abseil_version
+    ss.dependency 'abseil/functional/bind_front', abseil_version
     ss.dependency 'abseil/memory/memory', abseil_version
     ss.dependency 'abseil/status/status', abseil_version
     ss.dependency 'abseil/strings/str_format', abseil_version
@@ -235,8 +236,8 @@ Pod::Spec.new do |s|
                       'src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc',
                       'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc',
                       'src/core/ext/filters/client_channel/lb_policy/xds/eds.cc',
-                      'src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc',
                       'src/core/ext/filters/client_channel/lb_policy/xds/xds.h',
+                      'src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc',
                       'src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc',
                       'src/core/ext/filters/client_channel/lb_policy_factory.h',
                       'src/core/ext/filters/client_channel/lb_policy_registry.cc',
@@ -547,16 +548,177 @@ Pod::Spec.new do |s|
                       'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h',
                       'src/core/ext/upb-generated/validate/validate.upb.c',
                       'src/core/ext/upb-generated/validate/validate.upb.h',
+                      'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/api/http.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/google/api/http.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h',
+                      'src/core/ext/upbdefs-generated/validate/validate.upbdefs.c',
+                      'src/core/ext/upbdefs-generated/validate/validate.upbdefs.h',
                       'src/core/ext/xds/certificate_provider_factory.h',
                       'src/core/ext/xds/certificate_provider_registry.cc',
                       'src/core/ext/xds/certificate_provider_registry.h',
+                      'src/core/ext/xds/certificate_provider_store.cc',
                       'src/core/ext/xds/certificate_provider_store.h',
+                      'src/core/ext/xds/file_watcher_certificate_provider_factory.cc',
+                      'src/core/ext/xds/file_watcher_certificate_provider_factory.h',
                       'src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc',
                       'src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h',
                       'src/core/ext/xds/xds_api.cc',
                       'src/core/ext/xds/xds_api.h',
                       'src/core/ext/xds/xds_bootstrap.cc',
                       'src/core/ext/xds/xds_bootstrap.h',
+                      'src/core/ext/xds/xds_certificate_provider.cc',
+                      'src/core/ext/xds/xds_certificate_provider.h',
                       'src/core/ext/xds/xds_channel_args.h',
                       'src/core/ext/xds/xds_client.cc',
                       'src/core/ext/xds/xds_client.h',
@@ -648,6 +810,7 @@ Pod::Spec.new do |s|
                       'src/core/lib/gpr/tls_msvc.h',
                       'src/core/lib/gpr/tls_pthread.cc',
                       'src/core/lib/gpr/tls_pthread.h',
+                      'src/core/lib/gpr/tls_stdcpp.h',
                       'src/core/lib/gpr/tmpfile.h',
                       'src/core/lib/gpr/tmpfile_msys.cc',
                       'src/core/lib/gpr/tmpfile_posix.cc',
@@ -659,6 +822,8 @@ Pod::Spec.new do |s|
                       'src/core/lib/gprpp/atomic.h',
                       'src/core/lib/gprpp/debug_location.h',
                       'src/core/lib/gprpp/dual_ref_counted.h',
+                      'src/core/lib/gprpp/examine_stack.cc',
+                      'src/core/lib/gprpp/examine_stack.h',
                       'src/core/lib/gprpp/fork.cc',
                       'src/core/lib/gprpp/fork.h',
                       'src/core/lib/gprpp/global_config.h',
@@ -676,6 +841,9 @@ Pod::Spec.new do |s|
                       'src/core/lib/gprpp/orphanable.h',
                       'src/core/lib/gprpp/ref_counted.h',
                       'src/core/lib/gprpp/ref_counted_ptr.h',
+                      'src/core/lib/gprpp/stat.h',
+                      'src/core/lib/gprpp/stat_posix.cc',
+                      'src/core/lib/gprpp/stat_windows.cc',
                       'src/core/lib/gprpp/sync.h',
                       'src/core/lib/gprpp/thd.h',
                       'src/core/lib/gprpp/thd_posix.cc',
@@ -879,8 +1047,6 @@ Pod::Spec.new do |s|
                       'src/core/lib/security/authorization/mock_cel/cel_value.h',
                       'src/core/lib/security/authorization/mock_cel/evaluator_core.h',
                       'src/core/lib/security/authorization/mock_cel/flat_expr_builder.h',
-                      'src/core/lib/security/authorization/mock_cel/statusor.h',
-                      'src/core/lib/security/certificate_provider.h',
                       'src/core/lib/security/context/security_context.cc',
                       'src/core/lib/security/context/security_context.h',
                       'src/core/lib/security/credentials/alts/alts_credentials.cc',
@@ -899,6 +1065,14 @@ Pod::Spec.new do |s|
                       'src/core/lib/security/credentials/credentials.cc',
                       'src/core/lib/security/credentials/credentials.h',
                       'src/core/lib/security/credentials/credentials_metadata.cc',
+                      'src/core/lib/security/credentials/external/aws_request_signer.cc',
+                      'src/core/lib/security/credentials/external/aws_request_signer.h',
+                      'src/core/lib/security/credentials/external/external_account_credentials.cc',
+                      'src/core/lib/security/credentials/external/external_account_credentials.h',
+                      'src/core/lib/security/credentials/external/file_external_account_credentials.cc',
+                      'src/core/lib/security/credentials/external/file_external_account_credentials.h',
+                      'src/core/lib/security/credentials/external/url_external_account_credentials.cc',
+                      'src/core/lib/security/credentials/external/url_external_account_credentials.h',
                       'src/core/lib/security/credentials/fake/fake_credentials.cc',
                       'src/core/lib/security/credentials/fake/fake_credentials.h',
                       'src/core/lib/security/credentials/google_default/credentials_generic.cc',
@@ -906,6 +1080,7 @@ Pod::Spec.new do |s|
                       'src/core/lib/security/credentials/google_default/google_default_credentials.h',
                       'src/core/lib/security/credentials/iam/iam_credentials.cc',
                       'src/core/lib/security/credentials/iam/iam_credentials.h',
+                      'src/core/lib/security/credentials/insecure/insecure_credentials.cc',
                       'src/core/lib/security/credentials/jwt/json_token.cc',
                       'src/core/lib/security/credentials/jwt/json_token.h',
                       'src/core/lib/security/credentials/jwt/jwt_credentials.cc',
@@ -922,6 +1097,8 @@ Pod::Spec.new do |s|
                       'src/core/lib/security/credentials/ssl/ssl_credentials.h',
                       'src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc',
                       'src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h',
+                      'src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc',
+                      'src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h',
                       'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc',
                       'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h',
                       'src/core/lib/security/credentials/tls/tls_credentials.cc',
@@ -932,6 +1109,8 @@ Pod::Spec.new do |s|
                       'src/core/lib/security/security_connector/alts/alts_security_connector.h',
                       'src/core/lib/security/security_connector/fake/fake_security_connector.cc',
                       'src/core/lib/security/security_connector/fake/fake_security_connector.h',
+                      'src/core/lib/security/security_connector/insecure/insecure_security_connector.cc',
+                      'src/core/lib/security/security_connector/insecure/insecure_security_connector.h',
                       'src/core/lib/security/security_connector/load_system_roots.h',
                       'src/core/lib/security/security_connector/load_system_roots_fallback.cc',
                       'src/core/lib/security/security_connector/load_system_roots_linux.cc',
@@ -1140,6 +1319,9 @@ Pod::Spec.new do |s|
                       'third_party/re2/util/util.h',
                       'third_party/upb/upb/decode.c',
                       'third_party/upb/upb/decode.h',
+                      'third_party/upb/upb/def.c',
+                      'third_party/upb/upb/def.h',
+                      'third_party/upb/upb/def.hpp',
                       'third_party/upb/upb/encode.c',
                       'third_party/upb/upb/encode.h',
                       'third_party/upb/upb/msg.c',
@@ -1147,8 +1329,12 @@ Pod::Spec.new do |s|
                       'third_party/upb/upb/port.c',
                       'third_party/upb/upb/port_def.inc',
                       'third_party/upb/upb/port_undef.inc',
+                      'third_party/upb/upb/reflection.c',
+                      'third_party/upb/upb/reflection.h',
                       'third_party/upb/upb/table.c',
                       'third_party/upb/upb/table.int.h',
+                      'third_party/upb/upb/text_encode.c',
+                      'third_party/upb/upb/text_encode.h',
                       'third_party/upb/upb/upb.c',
                       'third_party/upb/upb/upb.h',
                       'third_party/upb/upb/upb.hpp'
@@ -1320,12 +1506,92 @@ Pod::Spec.new do |s|
                               'src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h',
                               'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h',
                               'src/core/ext/upb-generated/validate/validate.upb.h',
+                              'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/api/http.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h',
+                              'src/core/ext/upbdefs-generated/validate/validate.upbdefs.h',
                               'src/core/ext/xds/certificate_provider_factory.h',
                               'src/core/ext/xds/certificate_provider_registry.h',
                               'src/core/ext/xds/certificate_provider_store.h',
+                              'src/core/ext/xds/file_watcher_certificate_provider_factory.h',
                               'src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h',
                               'src/core/ext/xds/xds_api.h',
                               'src/core/ext/xds/xds_bootstrap.h',
+                              'src/core/ext/xds/xds_certificate_provider.h',
                               'src/core/ext/xds/xds_channel_args.h',
                               'src/core/ext/xds/xds_client.h',
                               'src/core/ext/xds/xds_client_stats.h',
@@ -1365,12 +1631,14 @@ Pod::Spec.new do |s|
                               'src/core/lib/gpr/tls_gcc.h',
                               'src/core/lib/gpr/tls_msvc.h',
                               'src/core/lib/gpr/tls_pthread.h',
+                              'src/core/lib/gpr/tls_stdcpp.h',
                               'src/core/lib/gpr/tmpfile.h',
                               'src/core/lib/gpr/useful.h',
                               'src/core/lib/gprpp/arena.h',
                               'src/core/lib/gprpp/atomic.h',
                               'src/core/lib/gprpp/debug_location.h',
                               'src/core/lib/gprpp/dual_ref_counted.h',
+                              'src/core/lib/gprpp/examine_stack.h',
                               'src/core/lib/gprpp/fork.h',
                               'src/core/lib/gprpp/global_config.h',
                               'src/core/lib/gprpp/global_config_custom.h',
@@ -1384,6 +1652,7 @@ Pod::Spec.new do |s|
                               'src/core/lib/gprpp/orphanable.h',
                               'src/core/lib/gprpp/ref_counted.h',
                               'src/core/lib/gprpp/ref_counted_ptr.h',
+                              'src/core/lib/gprpp/stat.h',
                               'src/core/lib/gprpp/sync.h',
                               'src/core/lib/gprpp/thd.h',
                               'src/core/lib/http/format_request.h',
@@ -1478,14 +1747,16 @@ Pod::Spec.new do |s|
                               'src/core/lib/security/authorization/mock_cel/cel_value.h',
                               'src/core/lib/security/authorization/mock_cel/evaluator_core.h',
                               'src/core/lib/security/authorization/mock_cel/flat_expr_builder.h',
-                              'src/core/lib/security/authorization/mock_cel/statusor.h',
-                              'src/core/lib/security/certificate_provider.h',
                               'src/core/lib/security/context/security_context.h',
                               'src/core/lib/security/credentials/alts/alts_credentials.h',
                               'src/core/lib/security/credentials/alts/check_gcp_environment.h',
                               'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h',
                               'src/core/lib/security/credentials/composite/composite_credentials.h',
                               'src/core/lib/security/credentials/credentials.h',
+                              'src/core/lib/security/credentials/external/aws_request_signer.h',
+                              'src/core/lib/security/credentials/external/external_account_credentials.h',
+                              'src/core/lib/security/credentials/external/file_external_account_credentials.h',
+                              'src/core/lib/security/credentials/external/url_external_account_credentials.h',
                               'src/core/lib/security/credentials/fake/fake_credentials.h',
                               'src/core/lib/security/credentials/google_default/google_default_credentials.h',
                               'src/core/lib/security/credentials/iam/iam_credentials.h',
@@ -1497,11 +1768,13 @@ Pod::Spec.new do |s|
                               'src/core/lib/security/credentials/plugin/plugin_credentials.h',
                               'src/core/lib/security/credentials/ssl/ssl_credentials.h',
                               'src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h',
+                              'src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h',
                               'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h',
                               'src/core/lib/security/credentials/tls/tls_credentials.h',
                               'src/core/lib/security/credentials/xds/xds_credentials.h',
                               'src/core/lib/security/security_connector/alts/alts_security_connector.h',
                               'src/core/lib/security/security_connector/fake/fake_security_connector.h',
+                              'src/core/lib/security/security_connector/insecure/insecure_security_connector.h',
                               'src/core/lib/security/security_connector/load_system_roots.h',
                               'src/core/lib/security/security_connector/load_system_roots_linux.h',
                               'src/core/lib/security/security_connector/local/local_security_connector.h',
@@ -1603,11 +1876,15 @@ Pod::Spec.new do |s|
                               'third_party/re2/util/utf.h',
                               'third_party/re2/util/util.h',
                               'third_party/upb/upb/decode.h',
+                              'third_party/upb/upb/def.h',
+                              'third_party/upb/upb/def.hpp',
                               'third_party/upb/upb/encode.h',
                               'third_party/upb/upb/msg.h',
                               'third_party/upb/upb/port_def.inc',
                               'third_party/upb/upb/port_undef.inc',
+                              'third_party/upb/upb/reflection.h',
                               'third_party/upb/upb/table.int.h',
+                              'third_party/upb/upb/text_encode.h',
                               'third_party/upb/upb/upb.h',
                               'third_party/upb/upb/upb.hpp'
   end
@@ -1750,8 +2027,6 @@ Pod::Spec.new do |s|
                       'test/core/util/debugger_macros.h',
                       'test/core/util/eval_args_mock_endpoint.cc',
                       'test/core/util/eval_args_mock_endpoint.h',
-                      'test/core/util/examine_stack.cc',
-                      'test/core/util/examine_stack.h',
                       'test/core/util/fuzzer_util.cc',
                       'test/core/util/fuzzer_util.h',
                       'test/core/util/grpc_profiler.cc',
@@ -1773,8 +2048,12 @@ Pod::Spec.new do |s|
                       'test/core/util/port_server_client.h',
                       'test/core/util/reconnect_server.cc',
                       'test/core/util/reconnect_server.h',
+                      'test/core/util/resolve_localhost_ip46.cc',
+                      'test/core/util/resolve_localhost_ip46.h',
                       'test/core/util/slice_splitter.cc',
                       'test/core/util/slice_splitter.h',
+                      'test/core/util/stack_tracer.cc',
+                      'test/core/util/stack_tracer.h',
                       'test/core/util/subprocess.h',
                       'test/core/util/subprocess_windows.cc',
                       'test/core/util/test_config.cc',
index c5167cb..1008b8e 100644 (file)
@@ -21,7 +21,7 @@
 
 Pod::Spec.new do |s|
   s.name     = 'gRPC-ProtoRPC'
-  version = '1.33.2'
+  version = '1.34.0'
   s.version  = version
   s.summary  = 'RPC library for Protocol Buffers, based on gRPC'
   s.homepage = 'https://grpc.io'
@@ -33,8 +33,8 @@ Pod::Spec.new do |s|
     :tag => "v#{version}",
   }
 
-  s.ios.deployment_target = '7.0'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
   s.tvos.deployment_target = '10.0'
   s.watchos.deployment_target = '4.0'
 
index 38ba305..095ae3a 100644 (file)
@@ -21,7 +21,7 @@
 
 Pod::Spec.new do |s|
   s.name     = 'gRPC-RxLibrary'
-  version = '1.33.2'
+  version = '1.34.0'
   s.version  = version
   s.summary  = 'Reactive Extensions library for iOS/OSX.'
   s.homepage = 'https://grpc.io'
@@ -33,8 +33,8 @@ Pod::Spec.new do |s|
     :tag => "v#{version}",
   }
 
-  s.ios.deployment_target = '7.0'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
   s.tvos.deployment_target = '10.0'
   s.watchos.deployment_target = '4.0'
 
index f735904..38367c8 100644 (file)
@@ -20,7 +20,7 @@
 
 Pod::Spec.new do |s|
   s.name     = 'gRPC'
-  version = '1.33.2'
+  version = '1.34.0'
   s.version  = version
   s.summary  = 'gRPC client library for iOS/OSX'
   s.homepage = 'https://grpc.io'
@@ -44,8 +44,8 @@ Pod::Spec.new do |s|
     'CLANG_WARN_STRICT_PROTOTYPES' => 'NO',
   }
 
-  s.ios.deployment_target = '7.0'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
   s.tvos.deployment_target = '10.0'
   s.watchos.deployment_target = '4.0'
 
@@ -70,8 +70,8 @@ Pod::Spec.new do |s|
                       "src/objective-c/GRPCClient/GRPCTypes.m"
     ss.dependency "gRPC-RxLibrary/Interface", version
 
-    ss.ios.deployment_target = '7.0'
-    ss.osx.deployment_target = '10.9'
+    ss.ios.deployment_target = '9.0'
+    ss.osx.deployment_target = '10.10'
     ss.tvos.deployment_target = '10.0'
     ss.watchos.deployment_target = '4.0'
   end
@@ -105,8 +105,8 @@ Pod::Spec.new do |s|
 
     ss.dependency "#{s.name}/Interface-Legacy", version
 
-    ss.ios.deployment_target = '7.0'
-    ss.osx.deployment_target = '10.9'
+    ss.ios.deployment_target = '9.0'
+    ss.osx.deployment_target = '10.10'
     ss.tvos.deployment_target = '10.0'
     ss.watchos.deployment_target = '4.0'
   end
@@ -141,8 +141,8 @@ Pod::Spec.new do |s|
     ss.dependency 'gRPC-Core', version
     ss.dependency 'gRPC-RxLibrary', version
 
-    ss.ios.deployment_target = '7.0'
-    ss.osx.deployment_target = '10.9'
+    ss.ios.deployment_target = '9.0'
+    ss.osx.deployment_target = '10.10'
     ss.tvos.deployment_target = '10.0'
     ss.watchos.deployment_target = '4.0'
   end
@@ -157,15 +157,15 @@ Pod::Spec.new do |s|
     ss.dependency 'gRPC-Core/Cronet-Implementation', version
     ss.dependency 'CronetFramework'
 
-    ss.ios.deployment_target = '8.0'
+    ss.ios.deployment_target = '9.0'
   end
 
   # CFStream is now default. Leaving this subspec only for compatibility purpose.
   s.subspec 'CFStream' do |ss|
     ss.dependency "#{s.name}/GRPCCore", version
 
-    ss.ios.deployment_target = '7.0'
-    ss.osx.deployment_target = '10.9'
+    ss.ios.deployment_target = '9.0'
+    ss.osx.deployment_target = '10.10'
     ss.tvos.deployment_target = '10.0'
     ss.watchos.deployment_target = '4.0'
   end
@@ -176,8 +176,8 @@ Pod::Spec.new do |s|
     ss.source_files = 'src/objective-c/GRPCClient/internal_testing/*.{h,m}'
     ss.header_mappings_dir = 'src/objective-c/GRPCClient'
 
-    ss.ios.deployment_target = '7.0'
-    ss.osx.deployment_target = '10.9'
+    ss.ios.deployment_target = '9.0'
+    ss.osx.deployment_target = '10.10'
     ss.tvos.deployment_target = '10.0'
     ss.watchos.deployment_target = '4.0'
   end
index ed31909..aecf99a 100644 (file)
--- a/grpc.def
+++ b/grpc.def
@@ -135,18 +135,22 @@ EXPORTS
     grpc_alts_server_credentials_create
     grpc_local_credentials_create
     grpc_local_server_credentials_create
+    grpc_tls_identity_pairs_create
+    grpc_tls_identity_pairs_add_pair
+    grpc_tls_identity_pairs_destroy
+    grpc_tls_certificate_provider_static_data_create
+    grpc_tls_certificate_provider_release
     grpc_tls_credentials_options_create
     grpc_tls_credentials_options_set_cert_request_type
     grpc_tls_credentials_options_set_server_verification_option
-    grpc_tls_credentials_options_set_key_materials_config
-    grpc_tls_credentials_options_set_credential_reload_config
+    grpc_tls_credentials_options_set_certificate_provider
+    grpc_tls_credentials_options_watch_root_certs
+    grpc_tls_credentials_options_set_root_cert_name
+    grpc_tls_credentials_options_watch_identity_key_cert_pairs
+    grpc_tls_credentials_options_set_identity_cert_name
     grpc_tls_credentials_options_set_server_authorization_check_config
-    grpc_tls_key_materials_config_create
-    grpc_tls_key_materials_config_set_key_materials
-    grpc_tls_key_materials_config_set_version
-    grpc_tls_key_materials_config_get_version
-    grpc_tls_credential_reload_config_create
     grpc_tls_server_authorization_check_config_create
+    grpc_tls_server_authorization_check_config_release
     grpc_xds_credentials_create
     grpc_raw_byte_buffer_create
     grpc_raw_compressed_byte_buffer_create
index a438fc4..9338ae2 100644 (file)
@@ -153,8 +153,8 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/cds.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/eds.cc )
-  s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.h )
+  s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy_factory.h )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.cc )
@@ -465,16 +465,177 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h )
   s.files += %w( src/core/ext/upb-generated/validate/validate.upb.c )
   s.files += %w( src/core/ext/upb-generated/validate/validate.upb.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/google/api/http.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/google/api/http.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h )
+  s.files += %w( src/core/ext/upbdefs-generated/validate/validate.upbdefs.c )
+  s.files += %w( src/core/ext/upbdefs-generated/validate/validate.upbdefs.h )
   s.files += %w( src/core/ext/xds/certificate_provider_factory.h )
   s.files += %w( src/core/ext/xds/certificate_provider_registry.cc )
   s.files += %w( src/core/ext/xds/certificate_provider_registry.h )
+  s.files += %w( src/core/ext/xds/certificate_provider_store.cc )
   s.files += %w( src/core/ext/xds/certificate_provider_store.h )
+  s.files += %w( src/core/ext/xds/file_watcher_certificate_provider_factory.cc )
+  s.files += %w( src/core/ext/xds/file_watcher_certificate_provider_factory.h )
   s.files += %w( src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc )
   s.files += %w( src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h )
   s.files += %w( src/core/ext/xds/xds_api.cc )
   s.files += %w( src/core/ext/xds/xds_api.h )
   s.files += %w( src/core/ext/xds/xds_bootstrap.cc )
   s.files += %w( src/core/ext/xds/xds_bootstrap.h )
+  s.files += %w( src/core/ext/xds/xds_certificate_provider.cc )
+  s.files += %w( src/core/ext/xds/xds_certificate_provider.h )
   s.files += %w( src/core/ext/xds/xds_channel_args.h )
   s.files += %w( src/core/ext/xds/xds_client.cc )
   s.files += %w( src/core/ext/xds/xds_client.h )
@@ -566,6 +727,7 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/lib/gpr/tls_msvc.h )
   s.files += %w( src/core/lib/gpr/tls_pthread.cc )
   s.files += %w( src/core/lib/gpr/tls_pthread.h )
+  s.files += %w( src/core/lib/gpr/tls_stdcpp.h )
   s.files += %w( src/core/lib/gpr/tmpfile.h )
   s.files += %w( src/core/lib/gpr/tmpfile_msys.cc )
   s.files += %w( src/core/lib/gpr/tmpfile_posix.cc )
@@ -577,6 +739,8 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/lib/gprpp/atomic.h )
   s.files += %w( src/core/lib/gprpp/debug_location.h )
   s.files += %w( src/core/lib/gprpp/dual_ref_counted.h )
+  s.files += %w( src/core/lib/gprpp/examine_stack.cc )
+  s.files += %w( src/core/lib/gprpp/examine_stack.h )
   s.files += %w( src/core/lib/gprpp/fork.cc )
   s.files += %w( src/core/lib/gprpp/fork.h )
   s.files += %w( src/core/lib/gprpp/global_config.h )
@@ -594,6 +758,9 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/lib/gprpp/orphanable.h )
   s.files += %w( src/core/lib/gprpp/ref_counted.h )
   s.files += %w( src/core/lib/gprpp/ref_counted_ptr.h )
+  s.files += %w( src/core/lib/gprpp/stat.h )
+  s.files += %w( src/core/lib/gprpp/stat_posix.cc )
+  s.files += %w( src/core/lib/gprpp/stat_windows.cc )
   s.files += %w( src/core/lib/gprpp/sync.h )
   s.files += %w( src/core/lib/gprpp/thd.h )
   s.files += %w( src/core/lib/gprpp/thd_posix.cc )
@@ -797,8 +964,6 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/lib/security/authorization/mock_cel/cel_value.h )
   s.files += %w( src/core/lib/security/authorization/mock_cel/evaluator_core.h )
   s.files += %w( src/core/lib/security/authorization/mock_cel/flat_expr_builder.h )
-  s.files += %w( src/core/lib/security/authorization/mock_cel/statusor.h )
-  s.files += %w( src/core/lib/security/certificate_provider.h )
   s.files += %w( src/core/lib/security/context/security_context.cc )
   s.files += %w( src/core/lib/security/context/security_context.h )
   s.files += %w( src/core/lib/security/credentials/alts/alts_credentials.cc )
@@ -817,6 +982,14 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/lib/security/credentials/credentials.cc )
   s.files += %w( src/core/lib/security/credentials/credentials.h )
   s.files += %w( src/core/lib/security/credentials/credentials_metadata.cc )
+  s.files += %w( src/core/lib/security/credentials/external/aws_request_signer.cc )
+  s.files += %w( src/core/lib/security/credentials/external/aws_request_signer.h )
+  s.files += %w( src/core/lib/security/credentials/external/external_account_credentials.cc )
+  s.files += %w( src/core/lib/security/credentials/external/external_account_credentials.h )
+  s.files += %w( src/core/lib/security/credentials/external/file_external_account_credentials.cc )
+  s.files += %w( src/core/lib/security/credentials/external/file_external_account_credentials.h )
+  s.files += %w( src/core/lib/security/credentials/external/url_external_account_credentials.cc )
+  s.files += %w( src/core/lib/security/credentials/external/url_external_account_credentials.h )
   s.files += %w( src/core/lib/security/credentials/fake/fake_credentials.cc )
   s.files += %w( src/core/lib/security/credentials/fake/fake_credentials.h )
   s.files += %w( src/core/lib/security/credentials/google_default/credentials_generic.cc )
@@ -824,6 +997,7 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/lib/security/credentials/google_default/google_default_credentials.h )
   s.files += %w( src/core/lib/security/credentials/iam/iam_credentials.cc )
   s.files += %w( src/core/lib/security/credentials/iam/iam_credentials.h )
+  s.files += %w( src/core/lib/security/credentials/insecure/insecure_credentials.cc )
   s.files += %w( src/core/lib/security/credentials/jwt/json_token.cc )
   s.files += %w( src/core/lib/security/credentials/jwt/json_token.h )
   s.files += %w( src/core/lib/security/credentials/jwt/jwt_credentials.cc )
@@ -840,6 +1014,8 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/lib/security/credentials/ssl/ssl_credentials.h )
   s.files += %w( src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc )
   s.files += %w( src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h )
+  s.files += %w( src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc )
+  s.files += %w( src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h )
   s.files += %w( src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc )
   s.files += %w( src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h )
   s.files += %w( src/core/lib/security/credentials/tls/tls_credentials.cc )
@@ -850,6 +1026,8 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/lib/security/security_connector/alts/alts_security_connector.h )
   s.files += %w( src/core/lib/security/security_connector/fake/fake_security_connector.cc )
   s.files += %w( src/core/lib/security/security_connector/fake/fake_security_connector.h )
+  s.files += %w( src/core/lib/security/security_connector/insecure/insecure_security_connector.cc )
+  s.files += %w( src/core/lib/security/security_connector/insecure/insecure_security_connector.h )
   s.files += %w( src/core/lib/security/security_connector/load_system_roots.h )
   s.files += %w( src/core/lib/security/security_connector/load_system_roots_fallback.cc )
   s.files += %w( src/core/lib/security/security_connector/load_system_roots_linux.cc )
@@ -1014,13 +1192,13 @@ Gem::Specification.new do |s|
   s.files += %w( third_party/abseil-cpp/absl/base/casts.h )
   s.files += %w( third_party/abseil-cpp/absl/base/config.h )
   s.files += %w( third_party/abseil-cpp/absl/base/const_init.h )
-  s.files += %w( third_party/abseil-cpp/absl/base/dynamic_annotations.cc )
   s.files += %w( third_party/abseil-cpp/absl/base/dynamic_annotations.h )
   s.files += %w( third_party/abseil-cpp/absl/base/internal/atomic_hook.h )
   s.files += %w( third_party/abseil-cpp/absl/base/internal/bits.h )
   s.files += %w( third_party/abseil-cpp/absl/base/internal/cycleclock.cc )
   s.files += %w( third_party/abseil-cpp/absl/base/internal/cycleclock.h )
   s.files += %w( third_party/abseil-cpp/absl/base/internal/direct_mmap.h )
+  s.files += %w( third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h )
   s.files += %w( third_party/abseil-cpp/absl/base/internal/endian.h )
   s.files += %w( third_party/abseil-cpp/absl/base/internal/errno_saver.h )
   s.files += %w( third_party/abseil-cpp/absl/base/internal/exponential_biased.cc )
@@ -1101,10 +1279,13 @@ Gem::Specification.new do |s|
   s.files += %w( third_party/abseil-cpp/absl/debugging/stacktrace.h )
   s.files += %w( third_party/abseil-cpp/absl/debugging/symbolize.cc )
   s.files += %w( third_party/abseil-cpp/absl/debugging/symbolize.h )
+  s.files += %w( third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc )
   s.files += %w( third_party/abseil-cpp/absl/debugging/symbolize_elf.inc )
   s.files += %w( third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc )
   s.files += %w( third_party/abseil-cpp/absl/debugging/symbolize_win32.inc )
+  s.files += %w( third_party/abseil-cpp/absl/functional/bind_front.h )
   s.files += %w( third_party/abseil-cpp/absl/functional/function_ref.h )
+  s.files += %w( third_party/abseil-cpp/absl/functional/internal/front_binder.h )
   s.files += %w( third_party/abseil-cpp/absl/functional/internal/function_ref.h )
   s.files += %w( third_party/abseil-cpp/absl/hash/hash.h )
   s.files += %w( third_party/abseil-cpp/absl/hash/internal/city.cc )
@@ -1117,6 +1298,7 @@ Gem::Specification.new do |s|
   s.files += %w( third_party/abseil-cpp/absl/numeric/int128.h )
   s.files += %w( third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc )
   s.files += %w( third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc )
+  s.files += %w( third_party/abseil-cpp/absl/status/internal/status_internal.h )
   s.files += %w( third_party/abseil-cpp/absl/status/status.cc )
   s.files += %w( third_party/abseil-cpp/absl/status/status.h )
   s.files += %w( third_party/abseil-cpp/absl/status/status_payload_printer.cc )
@@ -1506,6 +1688,7 @@ Gem::Specification.new do |s|
   s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h )
   s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c )
   s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c )
+  s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c )
   s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c )
   s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c )
   s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c )
@@ -1837,6 +2020,9 @@ Gem::Specification.new do |s|
   s.files += %w( third_party/re2/util/util.h )
   s.files += %w( third_party/upb/upb/decode.c )
   s.files += %w( third_party/upb/upb/decode.h )
+  s.files += %w( third_party/upb/upb/def.c )
+  s.files += %w( third_party/upb/upb/def.h )
+  s.files += %w( third_party/upb/upb/def.hpp )
   s.files += %w( third_party/upb/upb/encode.c )
   s.files += %w( third_party/upb/upb/encode.h )
   s.files += %w( third_party/upb/upb/msg.c )
@@ -1844,8 +2030,12 @@ Gem::Specification.new do |s|
   s.files += %w( third_party/upb/upb/port.c )
   s.files += %w( third_party/upb/upb/port_def.inc )
   s.files += %w( third_party/upb/upb/port_undef.inc )
+  s.files += %w( third_party/upb/upb/reflection.c )
+  s.files += %w( third_party/upb/upb/reflection.h )
   s.files += %w( third_party/upb/upb/table.c )
   s.files += %w( third_party/upb/upb/table.int.h )
+  s.files += %w( third_party/upb/upb/text_encode.c )
+  s.files += %w( third_party/upb/upb/text_encode.h )
   s.files += %w( third_party/upb/upb/upb.c )
   s.files += %w( third_party/upb/upb/upb.h )
   s.files += %w( third_party/upb/upb/upb.hpp )
index d200368..7a8ad7c 100644 (file)
--- a/grpc.gyp
+++ b/grpc.gyp
   },
   'target_defaults': {
     'configurations': {
-      'Release': {
+      'Debug': {
         'cflags': [
-          '-O2',
-          '-Wframe-larger-than=16384',
+          '-O0',
         ],
         'defines': [
-          'NDEBUG',
+          '_DEBUG',
+          'DEBUG',
         ],
       },
-      'Debug': {
+      'Release': {
         'cflags': [
-          '-O0',
+          '-O2',
+          '-Wframe-larger-than=16384',
         ],
         'defines': [
-          '_DEBUG',
-          'DEBUG',
+          'NDEBUG',
         ],
       },
     },
       'target_name': 'gpr',
       'type': 'static_library',
       'dependencies': [
+        'absl/types:optional',
         'absl/time:time',
         'absl/synchronization:synchronization',
         'absl/strings:strings',
         'absl/strings:str_format',
+        'absl/status:status',
         'absl/memory:memory',
         'absl/base:base',
       ],
         'src/core/lib/gpr/tmpfile_windows.cc',
         'src/core/lib/gpr/wrap_memcpy.cc',
         'src/core/lib/gprpp/arena.cc',
+        'src/core/lib/gprpp/examine_stack.cc',
         'src/core/lib/gprpp/fork.cc',
         'src/core/lib/gprpp/global_config_env.cc',
         'src/core/lib/gprpp/host_port.cc',
         'src/core/lib/gprpp/mpscq.cc',
+        'src/core/lib/gprpp/stat_posix.cc',
+        'src/core/lib/gprpp/stat_windows.cc',
         'src/core/lib/gprpp/thd_posix.cc',
         'src/core/lib/gprpp/thd_windows.cc',
         'src/core/lib/profiling/basic_timers.cc',
         'absl/types:optional',
         'absl/strings:strings',
         'absl/status:status',
+        'absl/functional:bind_front',
         'absl/container:inlined_vector',
         'absl/container:flat_hash_set',
       ],
         'src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc',
         'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc',
         'src/core/ext/filters/client_channel/lb_policy/xds/eds.cc',
-        'src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc',
+        'src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc',
         'src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc',
         'src/core/ext/filters/client_channel/lb_policy_registry.cc',
         'src/core/ext/filters/client_channel/local_subchannel_pool.cc',
         'src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c',
         'src/core/ext/upb-generated/google/api/http.upb.c',
         'src/core/ext/upb-generated/google/protobuf/any.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c',
         'src/core/ext/upb-generated/google/protobuf/duration.upb.c',
         'src/core/ext/upb-generated/google/protobuf/empty.upb.c',
         'src/core/ext/upb-generated/google/protobuf/struct.upb.c',
         'src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c',
         'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c',
         'src/core/ext/upb-generated/validate/validate.upb.c',
+        'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c',
+        'src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/api/http.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c',
+        'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c',
+        'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c',
+        'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c',
+        'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c',
+        'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c',
+        'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c',
+        'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c',
+        'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c',
+        'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c',
+        'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c',
+        'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c',
+        'src/core/ext/upbdefs-generated/validate/validate.upbdefs.c',
         'src/core/ext/xds/certificate_provider_registry.cc',
+        'src/core/ext/xds/certificate_provider_store.cc',
+        'src/core/ext/xds/file_watcher_certificate_provider_factory.cc',
         'src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc',
         'src/core/ext/xds/xds_api.cc',
         'src/core/ext/xds/xds_bootstrap.cc',
+        'src/core/ext/xds/xds_certificate_provider.cc',
         'src/core/ext/xds/xds_client.cc',
         'src/core/ext/xds/xds_client_stats.cc',
         'src/core/lib/avl/avl.cc',
         'src/core/lib/security/credentials/composite/composite_credentials.cc',
         'src/core/lib/security/credentials/credentials.cc',
         'src/core/lib/security/credentials/credentials_metadata.cc',
+        'src/core/lib/security/credentials/external/aws_request_signer.cc',
+        'src/core/lib/security/credentials/external/external_account_credentials.cc',
+        'src/core/lib/security/credentials/external/file_external_account_credentials.cc',
+        'src/core/lib/security/credentials/external/url_external_account_credentials.cc',
         'src/core/lib/security/credentials/fake/fake_credentials.cc',
         'src/core/lib/security/credentials/google_default/credentials_generic.cc',
         'src/core/lib/security/credentials/google_default/google_default_credentials.cc',
         'src/core/lib/security/credentials/iam/iam_credentials.cc',
+        'src/core/lib/security/credentials/insecure/insecure_credentials.cc',
         'src/core/lib/security/credentials/jwt/json_token.cc',
         'src/core/lib/security/credentials/jwt/jwt_credentials.cc',
         'src/core/lib/security/credentials/jwt/jwt_verifier.cc',
         'src/core/lib/security/credentials/plugin/plugin_credentials.cc',
         'src/core/lib/security/credentials/ssl/ssl_credentials.cc',
         'src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc',
+        'src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc',
         'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc',
         'src/core/lib/security/credentials/tls/tls_credentials.cc',
         'src/core/lib/security/credentials/xds/xds_credentials.cc',
         'src/core/lib/security/security_connector/alts/alts_security_connector.cc',
         'src/core/lib/security/security_connector/fake/fake_security_connector.cc',
+        'src/core/lib/security/security_connector/insecure/insecure_security_connector.cc',
         'src/core/lib/security/security_connector/load_system_roots_fallback.cc',
         'src/core/lib/security/security_connector/load_system_roots_linux.cc',
         'src/core/lib/security/security_connector/local/local_security_connector.cc',
         'test/core/util/cmdline.cc',
         'test/core/util/debugger_macros.cc',
         'test/core/util/eval_args_mock_endpoint.cc',
-        'test/core/util/examine_stack.cc',
         'test/core/util/fuzzer_util.cc',
         'test/core/util/grpc_profiler.cc',
         'test/core/util/histogram.cc',
         'test/core/util/port_isolated_runtime_environment.cc',
         'test/core/util/port_server_client.cc',
         'test/core/util/reconnect_server.cc',
+        'test/core/util/resolve_localhost_ip46.cc',
         'test/core/util/slice_splitter.cc',
+        'test/core/util/stack_tracer.cc',
         'test/core/util/subprocess_posix.cc',
         'test/core/util/subprocess_windows.cc',
         'test/core/util/test_config.cc',
         'test/core/util/cmdline.cc',
         'test/core/util/debugger_macros.cc',
         'test/core/util/eval_args_mock_endpoint.cc',
-        'test/core/util/examine_stack.cc',
         'test/core/util/fuzzer_util.cc',
         'test/core/util/grpc_profiler.cc',
         'test/core/util/histogram.cc',
         'test/core/util/port_isolated_runtime_environment.cc',
         'test/core/util/port_server_client.cc',
         'test/core/util/reconnect_server.cc',
+        'test/core/util/resolve_localhost_ip46.cc',
         'test/core/util/slice_splitter.cc',
+        'test/core/util/stack_tracer.cc',
         'test/core/util/subprocess_posix.cc',
         'test/core/util/subprocess_windows.cc',
         'test/core/util/test_config.cc',
         'src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c',
         'src/core/ext/upb-generated/google/api/http.upb.c',
         'src/core/ext/upb-generated/google/protobuf/any.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c',
         'src/core/ext/upb-generated/google/protobuf/duration.upb.c',
         'src/core/ext/upb-generated/google/protobuf/empty.upb.c',
         'src/core/ext/upb-generated/google/protobuf/struct.upb.c',
         'src/cpp/client/credentials_cc.cc',
         'src/cpp/client/insecure_credentials.cc',
         'src/cpp/client/secure_credentials.cc',
+        'src/cpp/client/xds_credentials.cc',
         'src/cpp/codegen/codegen_init.cc',
         'src/cpp/common/alarm.cc',
         'src/cpp/common/auth_property_iterator.cc',
         'src/cpp/common/secure_auth_context.cc',
         'src/cpp/common/secure_channel_arguments.cc',
         'src/cpp/common/secure_create_auth_context.cc',
+        'src/cpp/common/tls_certificate_provider.cc',
         'src/cpp/common/tls_credentials_options.cc',
         'src/cpp/common/tls_credentials_options_util.cc',
         'src/cpp/common/validate_service_config.cc',
       'type': 'static_library',
       'dependencies': [
         'gpr',
+        'absl/flags:parse',
       ],
       'sources': [
         'test/cpp/util/test_config_cc.cc',
         'gpr',
         'address_sorting',
         'upb',
+        'absl/flags:flag',
       ],
       'sources': [
         'test/core/end2end/data/client_certs.cc',
         'third_party/boringssl-with-bazel/src/crypto/thread_win.c',
         'third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c',
         'third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c',
+        'third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c',
         'third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c',
         'third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c',
         'third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c',
         'third_party/upb/upb/port.c',
         'third_party/upb/upb/table.c',
         'third_party/upb/upb/upb.c',
+        'third_party/upb/upb/def.c',
+        'third_party/upb/upb/reflection.c',
+        'third_party/upb/upb/text_encode.c',
+        'src/core/ext/upb-generated/google/protobuf/any.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/duration.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/empty.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/struct.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c',
+        'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c',
       ],
     },
     {
index bbb6ed6..020acdb 100644 (file)
@@ -86,8 +86,7 @@ GRPCAPI void grpc_shutdown(void);
     https://github.com/grpc/grpc/issues/15334 */
 GRPCAPI int grpc_is_initialized(void);
 
-/** EXPERIMENTAL. Blocking shut down grpc library.
-    This is only for wrapped language to use now. */
+/** DEPRECATED. Recommend to use grpc_shutdown only */
 GRPCAPI void grpc_shutdown_blocking(void);
 
 /** Return a string representing the current version of grpc */
index 1810681..12f39ec 100644 (file)
@@ -743,183 +743,156 @@ GRPCAPI grpc_server_credentials* grpc_local_server_credentials_create(
  *  experimental purpose for now and subject to change. */
 typedef struct grpc_tls_error_details grpc_tls_error_details;
 
-/** Config for TLS key materials. It is used for
- *  experimental purpose for now and subject to change. */
-typedef struct grpc_tls_key_materials_config grpc_tls_key_materials_config;
-
-/** Config for TLS credential reload. It is used for
- *  experimental purpose for now and subject to change. */
-typedef struct grpc_tls_credential_reload_config
-    grpc_tls_credential_reload_config;
-
 /** Config for TLS server authorization check. It is used for
  *  experimental purpose for now and subject to change. */
 typedef struct grpc_tls_server_authorization_check_config
     grpc_tls_server_authorization_check_config;
 
-/** TLS credentials options. It is used for
- *  experimental purpose for now and subject to change. */
+/**
+ * A struct that can be specified by callers to configure underlying TLS
+ * behaviors. It is used for experimental purpose for now and subject to change.
+ */
 typedef struct grpc_tls_credentials_options grpc_tls_credentials_options;
 
-/** Create an empty TLS credentials options. It is used for
- *  experimental purpose for now and subject to change. */
+/**
+ * A struct provides ways to gain credential data that will be used in the TLS
+ * handshake. It is used for experimental purpose for now and subject to change.
+ */
+typedef struct grpc_tls_certificate_provider grpc_tls_certificate_provider;
+
+/**
+ * A struct that stores the credential data presented to the peer in handshake
+ * to show local identity. It is used for experimental purpose for now and
+ * subject to change.
+ */
+typedef struct grpc_tls_identity_pairs grpc_tls_identity_pairs;
+
+/**
+ * Creates a grpc_tls_identity_pairs that stores a list of identity credential
+ * data, including identity private key and identity certificate chain. It is
+ * used for experimental purpose for now and subject to change.
+ */
+GRPCAPI grpc_tls_identity_pairs* grpc_tls_identity_pairs_create();
+
+/**
+ * Adds a identity private key and a identity certificate chain to
+ * grpc_tls_identity_pairs. This function will make an internal copy of
+ * |private_key| and |cert_chain|. It is used for experimental purpose for now
+ * and subject to change.
+ */
+GRPCAPI void grpc_tls_identity_pairs_add_pair(grpc_tls_identity_pairs* pairs,
+                                              const char* private_key,
+                                              const char* cert_chain);
+
+/**
+ * Destroys a grpc_tls_identity_pairs object. If this object is passed to a
+ * provider initiation function, the ownership is transferred so this function
+ * doesn't need to be called. Otherwise the creator of the
+ * grpc_tls_identity_pairs object is responsible for its destruction. It is
+ * used for experimental purpose for now and subject to change.
+ */
+GRPCAPI void grpc_tls_identity_pairs_destroy(grpc_tls_identity_pairs* pairs);
+
+/**
+ * Creates a grpc_tls_certificate_provider that will load credential data from
+ * static string during initialization. This provider will always return the
+ * same cert data for all cert names.
+ * root_certificate and pem_key_cert_pairs can be nullptr, indicating the
+ * corresponding credential data is not needed.
+ * This function will make a copy of |root_certificate|.
+ * The ownership of |pem_key_cert_pairs| is transferred.
+ * It is used for experimental purpose for now and subject to change.
+ */
+GRPCAPI grpc_tls_certificate_provider*
+grpc_tls_certificate_provider_static_data_create(
+    const char* root_certificate, grpc_tls_identity_pairs* pem_key_cert_pairs);
+
+/**
+ * Releases a grpc_tls_certificate_provider object. The creator of the
+ * grpc_tls_certificate_provider object is responsible for its release. It is
+ * used for experimental purpose for now and subject to change.
+ */
+GRPCAPI void grpc_tls_certificate_provider_release(
+    grpc_tls_certificate_provider* provider);
+
+/**
+ * Creates an grpc_tls_credentials_options.
+ * It is used for experimental purpose for now and subject to change.
+ */
 GRPCAPI grpc_tls_credentials_options* grpc_tls_credentials_options_create(void);
 
-/** Set grpc_ssl_client_certificate_request_type field in credentials options
-    with the provided type. options should not be NULL.
-    It returns 1 on success and 0 on failure. It is used for
-    experimental purpose for now and subject to change. */
-GRPCAPI int grpc_tls_credentials_options_set_cert_request_type(
+/**
+ * Sets the options of whether to request and verify client certs. This should
+ * be called only on the server side. It returns 1 on success and 0 on failure.
+ * It is used for experimental purpose for now and subject to change.
+ */
+GRPCAPI void grpc_tls_credentials_options_set_cert_request_type(
     grpc_tls_credentials_options* options,
     grpc_ssl_client_certificate_request_type type);
 
-/** Set grpc_tls_server_verification_option field in credentials options
-    with the provided server_verification_option. options should not be NULL.
-    This should be called only on the client side.
-    If grpc_tls_server_verification_option is not
-    GRPC_TLS_SERVER_VERIFICATION, use of a customer server
-    authorization check (grpc_tls_server_authorization_check_config)
-    will be mandatory.
-    It returns 1 on success and 0 on failure. It is used for
-    experimental purpose for now and subject to change. */
-GRPCAPI int grpc_tls_credentials_options_set_server_verification_option(
+/**
+ * Sets the options of whether to choose certain checks, e.g. certificate check,
+ * hostname check, etc. This should be called only on the client side. If
+ * |server_verification_option| is not GRPC_TLS_SERVER_VERIFICATION, use of a
+ * custom authorization check (grpc_tls_server_authorization_check_config) is
+ * mandatory. It returns 1 on success and 0 on failure. It is used for
+ * experimental purpose for now and subject to change.
+ */
+GRPCAPI void grpc_tls_credentials_options_set_server_verification_option(
     grpc_tls_credentials_options* options,
     grpc_tls_server_verification_option server_verification_option);
 
-/** Set grpc_tls_key_materials_config field in credentials options
-    with the provided config struct whose ownership is transferred.
-    Both parameters should not be NULL.
-    It returns 1 on success and 0 on failure. It is used for
-    experimental purpose for now and subject to change. */
-GRPCAPI int grpc_tls_credentials_options_set_key_materials_config(
-    grpc_tls_credentials_options* options,
-    grpc_tls_key_materials_config* config);
-
-/** Set grpc_tls_credential_reload_config field in credentials options
-    with the provided config struct whose ownership is transferred.
-    Both parameters should not be NULL.
-    It returns 1 on success and 0 on failure. It is used for
-    experimental purpose for now and subject to change. */
-GRPCAPI int grpc_tls_credentials_options_set_credential_reload_config(
-    grpc_tls_credentials_options* options,
-    grpc_tls_credential_reload_config* config);
-
-/** Set grpc_tls_server_authorization_check_config field in credentials options
-    with the provided config struct whose ownership is transferred.
-    Both parameters should not be NULL.
-    It returns 1 on success and 0 on failure. It is used for
-    experimental purpose for now and subject to change. */
-GRPCAPI int grpc_tls_credentials_options_set_server_authorization_check_config(
+/**
+ * Sets the credential provider in the options.
+ * The |options| will implicitly take a new ref to the |provider|.
+ * It returns 1 on success and 0 on failure.
+ * It is used for experimental purpose for now and subject to change.
+ */
+GRPCAPI void grpc_tls_credentials_options_set_certificate_provider(
     grpc_tls_credentials_options* options,
-    grpc_tls_server_authorization_check_config* config);
+    grpc_tls_certificate_provider* provider);
 
-/** --- TLS key materials config. ---
-    It is used for experimental purpose for now and subject to change. */
+/**
+ * If set, gRPC stack will keep watching the root certificates with
+ * name |root_cert_name|. It returns 1 on success and 0 on failure. It is used
+ * for experimental purpose for now and subject to change.
+ */
+GRPCAPI void grpc_tls_credentials_options_watch_root_certs(
+    grpc_tls_credentials_options* options);
 
-/** Create an empty grpc_tls_key_materials_config instance.
- *  It is used for experimental purpose for now and subject to change. */
-GRPCAPI grpc_tls_key_materials_config* grpc_tls_key_materials_config_create(
-    void);
-
-/** Set grpc_tls_key_materials_config instance with provided a TLS certificate.
-    It's valid for the caller to provide nullptr pem_root_certs, in which case
-    the gRPC-provided root cert will be used. pem_key_cert_pairs should not be
-    NULL.
-    The ownerships of |pem_root_certs| and |pem_key_cert_pairs| remain with the
-    caller.
-    It returns 1 on success and 0 on failure. It is used for experimental
-    purpose for now and subject to change.
+/**
+ * Sets the name of the root certificates being watched.
+ * If not set, We will use a default empty string as the root certificate name.
+ * It is used for experimental purpose for now and subject to change.
  */
-GRPCAPI int grpc_tls_key_materials_config_set_key_materials(
-    grpc_tls_key_materials_config* config, const char* pem_root_certs,
-    const grpc_ssl_pem_key_cert_pair** pem_key_cert_pairs,
-    size_t num_key_cert_pairs);
+GRPCAPI void grpc_tls_credentials_options_set_root_cert_name(
+    grpc_tls_credentials_options* options, const char* root_cert_name);
 
-/** Set grpc_tls_key_materials_config instance with a provided version number,
-    which is used to keep track of the version of key materials.
-    It returns 1 on success and 0 on failure. It is used for
   experimental purpose for now and subject to change.
+/**
+ * If set, gRPC stack will keep watching the identity key-cert pairs
+ * with name |identity_cert_name|. It returns 1 on success and 0 on failure. It
* is used for experimental purpose for now and subject to change.
  */
-GRPCAPI int grpc_tls_key_materials_config_set_version(
-    grpc_tls_key_materials_config* config, int version);
+GRPCAPI void grpc_tls_credentials_options_watch_identity_key_cert_pairs(
+    grpc_tls_credentials_options* options);
 
-/** Get the version number of a grpc_tls_key_materials_config instance.
-    It returns the version number on success and -1 on failure.
-    It is used for experimental purpose for now and subject to change.
+/**
+ * Sets the name of the identity certificates being watched.
+ * If not set, We will use a default empty string as the identity certificate
+ * name. It is used for experimental purpose for now and subject to change.
  */
-GRPCAPI int grpc_tls_key_materials_config_get_version(
-    grpc_tls_key_materials_config* config);
-
-/** --- TLS credential reload config. ---
-    It is used for experimental purpose for now and subject to change.*/
-
-typedef struct grpc_tls_credential_reload_arg grpc_tls_credential_reload_arg;
-
-/** A callback function provided by gRPC to handle the result of credential
-    reload. It is used when schedule API is implemented asynchronously and
-    serves to bring the control back to grpc C core. It is used for
-    experimental purpose for now and subject to change. */
-typedef void (*grpc_tls_on_credential_reload_done_cb)(
-    grpc_tls_credential_reload_arg* arg);
-
-/** A struct containing all information necessary to schedule/cancel a
-    credential reload request.
-    - cb and cb_user_data represent a gRPC-provided
-      callback and an argument passed to it.
-    - key_materials_config is an in/output parameter containing currently
-      used/newly reloaded credentials. If credential reload does not result in
-      a new credential, key_materials_config should not be modified. The same
-      key_materials_config object can be updated if new key materials is
-      available.
-    - status and error_details are used to hold information about
-      errors occurred when a credential reload request is scheduled/cancelled.
-    - config is a pointer to the unique grpc_tls_credential_reload_config
-      instance that this argument corresponds to.
-    - context is a pointer to a wrapped language implementation of this
-      grpc_tls_credential_reload_arg instance.
-    - destroy_context is a pointer to a caller-provided method that cleans
-      up any data associated with the context pointer.
-    It is used for experimental purposes for now and subject to change.
-*/
-struct grpc_tls_credential_reload_arg {
-  grpc_tls_on_credential_reload_done_cb cb;
-  void* cb_user_data;
-  grpc_tls_key_materials_config* key_materials_config;
-  grpc_ssl_certificate_config_reload_status status;
-  grpc_tls_error_details* error_details;
-  grpc_tls_credential_reload_config* config;
-  void* context;
-  void (*destroy_context)(void* ctx);
-};
+GRPCAPI void grpc_tls_credentials_options_set_identity_cert_name(
+    grpc_tls_credentials_options* options, const char* identity_cert_name);
 
-/** Create a grpc_tls_credential_reload_config instance.
-    - config_user_data is config-specific, read-only user data
-      that works for all channels created with a credential using the config.
-    - schedule is a pointer to an application-provided callback used to invoke
-      credential reload API. The implementation of this method has to be
-      non-blocking, but can be performed synchronously or asynchronously.
-      1) If processing occurs synchronously, it populates
-      arg->key_materials_config, arg->status, and arg->error_details
-      and returns zero.
-      2) If processing occurs asynchronously, it returns a non-zero value.
-      The application then invokes arg->cb when processing is completed. Note
-      that arg->cb cannot be invoked before schedule API returns.
-    - cancel is a pointer to an application-provided callback used to cancel
-      a credential reload request scheduled via an asynchronous schedule API.
-      arg is used to pinpoint an exact reloading request to be cancelled.
-      The operation may not have any effect if the request has already been
-      processed.
-    - destruct is a pointer to an application-provided callback used to clean up
-      any data associated with the config.
-    It is used for experimental purpose for now and subject to change.
-*/
-GRPCAPI grpc_tls_credential_reload_config*
-grpc_tls_credential_reload_config_create(
-    const void* config_user_data,
-    int (*schedule)(void* config_user_data,
-                    grpc_tls_credential_reload_arg* arg),
-    void (*cancel)(void* config_user_data, grpc_tls_credential_reload_arg* arg),
-    void (*destruct)(void* config_user_data));
+/**
+ * Sets the configuration for a custom authorization check performed at the end
+ * of the handshake. The |options| will implicitly take a new ref to the
+ * |config|. It returns 1 on success and 0 on failure. It is used for
+ * experimental purpose for now and subject to change.
+ */
+GRPCAPI void grpc_tls_credentials_options_set_server_authorization_check_config(
+    grpc_tls_credentials_options* options,
+    grpc_tls_server_authorization_check_config* config);
 
 /** --- TLS server authorization check config. ---
  *  It is used for experimental purpose for now and subject to change. */
@@ -1000,31 +973,28 @@ grpc_tls_server_authorization_check_config_create(
     void (*destruct)(void* config_user_data));
 
 /**
- * This method creates a TLS channel credential object.
- * It takes ownership of the options parameter. The security level
- * of the resulting connection is GRPC_PRIVACY_AND_INTEGRITY.
- *
- * - options: grpc TLS credentials options instance.
- *
- * It returns the created credential object.
- *
- * It is used for experimental purpose for now and subject
- * to change.
+ * Releases a grpc_tls_server_authorization_check_config object. The creator of
+ * the grpc_tls_server_authorization_check_config object is responsible for its
+ * release. It is used for experimental purpose for now and subject to change.
  */
+GRPCAPI void grpc_tls_server_authorization_check_config_release(
+    grpc_tls_server_authorization_check_config* config);
 
+/**
+ * Creates a TLS channel credential object based on the
+ * grpc_tls_credentials_options specified by callers. The
+ * grpc_channel_credentials will take the ownership of the |options|. The
+ * security level of the resulting connection is GRPC_PRIVACY_AND_INTEGRITY. It
+ * is used for experimental purpose for now and subject to change.
+ */
 grpc_channel_credentials* grpc_tls_credentials_create(
     grpc_tls_credentials_options* options);
 
 /**
- * This method creates a TLS server credential object.
- * It takes ownership of the options parameter.
- *
- * - options: grpc TLS credentials options instance.
- *
- * It returns the created credential object.
- *
- * It is used for experimental purpose for now and subject
- * to change.
+ * Creates a TLS server credential object based on the
+ * grpc_tls_credentials_options specified by callers. The
+ * grpc_server_credentials will take the ownership of the |options|. It
+ * is used for experimental purpose for now and subject to change.
  */
 grpc_server_credentials* grpc_tls_server_credentials_create(
     grpc_tls_credentials_options* options);
@@ -1032,6 +1002,13 @@ grpc_server_credentials* grpc_tls_server_credentials_create(
 /**
  * EXPERIMENTAL API - Subject to change
  *
+ * This method creates an insecure channel credentials object.
+ */
+grpc_channel_credentials* grpc_insecure_credentials_create();
+
+/**
+ * EXPERIMENTAL API - Subject to change
+ *
  * This method creates an XDS channel credentials object.
  *
  * Creating a channel with credentials of this type indicates that an xDS
index 07066f0..379a50f 100644 (file)
@@ -202,8 +202,15 @@ typedef struct {
 #define GRPC_ARG_HTTP2_MAX_FRAME_SIZE "grpc.http2.max_frame_size"
 /** Should BDP probing be performed? */
 #define GRPC_ARG_HTTP2_BDP_PROBE "grpc.http2.bdp_probe"
-/** Minimum time between sending successive ping frames without receiving any
-    data/header frame, Int valued, milliseconds. */
+/** (DEPRECATED) Does not have any effect.
+    Earlier, this arg configured the minimum time between successive ping frames
+    without receiving any data/header frame, Int valued, milliseconds. This put
+    unnecessary constraints on the configuration of keepalive pings,
+    requiring users to set this channel arg along with
+    GRPC_ARG_KEEPALIVE_TIME_MS. This arg also limited the activity of the other
+    source of pings in gRPC Core - BDP pings, but BDP pings are only sent when
+    there is receive-side data activity, making this arg unuseful for BDP pings
+    too.  */
 #define GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS \
   "grpc.http2.min_time_between_pings_ms"
 /** Minimum allowed time between a server receiving successive ping frames
index 33f8a1a..c1bada1 100644 (file)
 #define GPR_WINDOWS_TMPFILE
 #define GPR_WINDOWS_LOG
 #define GPR_WINDOWS_CRASH_HANDLER 1
+#define GPR_WINDOWS_STAT
 #define GPR_WINDOWS_STRING
 #define GPR_WINDOWS_TIME
 #endif
 #ifdef __GNUC__
 #define GPR_GCC_ATOMIC 1
-#define GPR_GCC_TLS 1
 #else
 #define GPR_WINDOWS_ATOMIC 1
-#define GPR_MSVC_TLS 1
 #endif
+#define GPR_STDCPP_TLS 1
 #elif defined(ANDROID) || defined(__ANDROID__)
 #define GPR_PLATFORM_STRING "android"
 #define GPR_ANDROID 1
 #endif /* _LP64 */
 #define GPR_CPU_POSIX 1
 #define GPR_GCC_SYNC 1
-#define GPR_GCC_TLS 1
+#define GPR_STDCPP_TLS 1
 #define GPR_POSIX_ENV 1
 #define GPR_POSIX_TMPFILE 1
+#define GPR_POSIX_STAT 1
 #define GPR_ANDROID_LOG 1
 #define GPR_POSIX_STRING 1
 #define GPR_POSIX_SUBPROCESS 1
 #include <features.h>
 #define GPR_CPU_LINUX 1
 #define GPR_GCC_ATOMIC 1
-#define GPR_GCC_TLS 1
+#define GPR_STDCPP_TLS 1
 #define GPR_LINUX 1
 #define GPR_LINUX_LOG
 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
 #define GPR_LINUX_ENV 1
 #define GPR_POSIX_TMPFILE 1
+#define GPR_POSIX_STAT 1
 #define GPR_POSIX_STRING 1
 #define GPR_POSIX_SUBPROCESS 1
 #define GPR_POSIX_SYNC 1
 #if TARGET_OS_IPHONE
 #define GPR_PLATFORM_STRING "ios"
 #define GPR_CPU_IPHONE 1
-#define GPR_PTHREAD_TLS 1
 #define GRPC_CFSTREAM 1
 /* the c-ares resolver isn't safe to enable on iOS */
 #define GRPC_ARES 0
 #else /* TARGET_OS_IPHONE */
 #define GPR_PLATFORM_STRING "osx"
-#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
-#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7
-#define GPR_CPU_IPHONE 1
-#define GPR_PTHREAD_TLS 1
-#else /* __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7 */
 #define GPR_CPU_POSIX 1
-/* TODO(vjpai): there is a reported issue in bazel build for Mac where __thread
-   in a header is currently not working (bazelbuild/bazel#4341). Remove
-   the following conditional and use GPR_GCC_TLS when that is fixed */
-#ifndef GRPC_BAZEL_BUILD
-#define GPR_GCC_TLS 1
-#else /* GRPC_BAZEL_BUILD */
-#define GPR_PTHREAD_TLS 1
-#endif /* GRPC_BAZEL_BUILD */
-#define GPR_APPLE_PTHREAD_NAME 1
+#define GPR_POSIX_CRASH_HANDLER 1
 #endif
-#else /* __MAC_OS_X_VERSION_MIN_REQUIRED */
-#define GPR_CPU_POSIX 1
-/* TODO(vjpai): Remove the following conditional and use only GPR_GCC_TLS
-   when bazelbuild/bazel#4341 is fixed */
-#ifndef GRPC_BAZEL_BUILD
-#define GPR_GCC_TLS 1
-#else /* GRPC_BAZEL_BUILD */
-#define GPR_PTHREAD_TLS 1
-#endif /* GRPC_BAZEL_BUILD */
+#ifdef __has_feature
+#if __has_feature(cxx_thread_local)
+#define GPR_STDCPP_TLS 1
 #endif
-#define GPR_POSIX_CRASH_HANDLER 1
+#endif
+#ifndef GPR_STDCPP_TLS
+#define GPR_PTHREAD_TLS 1
 #endif
 #define GPR_APPLE 1
 #define GPR_GCC_ATOMIC 1
 #define GPR_POSIX_LOG 1
 #define GPR_POSIX_ENV 1
 #define GPR_POSIX_TMPFILE 1
+#define GPR_POSIX_STAT 1
 #define GPR_POSIX_STRING 1
 #define GPR_POSIX_SUBPROCESS 1
 #define GPR_POSIX_SYNC 1
 #define GPR_POSIX_LOG 1
 #define GPR_POSIX_ENV 1
 #define GPR_POSIX_TMPFILE 1
+#define GPR_POSIX_STAT 1
 #define GPR_POSIX_STRING 1
 #define GPR_POSIX_SUBPROCESS 1
 #define GPR_POSIX_SYNC 1
 #define GPR_POSIX_LOG 1
 #define GPR_POSIX_ENV 1
 #define GPR_POSIX_TMPFILE 1
+#define GPR_POSIX_STAT 1
 #define GPR_POSIX_STRING 1
 #define GPR_POSIX_SUBPROCESS 1
 #define GPR_POSIX_SYNC 1
 #define GPR_POSIX_LOG 1
 #define GPR_POSIX_ENV 1
 #define GPR_POSIX_TMPFILE 1
+#define GPR_POSIX_STAT 1
 #define GPR_POSIX_STRING 1
 #define GPR_POSIX_SUBPROCESS 1
 #define GPR_POSIX_SYNC 1
 #define GPR_POSIX_LOG 1
 #define GPR_POSIX_ENV 1
 #define GPR_POSIX_TMPFILE 1
+#define GPR_POSIX_STAT 1
 #define GPR_POSIX_STRING 1
 #define GPR_POSIX_SUBPROCESS 1
 #define GPR_POSIX_SYNC 1
 #define GPR_POSIX_LOG 1
 #define GPR_POSIX_ENV 1
 #define GPR_POSIX_TMPFILE 1
+#define GPR_POSIX_STAT 1
 #define GPR_POSIX_STRING 1
 #define GPR_POSIX_SUBPROCESS 1
 #define GPR_POSIX_SYNC 1
 #define GPR_POSIX_SYNC 1
 #define GPR_POSIX_ENV 1
 #define GPR_POSIX_TMPFILE 1
+#define GPR_POSIX_STAT 1
 #define GPR_POSIX_SUBPROCESS 1
 #define GPR_POSIX_SYNC 1
 #define GPR_POSIX_STRING 1
 #endif
 #endif
 
-/*
- *  There are platforms for which TLS should not be used even though the
- * compiler makes it seem like it's supported (Android NDK < r12b for example).
- * This is primarily because of linker problems and toolchain misconfiguration:
- * TLS isn't supported until NDK r12b per
- * https://developer.android.com/ndk/downloads/revision_history.html
- * TLS also does not work with Android NDK if GCC is being used as the compiler
- * instead of Clang.
- * Since NDK r16, `__NDK_MAJOR__` and `__NDK_MINOR__` are defined in
- * <android/ndk-version.h>. For NDK < r16, users should define these macros,
- * e.g. `-D__NDK_MAJOR__=11 -D__NKD_MINOR__=0` for NDK r11. */
-#if defined(__ANDROID__) && defined(GPR_GCC_TLS)
-#if __has_include(<android/ndk-version.h>)
-#include <android/ndk-version.h>
-#endif /* __has_include(<android/ndk-version.h>) */
-#if (defined(__clang__) && defined(__NDK_MAJOR__) && defined(__NDK_MINOR__) && \
-     ((__NDK_MAJOR__ < 12) ||                                                  \
-      ((__NDK_MAJOR__ == 12) && (__NDK_MINOR__ < 1)))) ||                      \
-    (defined(__GNUC__) && !defined(__clang__))
-#undef GPR_GCC_TLS
-#define GPR_PTHREAD_TLS 1
-#endif
-#endif /*defined(__ANDROID__) && defined(GPR_GCC_TLS) */
-
 #if defined(__has_include)
 #if __has_include(<atomic>)
 #define GRPC_HAS_CXX11_ATOMIC
@@ -525,9 +492,9 @@ typedef unsigned __int64 uint64_t;
 #endif
 
 #if defined(GPR_MSVC_TLS) + defined(GPR_GCC_TLS) + defined(GPR_PTHREAD_TLS) + \
-        defined(GPR_CUSTOM_TLS) !=                                            \
+        defined(GPR_STDCPP_TLS) + defined(GPR_CUSTOM_TLS) !=                  \
     1
-#error Must define exactly one of GPR_MSVC_TLS, GPR_GCC_TLS, GPR_PTHREAD_TLS, GPR_CUSTOM_TLS
+#error Must define exactly one of GPR_MSVC_TLS, GPR_GCC_TLS, GPR_PTHREAD_TLS, GPR_STDCPP_TLS, GPR_CUSTOM_TLS
 #endif
 
 /* maximum alignment needed for any type on this platform, rounded up to a
index e8c82b3..8c34330 100644 (file)
@@ -57,8 +57,8 @@ namespace experimental {
 std::shared_ptr<grpc::Channel>
 CreateCustomInsecureChannelWithInterceptorsFromFd(
     const std::string& target, int fd, const grpc::ChannelArguments& args,
-    std::unique_ptr<std::vector<
-        std::unique_ptr<grpc::experimental::ClientInterceptorFactoryInterface>>>
+    std::vector<
+        std::unique_ptr<grpc::experimental::ClientInterceptorFactoryInterface>>
         interceptor_creators);
 
 }  // namespace experimental
index 95cb93e..af3192d 100644 (file)
 #ifndef GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_H
 #define GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_H
 
-#include <grpcpp/ext/channelz_service_plugin_impl.h>
+#include <grpc/support/port_platform.h>
+
+#include <grpcpp/impl/server_builder_plugin.h>
+#include <grpcpp/impl/server_initializer.h>
+#include <grpcpp/support/config.h>
 
 namespace grpc {
 namespace channelz {
 namespace experimental {
 
-static inline void InitChannelzService() {
-  ::grpc_impl::channelz::experimental::InitChannelzService();
-}
+/// Add channelz server plugin to \a ServerBuilder. This function should
+/// be called at static initialization time. This service is experimental
+/// for now. Track progress in https://github.com/grpc/grpc/issues/15988.
+void InitChannelzService();
 
 }  // namespace experimental
 }  // namespace channelz
diff --git a/include/grpcpp/ext/channelz_service_plugin_impl.h b/include/grpcpp/ext/channelz_service_plugin_impl.h
deleted file mode 100644 (file)
index 3a5f3c4..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *
- * Copyright 2018 gRPC authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#ifndef GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_IMPL_H
-#define GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_IMPL_H
-
-#include <grpc/support/port_platform.h>
-
-#include <grpcpp/impl/server_builder_plugin.h>
-#include <grpcpp/impl/server_initializer.h>
-#include <grpcpp/support/config.h>
-
-namespace grpc_impl {
-namespace channelz {
-namespace experimental {
-
-/// Add channelz server plugin to \a ServerBuilder. This function should
-/// be called at static initialization time. This service is experimental
-/// for now. Track progress in https://github.com/grpc/grpc/issues/15988.
-void InitChannelzService();
-
-}  // namespace experimental
-}  // namespace channelz
-}  // namespace grpc_impl
-
-#endif  // GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_IMPL_H
index a113ee1..e4576af 100644 (file)
@@ -64,11 +64,11 @@ class TemplatedGenericStub final {
       ClientContext* context, const std::string& method,
       const RequestType& request, ::grpc::CompletionQueue* cq) {
     return std::unique_ptr<ClientAsyncResponseReader<ResponseType>>(
-        internal::ClientAsyncResponseReaderFactory<ResponseType>::Create(
+        internal::ClientAsyncResponseReaderHelper::Create<ResponseType>(
             channel_.get(), cq,
             grpc::internal::RpcMethod(method.c_str(),
                                       grpc::internal::RpcMethod::NORMAL_RPC),
-            context, request, false));
+            context, request));
   }
 
   /// DEPRECATED for multi-threaded use
index 3deeda8..7541fa3 100644 (file)
@@ -20,6 +20,8 @@
 #define GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_H
 
 #include <grpcpp/impl/codegen/call.h>
+#include <grpcpp/impl/codegen/call_op_set.h>
+#include <grpcpp/impl/codegen/call_op_set_interface.h>
 #include <grpcpp/impl/codegen/channel_interface.h>
 #include <grpcpp/impl/codegen/client_context.h>
 #include <grpcpp/impl/codegen/server_context.h>
 
 namespace grpc {
 
+// Forward declaration for use in Helper class
+template <class R>
+class ClientAsyncResponseReader;
+
 /// An interface relevant for async client side unary RPCs (which send
 /// one request message to a server and receive one response message).
 template <class R>
@@ -66,8 +72,8 @@ class ClientAsyncResponseReaderInterface {
 };
 
 namespace internal {
-template <class R>
-class ClientAsyncResponseReaderFactory {
+
+class ClientAsyncResponseReaderHelper {
  public:
   /// Start a call and write the request out if \a start is set.
   /// \a tag will be notified on \a cq when the call has been started (i.e.
@@ -75,17 +81,136 @@ class ClientAsyncResponseReaderFactory {
   /// If \a start is not set, the actual call must be initiated by StartCall
   /// Note that \a context will be used to fill in custom initial metadata
   /// used to send to the server when starting the call.
+  ///
+  /// Optionally pass in a base class for request and response types so that the
+  /// internal functions and structs can be templated based on that, allowing
+  /// reuse across RPCs (e.g., MessageLite for protobuf). Since constructors
+  /// can't have an explicit template parameter, the last argument is an
+  /// extraneous parameter just to provide the needed type information.
+  template <class R, class W, class BaseR = R, class BaseW = W>
+  static ClientAsyncResponseReader<R>* Create(
+      ::grpc::ChannelInterface* channel, ::grpc::CompletionQueue* cq,
+      const ::grpc::internal::RpcMethod& method, ::grpc::ClientContext* context,
+      const W& request) /* __attribute__((noinline)) */ {
+    ::grpc::internal::Call call = channel->CreateCall(method, context, cq);
+    ClientAsyncResponseReader<R>* result =
+        new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc(
+            call.call(), sizeof(ClientAsyncResponseReader<R>)))
+            ClientAsyncResponseReader<R>(call, context);
+    SetupRequest<BaseR, BaseW>(
+        call.call(), &result->single_buf_, &result->read_initial_metadata_,
+        &result->finish_, static_cast<const BaseW&>(request));
+
+    return result;
+  }
+
+  // Various helper functions to reduce templating use
+
+  template <class R, class W>
+  static void SetupRequest(
+      grpc_call* call,
+      ::grpc::internal::CallOpSendInitialMetadata** single_buf_ptr,
+      std::function<void(ClientContext*, internal::Call*,
+                         internal::CallOpSendInitialMetadata*, void*)>*
+          read_initial_metadata,
+      std::function<
+          void(ClientContext*, internal::Call*, bool initial_metadata_read,
+               internal::CallOpSendInitialMetadata*,
+               internal::CallOpSetInterface**, void*, Status*, void*)>* finish,
+      const W& request) {
+    using SingleBufType =
+        ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
+                                    ::grpc::internal::CallOpSendMessage,
+                                    ::grpc::internal::CallOpClientSendClose,
+                                    ::grpc::internal::CallOpRecvInitialMetadata,
+                                    ::grpc::internal::CallOpRecvMessage<R>,
+                                    ::grpc::internal::CallOpClientRecvStatus>;
+    SingleBufType* single_buf =
+        new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc(
+            call, sizeof(SingleBufType))) SingleBufType;
+    *single_buf_ptr = single_buf;
+    // TODO(ctiller): don't assert
+    GPR_CODEGEN_ASSERT(single_buf->SendMessage(request).ok());
+    single_buf->ClientSendClose();
+
+    // The purpose of the following functions is to type-erase the actual
+    // templated type of the CallOpSet being used by hiding that type inside the
+    // function definition rather than specifying it as an argument of the
+    // function or a member of the class. The type-erased CallOpSet will get
+    // static_cast'ed back to the real type so that it can be used properly.
+    *read_initial_metadata =
+        [](ClientContext* context, internal::Call* call,
+           internal::CallOpSendInitialMetadata* single_buf_view, void* tag) {
+          auto* single_buf = static_cast<SingleBufType*>(single_buf_view);
+          single_buf->set_output_tag(tag);
+          single_buf->RecvInitialMetadata(context);
+          call->PerformOps(single_buf);
+        };
+
+    // Note that this function goes one step further than the previous one
+    // because it type-erases the message being written down to a void*. This
+    // will be static-cast'ed back to the class specified here by hiding that
+    // class information inside the function definition. Note that this feature
+    // expects the class being specified here for R to be a base-class of the
+    // "real" R without any multiple-inheritance (as applies in protbuf wrt
+    // MessageLite)
+    *finish = [](ClientContext* context, internal::Call* call,
+                 bool initial_metadata_read,
+                 internal::CallOpSendInitialMetadata* single_buf_view,
+                 internal::CallOpSetInterface** finish_buf_ptr, void* msg,
+                 Status* status, void* tag) {
+      if (initial_metadata_read) {
+        using FinishBufType = ::grpc::internal::CallOpSet<
+            ::grpc::internal::CallOpRecvMessage<R>,
+            ::grpc::internal::CallOpClientRecvStatus>;
+        FinishBufType* finish_buf =
+            new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc(
+                call->call(), sizeof(FinishBufType))) FinishBufType;
+        *finish_buf_ptr = finish_buf;
+        finish_buf->set_output_tag(tag);
+        finish_buf->RecvMessage(static_cast<R*>(msg));
+        finish_buf->AllowNoMessage();
+        finish_buf->ClientRecvStatus(context, status);
+        call->PerformOps(finish_buf);
+      } else {
+        auto* single_buf = static_cast<SingleBufType*>(single_buf_view);
+        single_buf->set_output_tag(tag);
+        single_buf->RecvInitialMetadata(context);
+        single_buf->RecvMessage(static_cast<R*>(msg));
+        single_buf->AllowNoMessage();
+        single_buf->ClientRecvStatus(context, status);
+        call->PerformOps(single_buf);
+      }
+    };
+  }
+
+  static void StartCall(
+      ::grpc::ClientContext* context,
+      ::grpc::internal::CallOpSendInitialMetadata* single_buf) {
+    single_buf->SendInitialMetadata(&context->send_initial_metadata_,
+                                    context->initial_metadata_flags());
+  }
+};
+
+// TODO(vjpai): This templated factory is deprecated and will be replaced by
+//.             the non-templated helper as soon as possible.
+template <class R>
+class ClientAsyncResponseReaderFactory {
+ public:
   template <class W>
   static ClientAsyncResponseReader<R>* Create(
       ::grpc::ChannelInterface* channel, ::grpc::CompletionQueue* cq,
       const ::grpc::internal::RpcMethod& method, ::grpc::ClientContext* context,
       const W& request, bool start) {
-    ::grpc::internal::Call call = channel->CreateCall(method, context, cq);
-    return new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc(
-        call.call(), sizeof(ClientAsyncResponseReader<R>)))
-        ClientAsyncResponseReader<R>(call, context, request, start);
+    auto* result = ClientAsyncResponseReaderHelper::Create<R>(
+        channel, cq, method, context, request);
+    if (start) {
+      result->StartCall();
+    }
+    return result;
   }
 };
+
 }  // namespace internal
 
 /// Async API for client-side unary RPCs, where the message response
@@ -107,9 +232,9 @@ class ClientAsyncResponseReader final
   static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); }
 
   void StartCall() override {
-    GPR_CODEGEN_ASSERT(!started_);
+    GPR_CODEGEN_DEBUG_ASSERT(!started_);
     started_ = true;
-    StartCallInternal();
+    internal::ClientAsyncResponseReaderHelper::StartCall(context_, single_buf_);
   }
 
   /// See \a ClientAsyncResponseReaderInterface::ReadInitialMetadata for
@@ -119,12 +244,9 @@ class ClientAsyncResponseReader final
   ///   - the \a ClientContext associated with this call is updated with
   ///     possible initial and trailing metadata sent from the server.
   void ReadInitialMetadata(void* tag) override {
-    GPR_CODEGEN_ASSERT(started_);
-    GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
-
-    single_buf.set_output_tag(tag);
-    single_buf.RecvInitialMetadata(context_);
-    call_.PerformOps(&single_buf);
+    GPR_CODEGEN_DEBUG_ASSERT(started_);
+    GPR_CODEGEN_DEBUG_ASSERT(!context_->initial_metadata_received_);
+    read_initial_metadata_(context_, &call_, single_buf_, tag);
     initial_metadata_read_ = true;
   }
 
@@ -134,61 +256,36 @@ class ClientAsyncResponseReader final
   ///   - the \a ClientContext associated with this call is updated with
   ///     possible initial and trailing metadata sent from the server.
   void Finish(R* msg, ::grpc::Status* status, void* tag) override {
-    GPR_CODEGEN_ASSERT(started_);
-    if (initial_metadata_read_) {
-      finish_buf.set_output_tag(tag);
-      finish_buf.RecvMessage(msg);
-      finish_buf.AllowNoMessage();
-      finish_buf.ClientRecvStatus(context_, status);
-      call_.PerformOps(&finish_buf);
-    } else {
-      single_buf.set_output_tag(tag);
-      single_buf.RecvInitialMetadata(context_);
-      single_buf.RecvMessage(msg);
-      single_buf.AllowNoMessage();
-      single_buf.ClientRecvStatus(context_, status);
-      call_.PerformOps(&single_buf);
-    }
+    GPR_CODEGEN_DEBUG_ASSERT(started_);
+    finish_(context_, &call_, initial_metadata_read_, single_buf_, &finish_buf_,
+            static_cast<void*>(msg), status, tag);
   }
 
  private:
-  friend class internal::ClientAsyncResponseReaderFactory<R>;
+  friend class internal::ClientAsyncResponseReaderHelper;
   ::grpc::ClientContext* const context_;
   ::grpc::internal::Call call_;
-  bool started_;
+  bool started_ = false;
   bool initial_metadata_read_ = false;
 
-  template <class W>
   ClientAsyncResponseReader(::grpc::internal::Call call,
-                            ::grpc::ClientContext* context, const W& request,
-                            bool start)
-      : context_(context), call_(call), started_(start) {
-    // Bind the metadata at time of StartCallInternal but set up the rest here
-    // TODO(ctiller): don't assert
-    GPR_CODEGEN_ASSERT(single_buf.SendMessage(request).ok());
-    single_buf.ClientSendClose();
-    if (start) StartCallInternal();
-  }
-
-  void StartCallInternal() {
-    single_buf.SendInitialMetadata(&context_->send_initial_metadata_,
-                                   context_->initial_metadata_flags());
-  }
+                            ::grpc::ClientContext* context)
+      : context_(context), call_(call) {}
 
   // disable operator new
   static void* operator new(std::size_t size);
   static void* operator new(std::size_t /*size*/, void* p) { return p; }
 
-  ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
-                              ::grpc::internal::CallOpSendMessage,
-                              ::grpc::internal::CallOpClientSendClose,
-                              ::grpc::internal::CallOpRecvInitialMetadata,
-                              ::grpc::internal::CallOpRecvMessage<R>,
-                              ::grpc::internal::CallOpClientRecvStatus>
-      single_buf;
-  ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvMessage<R>,
-                              ::grpc::internal::CallOpClientRecvStatus>
-      finish_buf;
+  internal::CallOpSendInitialMetadata* single_buf_;
+  internal::CallOpSetInterface* finish_buf_ = nullptr;
+  std::function<void(ClientContext*, internal::Call*,
+                     internal::CallOpSendInitialMetadata*, void*)>
+      read_initial_metadata_;
+  std::function<void(ClientContext*, internal::Call*,
+                     bool initial_metadata_read,
+                     internal::CallOpSendInitialMetadata*,
+                     internal::CallOpSetInterface**, void*, Status*, void*)>
+      finish_;
 };
 
 /// Async server-side API for handling unary calls, where the single
index 6e64ec9..a8836fd 100644 (file)
@@ -40,8 +40,9 @@ template <class RequestType, class ResponseType>
 class CallbackUnaryHandler;
 template <class RequestType, class ResponseType>
 class CallbackServerStreamingHandler;
-template <class ServiceType, class RequestType, class ResponseType>
-class RpcMethodHandler;
+template <class RequestType>
+void* UnaryDeserializeHelper(grpc_call*, grpc_byte_buffer*, ::grpc::Status*,
+                             RequestType*);
 template <class ServiceType, class RequestType, class ResponseType>
 class ServerStreamingHandler;
 template <::grpc::StatusCode code>
@@ -162,8 +163,9 @@ class ByteBuffer final {
   template <class R>
   friend class internal::CallOpRecvMessage;
   friend class internal::CallOpGenericRecvMessage;
-  template <class ServiceType, class RequestType, class ResponseType>
-  friend class internal::RpcMethodHandler;
+  template <class RequestType>
+  friend void* internal::UnaryDeserializeHelper(grpc_call*, grpc_byte_buffer*,
+                                                ::grpc::Status*, RequestType*);
   template <class ServiceType, class RequestType, class ResponseType>
   friend class internal::ServerStreamingHandler;
   template <class RequestType, class ResponseType>
index 8b6b1fd..88cfde6 100644 (file)
@@ -79,11 +79,6 @@ inline grpc_metadata* FillMetadataArray(
 class WriteOptions {
  public:
   WriteOptions() : flags_(0), last_message_(false) {}
-  WriteOptions(const WriteOptions& other)
-      : flags_(other.flags_), last_message_(other.last_message_) {}
-
-  /// Default assignment operator
-  WriteOptions& operator=(const WriteOptions& other) = default;
 
   /// Clear all flags.
   inline void Clear() { flags_ = 0; }
@@ -330,6 +325,7 @@ class CallOpSendMessage {
   }
   void FinishOp(bool* status) {
     if (msg_ == nullptr && !send_buf_.Valid()) return;
+    send_buf_.Clear();
     if (hijacked_ && failed_send_) {
       // Hijacking interceptor failed this Op
       *status = false;
@@ -378,9 +374,33 @@ class CallOpSendMessage {
 template <class M>
 Status CallOpSendMessage::SendMessage(const M& message, WriteOptions options) {
   write_options_ = options;
+  // Serialize immediately since we do not have access to the message pointer
+  bool own_buf;
+  // TODO(vjpai): Remove the void below when possible
+  // The void in the template parameter below should not be needed
+  // (since it should be implicit) but is needed due to an observed
+  // difference in behavior between clang and gcc for certain internal users
+  Status result = SerializationTraits<M, void>::Serialize(
+      message, send_buf_.bbuf_ptr(), &own_buf);
+  if (!own_buf) {
+    send_buf_.Duplicate();
+  }
+  return result;
+}
+
+template <class M>
+Status CallOpSendMessage::SendMessage(const M& message) {
+  return SendMessage(message, WriteOptions());
+}
+
+template <class M>
+Status CallOpSendMessage::SendMessagePtr(const M* message,
+                                         WriteOptions options) {
+  msg_ = message;
+  write_options_ = options;
+  // Store the serializer for later since we have access to the message
   serializer_ = [this](const void* message) {
     bool own_buf;
-    send_buf_.Clear();
     // TODO(vjpai): Remove the void below when possible
     // The void in the template parameter below should not be needed
     // (since it should be implicit) but is needed due to an observed
@@ -392,31 +412,12 @@ Status CallOpSendMessage::SendMessage(const M& message, WriteOptions options) {
     }
     return result;
   };
-  // Serialize immediately only if we do not have access to the message pointer
-  if (msg_ == nullptr) {
-    Status result = serializer_(&message);
-    serializer_ = nullptr;
-    return result;
-  }
   return Status();
 }
 
 template <class M>
-Status CallOpSendMessage::SendMessage(const M& message) {
-  return SendMessage(message, WriteOptions());
-}
-
-template <class M>
-Status CallOpSendMessage::SendMessagePtr(const M* message,
-                                         WriteOptions options) {
-  msg_ = message;
-  return SendMessage(*message, options);
-}
-
-template <class M>
 Status CallOpSendMessage::SendMessagePtr(const M* message) {
-  msg_ = message;
-  return SendMessage(*message, WriteOptions());
+  return SendMessagePtr(message, WriteOptions());
 }
 
 template <class R>
index c5570dd..324c10d 100644 (file)
@@ -40,8 +40,7 @@ template <class W>
 class ClientAsyncWriterFactory;
 template <class W, class R>
 class ClientAsyncReaderWriterFactory;
-template <class R>
-class ClientAsyncResponseReaderFactory;
+class ClientAsyncResponseReaderHelper;
 template <class W, class R>
 class ClientCallbackReaderWriterFactory;
 template <class R>
@@ -116,8 +115,7 @@ class ChannelInterface {
   friend class ::grpc::internal::ClientAsyncWriterFactory;
   template <class W, class R>
   friend class ::grpc::internal::ClientAsyncReaderWriterFactory;
-  template <class R>
-  friend class ::grpc::internal::ClientAsyncResponseReaderFactory;
+  friend class ::grpc::internal::ClientAsyncResponseReaderHelper;
   template <class W, class R>
   friend class ::grpc::internal::ClientCallbackReaderWriterFactory;
   template <class R>
index 90c817c..f2ddaba 100644 (file)
@@ -35,15 +35,25 @@ class ClientContext;
 namespace internal {
 class RpcMethod;
 
-/// Perform a callback-based unary call
+/// Perform a callback-based unary call.  May optionally specify the base
+/// class of the Request and Response so that the internal calls and structures
+/// below this may be based on those base classes and thus achieve code reuse
+/// across different RPCs (e.g., for protobuf, MessageLite would be a base
+/// class).
 /// TODO(vjpai): Combine as much as possible with the blocking unary call code
-template <class InputMessage, class OutputMessage>
+template <class InputMessage, class OutputMessage,
+          class BaseInputMessage = InputMessage,
+          class BaseOutputMessage = OutputMessage>
 void CallbackUnaryCall(::grpc::ChannelInterface* channel,
                        const ::grpc::internal::RpcMethod& method,
                        ::grpc::ClientContext* context,
                        const InputMessage* request, OutputMessage* result,
                        std::function<void(::grpc::Status)> on_completion) {
-  CallbackUnaryCallImpl<InputMessage, OutputMessage> x(
+  static_assert(std::is_base_of<BaseInputMessage, InputMessage>::value,
+                "Invalid input message specification");
+  static_assert(std::is_base_of<BaseOutputMessage, OutputMessage>::value,
+                "Invalid output message specification");
+  CallbackUnaryCallImpl<BaseInputMessage, BaseOutputMessage> x(
       channel, method, context, request, result, on_completion);
 }
 
@@ -537,12 +547,13 @@ class ClientCallbackReaderWriterImpl
   }
   void WritesDone() override {
     writes_done_ops_.ClientSendClose();
-    writes_done_tag_.Set(call_.call(),
-                         [this](bool ok) {
-                           reactor_->OnWritesDoneDone(ok);
-                           MaybeFinish(/*from_reaction=*/true);
-                         },
-                         &writes_done_ops_, /*can_inline=*/false);
+    writes_done_tag_.Set(
+        call_.call(),
+        [this](bool ok) {
+          reactor_->OnWritesDoneDone(ok);
+          MaybeFinish(/*from_reaction=*/true);
+        },
+        &writes_done_ops_, /*can_inline=*/false);
     writes_done_ops_.set_core_cq_tag(&writes_done_tag_);
     callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed);
     if (GPR_UNLIKELY(corked_write_needed_)) {
@@ -579,29 +590,32 @@ class ClientCallbackReaderWriterImpl
     this->BindReactor(reactor);
 
     // Set up the unchanging parts of the start, read, and write tags and ops.
-    start_tag_.Set(call_.call(),
-                   [this](bool ok) {
-                     reactor_->OnReadInitialMetadataDone(ok);
-                     MaybeFinish(/*from_reaction=*/true);
-                   },
-                   &start_ops_, /*can_inline=*/false);
+    start_tag_.Set(
+        call_.call(),
+        [this](bool ok) {
+          reactor_->OnReadInitialMetadataDone(ok);
+          MaybeFinish(/*from_reaction=*/true);
+        },
+        &start_ops_, /*can_inline=*/false);
     start_ops_.RecvInitialMetadata(context_);
     start_ops_.set_core_cq_tag(&start_tag_);
 
-    write_tag_.Set(call_.call(),
-                   [this](bool ok) {
-                     reactor_->OnWriteDone(ok);
-                     MaybeFinish(/*from_reaction=*/true);
-                   },
-                   &write_ops_, /*can_inline=*/false);
+    write_tag_.Set(
+        call_.call(),
+        [this](bool ok) {
+          reactor_->OnWriteDone(ok);
+          MaybeFinish(/*from_reaction=*/true);
+        },
+        &write_ops_, /*can_inline=*/false);
     write_ops_.set_core_cq_tag(&write_tag_);
 
-    read_tag_.Set(call_.call(),
-                  [this](bool ok) {
-                    reactor_->OnReadDone(ok);
-                    MaybeFinish(/*from_reaction=*/true);
-                  },
-                  &read_ops_, /*can_inline=*/false);
+    read_tag_.Set(
+        call_.call(),
+        [this](bool ok) {
+          reactor_->OnReadDone(ok);
+          MaybeFinish(/*from_reaction=*/true);
+        },
+        &read_ops_, /*can_inline=*/false);
     read_ops_.set_core_cq_tag(&read_tag_);
 
     // Also set up the Finish tag and op set.
@@ -719,12 +733,13 @@ class ClientCallbackReaderImpl : public ClientCallbackReader<Response> {
     // 2. Any backlog
     // 3. Recv trailing metadata
 
-    start_tag_.Set(call_.call(),
-                   [this](bool ok) {
-                     reactor_->OnReadInitialMetadataDone(ok);
-                     MaybeFinish(/*from_reaction=*/true);
-                   },
-                   &start_ops_, /*can_inline=*/false);
+    start_tag_.Set(
+        call_.call(),
+        [this](bool ok) {
+          reactor_->OnReadInitialMetadataDone(ok);
+          MaybeFinish(/*from_reaction=*/true);
+        },
+        &start_ops_, /*can_inline=*/false);
     start_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
                                    context_->initial_metadata_flags());
     start_ops_.RecvInitialMetadata(context_);
@@ -732,12 +747,13 @@ class ClientCallbackReaderImpl : public ClientCallbackReader<Response> {
     call_.PerformOps(&start_ops_);
 
     // Also set up the read tag so it doesn't have to be set up each time
-    read_tag_.Set(call_.call(),
-                  [this](bool ok) {
-                    reactor_->OnReadDone(ok);
-                    MaybeFinish(/*from_reaction=*/true);
-                  },
-                  &read_ops_, /*can_inline=*/false);
+    read_tag_.Set(
+        call_.call(),
+        [this](bool ok) {
+          reactor_->OnReadDone(ok);
+          MaybeFinish(/*from_reaction=*/true);
+        },
+        &read_ops_, /*can_inline=*/false);
     read_ops_.set_core_cq_tag(&read_tag_);
 
     {
@@ -928,12 +944,13 @@ class ClientCallbackWriterImpl : public ClientCallbackWriter<Request> {
 
   void WritesDone() override {
     writes_done_ops_.ClientSendClose();
-    writes_done_tag_.Set(call_.call(),
-                         [this](bool ok) {
-                           reactor_->OnWritesDoneDone(ok);
-                           MaybeFinish(/*from_reaction=*/true);
-                         },
-                         &writes_done_ops_, /*can_inline=*/false);
+    writes_done_tag_.Set(
+        call_.call(),
+        [this](bool ok) {
+          reactor_->OnWritesDoneDone(ok);
+          MaybeFinish(/*from_reaction=*/true);
+        },
+        &writes_done_ops_, /*can_inline=*/false);
     writes_done_ops_.set_core_cq_tag(&writes_done_tag_);
     callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed);
 
@@ -973,21 +990,23 @@ class ClientCallbackWriterImpl : public ClientCallbackWriter<Request> {
     this->BindReactor(reactor);
 
     // Set up the unchanging parts of the start and write tags and ops.
-    start_tag_.Set(call_.call(),
-                   [this](bool ok) {
-                     reactor_->OnReadInitialMetadataDone(ok);
-                     MaybeFinish(/*from_reaction=*/true);
-                   },
-                   &start_ops_, /*can_inline=*/false);
+    start_tag_.Set(
+        call_.call(),
+        [this](bool ok) {
+          reactor_->OnReadInitialMetadataDone(ok);
+          MaybeFinish(/*from_reaction=*/true);
+        },
+        &start_ops_, /*can_inline=*/false);
     start_ops_.RecvInitialMetadata(context_);
     start_ops_.set_core_cq_tag(&start_tag_);
 
-    write_tag_.Set(call_.call(),
-                   [this](bool ok) {
-                     reactor_->OnWriteDone(ok);
-                     MaybeFinish(/*from_reaction=*/true);
-                   },
-                   &write_ops_, /*can_inline=*/false);
+    write_tag_.Set(
+        call_.call(),
+        [this](bool ok) {
+          reactor_->OnWriteDone(ok);
+          MaybeFinish(/*from_reaction=*/true);
+        },
+        &write_ops_, /*can_inline=*/false);
     write_ops_.set_core_cq_tag(&write_tag_);
 
     // Also set up the Finish tag and op set.
@@ -1097,21 +1116,22 @@ class ClientCallbackUnaryImpl final : public ClientCallbackUnary {
     // 1. Send initial metadata + write + writes done + recv initial metadata
     // 2. Read message, recv trailing metadata
 
-    start_tag_.Set(call_.call(),
-                   [this](bool ok) {
-                     reactor_->OnReadInitialMetadataDone(ok);
-                     MaybeFinish();
-                   },
-                   &start_ops_, /*can_inline=*/false);
+    start_tag_.Set(
+        call_.call(),
+        [this](bool ok) {
+          reactor_->OnReadInitialMetadataDone(ok);
+          MaybeFinish();
+        },
+        &start_ops_, /*can_inline=*/false);
     start_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
                                    context_->initial_metadata_flags());
     start_ops_.RecvInitialMetadata(context_);
     start_ops_.set_core_cq_tag(&start_tag_);
     call_.PerformOps(&start_ops_);
 
-    finish_tag_.Set(call_.call(), [this](bool /*ok*/) { MaybeFinish(); },
-                    &finish_ops_,
-                    /*can_inline=*/false);
+    finish_tag_.Set(
+        call_.call(), [this](bool /*ok*/) { MaybeFinish(); }, &finish_ops_,
+        /*can_inline=*/false);
     finish_ops_.ClientRecvStatus(context_, &finish_status_);
     finish_ops_.set_core_cq_tag(&finish_tag_);
     call_.PerformOps(&finish_ops_);
@@ -1171,7 +1191,8 @@ class ClientCallbackUnaryImpl final : public ClientCallbackUnary {
 
 class ClientCallbackUnaryFactory {
  public:
-  template <class Request, class Response>
+  template <class Request, class Response, class BaseRequest = Request,
+            class BaseResponse = Response>
   static void Create(::grpc::ChannelInterface* channel,
                      const ::grpc::internal::RpcMethod& method,
                      ::grpc::ClientContext* context, const Request* request,
@@ -1183,7 +1204,9 @@ class ClientCallbackUnaryFactory {
 
     new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc(
         call.call(), sizeof(ClientCallbackUnaryImpl)))
-        ClientCallbackUnaryImpl(call, context, request, response, reactor);
+        ClientCallbackUnaryImpl(call, context,
+                                static_cast<const BaseRequest*>(request),
+                                static_cast<BaseResponse*>(response), reactor);
   }
 };
 
index 2efba06..8a0bd62 100644 (file)
@@ -72,6 +72,7 @@ template <class Request>
 class ClientCallbackWriterImpl;
 class ClientCallbackUnaryImpl;
 class ClientContextAccessor;
+class ClientAsyncResponseReaderHelper;
 }  // namespace internal
 
 template <class R>
@@ -439,6 +440,7 @@ class ClientContext {
   friend class ::grpc::ClientAsyncReaderWriter;
   template <class R>
   friend class ::grpc::ClientAsyncResponseReader;
+  friend class ::grpc::internal::ClientAsyncResponseReaderHelper;
   template <class InputMessage, class OutputMessage>
   friend class ::grpc::internal::BlockingUnaryCallImpl;
   template <class InputMessage, class OutputMessage>
index 098bb50..b2430ad 100644 (file)
@@ -30,12 +30,23 @@ namespace grpc {
 class ClientContext;
 namespace internal {
 class RpcMethod;
-/// Wrapper that performs a blocking unary call
-template <class InputMessage, class OutputMessage>
+
+/// Wrapper that performs a blocking unary call. May optionally specify the base
+/// class of the Request and Response so that the internal calls and structures
+/// below this may be based on those base classes and thus achieve code reuse
+/// across different RPCs (e.g., for protobuf, MessageLite would be a base
+/// class).
+template <class InputMessage, class OutputMessage,
+          class BaseInputMessage = InputMessage,
+          class BaseOutputMessage = OutputMessage>
 Status BlockingUnaryCall(ChannelInterface* channel, const RpcMethod& method,
                          grpc::ClientContext* context,
                          const InputMessage& request, OutputMessage* result) {
-  return BlockingUnaryCallImpl<InputMessage, OutputMessage>(
+  static_assert(std::is_base_of<BaseInputMessage, InputMessage>::value,
+                "Invalid input message specification");
+  static_assert(std::is_base_of<BaseOutputMessage, OutputMessage>::value,
+                "Invalid output message specification");
+  return BlockingUnaryCallImpl<BaseInputMessage, BaseOutputMessage>(
              channel, method, context, request, result)
       .status();
 }
index ca0c772..0234951 100644 (file)
@@ -38,6 +38,7 @@
 #include <grpcpp/impl/codegen/completion_queue_tag.h>
 #include <grpcpp/impl/codegen/core_codegen_interface.h>
 #include <grpcpp/impl/codegen/grpc_library.h>
+#include <grpcpp/impl/codegen/rpc_service_method.h>
 #include <grpcpp/impl/codegen/status.h>
 #include <grpcpp/impl/codegen/sync.h>
 #include <grpcpp/impl/codegen/time.h>
@@ -59,7 +60,12 @@ namespace internal {
 template <class W, class R>
 class ServerReaderWriterBody;
 
-template <class ServiceType, class RequestType, class ResponseType>
+template <class ResponseType>
+void UnaryRunHandlerHelper(
+    const ::grpc::internal::MethodHandler::HandlerParameter&, ResponseType*,
+    ::grpc::Status&);
+template <class ServiceType, class RequestType, class ResponseType,
+          class BaseRequestType, class BaseResponseType>
 class RpcMethodHandler;
 template <class ServiceType, class RequestType, class ResponseType>
 class ClientStreamingHandler;
@@ -123,8 +129,8 @@ class CompletionQueue : private ::grpc::GrpcLibraryCodegen {
   /// Read from the queue, blocking until an event is available or the queue is
   /// shutting down.
   ///
-  /// \param tag [out] Updated to point to the read event's tag.
-  /// \param ok [out] true if read a successful event, false otherwise.
+  /// \param[out] tag Updated to point to the read event's tag.
+  /// \param[out] ok true if read a successful event, false otherwise.
   ///
   /// Note that each tag sent to the completion queue (through RPC operations
   /// or alarms) will be delivered out of the completion queue by a call to
@@ -179,10 +185,10 @@ class CompletionQueue : private ::grpc::GrpcLibraryCodegen {
   /// within the \a deadline).  A \a tag points to an arbitrary location usually
   /// employed to uniquely identify an event.
   ///
-  /// \param tag [out] Upon success, updated to point to the event's tag.
-  /// \param ok [out] Upon success, true if a successful event, false otherwise
+  /// \param[out] tag Upon success, updated to point to the event's tag.
+  /// \param[out] ok Upon success, true if a successful event, false otherwise
   ///        See documentation for CompletionQueue::Next for explanation of ok
-  /// \param deadline [in] How long to block in wait for an event.
+  /// \param[in] deadline How long to block in wait for an event.
   ///
   /// \return The type of event read.
   template <typename T>
@@ -198,11 +204,11 @@ class CompletionQueue : private ::grpc::GrpcLibraryCodegen {
   /// within the \a deadline).  A \a tag points to an arbitrary location usually
   /// employed to uniquely identify an event.
   ///
-  /// \param f [in] Function to execute before calling AsyncNext on this queue.
-  /// \param tag [out] Upon success, updated to point to the event's tag.
-  /// \param ok [out] Upon success, true if read a regular event, false
+  /// \param[in] f Function to execute before calling AsyncNext on this queue.
+  /// \param[out] tag Upon success, updated to point to the event's tag.
+  /// \param[out] ok Upon success, true if read a regular event, false
   /// otherwise.
-  /// \param deadline [in] How long to block in wait for an event.
+  /// \param[in] deadline How long to block in wait for an event.
   ///
   /// \return The type of event read.
   template <typename T, typename F>
@@ -265,8 +271,10 @@ class CompletionQueue : private ::grpc::GrpcLibraryCodegen {
   friend class ::grpc::ServerWriter;
   template <class W, class R>
   friend class ::grpc::internal::ServerReaderWriterBody;
-  template <class ServiceType, class RequestType, class ResponseType>
-  friend class ::grpc::internal::RpcMethodHandler;
+  template <class ResponseType>
+  friend void ::grpc::internal::UnaryRunHandlerHelper(
+      const ::grpc::internal::MethodHandler::HandlerParameter&, ResponseType*,
+      ::grpc::Status&);
   template <class ServiceType, class RequestType, class ResponseType>
   friend class ::grpc::internal::ClientStreamingHandler;
   template <class ServiceType, class RequestType, class ResponseType>
index 0033936..604de89 100644 (file)
@@ -49,8 +49,52 @@ template <class Callable>
 #endif  // GRPC_ALLOW_EXCEPTIONS
 }
 
+/// A helper function with reduced templating to do the common work needed to
+/// actually send the server response. Uses non-const parameter for Status since
+/// this should only ever be called from the end of the RunHandler method.
+
+template <class ResponseType>
+void UnaryRunHandlerHelper(const MethodHandler::HandlerParameter& param,
+                           ResponseType* rsp, ::grpc::Status& status) {
+  GPR_CODEGEN_ASSERT(!param.server_context->sent_initial_metadata_);
+  ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
+                              ::grpc::internal::CallOpSendMessage,
+                              ::grpc::internal::CallOpServerSendStatus>
+      ops;
+  ops.SendInitialMetadata(&param.server_context->initial_metadata_,
+                          param.server_context->initial_metadata_flags());
+  if (param.server_context->compression_level_set()) {
+    ops.set_compression_level(param.server_context->compression_level());
+  }
+  if (status.ok()) {
+    status = ops.SendMessagePtr(rsp);
+  }
+  ops.ServerSendStatus(&param.server_context->trailing_metadata_, status);
+  param.call->PerformOps(&ops);
+  param.call->cq()->Pluck(&ops);
+}
+
+/// A helper function with reduced templating to do deserializing.
+
+template <class RequestType>
+void* UnaryDeserializeHelper(grpc_call* call, grpc_byte_buffer* req,
+                             ::grpc::Status* status, RequestType* request) {
+  ::grpc::ByteBuffer buf;
+  buf.set_buffer(req);
+  *status = ::grpc::SerializationTraits<RequestType>::Deserialize(
+      &buf, static_cast<RequestType*>(request));
+  buf.Release();
+  if (status->ok()) {
+    return request;
+  }
+  request->~RequestType();
+  return nullptr;
+}
+
 /// A wrapper class of an application provided rpc method handler.
-template <class ServiceType, class RequestType, class ResponseType>
+template <class ServiceType, class RequestType, class ResponseType,
+          class BaseRequestType = RequestType,
+          class BaseResponseType = ResponseType>
 class RpcMethodHandler : public ::grpc::internal::MethodHandler {
  public:
   RpcMethodHandler(
@@ -71,40 +115,16 @@ class RpcMethodHandler : public ::grpc::internal::MethodHandler {
       });
       static_cast<RequestType*>(param.request)->~RequestType();
     }
-
-    GPR_CODEGEN_ASSERT(!param.server_context->sent_initial_metadata_);
-    ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
-                                ::grpc::internal::CallOpSendMessage,
-                                ::grpc::internal::CallOpServerSendStatus>
-        ops;
-    ops.SendInitialMetadata(&param.server_context->initial_metadata_,
-                            param.server_context->initial_metadata_flags());
-    if (param.server_context->compression_level_set()) {
-      ops.set_compression_level(param.server_context->compression_level());
-    }
-    if (status.ok()) {
-      status = ops.SendMessagePtr(&rsp);
-    }
-    ops.ServerSendStatus(&param.server_context->trailing_metadata_, status);
-    param.call->PerformOps(&ops);
-    param.call->cq()->Pluck(&ops);
+    UnaryRunHandlerHelper(param, static_cast<BaseResponseType*>(&rsp), status);
   }
 
   void* Deserialize(grpc_call* call, grpc_byte_buffer* req,
                     ::grpc::Status* status, void** /*handler_data*/) final {
-    ::grpc::ByteBuffer buf;
-    buf.set_buffer(req);
     auto* request =
         new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc(
-            call, sizeof(RequestType))) RequestType();
-    *status =
-        ::grpc::SerializationTraits<RequestType>::Deserialize(&buf, request);
-    buf.Release();
-    if (status->ok()) {
-      return request;
-    }
-    request->~RequestType();
-    return nullptr;
+            call, sizeof(RequestType))) RequestType;
+    return UnaryDeserializeHelper(call, req, status,
+                                  static_cast<BaseRequestType*>(request));
   }
 
  private:
index 2e10213..2df4904 100644 (file)
@@ -49,7 +49,7 @@ Status GenericSerialize(const grpc::protobuf::MessageLite& msg, ByteBuffer* bb,
                 "ProtoBufferWriter must be a subclass of "
                 "::protobuf::io::ZeroCopyOutputStream");
   *own_buffer = true;
-  int byte_size = msg.ByteSizeLong();
+  int byte_size = static_cast<int>(msg.ByteSizeLong());
   if ((size_t)byte_size <= GRPC_SLICE_INLINED_SIZE) {
     Slice slice(byte_size);
     // We serialize directly into the allocated slices memory
index 8120fca..9cee8e9 100644 (file)
@@ -157,14 +157,15 @@ class CallbackUnaryHandler : public ::grpc::internal::MethodHandler {
       // (OnSendInitialMetadataDone). Thus it must be dispatched to an executor
       // thread. However, any OnDone needed after that can be inlined because it
       // is already running on an executor thread.
-      meta_tag_.Set(call_.call(),
-                    [this](bool ok) {
-                      ServerUnaryReactor* reactor =
-                          reactor_.load(std::memory_order_relaxed);
-                      reactor->OnSendInitialMetadataDone(ok);
-                      this->MaybeDone(/*inlineable_ondone=*/true);
-                    },
-                    &meta_ops_, /*can_inline=*/false);
+      meta_tag_.Set(
+          call_.call(),
+          [this](bool ok) {
+            ServerUnaryReactor* reactor =
+                reactor_.load(std::memory_order_relaxed);
+            reactor->OnSendInitialMetadataDone(ok);
+            this->MaybeDone(/*inlineable_ondone=*/true);
+          },
+          &meta_ops_, /*can_inline=*/false);
       meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
                                     ctx_->initial_metadata_flags());
       if (ctx_->compression_level_set()) {
@@ -305,14 +306,15 @@ class CallbackClientStreamingHandler : public ::grpc::internal::MethodHandler {
       // A finish tag with only MaybeDone can have its callback inlined
       // regardless even if OnDone is not inlineable because this callback just
       // checks a ref and then decides whether or not to dispatch OnDone.
-      finish_tag_.Set(call_.call(),
-                      [this](bool) {
-                        // Inlineable OnDone can be false here because there is
-                        // no read reactor that has an inlineable OnDone; this
-                        // only applies to the DefaultReactor (which is unary).
-                        this->MaybeDone(/*inlineable_ondone=*/false);
-                      },
-                      &finish_ops_, /*can_inline=*/true);
+      finish_tag_.Set(
+          call_.call(),
+          [this](bool) {
+            // Inlineable OnDone can be false here because there is
+            // no read reactor that has an inlineable OnDone; this
+            // only applies to the DefaultReactor (which is unary).
+            this->MaybeDone(/*inlineable_ondone=*/false);
+          },
+          &finish_ops_, /*can_inline=*/true);
       if (!ctx_->sent_initial_metadata_) {
         finish_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
                                         ctx_->initial_metadata_flags());
@@ -338,14 +340,15 @@ class CallbackClientStreamingHandler : public ::grpc::internal::MethodHandler {
       // The callback for this function should not be inlined because it invokes
       // a user-controlled reaction, but any resulting OnDone can be inlined in
       // the executor to which this callback is dispatched.
-      meta_tag_.Set(call_.call(),
-                    [this](bool ok) {
-                      ServerReadReactor<RequestType>* reactor =
-                          reactor_.load(std::memory_order_relaxed);
-                      reactor->OnSendInitialMetadataDone(ok);
-                      this->MaybeDone(/*inlineable_ondone=*/true);
-                    },
-                    &meta_ops_, /*can_inline=*/false);
+      meta_tag_.Set(
+          call_.call(),
+          [this](bool ok) {
+            ServerReadReactor<RequestType>* reactor =
+                reactor_.load(std::memory_order_relaxed);
+            reactor->OnSendInitialMetadataDone(ok);
+            this->MaybeDone(/*inlineable_ondone=*/true);
+          },
+          &meta_ops_, /*can_inline=*/false);
       meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
                                     ctx_->initial_metadata_flags());
       if (ctx_->compression_level_set()) {
@@ -375,12 +378,13 @@ class CallbackClientStreamingHandler : public ::grpc::internal::MethodHandler {
       // The callback for this function should not be inlined because it invokes
       // a user-controlled reaction, but any resulting OnDone can be inlined in
       // the executor to which this callback is dispatched.
-      read_tag_.Set(call_.call(),
-                    [this, reactor](bool ok) {
-                      reactor->OnReadDone(ok);
-                      this->MaybeDone(/*inlineable_ondone=*/true);
-                    },
-                    &read_ops_, /*can_inline=*/false);
+      read_tag_.Set(
+          call_.call(),
+          [this, reactor](bool ok) {
+            reactor->OnReadDone(ok);
+            this->MaybeDone(/*inlineable_ondone=*/true);
+          },
+          &read_ops_, /*can_inline=*/false);
       read_ops_.set_core_cq_tag(&read_tag_);
       this->BindReactor(reactor);
       this->MaybeCallOnCancel(reactor);
@@ -505,14 +509,15 @@ class CallbackServerStreamingHandler : public ::grpc::internal::MethodHandler {
       // A finish tag with only MaybeDone can have its callback inlined
       // regardless even if OnDone is not inlineable because this callback just
       // checks a ref and then decides whether or not to dispatch OnDone.
-      finish_tag_.Set(call_.call(),
-                      [this](bool) {
-                        // Inlineable OnDone can be false here because there is
-                        // no write reactor that has an inlineable OnDone; this
-                        // only applies to the DefaultReactor (which is unary).
-                        this->MaybeDone(/*inlineable_ondone=*/false);
-                      },
-                      &finish_ops_, /*can_inline=*/true);
+      finish_tag_.Set(
+          call_.call(),
+          [this](bool) {
+            // Inlineable OnDone can be false here because there is
+            // no write reactor that has an inlineable OnDone; this
+            // only applies to the DefaultReactor (which is unary).
+            this->MaybeDone(/*inlineable_ondone=*/false);
+          },
+          &finish_ops_, /*can_inline=*/true);
       finish_ops_.set_core_cq_tag(&finish_tag_);
 
       if (!ctx_->sent_initial_metadata_) {
@@ -533,14 +538,15 @@ class CallbackServerStreamingHandler : public ::grpc::internal::MethodHandler {
       // The callback for this function should not be inlined because it invokes
       // a user-controlled reaction, but any resulting OnDone can be inlined in
       // the executor to which this callback is dispatched.
-      meta_tag_.Set(call_.call(),
-                    [this](bool ok) {
-                      ServerWriteReactor<ResponseType>* reactor =
-                          reactor_.load(std::memory_order_relaxed);
-                      reactor->OnSendInitialMetadataDone(ok);
-                      this->MaybeDone(/*inlineable_ondone=*/true);
-                    },
-                    &meta_ops_, /*can_inline=*/false);
+      meta_tag_.Set(
+          call_.call(),
+          [this](bool ok) {
+            ServerWriteReactor<ResponseType>* reactor =
+                reactor_.load(std::memory_order_relaxed);
+            reactor->OnSendInitialMetadataDone(ok);
+            this->MaybeDone(/*inlineable_ondone=*/true);
+          },
+          &meta_ops_, /*can_inline=*/false);
       meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
                                     ctx_->initial_metadata_flags());
       if (ctx_->compression_level_set()) {
@@ -595,12 +601,13 @@ class CallbackServerStreamingHandler : public ::grpc::internal::MethodHandler {
       // The callback for this function should not be inlined because it invokes
       // a user-controlled reaction, but any resulting OnDone can be inlined in
       // the executor to which this callback is dispatched.
-      write_tag_.Set(call_.call(),
-                     [this, reactor](bool ok) {
-                       reactor->OnWriteDone(ok);
-                       this->MaybeDone(/*inlineable_ondone=*/true);
-                     },
-                     &write_ops_, /*can_inline=*/false);
+      write_tag_.Set(
+          call_.call(),
+          [this, reactor](bool ok) {
+            reactor->OnWriteDone(ok);
+            this->MaybeDone(/*inlineable_ondone=*/true);
+          },
+          &write_ops_, /*can_inline=*/false);
       write_ops_.set_core_cq_tag(&write_tag_);
       this->BindReactor(reactor);
       this->MaybeCallOnCancel(reactor);
@@ -707,14 +714,15 @@ class CallbackBidiHandler : public ::grpc::internal::MethodHandler {
       // A finish tag with only MaybeDone can have its callback inlined
       // regardless even if OnDone is not inlineable because this callback just
       // checks a ref and then decides whether or not to dispatch OnDone.
-      finish_tag_.Set(call_.call(),
-                      [this](bool) {
-                        // Inlineable OnDone can be false here because there is
-                        // no bidi reactor that has an inlineable OnDone; this
-                        // only applies to the DefaultReactor (which is unary).
-                        this->MaybeDone(/*inlineable_ondone=*/false);
-                      },
-                      &finish_ops_, /*can_inline=*/true);
+      finish_tag_.Set(
+          call_.call(),
+          [this](bool) {
+            // Inlineable OnDone can be false here because there is
+            // no bidi reactor that has an inlineable OnDone; this
+            // only applies to the DefaultReactor (which is unary).
+            this->MaybeDone(/*inlineable_ondone=*/false);
+          },
+          &finish_ops_, /*can_inline=*/true);
       finish_ops_.set_core_cq_tag(&finish_tag_);
 
       if (!ctx_->sent_initial_metadata_) {
@@ -735,14 +743,15 @@ class CallbackBidiHandler : public ::grpc::internal::MethodHandler {
       // The callback for this function should not be inlined because it invokes
       // a user-controlled reaction, but any resulting OnDone can be inlined in
       // the executor to which this callback is dispatched.
-      meta_tag_.Set(call_.call(),
-                    [this](bool ok) {
-                      ServerBidiReactor<RequestType, ResponseType>* reactor =
-                          reactor_.load(std::memory_order_relaxed);
-                      reactor->OnSendInitialMetadataDone(ok);
-                      this->MaybeDone(/*inlineable_ondone=*/true);
-                    },
-                    &meta_ops_, /*can_inline=*/false);
+      meta_tag_.Set(
+          call_.call(),
+          [this](bool ok) {
+            ServerBidiReactor<RequestType, ResponseType>* reactor =
+                reactor_.load(std::memory_order_relaxed);
+            reactor->OnSendInitialMetadataDone(ok);
+            this->MaybeDone(/*inlineable_ondone=*/true);
+          },
+          &meta_ops_, /*can_inline=*/false);
       meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
                                     ctx_->initial_metadata_flags());
       if (ctx_->compression_level_set()) {
@@ -798,19 +807,21 @@ class CallbackBidiHandler : public ::grpc::internal::MethodHandler {
       // The callbacks for these functions should not be inlined because they
       // invoke user-controlled reactions, but any resulting OnDones can be
       // inlined in the executor to which a callback is dispatched.
-      write_tag_.Set(call_.call(),
-                     [this, reactor](bool ok) {
-                       reactor->OnWriteDone(ok);
-                       this->MaybeDone(/*inlineable_ondone=*/true);
-                     },
-                     &write_ops_, /*can_inline=*/false);
+      write_tag_.Set(
+          call_.call(),
+          [this, reactor](bool ok) {
+            reactor->OnWriteDone(ok);
+            this->MaybeDone(/*inlineable_ondone=*/true);
+          },
+          &write_ops_, /*can_inline=*/false);
       write_ops_.set_core_cq_tag(&write_tag_);
-      read_tag_.Set(call_.call(),
-                    [this, reactor](bool ok) {
-                      reactor->OnReadDone(ok);
-                      this->MaybeDone(/*inlineable_ondone=*/true);
-                    },
-                    &read_ops_, /*can_inline=*/false);
+      read_tag_.Set(
+          call_.call(),
+          [this, reactor](bool ok) {
+            reactor->OnReadDone(ok);
+            this->MaybeDone(/*inlineable_ondone=*/true);
+          },
+          &read_ops_, /*can_inline=*/false);
       read_ops_.set_core_cq_tag(&read_tag_);
       this->BindReactor(reactor);
       this->MaybeCallOnCancel(reactor);
index a54a962..56dcb61 100644 (file)
@@ -37,6 +37,7 @@
 #include <grpcpp/impl/codegen/create_auth_context.h>
 #include <grpcpp/impl/codegen/message_allocator.h>
 #include <grpcpp/impl/codegen/metadata_map.h>
+#include <grpcpp/impl/codegen/rpc_service_method.h>
 #include <grpcpp/impl/codegen/security/auth_context.h>
 #include <grpcpp/impl/codegen/server_callback.h>
 #include <grpcpp/impl/codegen/server_interceptor.h>
@@ -75,7 +76,11 @@ template <class RequestType, class ResponseType>
 class CallbackBidiHandler;
 template <class ServiceType, class RequestType, class ResponseType>
 class ClientStreamingHandler;
-template <class ServiceType, class RequestType, class ResponseType>
+template <class ResponseType>
+void UnaryRunHandlerHelper(const MethodHandler::HandlerParameter&,
+                           ResponseType*, Status&);
+template <class ServiceType, class RequestType, class ResponseType,
+          class BaseRequestType, class BaseResponseType>
 class RpcMethodHandler;
 template <class Base>
 class FinishOnlyReactor;
@@ -355,7 +360,12 @@ class ServerContextBase {
   friend class ::grpc::ServerWriter;
   template <class W, class R>
   friend class ::grpc::internal::ServerReaderWriterBody;
-  template <class ServiceType, class RequestType, class ResponseType>
+  template <class ResponseType>
+  friend void ::grpc::internal::UnaryRunHandlerHelper(
+      const internal::MethodHandler::HandlerParameter& param, ResponseType* rsp,
+      Status& status);
+  template <class ServiceType, class RequestType, class ResponseType,
+            class BaseRequestType, class BaseResponseType>
   friend class ::grpc::internal::RpcMethodHandler;
   template <class ServiceType, class RequestType, class ResponseType>
   friend class ::grpc::internal::ClientStreamingHandler;
index b0da665..2c915c8 100644 (file)
@@ -54,7 +54,11 @@ std::shared_ptr<grpc::Channel> CreateCustomChannelWithInterceptors(
     std::vector<
         std::unique_ptr<grpc::experimental::ClientInterceptorFactoryInterface>>
         interceptor_creators);
-}
+
+/// Builds XDS Credentials.
+std::shared_ptr<ChannelCredentials> XdsCredentials(
+    const std::shared_ptr<ChannelCredentials>& fallback_creds);
+}  // namespace experimental
 
 /// A channel credentials object encapsulates all the state needed by a client
 /// to authenticate with a server for a given channel.
@@ -72,6 +76,13 @@ class ChannelCredentials : private grpc::GrpcLibraryCodegen {
       const std::shared_ptr<ChannelCredentials>& channel_creds,
       const std::shared_ptr<CallCredentials>& call_creds);
 
+  // TODO(yashykt): We need this friend declaration mainly for access to
+  // AsSecureCredentials(). Once we are able to remove insecure builds from gRPC
+  // (and also internal dependencies on the indirect method of creating a
+  // channel through credentials), we would be able to remove this.
+  friend std::shared_ptr<ChannelCredentials> grpc::experimental::XdsCredentials(
+      const std::shared_ptr<ChannelCredentials>& fallback_creds);
+
   virtual SecureChannelCredentials* AsSecureCredentials() = 0;
 
  private:
@@ -101,6 +112,11 @@ class ChannelCredentials : private grpc::GrpcLibraryCodegen {
       /*interceptor_creators*/) {
     return nullptr;
   }
+
+  // TODO(yashkt): This is a hack that is needed since InsecureCredentials can
+  // not use grpc_channel_credentials internally and should be removed after
+  // insecure builds are removed from gRPC.
+  virtual bool IsInsecure() const { return false; }
 };
 
 /// A call credentials object encapsulates the state needed by a client to
@@ -313,7 +329,7 @@ std::shared_ptr<ChannelCredentials> LocalCredentials(
 
 /// Builds TLS Credentials given TLS options.
 std::shared_ptr<ChannelCredentials> TlsCredentials(
-    const TlsCredentialsOptions& options);
+    const TlsChannelCredentialsOptions& options);
 
 }  // namespace experimental
 }  // namespace grpc
index a86d0e3..b5f0b26 100644 (file)
@@ -105,7 +105,7 @@ std::shared_ptr<ServerCredentials> LocalServerCredentials(
 
 /// Builds TLS ServerCredentials given TLS options.
 std::shared_ptr<ServerCredentials> TlsServerCredentials(
-    const experimental::TlsCredentialsOptions& options);
+    const experimental::TlsServerCredentialsOptions& options);
 
 }  // namespace experimental
 }  // namespace grpc
diff --git a/include/grpcpp/security/tls_certificate_provider.h b/include/grpcpp/security/tls_certificate_provider.h
new file mode 100644 (file)
index 0000000..797687c
--- /dev/null
@@ -0,0 +1,80 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef GRPCPP_SECURITY_TLS_CERTIFICATE_PROVIDER_H
+#define GRPCPP_SECURITY_TLS_CERTIFICATE_PROVIDER_H
+
+#include <grpc/grpc_security_constants.h>
+#include <grpc/status.h>
+#include <grpc/support/log.h>
+#include <grpcpp/impl/codegen/grpc_library.h>
+#include <grpcpp/support/config.h>
+
+#include <memory>
+#include <vector>
+
+// TODO(yihuazhang): remove the forward declaration here and include
+// <grpc/grpc_security.h> directly once the insecure builds are cleaned up.
+typedef struct grpc_tls_certificate_provider grpc_tls_certificate_provider;
+
+namespace grpc {
+namespace experimental {
+
+// Interface for a class that handles the process to fetch credential data.
+// Implementations should be a wrapper class of an internal provider
+// implementation.
+class CertificateProviderInterface {
+ public:
+  virtual ~CertificateProviderInterface() = default;
+  virtual grpc_tls_certificate_provider* c_provider() = 0;
+};
+
+// A struct that stores the credential data presented to the peer in handshake
+// to show local identity. The private_key and certificate_chain should always
+// match.
+struct IdentityKeyCertPair {
+  std::string private_key;
+  std::string certificate_chain;
+};
+
+// A basic CertificateProviderInterface implementation that will load credential
+// data from static string during initialization. This provider will always
+// return the same cert data for all cert names, and reloading is not supported.
+class StaticDataCertificateProvider : public CertificateProviderInterface {
+ public:
+  StaticDataCertificateProvider(
+      const std::string& root_certificate,
+      const std::vector<IdentityKeyCertPair>& identity_key_cert_pairs);
+
+  StaticDataCertificateProvider(const std::string& root_certificate)
+      : StaticDataCertificateProvider(root_certificate, {}) {}
+
+  StaticDataCertificateProvider(
+      const std::vector<IdentityKeyCertPair>& identity_key_cert_pairs)
+      : StaticDataCertificateProvider("", identity_key_cert_pairs) {}
+
+  ~StaticDataCertificateProvider();
+
+  grpc_tls_certificate_provider* c_provider() override { return c_provider_; }
+
+ private:
+  grpc_tls_certificate_provider* c_provider_ = nullptr;
+};
+
+}  // namespace experimental
+}  // namespace grpc
+
+#endif  // GRPCPP_SECURITY_TLS_CERTIFICATE_PROVIDER_H
index 9613e2f..aaa1a90 100644 (file)
 #include <grpc/grpc_security_constants.h>
 #include <grpc/status.h>
 #include <grpc/support/log.h>
+#include <grpcpp/security/tls_certificate_provider.h>
 #include <grpcpp/support/config.h>
 
 #include <memory>
 #include <vector>
 
-typedef struct grpc_tls_credential_reload_arg grpc_tls_credential_reload_arg;
-typedef struct grpc_tls_credential_reload_config
-    grpc_tls_credential_reload_config;
+// TODO(yihuazhang): remove the forward declaration here and include
+// <grpc/grpc_security.h> directly once the insecure builds are cleaned up.
 typedef struct grpc_tls_server_authorization_check_arg
     grpc_tls_server_authorization_check_arg;
 typedef struct grpc_tls_server_authorization_check_config
     grpc_tls_server_authorization_check_config;
 typedef struct grpc_tls_credentials_options grpc_tls_credentials_options;
+typedef struct grpc_tls_certificate_provider grpc_tls_certificate_provider;
 
 namespace grpc {
 namespace experimental {
 
-/** TLS key materials config, wrapper for grpc_tls_key_materials_config. It is
- * used for experimental purposes for now and subject to change. **/
-class TlsKeyMaterialsConfig {
- public:
-  struct PemKeyCertPair {
-    std::string private_key;
-    std::string cert_chain;
-  };
-
-  /** Getters for member fields. **/
-  const std::string pem_root_certs() const { return pem_root_certs_; }
-  const std::vector<PemKeyCertPair>& pem_key_cert_pair_list() const {
-    return pem_key_cert_pair_list_;
-  }
-  int version() const { return version_; }
-
-  /** Setter for key materials that will be called by the user. Ownership of the
-   * arguments will not be transferred. **/
-  void set_pem_root_certs(const std::string& pem_root_certs);
-  void add_pem_key_cert_pair(const PemKeyCertPair& pem_key_cert_pair);
-  void set_key_materials(
-      const std::string& pem_root_certs,
-      const std::vector<PemKeyCertPair>& pem_key_cert_pair_list);
-  void set_version(int version) { version_ = version; };
-
- private:
-  int version_ = 0;
-  std::vector<PemKeyCertPair> pem_key_cert_pair_list_;
-  std::string pem_root_certs_;
-};
-
-/** TLS credential reload arguments, wraps grpc_tls_credential_reload_arg. It is
- *  used for experimental purposes for now and it is subject to change.
- *
- *  The credential reload arg contains all the info necessary to schedule/cancel
- *  a credential reload request. The callback function must be called after
- *  finishing the schedule operation. See the description of the
- *  grpc_tls_credential_reload_arg struct in grpc_security.h for more details.
- * **/
-class TlsCredentialReloadArg {
- public:
-  /** TlsCredentialReloadArg does not take ownership of the C arg that is passed
-   *  to the constructor. One must remember to free any memory allocated to the
-   * C arg after using the setter functions below. **/
-  TlsCredentialReloadArg(grpc_tls_credential_reload_arg* arg);
-  ~TlsCredentialReloadArg();
-
-  /** Getters for member fields. **/
-  void* cb_user_data() const;
-  bool is_pem_key_cert_pair_list_empty() const;
-  grpc_ssl_certificate_config_reload_status status() const;
-  std::string error_details() const;
-
-  /** Setters for member fields. Ownership of the arguments will not be
-   *  transferred. **/
-  void set_cb_user_data(void* cb_user_data);
-  void set_pem_root_certs(const std::string& pem_root_certs);
-  void add_pem_key_cert_pair(
-      const TlsKeyMaterialsConfig::PemKeyCertPair& pem_key_cert_pair);
-  void set_key_materials(const std::string& pem_root_certs,
-                         std::vector<TlsKeyMaterialsConfig::PemKeyCertPair>
-                             pem_key_cert_pair_list);
-  void set_key_materials_config(
-      const std::shared_ptr<TlsKeyMaterialsConfig>& key_materials_config);
-  void set_status(grpc_ssl_certificate_config_reload_status status);
-  void set_error_details(const std::string& error_details);
-
-  /** Calls the C arg's callback function. **/
-  void OnCredentialReloadDoneCallback();
-
- private:
-  grpc_tls_credential_reload_arg* c_arg_;
-};
-
-/** An interface that the application derives and uses to instantiate a
- * TlsCredentialReloadConfig instance. Refer to the definition of the
- * grpc_tls_credential_reload_config in grpc_tls_credentials_options.h for more
- * details on the expectations of the member functions of the interface. **/
-struct TlsCredentialReloadInterface {
-  virtual ~TlsCredentialReloadInterface() = default;
-  /** A callback that invokes the credential reload. **/
-  virtual int Schedule(TlsCredentialReloadArg* arg) = 0;
-  /** A callback that cancels a credential reload request. **/
-  virtual void Cancel(TlsCredentialReloadArg* /* arg */) {}
-};
-
-/** TLS credential reloag config, wraps grpc_tls_credential_reload_config. It is
- * used for experimental purposes for now and it is subject to change. **/
-class TlsCredentialReloadConfig {
- public:
-  TlsCredentialReloadConfig(std::shared_ptr<TlsCredentialReloadInterface>
-                                credential_reload_interface);
-  ~TlsCredentialReloadConfig();
-
-  int Schedule(TlsCredentialReloadArg* arg) const {
-    if (credential_reload_interface_ == nullptr) {
-      gpr_log(GPR_ERROR, "credential reload interface is nullptr");
-      if (arg != nullptr) {
-        arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL);
-        arg->set_error_details(
-            "the interface of the credential reload config is nullptr");
-      }
-      return 1;
-    }
-    return credential_reload_interface_->Schedule(arg);
-  }
-
-  void Cancel(TlsCredentialReloadArg* arg) const {
-    if (credential_reload_interface_ == nullptr) {
-      gpr_log(GPR_ERROR, "credential reload interface is nullptr");
-      if (arg != nullptr) {
-        arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL);
-        arg->set_error_details(
-            "the interface of the credential reload config is nullptr");
-      }
-      return;
-    }
-    credential_reload_interface_->Cancel(arg);
-  }
-
-  /** Returns a C struct for the credential reload config. **/
-  grpc_tls_credential_reload_config* c_config() const { return c_config_; }
-
- private:
-  grpc_tls_credential_reload_config* c_config_;
-  std::shared_ptr<TlsCredentialReloadInterface> credential_reload_interface_;
-};
-
 /** TLS server authorization check arguments, wraps
  *  grpc_tls_server_authorization_check_arg. It is used for experimental
  *  purposes for now and it is subject to change.
@@ -272,71 +145,85 @@ class TlsServerAuthorizationCheckConfig {
       server_authorization_check_interface_;
 };
 
-/** TLS credentials options, wrapper for grpc_tls_credentials_options. It is
- * used for experimental purposes for now and it is subject to change. See the
- * description of the grpc_tls_credentials_options struct in grpc_security.h for
- * more details. **/
+// Base class of configurable options specified by users to configure their
+// certain security features supported in TLS. It is used for experimental
+// purposes for now and it is subject to change.
 class TlsCredentialsOptions {
  public:
-  // Constructor for client.
+  // Constructor for base class TlsCredentialsOptions.
+  //
+  // @param certificate_provider the provider which fetches TLS credentials that
+  // will be used in the TLS handshake
   explicit TlsCredentialsOptions(
-      grpc_tls_server_verification_option server_verification_option,
-      std::shared_ptr<TlsKeyMaterialsConfig> key_materials_config,
-      std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config,
-      std::shared_ptr<TlsServerAuthorizationCheckConfig>
-          server_authorization_check_config);
+      std::shared_ptr<CertificateProviderInterface> certificate_provider);
+  // ---- Setters for member fields ----
+  // Watches the updates of root certificates with name |root_cert_name|.
+  // If used in TLS credentials, it should always be set unless the root
+  // certificates are not needed(e.g. in the one-side TLS scenario, the server
+  // is not required to verify the client).
+  void watch_root_certs();
+  // Sets the name of root certificates being watched, if |watch_root_certs| is
+  // called. If not set, an empty string will be used as the name.
+  //
+  // @param root_cert_name the name of root certs being set.
+  void set_root_cert_name(const std::string& root_cert_name);
+  // Watches the updates of identity key-cert pairs with name
+  // |identity_cert_name|. If used in TLS credentials, it should always be set
+  // unless the identity certificates are not needed(e.g. in the one-side TLS
+  // scenario, the client is not required to provide certs).
+  void watch_identity_key_cert_pairs();
+  // Sets the name of identity key-cert pairs being watched, if
+  // |watch_identity_key_cert_pairs| is called. If not set, an empty string will
+  // be used as the name.
+  //
+  // @param identity_cert_name the name of identity key-cert pairs being set.
+  void set_identity_cert_name(const std::string& identity_cert_name);
+
+  // ----- Getters for member fields ----
+  // Get the internal c options. This function shall be used only internally.
+  grpc_tls_credentials_options* c_credentials_options() const {
+    return c_credentials_options_;
+  }
 
-  // Constructor for server.
-  explicit TlsCredentialsOptions(
-      grpc_ssl_client_certificate_request_type cert_request_type,
-      std::shared_ptr<TlsKeyMaterialsConfig> key_materials_config,
-      std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config);
+ private:
+  std::shared_ptr<CertificateProviderInterface> certificate_provider_;
+  grpc_tls_credentials_options* c_credentials_options_ = nullptr;
+};
 
-  // This constructor will be deprecated.
-  TlsCredentialsOptions(
-      grpc_ssl_client_certificate_request_type cert_request_type,
-      grpc_tls_server_verification_option server_verification_option,
-      std::shared_ptr<TlsKeyMaterialsConfig> key_materials_config,
-      std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config,
+// Contains configurable options on the client side.
+// It is used for experimental purposes for now and it is subject to change.
+class TlsChannelCredentialsOptions final : public TlsCredentialsOptions {
+ public:
+  explicit TlsChannelCredentialsOptions(
+      std::shared_ptr<CertificateProviderInterface> certificate_provider)
+      : TlsCredentialsOptions(std::move(certificate_provider)) {}
+
+  // Sets the option to verify the server.
+  // The default is GRPC_TLS_SERVER_VERIFICATION.
+  void set_server_verification_option(
+      grpc_tls_server_verification_option server_verification_option);
+  // Sets the custom authorization config.
+  void set_server_authorization_check_config(
       std::shared_ptr<TlsServerAuthorizationCheckConfig>
-          server_authorization_check_config);
-  ~TlsCredentialsOptions();
+          authorization_check_config);
 
-  /** Getters for member fields. **/
-  grpc_ssl_client_certificate_request_type cert_request_type() const {
-    return cert_request_type_;
-  }
-  grpc_tls_server_verification_option server_verification_option() const {
-    return server_verification_option_;
-  }
-  std::shared_ptr<TlsKeyMaterialsConfig> key_materials_config() const {
-    return key_materials_config_;
-  }
-  std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config() const {
-    return credential_reload_config_;
-  }
-  std::shared_ptr<TlsServerAuthorizationCheckConfig>
-  server_authorization_check_config() const {
-    return server_authorization_check_config_;
-  }
-  grpc_tls_credentials_options* c_credentials_options() const {
-    return c_credentials_options_;
-  }
+ private:
+};
+
+// Contains configurable options on the server side.
+// It is used for experimental purposes for now and it is subject to change.
+class TlsServerCredentialsOptions final : public TlsCredentialsOptions {
+ public:
+  explicit TlsServerCredentialsOptions(
+      std::shared_ptr<CertificateProviderInterface> certificate_provider)
+      : TlsCredentialsOptions(std::move(certificate_provider)) {}
+
+  // Sets option to request the certificates from the client.
+  // The default is GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE.
+  void set_cert_request_type(
+      grpc_ssl_client_certificate_request_type cert_request_type);
 
  private:
-  /** The cert_request_type_ flag is only relevant when the
-   * TlsCredentialsOptions are used to instantiate server credentials; the flag
-   * goes unused when creating channel credentials, and the user can set it to
-   * GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE. **/
-  grpc_ssl_client_certificate_request_type cert_request_type_;
-  /** The server_verification_option_ flag is only relevant when the
-   * TlsCredentialsOptions are used to instantiate client credentials; **/
-  grpc_tls_server_verification_option server_verification_option_;
-  std::shared_ptr<TlsKeyMaterialsConfig> key_materials_config_;
-  std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config_;
-  std::shared_ptr<TlsServerAuthorizationCheckConfig>
-      server_authorization_check_config_;
-  grpc_tls_credentials_options* c_credentials_options_;
 };
 
 }  // namespace experimental
index 576cdc7..06a0c83 100644 (file)
@@ -124,7 +124,7 @@ class ServerBuilder {
   /// connections.  Valid values include dns:///localhost:1234, /
   /// 192.168.1.1:31416, dns:///[::1]:27182, etc.).
   /// \param creds The credentials associated with the server.
-  /// \param selected_port[out] If not `nullptr`, gets populated with the port
+  /// \param[out] selected_port If not `nullptr`, gets populated with the port
   /// number bound to the \a grpc::Server for the corresponding endpoint after
   /// it is successfully bound by BuildAndStart(), 0 otherwise. AddListeningPort
   /// does not modify this pointer.
index d0951e5..416bc76 100644 (file)
@@ -13,8 +13,8 @@
  <date>2019-09-24</date>
  <time>16:06:07</time>
  <version>
-  <release>1.33.2</release>
-  <api>1.33.2</api>
+  <release>1.34.0</release>
+  <api>1.34.0</api>
  </version>
  <stability>
   <release>stable</release>
@@ -22,7 +22,7 @@
  </stability>
  <license>Apache 2.0</license>
  <notes>
-- gRPC Core 1.33.2 update
+- gRPC Core 1.34.0 update
  </notes>
  <contents>
   <dir baseinstalldir="/" name="/">
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/cds.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/eds.cc" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy_factory.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy_registry.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/validate/validate.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/validate/validate.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/api/http.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/api/http.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/validate/validate.upbdefs.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/validate/validate.upbdefs.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/certificate_provider_factory.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/certificate_provider_registry.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/certificate_provider_registry.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/xds/certificate_provider_store.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/certificate_provider_store.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/xds/file_watcher_certificate_provider_factory.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/xds/file_watcher_certificate_provider_factory.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/xds_api.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/xds_api.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/xds_bootstrap.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/xds_bootstrap.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/xds/xds_certificate_provider.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/xds/xds_certificate_provider.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/xds_channel_args.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/xds_client.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/xds/xds_client.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gpr/tls_msvc.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gpr/tls_pthread.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gpr/tls_pthread.h" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/gpr/tls_stdcpp.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gpr/tmpfile.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gpr/tmpfile_msys.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gpr/tmpfile_posix.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gprpp/atomic.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gprpp/debug_location.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gprpp/dual_ref_counted.h" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/gprpp/examine_stack.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/gprpp/examine_stack.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gprpp/fork.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gprpp/fork.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gprpp/global_config.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gprpp/orphanable.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gprpp/ref_counted.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gprpp/ref_counted_ptr.h" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/gprpp/stat.h" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/gprpp/stat_posix.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/gprpp/stat_windows.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gprpp/sync.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gprpp/thd.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/gprpp/thd_posix.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/authorization/mock_cel/cel_value.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/authorization/mock_cel/evaluator_core.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/authorization/mock_cel/flat_expr_builder.h" role="src" />
-    <file baseinstalldir="/" name="src/core/lib/security/authorization/mock_cel/statusor.h" role="src" />
-    <file baseinstalldir="/" name="src/core/lib/security/certificate_provider.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/context/security_context.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/context/security_context.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/alts/alts_credentials.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/credentials.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/credentials.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/credentials_metadata.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/credentials/external/aws_request_signer.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/credentials/external/aws_request_signer.h" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/credentials/external/external_account_credentials.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/credentials/external/external_account_credentials.h" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/credentials/external/file_external_account_credentials.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/credentials/external/file_external_account_credentials.h" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/credentials/external/url_external_account_credentials.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/credentials/external/url_external_account_credentials.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/fake/fake_credentials.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/fake/fake_credentials.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/google_default/credentials_generic.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/google_default/google_default_credentials.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/iam/iam_credentials.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/iam/iam_credentials.h" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/credentials/insecure/insecure_credentials.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/jwt/json_token.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/jwt/json_token.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/jwt/jwt_credentials.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/ssl/ssl_credentials.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/tls/tls_credentials.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/security_connector/alts/alts_security_connector.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/security_connector/fake/fake_security_connector.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/security_connector/fake/fake_security_connector.h" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/security_connector/insecure/insecure_security_connector.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/security/security_connector/insecure/insecure_security_connector.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/security_connector/load_system_roots.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/security_connector/load_system_roots_fallback.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/security_connector/load_system_roots_linux.cc" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/casts.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/config.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/const_init.h" role="src" />
-    <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/dynamic_annotations.cc" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/dynamic_annotations.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/internal/atomic_hook.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/internal/bits.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/internal/cycleclock.cc" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/internal/cycleclock.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/internal/direct_mmap.h" role="src" />
+    <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/internal/endian.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/internal/errno_saver.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/base/internal/exponential_biased.cc" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/debugging/stacktrace.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/debugging/symbolize.cc" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/debugging/symbolize.h" role="src" />
+    <file baseinstalldir="/" name="third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/debugging/symbolize_elf.inc" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/debugging/symbolize_win32.inc" role="src" />
+    <file baseinstalldir="/" name="third_party/abseil-cpp/absl/functional/bind_front.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/functional/function_ref.h" role="src" />
+    <file baseinstalldir="/" name="third_party/abseil-cpp/absl/functional/internal/front_binder.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/functional/internal/function_ref.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/hash/hash.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/hash/internal/city.cc" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/numeric/int128.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc" role="src" />
+    <file baseinstalldir="/" name="third_party/abseil-cpp/absl/status/internal/status_internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/status/status.cc" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/status/status.h" role="src" />
     <file baseinstalldir="/" name="third_party/abseil-cpp/absl/status/status_payload_printer.cc" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c" role="src" />
     <file baseinstalldir="/" name="third_party/re2/util/util.h" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/decode.c" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/decode.h" role="src" />
+    <file baseinstalldir="/" name="third_party/upb/upb/def.c" role="src" />
+    <file baseinstalldir="/" name="third_party/upb/upb/def.h" role="src" />
+    <file baseinstalldir="/" name="third_party/upb/upb/def.hpp" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/encode.c" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/encode.h" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/msg.c" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/port.c" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/port_def.inc" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/port_undef.inc" role="src" />
+    <file baseinstalldir="/" name="third_party/upb/upb/reflection.c" role="src" />
+    <file baseinstalldir="/" name="third_party/upb/upb/reflection.h" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/table.c" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/table.int.h" role="src" />
+    <file baseinstalldir="/" name="third_party/upb/upb/text_encode.c" role="src" />
+    <file baseinstalldir="/" name="third_party/upb/upb/text_encode.h" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/upb.c" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/upb.h" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/upb.hpp" role="src" />
  <dependencies>
   <required>
    <php>
-    <min>5.5.0</min>
+    <min>7.0.0</min>
    </php>
    <pearinstaller>
     <min>1.4.0</min>
index 184d545..4b8c9d4 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -133,6 +133,11 @@ BUILD_WITH_SYSTEM_ZLIB = os.environ.get('GRPC_PYTHON_BUILD_SYSTEM_ZLIB', False)
 BUILD_WITH_SYSTEM_CARES = os.environ.get('GRPC_PYTHON_BUILD_SYSTEM_CARES',
                                          False)
 
+# Export this variable to use the system installation of re2. You need to
+# have the header files installed (in /usr/include/re2) and during
+# runtime, the shared library must be installed
+BUILD_WITH_SYSTEM_RE2 = os.environ.get('GRPC_PYTHON_BUILD_SYSTEM_RE2', False)
+
 # For local development use only: This skips building gRPC Core and its
 # dependencies, including protobuf and boringssl. This allows "incremental"
 # compilation by first building gRPC Core using make, then building only the
@@ -258,6 +263,10 @@ if BUILD_WITH_SYSTEM_CARES:
     CORE_C_FILES = filter(lambda x: 'third_party/cares' not in x, CORE_C_FILES)
     CARES_INCLUDE = (os.path.join('/usr', 'include'),)
 
+if BUILD_WITH_SYSTEM_RE2:
+    CORE_C_FILES = filter(lambda x: 'third_party/re2' not in x, CORE_C_FILES)
+    RE2_INCLUDE = (os.path.join('/usr', 'include', 're2'),)
+
 EXTENSION_INCLUDE_DIRECTORIES = ((PYTHON_STEM,) + CORE_INCLUDE + ABSL_INCLUDE +
                                  ADDRESS_SORTING_INCLUDE + CARES_INCLUDE +
                                  RE2_INCLUDE + SSL_INCLUDE + UPB_INCLUDE +
@@ -284,12 +293,14 @@ if BUILD_WITH_SYSTEM_ZLIB:
     EXTENSION_LIBRARIES += ('z',)
 if BUILD_WITH_SYSTEM_CARES:
     EXTENSION_LIBRARIES += ('cares',)
+if BUILD_WITH_SYSTEM_RE2:
+    EXTENSION_LIBRARIES += ('re2',)
 
 DEFINE_MACROS = (('_WIN32_WINNT', 0x600),)
 asm_files = []
 
 asm_key = ''
-if BUILD_WITH_BORING_SSL_ASM:
+if BUILD_WITH_BORING_SSL_ASM and not BUILD_WITH_SYSTEM_OPENSSL:
     LINUX_X86_64 = 'linux-x86_64'
     LINUX_ARM = 'linux-arm'
     if LINUX_X86_64 == util.get_platform():
@@ -341,15 +352,15 @@ if "linux" in sys.platform or "darwin" in sys.platform:
     DEFINE_MACROS += (('GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK', 1),)
 
 # By default, Python3 distutils enforces compatibility of
-# c plugins (.so files) with the OSX version Python3 was built with.
-# For Python3.4, this is OSX 10.6, but we need Thread Local Support (__thread)
-if 'darwin' in sys.platform and PY3:
+# c plugins (.so files) with the OSX version Python was built with.
+# We need OSX 10.10, the oldest which supports C++ thread_local.
+if 'darwin' in sys.platform:
     mac_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
     if mac_target and (pkg_resources.parse_version(mac_target) <
-                       pkg_resources.parse_version('10.7.0')):
-        os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.7'
+                       pkg_resources.parse_version('10.10.0')):
+        os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.10'
         os.environ['_PYTHON_HOST_PLATFORM'] = re.sub(
-            r'macosx-[0-9]+\.[0-9]+-(.+)', r'macosx-10.7-\1',
+            r'macosx-[0-9]+\.[0-9]+-(.+)', r'macosx-10.10-\1',
             util.get_platform())
 
 
diff --git a/spm-core-include/grpc b/spm-core-include/grpc
new file mode 120000 (symlink)
index 0000000..bc769f9
--- /dev/null
@@ -0,0 +1 @@
+../include/grpc
\ No newline at end of file
diff --git a/spm-cpp-include/grpcpp b/spm-cpp-include/grpcpp
new file mode 120000 (symlink)
index 0000000..ef3aa90
--- /dev/null
@@ -0,0 +1 @@
+../include/grpcpp
\ No newline at end of file
index a6a35f2..257efad 100644 (file)
   name: absl/base:core_headers
   src: []
 - cmake_target: absl::dynamic_annotations
-  deps: []
+  deps:
+  - absl/base:config
+  - absl/base:core_headers
   headers:
   - third_party/abseil-cpp/absl/base/dynamic_annotations.h
+  - third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h
   name: absl/base:dynamic_annotations
-  src:
-  - third_party/abseil-cpp/absl/base/dynamic_annotations.cc
+  src: []
 - cmake_target: absl::endian
   deps:
   - absl/base:config
   name: absl/base:exponential_biased
   src:
   - third_party/abseil-cpp/absl/base/internal/exponential_biased.cc
+- cmake_target: absl::fast_type_id
+  deps:
+  - absl/base:config
+  headers:
+  - third_party/abseil-cpp/absl/base/internal/fast_type_id.h
+  name: absl/base:fast_type_id
+  src: []
 - cmake_target: absl::log_severity
   deps:
   - absl/base:config
   name: absl/base:spinlock_wait
   src:
   - third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc
+- cmake_target: absl::strerror
+  deps:
+  - absl/base:config
+  - absl/base:core_headers
+  - absl/base:errno_saver
+  headers:
+  - third_party/abseil-cpp/absl/base/internal/strerror.h
+  name: absl/base:strerror
+  src:
+  - third_party/abseil-cpp/absl/base/internal/strerror.cc
 - cmake_target: absl::throw_delegate
   deps:
   - absl/base:config
   - absl/container:layout
   - absl/memory:memory
   - absl/meta:type_traits
+  - absl/strings:cord
   - absl/strings:strings
   - absl/types:compare
   - absl/utility:utility
   src: []
 - cmake_target: absl::container_memory
   deps:
+  - absl/base:config
   - absl/memory:memory
+  - absl/meta:type_traits
   - absl/utility:utility
   headers:
   - third_party/abseil-cpp/absl/container/internal/container_memory.h
 - cmake_target: absl::fixed_array
   deps:
   - absl/algorithm:algorithm
+  - absl/base:config
   - absl/base:core_headers
   - absl/base:dynamic_annotations
   - absl/base:throw_delegate
   deps:
   - absl/base:config
   - absl/hash:hash
+  - absl/strings:cord
   - absl/strings:strings
   headers:
   - third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h
   src: []
 - cmake_target: absl::layout
   deps:
+  - absl/base:config
   - absl/base:core_headers
   - absl/meta:type_traits
   - absl/strings:strings
   - absl/base:raw_logging_internal
   - absl/debugging:debugging_internal
   - absl/debugging:demangle_internal
+  - absl/strings:strings
   headers:
   - third_party/abseil-cpp/absl/debugging/internal/symbolize.h
   - third_party/abseil-cpp/absl/debugging/symbolize.h
+  - third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc
   - third_party/abseil-cpp/absl/debugging/symbolize_elf.inc
   - third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc
   - third_party/abseil-cpp/absl/debugging/symbolize_win32.inc
   name: absl/debugging:symbolize
   src:
   - third_party/abseil-cpp/absl/debugging/symbolize.cc
+- cmake_target: absl::flags_commandlineflag
+  deps:
+  - absl/base:config
+  - absl/base:fast_type_id
+  - absl/flags:commandlineflag_internal
+  - absl/strings:strings
+  - absl/types:optional
+  headers:
+  - third_party/abseil-cpp/absl/flags/commandlineflag.h
+  name: absl/flags:commandlineflag
+  src:
+  - third_party/abseil-cpp/absl/flags/commandlineflag.cc
+- cmake_target: absl::flags_commandlineflag_internal
+  deps:
+  - absl/base:config
+  - absl/base:fast_type_id
+  headers:
+  - third_party/abseil-cpp/absl/flags/internal/commandlineflag.h
+  name: absl/flags:commandlineflag_internal
+  src:
+  - third_party/abseil-cpp/absl/flags/internal/commandlineflag.cc
 - cmake_target: absl::flags_config
   deps:
   - absl/base:config
   - absl/base:core_headers
   - absl/flags:config
   - absl/flags:flag_internal
-  - absl/flags:handle
-  - absl/flags:marshalling
-  - absl/flags:registry
+  - absl/flags:reflection
   - absl/strings:strings
   headers:
   - third_party/abseil-cpp/absl/flags/declare.h
   - absl/base:base
   - absl/base:config
   - absl/base:core_headers
+  - absl/flags:commandlineflag
+  - absl/flags:commandlineflag_internal
   - absl/flags:config
-  - absl/flags:handle
-  - absl/flags:registry
+  - absl/flags:marshalling
+  - absl/flags:reflection
   - absl/memory:memory
+  - absl/meta:type_traits
   - absl/strings:strings
   - absl/synchronization:synchronization
+  - absl/utility:utility
   headers:
   - third_party/abseil-cpp/absl/flags/internal/flag.h
   name: absl/flags:flag_internal
   src:
   - third_party/abseil-cpp/absl/flags/internal/flag.cc
-- cmake_target: absl::flags_handle
-  deps:
-  - absl/base:config
-  - absl/base:core_headers
-  - absl/flags:config
-  - absl/flags:marshalling
-  - absl/strings:strings
-  - absl/types:optional
-  headers:
-  - third_party/abseil-cpp/absl/flags/internal/commandlineflag.h
-  name: absl/flags:handle
-  src: []
 - cmake_target: absl::flags_marshalling
   deps:
   - absl/base:config
   deps:
   - absl/base:config
   - absl/base:core_headers
+  - absl/flags:commandlineflag
+  - absl/flags:commandlineflag_internal
   - absl/flags:config
   - absl/flags:flag
   - absl/flags:flag_internal
-  - absl/flags:handle
+  - absl/flags:private_handle_accessor
   - absl/flags:program_name
-  - absl/flags:registry
+  - absl/flags:reflection
   - absl/flags:usage
   - absl/flags:usage_internal
   - absl/strings:strings
   - third_party/abseil-cpp/absl/flags/internal/path_util.h
   name: absl/flags:path_util
   src: []
+- cmake_target: absl::flags_private_handle_accessor
+  deps:
+  - absl/base:config
+  - absl/flags:commandlineflag
+  - absl/flags:commandlineflag_internal
+  - absl/strings:strings
+  headers:
+  - third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.h
+  name: absl/flags:private_handle_accessor
+  src:
+  - third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.cc
 - cmake_target: absl::flags_program_name
   deps:
   - absl/base:config
   name: absl/flags:program_name
   src:
   - third_party/abseil-cpp/absl/flags/internal/program_name.cc
-- cmake_target: absl::flags_registry
+- cmake_target: absl::flags_reflection
   deps:
   - absl/base:config
   - absl/base:core_headers
-  - absl/base:raw_logging_internal
+  - absl/container:flat_hash_map
+  - absl/flags:commandlineflag
+  - absl/flags:commandlineflag_internal
   - absl/flags:config
-  - absl/flags:handle
+  - absl/flags:private_handle_accessor
   - absl/strings:strings
   - absl/synchronization:synchronization
   headers:
   - third_party/abseil-cpp/absl/flags/internal/registry.h
-  - third_party/abseil-cpp/absl/flags/internal/type_erased.h
-  name: absl/flags:registry
+  - third_party/abseil-cpp/absl/flags/reflection.h
+  name: absl/flags:reflection
   src:
-  - third_party/abseil-cpp/absl/flags/internal/registry.cc
-  - third_party/abseil-cpp/absl/flags/internal/type_erased.cc
+  - third_party/abseil-cpp/absl/flags/reflection.cc
 - cmake_target: absl::flags_usage
   deps:
   - absl/base:config
   deps:
   - absl/base:config
   - absl/base:core_headers
+  - absl/flags:commandlineflag
   - absl/flags:config
   - absl/flags:flag
   - absl/flags:flag_internal
-  - absl/flags:handle
   - absl/flags:path_util
+  - absl/flags:private_handle_accessor
   - absl/flags:program_name
-  - absl/flags:registry
+  - absl/flags:reflection
   - absl/strings:strings
   headers:
   - third_party/abseil-cpp/absl/flags/internal/usage.h
   src: []
 - cmake_target: absl::int128
   deps:
+  - absl/base:bits
   - absl/base:config
   - absl/base:core_headers
   headers:
 - cmake_target: absl::random_internal_distribution_caller
   deps:
   - absl/base:config
+  - absl/base:fast_type_id
+  - absl/utility:utility
   headers:
   - third_party/abseil-cpp/absl/random/internal/distribution_caller.h
   name: absl/random/internal:distribution_caller
   src: []
-- cmake_target: absl::random_internal_distributions
-  deps:
-  - absl/base:base
-  - absl/meta:type_traits
-  - absl/random/internal:distribution_caller
-  - absl/random/internal:traits
-  - absl/random/internal:uniform_helper
-  - absl/strings:strings
-  headers:
-  - third_party/abseil-cpp/absl/random/internal/distributions.h
-  name: absl/random/internal:distributions
-  src: []
 - cmake_target: absl::random_internal_fast_uniform_bits
   deps:
   - absl/base:config
+  - absl/meta:type_traits
   headers:
   - third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h
   name: absl/random/internal:fast_uniform_bits
   - third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h
   name: absl/random/internal:iostream_state_saver
   src: []
-- cmake_target: absl::random_internal_mocking_bit_gen_base
+- cmake_target: absl::random_internal_mock_helpers
   deps:
-  - absl/random:random
-  - absl/strings:strings
+  - absl/base:fast_type_id
+  - absl/types:optional
   headers:
-  - third_party/abseil-cpp/absl/random/internal/mocking_bit_gen_base.h
-  name: absl/random/internal:mocking_bit_gen_base
+  - third_party/abseil-cpp/absl/random/internal/mock_helpers.h
+  name: absl/random/internal:mock_helpers
   src: []
 - cmake_target: ''
   deps:
+  - absl/base:config
   - absl/base:core_headers
   - absl/base:raw_logging_internal
   - absl/random/internal:platform
   - absl/random/internal:pool_urbg
   - absl/random/internal:salted_seed_seq
   - absl/random/internal:seed_material
-  - absl/strings:strings
   - absl/types:optional
   - absl/types:span
   headers:
   - absl/base:config
   headers:
   - third_party/abseil-cpp/absl/random/internal/platform.h
-  - third_party/abseil-cpp/absl/random/internal/randen-keys.inc
   - third_party/abseil-cpp/absl/random/internal/randen_traits.h
   name: absl/random/internal:platform
-  src: []
+  src:
+  - third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc
 - cmake_target: absl::random_internal_pool_urbg
   deps:
   - absl/base:base
   src: []
 - cmake_target: absl::random_internal_uniform_helper
   deps:
+  - absl/base:config
   - absl/meta:type_traits
+  - absl/random/internal:traits
   headers:
   - third_party/abseil-cpp/absl/random/internal/uniform_helper.h
   name: absl/random/internal:uniform_helper
 - cmake_target: absl::random_bit_gen_ref
   deps:
   - absl/base:core_headers
+  - absl/base:fast_type_id
   - absl/meta:type_traits
   - absl/random/internal:distribution_caller
   - absl/random/internal:fast_uniform_bits
-  - absl/random/internal:mocking_bit_gen_base
+  - absl/random:random
   headers:
   - third_party/abseil-cpp/absl/random/bit_gen_ref.h
   name: absl/random:bit_gen_ref
   - absl/base:config
   - absl/base:core_headers
   - absl/meta:type_traits
-  - absl/random/internal:distributions
+  - absl/random/internal:distribution_caller
   - absl/random/internal:fast_uniform_bits
   - absl/random/internal:fastmath
   - absl/random/internal:generate_real
   - absl/random/internal:uniform_helper
   - absl/random/internal:wide_multiply
   - absl/strings:strings
-  - absl/types:span
   headers:
   - third_party/abseil-cpp/absl/random/bernoulli_distribution.h
   - third_party/abseil-cpp/absl/random/beta_distribution.h
   - third_party/abseil-cpp/absl/random/discrete_distribution.h
-  - third_party/abseil-cpp/absl/random/distribution_format_traits.h
   - third_party/abseil-cpp/absl/random/distributions.h
   - third_party/abseil-cpp/absl/random/exponential_distribution.h
   - third_party/abseil-cpp/absl/random/gaussian_distribution.h
   - third_party/abseil-cpp/absl/random/seed_sequences.cc
 - cmake_target: absl::status
   deps:
+  - absl/base:atomic_hook
   - absl/base:config
   - absl/base:core_headers
   - absl/base:raw_logging_internal
   - absl/strings:strings
   - absl/types:optional
   headers:
+  - third_party/abseil-cpp/absl/status/internal/status_internal.h
   - third_party/abseil-cpp/absl/status/status.h
   - third_party/abseil-cpp/absl/status/status_payload_printer.h
   name: absl/status:status
   src:
   - third_party/abseil-cpp/absl/status/status.cc
   - third_party/abseil-cpp/absl/status/status_payload_printer.cc
+- cmake_target: absl::statusor
+  deps:
+  - absl/base:core_headers
+  - absl/base:raw_logging_internal
+  - absl/meta:type_traits
+  - absl/status:status
+  - absl/strings:strings
+  - absl/types:variant
+  - absl/utility:utility
+  headers:
+  - third_party/abseil-cpp/absl/status/internal/statusor_internal.h
+  - third_party/abseil-cpp/absl/status/statusor.h
+  name: absl/status:statusor
+  src:
+  - third_party/abseil-cpp/absl/status/statusor.cc
 - cmake_target: absl::cord
   deps:
   - absl/base:base
-  - absl/base:base_internal
   - absl/base:core_headers
   - absl/base:endian
   - absl/base:raw_logging_internal
   - absl/strings:internal
   - absl/strings:str_format
   - absl/strings:strings
+  - absl/types:optional
   headers:
   - third_party/abseil-cpp/absl/strings/cord.h
   name: absl/strings:cord
   - third_party/abseil-cpp/absl/strings/cord.cc
 - cmake_target: absl::cord
   deps:
+  - absl/base:base_internal
+  - absl/container:compressed_tuple
   - absl/meta:type_traits
   - absl/strings:strings
   headers:
   src: []
 - cmake_target: absl::str_format_internal
   deps:
+  - absl/base:bits
   - absl/base:config
   - absl/base:core_headers
+  - absl/functional:function_ref
   - absl/meta:type_traits
   - absl/numeric:int128
   - absl/strings:strings
+  - absl/types:optional
   - absl/types:span
   headers:
   - third_party/abseil-cpp/absl/strings/internal/str_format/arg.h
   deps:
   - absl/base:config
   - absl/base:core_headers
+  - absl/base:fast_type_id
   - absl/meta:type_traits
   - absl/types:bad_any_cast
   - absl/utility:utility
index 6d9079b..45c39ff 100755 (executable)
@@ -14,7 +14,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import print_function
 import os
 import sys
 import glob
index f1310c5..85fa0e5 100644 (file)
@@ -1,4 +1,4 @@
-// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: 88aeb757f1a415c71fb4cbf5af936ecae4bc8179
+// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: 29c6e0e27268f5a43e039cd2ed4e849d6b736fc1
 
 // Copyright (c) 2018, Google Inc.
 //
 #define SSL_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_accept)
 #define SSL_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add0_chain_cert)
 #define SSL_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add1_chain_cert)
+#define SSL_add_application_settings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_application_settings)
 #define SSL_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_client_CA)
 #define SSL_add_file_cert_subjects_to_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_file_cert_subjects_to_stack)
 #define SSL_alert_desc_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_desc_string)
 #define SSL_dup_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_dup_CA_list)
 #define SSL_early_callback_ctx_extension_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_callback_ctx_extension_get)
 #define SSL_early_data_accepted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_data_accepted)
+#define SSL_early_data_reason_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_data_reason_string)
 #define SSL_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_ocsp_stapling)
 #define SSL_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_signed_cert_timestamps)
 #define SSL_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_tls_channel_id)
 #define SSL_get0_next_proto_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_next_proto_negotiated)
 #define SSL_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_ocsp_response)
 #define SSL_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_param)
+#define SSL_get0_peer_application_settings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_application_settings)
 #define SSL_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_certificates)
 #define SSL_get0_peer_delegation_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_delegation_algorithms)
 #define SSL_get0_peer_verify_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_verify_algorithms)
 #define SSL_get_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_wbio)
 #define SSL_get_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_wfd)
 #define SSL_get_write_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_write_sequence)
+#define SSL_has_application_settings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_has_application_settings)
 #define SSL_in_early_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_early_data)
 #define SSL_in_false_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_false_start)
 #define SSL_in_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_init)
 #define BIO_set_mem_eof_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_mem_eof_return)
 #define BIO_set_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_nbio)
 #define BIO_set_retry_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_read)
+#define BIO_set_retry_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_reason)
 #define BIO_set_retry_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_special)
 #define BIO_set_retry_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_write)
 #define BIO_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_shutdown)
 #define CRYPTO_cleanup_all_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cleanup_all_ex_data)
 #define CRYPTO_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt)
 #define CRYPTO_ctr128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt_ctr32)
-#define CRYPTO_fork_detect_ignore_madv_wipeonfork_for_testing BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_fork_detect_ignore_madv_wipeonfork_for_testing)
 #define CRYPTO_free_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_free_ex_data)
 #define CRYPTO_gcm128_aad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_aad)
 #define CRYPTO_gcm128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_decrypt)
 #define EVP_aead_aes_128_ccm_bluetooth_8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ccm_bluetooth_8)
 #define EVP_aead_aes_128_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ctr_hmac_sha256)
 #define EVP_aead_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm)
+#define EVP_aead_aes_128_gcm_randnonce BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_randnonce)
 #define EVP_aead_aes_128_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_siv)
 #define EVP_aead_aes_128_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_tls12)
 #define EVP_aead_aes_128_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_tls13)
 #define EVP_aead_aes_256_cbc_sha384_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha384_tls)
 #define EVP_aead_aes_256_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_ctr_hmac_sha256)
 #define EVP_aead_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm)
+#define EVP_aead_aes_256_gcm_randnonce BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_randnonce)
 #define EVP_aead_aes_256_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_siv)
 #define EVP_aead_aes_256_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_tls12)
 #define EVP_aead_aes_256_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_tls13)
 #define PKCS8_parse_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_parse_encrypted_private_key)
 #define PKCS8_pkey_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_pkey_get0)
 #define PKCS8_pkey_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_pkey_set0)
-#define PMBTOKEN_PRETOKEN_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PMBTOKEN_PRETOKEN_free)
 #define POLICYINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_free)
 #define POLICYINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_it)
 #define POLICYINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_new)
 #define TRUST_TOKEN_ISSUER_issue BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_ISSUER_issue)
 #define TRUST_TOKEN_ISSUER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_ISSUER_new)
 #define TRUST_TOKEN_ISSUER_redeem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_ISSUER_redeem)
+#define TRUST_TOKEN_ISSUER_redeem_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_ISSUER_redeem_raw)
 #define TRUST_TOKEN_ISSUER_set_metadata_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_ISSUER_set_metadata_key)
 #define TRUST_TOKEN_ISSUER_set_srr_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_ISSUER_set_srr_key)
+#define TRUST_TOKEN_PRETOKEN_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_PRETOKEN_free)
 #define TRUST_TOKEN_decode_private_metadata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_decode_private_metadata)
 #define TRUST_TOKEN_experiment_v1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_experiment_v1)
 #define TRUST_TOKEN_experiment_v2_pmb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_experiment_v2_pmb)
-#define TRUST_TOKEN_experiment_v2_pp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_experiment_v2_pp)
+#define TRUST_TOKEN_experiment_v2_voprf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_experiment_v2_voprf)
 #define TRUST_TOKEN_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_free)
 #define TRUST_TOKEN_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_generate_key)
 #define TRUST_TOKEN_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_new)
 #define policy_node_cmp_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_cmp_new)
 #define policy_node_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_free)
 #define policy_node_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_match)
-#define poly_Rq_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, poly_Rq_mul)
 #define rand_fork_unsafe_buffering_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rand_fork_unsafe_buffering_enabled)
 #define rsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_asn1_meth)
 #define rsa_check_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_check_public_key)
 #define v3_policy_mappings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_policy_mappings)
 #define v3_sinfo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_sinfo)
 #define v3_skey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_skey_id)
+#define voprf_exp2_blind BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, voprf_exp2_blind)
+#define voprf_exp2_client_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, voprf_exp2_client_key_from_bytes)
+#define voprf_exp2_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, voprf_exp2_generate_key)
+#define voprf_exp2_issuer_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, voprf_exp2_issuer_key_from_bytes)
+#define voprf_exp2_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, voprf_exp2_read)
+#define voprf_exp2_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, voprf_exp2_sign)
+#define voprf_exp2_unblind BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, voprf_exp2_unblind)
 #define vpaes_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_cbc_encrypt)
 #define vpaes_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_ctr32_encrypt_blocks)
 #define vpaes_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_decrypt)
index 27903d3..d12203d 100755 (executable)
@@ -145,4 +145,4 @@ try:
 except:
     pass
 
-print yaml.dump(out)
+print(yaml.dump(out))
index 9a20a5a..1e0490a 100644 (file)
@@ -1887,6 +1887,8 @@ void PrintSourceClientMethod(grpc_generator::Printer* printer,
                    "const $Request$& request, $Response$* response) {\n");
     printer->Print(*vars,
                    "  return ::grpc::internal::BlockingUnaryCall"
+                   "< $Request$, $Response$, ::grpc::protobuf::MessageLite, "
+                   "::grpc::protobuf::MessageLite>"
                    "(channel_.get(), rpcmethod_$Method$_, "
                    "context, request, response);\n}\n\n");
 
@@ -1897,6 +1899,8 @@ void PrintSourceClientMethod(grpc_generator::Printer* printer,
                    "std::function<void(::grpc::Status)> f) {\n");
     printer->Print(*vars,
                    "  ::grpc::internal::CallbackUnaryCall"
+                   "< $Request$, $Response$, ::grpc::protobuf::MessageLite, "
+                   "::grpc::protobuf::MessageLite>"
                    "(stub_->channel_.get(), stub_->rpcmethod_$Method$_, "
                    "context, request, response, std::move(f));\n}\n\n");
 
@@ -1907,6 +1911,8 @@ void PrintSourceClientMethod(grpc_generator::Printer* printer,
                    "::grpc::experimental::ClientUnaryReactor* reactor) {\n");
     printer->Print(*vars,
                    "  ::grpc::internal::ClientCallbackUnaryFactory::Create"
+                   "< ::grpc::protobuf::MessageLite, "
+                   "::grpc::protobuf::MessageLite>"
                    "(stub_->channel_.get(), stub_->rpcmethod_$Method$_, "
                    "context, request, response, reactor);\n}\n\n");
 
@@ -1918,10 +1924,11 @@ void PrintSourceClientMethod(grpc_generator::Printer* printer,
                    "::grpc::CompletionQueue* cq) {\n");
     printer->Print(*vars,
                    "  return "
-                   "::grpc::internal::ClientAsyncResponseReaderFactory"
-                   "< $Response$>::Create(channel_.get(), cq, "
-                   "rpcmethod_$Method$_, "
-                   "context, request, false);\n"
+                   "::grpc::internal::ClientAsyncResponseReaderHelper::Create"
+                   "< $Response$, $Request$, ::grpc::protobuf::MessageLite, "
+                   "::grpc::protobuf::MessageLite>"
+                   "(channel_.get(), cq, rpcmethod_$Method$_, "
+                   "context, request);\n"
                    "}\n\n");
     printer->Print(*vars,
                    "::grpc::ClientAsyncResponseReader< $Response$>* "
@@ -2210,8 +2217,8 @@ void PrintSourceService(grpc_generator::Printer* printer,
           "    $prefix$$Service$_method_names[$Idx$],\n"
           "    ::grpc::internal::RpcMethod::NORMAL_RPC,\n"
           "    new ::grpc::internal::RpcMethodHandler< $ns$$Service$::Service, "
-          "$Request$, "
-          "$Response$>(\n"
+          "$Request$, $Response$, ::grpc::protobuf::MessageLite, "
+          "::grpc::protobuf::MessageLite>(\n"
           "        []($ns$$Service$::Service* service,\n"
           "           ::grpc::ServerContext* ctx,\n"
           "           const $Request$* req,\n"
index a52e920..4bdc938 100644 (file)
@@ -138,11 +138,20 @@ StringVector get_all_comments(const DescriptorType* descriptor) {
 
 inline void Split(const std::string& s, char delim,
                   std::vector<std::string>* append_to) {
-  auto current = s.begin();
-  while (current <= s.end()) {
-    auto next = std::find(current, s.end(), delim);
-    append_to->emplace_back(current, next);
-    current = next + 1;
+  if (s.empty()) {
+    // splitting an empty string logically produces a single-element list
+    append_to->emplace_back();
+  } else {
+    auto current = s.begin();
+    while (current < s.end()) {
+      const auto next = std::find(current, s.end(), delim);
+      append_to->emplace_back(current, next);
+      current = next;
+      if (current != s.end()) {
+        // it was the delimiter - need to be at the start of the next entry
+        ++current;
+      }
+    }
   }
 }
 
index 9fcb045..b6ebeb3 100644 (file)
@@ -209,7 +209,7 @@ class ChannelData {
                                 grpc_closure* on_complete,
                                 grpc_closure* watcher_timer_init);
 
-    ~ExternalConnectivityWatcher();
+    ~ExternalConnectivityWatcher() override;
 
     // Removes the watcher from the external_watchers_ map.
     static void RemoveWatcherFromExternalWatchersMap(ChannelData* chand,
@@ -882,9 +882,6 @@ class CallData {
 // ChannelData::SubchannelWrapper
 //
 
-using ServerAddressAttributeMap =
-    std::map<const char*, std::unique_ptr<ServerAddress::AttributeInterface>>;
-
 // This class is a wrapper for Subchannel that hides details of the
 // channel's implementation (such as the health check service name and
 // connected subchannel) from the LB policy API.
@@ -896,13 +893,14 @@ using ServerAddressAttributeMap =
 class ChannelData::SubchannelWrapper : public SubchannelInterface {
  public:
   SubchannelWrapper(ChannelData* chand, Subchannel* subchannel,
-                    grpc_core::UniquePtr<char> health_check_service_name,
-                    ServerAddressAttributeMap attributes)
-      : SubchannelInterface(&grpc_client_channel_routing_trace),
+                    grpc_core::UniquePtr<char> health_check_service_name)
+      : SubchannelInterface(
+            GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)
+                ? "SubchannelWrapper"
+                : nullptr),
         chand_(chand),
         subchannel_(subchannel),
-        health_check_service_name_(std::move(health_check_service_name)),
-        attributes_(std::move(attributes)) {
+        health_check_service_name_(std::move(health_check_service_name)) {
     if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
       gpr_log(GPR_INFO,
               "chand=%p: creating subchannel wrapper %p for subchannel %p",
@@ -921,7 +919,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
     chand_->subchannel_wrappers_.insert(this);
   }
 
-  ~SubchannelWrapper() {
+  ~SubchannelWrapper() override {
     if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
       gpr_log(GPR_INFO,
               "chand=%p: destroying subchannel wrapper %p for subchannel %p",
@@ -984,13 +982,6 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
     return subchannel_->channel_args();
   }
 
-  const ServerAddress::AttributeInterface* GetAttribute(
-      const char* key) const override {
-    auto it = attributes_.find(key);
-    if (it == attributes_.end()) return nullptr;
-    return it->second.get();
-  }
-
   void ThrottleKeepaliveTime(int new_keepalive_time) {
     subchannel_->ThrottleKeepaliveTime(new_keepalive_time);
   }
@@ -1071,7 +1062,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
           parent_(std::move(parent)),
           last_seen_state_(initial_state) {}
 
-    ~WatcherWrapper() {
+    ~WatcherWrapper() override {
       auto* parent = parent_.release();  // ref owned by lambda
       parent->chand_->work_serializer_->Run(
           [parent]() { parent->Unref(DEBUG_LOCATION, "WatcherWrapper"); },
@@ -1188,7 +1179,6 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
   ChannelData* chand_;
   Subchannel* subchannel_;
   grpc_core::UniquePtr<char> health_check_service_name_;
-  ServerAddressAttributeMap attributes_;
   // Maps from the address of the watcher passed to us by the LB policy
   // to the address of the WrapperWatcher that we passed to the underlying
   // subchannel.  This is needed so that when the LB policy calls
@@ -1363,18 +1353,6 @@ class ChannelData::ConnectivityWatcherRemover {
 // ChannelData::ClientChannelControlHelper
 //
 
-}  // namespace
-
-// Allows accessing the attributes from a ServerAddress.
-class ChannelServerAddressPeer {
- public:
-  static ServerAddressAttributeMap GetAttributes(ServerAddress* address) {
-    return std::move(address->attributes_);
-  }
-};
-
-namespace {
-
 class ChannelData::ClientChannelControlHelper
     : public LoadBalancingPolicy::ChannelControlHelper {
  public:
@@ -1426,8 +1404,7 @@ class ChannelData::ClientChannelControlHelper
     subchannel->ThrottleKeepaliveTime(chand_->keepalive_time_);
     // Create and return wrapper for the subchannel.
     return MakeRefCounted<SubchannelWrapper>(
-        chand_, subchannel, std::move(health_check_service_name),
-        ChannelServerAddressPeer::GetAttributes(&address));
+        chand_, subchannel, std::move(health_check_service_name));
   }
 
   void UpdateState(
@@ -2164,7 +2141,7 @@ void ChannelData::RemoveConnectivityWatcher(
 
 CallData::CallData(grpc_call_element* elem, const ChannelData& chand,
                    const grpc_call_element_args& args)
-    : deadline_state_(elem, args.call_stack, args.call_combiner,
+    : deadline_state_(elem, args,
                       GPR_LIKELY(chand.deadline_checking_enabled())
                           ? args.deadline
                           : GRPC_MILLIS_INF_FUTURE),
index e43afd3..54e6bd5 100644 (file)
@@ -24,8 +24,7 @@
 
 #include "absl/strings/string_view.h"
 
-#include <grpc/impl/codegen/grpc_types.h>
-#include <grpc/impl/codegen/slice.h>
+#include <grpc/grpc.h>
 
 #include "src/core/ext/filters/client_channel/service_config.h"
 #include "src/core/ext/filters/client_channel/service_config_parser.h"
@@ -66,7 +65,7 @@ class ConfigSelector : public RefCounted<ConfigSelector> {
     std::function<void()> on_call_committed;
   };
 
-  virtual ~ConfigSelector() = default;
+  ~ConfigSelector() override = default;
 
   virtual const char* name() const = 0;
 
index 60a2ebb..4e49ed6 100644 (file)
@@ -51,7 +51,10 @@ HealthCheckClient::HealthCheckClient(
     grpc_pollset_set* interested_parties,
     RefCountedPtr<channelz::SubchannelNode> channelz_node,
     RefCountedPtr<ConnectivityStateWatcherInterface> watcher)
-    : InternallyRefCounted<HealthCheckClient>(&grpc_health_check_client_trace),
+    : InternallyRefCounted<HealthCheckClient>(
+          GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)
+              ? "HealthCheckClient"
+              : nullptr),
       service_name_(service_name),
       connected_subchannel_(std::move(connected_subchannel)),
       interested_parties_(interested_parties),
index e9555b5..24b59c7 100644 (file)
@@ -50,7 +50,7 @@ class HealthCheckClient : public InternallyRefCounted<HealthCheckClient> {
                     RefCountedPtr<channelz::SubchannelNode> channelz_node,
                     RefCountedPtr<ConnectivityStateWatcherInterface> watcher);
 
-  ~HealthCheckClient();
+  ~HealthCheckClient() override;
 
   void Orphan() override;
 
@@ -60,7 +60,7 @@ class HealthCheckClient : public InternallyRefCounted<HealthCheckClient> {
    public:
     CallState(RefCountedPtr<HealthCheckClient> health_check_client,
               grpc_pollset_set* interested_parties_);
-    ~CallState();
+    ~CallState() override;
 
     void Orphan() override;
 
index 620cc89..1b9817c 100644 (file)
@@ -54,7 +54,7 @@ class HttpConnectHandshaker : public Handshaker {
   const char* name() const override { return "http_connect"; }
 
  private:
-  virtual ~HttpConnectHandshaker();
+  ~HttpConnectHandshaker() override;
   void CleanupArgsForFailureLocked();
   void HandshakeFailedLocked(grpc_error* error);
   static void OnWriteDone(void* arg, grpc_error* error);
index 6c639ef..53c61ee 100644 (file)
@@ -32,7 +32,11 @@ DebugOnlyTraceFlag grpc_trace_lb_policy_refcount(false, "lb_policy_refcount");
 //
 
 LoadBalancingPolicy::LoadBalancingPolicy(Args args, intptr_t initial_refcount)
-    : InternallyRefCounted(&grpc_trace_lb_policy_refcount, initial_refcount),
+    : InternallyRefCounted(
+          GRPC_TRACE_FLAG_ENABLED(grpc_trace_lb_policy_refcount)
+              ? "LoadBalancingPolicy"
+              : nullptr,
+          initial_refcount),
       work_serializer_(std::move(args.work_serializer)),
       interested_parties_(grpc_pollset_set_create()),
       channel_control_helper_(std::move(args.channel_control_helper)) {}
index e132564..13c315e 100644 (file)
@@ -301,7 +301,7 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
   /// return the parameters they need.
   class Config : public RefCounted<Config> {
    public:
-    virtual ~Config() = default;
+    ~Config() override = default;
 
     // Returns the load balancing policy name
     virtual const char* name() const = 0;
@@ -341,7 +341,7 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
   };
 
   explicit LoadBalancingPolicy(Args args, intptr_t initial_refcount = 1);
-  virtual ~LoadBalancingPolicy();
+  ~LoadBalancingPolicy() override;
 
   // Not copyable nor movable.
   LoadBalancingPolicy(const LoadBalancingPolicy&) = delete;
@@ -376,7 +376,7 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
     explicit QueuePicker(RefCountedPtr<LoadBalancingPolicy> parent)
         : parent_(std::move(parent)) {}
 
-    ~QueuePicker() { parent_.reset(DEBUG_LOCATION, "QueuePicker"); }
+    ~QueuePicker() override { parent_.reset(DEBUG_LOCATION, "QueuePicker"); }
 
     PickResult Pick(PickArgs args) override;
 
index 2ca1573..0edf61d 100644 (file)
@@ -36,7 +36,7 @@ class ChildPolicyHandler::Helper
   explicit Helper(RefCountedPtr<ChildPolicyHandler> parent)
       : parent_(std::move(parent)) {}
 
-  ~Helper() { parent_.reset(DEBUG_LOCATION, "Helper"); }
+  ~Helper() override { parent_.reset(DEBUG_LOCATION, "Helper"); }
 
   RefCountedPtr<SubchannelInterface> CreateSubchannel(
       ServerAddress address, const grpc_channel_args& args) override {
index d67f326..c902c0e 100644 (file)
@@ -36,7 +36,7 @@ class ChildPolicyHandler : public LoadBalancingPolicy {
   ChildPolicyHandler(Args args, TraceFlag* tracer)
       : LoadBalancingPolicy(std::move(args)), tracer_(tracer) {}
 
-  virtual const char* name() const override { return "child_policy_handler"; }
+  const char* name() const override { return "child_policy_handler"; }
 
   void UpdateLocked(UpdateArgs args) override;
   void ExitIdleLocked() override;
index 9fc2b4d..3ef8620 100644 (file)
@@ -164,7 +164,7 @@ class GrpcLb : public LoadBalancingPolicy {
    public:
     explicit BalancerCallState(
         RefCountedPtr<LoadBalancingPolicy> parent_grpclb_policy);
-    ~BalancerCallState();
+    ~BalancerCallState() override;
 
     // It's the caller's responsibility to ensure that Orphan() is called from
     // inside the combiner.
@@ -235,6 +235,23 @@ class GrpcLb : public LoadBalancingPolicy {
     grpc_closure client_load_report_closure_;
   };
 
+  class SubchannelWrapper : public DelegatingSubchannel {
+   public:
+    SubchannelWrapper(RefCountedPtr<SubchannelInterface> subchannel,
+                      std::string lb_token,
+                      RefCountedPtr<GrpcLbClientStats> client_stats)
+        : DelegatingSubchannel(std::move(subchannel)),
+          lb_token_(std::move(lb_token)),
+          client_stats_(std::move(client_stats)) {}
+
+    const std::string& lb_token() const { return lb_token_; }
+    GrpcLbClientStats* client_stats() const { return client_stats_.get(); }
+
+   private:
+    std::string lb_token_;
+    RefCountedPtr<GrpcLbClientStats> client_stats_;
+  };
+
   class TokenAndClientStatsAttribute
       : public ServerAddress::AttributeInterface {
    public:
@@ -262,7 +279,9 @@ class GrpcLb : public LoadBalancingPolicy {
     }
 
     const std::string& lb_token() const { return lb_token_; }
-    GrpcLbClientStats* client_stats() const { return client_stats_.get(); }
+    RefCountedPtr<GrpcLbClientStats> client_stats() const {
+      return client_stats_;
+    }
 
    private:
     std::string lb_token_;
@@ -310,21 +329,16 @@ class GrpcLb : public LoadBalancingPolicy {
 
   class Picker : public SubchannelPicker {
    public:
-    Picker(GrpcLb* parent, RefCountedPtr<Serverlist> serverlist,
+    Picker(RefCountedPtr<Serverlist> serverlist,
            std::unique_ptr<SubchannelPicker> child_picker,
            RefCountedPtr<GrpcLbClientStats> client_stats)
-        : parent_(parent),
-          serverlist_(std::move(serverlist)),
+        : serverlist_(std::move(serverlist)),
           child_picker_(std::move(child_picker)),
           client_stats_(std::move(client_stats)) {}
 
     PickResult Pick(PickArgs args) override;
 
    private:
-    // Storing the address for logging, but not holding a ref.
-    // DO NOT DEFERENCE!
-    GrpcLb* parent_;
-
     // Serverlist to be used for determining drops.
     RefCountedPtr<Serverlist> serverlist_;
 
@@ -355,7 +369,7 @@ class GrpcLb : public LoadBalancingPolicy {
         : AsyncConnectivityStateWatcherInterface(parent->work_serializer()),
           parent_(std::move(parent)) {}
 
-    ~StateWatcher() { parent_.reset(DEBUG_LOCATION, "StateWatcher"); }
+    ~StateWatcher() override { parent_.reset(DEBUG_LOCATION, "StateWatcher"); }
 
    private:
     void OnConnectivityStateChange(grpc_connectivity_state new_state,
@@ -381,7 +395,7 @@ class GrpcLb : public LoadBalancingPolicy {
     RefCountedPtr<GrpcLb> parent_;
   };
 
-  ~GrpcLb();
+  ~GrpcLb() override;
 
   void ShutdownLocked() override;
 
@@ -591,7 +605,8 @@ const char* GrpcLb::Serverlist::ShouldDrop() {
 GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
   PickResult result;
   // Check if we should drop the call.
-  const char* drop_token = serverlist_->ShouldDrop();
+  const char* drop_token =
+      serverlist_ == nullptr ? nullptr : serverlist_->ShouldDrop();
   if (drop_token != nullptr) {
     // Update client load reporting stats to indicate the number of
     // dropped calls.  Note that we have to do this here instead of in
@@ -609,17 +624,11 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
   // If pick succeeded, add LB token to initial metadata.
   if (result.type == PickResult::PICK_COMPLETE &&
       result.subchannel != nullptr) {
-    const TokenAndClientStatsAttribute* attribute =
-        static_cast<const TokenAndClientStatsAttribute*>(
-            result.subchannel->GetAttribute(kGrpcLbAddressAttributeKey));
-    if (attribute == nullptr) {
-      gpr_log(GPR_ERROR, "[grpclb %p picker %p] No LB token for subchannel %p",
-              parent_, this, result.subchannel.get());
-      abort();
-    }
+    const SubchannelWrapper* subchannel_wrapper =
+        static_cast<SubchannelWrapper*>(result.subchannel.get());
     // Encode client stats object into metadata for use by
     // client_load_reporting filter.
-    GrpcLbClientStats* client_stats = attribute->client_stats();
+    GrpcLbClientStats* client_stats = subchannel_wrapper->client_stats();
     if (client_stats != nullptr) {
       client_stats->Ref().release();  // Ref passed via metadata.
       // The metadata value is a hack: we pretend the pointer points to
@@ -635,10 +644,14 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
     // Create a new copy on the call arena, since the subchannel list
     // may get refreshed between when we return this pick and when the
     // initial metadata goes out on the wire.
-    char* lb_token = static_cast<char*>(
-        args.call_state->Alloc(attribute->lb_token().size() + 1));
-    strcpy(lb_token, attribute->lb_token().c_str());
-    args.initial_metadata->Add(kGrpcLbLbTokenMetadataKey, lb_token);
+    if (!subchannel_wrapper->lb_token().empty()) {
+      char* lb_token = static_cast<char*>(
+          args.call_state->Alloc(subchannel_wrapper->lb_token().size() + 1));
+      strcpy(lb_token, subchannel_wrapper->lb_token().c_str());
+      args.initial_metadata->Add(kGrpcLbLbTokenMetadataKey, lb_token);
+    }
+    // Unwrap subchannel to pass up to the channel.
+    result.subchannel = subchannel_wrapper->wrapped_subchannel();
   }
   return result;
 }
@@ -650,8 +663,21 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
 RefCountedPtr<SubchannelInterface> GrpcLb::Helper::CreateSubchannel(
     ServerAddress address, const grpc_channel_args& args) {
   if (parent_->shutting_down_) return nullptr;
-  return parent_->channel_control_helper()->CreateSubchannel(std::move(address),
-                                                             args);
+  const TokenAndClientStatsAttribute* attribute =
+      static_cast<const TokenAndClientStatsAttribute*>(
+          address.GetAttribute(kGrpcLbAddressAttributeKey));
+  if (attribute == nullptr) {
+    gpr_log(GPR_ERROR,
+            "[grpclb %p] no TokenAndClientStatsAttribute for address %p",
+            parent_.get(), address.ToString().c_str());
+    abort();
+  }
+  std::string lb_token = attribute->lb_token();
+  RefCountedPtr<GrpcLbClientStats> client_stats = attribute->client_stats();
+  return MakeRefCounted<SubchannelWrapper>(
+      parent_->channel_control_helper()->CreateSubchannel(std::move(address),
+                                                          args),
+      std::move(lb_token), std::move(client_stats));
 }
 
 void GrpcLb::Helper::UpdateState(grpc_connectivity_state state,
@@ -662,56 +688,37 @@ void GrpcLb::Helper::UpdateState(grpc_connectivity_state state,
   parent_->child_policy_ready_ = state == GRPC_CHANNEL_READY;
   // Enter fallback mode if needed.
   parent_->MaybeEnterFallbackModeAfterStartup();
-  // There are three cases to consider here:
-  // 1. We're in fallback mode.  In this case, we're always going to use
-  //    the child policy's result, so we pass its picker through as-is.
-  // 2. The serverlist contains only drop entries.  In this case, we
-  //    want to use our own picker so that we can return the drops.
-  // 3. Not in fallback mode and serverlist is not all drops (i.e., it
-  //    may be empty or contain at least one backend address).  There are
-  //    two sub-cases:
-  //    a. The child policy is reporting state READY.  In this case, we wrap
-  //       the child's picker in our own, so that we can handle drops and LB
-  //       token metadata for each pick.
-  //    b. The child policy is reporting a state other than READY.  In this
-  //       case, we don't want to use our own picker, because we don't want
-  //       to process drops for picks that yield a QUEUE result; this would
-  //       result in dropping too many calls, since we will see the
-  //       queued picks multiple times, and we'd consider each one a
-  //       separate call for the drop calculation.
-  //
-  // Cases 1 and 3b: return picker from the child policy as-is.
-  if (parent_->serverlist_ == nullptr ||
-      (!parent_->serverlist_->ContainsAllDropEntries() &&
-       state != GRPC_CHANNEL_READY)) {
-    if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
-      gpr_log(GPR_INFO,
-              "[grpclb %p helper %p] state=%s (%s) passing "
-              "child picker %p as-is",
-              parent_.get(), this, ConnectivityStateName(state),
-              status.ToString().c_str(), picker.get());
-    }
-    parent_->channel_control_helper()->UpdateState(state, status,
-                                                   std::move(picker));
-    return;
-  }
-  // Cases 2 and 3a: wrap picker from the child in our own picker.
-  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
-    gpr_log(GPR_INFO,
-            "[grpclb %p helper %p] state=%s (%s) wrapping child "
-            "picker %p",
-            parent_.get(), this, ConnectivityStateName(state),
-            status.ToString().c_str(), picker.get());
+  // We pass the serverlist to the picker so that it can handle drops.
+  // However, we don't want to handle drops in the case where the child
+  // policy is reporting a state other than READY (unless we are
+  // dropping *all* calls), because we don't want to process drops for picks
+  // that yield a QUEUE result; this would result in dropping too many calls,
+  // since we will see the queued picks multiple times, and we'd consider each
+  // one a separate call for the drop calculation.  So in this case, we pass
+  // a null serverlist to the picker, which tells it not to do drops.
+  RefCountedPtr<Serverlist> serverlist;
+  if (state == GRPC_CHANNEL_READY ||
+      (parent_->serverlist_ != nullptr &&
+       parent_->serverlist_->ContainsAllDropEntries())) {
+    serverlist = parent_->serverlist_;
   }
   RefCountedPtr<GrpcLbClientStats> client_stats;
   if (parent_->lb_calld_ != nullptr &&
       parent_->lb_calld_->client_stats() != nullptr) {
     client_stats = parent_->lb_calld_->client_stats()->Ref();
   }
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
+    gpr_log(GPR_INFO,
+            "[grpclb %p helper %p] state=%s (%s) wrapping child "
+            "picker %p (serverlist=%p, client_stats=%p)",
+            parent_.get(), this, ConnectivityStateName(state),
+            status.ToString().c_str(), picker.get(), serverlist.get(),
+            client_stats.get());
+  }
   parent_->channel_control_helper()->UpdateState(
       state, status,
-      absl::make_unique<Picker>(parent_.get(), parent_->serverlist_,
-                                std::move(picker), std::move(client_stats)));
+      absl::make_unique<Picker>(std::move(serverlist), std::move(picker),
+                                std::move(client_stats)));
 }
 
 void GrpcLb::Helper::RequestReresolution() {
@@ -738,7 +745,9 @@ void GrpcLb::Helper::AddTraceEvent(TraceSeverity severity,
 
 GrpcLb::BalancerCallState::BalancerCallState(
     RefCountedPtr<LoadBalancingPolicy> parent_grpclb_policy)
-    : InternallyRefCounted<BalancerCallState>(&grpc_lb_glb_trace),
+    : InternallyRefCounted<BalancerCallState>(
+          GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace) ? "BalancerCallState"
+                                                     : nullptr),
       grpclb_policy_(std::move(parent_grpclb_policy)) {
   GPR_ASSERT(grpclb_policy_ != nullptr);
   GPR_ASSERT(!grpclb_policy()->shutting_down_);
@@ -932,7 +941,7 @@ void GrpcLb::BalancerCallState::SendClientLoadReportLocked() {
   if (num_calls_started == 0 && num_calls_finished == 0 &&
       num_calls_finished_with_client_failed_to_send == 0 &&
       num_calls_finished_known_received == 0 &&
-      (drop_token_counts == nullptr || drop_token_counts->size() == 0)) {
+      (drop_token_counts == nullptr || drop_token_counts->empty())) {
     if (last_client_load_report_counters_were_zero_) {
       ScheduleNextClientLoadReportLocked();
       return;
index 1566e7b..d4104ec 100644 (file)
@@ -25,6 +25,8 @@
 #include <grpc/support/atm.h>
 #include <grpc/support/string_util.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/core/lib/gprpp/sync.h"
 
 namespace grpc_core {
@@ -52,7 +54,7 @@ void GrpcLbClientStats::AddCallDropped(const char* token) {
   // Record the drop.
   MutexLock lock(&drop_count_mu_);
   if (drop_token_counts_ == nullptr) {
-    drop_token_counts_.reset(new DroppedCallCounts());
+    drop_token_counts_ = absl::make_unique<DroppedCallCounts>();
   }
   for (size_t i = 0; i < drop_token_counts_->size(); ++i) {
     if (strcmp((*drop_token_counts_)[i].token.get(), token) == 0) {
index 784e964..8b64f2b 100644 (file)
@@ -55,7 +55,7 @@ class PickFirst : public LoadBalancingPolicy {
   void ResetBackoffLocked() override;
 
  private:
-  ~PickFirst();
+  ~PickFirst() override;
 
   class PickFirstSubchannelList;
 
@@ -94,7 +94,7 @@ class PickFirst : public LoadBalancingPolicy {
       policy->Ref(DEBUG_LOCATION, "subchannel_list").release();
     }
 
-    ~PickFirstSubchannelList() {
+    ~PickFirstSubchannelList() override {
       PickFirst* p = static_cast<PickFirst*>(policy());
       p->Unref(DEBUG_LOCATION, "subchannel_list");
     }
index 07a7b27..037eea5 100644 (file)
@@ -56,23 +56,24 @@ constexpr int kDefaultChildFailoverTimeoutMs = 10000;
 // Config for priority LB policy.
 class PriorityLbConfig : public LoadBalancingPolicy::Config {
  public:
-  PriorityLbConfig(
-      std::map<std::string, RefCountedPtr<LoadBalancingPolicy::Config>>
-          children,
-      std::vector<std::string> priorities)
+  struct PriorityLbChild {
+    RefCountedPtr<LoadBalancingPolicy::Config> config;
+    bool ignore_reresolution_requests = false;
+  };
+
+  PriorityLbConfig(std::map<std::string, PriorityLbChild> children,
+                   std::vector<std::string> priorities)
       : children_(std::move(children)), priorities_(std::move(priorities)) {}
 
   const char* name() const override { return kPriority; }
 
-  const std::map<std::string, RefCountedPtr<LoadBalancingPolicy::Config>>&
-  children() const {
+  const std::map<std::string, PriorityLbChild>& children() const {
     return children_;
   }
   const std::vector<std::string>& priorities() const { return priorities_; }
 
  private:
-  const std::map<std::string, RefCountedPtr<LoadBalancingPolicy::Config>>
-      children_;
+  const std::map<std::string, PriorityLbChild> children_;
   const std::vector<std::string> priorities_;
 };
 
@@ -93,13 +94,14 @@ class PriorityLb : public LoadBalancingPolicy {
    public:
     ChildPriority(RefCountedPtr<PriorityLb> priority_policy, std::string name);
 
-    ~ChildPriority() {
+    ~ChildPriority() override {
       priority_policy_.reset(DEBUG_LOCATION, "ChildPriority");
     }
 
     const std::string& name() const { return name_; }
 
-    void UpdateLocked(RefCountedPtr<LoadBalancingPolicy::Config> config);
+    void UpdateLocked(RefCountedPtr<LoadBalancingPolicy::Config> config,
+                      bool ignore_reresolution_requests);
     void ExitIdleLocked();
     void ResetBackoffLocked();
     void DeactivateLocked();
@@ -152,7 +154,7 @@ class PriorityLb : public LoadBalancingPolicy {
       explicit Helper(RefCountedPtr<ChildPriority> priority)
           : priority_(std::move(priority)) {}
 
-      ~Helper() { priority_.reset(DEBUG_LOCATION, "Helper"); }
+      ~Helper() override { priority_.reset(DEBUG_LOCATION, "Helper"); }
 
       RefCountedPtr<SubchannelInterface> CreateSubchannel(
           ServerAddress address, const grpc_channel_args& args) override;
@@ -184,6 +186,7 @@ class PriorityLb : public LoadBalancingPolicy {
 
     RefCountedPtr<PriorityLb> priority_policy_;
     const std::string name_;
+    bool ignore_reresolution_requests_ = false;
 
     OrphanablePtr<LoadBalancingPolicy> child_policy_;
 
@@ -202,7 +205,7 @@ class PriorityLb : public LoadBalancingPolicy {
     bool failover_timer_callback_pending_ = false;
   };
 
-  ~PriorityLb();
+  ~PriorityLb() override;
 
   void ShutdownLocked() override;
 
@@ -311,7 +314,8 @@ void PriorityLb::UpdateLocked(UpdateArgs args) {
       child->DeactivateLocked();
     } else {
       // Existing child found in new config.  Update it.
-      child->UpdateLocked(config_it->second);
+      child->UpdateLocked(config_it->second.config,
+                          config_it->second.ignore_reresolution_requests);
     }
   }
   // Try to get connected.
@@ -425,7 +429,10 @@ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
       }
       child = MakeOrphanable<ChildPriority>(
           Ref(DEBUG_LOCATION, "ChildPriority"), child_name);
-      child->UpdateLocked(config_->children().find(child_name)->second);
+      auto child_config = config_->children().find(child_name);
+      GPR_DEBUG_ASSERT(child_config != config_->children().end());
+      child->UpdateLocked(child_config->second.config,
+                          child_config->second.ignore_reresolution_requests);
       return;
     }
     // The child already exists.
@@ -534,12 +541,14 @@ void PriorityLb::ChildPriority::Orphan() {
 }
 
 void PriorityLb::ChildPriority::UpdateLocked(
-    RefCountedPtr<LoadBalancingPolicy::Config> config) {
+    RefCountedPtr<LoadBalancingPolicy::Config> config,
+    bool ignore_reresolution_requests) {
   if (priority_policy_->shutting_down_) return;
   if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
     gpr_log(GPR_INFO, "[priority_lb %p] child %s (%p): start update",
             priority_policy_.get(), name_.c_str(), this);
   }
+  ignore_reresolution_requests_ = ignore_reresolution_requests;
   // Create policy if needed.
   if (child_policy_ == nullptr) {
     child_policy_ = CreateChildPolicyLocked(priority_policy_->args_);
@@ -731,6 +740,9 @@ void PriorityLb::ChildPriority::OnDeactivationTimerLocked(grpc_error* error) {
 
 void PriorityLb::ChildPriority::Helper::RequestReresolution() {
   if (priority_->priority_policy_->shutting_down_) return;
+  if (priority_->ignore_reresolution_requests_) {
+    return;
+  }
   priority_->priority_policy_->channel_control_helper()->RequestReresolution();
 }
 
@@ -784,7 +796,7 @@ class PriorityLbFactory : public LoadBalancingPolicyFactory {
     }
     std::vector<grpc_error*> error_list;
     // Children.
-    std::map<std::string, RefCountedPtr<LoadBalancingPolicy::Config>> children;
+    std::map<std::string, PriorityLbConfig::PriorityLbChild> children;
     auto it = json.object_value().find("children");
     if (it == json.object_value().end()) {
       error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
@@ -813,6 +825,22 @@ class PriorityLbFactory : public LoadBalancingPolicyFactory {
             grpc_error* parse_error = GRPC_ERROR_NONE;
             auto config = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
                 it2->second, &parse_error);
+            bool ignore_resolution_requests = false;
+            // If present, ignore_reresolution_requests must be of type
+            // boolean.
+            auto it3 =
+                element.object_value().find("ignore_reresolution_requests");
+            if (it3 != element.object_value().end()) {
+              if (it3->second.type() == Json::Type::JSON_TRUE) {
+                ignore_resolution_requests = true;
+              } else if (it3->second.type() != Json::Type::JSON_FALSE) {
+                error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+                    absl::StrCat("field:children key:", child_name,
+                                 " field:ignore_reresolution_requests:should "
+                                 "be type boolean")
+                        .c_str()));
+              }
+            }
             if (config == nullptr) {
               GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
               error_list.push_back(
@@ -821,7 +849,9 @@ class PriorityLbFactory : public LoadBalancingPolicyFactory {
                       &parse_error, 1));
               GRPC_ERROR_UNREF(parse_error);
             }
-            children[child_name] = std::move(config);
+            children[child_name].config = std::move(config);
+            children[child_name].ignore_reresolution_requests =
+                ignore_resolution_requests;
           }
         }
       }
index 6dc1077..efc7942 100644 (file)
@@ -65,7 +65,7 @@ class RoundRobin : public LoadBalancingPolicy {
   void ResetBackoffLocked() override;
 
  private:
-  ~RoundRobin();
+  ~RoundRobin() override;
 
   // Forward declaration.
   class RoundRobinSubchannelList;
@@ -122,7 +122,7 @@ class RoundRobin : public LoadBalancingPolicy {
       policy->Ref(DEBUG_LOCATION, "subchannel_list").release();
     }
 
-    ~RoundRobinSubchannelList() {
+    ~RoundRobinSubchannelList() override {
       RoundRobin* p = static_cast<RoundRobin*>(policy());
       p->Unref(DEBUG_LOCATION, "subchannel_list");
     }
index e6d0b54..a240a2d 100644 (file)
@@ -142,7 +142,9 @@ class SubchannelData {
         : subchannel_data_(subchannel_data),
           subchannel_list_(std::move(subchannel_list)) {}
 
-    ~Watcher() { subchannel_list_.reset(DEBUG_LOCATION, "Watcher dtor"); }
+    ~Watcher() override {
+      subchannel_list_.reset(DEBUG_LOCATION, "Watcher dtor");
+    }
 
     void OnConnectivityStateChange(grpc_connectivity_state new_state) override;
 
@@ -353,7 +355,8 @@ SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
     LoadBalancingPolicy* policy, TraceFlag* tracer, ServerAddressList addresses,
     LoadBalancingPolicy::ChannelControlHelper* helper,
     const grpc_channel_args& args)
-    : InternallyRefCounted<SubchannelListType>(tracer),
+    : InternallyRefCounted<SubchannelListType>(
+          GRPC_TRACE_FLAG_ENABLED(*tracer) ? "SubchannelList" : nullptr),
       policy_(policy),
       tracer_(tracer) {
   if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
@@ -363,9 +366,9 @@ SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
   }
   subchannels_.reserve(addresses.size());
   // Create a subchannel for each address.
-  for (const ServerAddress& address : addresses) {
+  for (ServerAddress address : addresses) {
     RefCountedPtr<SubchannelInterface> subchannel =
-        helper->CreateSubchannel(std::move(address), args);
+        helper->CreateSubchannel(address, args);
     if (subchannel == nullptr) {
       // Subchannel could not be created.
       if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
@@ -383,7 +386,7 @@ SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
               tracer_->name(), policy_, this, subchannels_.size(),
               subchannel.get(), address.ToString().c_str());
     }
-    subchannels_.emplace_back(this, address, std::move(subchannel));
+    subchannels_.emplace_back(this, std::move(address), std::move(subchannel));
   }
 }
 
index 0f99692..1eca478 100644 (file)
@@ -118,7 +118,7 @@ class WeightedTargetLb : public LoadBalancingPolicy {
    public:
     WeightedChild(RefCountedPtr<WeightedTargetLb> weighted_target_policy,
                   const std::string& name);
-    ~WeightedChild();
+    ~WeightedChild() override;
 
     void Orphan() override;
 
@@ -142,7 +142,7 @@ class WeightedTargetLb : public LoadBalancingPolicy {
       explicit Helper(RefCountedPtr<WeightedChild> weighted_child)
           : weighted_child_(std::move(weighted_child)) {}
 
-      ~Helper() { weighted_child_.reset(DEBUG_LOCATION, "Helper"); }
+      ~Helper() override { weighted_child_.reset(DEBUG_LOCATION, "Helper"); }
 
       RefCountedPtr<SubchannelInterface> CreateSubchannel(
           ServerAddress address, const grpc_channel_args& args) override;
@@ -188,7 +188,7 @@ class WeightedTargetLb : public LoadBalancingPolicy {
     bool shutdown_ = false;
   };
 
-  ~WeightedTargetLb();
+  ~WeightedTargetLb() override;
 
   void ShutdownLocked() override;
 
index da048b5..bb336d7 100644 (file)
@@ -113,7 +113,7 @@ class CdsLb : public LoadBalancingPolicy {
     RefCountedPtr<CdsLb> parent_;
   };
 
-  ~CdsLb();
+  ~CdsLb() override;
 
   void ShutdownLocked() override;
 
index 6afdce4..22d7531 100644 (file)
 #include "src/core/ext/xds/xds_client.h"
 #include "src/core/ext/xds/xds_client_stats.h"
 #include "src/core/lib/channel/channel_args.h"
-#include "src/core/lib/gpr/env.h"
 #include "src/core/lib/gpr/string.h"
 #include "src/core/lib/gprpp/orphanable.h"
 #include "src/core/lib/gprpp/ref_counted_ptr.h"
-#include "src/core/lib/iomgr/timer.h"
 #include "src/core/lib/iomgr/work_serializer.h"
 #include "src/core/lib/transport/error_utils.h"
 #include "src/core/lib/uri/uri_parser.h"
@@ -51,23 +49,12 @@ namespace grpc_core {
 
 TraceFlag grpc_lb_eds_trace(false, "eds_lb");
 
+const char* kXdsLocalityNameAttributeKey = "xds_locality_name";
+
 namespace {
 
 constexpr char kEds[] = "eds_experimental";
 
-const char* kXdsLocalityNameAttributeKey = "xds_locality_name";
-
-// TODO (donnadionne): Check to see if circuit breaking is enabled, this will be
-// removed once circuit breaking feature is fully integrated and enabled by
-// default.
-bool XdsCircuitBreakingEnabled() {
-  char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_CIRCUIT_BREAKING");
-  bool parsed_value;
-  bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
-  gpr_free(value);
-  return parse_succeeded && parsed_value;
-}
-
 // Config for EDS LB policy.
 class EdsLbConfig : public LoadBalancingPolicy::Config {
  public:
@@ -120,49 +107,6 @@ class EdsLb : public LoadBalancingPolicy {
   void ResetBackoffLocked() override;
 
  private:
-  class XdsLocalityAttribute : public ServerAddress::AttributeInterface {
-   public:
-    explicit XdsLocalityAttribute(RefCountedPtr<XdsLocalityName> locality_name)
-        : locality_name_(std::move(locality_name)) {}
-
-    RefCountedPtr<XdsLocalityName> locality_name() const {
-      return locality_name_;
-    }
-
-    std::unique_ptr<AttributeInterface> Copy() const override {
-      return absl::make_unique<XdsLocalityAttribute>(locality_name_->Ref());
-    }
-
-    int Cmp(const AttributeInterface* other) const override {
-      const auto* other_locality_attr =
-          static_cast<const XdsLocalityAttribute*>(other);
-      return locality_name_->Compare(*other_locality_attr->locality_name_);
-    }
-
-    std::string ToString() const override {
-      return locality_name_->AsHumanReadableString();
-    }
-
-   private:
-    RefCountedPtr<XdsLocalityName> locality_name_;
-  };
-
-  class StatsSubchannelWrapper : public DelegatingSubchannel {
-   public:
-    StatsSubchannelWrapper(
-        RefCountedPtr<SubchannelInterface> wrapped_subchannel,
-        RefCountedPtr<XdsClusterLocalityStats> locality_stats)
-        : DelegatingSubchannel(std::move(wrapped_subchannel)),
-          locality_stats_(std::move(locality_stats)) {}
-
-    XdsClusterLocalityStats* locality_stats() const {
-      return locality_stats_.get();
-    }
-
-   private:
-    RefCountedPtr<XdsClusterLocalityStats> locality_stats_;
-  };
-
   class EndpointWatcher : public XdsClient::EndpointWatcherInterface {
    public:
     explicit EndpointWatcher(RefCountedPtr<EdsLb> parent)
@@ -195,39 +139,12 @@ class EdsLb : public LoadBalancingPolicy {
     RefCountedPtr<EdsLb> parent_;
   };
 
-  // A simple wrapper for ref-counting a picker from the child policy.
-  class ChildPickerWrapper : public RefCounted<ChildPickerWrapper> {
-   public:
-    explicit ChildPickerWrapper(std::unique_ptr<SubchannelPicker> picker)
-        : picker_(std::move(picker)) {}
-    PickResult Pick(PickArgs args) { return picker_->Pick(args); }
-
-   private:
-    std::unique_ptr<SubchannelPicker> picker_;
-  };
-
-  // A picker that handles drops.
-  class EdsPicker : public SubchannelPicker {
-   public:
-    explicit EdsPicker(RefCountedPtr<EdsLb> eds_policy);
-
-    PickResult Pick(PickArgs args) override;
-
-   private:
-    RefCountedPtr<EdsLb> eds_policy_;
-    RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config_;
-    RefCountedPtr<XdsClusterDropStats> drop_stats_;
-    RefCountedPtr<ChildPickerWrapper> child_picker_;
-    bool xds_circuit_breaking_enabled_;
-    uint32_t max_concurrent_requests_;
-  };
-
   class Helper : public ChannelControlHelper {
    public:
     explicit Helper(RefCountedPtr<EdsLb> eds_policy)
         : eds_policy_(std::move(eds_policy)) {}
 
-    ~Helper() { eds_policy_.reset(DEBUG_LOCATION, "Helper"); }
+    ~Helper() override { eds_policy_.reset(DEBUG_LOCATION, "Helper"); }
 
     RefCountedPtr<SubchannelInterface> CreateSubchannel(
         ServerAddress address, const grpc_channel_args& args) override;
@@ -243,7 +160,7 @@ class EdsLb : public LoadBalancingPolicy {
     RefCountedPtr<EdsLb> eds_policy_;
   };
 
-  ~EdsLb();
+  ~EdsLb() override;
 
   void ShutdownLocked() override;
 
@@ -261,7 +178,6 @@ class EdsLb : public LoadBalancingPolicy {
   RefCountedPtr<Config> CreateChildPolicyConfigLocked();
   grpc_channel_args* CreateChildPolicyArgsLocked(
       const grpc_channel_args* args_in);
-  void MaybeUpdateEdsPickerLocked();
 
   // Caller must ensure that config_ is set before calling.
   const absl::string_view GetEdsResourceName() const {
@@ -302,137 +218,17 @@ class EdsLb : public LoadBalancingPolicy {
   std::vector<size_t /*child_number*/> priority_child_numbers_;
 
   RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config_;
-  RefCountedPtr<XdsClusterDropStats> drop_stats_;
-  // Current concurrent number of requests;
-  Atomic<uint32_t> concurrent_requests_{0};
 
   OrphanablePtr<LoadBalancingPolicy> child_policy_;
-
-  // The latest state and picker returned from the child policy.
-  grpc_connectivity_state child_state_;
-  absl::Status child_status_;
-  RefCountedPtr<ChildPickerWrapper> child_picker_;
 };
 
 //
-// EdsLb::EdsPicker
-//
-
-EdsLb::EdsPicker::EdsPicker(RefCountedPtr<EdsLb> eds_policy)
-    : eds_policy_(std::move(eds_policy)),
-      drop_stats_(eds_policy_->drop_stats_),
-      child_picker_(eds_policy_->child_picker_),
-      xds_circuit_breaking_enabled_(XdsCircuitBreakingEnabled()),
-      max_concurrent_requests_(
-          eds_policy_->config_->max_concurrent_requests()) {
-  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
-    gpr_log(GPR_INFO, "[edslb %p] constructed new drop picker %p",
-            eds_policy_.get(), this);
-  }
-}
-
-EdsLb::PickResult EdsLb::EdsPicker::Pick(PickArgs args) {
-  uint32_t current = eds_policy_->concurrent_requests_.FetchAdd(1);
-  if (xds_circuit_breaking_enabled_) {
-    // Check and see if we exceeded the max concurrent requests count.
-    if (current >= max_concurrent_requests_) {
-      eds_policy_->concurrent_requests_.FetchSub(1);
-      if (drop_stats_ != nullptr) {
-        drop_stats_->AddUncategorizedDrops();
-      }
-      PickResult result;
-      result.type = PickResult::PICK_COMPLETE;
-      return result;
-    }
-  }
-  // If we're not dropping the call, we should always have a child picker.
-  if (child_picker_ == nullptr) {  // Should never happen.
-    PickResult result;
-    result.type = PickResult::PICK_FAILED;
-    result.error =
-        grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-                               "eds drop picker not given any child picker"),
-                           GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
-    eds_policy_->concurrent_requests_.FetchSub(1);
-    return result;
-  }
-  // Not dropping, so delegate to child's picker.
-  PickResult result = child_picker_->Pick(args);
-  if (result.type == result.PICK_COMPLETE && result.subchannel != nullptr) {
-    XdsClusterLocalityStats* locality_stats = nullptr;
-    if (drop_stats_ != nullptr) {  // If load reporting is enabled.
-      auto* subchannel_wrapper =
-          static_cast<StatsSubchannelWrapper*>(result.subchannel.get());
-      // Handle load reporting.
-      locality_stats = subchannel_wrapper->locality_stats()->Ref().release();
-      // Record a call started.
-      locality_stats->AddCallStarted();
-      // Unwrap subchannel to pass back up the stack.
-      result.subchannel = subchannel_wrapper->wrapped_subchannel();
-    }
-    // Intercept the recv_trailing_metadata op to record call completion.
-    EdsLb* eds_policy = static_cast<EdsLb*>(
-        eds_policy_->Ref(DEBUG_LOCATION, "DropPickPicker+call").release());
-    auto original_recv_trailing_metadata_ready =
-        result.recv_trailing_metadata_ready;
-    result.recv_trailing_metadata_ready =
-        // Note: This callback does not run in either the control plane
-        // work serializer or in the data plane mutex.
-        [locality_stats, original_recv_trailing_metadata_ready, eds_policy](
-            grpc_error* error, MetadataInterface* metadata,
-            CallState* call_state) {
-          // Record call completion for load reporting.
-          if (locality_stats != nullptr) {
-            const bool call_failed = error != GRPC_ERROR_NONE;
-            locality_stats->AddCallFinished(call_failed);
-            locality_stats->Unref(DEBUG_LOCATION, "LocalityStats+call");
-          }
-          // Decrement number of calls in flight.
-          eds_policy->concurrent_requests_.FetchSub(1);
-          eds_policy->Unref(DEBUG_LOCATION, "DropPickPicker+call");
-          // Invoke the original recv_trailing_metadata_ready callback, if any.
-          if (original_recv_trailing_metadata_ready != nullptr) {
-            original_recv_trailing_metadata_ready(error, metadata, call_state);
-          }
-        };
-  } else {
-    // TODO(roth): We should ideally also record call failures here in the case
-    // where a pick fails.  This is challenging, because we don't know which
-    // picks are for wait_for_ready RPCs or how many times we'll return a
-    // failure for the same wait_for_ready RPC.
-    eds_policy_->concurrent_requests_.FetchSub(1);
-  }
-  return result;
-}
-
-//
 // EdsLb::Helper
 //
 
 RefCountedPtr<SubchannelInterface> EdsLb::Helper::CreateSubchannel(
     ServerAddress address, const grpc_channel_args& args) {
   if (eds_policy_->shutting_down_) return nullptr;
-  // If load reporting is enabled, wrap the subchannel such that it
-  // includes the locality stats object, which will be used by the EdsPicker.
-  if (eds_policy_->config_->lrs_load_reporting_server_name().has_value()) {
-    RefCountedPtr<XdsLocalityName> locality_name;
-    auto* attribute = address.GetAttribute(kXdsLocalityNameAttributeKey);
-    if (attribute != nullptr) {
-      const auto* locality_attr =
-          static_cast<const XdsLocalityAttribute*>(attribute);
-      locality_name = locality_attr->locality_name();
-    }
-    RefCountedPtr<XdsClusterLocalityStats> locality_stats =
-        eds_policy_->xds_client_->AddClusterLocalityStats(
-            *eds_policy_->config_->lrs_load_reporting_server_name(),
-            eds_policy_->config_->cluster_name(),
-            eds_policy_->config_->eds_service_name(), std::move(locality_name));
-    return MakeRefCounted<StatsSubchannelWrapper>(
-        eds_policy_->channel_control_helper()->CreateSubchannel(
-            std::move(address), args),
-        std::move(locality_stats));
-  }
-  // Load reporting not enabled, so don't wrap the subchannel.
   return eds_policy_->channel_control_helper()->CreateSubchannel(
       std::move(address), args);
 }
@@ -444,19 +240,12 @@ void EdsLb::Helper::UpdateState(grpc_connectivity_state state,
     return;
   }
   if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
-    gpr_log(GPR_INFO,
-            "[edslb %p] child policy updated state=%s (%s) "
-            "picker=%p",
+    gpr_log(GPR_INFO, "[edslb %p] child policy updated state=%s (%s) picker=%p",
             eds_policy_.get(), ConnectivityStateName(state),
             status.ToString().c_str(), picker.get());
   }
-  // Save the state and picker.
-  eds_policy_->child_state_ = state;
-  eds_policy_->child_status_ = status;
-  eds_policy_->child_picker_ =
-      MakeRefCounted<ChildPickerWrapper>(std::move(picker));
-  // Wrap the picker in a EdsPicker and pass it up.
-  eds_policy_->MaybeUpdateEdsPickerLocked();
+  eds_policy_->channel_control_helper()->UpdateState(state, status,
+                                                     std::move(picker));
 }
 
 void EdsLb::Helper::AddTraceEvent(TraceSeverity severity,
@@ -561,11 +350,7 @@ void EdsLb::ShutdownLocked() {
     gpr_log(GPR_INFO, "[edslb %p] shutting down", this);
   }
   shutting_down_ = true;
-  // Drop our ref to the child's picker, in case it's holding a ref to
-  // the child.
-  child_picker_.reset();
   MaybeDestroyChildPolicyLocked();
-  drop_stats_.reset();
   // Cancel watcher.
   if (endpoint_watcher_ != nullptr) {
     if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
@@ -613,28 +398,7 @@ void EdsLb::UpdateLocked(UpdateArgs args) {
   grpc_channel_args_destroy(args_);
   args_ = args.args;
   args.args = nullptr;
-  const bool lrs_server_changed =
-      is_initial_update || config_->lrs_load_reporting_server_name() !=
-                               old_config->lrs_load_reporting_server_name();
-  const bool max_concurrent_requests_changed =
-      is_initial_update || config_->max_concurrent_requests() !=
-                               old_config->max_concurrent_requests();
-  // Update drop stats for load reporting if needed.
-  if (lrs_server_changed) {
-    drop_stats_.reset();
-    if (config_->lrs_load_reporting_server_name().has_value()) {
-      const auto key = GetLrsClusterKey();
-      drop_stats_ = xds_client_->AddClusterDropStats(
-          config_->lrs_load_reporting_server_name().value(),
-          key.first /*cluster_name*/, key.second /*eds_service_name*/);
-    }
-  }
-  if (lrs_server_changed || max_concurrent_requests_changed) {
-    MaybeUpdateEdsPickerLocked();
-  }
   // Update child policy if needed.
-  // Note that this comes after updating drop_stats_, since we want that
-  // to be used by any new picker we create here.
   if (child_policy_ != nullptr) UpdateChildPolicyLocked();
   // Create endpoint watcher if needed.
   if (is_initial_update) {
@@ -665,7 +429,7 @@ void EdsLb::OnEndpointChanged(XdsApi::EdsUpdate update) {
   // Update the drop config.
   drop_config_ = std::move(update.drop_config);
   // If priority list is empty, add a single priority, just so that we
-  // have a child in which to create the eds_drop policy.
+  // have a child in which to create the xds_cluster_impl policy.
   if (update.priorities.empty()) update.priorities.emplace_back();
   // Update child policy.
   UpdatePriorityList(std::move(update.priorities));
@@ -752,8 +516,8 @@ void EdsLb::UpdatePriorityList(XdsApi::EdsUpdate::PriorityList priority_list) {
     if (!child_number.has_value()) {
       for (child_number = 0;
            child_locality_map.find(*child_number) != child_locality_map.end();
-           ++(*child_number))
-        ;
+           ++(*child_number)) {
+      }
       // Add entry so we know that the child number is in use.
       // (Don't need to add the list of localities, since we won't use them.)
       child_locality_map[*child_number];
@@ -836,20 +600,21 @@ EdsLb::CreateChildPolicyConfigLocked() {
           {"requests_per_million", category.parts_per_million},
       });
     }
-    Json::Object eds_drop_config = {
+    Json::Object xds_cluster_impl_config = {
         {"clusterName", std::string(lrs_key.first)},
         {"childPolicy", std::move(locality_picking_config)},
         {"dropCategories", std::move(drop_categories)},
+        {"maxConcurrentRequests", config_->max_concurrent_requests()},
     };
     if (!lrs_key.second.empty()) {
-      eds_drop_config["edsServiceName"] = std::string(lrs_key.second);
+      xds_cluster_impl_config["edsServiceName"] = std::string(lrs_key.second);
     }
     if (config_->lrs_load_reporting_server_name().has_value()) {
-      eds_drop_config["lrsLoadReportingServerName"] =
+      xds_cluster_impl_config["lrsLoadReportingServerName"] =
           config_->lrs_load_reporting_server_name().value();
     }
     Json locality_picking_policy = Json::Array{Json::Object{
-        {"eds_drop_experimental", std::move(eds_drop_config)},
+        {"xds_cluster_impl_experimental", std::move(xds_cluster_impl_config)},
     }};
     // Add priority entry.
     const size_t child_number = priority_child_numbers_[priority];
@@ -857,6 +622,7 @@ EdsLb::CreateChildPolicyConfigLocked() {
     priority_priorities.emplace_back(child_name);
     priority_children[child_name] = Json::Object{
         {"config", std::move(locality_picking_policy)},
+        {"ignore_reresolution_requests", true},
     };
   }
   Json json = Json::Array{Json::Object{
@@ -957,15 +723,6 @@ OrphanablePtr<LoadBalancingPolicy> EdsLb::CreateChildPolicyLocked(
   return lb_policy;
 }
 
-void EdsLb::MaybeUpdateEdsPickerLocked() {
-  // Update only if we have a child picker.
-  if (child_picker_ != nullptr) {
-    channel_control_helper()->UpdateState(
-        child_state_, child_status_,
-        absl::make_unique<EdsPicker>(Ref(DEBUG_LOCATION, "EdsPicker")));
-  }
-}
-
 //
 // factory
 //
diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc b/src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc
deleted file mode 100644 (file)
index e5c8f4d..0000000
+++ /dev/null
@@ -1,571 +0,0 @@
-//
-// Copyright 2018 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#include <grpc/support/port_platform.h>
-
-#include "absl/strings/string_view.h"
-
-#include <grpc/grpc.h>
-
-#include "src/core/ext/filters/client_channel/lb_policy.h"
-#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
-#include "src/core/ext/filters/client_channel/lb_policy_factory.h"
-#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
-#include "src/core/ext/xds/xds_client.h"
-#include "src/core/ext/xds/xds_client_stats.h"
-#include "src/core/lib/channel/channel_args.h"
-#include "src/core/lib/gpr/string.h"
-#include "src/core/lib/gprpp/orphanable.h"
-#include "src/core/lib/gprpp/ref_counted_ptr.h"
-#include "src/core/lib/iomgr/work_serializer.h"
-
-namespace grpc_core {
-
-TraceFlag grpc_eds_drop_lb_trace(false, "eds_drop_lb");
-
-namespace {
-
-constexpr char kEdsDrop[] = "eds_drop_experimental";
-
-// Config for EDS drop LB policy.
-class EdsDropLbConfig : public LoadBalancingPolicy::Config {
- public:
-  EdsDropLbConfig(RefCountedPtr<LoadBalancingPolicy::Config> child_policy,
-                  std::string cluster_name, std::string eds_service_name,
-                  absl::optional<std::string> lrs_load_reporting_server_name,
-                  RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config)
-      : child_policy_(std::move(child_policy)),
-        cluster_name_(std::move(cluster_name)),
-        eds_service_name_(std::move(eds_service_name)),
-        lrs_load_reporting_server_name_(
-            std::move(lrs_load_reporting_server_name)),
-        drop_config_(std::move(drop_config)) {}
-
-  const char* name() const override { return kEdsDrop; }
-
-  RefCountedPtr<LoadBalancingPolicy::Config> child_policy() const {
-    return child_policy_;
-  }
-  const std::string& cluster_name() const { return cluster_name_; }
-  const std::string& eds_service_name() const { return eds_service_name_; }
-  const absl::optional<std::string>& lrs_load_reporting_server_name() const {
-    return lrs_load_reporting_server_name_;
-  };
-  RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config() const {
-    return drop_config_;
-  }
-
- private:
-  RefCountedPtr<LoadBalancingPolicy::Config> child_policy_;
-  std::string cluster_name_;
-  std::string eds_service_name_;
-  absl::optional<std::string> lrs_load_reporting_server_name_;
-  RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config_;
-};
-
-// EDS Drop LB policy.
-class EdsDropLb : public LoadBalancingPolicy {
- public:
-  EdsDropLb(RefCountedPtr<XdsClient> xds_client, Args args);
-
-  const char* name() const override { return kEdsDrop; }
-
-  void UpdateLocked(UpdateArgs args) override;
-  void ExitIdleLocked() override;
-  void ResetBackoffLocked() override;
-
- private:
-  // A simple wrapper for ref-counting a picker from the child policy.
-  class RefCountedPicker : public RefCounted<RefCountedPicker> {
-   public:
-    explicit RefCountedPicker(std::unique_ptr<SubchannelPicker> picker)
-        : picker_(std::move(picker)) {}
-    PickResult Pick(PickArgs args) { return picker_->Pick(args); }
-
-   private:
-    std::unique_ptr<SubchannelPicker> picker_;
-  };
-
-  // A picker that wraps the picker from the child to perform drops.
-  class DropPicker : public SubchannelPicker {
-   public:
-    DropPicker(EdsDropLb* eds_drop_lb, RefCountedPtr<RefCountedPicker> picker)
-        : drop_config_(eds_drop_lb->config_->drop_config()),
-          drop_stats_(eds_drop_lb->drop_stats_),
-          picker_(std::move(picker)) {}
-
-    PickResult Pick(PickArgs args);
-
-   private:
-    RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config_;
-    RefCountedPtr<XdsClusterDropStats> drop_stats_;
-    RefCountedPtr<RefCountedPicker> picker_;
-  };
-
-  class Helper : public ChannelControlHelper {
-   public:
-    explicit Helper(RefCountedPtr<EdsDropLb> eds_drop_policy)
-        : eds_drop_policy_(std::move(eds_drop_policy)) {}
-
-    ~Helper() { eds_drop_policy_.reset(DEBUG_LOCATION, "Helper"); }
-
-    RefCountedPtr<SubchannelInterface> CreateSubchannel(
-        ServerAddress address, const grpc_channel_args& args) override;
-    void UpdateState(grpc_connectivity_state state, const absl::Status& status,
-                     std::unique_ptr<SubchannelPicker> picker) override;
-    void RequestReresolution() override;
-    void AddTraceEvent(TraceSeverity severity,
-                       absl::string_view message) override;
-
-   private:
-    RefCountedPtr<EdsDropLb> eds_drop_policy_;
-  };
-
-  ~EdsDropLb();
-
-  void ShutdownLocked() override;
-
-  OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
-      const grpc_channel_args* args);
-  void UpdateChildPolicyLocked(ServerAddressList addresses,
-                               const grpc_channel_args* args);
-
-  void MaybeUpdatePickerLocked();
-
-  // Current config from the resolver.
-  RefCountedPtr<EdsDropLbConfig> config_;
-
-  // Internal state.
-  bool shutting_down_ = false;
-
-  // The xds client.
-  RefCountedPtr<XdsClient> xds_client_;
-
-  // The stats for client-side load reporting.
-  RefCountedPtr<XdsClusterDropStats> drop_stats_;
-
-  OrphanablePtr<LoadBalancingPolicy> child_policy_;
-
-  // Latest state and picker reported by the child policy.
-  grpc_connectivity_state state_ = GRPC_CHANNEL_IDLE;
-  absl::Status status_;
-  RefCountedPtr<RefCountedPicker> picker_;
-};
-
-//
-// EdsDropLb::DropPicker
-//
-
-LoadBalancingPolicy::PickResult EdsDropLb::DropPicker::Pick(
-    LoadBalancingPolicy::PickArgs args) {
-  // Handle drop.
-  const std::string* drop_category;
-  if (drop_config_->ShouldDrop(&drop_category)) {
-    if (drop_stats_ != nullptr) drop_stats_->AddCallDropped(*drop_category);
-    PickResult result;
-    result.type = PickResult::PICK_COMPLETE;
-    return result;
-  }
-  // If we're not dropping the call, we should always have a child picker.
-  if (picker_ == nullptr) {  // Should never happen.
-    PickResult result;
-    result.type = PickResult::PICK_FAILED;
-    result.error =
-        grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-                               "eds_drop picker not given any child picker"),
-                           GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
-    return result;
-  }
-  // Not dropping, so delegate to child picker.
-  return picker_->Pick(args);
-}
-
-//
-// EdsDropLb
-//
-
-EdsDropLb::EdsDropLb(RefCountedPtr<XdsClient> xds_client, Args args)
-    : LoadBalancingPolicy(std::move(args)), xds_client_(std::move(xds_client)) {
-  if (GRPC_TRACE_FLAG_ENABLED(grpc_eds_drop_lb_trace)) {
-    gpr_log(GPR_INFO, "[eds_drop_lb %p] created -- using xds client %p", this,
-            xds_client_.get());
-  }
-}
-
-EdsDropLb::~EdsDropLb() {
-  if (GRPC_TRACE_FLAG_ENABLED(grpc_eds_drop_lb_trace)) {
-    gpr_log(GPR_INFO, "[eds_drop_lb %p] destroying xds LB policy", this);
-  }
-}
-
-void EdsDropLb::ShutdownLocked() {
-  if (GRPC_TRACE_FLAG_ENABLED(grpc_eds_drop_lb_trace)) {
-    gpr_log(GPR_INFO, "[eds_drop_lb %p] shutting down", this);
-  }
-  shutting_down_ = true;
-  // Remove the child policy's interested_parties pollset_set from the
-  // xDS policy.
-  if (child_policy_ != nullptr) {
-    grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
-                                     interested_parties());
-    child_policy_.reset();
-  }
-  // Drop our ref to the child's picker, in case it's holding a ref to
-  // the child.
-  picker_.reset();
-  drop_stats_.reset();
-  xds_client_.reset();
-}
-
-void EdsDropLb::ExitIdleLocked() {
-  if (child_policy_ != nullptr) child_policy_->ExitIdleLocked();
-}
-
-void EdsDropLb::ResetBackoffLocked() {
-  // The XdsClient will have its backoff reset by the xds resolver, so we
-  // don't need to do it here.
-  if (child_policy_ != nullptr) child_policy_->ResetBackoffLocked();
-}
-
-void EdsDropLb::UpdateLocked(UpdateArgs args) {
-  if (GRPC_TRACE_FLAG_ENABLED(grpc_eds_drop_lb_trace)) {
-    gpr_log(GPR_INFO, "[eds_drop_lb %p] Received update", this);
-  }
-  // Update config.
-  auto old_config = std::move(config_);
-  config_ = std::move(args.config);
-  // Update load reporting if needed.
-  if (old_config == nullptr ||
-      config_->lrs_load_reporting_server_name() !=
-          old_config->lrs_load_reporting_server_name() ||
-      config_->cluster_name() != old_config->cluster_name() ||
-      config_->eds_service_name() != old_config->eds_service_name()) {
-    drop_stats_.reset();
-    if (config_->lrs_load_reporting_server_name().has_value()) {
-      drop_stats_ = xds_client_->AddClusterDropStats(
-          config_->lrs_load_reporting_server_name().value(),
-          config_->cluster_name(), config_->eds_service_name());
-    }
-    MaybeUpdatePickerLocked();
-  }
-  // Update child policy.
-  UpdateChildPolicyLocked(std::move(args.addresses), args.args);
-  args.args = nullptr;
-}
-
-void EdsDropLb::MaybeUpdatePickerLocked() {
-  // If we're dropping all calls, report READY, regardless of what (or
-  // whether) the child has reported.
-  if (config_->drop_config() != nullptr && config_->drop_config()->drop_all()) {
-    auto drop_picker = absl::make_unique<DropPicker>(this, picker_);
-    if (GRPC_TRACE_FLAG_ENABLED(grpc_eds_drop_lb_trace)) {
-      gpr_log(GPR_INFO,
-              "[eds_drop_lb %p] updating connectivity (drop all): state=READY "
-              "picker=%p",
-              this, drop_picker.get());
-    }
-    channel_control_helper()->UpdateState(GRPC_CHANNEL_READY, absl::Status(),
-                                          std::move(drop_picker));
-    return;
-  }
-  // Otherwise, update only if we have a child picker.
-  if (picker_ != nullptr) {
-    auto drop_picker = absl::make_unique<DropPicker>(this, picker_);
-    if (GRPC_TRACE_FLAG_ENABLED(grpc_eds_drop_lb_trace)) {
-      gpr_log(GPR_INFO,
-              "[eds_drop_lb %p] updating connectivity: state=%s status=(%s) "
-              "picker=%p",
-              this, ConnectivityStateName(state_), status_.ToString().c_str(),
-              drop_picker.get());
-    }
-    channel_control_helper()->UpdateState(state_, status_,
-                                          std::move(drop_picker));
-  }
-}
-
-OrphanablePtr<LoadBalancingPolicy> EdsDropLb::CreateChildPolicyLocked(
-    const grpc_channel_args* args) {
-  LoadBalancingPolicy::Args lb_policy_args;
-  lb_policy_args.work_serializer = work_serializer();
-  lb_policy_args.args = args;
-  lb_policy_args.channel_control_helper =
-      absl::make_unique<Helper>(Ref(DEBUG_LOCATION, "Helper"));
-  OrphanablePtr<LoadBalancingPolicy> lb_policy =
-      MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
-                                         &grpc_eds_drop_lb_trace);
-  if (GRPC_TRACE_FLAG_ENABLED(grpc_eds_drop_lb_trace)) {
-    gpr_log(GPR_INFO, "[eds_drop_lb %p] Created new child policy handler %p",
-            this, lb_policy.get());
-  }
-  // Add our interested_parties pollset_set to that of the newly created
-  // child policy. This will make the child policy progress upon activity on
-  // this policy, which in turn is tied to the application's call.
-  grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
-                                   interested_parties());
-  return lb_policy;
-}
-
-void EdsDropLb::UpdateChildPolicyLocked(ServerAddressList addresses,
-                                        const grpc_channel_args* args) {
-  // Create policy if needed.
-  if (child_policy_ == nullptr) {
-    child_policy_ = CreateChildPolicyLocked(args);
-  }
-  // Construct update args.
-  UpdateArgs update_args;
-  update_args.addresses = std::move(addresses);
-  update_args.config = config_->child_policy();
-  update_args.args = args;
-  // Update the policy.
-  if (GRPC_TRACE_FLAG_ENABLED(grpc_eds_drop_lb_trace)) {
-    gpr_log(GPR_INFO, "[eds_drop_lb %p] Updating child policy handler %p", this,
-            child_policy_.get());
-  }
-  child_policy_->UpdateLocked(std::move(update_args));
-}
-
-//
-// EdsDropLb::Helper
-//
-
-RefCountedPtr<SubchannelInterface> EdsDropLb::Helper::CreateSubchannel(
-    ServerAddress address, const grpc_channel_args& args) {
-  if (eds_drop_policy_->shutting_down_) return nullptr;
-  return eds_drop_policy_->channel_control_helper()->CreateSubchannel(
-      std::move(address), args);
-}
-
-void EdsDropLb::Helper::UpdateState(grpc_connectivity_state state,
-                                    const absl::Status& status,
-                                    std::unique_ptr<SubchannelPicker> picker) {
-  if (eds_drop_policy_->shutting_down_) return;
-  if (GRPC_TRACE_FLAG_ENABLED(grpc_eds_drop_lb_trace)) {
-    gpr_log(GPR_INFO,
-            "[eds_drop_lb %p] child connectivity state update: state=%s (%s) "
-            "picker=%p",
-            eds_drop_policy_.get(), ConnectivityStateName(state),
-            status.ToString().c_str(), picker.get());
-  }
-  // Save the state and picker.
-  eds_drop_policy_->state_ = state;
-  eds_drop_policy_->status_ = status;
-  eds_drop_policy_->picker_ =
-      MakeRefCounted<RefCountedPicker>(std::move(picker));
-  // Wrap the picker and return it to the channel.
-  eds_drop_policy_->MaybeUpdatePickerLocked();
-}
-
-void EdsDropLb::Helper::RequestReresolution() {
-  if (eds_drop_policy_->shutting_down_) return;
-  eds_drop_policy_->channel_control_helper()->RequestReresolution();
-}
-
-void EdsDropLb::Helper::AddTraceEvent(TraceSeverity severity,
-                                      absl::string_view message) {
-  if (eds_drop_policy_->shutting_down_) return;
-  eds_drop_policy_->channel_control_helper()->AddTraceEvent(severity, message);
-}
-
-//
-// factory
-//
-
-class EdsDropLbFactory : public LoadBalancingPolicyFactory {
- public:
-  OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
-      LoadBalancingPolicy::Args args) const override {
-    grpc_error* error = GRPC_ERROR_NONE;
-    RefCountedPtr<XdsClient> xds_client = XdsClient::GetOrCreate(&error);
-    if (error != GRPC_ERROR_NONE) {
-      gpr_log(GPR_ERROR,
-              "cannot get XdsClient to instantiate eds_drop LB policy: %s",
-              grpc_error_string(error));
-      GRPC_ERROR_UNREF(error);
-      return nullptr;
-    }
-    return MakeOrphanable<EdsDropLb>(std::move(xds_client), std::move(args));
-  }
-
-  const char* name() const override { return kEdsDrop; }
-
-  RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
-      const Json& json, grpc_error** error) const override {
-    GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
-    if (json.type() == Json::Type::JSON_NULL) {
-      // This policy was configured in the deprecated loadBalancingPolicy
-      // field or in the client API.
-      *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "field:loadBalancingPolicy error:eds_drop policy requires "
-          "configuration. Please use loadBalancingConfig field of service "
-          "config instead.");
-      return nullptr;
-    }
-    std::vector<grpc_error*> error_list;
-    // Child policy.
-    RefCountedPtr<LoadBalancingPolicy::Config> child_policy;
-    auto it = json.object_value().find("childPolicy");
-    if (it == json.object_value().end()) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "field:childPolicy error:required field missing"));
-    } else {
-      grpc_error* parse_error = GRPC_ERROR_NONE;
-      child_policy = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
-          it->second, &parse_error);
-      if (child_policy == nullptr) {
-        GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
-        std::vector<grpc_error*> child_errors;
-        child_errors.push_back(parse_error);
-        error_list.push_back(
-            GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors));
-      }
-    }
-    // Cluster name.
-    std::string cluster_name;
-    it = json.object_value().find("clusterName");
-    if (it == json.object_value().end()) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "field:clusterName error:required field missing"));
-    } else if (it->second.type() != Json::Type::STRING) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "field:clusterName error:type should be string"));
-    } else {
-      cluster_name = it->second.string_value();
-    }
-    // EDS service name.
-    std::string eds_service_name;
-    it = json.object_value().find("edsServiceName");
-    if (it != json.object_value().end()) {
-      if (it->second.type() != Json::Type::STRING) {
-        error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-            "field:edsServiceName error:type should be string"));
-      } else {
-        eds_service_name = it->second.string_value();
-      }
-    }
-    // LRS load reporting server name.
-    absl::optional<std::string> lrs_load_reporting_server_name;
-    it = json.object_value().find("lrsLoadReportingServerName");
-    if (it != json.object_value().end()) {
-      if (it->second.type() != Json::Type::STRING) {
-        error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-            "field:lrsLoadReportingServerName error:type should be string"));
-      } else {
-        lrs_load_reporting_server_name = it->second.string_value();
-      }
-    }
-    // Drop config.
-    auto drop_config = MakeRefCounted<XdsApi::EdsUpdate::DropConfig>();
-    it = json.object_value().find("dropCategories");
-    if (it == json.object_value().end()) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "field:dropCategories error:required field missing"));
-    } else {
-      std::vector<grpc_error*> child_errors =
-          ParseDropCategories(it->second, drop_config.get());
-      if (!child_errors.empty()) {
-        error_list.push_back(GRPC_ERROR_CREATE_FROM_VECTOR(
-            "field:dropCategories", &child_errors));
-      }
-    }
-    if (!error_list.empty()) {
-      *error = GRPC_ERROR_CREATE_FROM_VECTOR(
-          "eds_drop_experimental LB policy config", &error_list);
-      return nullptr;
-    }
-    return MakeRefCounted<EdsDropLbConfig>(
-        std::move(child_policy), std::move(cluster_name),
-        std::move(eds_service_name), std::move(lrs_load_reporting_server_name),
-        std::move(drop_config));
-  }
-
- private:
-  static std::vector<grpc_error*> ParseDropCategories(
-      const Json& json, XdsApi::EdsUpdate::DropConfig* drop_config) {
-    std::vector<grpc_error*> error_list;
-    if (json.type() != Json::Type::ARRAY) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "dropCategories field is not an array"));
-      return error_list;
-    }
-    for (size_t i = 0; i < json.array_value().size(); ++i) {
-      const Json& entry = json.array_value()[i];
-      std::vector<grpc_error*> child_errors =
-          ParseDropCategory(entry, drop_config);
-      if (!child_errors.empty()) {
-        grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
-            absl::StrCat("errors parsing index ", i).c_str());
-        for (size_t i = 0; i < child_errors.size(); ++i) {
-          error = grpc_error_add_child(error, child_errors[i]);
-        }
-        error_list.push_back(error);
-      }
-    }
-    return error_list;
-  }
-
-  static std::vector<grpc_error*> ParseDropCategory(
-      const Json& json, XdsApi::EdsUpdate::DropConfig* drop_config) {
-    std::vector<grpc_error*> error_list;
-    if (json.type() != Json::Type::OBJECT) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "dropCategories entry is not an object"));
-      return error_list;
-    }
-    std::string category;
-    auto it = json.object_value().find("category");
-    if (it == json.object_value().end()) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "\"category\" field not present"));
-    } else if (it->second.type() != Json::Type::STRING) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "\"category\" field is not a string"));
-    } else {
-      category = it->second.string_value();
-    }
-    uint32_t requests_per_million = 0;
-    it = json.object_value().find("requests_per_million");
-    if (it == json.object_value().end()) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "\"requests_per_million\" field is not present"));
-    } else if (it->second.type() != Json::Type::NUMBER) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "\"requests_per_million\" field is not a number"));
-    } else {
-      requests_per_million =
-          gpr_parse_nonnegative_int(it->second.string_value().c_str());
-    }
-    if (error_list.empty()) {
-      drop_config->AddCategory(std::move(category), requests_per_million);
-    }
-    return error_list;
-  }
-};
-
-}  // namespace
-
-}  // namespace grpc_core
-
-//
-// Plugin registration
-//
-
-void grpc_lb_policy_eds_drop_init() {
-  grpc_core::LoadBalancingPolicyRegistry::Builder::
-      RegisterLoadBalancingPolicyFactory(
-          absl::make_unique<grpc_core::EdsDropLbFactory>());
-}
-
-void grpc_lb_policy_eds_drop_shutdown() {}
index 1de3472..18d138b 100644 (file)
@@ -1,26 +1,28 @@
-/*
- *
- * Copyright 2018 gRPC authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
+//
+// Copyright 2018 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
 
 #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_H
 #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_H
 
 #include <grpc/support/port_platform.h>
 
+#include "src/core/ext/filters/client_channel/server_address.h"
+#include "src/core/ext/xds/xds_client_stats.h"
+#include "src/core/lib/gprpp/ref_counted_ptr.h"
+
 /** Channel arg indicating if a target corresponding to the address is a backend
  * received from a balancer. The type of this arg is an integer and the value is
  * treated as a bool. */
 #define GRPC_ARG_ADDRESS_IS_BACKEND_FROM_XDS_LOAD_BALANCER \
   "grpc.address_is_backend_from_xds_load_balancer"
 
+namespace grpc_core {
+
+// Defined in the EDS policy.
+extern const char* kXdsLocalityNameAttributeKey;
+
+class XdsLocalityAttribute : public ServerAddress::AttributeInterface {
+ public:
+  explicit XdsLocalityAttribute(RefCountedPtr<XdsLocalityName> locality_name)
+      : locality_name_(std::move(locality_name)) {}
+
+  RefCountedPtr<XdsLocalityName> locality_name() const {
+    return locality_name_;
+  }
+
+  std::unique_ptr<AttributeInterface> Copy() const override {
+    return absl::make_unique<XdsLocalityAttribute>(locality_name_->Ref());
+  }
+
+  int Cmp(const AttributeInterface* other) const override {
+    const auto* other_locality_attr =
+        static_cast<const XdsLocalityAttribute*>(other);
+    return locality_name_->Compare(*other_locality_attr->locality_name_);
+  }
+
+  std::string ToString() const override {
+    return locality_name_->AsHumanReadableString();
+  }
+
+ private:
+  RefCountedPtr<XdsLocalityName> locality_name_;
+};
+
+}  // namespace grpc_core
+
 #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_H */
diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc
new file mode 100644 (file)
index 0000000..b347677
--- /dev/null
@@ -0,0 +1,809 @@
+//
+// Copyright 2018 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <grpc/support/port_platform.h>
+
+#include "absl/strings/string_view.h"
+
+#include <grpc/grpc.h>
+
+#include "src/core/ext/filters/client_channel/lb_policy.h"
+#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
+#include "src/core/ext/filters/client_channel/lb_policy/xds/xds.h"
+#include "src/core/ext/filters/client_channel/lb_policy_factory.h"
+#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
+#include "src/core/ext/xds/xds_client.h"
+#include "src/core/ext/xds/xds_client_stats.h"
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/gpr/env.h"
+#include "src/core/lib/gpr/string.h"
+#include "src/core/lib/gprpp/orphanable.h"
+#include "src/core/lib/gprpp/ref_counted_ptr.h"
+#include "src/core/lib/gprpp/sync.h"
+#include "src/core/lib/iomgr/work_serializer.h"
+
+namespace grpc_core {
+
+TraceFlag grpc_xds_cluster_impl_lb_trace(false, "xds_cluster_impl_lb");
+
+namespace {
+
+//
+// global circuit breaker atomic map
+//
+
+class CircuitBreakerCallCounterMap {
+ public:
+  using Key =
+      std::pair<std::string /*cluster*/, std::string /*eds_service_name*/>;
+
+  class CallCounter : public RefCounted<CallCounter> {
+   public:
+    explicit CallCounter(Key key) : key_(std::move(key)) {}
+    ~CallCounter() override;
+
+    uint32_t Increment() { return concurrent_requests_.FetchAdd(1); }
+    void Decrement() { concurrent_requests_.FetchSub(1); }
+
+   private:
+    Key key_;
+    Atomic<uint32_t> concurrent_requests_{0};
+  };
+
+  RefCountedPtr<CallCounter> GetOrCreate(const std::string& cluster,
+                                         const std::string& eds_service_name);
+
+ private:
+  Mutex mu_;
+  std::map<Key, CallCounter*> map_;
+};
+
+CircuitBreakerCallCounterMap* g_call_counter_map = nullptr;
+
+RefCountedPtr<CircuitBreakerCallCounterMap::CallCounter>
+CircuitBreakerCallCounterMap::GetOrCreate(const std::string& cluster,
+                                          const std::string& eds_service_name) {
+  Key key(cluster, eds_service_name);
+  RefCountedPtr<CallCounter> result;
+  MutexLock lock(&mu_);
+  auto it = map_.find(key);
+  if (it == map_.end()) {
+    it = map_.insert({key, nullptr}).first;
+  } else {
+    result = it->second->RefIfNonZero();
+  }
+  if (result == nullptr) {
+    result = MakeRefCounted<CallCounter>(std::move(key));
+    it->second = result.get();
+  }
+  return result;
+}
+
+CircuitBreakerCallCounterMap::CallCounter::~CallCounter() {
+  MutexLock lock(&g_call_counter_map->mu_);
+  auto it = g_call_counter_map->map_.find(key_);
+  if (it != g_call_counter_map->map_.end() && it->second == this) {
+    g_call_counter_map->map_.erase(it);
+  }
+}
+
+//
+// LB policy
+//
+
+constexpr char kXdsClusterImpl[] = "xds_cluster_impl_experimental";
+
+// TODO (donnadionne): Check to see if circuit breaking is enabled, this will be
+// removed once circuit breaking feature is fully integrated and enabled by
+// default.
+bool XdsCircuitBreakingEnabled() {
+  char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_CIRCUIT_BREAKING");
+  bool parsed_value;
+  bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
+  gpr_free(value);
+  return parse_succeeded && parsed_value;
+}
+
+// Config for xDS Cluster Impl LB policy.
+class XdsClusterImplLbConfig : public LoadBalancingPolicy::Config {
+ public:
+  XdsClusterImplLbConfig(
+      RefCountedPtr<LoadBalancingPolicy::Config> child_policy,
+      std::string cluster_name, std::string eds_service_name,
+      absl::optional<std::string> lrs_load_reporting_server_name,
+      uint32_t max_concurrent_requests,
+      RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config)
+      : child_policy_(std::move(child_policy)),
+        cluster_name_(std::move(cluster_name)),
+        eds_service_name_(std::move(eds_service_name)),
+        lrs_load_reporting_server_name_(
+            std::move(lrs_load_reporting_server_name)),
+        max_concurrent_requests_(max_concurrent_requests),
+        drop_config_(std::move(drop_config)) {}
+
+  const char* name() const override { return kXdsClusterImpl; }
+
+  RefCountedPtr<LoadBalancingPolicy::Config> child_policy() const {
+    return child_policy_;
+  }
+  const std::string& cluster_name() const { return cluster_name_; }
+  const std::string& eds_service_name() const { return eds_service_name_; }
+  const absl::optional<std::string>& lrs_load_reporting_server_name() const {
+    return lrs_load_reporting_server_name_;
+  };
+  const uint32_t max_concurrent_requests() const {
+    return max_concurrent_requests_;
+  }
+  RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config() const {
+    return drop_config_;
+  }
+
+ private:
+  RefCountedPtr<LoadBalancingPolicy::Config> child_policy_;
+  std::string cluster_name_;
+  std::string eds_service_name_;
+  absl::optional<std::string> lrs_load_reporting_server_name_;
+  uint32_t max_concurrent_requests_;
+  RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config_;
+};
+
+// xDS Cluster Impl LB policy.
+class XdsClusterImplLb : public LoadBalancingPolicy {
+ public:
+  XdsClusterImplLb(RefCountedPtr<XdsClient> xds_client, Args args);
+
+  const char* name() const override { return kXdsClusterImpl; }
+
+  void UpdateLocked(UpdateArgs args) override;
+  void ExitIdleLocked() override;
+  void ResetBackoffLocked() override;
+
+ private:
+  class StatsSubchannelWrapper : public DelegatingSubchannel {
+   public:
+    StatsSubchannelWrapper(
+        RefCountedPtr<SubchannelInterface> wrapped_subchannel,
+        RefCountedPtr<XdsClusterLocalityStats> locality_stats)
+        : DelegatingSubchannel(std::move(wrapped_subchannel)),
+          locality_stats_(std::move(locality_stats)) {}
+
+    XdsClusterLocalityStats* locality_stats() const {
+      return locality_stats_.get();
+    }
+
+   private:
+    RefCountedPtr<XdsClusterLocalityStats> locality_stats_;
+  };
+
+  // A simple wrapper for ref-counting a picker from the child policy.
+  class RefCountedPicker : public RefCounted<RefCountedPicker> {
+   public:
+    explicit RefCountedPicker(std::unique_ptr<SubchannelPicker> picker)
+        : picker_(std::move(picker)) {}
+    PickResult Pick(PickArgs args) { return picker_->Pick(args); }
+
+   private:
+    std::unique_ptr<SubchannelPicker> picker_;
+  };
+
+  // A picker that wraps the picker from the child to perform drops.
+  class Picker : public SubchannelPicker {
+   public:
+    Picker(XdsClusterImplLb* xds_cluster_impl_lb,
+           RefCountedPtr<RefCountedPicker> picker);
+
+    PickResult Pick(PickArgs args) override;
+
+   private:
+    RefCountedPtr<CircuitBreakerCallCounterMap::CallCounter> call_counter_;
+    bool xds_circuit_breaking_enabled_;
+    uint32_t max_concurrent_requests_;
+    RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config_;
+    RefCountedPtr<XdsClusterDropStats> drop_stats_;
+    RefCountedPtr<RefCountedPicker> picker_;
+  };
+
+  class Helper : public ChannelControlHelper {
+   public:
+    explicit Helper(RefCountedPtr<XdsClusterImplLb> xds_cluster_impl_policy)
+        : xds_cluster_impl_policy_(std::move(xds_cluster_impl_policy)) {}
+
+    ~Helper() override {
+      xds_cluster_impl_policy_.reset(DEBUG_LOCATION, "Helper");
+    }
+
+    RefCountedPtr<SubchannelInterface> CreateSubchannel(
+        ServerAddress address, const grpc_channel_args& args) override;
+    void UpdateState(grpc_connectivity_state state, const absl::Status& status,
+                     std::unique_ptr<SubchannelPicker> picker) override;
+    void RequestReresolution() override;
+    void AddTraceEvent(TraceSeverity severity,
+                       absl::string_view message) override;
+
+   private:
+    RefCountedPtr<XdsClusterImplLb> xds_cluster_impl_policy_;
+  };
+
+  ~XdsClusterImplLb() override;
+
+  void ShutdownLocked() override;
+
+  OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
+      const grpc_channel_args* args);
+  void UpdateChildPolicyLocked(ServerAddressList addresses,
+                               const grpc_channel_args* args);
+
+  void MaybeUpdatePickerLocked();
+
+  // Current config from the resolver.
+  RefCountedPtr<XdsClusterImplLbConfig> config_;
+
+  // Current concurrent number of requests.
+  RefCountedPtr<CircuitBreakerCallCounterMap::CallCounter> call_counter_;
+
+  // Internal state.
+  bool shutting_down_ = false;
+
+  // The xds client.
+  RefCountedPtr<XdsClient> xds_client_;
+
+  // The stats for client-side load reporting.
+  RefCountedPtr<XdsClusterDropStats> drop_stats_;
+
+  OrphanablePtr<LoadBalancingPolicy> child_policy_;
+
+  // Latest state and picker reported by the child policy.
+  grpc_connectivity_state state_ = GRPC_CHANNEL_IDLE;
+  absl::Status status_;
+  RefCountedPtr<RefCountedPicker> picker_;
+};
+
+//
+// XdsClusterImplLb::Picker
+//
+
+XdsClusterImplLb::Picker::Picker(XdsClusterImplLb* xds_cluster_impl_lb,
+                                 RefCountedPtr<RefCountedPicker> picker)
+    : call_counter_(xds_cluster_impl_lb->call_counter_),
+      xds_circuit_breaking_enabled_(XdsCircuitBreakingEnabled()),
+      max_concurrent_requests_(
+          xds_cluster_impl_lb->config_->max_concurrent_requests()),
+      drop_config_(xds_cluster_impl_lb->config_->drop_config()),
+      drop_stats_(xds_cluster_impl_lb->drop_stats_),
+      picker_(std::move(picker)) {
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
+    gpr_log(GPR_INFO, "[xds_cluster_impl_lb %p] constructed new picker %p",
+            xds_cluster_impl_lb, this);
+  }
+}
+
+LoadBalancingPolicy::PickResult XdsClusterImplLb::Picker::Pick(
+    LoadBalancingPolicy::PickArgs args) {
+  // Handle EDS drops.
+  const std::string* drop_category;
+  if (drop_config_->ShouldDrop(&drop_category)) {
+    if (drop_stats_ != nullptr) drop_stats_->AddCallDropped(*drop_category);
+    PickResult result;
+    result.type = PickResult::PICK_COMPLETE;
+    return result;
+  }
+  // Handle circuit breaking.
+  uint32_t current = call_counter_->Increment();
+  if (xds_circuit_breaking_enabled_) {
+    // Check and see if we exceeded the max concurrent requests count.
+    if (current >= max_concurrent_requests_) {
+      call_counter_->Decrement();
+      if (drop_stats_ != nullptr) drop_stats_->AddUncategorizedDrops();
+      PickResult result;
+      result.type = PickResult::PICK_COMPLETE;
+      return result;
+    }
+  }
+  // If we're not dropping the call, we should always have a child picker.
+  if (picker_ == nullptr) {  // Should never happen.
+    PickResult result;
+    result.type = PickResult::PICK_FAILED;
+    result.error = grpc_error_set_int(
+        GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+            "xds_cluster_impl picker not given any child picker"),
+        GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
+    call_counter_->Decrement();
+    return result;
+  }
+  // Not dropping, so delegate to child picker.
+  PickResult result = picker_->Pick(args);
+  if (result.type == result.PICK_COMPLETE && result.subchannel != nullptr) {
+    XdsClusterLocalityStats* locality_stats = nullptr;
+    if (drop_stats_ != nullptr) {  // If load reporting is enabled.
+      auto* subchannel_wrapper =
+          static_cast<StatsSubchannelWrapper*>(result.subchannel.get());
+      // Handle load reporting.
+      locality_stats = subchannel_wrapper->locality_stats()->Ref().release();
+      // Record a call started.
+      locality_stats->AddCallStarted();
+      // Unwrap subchannel to pass back up the stack.
+      result.subchannel = subchannel_wrapper->wrapped_subchannel();
+    }
+    // Intercept the recv_trailing_metadata op to record call completion.
+    auto* call_counter = call_counter_->Ref(DEBUG_LOCATION, "call").release();
+    auto original_recv_trailing_metadata_ready =
+        result.recv_trailing_metadata_ready;
+    result.recv_trailing_metadata_ready =
+        // Note: This callback does not run in either the control plane
+        // work serializer or in the data plane mutex.
+        [locality_stats, original_recv_trailing_metadata_ready, call_counter](
+            grpc_error* error, MetadataInterface* metadata,
+            CallState* call_state) {
+          // Record call completion for load reporting.
+          if (locality_stats != nullptr) {
+            const bool call_failed = error != GRPC_ERROR_NONE;
+            locality_stats->AddCallFinished(call_failed);
+            locality_stats->Unref(DEBUG_LOCATION, "LocalityStats+call");
+          }
+          // Decrement number of calls in flight.
+          call_counter->Decrement();
+          call_counter->Unref(DEBUG_LOCATION, "call");
+          // Invoke the original recv_trailing_metadata_ready callback, if any.
+          if (original_recv_trailing_metadata_ready != nullptr) {
+            original_recv_trailing_metadata_ready(error, metadata, call_state);
+          }
+        };
+  } else {
+    // TODO(roth): We should ideally also record call failures here in the case
+    // where a pick fails.  This is challenging, because we don't know which
+    // picks are for wait_for_ready RPCs or how many times we'll return a
+    // failure for the same wait_for_ready RPC.
+    call_counter_->Decrement();
+  }
+  return result;
+}
+
+//
+// XdsClusterImplLb
+//
+
+XdsClusterImplLb::XdsClusterImplLb(RefCountedPtr<XdsClient> xds_client,
+                                   Args args)
+    : LoadBalancingPolicy(std::move(args)), xds_client_(std::move(xds_client)) {
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
+    gpr_log(GPR_INFO, "[xds_cluster_impl_lb %p] created -- using xds client %p",
+            this, xds_client_.get());
+  }
+}
+
+XdsClusterImplLb::~XdsClusterImplLb() {
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
+    gpr_log(GPR_INFO,
+            "[xds_cluster_impl_lb %p] destroying xds_cluster_impl LB policy",
+            this);
+  }
+}
+
+void XdsClusterImplLb::ShutdownLocked() {
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
+    gpr_log(GPR_INFO, "[xds_cluster_impl_lb %p] shutting down", this);
+  }
+  shutting_down_ = true;
+  // Remove the child policy's interested_parties pollset_set from the
+  // xDS policy.
+  if (child_policy_ != nullptr) {
+    grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
+                                     interested_parties());
+    child_policy_.reset();
+  }
+  // Drop our ref to the child's picker, in case it's holding a ref to
+  // the child.
+  picker_.reset();
+  drop_stats_.reset();
+  xds_client_.reset();
+}
+
+void XdsClusterImplLb::ExitIdleLocked() {
+  if (child_policy_ != nullptr) child_policy_->ExitIdleLocked();
+}
+
+void XdsClusterImplLb::ResetBackoffLocked() {
+  // The XdsClient will have its backoff reset by the xds resolver, so we
+  // don't need to do it here.
+  if (child_policy_ != nullptr) child_policy_->ResetBackoffLocked();
+}
+
+void XdsClusterImplLb::UpdateLocked(UpdateArgs args) {
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
+    gpr_log(GPR_INFO, "[xds_cluster_impl_lb %p] Received update", this);
+  }
+  // Update config.
+  const bool is_initial_update = config_ == nullptr;
+  auto old_config = std::move(config_);
+  config_ = std::move(args.config);
+  // On initial update, create drop stats.
+  if (is_initial_update) {
+    if (config_->lrs_load_reporting_server_name().has_value()) {
+      drop_stats_ = xds_client_->AddClusterDropStats(
+          config_->lrs_load_reporting_server_name().value(),
+          config_->cluster_name(), config_->eds_service_name());
+    }
+    call_counter_ = g_call_counter_map->GetOrCreate(
+        config_->cluster_name(), config_->eds_service_name());
+  } else {
+    // Cluster name, EDS service name, and LRS server name should never
+    // change, because the EDS policy above us should be swapped out if
+    // that happens.
+    GPR_ASSERT(config_->cluster_name() == old_config->cluster_name());
+    GPR_ASSERT(config_->eds_service_name() == old_config->eds_service_name());
+    GPR_ASSERT(config_->lrs_load_reporting_server_name() ==
+               old_config->lrs_load_reporting_server_name());
+  }
+  // Update picker if max_concurrent_requests has changed.
+  if (is_initial_update || config_->max_concurrent_requests() !=
+                               old_config->max_concurrent_requests()) {
+    MaybeUpdatePickerLocked();
+  }
+  // Update child policy.
+  UpdateChildPolicyLocked(std::move(args.addresses), args.args);
+  args.args = nullptr;
+}
+
+void XdsClusterImplLb::MaybeUpdatePickerLocked() {
+  // If we're dropping all calls, report READY, regardless of what (or
+  // whether) the child has reported.
+  if (config_->drop_config() != nullptr && config_->drop_config()->drop_all()) {
+    auto drop_picker = absl::make_unique<Picker>(this, picker_);
+    if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
+      gpr_log(GPR_INFO,
+              "[xds_cluster_impl_lb %p] updating connectivity (drop all): "
+              "state=READY "
+              "picker=%p",
+              this, drop_picker.get());
+    }
+    channel_control_helper()->UpdateState(GRPC_CHANNEL_READY, absl::Status(),
+                                          std::move(drop_picker));
+    return;
+  }
+  // Otherwise, update only if we have a child picker.
+  if (picker_ != nullptr) {
+    auto drop_picker = absl::make_unique<Picker>(this, picker_);
+    if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
+      gpr_log(GPR_INFO,
+              "[xds_cluster_impl_lb %p] updating connectivity: state=%s "
+              "status=(%s) "
+              "picker=%p",
+              this, ConnectivityStateName(state_), status_.ToString().c_str(),
+              drop_picker.get());
+    }
+    channel_control_helper()->UpdateState(state_, status_,
+                                          std::move(drop_picker));
+  }
+}
+
+OrphanablePtr<LoadBalancingPolicy> XdsClusterImplLb::CreateChildPolicyLocked(
+    const grpc_channel_args* args) {
+  LoadBalancingPolicy::Args lb_policy_args;
+  lb_policy_args.work_serializer = work_serializer();
+  lb_policy_args.args = args;
+  lb_policy_args.channel_control_helper =
+      absl::make_unique<Helper>(Ref(DEBUG_LOCATION, "Helper"));
+  OrphanablePtr<LoadBalancingPolicy> lb_policy =
+      MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
+                                         &grpc_xds_cluster_impl_lb_trace);
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
+    gpr_log(GPR_INFO,
+            "[xds_cluster_impl_lb %p] Created new child policy handler %p",
+            this, lb_policy.get());
+  }
+  // Add our interested_parties pollset_set to that of the newly created
+  // child policy. This will make the child policy progress upon activity on
+  // this policy, which in turn is tied to the application's call.
+  grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
+                                   interested_parties());
+  return lb_policy;
+}
+
+void XdsClusterImplLb::UpdateChildPolicyLocked(ServerAddressList addresses,
+                                               const grpc_channel_args* args) {
+  // Create policy if needed.
+  if (child_policy_ == nullptr) {
+    child_policy_ = CreateChildPolicyLocked(args);
+  }
+  // Construct update args.
+  UpdateArgs update_args;
+  update_args.addresses = std::move(addresses);
+  update_args.config = config_->child_policy();
+  update_args.args = args;
+  // Update the policy.
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
+    gpr_log(GPR_INFO,
+            "[xds_cluster_impl_lb %p] Updating child policy handler %p", this,
+            child_policy_.get());
+  }
+  child_policy_->UpdateLocked(std::move(update_args));
+}
+
+//
+// XdsClusterImplLb::Helper
+//
+
+RefCountedPtr<SubchannelInterface> XdsClusterImplLb::Helper::CreateSubchannel(
+    ServerAddress address, const grpc_channel_args& args) {
+  if (xds_cluster_impl_policy_->shutting_down_) return nullptr;
+  // If load reporting is enabled, wrap the subchannel such that it
+  // includes the locality stats object, which will be used by the EdsPicker.
+  if (xds_cluster_impl_policy_->config_->lrs_load_reporting_server_name()
+          .has_value()) {
+    RefCountedPtr<XdsLocalityName> locality_name;
+    auto* attribute = address.GetAttribute(kXdsLocalityNameAttributeKey);
+    if (attribute != nullptr) {
+      const auto* locality_attr =
+          static_cast<const XdsLocalityAttribute*>(attribute);
+      locality_name = locality_attr->locality_name();
+    }
+    RefCountedPtr<XdsClusterLocalityStats> locality_stats =
+        xds_cluster_impl_policy_->xds_client_->AddClusterLocalityStats(
+            *xds_cluster_impl_policy_->config_
+                 ->lrs_load_reporting_server_name(),
+            xds_cluster_impl_policy_->config_->cluster_name(),
+            xds_cluster_impl_policy_->config_->eds_service_name(),
+            std::move(locality_name));
+    return MakeRefCounted<StatsSubchannelWrapper>(
+        xds_cluster_impl_policy_->channel_control_helper()->CreateSubchannel(
+            std::move(address), args),
+        std::move(locality_stats));
+  }
+  // Load reporting not enabled, so don't wrap the subchannel.
+  return xds_cluster_impl_policy_->channel_control_helper()->CreateSubchannel(
+      std::move(address), args);
+}
+
+void XdsClusterImplLb::Helper::UpdateState(
+    grpc_connectivity_state state, const absl::Status& status,
+    std::unique_ptr<SubchannelPicker> picker) {
+  if (xds_cluster_impl_policy_->shutting_down_) return;
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
+    gpr_log(GPR_INFO,
+            "[xds_cluster_impl_lb %p] child connectivity state update: "
+            "state=%s (%s) "
+            "picker=%p",
+            xds_cluster_impl_policy_.get(), ConnectivityStateName(state),
+            status.ToString().c_str(), picker.get());
+  }
+  // Save the state and picker.
+  xds_cluster_impl_policy_->state_ = state;
+  xds_cluster_impl_policy_->status_ = status;
+  xds_cluster_impl_policy_->picker_ =
+      MakeRefCounted<RefCountedPicker>(std::move(picker));
+  // Wrap the picker and return it to the channel.
+  xds_cluster_impl_policy_->MaybeUpdatePickerLocked();
+}
+
+void XdsClusterImplLb::Helper::RequestReresolution() {
+  if (xds_cluster_impl_policy_->shutting_down_) return;
+  xds_cluster_impl_policy_->channel_control_helper()->RequestReresolution();
+}
+
+void XdsClusterImplLb::Helper::AddTraceEvent(TraceSeverity severity,
+                                             absl::string_view message) {
+  if (xds_cluster_impl_policy_->shutting_down_) return;
+  xds_cluster_impl_policy_->channel_control_helper()->AddTraceEvent(severity,
+                                                                    message);
+}
+
+//
+// factory
+//
+
+class XdsClusterImplLbFactory : public LoadBalancingPolicyFactory {
+ public:
+  OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
+      LoadBalancingPolicy::Args args) const override {
+    grpc_error* error = GRPC_ERROR_NONE;
+    RefCountedPtr<XdsClient> xds_client = XdsClient::GetOrCreate(&error);
+    if (error != GRPC_ERROR_NONE) {
+      gpr_log(
+          GPR_ERROR,
+          "cannot get XdsClient to instantiate xds_cluster_impl LB policy: %s",
+          grpc_error_string(error));
+      GRPC_ERROR_UNREF(error);
+      return nullptr;
+    }
+    return MakeOrphanable<XdsClusterImplLb>(std::move(xds_client),
+                                            std::move(args));
+  }
+
+  const char* name() const override { return kXdsClusterImpl; }
+
+  RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
+      const Json& json, grpc_error** error) const override {
+    GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
+    if (json.type() == Json::Type::JSON_NULL) {
+      // This policy was configured in the deprecated loadBalancingPolicy
+      // field or in the client API.
+      *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "field:loadBalancingPolicy error:xds_cluster_impl policy requires "
+          "configuration. Please use loadBalancingConfig field of service "
+          "config instead.");
+      return nullptr;
+    }
+    std::vector<grpc_error*> error_list;
+    // Child policy.
+    RefCountedPtr<LoadBalancingPolicy::Config> child_policy;
+    auto it = json.object_value().find("childPolicy");
+    if (it == json.object_value().end()) {
+      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "field:childPolicy error:required field missing"));
+    } else {
+      grpc_error* parse_error = GRPC_ERROR_NONE;
+      child_policy = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
+          it->second, &parse_error);
+      if (child_policy == nullptr) {
+        GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
+        std::vector<grpc_error*> child_errors;
+        child_errors.push_back(parse_error);
+        error_list.push_back(
+            GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors));
+      }
+    }
+    // Cluster name.
+    std::string cluster_name;
+    it = json.object_value().find("clusterName");
+    if (it == json.object_value().end()) {
+      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "field:clusterName error:required field missing"));
+    } else if (it->second.type() != Json::Type::STRING) {
+      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "field:clusterName error:type should be string"));
+    } else {
+      cluster_name = it->second.string_value();
+    }
+    // EDS service name.
+    std::string eds_service_name;
+    it = json.object_value().find("edsServiceName");
+    if (it != json.object_value().end()) {
+      if (it->second.type() != Json::Type::STRING) {
+        error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+            "field:edsServiceName error:type should be string"));
+      } else {
+        eds_service_name = it->second.string_value();
+      }
+    }
+    // LRS load reporting server name.
+    absl::optional<std::string> lrs_load_reporting_server_name;
+    it = json.object_value().find("lrsLoadReportingServerName");
+    if (it != json.object_value().end()) {
+      if (it->second.type() != Json::Type::STRING) {
+        error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+            "field:lrsLoadReportingServerName error:type should be string"));
+      } else {
+        lrs_load_reporting_server_name = it->second.string_value();
+      }
+    }
+    // Max concurrent requests.
+    uint32_t max_concurrent_requests = 1024;
+    it = json.object_value().find("maxConcurrentRequests");
+    if (it != json.object_value().end()) {
+      if (it->second.type() != Json::Type::NUMBER) {
+        error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+            "field:max_concurrent_requests error:must be of type number"));
+      } else {
+        max_concurrent_requests =
+            gpr_parse_nonnegative_int(it->second.string_value().c_str());
+      }
+    }
+    // Drop config.
+    auto drop_config = MakeRefCounted<XdsApi::EdsUpdate::DropConfig>();
+    it = json.object_value().find("dropCategories");
+    if (it == json.object_value().end()) {
+      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "field:dropCategories error:required field missing"));
+    } else {
+      std::vector<grpc_error*> child_errors =
+          ParseDropCategories(it->second, drop_config.get());
+      if (!child_errors.empty()) {
+        error_list.push_back(GRPC_ERROR_CREATE_FROM_VECTOR(
+            "field:dropCategories", &child_errors));
+      }
+    }
+    if (!error_list.empty()) {
+      *error = GRPC_ERROR_CREATE_FROM_VECTOR(
+          "xds_cluster_impl_experimental LB policy config", &error_list);
+      return nullptr;
+    }
+    return MakeRefCounted<XdsClusterImplLbConfig>(
+        std::move(child_policy), std::move(cluster_name),
+        std::move(eds_service_name), std::move(lrs_load_reporting_server_name),
+        max_concurrent_requests, std::move(drop_config));
+  }
+
+ private:
+  static std::vector<grpc_error*> ParseDropCategories(
+      const Json& json, XdsApi::EdsUpdate::DropConfig* drop_config) {
+    std::vector<grpc_error*> error_list;
+    if (json.type() != Json::Type::ARRAY) {
+      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "dropCategories field is not an array"));
+      return error_list;
+    }
+    for (size_t i = 0; i < json.array_value().size(); ++i) {
+      const Json& entry = json.array_value()[i];
+      std::vector<grpc_error*> child_errors =
+          ParseDropCategory(entry, drop_config);
+      if (!child_errors.empty()) {
+        grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+            absl::StrCat("errors parsing index ", i).c_str());
+        for (size_t i = 0; i < child_errors.size(); ++i) {
+          error = grpc_error_add_child(error, child_errors[i]);
+        }
+        error_list.push_back(error);
+      }
+    }
+    return error_list;
+  }
+
+  static std::vector<grpc_error*> ParseDropCategory(
+      const Json& json, XdsApi::EdsUpdate::DropConfig* drop_config) {
+    std::vector<grpc_error*> error_list;
+    if (json.type() != Json::Type::OBJECT) {
+      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "dropCategories entry is not an object"));
+      return error_list;
+    }
+    std::string category;
+    auto it = json.object_value().find("category");
+    if (it == json.object_value().end()) {
+      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "\"category\" field not present"));
+    } else if (it->second.type() != Json::Type::STRING) {
+      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "\"category\" field is not a string"));
+    } else {
+      category = it->second.string_value();
+    }
+    uint32_t requests_per_million = 0;
+    it = json.object_value().find("requests_per_million");
+    if (it == json.object_value().end()) {
+      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "\"requests_per_million\" field is not present"));
+    } else if (it->second.type() != Json::Type::NUMBER) {
+      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "\"requests_per_million\" field is not a number"));
+    } else {
+      requests_per_million =
+          gpr_parse_nonnegative_int(it->second.string_value().c_str());
+    }
+    if (error_list.empty()) {
+      drop_config->AddCategory(std::move(category), requests_per_million);
+    }
+    return error_list;
+  }
+};
+
+}  // namespace
+
+}  // namespace grpc_core
+
+//
+// Plugin registration
+//
+
+void grpc_lb_policy_xds_cluster_impl_init() {
+  grpc_core::g_call_counter_map = new grpc_core::CircuitBreakerCallCounterMap();
+  grpc_core::LoadBalancingPolicyRegistry::Builder::
+      RegisterLoadBalancingPolicyFactory(
+          absl::make_unique<grpc_core::XdsClusterImplLbFactory>());
+}
+
+void grpc_lb_policy_xds_cluster_impl_shutdown() {
+  delete grpc_core::g_call_counter_map;
+}
index 6f7279b..1ff42e5 100644 (file)
 
 #include <grpc/support/port_platform.h>
 
-#include <inttypes.h>
-#include <limits.h>
-#include <string.h>
+#include <set>
+#include <string>
+#include <vector>
 
-#include "absl/container/inlined_vector.h"
-#include "absl/strings/match.h"
-#include "absl/strings/numbers.h"
+#include "absl/status/status.h"
 #include "absl/strings/str_cat.h"
-#include "absl/strings/str_join.h"
-#include "absl/strings/str_split.h"
 #include "absl/strings/string_view.h"
-#include "re2/re2.h"
 
 #include <grpc/grpc.h>
 
@@ -36,7 +31,6 @@
 #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
 #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
 #include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h"
-#include "src/core/ext/xds/xds_api.h"
 #include "src/core/lib/channel/channel_args.h"
 #include "src/core/lib/gpr/string.h"
 #include "src/core/lib/gprpp/orphanable.h"
@@ -109,17 +103,13 @@ class XdsClusterManagerLb : public LoadBalancingPolicy {
 
     // It is required that the keys of cluster_map have to live at least as long
     // as the ClusterPicker instance.
-    ClusterPicker(ClusterMap cluster_map,
-                  RefCountedPtr<XdsClusterManagerLbConfig> config)
-        : cluster_map_(std::move(cluster_map)), config_(std::move(config)) {}
+    explicit ClusterPicker(ClusterMap cluster_map)
+        : cluster_map_(std::move(cluster_map)) {}
 
     PickResult Pick(PickArgs args) override;
 
    private:
     ClusterMap cluster_map_;
-    // Take a reference to config so that we can use
-    // XdsApi::RdsUpdate::RdsRoute::Matchers from it.
-    RefCountedPtr<XdsClusterManagerLbConfig> config_;
   };
 
   // Each ClusterChild holds a ref to its parent XdsClusterManagerLb.
@@ -127,7 +117,7 @@ class XdsClusterManagerLb : public LoadBalancingPolicy {
    public:
     ClusterChild(RefCountedPtr<XdsClusterManagerLb> xds_cluster_manager_policy,
                  const std::string& name);
-    ~ClusterChild();
+    ~ClusterChild() override;
 
     void Orphan() override;
 
@@ -151,7 +141,9 @@ class XdsClusterManagerLb : public LoadBalancingPolicy {
       explicit Helper(RefCountedPtr<ClusterChild> xds_cluster_manager_child)
           : xds_cluster_manager_child_(std::move(xds_cluster_manager_child)) {}
 
-      ~Helper() { xds_cluster_manager_child_.reset(DEBUG_LOCATION, "Helper"); }
+      ~Helper() override {
+        xds_cluster_manager_child_.reset(DEBUG_LOCATION, "Helper");
+      }
 
       RefCountedPtr<SubchannelInterface> CreateSubchannel(
           ServerAddress address, const grpc_channel_args& args) override;
@@ -192,7 +184,7 @@ class XdsClusterManagerLb : public LoadBalancingPolicy {
     bool shutdown_ = false;
   };
 
-  ~XdsClusterManagerLb();
+  ~XdsClusterManagerLb() override;
 
   void ShutdownLocked() override;
 
@@ -368,8 +360,7 @@ void XdsClusterManagerLb::UpdateStateLocked() {
                                 Ref(DEBUG_LOCATION, "QueuePicker")));
         }
       }
-      picker =
-          absl::make_unique<ClusterPicker>(std::move(cluster_map), config_);
+      picker = absl::make_unique<ClusterPicker>(std::move(cluster_map));
       break;
     }
     case GRPC_CHANNEL_CONNECTING:
@@ -547,8 +538,9 @@ void XdsClusterManagerLb::ClusterChild::OnDelayedRemovalTimerLocked(
 RefCountedPtr<SubchannelInterface>
 XdsClusterManagerLb::ClusterChild::Helper::CreateSubchannel(
     ServerAddress address, const grpc_channel_args& args) {
-  if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_)
+  if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_) {
     return nullptr;
+  }
   return xds_cluster_manager_child_->xds_cluster_manager_policy_
       ->channel_control_helper()
       ->CreateSubchannel(std::move(address), args);
@@ -566,8 +558,9 @@ void XdsClusterManagerLb::ClusterChild::Helper::UpdateState(
         xds_cluster_manager_child_->name_.c_str(), ConnectivityStateName(state),
         status.ToString().c_str(), picker.get());
   }
-  if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_)
+  if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_) {
     return;
+  }
   // Cache the picker in the ClusterChild.
   xds_cluster_manager_child_->picker_wrapper_ =
       MakeRefCounted<ChildPickerWrapper>(xds_cluster_manager_child_->name_,
@@ -591,8 +584,9 @@ void XdsClusterManagerLb::ClusterChild::Helper::UpdateState(
 }
 
 void XdsClusterManagerLb::ClusterChild::Helper::RequestReresolution() {
-  if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_)
+  if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_) {
     return;
+  }
   xds_cluster_manager_child_->xds_cluster_manager_policy_
       ->channel_control_helper()
       ->RequestReresolution();
@@ -600,8 +594,9 @@ void XdsClusterManagerLb::ClusterChild::Helper::RequestReresolution() {
 
 void XdsClusterManagerLb::ClusterChild::Helper::AddTraceEvent(
     TraceSeverity severity, absl::string_view message) {
-  if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_)
+  if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_) {
     return;
+  }
   xds_cluster_manager_child_->xds_cluster_manager_policy_
       ->channel_control_helper()
       ->AddTraceEvent(severity, message);
index 4a76a7d..8831db2 100644 (file)
@@ -31,7 +31,9 @@ namespace grpc_core {
 
 Resolver::Resolver(std::shared_ptr<WorkSerializer> work_serializer,
                    std::unique_ptr<ResultHandler> result_handler)
-    : InternallyRefCounted(&grpc_trace_resolver_refcount),
+    : InternallyRefCounted(GRPC_TRACE_FLAG_ENABLED(grpc_trace_resolver_refcount)
+                               ? "Resolver"
+                               : nullptr),
       work_serializer_(std::move(work_serializer)),
       result_handler_(std::move(result_handler)) {}
 
index de941a0..31d9c83 100644 (file)
@@ -32,6 +32,9 @@
 
 extern grpc_core::DebugOnlyTraceFlag grpc_trace_resolver_refcount;
 
+// Name associated with individual address, if available.
+#define GRPC_ARG_ADDRESS_NAME "grpc.address_name"
+
 namespace grpc_core {
 
 /// Interface for name resolution.
@@ -87,7 +90,7 @@ class Resolver : public InternallyRefCounted<Resolver> {
   // Not copyable nor movable.
   Resolver(const Resolver&) = delete;
   Resolver& operator=(const Resolver&) = delete;
-  virtual ~Resolver() = default;
+  ~Resolver() override = default;
 
   /// Starts resolving.
   virtual void StartLocked() = 0;
index c543971..f0bf0cd 100644 (file)
@@ -75,7 +75,7 @@ class AresDnsResolver : public Resolver {
   void ShutdownLocked() override;
 
  private:
-  virtual ~AresDnsResolver();
+  ~AresDnsResolver() override;
 
   void MaybeStartResolvingLocked();
   void StartResolvingLocked();
index 6659dc1..062f483 100644 (file)
@@ -49,7 +49,7 @@ class GrpcPolledFdPosix : public GrpcPolledFd {
     grpc_pollset_set_add_fd(driver_pollset_set_, fd_);
   }
 
-  ~GrpcPolledFdPosix() {
+  ~GrpcPolledFdPosix() override {
     grpc_pollset_set_del_fd(driver_pollset_set_, fd_);
     /* c-ares library will close the fd inside grpc_fd. This fd may be picked up
        immediately by another thread, and should not be closed by the following
index 3b0c042..e17d84f 100644 (file)
@@ -63,7 +63,7 @@ class NativeDnsResolver : public Resolver {
   void ShutdownLocked() override;
 
  private:
-  virtual ~NativeDnsResolver();
+  ~NativeDnsResolver() override;
 
   void MaybeStartResolvingLocked();
   void StartResolvingLocked();
index 0bfb651..005de55 100644 (file)
@@ -59,7 +59,7 @@ class FakeResolver : public Resolver {
   friend class FakeResolverResponseGenerator;
   friend class FakeResolverResponseSetter;
 
-  virtual ~FakeResolver();
+  ~FakeResolver() override;
 
   void ShutdownLocked() override;
 
index b9fd90c..b9ca69d 100644 (file)
@@ -43,7 +43,7 @@ class FakeResolverResponseGenerator
     : public RefCounted<FakeResolverResponseGenerator> {
  public:
   FakeResolverResponseGenerator();
-  ~FakeResolverResponseGenerator();
+  ~FakeResolverResponseGenerator() override;
 
   // Instructs the fake resolver associated with the response generator
   // instance to trigger a new resolution with the specified result. If the
index 35fd576..4b1f0a1 100644 (file)
@@ -168,6 +168,24 @@ class UnixResolverFactory : public ResolverFactory {
 
   const char* scheme() const override { return "unix"; }
 };
+
+class UnixAbstractResolverFactory : public ResolverFactory {
+ public:
+  bool IsValidUri(const grpc_uri* uri) const override {
+    return ParseUri(uri, grpc_parse_unix_abstract, nullptr);
+  }
+
+  OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
+    return CreateSockaddrResolver(std::move(args), grpc_parse_unix_abstract);
+  }
+
+  grpc_core::UniquePtr<char> GetDefaultAuthority(
+      grpc_uri* /*uri*/) const override {
+    return grpc_core::UniquePtr<char>(gpr_strdup("localhost"));
+  }
+
+  const char* scheme() const override { return "unix-abstract"; }
+};
 #endif  // GRPC_HAVE_UNIX_SOCKET
 
 }  // namespace
@@ -182,6 +200,8 @@ void grpc_resolver_sockaddr_init() {
 #ifdef GRPC_HAVE_UNIX_SOCKET
   grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
       absl::make_unique<grpc_core::UnixResolverFactory>());
+  grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
+      absl::make_unique<grpc_core::UnixAbstractResolverFactory>());
 #endif
 }
 
index 9a4cf35..af957f7 100644 (file)
@@ -138,8 +138,9 @@ class XdsResolver : public Resolver {
   class XdsConfigSelector : public ConfigSelector {
    public:
     XdsConfigSelector(RefCountedPtr<XdsResolver> resolver,
-                      const std::vector<XdsApi::Route>& routes);
-    ~XdsConfigSelector();
+                      const std::vector<XdsApi::Route>& routes,
+                      grpc_error* error);
+    ~XdsConfigSelector() override;
 
     const char* name() const override { return "XdsConfigSelector"; }
 
@@ -157,6 +158,7 @@ class XdsResolver : public Resolver {
       XdsApi::Route route;
       absl::InlinedVector<std::pair<uint32_t, absl::string_view>, 2>
           weighted_cluster_state;
+      RefCountedPtr<ServiceConfig> method_config;
       bool operator==(const Route& other) const {
         return route == other.route &&
                weighted_cluster_state == other.weighted_cluster_state;
@@ -165,6 +167,8 @@ class XdsResolver : public Resolver {
     using RouteTable = std::vector<Route>;
 
     void MaybeAddCluster(const std::string& name);
+    grpc_error* CreateMethodConfig(RefCountedPtr<ServiceConfig>* method_config,
+                                   const XdsApi::Route& route);
 
     RefCountedPtr<XdsResolver> resolver_;
     RouteTable route_table_;
@@ -189,6 +193,7 @@ class XdsResolver : public Resolver {
   XdsClient::RouteConfigWatcherInterface* route_config_watcher_ = nullptr;
   ClusterState::ClusterStateMap cluster_state_map_;
   std::vector<XdsApi::Route> current_update_;
+  XdsApi::Duration http_max_stream_duration_;
 };
 
 //
@@ -261,7 +266,7 @@ void XdsResolver::Notifier::RunInWorkSerializer(grpc_error* error) {
 
 XdsResolver::XdsConfigSelector::XdsConfigSelector(
     RefCountedPtr<XdsResolver> resolver,
-    const std::vector<XdsApi::Route>& routes)
+    const std::vector<XdsApi::Route>& routes, grpc_error* error)
     : resolver_(std::move(resolver)) {
   if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
     gpr_log(GPR_INFO, "[xds_resolver %p] creating XdsConfigSelector %p",
@@ -285,6 +290,13 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
     route_table_.emplace_back();
     auto& route_entry = route_table_.back();
     route_entry.route = route;
+    // If the route doesn't specify a timeout, set its timeout to the global
+    // one.
+    if (!route.max_stream_duration.has_value()) {
+      route_entry.route.max_stream_duration =
+          resolver_->http_max_stream_duration_;
+    }
+    error = CreateMethodConfig(&route_entry.method_config, route_entry.route);
     if (route.weighted_clusters.empty()) {
       MaybeAddCluster(route.cluster_name);
     } else {
@@ -299,6 +311,34 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
   }
 }
 
+grpc_error* XdsResolver::XdsConfigSelector::CreateMethodConfig(
+    RefCountedPtr<ServiceConfig>* method_config, const XdsApi::Route& route) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  std::vector<std::string> fields;
+  if (route.max_stream_duration.has_value() &&
+      (route.max_stream_duration->seconds != 0 ||
+       route.max_stream_duration->nanos != 0)) {
+    fields.emplace_back(absl::StrFormat("    \"timeout\": \"%d.%09ds\"",
+                                        route.max_stream_duration->seconds,
+                                        route.max_stream_duration->nanos));
+  }
+  if (!fields.empty()) {
+    std::string json = absl::StrCat(
+        "{\n"
+        "  \"methodConfig\": [ {\n"
+        "    \"name\": [\n"
+        "      {}\n"
+        "    ],\n"
+        "    ",
+        absl::StrJoin(fields, ",\n"),
+        "\n  } ]\n"
+        "}");
+    *method_config =
+        ServiceConfig::Create(resolver_->args_, json.c_str(), &error);
+  }
+  return error;
+}
+
 XdsResolver::XdsConfigSelector::~XdsConfigSelector() {
   if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
     gpr_log(GPR_INFO, "[xds_resolver %p] destroying XdsConfigSelector %p",
@@ -325,10 +365,18 @@ bool PathMatch(const absl::string_view& path,
                const XdsApi::Route::Matchers::PathMatcher& path_matcher) {
   switch (path_matcher.type) {
     case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PREFIX:
-      return absl::StartsWith(path, path_matcher.string_matcher);
+      return path_matcher.case_sensitive
+                 ? absl::StartsWith(path, path_matcher.string_matcher)
+                 : absl::StartsWithIgnoreCase(path,
+                                              path_matcher.string_matcher);
     case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PATH:
-      return path == path_matcher.string_matcher;
+      return path_matcher.case_sensitive
+                 ? path == path_matcher.string_matcher
+                 : absl::EqualsIgnoreCase(path, path_matcher.string_matcher);
     case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::REGEX:
+      // Note: Case-sensitive option will already have been set appropriately
+      // in path_matcher.regex_matcher when it was constructed, so no
+      // need to check it here.
       return RE2::FullMatch(path.data(), *path_matcher.regex_matcher);
     default:
       return false;
@@ -476,6 +524,11 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
         static_cast<XdsResolver*>(resolver_->Ref().release());
     ClusterState* cluster_state = it->second->Ref().release();
     CallConfig call_config;
+    if (entry.method_config != nullptr) {
+      call_config.service_config = entry.method_config;
+      call_config.method_configs =
+          entry.method_config->GetMethodParsedConfigVector(grpc_empty_slice());
+    }
     call_config.call_attributes[kXdsClusterAttribute] = it->first;
     call_config.on_call_committed = [resolver, cluster_state]() {
       cluster_state->Unref();
@@ -578,6 +631,7 @@ void XdsResolver::OnListenerUpdate(XdsApi::LdsUpdate listener) {
       xds_client_->WatchRouteConfigData(route_config_name_, std::move(watcher));
     }
   }
+  http_max_stream_duration_ = listener.http_max_stream_duration;
   if (route_config_name_.empty()) {
     GPR_ASSERT(listener.rds_update.has_value());
     OnRouteConfigUpdate(std::move(*listener.rds_update));
@@ -663,10 +717,15 @@ void XdsResolver::GenerateResult() {
   if (current_update_.empty()) return;
   // First create XdsConfigSelector, which may add new entries to the cluster
   // state map, and then CreateServiceConfig for LB policies.
+  grpc_error* error = GRPC_ERROR_NONE;
   auto config_selector =
-      MakeRefCounted<XdsConfigSelector>(Ref(), current_update_);
+      MakeRefCounted<XdsConfigSelector>(Ref(), current_update_, error);
+  if (error != GRPC_ERROR_NONE) {
+    OnError(error);
+    return;
+  }
   Result result;
-  grpc_error* error = CreateServiceConfig(&result.service_config);
+  error = CreateServiceConfig(&result.service_config);
   if (error != GRPC_ERROR_NONE) {
     OnError(error);
     return;
index d97fd8d..6b18205 100644 (file)
@@ -68,18 +68,18 @@ class RegistryState {
   ResolverFactory* FindResolverFactory(const char* target, grpc_uri** uri,
                                        std::string* canonical_target) const {
     GPR_ASSERT(uri != nullptr);
-    *uri = grpc_uri_parse(target, 1);
+    *uri = grpc_uri_parse(target, true);
     ResolverFactory* factory =
         *uri == nullptr ? nullptr : LookupResolverFactory((*uri)->scheme);
     if (factory == nullptr) {
       grpc_uri_destroy(*uri);
       *canonical_target = absl::StrCat(default_prefix_.get(), target);
-      *uri = grpc_uri_parse(canonical_target->c_str(), 1);
+      *uri = grpc_uri_parse(canonical_target->c_str(), true);
       factory =
           *uri == nullptr ? nullptr : LookupResolverFactory((*uri)->scheme);
       if (factory == nullptr) {
-        grpc_uri_destroy(grpc_uri_parse(target, 0));
-        grpc_uri_destroy(grpc_uri_parse(canonical_target->c_str(), 0));
+        grpc_uri_destroy(grpc_uri_parse(target, false));
+        grpc_uri_destroy(grpc_uri_parse(canonical_target->c_str(), false));
         gpr_log(GPR_ERROR, "don't know how to resolve '%s' or '%s'", target,
                 canonical_target->c_str());
       }
index 6642b42..c716bc5 100644 (file)
@@ -95,26 +95,19 @@ std::unique_ptr<ClientChannelMethodParsedConfig::RetryPolicy> ParseRetryPolicy(
     }
   }
   // Parse initialBackoff.
-  it = json.object_value().find("initialBackoff");
-  if (it != json.object_value().end()) {
-    if (!ParseDurationFromJson(it->second, &retry_policy->initial_backoff)) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "field:initialBackoff error:Failed to parse"));
-    } else if (retry_policy->initial_backoff == 0) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "field:initialBackoff error:must be greater than 0"));
-    }
+  if (ParseJsonObjectFieldAsDuration(json.object_value(), "initialBackoff",
+                                     &retry_policy->initial_backoff,
+                                     &error_list) &&
+      retry_policy->initial_backoff == 0) {
+    error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+        "field:initialBackoff error:must be greater than 0"));
   }
   // Parse maxBackoff.
-  it = json.object_value().find("maxBackoff");
-  if (it != json.object_value().end()) {
-    if (!ParseDurationFromJson(it->second, &retry_policy->max_backoff)) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "field:maxBackoff error:failed to parse"));
-    } else if (retry_policy->max_backoff == 0) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "field:maxBackoff error:should be greater than 0"));
-    }
+  if (ParseJsonObjectFieldAsDuration(json.object_value(), "maxBackoff",
+                                     &retry_policy->max_backoff, &error_list) &&
+      retry_policy->max_backoff == 0) {
+    error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+        "field:maxBackoff error:should be greater than 0"));
   }
   // Parse backoffMultiplier.
   it = json.object_value().find("backoffMultiplier");
@@ -383,13 +376,8 @@ ClientChannelServiceConfigParser::ParsePerMethodParams(
     }
   }
   // Parse timeout.
-  it = json.object_value().find("timeout");
-  if (it != json.object_value().end()) {
-    if (!ParseDurationFromJson(it->second, &timeout)) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "field:timeout error:Failed parsing"));
-    };
-  }
+  ParseJsonObjectFieldAsDuration(json.object_value(), "timeout", &timeout,
+                                 &error_list, false);
   // Parse retry policy.
   it = json.object_value().find("retryPolicy");
   if (it != json.object_value().end()) {
index 49512c5..889c20c 100644 (file)
@@ -78,7 +78,7 @@ class ResolvingLoadBalancingPolicy::ResolverResultHandler
       RefCountedPtr<ResolvingLoadBalancingPolicy> parent)
       : parent_(std::move(parent)) {}
 
-  ~ResolverResultHandler() {
+  ~ResolverResultHandler() override {
     if (GRPC_TRACE_FLAG_ENABLED(*(parent_->tracer_))) {
       gpr_log(GPR_INFO, "resolving_lb=%p: resolver shutdown complete",
               parent_.get());
index 2835c84..dd592be 100644 (file)
@@ -83,7 +83,7 @@ class ResolvingLoadBalancingPolicy : public LoadBalancingPolicy {
                                grpc_core::UniquePtr<char> target_uri,
                                ChannelConfigHelper* helper);
 
-  virtual const char* name() const override { return "resolving_lb"; }
+  const char* name() const override { return "resolving_lb"; }
 
   // No-op -- should never get updates from the channel.
   // TODO(roth): Need to support updating child LB policy's config for xds
@@ -100,7 +100,7 @@ class ResolvingLoadBalancingPolicy : public LoadBalancingPolicy {
   class ResolverResultHandler;
   class ResolvingControlHelper;
 
-  ~ResolvingLoadBalancingPolicy();
+  ~ResolvingLoadBalancingPolicy() override;
 
   void ShutdownLocked() override;
 
index 897a617..e40363f 100644 (file)
@@ -32,7 +32,7 @@ class ServerRetryThrottleData : public RefCounted<ServerRetryThrottleData> {
  public:
   ServerRetryThrottleData(intptr_t max_milli_tokens, intptr_t milli_token_ratio,
                           ServerRetryThrottleData* old_throttle_data);
-  ~ServerRetryThrottleData();
+  ~ServerRetryThrottleData() override;
 
   /// Records a failure.  Returns true if it's okay to send a retry.
   bool RecordFailure();
index ddcf530..7a188a0 100644 (file)
@@ -97,10 +97,6 @@ class ServerAddress {
   std::string ToString() const;
 
  private:
-  // Allows the channel to access the attributes without knowing the keys.
-  // (We intentionally do not allow LB policies to do this.)
-  friend class ChannelServerAddressPeer;
-
   grpc_resolved_address address_;
   grpc_channel_args* args_;
   std::map<const char*, std::unique_ptr<AttributeInterface>> attributes_;
index 1f49cf4..a2794f1 100644 (file)
@@ -204,7 +204,9 @@ std::string ServiceConfig::ParseJsonMethodName(const Json& json,
 
 const ServiceConfigParser::ParsedConfigVector*
 ServiceConfig::GetMethodParsedConfigVector(const grpc_slice& path) const {
-  if (parsed_method_configs_map_.empty()) return nullptr;
+  if (parsed_method_configs_map_.empty()) {
+    return default_method_config_vector_;
+  }
   // Try looking up the full path in the map.
   auto it = parsed_method_configs_map_.find(path);
   if (it != parsed_method_configs_map_.end()) return it->second;
index 6086a4d..2dfd45d 100644 (file)
@@ -71,7 +71,7 @@ class ServiceConfig : public RefCounted<ServiceConfig> {
 
   ServiceConfig(const grpc_channel_args* args, std::string json_string,
                 Json json, grpc_error** error);
-  ~ServiceConfig();
+  ~ServiceConfig() override;
 
   const std::string& json_string() const { return json_string_; }
 
index 677e929..d5c1760 100644 (file)
@@ -87,7 +87,10 @@ DebugOnlyTraceFlag grpc_trace_subchannel_refcount(false, "subchannel_refcount");
 ConnectedSubchannel::ConnectedSubchannel(
     grpc_channel_stack* channel_stack, const grpc_channel_args* args,
     RefCountedPtr<channelz::SubchannelNode> channelz_subchannel)
-    : RefCounted<ConnectedSubchannel>(&grpc_trace_subchannel_refcount),
+    : RefCounted<ConnectedSubchannel>(
+          GRPC_TRACE_FLAG_ENABLED(grpc_trace_subchannel_refcount)
+              ? "ConnectedSubchannel"
+              : nullptr),
       channel_stack_(channel_stack),
       args_(grpc_channel_args_copy(args)),
       channelz_subchannel_(std::move(channelz_subchannel)) {}
@@ -322,7 +325,7 @@ class Subchannel::ConnectedSubchannelStateWatcher
     GRPC_SUBCHANNEL_WEAK_UNREF(subchannel_, "connecting");
   }
 
-  ~ConnectedSubchannelStateWatcher() {
+  ~ConnectedSubchannelStateWatcher() override {
     GRPC_SUBCHANNEL_WEAK_UNREF(subchannel_, "state_watcher");
   }
 
@@ -388,17 +391,17 @@ class Subchannel::AsyncWatcherNotifierLocked {
     }
     watcher_->PushConnectivityStateChange(
         {state, status, std::move(connected_subchannel)});
-    ExecCtx::Run(
-        DEBUG_LOCATION,
-        GRPC_CLOSURE_INIT(&closure_,
-                          [](void* arg, grpc_error* /*error*/) {
-                            auto* self =
-                                static_cast<AsyncWatcherNotifierLocked*>(arg);
-                            self->watcher_->OnConnectivityStateChange();
-                            delete self;
-                          },
-                          this, nullptr),
-        GRPC_ERROR_NONE);
+    ExecCtx::Run(DEBUG_LOCATION,
+                 GRPC_CLOSURE_INIT(
+                     &closure_,
+                     [](void* arg, grpc_error* /*error*/) {
+                       auto* self =
+                           static_cast<AsyncWatcherNotifierLocked*>(arg);
+                       self->watcher_->OnConnectivityStateChange();
+                       delete self;
+                     },
+                     this, nullptr),
+                 GRPC_ERROR_NONE);
   }
 
  private:
@@ -449,7 +452,7 @@ class Subchannel::HealthWatcherMap::HealthWatcher
     if (subchannel_state == GRPC_CHANNEL_READY) StartHealthCheckingLocked();
   }
 
-  ~HealthWatcher() {
+  ~HealthWatcher() override {
     GRPC_SUBCHANNEL_WEAK_UNREF(subchannel_, "health_watcher");
   }
 
@@ -925,7 +928,7 @@ const char* Subchannel::GetUriFromSubchannelAddressArg(
 namespace {
 
 void UriToSockaddr(const char* uri_str, grpc_resolved_address* addr) {
-  grpc_uri* uri = grpc_uri_parse(uri_str, 0 /* suppress_errors */);
+  grpc_uri* uri = grpc_uri_parse(uri_str, false /* suppress_errors */);
   GPR_ASSERT(uri != nullptr);
   if (!grpc_parse_uri(uri, addr)) memset(addr, 0, sizeof(*addr));
   grpc_uri_destroy(uri);
index f3de5c8..46ffb2f 100644 (file)
@@ -76,7 +76,7 @@ class ConnectedSubchannel : public RefCounted<ConnectedSubchannel> {
   ConnectedSubchannel(
       grpc_channel_stack* channel_stack, const grpc_channel_args* args,
       RefCountedPtr<channelz::SubchannelNode> channelz_subchannel);
-  ~ConnectedSubchannel();
+  ~ConnectedSubchannel() override;
 
   void StartWatch(grpc_pollset_set* interested_parties,
                   OrphanablePtr<ConnectivityStateWatcherInterface> watcher);
@@ -186,7 +186,7 @@ class Subchannel {
       RefCountedPtr<ConnectedSubchannel> connected_subchannel;
     };
 
-    virtual ~ConnectivityStateWatcherInterface() = default;
+    ~ConnectivityStateWatcherInterface() override = default;
 
     // Will be invoked whenever the subchannel's connectivity state
     // changes.  There will be only one invocation of this method on a
index ccaca4e..c161847 100644 (file)
 
 #include <grpc/support/port_platform.h>
 
-#include "src/core/ext/filters/client_channel/server_address.h"
+#include <grpc/impl/codegen/connectivity_state.h>
+#include <grpc/impl/codegen/grpc_types.h>
+
 #include "src/core/lib/gprpp/ref_counted.h"
-#include "src/core/lib/gprpp/ref_counted_ptr.h"
+#include "src/core/lib/iomgr/pollset_set.h"
 
 namespace grpc_core {
 
@@ -45,11 +47,10 @@ class SubchannelInterface : public RefCounted<SubchannelInterface> {
     virtual grpc_pollset_set* interested_parties() = 0;
   };
 
-  template <typename TraceFlagT = TraceFlag>
-  explicit SubchannelInterface(TraceFlagT* trace_flag = nullptr)
-      : RefCounted<SubchannelInterface>(trace_flag) {}
+  explicit SubchannelInterface(const char* trace = nullptr)
+      : RefCounted<SubchannelInterface>(trace) {}
 
-  virtual ~SubchannelInterface() = default;
+  ~SubchannelInterface() override = default;
 
   // Returns the current connectivity state of the subchannel.
   virtual grpc_connectivity_state CheckConnectivityState() = 0;
@@ -88,11 +89,6 @@ class SubchannelInterface : public RefCounted<SubchannelInterface> {
 
   // TODO(roth): Need a better non-grpc-specific abstraction here.
   virtual const grpc_channel_args* channel_args() = 0;
-
-  // Allows accessing the attributes associated with the address for
-  // this subchannel.
-  virtual const ServerAddress::AttributeInterface* GetAttribute(
-      const char* key) const = 0;
 };
 
 // A class that delegates to another subchannel, to be used in cases
@@ -124,10 +120,6 @@ class DelegatingSubchannel : public SubchannelInterface {
   const grpc_channel_args* channel_args() override {
     return wrapped_subchannel_->channel_args();
   }
-  const ServerAddress::AttributeInterface* GetAttribute(
-      const char* key) const override {
-    return wrapped_subchannel_->GetAttribute(key);
-  }
 
  private:
   RefCountedPtr<SubchannelInterface> wrapped_subchannel_;
index 2fe5fa3..f320ab6 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "src/core/lib/avl/avl.h"
 #include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/debug/trace.h"
 #include "src/core/lib/gprpp/ref_counted.h"
 
 namespace grpc_core {
@@ -62,8 +63,11 @@ class SubchannelKey {
 // shut down safely. See https://github.com/grpc/grpc/issues/12560.
 class SubchannelPoolInterface : public RefCounted<SubchannelPoolInterface> {
  public:
-  SubchannelPoolInterface() : RefCounted(&grpc_subchannel_pool_trace) {}
-  virtual ~SubchannelPoolInterface() {}
+  SubchannelPoolInterface()
+      : RefCounted(GRPC_TRACE_FLAG_ENABLED(grpc_subchannel_pool_trace)
+                       ? "SubchannelPoolInterface"
+                       : nullptr) {}
+  ~SubchannelPoolInterface() override {}
 
   // Registers a subchannel against a key. Returns the subchannel registered
   // with \a key, which may be different from \a constructed because we reuse
index e4027b0..bd16844 100644 (file)
 #include "src/core/lib/slice/slice_internal.h"
 #include "src/core/lib/surface/channel_init.h"
 
-//
-// grpc_deadline_state
-//
+namespace grpc_core {
+
+// A fire-and-forget class representing a pending deadline timer.
+// Allocated on the call arena.
+class TimerState {
+ public:
+  TimerState(grpc_call_element* elem, grpc_millis deadline) : elem_(elem) {
+    grpc_deadline_state* deadline_state =
+        static_cast<grpc_deadline_state*>(elem_->call_data);
+    GRPC_CALL_STACK_REF(deadline_state->call_stack, "DeadlineTimerState");
+    GRPC_CLOSURE_INIT(&closure_, TimerCallback, this, nullptr);
+    grpc_timer_init(&timer_, deadline, &closure_);
+  }
 
-// The on_complete callback used when sending a cancel_error batch down the
-// filter stack.  Yields the call combiner when the batch returns.
-static void yield_call_combiner(void* arg, grpc_error* /*ignored*/) {
-  grpc_deadline_state* deadline_state = static_cast<grpc_deadline_state*>(arg);
-  GRPC_CALL_COMBINER_STOP(deadline_state->call_combiner,
-                          "got on_complete from cancel_stream batch");
-  GRPC_CALL_STACK_UNREF(deadline_state->call_stack, "deadline_timer");
-}
+  void Cancel() { grpc_timer_cancel(&timer_); }
+
+ private:
+  // The on_complete callback used when sending a cancel_error batch down the
+  // filter stack.  Yields the call combiner when the batch returns.
+  static void YieldCallCombiner(void* arg, grpc_error* /*ignored*/) {
+    TimerState* self = static_cast<TimerState*>(arg);
+    grpc_deadline_state* deadline_state =
+        static_cast<grpc_deadline_state*>(self->elem_->call_data);
+    GRPC_CALL_COMBINER_STOP(deadline_state->call_combiner,
+                            "got on_complete from cancel_stream batch");
+    GRPC_CALL_STACK_UNREF(deadline_state->call_stack, "DeadlineTimerState");
+  }
 
-// This is called via the call combiner, so access to deadline_state is
-// synchronized.
-static void send_cancel_op_in_call_combiner(void* arg, grpc_error* error) {
-  grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
-  grpc_deadline_state* deadline_state =
-      static_cast<grpc_deadline_state*>(elem->call_data);
-  grpc_transport_stream_op_batch* batch = grpc_make_transport_stream_op(
-      GRPC_CLOSURE_INIT(&deadline_state->timer_callback, yield_call_combiner,
-                        deadline_state, grpc_schedule_on_exec_ctx));
-  batch->cancel_stream = true;
-  batch->payload->cancel_stream.cancel_error = GRPC_ERROR_REF(error);
-  elem->filter->start_transport_stream_op_batch(elem, batch);
-}
+  // This is called via the call combiner, so access to deadline_state is
+  // synchronized.
+  static void SendCancelOpInCallCombiner(void* arg, grpc_error* error) {
+    TimerState* self = static_cast<TimerState*>(arg);
+    grpc_transport_stream_op_batch* batch = grpc_make_transport_stream_op(
+        GRPC_CLOSURE_INIT(&self->closure_, YieldCallCombiner, self, nullptr));
+    batch->cancel_stream = true;
+    batch->payload->cancel_stream.cancel_error = GRPC_ERROR_REF(error);
+    self->elem_->filter->start_transport_stream_op_batch(self->elem_, batch);
+  }
 
-// Timer callback.
-static void timer_callback(void* arg, grpc_error* error) {
-  grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
-  grpc_deadline_state* deadline_state =
-      static_cast<grpc_deadline_state*>(elem->call_data);
-  if (error != GRPC_ERROR_CANCELLED) {
-    error = grpc_error_set_int(
-        GRPC_ERROR_CREATE_FROM_STATIC_STRING("Deadline Exceeded"),
-        GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_DEADLINE_EXCEEDED);
-    deadline_state->call_combiner->Cancel(GRPC_ERROR_REF(error));
-    GRPC_CLOSURE_INIT(&deadline_state->timer_callback,
-                      send_cancel_op_in_call_combiner, elem,
-                      grpc_schedule_on_exec_ctx);
-    GRPC_CALL_COMBINER_START(deadline_state->call_combiner,
-                             &deadline_state->timer_callback, error,
-                             "deadline exceeded -- sending cancel_stream op");
-  } else {
-    GRPC_CALL_STACK_UNREF(deadline_state->call_stack, "deadline_timer");
+  // Timer callback.
+  static void TimerCallback(void* arg, grpc_error* error) {
+    TimerState* self = static_cast<TimerState*>(arg);
+    grpc_deadline_state* deadline_state =
+        static_cast<grpc_deadline_state*>(self->elem_->call_data);
+    if (error != GRPC_ERROR_CANCELLED) {
+      error = grpc_error_set_int(
+          GRPC_ERROR_CREATE_FROM_STATIC_STRING("Deadline Exceeded"),
+          GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_DEADLINE_EXCEEDED);
+      deadline_state->call_combiner->Cancel(GRPC_ERROR_REF(error));
+      GRPC_CLOSURE_INIT(&self->closure_, SendCancelOpInCallCombiner, self,
+                        nullptr);
+      GRPC_CALL_COMBINER_START(deadline_state->call_combiner, &self->closure_,
+                               error,
+                               "deadline exceeded -- sending cancel_stream op");
+    } else {
+      GRPC_CALL_STACK_UNREF(deadline_state->call_stack, "DeadlineTimerState");
+    }
   }
-}
+
+  // NOTE: This object's dtor is never called, so do not add any data
+  // members that require destruction!
+  // TODO(roth): We should ideally call this object's dtor somewhere,
+  // but that would require adding more synchronization, because we'd
+  // need to call the dtor only after both (a) the timer callback
+  // finishes and (b) the filter sees the call completion and attempts
+  // to cancel the timer.
+  grpc_call_element* elem_;
+  grpc_timer timer_;
+  grpc_closure closure_;
+};
+
+}  // namespace grpc_core
+
+//
+// grpc_deadline_state
+//
 
 // Starts the deadline timer.
 // This is called via the call combiner, so access to deadline_state is
@@ -90,41 +119,18 @@ static void start_timer_if_needed(grpc_call_element* elem,
   }
   grpc_deadline_state* deadline_state =
       static_cast<grpc_deadline_state*>(elem->call_data);
-  grpc_closure* closure = nullptr;
-  switch (deadline_state->timer_state) {
-    case GRPC_DEADLINE_STATE_PENDING:
-      // Note: We do not start the timer if there is already a timer
-      return;
-    case GRPC_DEADLINE_STATE_FINISHED:
-      deadline_state->timer_state = GRPC_DEADLINE_STATE_PENDING;
-      // If we've already created and destroyed a timer, we always create a
-      // new closure: we have no other guarantee that the inlined closure is
-      // not in use (it may hold a pending call to timer_callback)
-      closure =
-          GRPC_CLOSURE_CREATE(timer_callback, elem, grpc_schedule_on_exec_ctx);
-      break;
-    case GRPC_DEADLINE_STATE_INITIAL:
-      deadline_state->timer_state = GRPC_DEADLINE_STATE_PENDING;
-      closure =
-          GRPC_CLOSURE_INIT(&deadline_state->timer_callback, timer_callback,
-                            elem, grpc_schedule_on_exec_ctx);
-      break;
-  }
-  GPR_ASSERT(closure != nullptr);
-  GRPC_CALL_STACK_REF(deadline_state->call_stack, "deadline_timer");
-  grpc_timer_init(&deadline_state->timer, deadline, closure);
+  GPR_ASSERT(deadline_state->timer_state == nullptr);
+  deadline_state->timer_state =
+      deadline_state->arena->New<grpc_core::TimerState>(elem, deadline);
 }
 
 // Cancels the deadline timer.
 // This is called via the call combiner, so access to deadline_state is
 // synchronized.
 static void cancel_timer_if_needed(grpc_deadline_state* deadline_state) {
-  if (deadline_state->timer_state == GRPC_DEADLINE_STATE_PENDING) {
-    deadline_state->timer_state = GRPC_DEADLINE_STATE_FINISHED;
-    grpc_timer_cancel(&deadline_state->timer);
-  } else {
-    // timer was either in STATE_INITIAL (nothing to cancel)
-    // OR in STATE_FINISHED (again nothing to cancel)
+  if (deadline_state->timer_state != nullptr) {
+    deadline_state->timer_state->Cancel();
+    deadline_state->timer_state = nullptr;
   }
 }
 
@@ -182,10 +188,11 @@ static void start_timer_after_init(void* arg, grpc_error* error) {
 }
 
 grpc_deadline_state::grpc_deadline_state(grpc_call_element* elem,
-                                         grpc_call_stack* call_stack,
-                                         grpc_core::CallCombiner* call_combiner,
+                                         const grpc_call_element_args& args,
                                          grpc_millis deadline)
-    : call_stack(call_stack), call_combiner(call_combiner) {
+    : call_stack(args.call_stack),
+      call_combiner(args.call_combiner),
+      arena(args.arena) {
   // Deadline will always be infinite on servers, so the timer will only be
   // set on clients with a finite deadline.
   if (deadline != GRPC_MILLIS_INF_FUTURE) {
@@ -263,8 +270,7 @@ typedef struct server_call_data {
 // Constructor for call_data.  Used for both client and server filters.
 static grpc_error* deadline_init_call_elem(grpc_call_element* elem,
                                            const grpc_call_element_args* args) {
-  new (elem->call_data) grpc_deadline_state(
-      elem, args->call_stack, args->call_combiner, args->deadline);
+  new (elem->call_data) grpc_deadline_state(elem, *args, args->deadline);
   return GRPC_ERROR_NONE;
 }
 
index 7c4e9aa..fd6fd45 100644 (file)
 #include "src/core/lib/channel/channel_stack.h"
 #include "src/core/lib/iomgr/timer.h"
 
-enum grpc_deadline_timer_state {
-  GRPC_DEADLINE_STATE_INITIAL,
-  GRPC_DEADLINE_STATE_PENDING,
-  GRPC_DEADLINE_STATE_FINISHED
-};
+namespace grpc_core {
+class TimerState;
+}  // namespace grpc_core
 
 // State used for filters that enforce call deadlines.
 // Must be the first field in the filter's call_data.
 struct grpc_deadline_state {
-  grpc_deadline_state(grpc_call_element* elem, grpc_call_stack* call_stack,
-                      grpc_core::CallCombiner* call_combiner,
-                      grpc_millis deadline);
+  grpc_deadline_state(grpc_call_element* elem,
+                      const grpc_call_element_args& args, grpc_millis deadline);
   ~grpc_deadline_state();
 
   // We take a reference to the call stack for the timer callback.
   grpc_call_stack* call_stack;
   grpc_core::CallCombiner* call_combiner;
-  grpc_deadline_timer_state timer_state = GRPC_DEADLINE_STATE_INITIAL;
-  grpc_timer timer;
-  grpc_closure timer_callback;
+  grpc_core::Arena* arena;
+  grpc_core::TimerState* timer_state = nullptr;
   // Closure to invoke when we receive trailing metadata.
   // We use this to cancel the timer.
   grpc_closure recv_trailing_metadata_ready;
index f09c60c..3a4825f 100644 (file)
@@ -43,7 +43,7 @@
 #include "src/core/lib/transport/transport_impl.h"
 
 #define EXPECTED_CONTENT_TYPE "application/grpc"
-#define EXPECTED_CONTENT_TYPE_LENGTH sizeof(EXPECTED_CONTENT_TYPE) - 1
+#define EXPECTED_CONTENT_TYPE_LENGTH (sizeof(EXPECTED_CONTENT_TYPE) - 1)
 
 /* default maximum size of payload eligible for GET request */
 static constexpr size_t kMaxPayloadSizeForGet = 2048;
index 62dc76f..e4ece54 100644 (file)
@@ -33,7 +33,7 @@
 #include "src/core/lib/transport/static_metadata.h"
 
 #define EXPECTED_CONTENT_TYPE "application/grpc"
-#define EXPECTED_CONTENT_TYPE_LENGTH sizeof(EXPECTED_CONTENT_TYPE) - 1
+#define EXPECTED_CONTENT_TYPE_LENGTH (sizeof(EXPECTED_CONTENT_TYPE) - 1)
 
 static void hs_recv_initial_metadata_ready(void* user_data, grpc_error* err);
 static void hs_recv_trailing_metadata_ready(void* user_data, grpc_error* err);
@@ -269,8 +269,8 @@ static grpc_error* hs_filter_incoming_metadata(grpc_call_element* elem,
     /* offset of the character '?' */
     size_t offset = 0;
     for (offset = 0; offset < path_length && *path_ptr != k_query_separator;
-         path_ptr++, offset++)
-      ;
+         path_ptr++, offset++) {
+    }
     if (offset < path_length) {
       grpc_slice query_slice =
           grpc_slice_sub(path_slice, offset + 1, path_length);
index f2444f6..b3f9928 100644 (file)
@@ -180,7 +180,7 @@ void ServerLoadReportingCallData::StoreClientIpAndLrToken(const char* lr_token,
       gpr_zalloc(client_ip_and_lr_token_len_ * sizeof(char)));
   char* cur_pos = client_ip_and_lr_token_;
   // Store the IP length prefix.
-  if (client_ip.size() == 0) {
+  if (client_ip.empty()) {
     strncpy(cur_pos, kEmptyAddressLengthString, kLengthPrefixSize);
   } else if (client_ip.size() == 8) {
     strncpy(cur_pos, kEncodedIpv4AddressLengthString, kLengthPrefixSize);
index ef59d67..b417db5 100644 (file)
@@ -224,7 +224,7 @@ class ConnectivityWatcher : public AsyncConnectivityStateWatcherInterface {
     GRPC_CHANNEL_STACK_REF(chand_->channel_stack, "max_age conn_watch");
   }
 
-  ~ConnectivityWatcher() {
+  ~ConnectivityWatcher() override {
     GRPC_CHANNEL_STACK_UNREF(chand_->channel_stack, "max_age conn_watch");
   }
 
index 37143c8..7624b7f 100644 (file)
@@ -30,7 +30,7 @@ namespace grpc_core {
 class Chttp2Connector : public SubchannelConnector {
  public:
   Chttp2Connector();
-  ~Chttp2Connector();
+  ~Chttp2Connector() override;
 
   void Connect(const Args& args, Result* result, grpc_closure* notify) override;
   void Shutdown(grpc_error* error) override;
index 000c63c..d6b9d80 100644 (file)
@@ -25,6 +25,7 @@
 #include <string.h>
 #include <vector>
 
+#include "absl/strings/match.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_format.h"
 
@@ -46,6 +47,7 @@
 #include "src/core/lib/iomgr/resolve_address.h"
 #include "src/core/lib/iomgr/resource_quota.h"
 #include "src/core/lib/iomgr/tcp_server.h"
+#include "src/core/lib/iomgr/unix_sockets_posix.h"
 #include "src/core/lib/slice/slice_internal.h"
 #include "src/core/lib/surface/api_trace.h"
 #include "src/core/lib/surface/server.h"
@@ -53,6 +55,9 @@
 namespace grpc_core {
 namespace {
 
+const char kUnixUriPrefix[] = "unix:";
+const char kUnixAbstractUriPrefix[] = "unix-abstract:";
+
 class Chttp2ServerListener : public Server::ListenerInterface {
  public:
   static grpc_error* Create(Server* server, const char* addr,
@@ -63,7 +68,7 @@ class Chttp2ServerListener : public Server::ListenerInterface {
 
   // Do not instantiate directly.  Use one of the factory methods above.
   Chttp2ServerListener(Server* server, grpc_channel_args* args);
-  ~Chttp2ServerListener();
+  ~Chttp2ServerListener() override;
 
   void Start(Server* server,
              const std::vector<grpc_pollset*>* pollsets) override;
@@ -85,7 +90,7 @@ class Chttp2ServerListener : public Server::ListenerInterface {
                     RefCountedPtr<HandshakeManager> handshake_mgr,
                     grpc_channel_args* args, grpc_endpoint* endpoint);
 
-    ~ConnectionState();
+    ~ConnectionState() override;
 
    private:
     static void OnTimeout(void* arg, grpc_error* error);
@@ -278,7 +283,16 @@ grpc_error* Chttp2ServerListener::Create(Server* server, const char* addr,
   grpc_error* error = [&]() {
     *port_num = -1;
     /* resolve address */
-    grpc_error* error = grpc_blocking_resolve_address(addr, "https", &resolved);
+    grpc_error* error = GRPC_ERROR_NONE;
+    if (absl::StartsWith(addr, kUnixUriPrefix)) {
+      error = grpc_resolve_unix_domain_address(
+          addr + sizeof(kUnixUriPrefix) - 1, &resolved);
+    } else if (absl::StartsWith(addr, kUnixAbstractUriPrefix)) {
+      error = grpc_resolve_unix_abstract_domain_address(
+          addr + sizeof(kUnixAbstractUriPrefix) - 1, &resolved);
+    } else {
+      error = grpc_blocking_resolve_address(addr, "https", &resolved);
+    }
     if (error != GRPC_ERROR_NONE) return error;
     // Create Chttp2ServerListener.
     listener = new Chttp2ServerListener(server, args);
index 249035d..2906a5d 100644 (file)
@@ -66,16 +66,16 @@ static bool input_is_valid(const uint8_t* input_ptr, size_t length) {
   return true;
 }
 
-#define COMPOSE_OUTPUT_BYTE_0(input_ptr)        \
-  (uint8_t)((decode_table[input_ptr[0]] << 2) | \
-            (decode_table[input_ptr[1]] >> 4))
+#define COMPOSE_OUTPUT_BYTE_0(input_ptr)          \
+  (uint8_t)((decode_table[(input_ptr)[0]] << 2) | \
+            (decode_table[(input_ptr)[1]] >> 4))
 
-#define COMPOSE_OUTPUT_BYTE_1(input_ptr)        \
-  (uint8_t)((decode_table[input_ptr[1]] << 4) | \
-            (decode_table[input_ptr[2]] >> 2))
+#define COMPOSE_OUTPUT_BYTE_1(input_ptr)          \
+  (uint8_t)((decode_table[(input_ptr)[1]] << 4) | \
+            (decode_table[(input_ptr)[2]] >> 2))
 
 #define COMPOSE_OUTPUT_BYTE_2(input_ptr) \
-  (uint8_t)((decode_table[input_ptr[2]] << 6) | decode_table[input_ptr[3]])
+  (uint8_t)((decode_table[(input_ptr)[2]] << 6) | decode_table[(input_ptr)[3]])
 
 // By RFC 4648, if the length of the encoded string without padding is 4n+r,
 // the length of decoded string is: 1) 3n if r = 0, 2) 3n + 1 if r = 2, 3, or
index 67e0e85..836eb5f 100644 (file)
@@ -69,7 +69,6 @@
 #define DEFAULT_KEEPALIVE_PERMIT_WITHOUT_CALLS false
 #define KEEPALIVE_TIME_BACKOFF_MULTIPLIER 2
 
-#define DEFAULT_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS 300000 /* 5 minutes */
 #define DEFAULT_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS 300000 /* 5 minutes */
 #define DEFAULT_MAX_PINGS_BETWEEN_DATA 2
 #define DEFAULT_MAX_PING_STRIKES 2
@@ -89,8 +88,6 @@ static bool g_default_client_keepalive_permit_without_calls =
 static bool g_default_server_keepalive_permit_without_calls =
     DEFAULT_KEEPALIVE_PERMIT_WITHOUT_CALLS;
 
-static int g_default_min_sent_ping_interval_without_data_ms =
-    DEFAULT_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS;
 static int g_default_min_recv_ping_interval_without_data_ms =
     DEFAULT_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS;
 static int g_default_max_pings_without_data = DEFAULT_MAX_PINGS_BETWEEN_DATA;
@@ -273,15 +270,6 @@ static bool read_channel_args(grpc_chttp2_transport* t,
           &channel_args->args[i], {g_default_max_ping_strikes, 0, INT_MAX});
     } else if (0 ==
                strcmp(channel_args->args[i].key,
-                      GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS)) {
-      t->ping_policy.min_sent_ping_interval_without_data =
-          grpc_channel_arg_get_integer(
-              &channel_args->args[i],
-              grpc_integer_options{
-                  g_default_min_sent_ping_interval_without_data_ms, 0,
-                  INT_MAX});
-    } else if (0 ==
-               strcmp(channel_args->args[i].key,
                       GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS)) {
       t->ping_policy.min_recv_ping_interval_without_data =
           grpc_channel_arg_get_integer(
@@ -408,8 +396,6 @@ static void init_transport_keepalive_settings(grpc_chttp2_transport* t) {
 
 static void configure_transport_ping_policy(grpc_chttp2_transport* t) {
   t->ping_policy.max_pings_without_data = g_default_max_pings_without_data;
-  t->ping_policy.min_sent_ping_interval_without_data =
-      g_default_min_sent_ping_interval_without_data_ms;
   t->ping_policy.max_ping_strikes = g_default_max_ping_strikes;
   t->ping_policy.min_recv_ping_interval_without_data =
       g_default_min_recv_ping_interval_without_data_ms;
@@ -434,7 +420,9 @@ static void init_keepalive_pings_if_enabled(grpc_chttp2_transport* t) {
 grpc_chttp2_transport::grpc_chttp2_transport(
     const grpc_channel_args* channel_args, grpc_endpoint* ep, bool is_client,
     grpc_resource_user* resource_user)
-    : refs(1, &grpc_trace_chttp2_refcount),
+    : refs(1, GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_refcount)
+                  ? "chttp2_refcount"
+                  : nullptr),
       ep(ep),
       peer_string(grpc_endpoint_get_peer(ep)),
       resource_user(resource_user),
@@ -1053,7 +1041,7 @@ static void queue_setting_update(grpc_chttp2_transport* t,
   }
   if (use_value != t->settings[GRPC_LOCAL_SETTINGS][id]) {
     t->settings[GRPC_LOCAL_SETTINGS][id] = use_value;
-    t->dirtied_local_settings = 1;
+    t->dirtied_local_settings = true;
   }
 }
 
@@ -2722,14 +2710,6 @@ void grpc_chttp2_config_default_keepalive_args(grpc_channel_args* args,
       } else if (0 ==
                  strcmp(
                      args->args[i].key,
-                     GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS)) {
-        g_default_min_sent_ping_interval_without_data_ms =
-            grpc_channel_arg_get_integer(
-                &args->args[i],
-                {g_default_min_sent_ping_interval_without_data_ms, 0, INT_MAX});
-      } else if (0 ==
-                 strcmp(
-                     args->args[i].key,
                      GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS)) {
         g_default_min_recv_ping_interval_without_data_ms =
             grpc_channel_arg_get_integer(
index a55ab82..42c5986 100644 (file)
@@ -221,7 +221,7 @@ class TransportFlowControlDisabled final : public TransportFlowControlBase {
 class TransportFlowControl final : public TransportFlowControlBase {
  public:
   TransportFlowControl(const grpc_chttp2_transport* t, bool enable_bdp_probe);
-  ~TransportFlowControl() {}
+  ~TransportFlowControl() override {}
 
   bool flow_control_enabled() const override { return true; }
 
@@ -409,7 +409,7 @@ class StreamFlowControlDisabled : public StreamFlowControlBase {
 class StreamFlowControl final : public StreamFlowControlBase {
  public:
   StreamFlowControl(TransportFlowControl* tfc, const grpc_chttp2_stream* s);
-  ~StreamFlowControl() {
+  ~StreamFlowControl() override {
     tfc_->PreUpdateAnnouncedWindowOverIncomingWindow(announced_window_delta_);
   }
 
index 64fd9c8..3831b80 100644 (file)
@@ -129,9 +129,10 @@ grpc_error* grpc_chttp2_goaway_parser_parse(void* parser,
       ++cur;
     /* fallthrough */
     case GRPC_CHTTP2_GOAWAY_DEBUG:
-      if (end != cur)
+      if (end != cur) {
         memcpy(p->debug_data + p->debug_pos, cur,
                static_cast<size_t>(end - cur));
+      }
       GPR_ASSERT((size_t)(end - cur) < UINT32_MAX - p->debug_pos);
       p->debug_pos += static_cast<uint32_t>(end - cur);
       p->state = GRPC_CHTTP2_GOAWAY_DEBUG;
index 14b5845..668c2cb 100644 (file)
@@ -1301,12 +1301,13 @@ static grpc_error* append_string(grpc_chttp2_hpack_parser* p,
       }
       bits = inverse_base64[*cur];
       ++cur;
-      if (bits == 255)
+      if (bits == 255) {
         return parse_error(
             p, cur, end,
             GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
-      else if (bits == 64)
+      } else if (bits == 64) {
         goto b64_byte0;
+      }
       p->base64_buffer = bits << 18;
     /* fallthrough */
     b64_byte1:
@@ -1317,12 +1318,13 @@ static grpc_error* append_string(grpc_chttp2_hpack_parser* p,
       }
       bits = inverse_base64[*cur];
       ++cur;
-      if (bits == 255)
+      if (bits == 255) {
         return parse_error(
             p, cur, end,
             GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
-      else if (bits == 64)
+      } else if (bits == 64) {
         goto b64_byte1;
+      }
       p->base64_buffer |= bits << 12;
     /* fallthrough */
     b64_byte2:
@@ -1333,12 +1335,13 @@ static grpc_error* append_string(grpc_chttp2_hpack_parser* p,
       }
       bits = inverse_base64[*cur];
       ++cur;
-      if (bits == 255)
+      if (bits == 255) {
         return parse_error(
             p, cur, end,
             GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
-      else if (bits == 64)
+      } else if (bits == 64) {
         goto b64_byte2;
+      }
       p->base64_buffer |= bits << 6;
     /* fallthrough */
     b64_byte3:
@@ -1349,12 +1352,13 @@ static grpc_error* append_string(grpc_chttp2_hpack_parser* p,
       }
       bits = inverse_base64[*cur];
       ++cur;
-      if (bits == 255)
+      if (bits == 255) {
         return parse_error(
             p, cur, end,
             GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
-      else if (bits == 64)
+      } else if (bits == 64) {
         goto b64_byte3;
+      }
       p->base64_buffer |= bits;
       bits = p->base64_buffer;
       decoded[0] = static_cast<uint8_t>(bits >> 16);
index 7d5576c..408a425 100644 (file)
@@ -118,7 +118,6 @@ struct grpc_chttp2_ping_queue {
 struct grpc_chttp2_repeated_ping_policy {
   int max_pings_without_data;
   int max_ping_strikes;
-  grpc_millis min_sent_ping_interval_without_data;
   grpc_millis min_recv_ping_interval_without_data;
 };
 struct grpc_chttp2_repeated_ping_state {
index f775c75..f4b02bb 100644 (file)
@@ -98,6 +98,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
                   .c_str());
         }
         ++cur;
+        // NOLINTNEXTLINE(bugprone-misplaced-widening-cast)
         t->deframe_state = static_cast<grpc_chttp2_deframe_transport_state>(
             1 + static_cast<int>(t->deframe_state));
       }
@@ -747,7 +748,7 @@ static grpc_error* init_settings_frame_parser(grpc_chttp2_transport* t) {
         &t->hpack_parser.table,
         t->settings[GRPC_ACKED_SETTINGS]
                    [GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE]);
-    t->sent_local_settings = 0;
+    t->sent_local_settings = false;
   }
   t->parser = grpc_chttp2_settings_parser_parse;
   t->parser_data = &t->simple.settings;
index f8e21e8..2ce55d0 100644 (file)
@@ -81,8 +81,7 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) {
       (t->keepalive_permit_without_calls == 0 &&
        grpc_chttp2_stream_map_size(&t->stream_map) == 0)
           ? 7200 * GPR_MS_PER_SEC
-          : (t->ping_policy.min_sent_ping_interval_without_data +
-             GPR_MS_PER_SEC); /* A second is added to deal with network delays
+          : (GPR_MS_PER_SEC); /* A second is added to deal with network delays
                                  and timing imprecision */
   grpc_millis next_allowed_ping =
       t->ping_state.last_ping_sent_time + next_allowed_ping_interval;
index c128572..f904aee 100644 (file)
@@ -490,4 +490,4 @@ const char* cronet_net_error_as_string(cronet_net_error_code net_error) {
       return "CRONET_NET_ERROR_DNS_SECURE_RESOLVER_HOSTNAME_RESOLUTION_FAILED";
   }
   return "UNAVAILABLE.";
-}
\ No newline at end of file
+}
index d092b90..6711996 100644 (file)
@@ -128,10 +128,10 @@ struct read_state {
   int received_bytes = 0;
   int remaining_bytes = 0;
   int length_field = 0;
-  bool compressed = 0;
+  bool compressed = false;
   char grpc_header_bytes[GRPC_HEADER_SIZE_IN_BYTES] = {};
   char* payload_field = nullptr;
-  bool read_stream_closed = 0;
+  bool read_stream_closed = false;
 
   /* vars for holding data destined for the application */
   grpc_core::ManualConstructor<grpc_core::SliceBufferByteStream> sbs;
@@ -880,65 +880,81 @@ static bool op_can_be_run(grpc_transport_stream_op_batch* curr_op,
     /* already executed */
     if (stream_state->state_op_done[OP_SEND_INITIAL_METADATA]) result = false;
   } else if (op_id == OP_RECV_INITIAL_METADATA) {
-    /* already executed */
-    if (stream_state->state_op_done[OP_RECV_INITIAL_METADATA]) result = false;
-    /* we haven't sent headers yet. */
-    else if (!stream_state->state_callback_received[OP_SEND_INITIAL_METADATA])
+    if (stream_state->state_op_done[OP_RECV_INITIAL_METADATA]) {
+      /* already executed */
+      result = false;
+    } else if (!stream_state
+                    ->state_callback_received[OP_SEND_INITIAL_METADATA]) {
+      /* we haven't sent headers yet. */
       result = false;
-    /* we haven't received headers yet. */
-    else if (!stream_state->state_callback_received[OP_RECV_INITIAL_METADATA] &&
-             !stream_state->state_op_done[OP_RECV_TRAILING_METADATA])
+    } else if (!stream_state
+                    ->state_callback_received[OP_RECV_INITIAL_METADATA] &&
+               !stream_state->state_op_done[OP_RECV_TRAILING_METADATA]) {
+      /* we haven't received headers yet. */
       result = false;
+    }
   } else if (op_id == OP_SEND_MESSAGE) {
-    /* already executed (note we're checking op specific state, not stream
-     state) */
-    if (op_state->state_op_done[OP_SEND_MESSAGE]) result = false;
-    /* we haven't sent headers yet. */
-    else if (!stream_state->state_callback_received[OP_SEND_INITIAL_METADATA])
+    if (op_state->state_op_done[OP_SEND_MESSAGE]) {
+      /* already executed (note we're checking op specific state, not stream
+         state) */
+      result = false;
+    } else if (!stream_state
+                    ->state_callback_received[OP_SEND_INITIAL_METADATA]) {
+      /* we haven't sent headers yet. */
       result = false;
+    }
   } else if (op_id == OP_RECV_MESSAGE) {
-    /* already executed */
-    if (op_state->state_op_done[OP_RECV_MESSAGE]) result = false;
-    /* we haven't received headers yet. */
-    else if (!stream_state->state_callback_received[OP_RECV_INITIAL_METADATA] &&
-             !stream_state->state_op_done[OP_RECV_TRAILING_METADATA])
+    if (op_state->state_op_done[OP_RECV_MESSAGE]) {
+      /* already executed */
       result = false;
+    } else if (!stream_state
+                    ->state_callback_received[OP_RECV_INITIAL_METADATA] &&
+               !stream_state->state_op_done[OP_RECV_TRAILING_METADATA]) {
+      /* we haven't received headers yet. */
+      result = false;
+    }
   } else if (op_id == OP_RECV_TRAILING_METADATA) {
-    /* already executed */
-    if (stream_state->state_op_done[OP_RECV_TRAILING_METADATA]) result = false;
-    /* we have asked for but haven't received message yet. */
-    else if (stream_state->state_op_done[OP_READ_REQ_MADE] &&
-             !stream_state->state_op_done[OP_RECV_MESSAGE])
+    if (stream_state->state_op_done[OP_RECV_TRAILING_METADATA]) {
+      /* already executed */
+      result = false;
+    } else if (stream_state->state_op_done[OP_READ_REQ_MADE] &&
+               !stream_state->state_op_done[OP_RECV_MESSAGE]) {
+      /* we have asked for but haven't received message yet. */
       result = false;
-    /* we haven't received trailers  yet. */
-    else if (!stream_state->state_callback_received[OP_RECV_TRAILING_METADATA])
+    } else if (!stream_state
+                    ->state_callback_received[OP_RECV_TRAILING_METADATA]) {
+      /* we haven't received trailers  yet. */
       result = false;
-    /* we haven't received on_succeeded  yet. */
-    else if (!stream_state->state_callback_received[OP_SUCCEEDED])
+    } else if (!stream_state->state_callback_received[OP_SUCCEEDED]) {
+      /* we haven't received on_succeeded  yet. */
       result = false;
+    }
   } else if (op_id == OP_SEND_TRAILING_METADATA) {
-    /* already executed */
-    if (stream_state->state_op_done[OP_SEND_TRAILING_METADATA]) result = false;
-    /* we haven't sent initial metadata yet */
-    else if (!stream_state->state_callback_received[OP_SEND_INITIAL_METADATA])
+    if (stream_state->state_op_done[OP_SEND_TRAILING_METADATA]) {
+      /* already executed */
       result = false;
-    /* we haven't sent message yet */
-    else if (stream_state->pending_send_message &&
-             !stream_state->state_op_done[OP_SEND_MESSAGE])
+    } else if (!stream_state
+                    ->state_callback_received[OP_SEND_INITIAL_METADATA]) {
+      /* we haven't sent initial metadata yet */
       result = false;
-    /* we haven't got on_write_completed for the send yet */
-    else if (stream_state->state_op_done[OP_SEND_MESSAGE] &&
-             !stream_state->state_callback_received[OP_SEND_MESSAGE] &&
-             !(t->use_packet_coalescing &&
-               stream_state->pending_write_for_trailer))
+    } else if (stream_state->pending_send_message &&
+               !stream_state->state_op_done[OP_SEND_MESSAGE]) {
+      /* we haven't sent message yet */
       result = false;
+    } else if (stream_state->state_op_done[OP_SEND_MESSAGE] &&
+               !stream_state->state_callback_received[OP_SEND_MESSAGE] &&
+               !(t->use_packet_coalescing &&
+                 stream_state->pending_write_for_trailer)) {
+      /* we haven't got on_write_completed for the send yet */
+      result = false;
+    }
   } else if (op_id == OP_CANCEL_ERROR) {
     /* already executed */
     if (stream_state->state_op_done[OP_CANCEL_ERROR]) result = false;
   } else if (op_id == OP_ON_COMPLETE) {
-    /* already executed (note we're checking op specific state, not stream
-    state) */
     if (op_state->state_op_done[OP_ON_COMPLETE]) {
+      /* already executed (note we're checking op specific state, not stream
+      state) */
       CRONET_LOG(GPR_DEBUG, "Because");
       result = false;
     }
@@ -996,8 +1012,9 @@ static bool op_can_be_run(grpc_transport_stream_op_batch* curr_op,
     /* We should see at least one on_write_completed for the trailers that we
       sent */
     else if (curr_op->send_trailing_metadata &&
-             !stream_state->state_callback_received[OP_SEND_MESSAGE])
+             !stream_state->state_callback_received[OP_SEND_MESSAGE]) {
       result = false;
+    }
   }
   CRONET_LOG(GPR_DEBUG, "op_can_be_run %s : %s", op_id_string(op_id),
              result ? "YES" : "NO");
@@ -1370,8 +1387,9 @@ static enum e_op_result execute_stream_op(struct op_and_state* oas) {
     result = ACTION_TAKEN_NO_CALLBACK;
     /* If this is the on_complete callback being called for a received message -
       make a note */
-    if (stream_op->recv_message)
+    if (stream_op->recv_message) {
       stream_state->state_op_done[OP_RECV_MESSAGE_AND_ON_COMPLETE] = true;
+    }
   } else {
     result = NO_ACTION_POSSIBLE;
   }
index 244fdd9..84c219e 100644 (file)
@@ -23,7 +23,7 @@
 
 #include "src/core/lib/iomgr/error.h"
 #include "src/core/lib/json/json.h"
-#include "src/core/lib/security/certificate_provider.h"
+#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h"
 
 namespace grpc_core {
 
@@ -32,13 +32,15 @@ namespace grpc_core {
 class CertificateProviderFactory {
  public:
   // Interface for configs for CertificateProviders.
-  class Config {
+  class Config : public RefCounted<Config> {
    public:
-    virtual ~Config() = default;
+    ~Config() override = default;
 
     // Name of the type of the CertificateProvider. Unique to each type of
     // config.
     virtual const char* name() const = 0;
+
+    virtual std::string ToString() const = 0;
   };
 
   virtual ~CertificateProviderFactory() = default;
@@ -46,12 +48,12 @@ class CertificateProviderFactory {
   // Name of the plugin.
   virtual const char* name() const = 0;
 
-  virtual std::unique_ptr<Config> CreateCertificateProviderConfig(
+  virtual RefCountedPtr<Config> CreateCertificateProviderConfig(
       const Json& config_json, grpc_error** error) = 0;
 
   // Create a CertificateProvider instance from config.
   virtual RefCountedPtr<grpc_tls_certificate_provider>
-  CreateCertificateProvider(std::unique_ptr<Config> config) = 0;
+  CreateCertificateProvider(RefCountedPtr<Config> config) = 0;
 };
 
 }  // namespace grpc_core
diff --git a/src/core/ext/xds/certificate_provider_store.cc b/src/core/ext/xds/certificate_provider_store.cc
new file mode 100644 (file)
index 0000000..dedb2bb
--- /dev/null
@@ -0,0 +1,84 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/ext/xds/certificate_provider_store.h"
+
+#include "src/core/ext/xds/certificate_provider_registry.h"
+
+namespace grpc_core {
+
+// If a certificate provider is created, the CertificateProviderStore
+// maintains a raw pointer to the created CertificateProviderWrapper so that
+// future calls to `CreateOrGetCertificateProvider()` with the same key result
+// in returning a ref to this created certificate provider. This entry is
+// deleted when the refcount to this provider reaches zero.
+RefCountedPtr<grpc_tls_certificate_provider>
+CertificateProviderStore::CreateOrGetCertificateProvider(
+    absl::string_view key) {
+  RefCountedPtr<CertificateProviderWrapper> result;
+  MutexLock lock(&mu_);
+  auto it = certificate_providers_map_.find(key);
+  if (it == certificate_providers_map_.end()) {
+    it = certificate_providers_map_.insert({key, nullptr}).first;
+  } else {
+    result = it->second->RefIfNonZero();
+  }
+  if (result == nullptr) {
+    result = CreateCertificateProviderLocked(key);
+    it->second = result.get();
+  }
+  return result;
+}
+
+RefCountedPtr<CertificateProviderStore::CertificateProviderWrapper>
+CertificateProviderStore::CreateCertificateProviderLocked(
+    absl::string_view key) {
+  auto plugin_config_it = plugin_config_map_.find(std::string(key));
+  if (plugin_config_it == plugin_config_map_.end()) {
+    return nullptr;
+  }
+  CertificateProviderFactory* factory =
+      CertificateProviderRegistry::LookupCertificateProviderFactory(
+          plugin_config_it->second.plugin_name);
+  if (factory == nullptr) {
+    // This should never happen since an entry is only inserted in the
+    // plugin_config_map_ if the corresponding factory was found when parsing
+    // the xDS bootstrap file.
+    gpr_log(GPR_ERROR, "Certificate provider factory %s not found",
+            plugin_config_it->second.plugin_name.c_str());
+    return nullptr;
+  }
+  return MakeRefCounted<CertificateProviderWrapper>(
+      factory->CreateCertificateProvider(plugin_config_it->second.config), this,
+      plugin_config_it->first);
+}
+
+void CertificateProviderStore::ReleaseCertificateProvider(
+    absl::string_view key, CertificateProviderWrapper* wrapper) {
+  MutexLock lock(&mu_);
+  auto it = certificate_providers_map_.find(key);
+  if (it != certificate_providers_map_.end()) {
+    if (it->second == wrapper) {
+      certificate_providers_map_.erase(it);
+    }
+  }
+}
+
+}  // namespace grpc_core
index c6881a9..ef22d36 100644 (file)
 
 #include <map>
 
+#include "absl/strings/string_view.h"
+
+#include "src/core/ext/xds/certificate_provider_factory.h"
 #include "src/core/lib/gprpp/ref_counted_ptr.h"
 #include "src/core/lib/gprpp/sync.h"
-#include "src/core/lib/security/certificate_provider.h"
+#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h"
 
 namespace grpc_core {
 
-// Map for xDS based grpc_tls_certificate_provider instances.
+// Map for xDS based grpc_tls_certificate_provider instances. The store should
+// outlive the refs taken via `CreateOrGetCertificateProvider()`.
 class CertificateProviderStore {
  public:
-  // If a provider corresponding to the config is found, a raw pointer to the
-  // grpc_tls_certificate_provider in the map is returned. If no provider is
-  // found for a key, a new provider is created. The CertificateProviderStore
-  // maintains a ref to the grpc_tls_certificate_provider for its entire
-  // lifetime.
+  struct PluginDefinition {
+    std::string plugin_name;
+    RefCountedPtr<CertificateProviderFactory::Config> config;
+  };
+
+  // Maps plugin instance (opaque) name to plugin defition.
+  typedef std::map<std::string, PluginDefinition> PluginDefinitionMap;
+
+  CertificateProviderStore(PluginDefinitionMap plugin_config_map)
+      : plugin_config_map_(std::move(plugin_config_map)) {}
+
+  // If a certificate provider corresponding to the instance name \a key is
+  // found, a ref to the grpc_tls_certificate_provider is returned. If no
+  // provider is found for the key, a new provider is created from the plugin
+  // definition map.
+  // Returns nullptr on failure to get or create a new certificate provider.
   RefCountedPtr<grpc_tls_certificate_provider> CreateOrGetCertificateProvider(
       absl::string_view key);
 
  private:
+  // A thin wrapper around `grpc_tls_certificate_provider` which allows removing
+  // the entry from the CertificateProviderStore when the refcount reaches zero.
+  class CertificateProviderWrapper : public grpc_tls_certificate_provider {
+   public:
+    CertificateProviderWrapper(
+        RefCountedPtr<grpc_tls_certificate_provider> certificate_provider,
+        CertificateProviderStore* store, absl::string_view key)
+        : certificate_provider_(std::move(certificate_provider)),
+          store_(store),
+          key_(key) {}
+
+    ~CertificateProviderWrapper() override {
+      store_->ReleaseCertificateProvider(key_, this);
+    }
+
+    grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor()
+        const override {
+      return certificate_provider_->distributor();
+    }
+
+    grpc_pollset_set* interested_parties() const override {
+      return certificate_provider_->interested_parties();
+    }
+
+   private:
+    RefCountedPtr<grpc_tls_certificate_provider> certificate_provider_;
+    CertificateProviderStore* store_;
+    absl::string_view key_;
+  };
+
+  RefCountedPtr<CertificateProviderWrapper> CreateCertificateProviderLocked(
+      absl::string_view key);
+
+  // Releases a previously created certificate provider from the certificate
+  // provider map if the value matches \a wrapper.
+  void ReleaseCertificateProvider(absl::string_view key,
+                                  CertificateProviderWrapper* wrapper);
+
+  Mutex mu_;
+  // Map of plugin configurations
+  PluginDefinitionMap plugin_config_map_;
   // Underlying map for the providers.
-  std::map<std::string, RefCountedPtr<grpc_tls_certificate_provider>> map_;
+  std::map<absl::string_view, CertificateProviderWrapper*>
+      certificate_providers_map_;
 };
 
 }  // namespace grpc_core
diff --git a/src/core/ext/xds/file_watcher_certificate_provider_factory.cc b/src/core/ext/xds/file_watcher_certificate_provider_factory.cc
new file mode 100644 (file)
index 0000000..fab8dac
--- /dev/null
@@ -0,0 +1,119 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/ext/xds/file_watcher_certificate_provider_factory.h"
+
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_join.h"
+
+#include "src/core/lib/json/json_util.h"
+
+namespace grpc_core {
+
+namespace {
+
+const char* kFileWatcherPlugin = "file_watcher";
+
+}  // namespace
+
+//
+// FileWatcherCertificateProviderFactory::Config
+//
+
+const char* FileWatcherCertificateProviderFactory::Config::name() const {
+  return kFileWatcherPlugin;
+}
+
+std::string FileWatcherCertificateProviderFactory::Config::ToString() const {
+  std::vector<std::string> parts;
+  parts.push_back("{");
+  if (!identity_cert_file_.empty()) {
+    parts.push_back(
+        absl::StrFormat("certificate_file=\"%s\", ", identity_cert_file_));
+  }
+  if (!identity_cert_file_.empty()) {
+    parts.push_back(
+        absl::StrFormat("private_key_file=\"%s\", ", private_key_file_));
+  }
+  if (!identity_cert_file_.empty()) {
+    parts.push_back(
+        absl::StrFormat("ca_certificate_file=\"%s\", ", root_cert_file_));
+  }
+  parts.push_back(
+      absl::StrFormat("refresh_interval=%ldms}", refresh_interval_ms_));
+  return absl::StrJoin(parts, "");
+}
+
+RefCountedPtr<FileWatcherCertificateProviderFactory::Config>
+FileWatcherCertificateProviderFactory::Config::Parse(const Json& config_json,
+                                                     grpc_error** error) {
+  auto config = MakeRefCounted<FileWatcherCertificateProviderFactory::Config>();
+  if (config_json.type() != Json::Type::OBJECT) {
+    *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+        "error:config type should be OBJECT.");
+    return nullptr;
+  }
+  std::vector<grpc_error*> error_list;
+  ParseJsonObjectField(config_json.object_value(), "certificate_file",
+                       &config->identity_cert_file_, &error_list, false);
+  ParseJsonObjectField(config_json.object_value(), "private_key_file",
+                       &config->private_key_file_, &error_list, false);
+  if (config->identity_cert_file_.empty() !=
+      config->private_key_file_.empty()) {
+    error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+        "fields \"certificate_file\" and \"private_key_file\" must be both set "
+        "or both unset."));
+  }
+  ParseJsonObjectField(config_json.object_value(), "ca_certificate_file",
+                       &config->root_cert_file_, &error_list, false);
+  if (config->identity_cert_file_.empty() && config->root_cert_file_.empty()) {
+    error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+        "At least one of \"certificate_file\" and \"ca_certificate_file\" must "
+        "be specified."));
+  }
+  if (!ParseJsonObjectFieldAsDuration(
+          config_json.object_value(), "refresh_interval",
+          &config->refresh_interval_ms_, &error_list, false)) {
+    config->refresh_interval_ms_ = 10 * 60 * 1000;  // 10 minutes default
+  }
+  if (!error_list.empty()) {
+    *error = GRPC_ERROR_CREATE_FROM_VECTOR(
+        "Error parsing file watcher certificate provider config", &error_list);
+    return nullptr;
+  }
+  return config;
+}
+
+//
+// FileWatcherCertificateProviderFactory
+//
+
+const char* FileWatcherCertificateProviderFactory::name() const {
+  return kFileWatcherPlugin;
+}
+
+RefCountedPtr<CertificateProviderFactory::Config>
+FileWatcherCertificateProviderFactory::CreateCertificateProviderConfig(
+    const Json& config_json, grpc_error** error) {
+  return FileWatcherCertificateProviderFactory::Config::Parse(config_json,
+                                                              error);
+}
+
+}  // namespace grpc_core
diff --git a/src/core/ext/xds/file_watcher_certificate_provider_factory.h b/src/core/ext/xds/file_watcher_certificate_provider_factory.h
new file mode 100644 (file)
index 0000000..96b61e1
--- /dev/null
@@ -0,0 +1,72 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#ifndef GRPC_CORE_EXT_XDS_FILE_WATCHER_CERTIFICATE_PROVIDER_FACTORY_H
+#define GRPC_CORE_EXT_XDS_FILE_WATCHER_CERTIFICATE_PROVIDER_FACTORY_H
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/ext/xds/certificate_provider_factory.h"
+
+namespace grpc_core {
+
+class FileWatcherCertificateProviderFactory
+    : public CertificateProviderFactory {
+ public:
+  class Config : public CertificateProviderFactory::Config {
+   public:
+    static RefCountedPtr<Config> Parse(const Json& config_json,
+                                       grpc_error** error);
+
+    const char* name() const override;
+
+    std::string ToString() const override;
+
+    const std::string& identity_cert_file() const {
+      return identity_cert_file_;
+    }
+
+    const std::string& private_key_file() const { return private_key_file_; }
+
+    const std::string& root_cert_file() const { return root_cert_file_; }
+
+    grpc_millis refresh_interval_ms() const { return refresh_interval_ms_; }
+
+   private:
+    std::string identity_cert_file_;
+    std::string private_key_file_;
+    std::string root_cert_file_;
+    grpc_millis refresh_interval_ms_;
+  };
+
+  const char* name() const override;
+
+  RefCountedPtr<CertificateProviderFactory::Config>
+  CreateCertificateProviderConfig(const Json& config_json,
+                                  grpc_error** error) override;
+
+  RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
+      RefCountedPtr<CertificateProviderFactory::Config> config) override {
+    // TODO(yashykt) : To be implemented
+    return nullptr;
+  }
+};
+
+}  // namespace grpc_core
+
+#endif  // GRPC_CORE_EXT_XDS_FILE_WATCHER_CERTIFICATE_PROVIDER_FACTORY_H
index 8e1f7b5..c1b7b84 100644 (file)
@@ -37,123 +37,6 @@ namespace {
 
 const char* kMeshCaPlugin = "meshCA";
 
-//
-// Helper functions for extracting types from JSON
-//
-template <typename NumericType, typename ErrorVectorType>
-bool ExtractJsonType(const Json& json, const std::string& field_name,
-                     NumericType* output, ErrorVectorType* error_list) {
-  static_assert(std::is_integral<NumericType>::value, "Integral required");
-  if (json.type() != Json::Type::NUMBER) {
-    error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
-        absl::StrCat("field:", field_name, " error:type should be NUMBER")
-            .c_str()));
-    return false;
-  }
-  std::istringstream ss(json.string_value());
-  ss >> *output;
-  // The JSON parsing API should have dealt with parsing errors, but check
-  // anyway
-  if (GPR_UNLIKELY(ss.bad())) {
-    error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
-        absl::StrCat("field:", field_name, " error:failed to parse.").c_str()));
-    return false;
-  }
-  return true;
-}
-
-template <typename ErrorVectorType>
-bool ExtractJsonType(const Json& json, const std::string& field_name,
-                     bool* output, ErrorVectorType* error_list) {
-  switch (json.type()) {
-    case Json::Type::JSON_TRUE:
-      *output = true;
-      return true;
-    case Json::Type::JSON_FALSE:
-      *output = false;
-      return true;
-    default:
-      error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
-          absl::StrCat("field:", field_name, " error:type should be BOOLEAN")
-              .c_str()));
-      return false;
-  }
-}
-
-template <typename ErrorVectorType>
-bool ExtractJsonType(const Json& json, const std::string& field_name,
-                     std::string* output, ErrorVectorType* error_list) {
-  if (json.type() != Json::Type::STRING) {
-    *output = "";
-    error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
-        absl::StrCat("field:", field_name, " error:type should be STRING")
-            .c_str()));
-    return false;
-  }
-  *output = json.string_value();
-  return true;
-}
-
-template <typename ErrorVectorType>
-bool ExtractJsonType(const Json& json, const std::string& field_name,
-                     const Json::Array** output, ErrorVectorType* error_list) {
-  if (json.type() != Json::Type::ARRAY) {
-    *output = nullptr;
-    error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
-        absl::StrCat("field:", field_name, " error:type should be ARRAY")
-            .c_str()));
-    return false;
-  }
-  *output = &json.array_value();
-  return true;
-}
-
-template <typename ErrorVectorType>
-bool ExtractJsonType(const Json& json, const std::string& field_name,
-                     const Json::Object** output, ErrorVectorType* error_list) {
-  if (json.type() != Json::Type::OBJECT) {
-    *output = nullptr;
-    error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
-        absl::StrCat("field:", field_name, " error:type should be OBJECT")
-            .c_str()));
-    return false;
-  }
-  *output = &json.object_value();
-  return true;
-}
-
-template <typename ErrorVectorType>
-bool ExtractJsonType(const Json& json, const std::string& field_name,
-                     grpc_millis* output, ErrorVectorType* error_list) {
-  if (!ParseDurationFromJson(json, output)) {
-    *output = GRPC_MILLIS_INF_PAST;
-    error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
-        absl::StrCat("field:", field_name,
-                     " error:type should be STRING of the form given by "
-                     "google.proto.Duration.")
-            .c_str()));
-    return false;
-  }
-  return true;
-}
-
-template <typename T, typename ErrorVectorType>
-bool ParseJsonObjectField(const Json::Object& object,
-                          const std::string& field_name, T* output,
-                          ErrorVectorType* error_list, bool optional = false) {
-  auto it = object.find(field_name);
-  if (it == object.end()) {
-    if (!optional) {
-      error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
-          absl::StrCat("field:", field_name, " error:does not exist.")
-              .c_str()));
-    }
-    return false;
-  }
-  auto& child_object_json = it->second;
-  return ExtractJsonType(child_object_json, field_name, output, error_list);
-}
-
 }  // namespace
 
 //
@@ -164,28 +47,33 @@ const char* GoogleMeshCaCertificateProviderFactory::Config::name() const {
   return kMeshCaPlugin;
 }
 
+std::string GoogleMeshCaCertificateProviderFactory::Config::ToString() const {
+  // TODO(yashykt): To be filled
+  return "{}";
+}
+
 std::vector<grpc_error*>
 GoogleMeshCaCertificateProviderFactory::Config::ParseJsonObjectStsService(
     const Json::Object& sts_service) {
   std::vector<grpc_error*> error_list_sts_service;
   if (!ParseJsonObjectField(sts_service, "token_exchange_service_uri",
                             &sts_config_.token_exchange_service_uri,
-                            &error_list_sts_service, true)) {
+                            &error_list_sts_service, false)) {
     sts_config_.token_exchange_service_uri =
         "securetoken.googleapis.com";  // default
   }
   ParseJsonObjectField(sts_service, "resource", &sts_config_.resource,
-                       &error_list_sts_service, true);
+                       &error_list_sts_service, false);
   ParseJsonObjectField(sts_service, "audience", &sts_config_.audience,
-                       &error_list_sts_service, true);
+                       &error_list_sts_service, false);
   if (!ParseJsonObjectField(sts_service, "scope", &sts_config_.scope,
-                            &error_list_sts_service, true)) {
+                            &error_list_sts_service, false)) {
     sts_config_.scope =
         "https://www.googleapis.com/auth/cloud-platform";  // default
   }
   ParseJsonObjectField(sts_service, "requested_token_type",
                        &sts_config_.requested_token_type,
-                       &error_list_sts_service, true);
+                       &error_list_sts_service, false);
   ParseJsonObjectField(sts_service, "subject_token_path",
                        &sts_config_.subject_token_path,
                        &error_list_sts_service);
@@ -194,10 +82,10 @@ GoogleMeshCaCertificateProviderFactory::Config::ParseJsonObjectStsService(
                        &error_list_sts_service);
   ParseJsonObjectField(sts_service, "actor_token_path",
                        &sts_config_.actor_token_path, &error_list_sts_service,
-                       true);
+                       false);
   ParseJsonObjectField(sts_service, "actor_token_type",
                        &sts_config_.actor_token_type, &error_list_sts_service,
-                       true);
+                       false);
   return error_list_sts_service;
 }
 
@@ -223,7 +111,7 @@ GoogleMeshCaCertificateProviderFactory::Config::ParseJsonObjectGoogleGrpc(
     const Json::Object& google_grpc) {
   std::vector<grpc_error*> error_list_google_grpc;
   if (!ParseJsonObjectField(google_grpc, "target_uri", &endpoint_,
-                            &error_list_google_grpc, true)) {
+                            &error_list_google_grpc, false)) {
     endpoint_ = "meshca.googleapis.com";  // Default target
   }
   const Json::Array* call_credentials_array = nullptr;
@@ -263,8 +151,8 @@ GoogleMeshCaCertificateProviderFactory::Config::ParseJsonObjectGrpcServices(
           "field:google_grpc", &error_list_google_grpc));
     }
   }
-  if (!ParseJsonObjectField(grpc_service, "timeout", &timeout_,
-                            &error_list_grpc_services, true)) {
+  if (!ParseJsonObjectFieldAsDuration(grpc_service, "timeout", &timeout_,
+                                      &error_list_grpc_services, false)) {
     timeout_ = 10 * 1000;  // 10sec default
   }
   return error_list_grpc_services;
@@ -276,7 +164,7 @@ GoogleMeshCaCertificateProviderFactory::Config::ParseJsonObjectServer(
   std::vector<grpc_error*> error_list_server;
   std::string api_type;
   if (ParseJsonObjectField(server, "api_type", &api_type, &error_list_server,
-                           true)) {
+                           false)) {
     if (api_type != "GRPC") {
       error_list_server.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
           "field:api_type error:Only GRPC is supported"));
@@ -304,11 +192,11 @@ GoogleMeshCaCertificateProviderFactory::Config::ParseJsonObjectServer(
   return error_list_server;
 }
 
-std::unique_ptr<GoogleMeshCaCertificateProviderFactory::Config>
+RefCountedPtr<GoogleMeshCaCertificateProviderFactory::Config>
 GoogleMeshCaCertificateProviderFactory::Config::Parse(const Json& config_json,
                                                       grpc_error** error) {
   auto config =
-      absl::make_unique<GoogleMeshCaCertificateProviderFactory::Config>();
+      MakeRefCounted<GoogleMeshCaCertificateProviderFactory::Config>();
   if (config_json.type() != Json::Type::OBJECT) {
     *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
         "error:config type should be OBJECT.");
@@ -325,30 +213,30 @@ GoogleMeshCaCertificateProviderFactory::Config::Parse(const Json& config_json,
           GRPC_ERROR_CREATE_FROM_VECTOR("field:server", &error_list_server));
     }
   }
-  if (!ParseJsonObjectField(config_json.object_value(), "certificate_lifetime",
-                            &config->certificate_lifetime_, &error_list,
-                            true)) {
+  if (!ParseJsonObjectFieldAsDuration(
+          config_json.object_value(), "certificate_lifetime",
+          &config->certificate_lifetime_, &error_list, false)) {
     config->certificate_lifetime_ = 24 * 60 * 60 * 1000;  // 24hrs default
   }
-  if (!ParseJsonObjectField(config_json.object_value(), "renewal_grace_period",
-                            &config->renewal_grace_period_, &error_list,
-                            true)) {
+  if (!ParseJsonObjectFieldAsDuration(
+          config_json.object_value(), "renewal_grace_period",
+          &config->renewal_grace_period_, &error_list, false)) {
     config->renewal_grace_period_ = 12 * 60 * 60 * 1000;  // 12hrs default
   }
   std::string key_type;
   if (ParseJsonObjectField(config_json.object_value(), "key_type", &key_type,
-                           &error_list, true)) {
+                           &error_list, false)) {
     if (key_type != "RSA") {
       error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
           "field:key_type error:Only RSA is supported."));
     }
   }
   if (!ParseJsonObjectField(config_json.object_value(), "key_size",
-                            &config->key_size_, &error_list, true)) {
+                            &config->key_size_, &error_list, false)) {
     config->key_size_ = 2048;  // default 2048 bit key size
   }
   if (!ParseJsonObjectField(config_json.object_value(), "location",
-                            &config->location_, &error_list, true)) {
+                            &config->location_, &error_list, false)) {
     // GCE/GKE Metadata server needs to be contacted to get the value.
   }
   if (!error_list.empty()) {
@@ -367,7 +255,7 @@ const char* GoogleMeshCaCertificateProviderFactory::name() const {
   return kMeshCaPlugin;
 }
 
-std::unique_ptr<CertificateProviderFactory::Config>
+RefCountedPtr<CertificateProviderFactory::Config>
 GoogleMeshCaCertificateProviderFactory::CreateCertificateProviderConfig(
     const Json& config_json, grpc_error** error) {
   return GoogleMeshCaCertificateProviderFactory::Config::Parse(config_json,
index a48b1c6..f2765d6 100644 (file)
@@ -46,6 +46,8 @@ class GoogleMeshCaCertificateProviderFactory
 
     const char* name() const override;
 
+    std::string ToString() const override;
+
     const std::string& endpoint() const { return endpoint_; }
 
     const StsConfig& sts_config() const { return sts_config_; }
@@ -60,8 +62,8 @@ class GoogleMeshCaCertificateProviderFactory
 
     const std::string& location() const { return location_; }
 
-    static std::unique_ptr<Config> Parse(const Json& config_json,
-                                         grpc_error** error);
+    static RefCountedPtr<Config> Parse(const Json& config_json,
+                                       grpc_error** error);
 
    private:
     // Helpers for parsing the config
@@ -86,12 +88,12 @@ class GoogleMeshCaCertificateProviderFactory
 
   const char* name() const override;
 
-  std::unique_ptr<CertificateProviderFactory::Config>
+  RefCountedPtr<CertificateProviderFactory::Config>
   CreateCertificateProviderConfig(const Json& config_json,
                                   grpc_error** error) override;
 
   RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
-      std::unique_ptr<CertificateProviderFactory::Config> config) override {
+      RefCountedPtr<CertificateProviderFactory::Config> config) override {
     // TODO(yashykt) : To be implemented
     return nullptr;
   }
index bbd8d24..8ec9dfe 100644 (file)
 #include "src/core/lib/gpr/useful.h"
 #include "src/core/lib/iomgr/error.h"
 #include "src/core/lib/iomgr/sockaddr_utils.h"
+#include "src/core/lib/slice/slice_utils.h"
 
 #include "envoy/config/cluster/v3/circuit_breaker.upb.h"
 #include "envoy/config/cluster/v3/cluster.upb.h"
+#include "envoy/config/cluster/v3/cluster.upbdefs.h"
 #include "envoy/config/core/v3/address.upb.h"
 #include "envoy/config/core/v3/base.upb.h"
 #include "envoy/config/core/v3/config_source.upb.h"
 #include "envoy/config/core/v3/health_check.upb.h"
+#include "envoy/config/core/v3/protocol.upb.h"
 #include "envoy/config/endpoint/v3/endpoint.upb.h"
+#include "envoy/config/endpoint/v3/endpoint.upbdefs.h"
 #include "envoy/config/endpoint/v3/endpoint_components.upb.h"
 #include "envoy/config/endpoint/v3/load_report.upb.h"
 #include "envoy/config/listener/v3/api_listener.upb.h"
 #include "envoy/config/listener/v3/listener.upb.h"
 #include "envoy/config/route/v3/route.upb.h"
+#include "envoy/config/route/v3/route.upbdefs.h"
 #include "envoy/config/route/v3/route_components.upb.h"
 #include "envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h"
 #include "envoy/extensions/transport_sockets/tls/v3/common.upb.h"
 #include "envoy/extensions/transport_sockets/tls/v3/tls.upb.h"
 #include "envoy/service/cluster/v3/cds.upb.h"
+#include "envoy/service/cluster/v3/cds.upbdefs.h"
 #include "envoy/service/discovery/v3/discovery.upb.h"
+#include "envoy/service/discovery/v3/discovery.upbdefs.h"
 #include "envoy/service/endpoint/v3/eds.upb.h"
+#include "envoy/service/endpoint/v3/eds.upbdefs.h"
 #include "envoy/service/listener/v3/lds.upb.h"
 #include "envoy/service/load_stats/v3/lrs.upb.h"
+#include "envoy/service/load_stats/v3/lrs.upbdefs.h"
 #include "envoy/service/route/v3/rds.upb.h"
+#include "envoy/service/route/v3/rds.upbdefs.h"
 #include "envoy/type/matcher/v3/regex.upb.h"
 #include "envoy/type/matcher/v3/string.upb.h"
 #include "envoy/type/v3/percent.upb.h"
 #include "google/protobuf/struct.upb.h"
 #include "google/protobuf/wrappers.upb.h"
 #include "google/rpc/status.upb.h"
+#include "upb/text_encode.h"
 #include "upb/upb.h"
 
 namespace grpc_core {
 
+// TODO (donnadionne): Check to see if timeout is enabled, this will be
+// removed once timeout feature is fully integration-tested and enabled by
+// default.
+bool XdsTimeoutEnabled() {
+  char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT");
+  bool parsed_value;
+  bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
+  gpr_free(value);
+  return parse_succeeded && parsed_value;
+}
+
+// TODO(yashykt): Check to see if xDS security is enabled. This will be
+// removed once this feature is fully integration-tested and enabled by
+// default.
+bool XdsSecurityEnabled() {
+  char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT");
+  bool parsed_value;
+  bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
+  gpr_free(value);
+  return parse_succeeded && parsed_value;
+}
+
 //
 // XdsApi::Route::Matchers::PathMatcher
 //
 
 XdsApi::Route::Matchers::PathMatcher::PathMatcher(const PathMatcher& other)
-    : type(other.type) {
+    : type(other.type), case_sensitive(other.case_sensitive) {
   if (type == PathMatcherType::REGEX) {
-    regex_matcher = absl::make_unique<RE2>(other.regex_matcher->pattern());
+    RE2::Options options;
+    options.set_case_sensitive(case_sensitive);
+    regex_matcher =
+        absl::make_unique<RE2>(other.regex_matcher->pattern(), options);
   } else {
     string_matcher = other.string_matcher;
   }
@@ -93,8 +129,12 @@ XdsApi::Route::Matchers::PathMatcher::PathMatcher(const PathMatcher& other)
 XdsApi::Route::Matchers::PathMatcher& XdsApi::Route::Matchers::PathMatcher::
 operator=(const PathMatcher& other) {
   type = other.type;
+  case_sensitive = other.case_sensitive;
   if (type == PathMatcherType::REGEX) {
-    regex_matcher = absl::make_unique<RE2>(other.regex_matcher->pattern());
+    RE2::Options options;
+    options.set_case_sensitive(case_sensitive);
+    regex_matcher =
+        absl::make_unique<RE2>(other.regex_matcher->pattern(), options);
   } else {
     string_matcher = other.string_matcher;
   }
@@ -104,6 +144,7 @@ operator=(const PathMatcher& other) {
 bool XdsApi::Route::Matchers::PathMatcher::operator==(
     const PathMatcher& other) const {
   if (type != other.type) return false;
+  if (case_sensitive != other.case_sensitive) return false;
   if (type == PathMatcherType::REGEX) {
     // Should never be null.
     if (regex_matcher == nullptr || other.regex_matcher == nullptr) {
@@ -129,10 +170,11 @@ std::string XdsApi::Route::Matchers::PathMatcher::ToString() const {
     default:
       break;
   }
-  return absl::StrFormat("Path %s:%s", path_type_string,
+  return absl::StrFormat("Path %s:%s%s", path_type_string,
                          type == PathMatcherType::REGEX
                              ? regex_matcher->pattern()
-                             : string_matcher);
+                             : string_matcher,
+                         case_sensitive ? "" : "[case_sensitive=false]");
 }
 
 //
@@ -255,6 +297,9 @@ std::string XdsApi::Route::ToString() const {
   for (const ClusterWeight& cluster_weight : weighted_clusters) {
     contents.push_back(cluster_weight.ToString());
   }
+  if (max_stream_duration.has_value()) {
+    contents.push_back(max_stream_duration->ToString());
+  }
   return absl::StrJoin(contents, "\n");
 }
 
@@ -294,9 +339,11 @@ enum MatchType {
 };
 
 // Returns true if match succeeds.
-bool DomainMatch(MatchType match_type, std::string domain_pattern,
-                 std::string expected_host_name) {
+bool DomainMatch(MatchType match_type, const std::string& domain_pattern_in,
+                 const std::string& expected_host_name_in) {
   // Normalize the args to lower-case. Domain matching is case-insensitive.
+  std::string domain_pattern = domain_pattern_in;
+  std::string expected_host_name = expected_host_name_in;
   std::transform(domain_pattern.begin(), domain_pattern.end(),
                  domain_pattern.begin(),
                  [](unsigned char c) { return std::tolower(c); });
@@ -527,11 +574,10 @@ bool IsEds(absl::string_view type_url) {
 }  // namespace
 
 XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer,
-               const XdsBootstrap* bootstrap)
+               const XdsBootstrap::Node* node)
     : client_(client),
       tracer_(tracer),
-      use_v3_(bootstrap != nullptr && bootstrap->server().ShouldUseV3()),
-      bootstrap_(bootstrap),
+      node_(node),
       build_version_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING, " ",
                                   grpc_version_string())),
       user_agent_name_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING)) {}
@@ -632,11 +678,10 @@ void PopulateBuildVersion(upb_arena* arena, envoy_config_core_v3_Node* node_msg,
                       encoded_build_version.size(), arena);
 }
 
-void PopulateNode(upb_arena* arena, const XdsBootstrap* bootstrap,
+void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node, bool use_v3,
                   const std::string& build_version,
                   const std::string& user_agent_name,
                   envoy_config_core_v3_Node* node_msg) {
-  const XdsBootstrap::Node* node = bootstrap->node();
   if (node != nullptr) {
     if (!node->id.empty()) {
       envoy_config_core_v3_Node_set_id(node_msg,
@@ -669,7 +714,7 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap* bootstrap,
       }
     }
   }
-  if (!bootstrap->server().ShouldUseV3()) {
+  if (!use_v3) {
     PopulateBuildVersion(arena, node_msg, build_version);
   }
   envoy_config_core_v3_Node_set_user_agent_name(
@@ -689,172 +734,17 @@ inline std::string UpbStringToStdString(const upb_strview& str) {
   return std::string(str.data, str.size);
 }
 
-inline void AddStringField(const char* name, const upb_strview& value,
-                           std::vector<std::string>* fields,
-                           bool add_if_empty = false) {
-  if (value.size > 0 || add_if_empty) {
-    fields->emplace_back(
-        absl::StrCat(name, ": \"", UpbStringToAbsl(value), "\""));
-  }
-}
-
-inline void AddUInt32ValueField(const char* name,
-                                const google_protobuf_UInt32Value* value,
-                                std::vector<std::string>* fields) {
-  if (value != nullptr) {
-    fields->emplace_back(absl::StrCat(
-        name, " { value: ", google_protobuf_UInt32Value_value(value), " }"));
-  }
-}
-
-inline void AddLocalityField(int indent_level,
-                             const envoy_config_core_v3_Locality* locality,
-                             std::vector<std::string>* fields) {
-  std::string indent =
-      absl::StrJoin(std::vector<std::string>(indent_level, "  "), "");
-  // region
-  std::string field = absl::StrCat(indent, "region");
-  AddStringField(field.c_str(), envoy_config_core_v3_Locality_region(locality),
-                 fields);
-  // zone
-  field = absl::StrCat(indent, "zone");
-  AddStringField(field.c_str(), envoy_config_core_v3_Locality_zone(locality),
-                 fields);
-  // sub_zone
-  field = absl::StrCat(indent, "sub_zone");
-  AddStringField(field.c_str(),
-                 envoy_config_core_v3_Locality_sub_zone(locality), fields);
-}
-
-void AddNodeLogFields(const envoy_config_core_v3_Node* node,
-                      const std::string& build_version,
-                      std::vector<std::string>* fields) {
-  fields->emplace_back("node {");
-  // id
-  AddStringField("  id", envoy_config_core_v3_Node_id(node), fields);
-  // metadata
-  const google_protobuf_Struct* metadata =
-      envoy_config_core_v3_Node_metadata(node);
-  if (metadata != nullptr) {
-    fields->emplace_back("  metadata {");
-    size_t entry_idx = UPB_MAP_BEGIN;
-    while (true) {
-      const google_protobuf_Struct_FieldsEntry* entry =
-          google_protobuf_Struct_fields_next(metadata, &entry_idx);
-      if (entry == nullptr) break;
-      fields->emplace_back("    field {");
-      // key
-      AddStringField("      key", google_protobuf_Struct_FieldsEntry_key(entry),
-                     fields);
-      // value
-      const google_protobuf_Value* value =
-          google_protobuf_Struct_FieldsEntry_value(entry);
-      if (value != nullptr) {
-        std::string value_str;
-        if (google_protobuf_Value_has_string_value(value)) {
-          value_str = absl::StrCat(
-              "string_value: \"",
-              UpbStringToAbsl(google_protobuf_Value_string_value(value)), "\"");
-        } else if (google_protobuf_Value_has_null_value(value)) {
-          value_str = "null_value: NULL_VALUE";
-        } else if (google_protobuf_Value_has_number_value(value)) {
-          value_str = absl::StrCat("double_value: ",
-                                   google_protobuf_Value_number_value(value));
-        } else if (google_protobuf_Value_has_bool_value(value)) {
-          value_str = absl::StrCat("bool_value: ",
-                                   google_protobuf_Value_bool_value(value));
-        } else if (google_protobuf_Value_has_struct_value(value)) {
-          value_str = "struct_value: <not printed>";
-        } else if (google_protobuf_Value_has_list_value(value)) {
-          value_str = "list_value: <not printed>";
-        } else {
-          value_str = "<unknown>";
-        }
-        fields->emplace_back(absl::StrCat("      value { ", value_str, " }"));
-      }
-      fields->emplace_back("    }");
-    }
-    fields->emplace_back("  }");
-  }
-  // locality
-  const envoy_config_core_v3_Locality* locality =
-      envoy_config_core_v3_Node_locality(node);
-  if (locality != nullptr) {
-    fields->emplace_back("  locality {");
-    AddLocalityField(2, locality, fields);
-    fields->emplace_back("  }");
-  }
-  // build_version (doesn't exist in v3 proto; this is a horrible hack)
-  if (!build_version.empty()) {
-    fields->emplace_back(
-        absl::StrCat("  build_version: \"", build_version, "\""));
-  }
-  // user_agent_name
-  AddStringField("  user_agent_name",
-                 envoy_config_core_v3_Node_user_agent_name(node), fields);
-  // user_agent_version
-  AddStringField("  user_agent_version",
-                 envoy_config_core_v3_Node_user_agent_version(node), fields);
-  // client_features
-  size_t num_client_features;
-  const upb_strview* client_features =
-      envoy_config_core_v3_Node_client_features(node, &num_client_features);
-  for (size_t i = 0; i < num_client_features; ++i) {
-    AddStringField("  client_features", client_features[i], fields);
-  }
-  fields->emplace_back("}");
-}
-
 void MaybeLogDiscoveryRequest(
-    XdsClient* client, TraceFlag* tracer,
-    const envoy_service_discovery_v3_DiscoveryRequest* request,
-    const std::string& build_version) {
+    XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
+    const envoy_service_discovery_v3_DiscoveryRequest* request) {
   if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
       gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
-    // TODO(roth): When we can upgrade upb, use upb textformat code to dump
-    // the raw proto instead of doing this manually.
-    std::vector<std::string> fields;
-    // version_info
-    AddStringField(
-        "version_info",
-        envoy_service_discovery_v3_DiscoveryRequest_version_info(request),
-        &fields);
-    // node
-    const envoy_config_core_v3_Node* node =
-        envoy_service_discovery_v3_DiscoveryRequest_node(request);
-    if (node != nullptr) AddNodeLogFields(node, build_version, &fields);
-    // resource_names
-    size_t num_resource_names;
-    const upb_strview* resource_names =
-        envoy_service_discovery_v3_DiscoveryRequest_resource_names(
-            request, &num_resource_names);
-    for (size_t i = 0; i < num_resource_names; ++i) {
-      AddStringField("resource_names", resource_names[i], &fields);
-    }
-    // type_url
-    AddStringField(
-        "type_url",
-        envoy_service_discovery_v3_DiscoveryRequest_type_url(request), &fields);
-    // response_nonce
-    AddStringField(
-        "response_nonce",
-        envoy_service_discovery_v3_DiscoveryRequest_response_nonce(request),
-        &fields);
-    // error_detail
-    const struct google_rpc_Status* error_detail =
-        envoy_service_discovery_v3_DiscoveryRequest_error_detail(request);
-    if (error_detail != nullptr) {
-      fields.emplace_back("error_detail {");
-      // code
-      int32_t code = google_rpc_Status_code(error_detail);
-      if (code != 0) fields.emplace_back(absl::StrCat("  code: ", code));
-      // message
-      AddStringField("  message", google_rpc_Status_message(error_detail),
-                     &fields);
-      fields.emplace_back("}");
-    }
+    const upb_msgdef* msg_type =
+        envoy_service_discovery_v3_DiscoveryRequest_getmsgdef(symtab);
+    char buf[10240];
+    upb_text_encode(request, msg_type, nullptr, 0, buf, sizeof(buf));
     gpr_log(GPR_DEBUG, "[xds_client %p] constructed ADS request: %s", client,
-            absl::StrJoin(fields, "\n").c_str());
+            buf);
   }
 }
 
@@ -888,7 +778,7 @@ absl::string_view TypeUrlExternalToInternal(bool use_v3,
 }  // namespace
 
 grpc_slice XdsApi::CreateAdsRequest(
-    const std::string& type_url,
+    const XdsBootstrap::XdsServer& server, const std::string& type_url,
     const std::set<absl::string_view>& resource_names,
     const std::string& version, const std::string& nonce, grpc_error* error,
     bool populate_node) {
@@ -898,7 +788,7 @@ grpc_slice XdsApi::CreateAdsRequest(
       envoy_service_discovery_v3_DiscoveryRequest_new(arena.ptr());
   // Set type_url.
   absl::string_view real_type_url =
-      TypeUrlExternalToInternal(use_v3_, type_url);
+      TypeUrlExternalToInternal(server.ShouldUseV3(), type_url);
   envoy_service_discovery_v3_DiscoveryRequest_set_type_url(
       request, StdStringToUpbString(real_type_url));
   // Set version_info.
@@ -913,16 +803,20 @@ grpc_slice XdsApi::CreateAdsRequest(
   }
   // Set error_detail if it's a NACK.
   if (error != GRPC_ERROR_NONE) {
+    google_rpc_Status* error_detail =
+        envoy_service_discovery_v3_DiscoveryRequest_mutable_error_detail(
+            request, arena.ptr());
+    // Hard-code INVALID_ARGUMENT as the status code.
+    // TODO(roth): If at some point we decide we care about this value,
+    // we could attach a status code to the individual errors where we
+    // generate them in the parsing code, and then use that here.
+    google_rpc_Status_set_code(error_detail, GRPC_STATUS_INVALID_ARGUMENT);
+    // Error description comes from the error that was passed in.
     grpc_slice error_description_slice;
     GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION,
                                   &error_description_slice));
     upb_strview error_description_strview =
-        upb_strview_make(reinterpret_cast<const char*>(
-                             GPR_SLICE_START_PTR(error_description_slice)),
-                         GPR_SLICE_LENGTH(error_description_slice));
-    google_rpc_Status* error_detail =
-        envoy_service_discovery_v3_DiscoveryRequest_mutable_error_detail(
-            request, arena.ptr());
+        StdStringToUpbString(StringViewFromSlice(error_description_slice));
     google_rpc_Status_set_message(error_detail, error_description_strview);
     GRPC_ERROR_UNREF(error);
   }
@@ -931,401 +825,84 @@ grpc_slice XdsApi::CreateAdsRequest(
     envoy_config_core_v3_Node* node_msg =
         envoy_service_discovery_v3_DiscoveryRequest_mutable_node(request,
                                                                  arena.ptr());
-    PopulateNode(arena.ptr(), bootstrap_, build_version_, user_agent_name_,
-                 node_msg);
+    PopulateNode(arena.ptr(), node_, server.ShouldUseV3(), build_version_,
+                 user_agent_name_, node_msg);
   }
   // Add resource_names.
   for (const auto& resource_name : resource_names) {
     envoy_service_discovery_v3_DiscoveryRequest_add_resource_names(
         request, StdStringToUpbString(resource_name), arena.ptr());
   }
-  MaybeLogDiscoveryRequest(client_, tracer_, request, build_version_);
+  MaybeLogDiscoveryRequest(client_, tracer_, symtab_.ptr(), request);
   return SerializeDiscoveryRequest(arena.ptr(), request);
 }
 
 namespace {
 
 void MaybeLogDiscoveryResponse(
-    XdsClient* client, TraceFlag* tracer,
+    XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
     const envoy_service_discovery_v3_DiscoveryResponse* response) {
   if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
       gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
-    // TODO(roth): When we can upgrade upb, use upb textformat code to dump
-    // the raw proto instead of doing this manually.
-    std::vector<std::string> fields;
-    // version_info
-    AddStringField(
-        "version_info",
-        envoy_service_discovery_v3_DiscoveryResponse_version_info(response),
-        &fields);
-    // resources
-    size_t num_resources;
-    envoy_service_discovery_v3_DiscoveryResponse_resources(response,
-                                                           &num_resources);
-    fields.emplace_back(
-        absl::StrCat("resources: <", num_resources, " element(s)>"));
-    // type_url
-    AddStringField(
-        "type_url",
-        envoy_service_discovery_v3_DiscoveryResponse_type_url(response),
-        &fields);
-    // nonce
-    AddStringField("nonce",
-                   envoy_service_discovery_v3_DiscoveryResponse_nonce(response),
-                   &fields);
-    gpr_log(GPR_DEBUG, "[xds_client %p] received response: %s", client,
-            absl::StrJoin(fields, "\n").c_str());
+    const upb_msgdef* msg_type =
+        envoy_service_discovery_v3_DiscoveryResponse_getmsgdef(symtab);
+    char buf[10240];
+    upb_text_encode(response, msg_type, nullptr, 0, buf, sizeof(buf));
+    gpr_log(GPR_DEBUG, "[xds_client %p] received response: %s", client, buf);
   }
 }
 
 void MaybeLogRouteConfiguration(
-    XdsClient* client, TraceFlag* tracer,
+    XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
     const envoy_config_route_v3_RouteConfiguration* route_config) {
   if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
       gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
-    // TODO(roth): When we can upgrade upb, use upb textformat code to dump
-    // the raw proto instead of doing this manually.
-    std::vector<std::string> fields;
-    // name
-    AddStringField("name",
-                   envoy_config_route_v3_RouteConfiguration_name(route_config),
-                   &fields);
-    // virtual_hosts
-    size_t num_virtual_hosts;
-    const envoy_config_route_v3_VirtualHost* const* virtual_hosts =
-        envoy_config_route_v3_RouteConfiguration_virtual_hosts(
-            route_config, &num_virtual_hosts);
-    for (size_t i = 0; i < num_virtual_hosts; ++i) {
-      const auto* virtual_host = virtual_hosts[i];
-      fields.push_back("virtual_hosts {");
-      // name
-      AddStringField("  name",
-                     envoy_config_route_v3_VirtualHost_name(virtual_host),
-                     &fields);
-      // domains
-      size_t num_domains;
-      const upb_strview* const domains =
-          envoy_config_route_v3_VirtualHost_domains(virtual_host, &num_domains);
-      for (size_t j = 0; j < num_domains; ++j) {
-        AddStringField("  domains", domains[j], &fields);
-      }
-      // routes
-      size_t num_routes;
-      const envoy_config_route_v3_Route* const* routes =
-          envoy_config_route_v3_VirtualHost_routes(virtual_host, &num_routes);
-      for (size_t j = 0; j < num_routes; ++j) {
-        const auto* route = routes[j];
-        fields.push_back("  route {");
-        // name
-        AddStringField("    name", envoy_config_route_v3_Route_name(route),
-                       &fields);
-        // match
-        const envoy_config_route_v3_RouteMatch* match =
-            envoy_config_route_v3_Route_match(route);
-        if (match != nullptr) {
-          fields.emplace_back("    match {");
-          // path matching
-          if (envoy_config_route_v3_RouteMatch_has_prefix(match)) {
-            AddStringField("      prefix",
-                           envoy_config_route_v3_RouteMatch_prefix(match),
-                           &fields,
-                           /*add_if_empty=*/true);
-          } else if (envoy_config_route_v3_RouteMatch_has_path(match)) {
-            AddStringField("      path",
-                           envoy_config_route_v3_RouteMatch_path(match),
-                           &fields,
-                           /*add_if_empty=*/true);
-          } else if (envoy_config_route_v3_RouteMatch_has_safe_regex(match)) {
-            fields.emplace_back("      safe_regex: <not printed>");
-          } else {
-            fields.emplace_back("      <unknown path matching type>");
-          }
-          // header matching
-          size_t num_headers;
-          envoy_config_route_v3_RouteMatch_headers(match, &num_headers);
-          if (num_headers > 0) {
-            fields.emplace_back(
-                absl::StrCat("      headers: <", num_headers, " element(s)>"));
-          }
-          fields.emplace_back("    }");
-        }
-        // action
-        if (envoy_config_route_v3_Route_has_route(route)) {
-          const envoy_config_route_v3_RouteAction* action =
-              envoy_config_route_v3_Route_route(route);
-          fields.emplace_back("    route {");
-          if (envoy_config_route_v3_RouteAction_has_cluster(action)) {
-            AddStringField("      cluster",
-                           envoy_config_route_v3_RouteAction_cluster(action),
-                           &fields);
-          } else if (envoy_config_route_v3_RouteAction_has_cluster_header(
-                         action)) {
-            AddStringField(
-                "      cluster_header",
-                envoy_config_route_v3_RouteAction_cluster_header(action),
-                &fields);
-          } else if (envoy_config_route_v3_RouteAction_has_weighted_clusters(
-                         action)) {
-            const envoy_config_route_v3_WeightedCluster* weighted_clusters =
-                envoy_config_route_v3_RouteAction_weighted_clusters(action);
-            fields.emplace_back("      weighted_clusters {");
-            size_t num_cluster_weights;
-            const envoy_config_route_v3_WeightedCluster_ClusterWeight* const*
-                cluster_weights =
-                    envoy_config_route_v3_WeightedCluster_clusters(
-                        weighted_clusters, &num_cluster_weights);
-            for (size_t i = 0; i < num_cluster_weights; ++i) {
-              const envoy_config_route_v3_WeightedCluster_ClusterWeight*
-                  cluster_weight = cluster_weights[i];
-              fields.emplace_back("        clusters {");
-              AddStringField(
-                  "          name",
-                  envoy_config_route_v3_WeightedCluster_ClusterWeight_name(
-                      cluster_weight),
-                  &fields);
-              AddUInt32ValueField(
-                  "          weight",
-                  envoy_config_route_v3_WeightedCluster_ClusterWeight_weight(
-                      cluster_weight),
-                  &fields);
-              fields.emplace_back("        }");
-            }
-            AddUInt32ValueField(
-                "        total_weight",
-                envoy_config_route_v3_WeightedCluster_total_weight(
-                    weighted_clusters),
-                &fields);
-            fields.emplace_back("      }");
-          }
-          fields.emplace_back("    }");
-        } else if (envoy_config_route_v3_Route_has_redirect(route)) {
-          fields.emplace_back("    redirect: <not printed>");
-        } else if (envoy_config_route_v3_Route_has_direct_response(route)) {
-          fields.emplace_back("    direct_response: <not printed>");
-        } else if (envoy_config_route_v3_Route_has_filter_action(route)) {
-          fields.emplace_back("    filter_action: <not printed>");
-        }
-        fields.push_back("  }");
-      }
-      fields.push_back("}");
-    }
-    gpr_log(GPR_DEBUG, "[xds_client %p] RouteConfiguration: %s", client,
-            absl::StrJoin(fields, "\n").c_str());
+    const upb_msgdef* msg_type =
+        envoy_config_route_v3_RouteConfiguration_getmsgdef(symtab);
+    char buf[10240];
+    upb_text_encode(route_config, msg_type, nullptr, 0, buf, sizeof(buf));
+    gpr_log(GPR_DEBUG, "[xds_client %p] RouteConfiguration: %s", client, buf);
   }
 }
 
-void MaybeLogCluster(XdsClient* client, TraceFlag* tracer,
+void MaybeLogCluster(XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
                      const envoy_config_cluster_v3_Cluster* cluster) {
   if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
       gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
-    // TODO(roth): When we can upgrade upb, use upb textformat code to dump
-    // the raw proto instead of doing this manually.
-    std::vector<std::string> fields;
-    // name
-    AddStringField("name", envoy_config_cluster_v3_Cluster_name(cluster),
-                   &fields);
-    // type
-    if (envoy_config_cluster_v3_Cluster_has_type(cluster)) {
-      fields.emplace_back(absl::StrCat(
-          "type: ", envoy_config_cluster_v3_Cluster_type(cluster)));
-    } else if (envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
-      fields.emplace_back("cluster_type: <not printed>");
-    } else {
-      fields.emplace_back("<unknown type>");
-    }
-    // eds_cluster_config
-    const envoy_config_cluster_v3_Cluster_EdsClusterConfig* eds_cluster_config =
-        envoy_config_cluster_v3_Cluster_eds_cluster_config(cluster);
-    if (eds_cluster_config != nullptr) {
-      fields.emplace_back("eds_cluster_config {");
-      // eds_config
-      const struct envoy_config_core_v3_ConfigSource* eds_config =
-          envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(
-              eds_cluster_config);
-      if (eds_config != nullptr) {
-        if (envoy_config_core_v3_ConfigSource_has_ads(eds_config)) {
-          fields.emplace_back("  eds_config { ads {} }");
-        } else {
-          fields.emplace_back("  eds_config: <non-ADS type>");
-        }
-      }
-      // service_name
-      AddStringField(
-          "  service_name",
-          envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(
-              eds_cluster_config),
-          &fields);
-      fields.emplace_back("}");
-    }
-    // lb_policy
-    fields.emplace_back(absl::StrCat(
-        "lb_policy: ", envoy_config_cluster_v3_Cluster_lb_policy(cluster)));
-    // lrs_server
-    const envoy_config_core_v3_ConfigSource* lrs_server =
-        envoy_config_cluster_v3_Cluster_lrs_server(cluster);
-    if (lrs_server != nullptr) {
-      if (envoy_config_core_v3_ConfigSource_has_self(lrs_server)) {
-        fields.emplace_back("lrs_server { self {} }");
-      } else {
-        fields.emplace_back("lrs_server: <non-self type>");
-      }
-    }
-    gpr_log(GPR_DEBUG, "[xds_client %p] Cluster: %s", client,
-            absl::StrJoin(fields, "\n").c_str());
+    const upb_msgdef* msg_type =
+        envoy_config_cluster_v3_Cluster_getmsgdef(symtab);
+    char buf[10240];
+    upb_text_encode(cluster, msg_type, nullptr, 0, buf, sizeof(buf));
+    gpr_log(GPR_DEBUG, "[xds_client %p] Cluster: %s", client, buf);
   }
 }
 
 void MaybeLogClusterLoadAssignment(
-    XdsClient* client, TraceFlag* tracer,
+    XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
     const envoy_config_endpoint_v3_ClusterLoadAssignment* cla) {
   if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
       gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
-    // TODO(roth): When we can upgrade upb, use upb textformat code to dump
-    // the raw proto instead of doing this manually.
-    std::vector<std::string> fields;
-    // cluster_name
-    AddStringField(
-        "cluster_name",
-        envoy_config_endpoint_v3_ClusterLoadAssignment_cluster_name(cla),
-        &fields);
-    // endpoints
-    size_t num_localities;
-    const struct envoy_config_endpoint_v3_LocalityLbEndpoints* const*
-        locality_endpoints =
-            envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(
-                cla, &num_localities);
-    for (size_t i = 0; i < num_localities; ++i) {
-      const auto* locality_endpoint = locality_endpoints[i];
-      fields.emplace_back("endpoints {");
-      // locality
-      const auto* locality =
-          envoy_config_endpoint_v3_LocalityLbEndpoints_locality(
-              locality_endpoint);
-      if (locality != nullptr) {
-        fields.emplace_back("  locality {");
-        AddLocalityField(2, locality, &fields);
-        fields.emplace_back("  }");
-      }
-      // lb_endpoints
-      size_t num_lb_endpoints;
-      const envoy_config_endpoint_v3_LbEndpoint* const* lb_endpoints =
-          envoy_config_endpoint_v3_LocalityLbEndpoints_lb_endpoints(
-              locality_endpoint, &num_lb_endpoints);
-      for (size_t j = 0; j < num_lb_endpoints; ++j) {
-        const auto* lb_endpoint = lb_endpoints[j];
-        fields.emplace_back("  lb_endpoints {");
-        // health_status
-        uint32_t health_status =
-            envoy_config_endpoint_v3_LbEndpoint_health_status(lb_endpoint);
-        if (health_status > 0) {
-          fields.emplace_back(
-              absl::StrCat("    health_status: ", health_status));
-        }
-        // endpoint
-        const envoy_config_endpoint_v3_Endpoint* endpoint =
-            envoy_config_endpoint_v3_LbEndpoint_endpoint(lb_endpoint);
-        if (endpoint != nullptr) {
-          fields.emplace_back("    endpoint {");
-          // address
-          const auto* address =
-              envoy_config_endpoint_v3_Endpoint_address(endpoint);
-          if (address != nullptr) {
-            fields.emplace_back("      address {");
-            // socket_address
-            const auto* socket_address =
-                envoy_config_core_v3_Address_socket_address(address);
-            if (socket_address != nullptr) {
-              fields.emplace_back("        socket_address {");
-              // address
-              AddStringField(
-                  "          address",
-                  envoy_config_core_v3_SocketAddress_address(socket_address),
-                  &fields);
-              // port_value
-              if (envoy_config_core_v3_SocketAddress_has_port_value(
-                      socket_address)) {
-                fields.emplace_back(
-                    absl::StrCat("          port_value: ",
-                                 envoy_config_core_v3_SocketAddress_port_value(
-                                     socket_address)));
-              } else {
-                fields.emplace_back("        <non-numeric port>");
-              }
-              fields.emplace_back("        }");
-            } else {
-              fields.emplace_back("        <non-socket address>");
-            }
-            fields.emplace_back("      }");
-          }
-          fields.emplace_back("    }");
-        }
-        fields.emplace_back("  }");
-      }
-      // load_balancing_weight
-      AddUInt32ValueField(
-          "  load_balancing_weight",
-          envoy_config_endpoint_v3_LocalityLbEndpoints_load_balancing_weight(
-              locality_endpoint),
-          &fields);
-      // priority
-      uint32_t priority = envoy_config_endpoint_v3_LocalityLbEndpoints_priority(
-          locality_endpoint);
-      if (priority > 0) {
-        fields.emplace_back(absl::StrCat("  priority: ", priority));
-      }
-      fields.emplace_back("}");
-    }
-    // policy
-    const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy* policy =
-        envoy_config_endpoint_v3_ClusterLoadAssignment_policy(cla);
-    if (policy != nullptr) {
-      fields.emplace_back("policy {");
-      // drop_overloads
-      size_t num_drop_overloads;
-      const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload* const*
-          drop_overloads =
-              envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_drop_overloads(
-                  policy, &num_drop_overloads);
-      for (size_t i = 0; i < num_drop_overloads; ++i) {
-        auto* drop_overload = drop_overloads[i];
-        fields.emplace_back("  drop_overloads {");
-        // category
-        AddStringField(
-            "    category",
-            envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_category(
-                drop_overload),
-            &fields);
-        // drop_percentage
-        const auto* drop_percentage =
-            envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_drop_percentage(
-                drop_overload);
-        if (drop_percentage != nullptr) {
-          fields.emplace_back("    drop_percentage {");
-          fields.emplace_back(absl::StrCat(
-              "      numerator: ",
-              envoy_type_v3_FractionalPercent_numerator(drop_percentage)));
-          fields.emplace_back(absl::StrCat(
-              "      denominator: ",
-              envoy_type_v3_FractionalPercent_denominator(drop_percentage)));
-          fields.emplace_back("    }");
-        }
-        fields.emplace_back("  }");
-      }
-      // overprovisioning_factor
-      fields.emplace_back("}");
-    }
+    const upb_msgdef* msg_type =
+        envoy_config_endpoint_v3_ClusterLoadAssignment_getmsgdef(symtab);
+    char buf[10240];
+    upb_text_encode(cla, msg_type, nullptr, 0, buf, sizeof(buf));
     gpr_log(GPR_DEBUG, "[xds_client %p] ClusterLoadAssignment: %s", client,
-            absl::StrJoin(fields, "\n").c_str());
+            buf);
   }
 }
 
 grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
                                 XdsApi::Route* route, bool* ignore_route) {
+  auto* case_sensitive = envoy_config_route_v3_RouteMatch_case_sensitive(match);
+  if (case_sensitive != nullptr) {
+    route->matchers.path_matcher.case_sensitive =
+        google_protobuf_BoolValue_value(case_sensitive);
+  }
   if (envoy_config_route_v3_RouteMatch_has_prefix(match)) {
     absl::string_view prefix =
         UpbStringToAbsl(envoy_config_route_v3_RouteMatch_prefix(match));
     // Empty prefix "" is accepted.
-    if (prefix.size() > 0) {
+    if (!prefix.empty()) {
       // Prefix "/" is accepted.
       if (prefix[0] != '/') {
         // Prefix which does not start with a / will never match anything, so
@@ -1351,7 +928,7 @@ grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
   } else if (envoy_config_route_v3_RouteMatch_has_path(match)) {
     absl::string_view path =
         UpbStringToAbsl(envoy_config_route_v3_RouteMatch_path(match));
-    if (path.size() == 0) {
+    if (path.empty()) {
       // Path that is empty will never match anything, so ignore this route.
       *ignore_route = true;
       return GRPC_ERROR_NONE;
@@ -1389,7 +966,9 @@ grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
     GPR_ASSERT(regex_matcher != nullptr);
     std::string matcher = UpbStringToStdString(
         envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
-    std::unique_ptr<RE2> regex = absl::make_unique<RE2>(std::move(matcher));
+    RE2::Options options;
+    options.set_case_sensitive(route->matchers.path_matcher.case_sensitive);
+    auto regex = absl::make_unique<RE2>(std::move(matcher), options);
     if (!regex->ok()) {
       return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
           "Invalid regex string specified in path matcher.");
@@ -1518,7 +1097,7 @@ grpc_error* RouteActionParse(const envoy_config_route_v3_Route* route_msg,
   if (envoy_config_route_v3_RouteAction_has_cluster(route_action)) {
     route->cluster_name = UpbStringToStdString(
         envoy_config_route_v3_RouteAction_cluster(route_action));
-    if (route->cluster_name.size() == 0) {
+    if (route->cluster_name.empty()) {
       return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
           "RouteAction cluster contains empty cluster name.");
     }
@@ -1571,16 +1150,36 @@ grpc_error* RouteActionParse(const envoy_config_route_v3_Route* route_msg,
   } else {
     // No cluster or weighted_clusters found in RouteAction, ignore this route.
     *ignore_route = true;
-    return GRPC_ERROR_NONE;
+  }
+  if (XdsTimeoutEnabled() && !*ignore_route) {
+    const envoy_config_route_v3_RouteAction_MaxStreamDuration*
+        max_stream_duration =
+            envoy_config_route_v3_RouteAction_max_stream_duration(route_action);
+    if (max_stream_duration != nullptr) {
+      const google_protobuf_Duration* duration =
+          envoy_config_route_v3_RouteAction_MaxStreamDuration_grpc_timeout_header_max(
+              max_stream_duration);
+      if (duration == nullptr) {
+        duration =
+            envoy_config_route_v3_RouteAction_MaxStreamDuration_max_stream_duration(
+                max_stream_duration);
+      }
+      if (duration != nullptr) {
+        XdsApi::Duration duration_in_route;
+        duration_in_route.seconds = google_protobuf_Duration_seconds(duration);
+        duration_in_route.nanos = google_protobuf_Duration_nanos(duration);
+        route->max_stream_duration = duration_in_route;
+      }
+    }
   }
   return GRPC_ERROR_NONE;
 }
 
 grpc_error* RouteConfigParse(
-    XdsClient* client, TraceFlag* tracer,
+    XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
     const envoy_config_route_v3_RouteConfiguration* route_config,
     XdsApi::RdsUpdate* rds_update) {
-  MaybeLogRouteConfiguration(client, tracer, route_config);
+  MaybeLogRouteConfiguration(client, tracer, symtab, route_config);
   // Get the virtual hosts.
   size_t size;
   const envoy_config_route_v3_VirtualHost* const* virtual_hosts =
@@ -1636,13 +1235,6 @@ grpc_error* RouteConfigParse(
       error = RouteActionParse(routes[j], &route, &ignore_route);
       if (error != GRPC_ERROR_NONE) return error;
       if (ignore_route) continue;
-      const google_protobuf_BoolValue* case_sensitive =
-          envoy_config_route_v3_RouteMatch_case_sensitive(match);
-      if (case_sensitive != nullptr &&
-          !google_protobuf_BoolValue_value(case_sensitive)) {
-        return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-            "case_sensitive if set must be set to true.");
-      }
       vhost.routes.emplace_back(std::move(route));
     }
     if (vhost.routes.empty()) {
@@ -1653,7 +1245,7 @@ grpc_error* RouteConfigParse(
 }
 
 grpc_error* LdsResponseParse(
-    XdsClient* client, TraceFlag* tracer,
+    XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
     const envoy_service_discovery_v3_DiscoveryResponse* response,
     const std::set<absl::string_view>& expected_listener_names,
     XdsApi::LdsUpdateMap* lds_update_map, upb_arena* arena) {
@@ -1708,6 +1300,23 @@ grpc_error* LdsResponseParse(
       return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
           "Could not parse HttpConnectionManager config from ApiListener");
     }
+    if (XdsTimeoutEnabled()) {
+      // Obtain max_stream_duration from Http Protocol Options.
+      const envoy_config_core_v3_HttpProtocolOptions* options =
+          envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_common_http_protocol_options(
+              http_connection_manager);
+      if (options != nullptr) {
+        const google_protobuf_Duration* duration =
+            envoy_config_core_v3_HttpProtocolOptions_max_stream_duration(
+                options);
+        if (duration != nullptr) {
+          lds_update.http_max_stream_duration.seconds =
+              google_protobuf_Duration_seconds(duration);
+          lds_update.http_max_stream_duration.nanos =
+              google_protobuf_Duration_nanos(duration);
+        }
+      }
+    }
     // Found inlined route_config. Parse it to find the cluster_name.
     if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(
             http_connection_manager)) {
@@ -1716,7 +1325,7 @@ grpc_error* LdsResponseParse(
               http_connection_manager);
       XdsApi::RdsUpdate rds_update;
       grpc_error* error =
-          RouteConfigParse(client, tracer, route_config, &rds_update);
+          RouteConfigParse(client, tracer, symtab, route_config, &rds_update);
       if (error != GRPC_ERROR_NONE) return error;
       lds_update.rds_update = std::move(rds_update);
       continue;
@@ -1751,7 +1360,7 @@ grpc_error* LdsResponseParse(
 }
 
 grpc_error* RdsResponseParse(
-    XdsClient* client, TraceFlag* tracer,
+    XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
     const envoy_service_discovery_v3_DiscoveryResponse* response,
     const std::set<absl::string_view>& expected_route_configuration_names,
     XdsApi::RdsUpdateMap* rds_update_map, upb_arena* arena) {
@@ -1793,12 +1402,25 @@ grpc_error* RdsResponseParse(
     XdsApi::RdsUpdate& rds_update =
         (*rds_update_map)[std::move(route_config_name)];
     grpc_error* error =
-        RouteConfigParse(client, tracer, route_config, &rds_update);
+        RouteConfigParse(client, tracer, symtab, route_config, &rds_update);
     if (error != GRPC_ERROR_NONE) return error;
   }
   return GRPC_ERROR_NONE;
 }
 
+XdsApi::CommonTlsContext::CertificateProviderInstance
+CertificateProviderInstanceParse(
+    const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance*
+        certificate_provider_instance_proto) {
+  return {
+      UpbStringToStdString(
+          envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_instance_name(
+              certificate_provider_instance_proto)),
+      UpbStringToStdString(
+          envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_certificate_name(
+              certificate_provider_instance_proto))};
+}
+
 grpc_error* CommonTlsContextParse(
     const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext*
         common_tls_context_proto,
@@ -1868,25 +1490,24 @@ grpc_error* CommonTlsContextParse(
             combined_validation_context);
     if (validation_context_certificate_provider_instance != nullptr) {
       common_tls_context->combined_validation_context
-          .validation_context_certificate_provider_instance = UpbStringToStdString(
-          envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_instance_name(
-              validation_context_certificate_provider_instance));
+          .validation_context_certificate_provider_instance =
+          CertificateProviderInstanceParse(
+              validation_context_certificate_provider_instance);
     }
   }
   auto* tls_certificate_certificate_provider_instance =
       envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_tls_certificate_certificate_provider_instance(
           common_tls_context_proto);
   if (tls_certificate_certificate_provider_instance != nullptr) {
-    common_tls_context
-        ->tls_certificate_certificate_provider_instance = UpbStringToStdString(
-        envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_instance_name(
-            tls_certificate_certificate_provider_instance));
+    common_tls_context->tls_certificate_certificate_provider_instance =
+        CertificateProviderInstanceParse(
+            tls_certificate_certificate_provider_instance);
   }
   return GRPC_ERROR_NONE;
 }
 
 grpc_error* CdsResponseParse(
-    XdsClient* client, TraceFlag* tracer,
+    XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
     const envoy_service_discovery_v3_DiscoveryResponse* response,
     const std::set<absl::string_view>& expected_cluster_names,
     XdsApi::CdsUpdateMap* cds_update_map, upb_arena* arena) {
@@ -1910,7 +1531,7 @@ grpc_error* CdsResponseParse(
     if (cluster == nullptr) {
       return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode cluster.");
     }
-    MaybeLogCluster(client, tracer, cluster);
+    MaybeLogCluster(client, tracer, symtab, cluster);
     // Ignore unexpected cluster names.
     std::string cluster_name =
         UpbStringToStdString(envoy_config_cluster_v3_Cluster_name(cluster));
@@ -1956,33 +1577,36 @@ grpc_error* CdsResponseParse(
       return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
           "LB policy is not ROUND_ROBIN.");
     }
-    // Record Upstream tls context
-    auto* transport_socket =
-        envoy_config_cluster_v3_Cluster_transport_socket(cluster);
-    if (transport_socket != nullptr) {
-      absl::string_view name = UpbStringToAbsl(
-          envoy_config_core_v3_TransportSocket_name(transport_socket));
-      if (name == "tls") {
-        auto* typed_config =
-            envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
-        if (typed_config != nullptr) {
-          const upb_strview encoded_upstream_tls_context =
-              google_protobuf_Any_value(typed_config);
-          auto* upstream_tls_context =
-              envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
-                  encoded_upstream_tls_context.data,
-                  encoded_upstream_tls_context.size, arena);
-          if (upstream_tls_context == nullptr) {
-            return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-                "Can't decode upstream tls context.");
-          }
-          auto* common_tls_context =
-              envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
-                  upstream_tls_context);
-          if (common_tls_context != nullptr) {
-            grpc_error* error = CommonTlsContextParse(
-                common_tls_context, &cds_update.common_tls_context);
-            if (error != GRPC_ERROR_NONE) return error;
+    if (XdsSecurityEnabled()) {
+      // Record Upstream tls context
+      auto* transport_socket =
+          envoy_config_cluster_v3_Cluster_transport_socket(cluster);
+      if (transport_socket != nullptr) {
+        absl::string_view name = UpbStringToAbsl(
+            envoy_config_core_v3_TransportSocket_name(transport_socket));
+        if (name == "envoy.transport_sockets.tls") {
+          auto* typed_config =
+              envoy_config_core_v3_TransportSocket_typed_config(
+                  transport_socket);
+          if (typed_config != nullptr) {
+            const upb_strview encoded_upstream_tls_context =
+                google_protobuf_Any_value(typed_config);
+            auto* upstream_tls_context =
+                envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
+                    encoded_upstream_tls_context.data,
+                    encoded_upstream_tls_context.size, arena);
+            if (upstream_tls_context == nullptr) {
+              return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+                  "Can't decode upstream tls context.");
+            }
+            auto* common_tls_context =
+                envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
+                    upstream_tls_context);
+            if (common_tls_context != nullptr) {
+              grpc_error* error = CommonTlsContextParse(
+                  common_tls_context, &cds_update.common_tls_context);
+              if (error != GRPC_ERROR_NONE) return error;
+            }
           }
         }
       }
@@ -2107,7 +1731,7 @@ grpc_error* DropParseAndAppend(
   std::string category = UpbStringToStdString(
       envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_category(
           drop_overload));
-  if (category.size() == 0) {
+  if (category.empty()) {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty drop category name");
   }
   // Get the drop rate (per million).
@@ -2139,7 +1763,7 @@ grpc_error* DropParseAndAppend(
 }
 
 grpc_error* EdsResponseParse(
-    XdsClient* client, TraceFlag* tracer,
+    XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
     const envoy_service_discovery_v3_DiscoveryResponse* response,
     const std::set<absl::string_view>& expected_eds_service_names,
     XdsApi::EdsUpdateMap* eds_update_map, upb_arena* arena) {
@@ -2165,7 +1789,8 @@ grpc_error* EdsResponseParse(
       return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
           "Can't parse cluster_load_assignment.");
     }
-    MaybeLogClusterLoadAssignment(client, tracer, cluster_load_assignment);
+    MaybeLogClusterLoadAssignment(client, tracer, symtab,
+                                  cluster_load_assignment);
     // Check the EDS service name.  Ignore unexpected names.
     std::string eds_service_name = UpbStringToStdString(
         envoy_config_endpoint_v3_ClusterLoadAssignment_cluster_name(
@@ -2263,7 +1888,7 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
         GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode DiscoveryResponse.");
     return result;
   }
-  MaybeLogDiscoveryResponse(client_, tracer_, response);
+  MaybeLogDiscoveryResponse(client_, tracer_, symtab_.ptr(), response);
   // Record the type_url, the version_info, and the nonce of the response.
   result.type_url = TypeUrlInternalToExternal(UpbStringToAbsl(
       envoy_service_discovery_v3_DiscoveryResponse_type_url(response)));
@@ -2273,21 +1898,22 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
       envoy_service_discovery_v3_DiscoveryResponse_nonce(response));
   // Parse the response according to the resource type.
   if (IsLds(result.type_url)) {
-    result.parse_error =
-        LdsResponseParse(client_, tracer_, response, expected_listener_names,
-                         &result.lds_update_map, arena.ptr());
+    result.parse_error = LdsResponseParse(client_, tracer_, symtab_.ptr(),
+                                          response, expected_listener_names,
+                                          &result.lds_update_map, arena.ptr());
   } else if (IsRds(result.type_url)) {
-    result.parse_error = RdsResponseParse(client_, tracer_, response,
-                                          expected_route_configuration_names,
-                                          &result.rds_update_map, arena.ptr());
-  } else if (IsCds(result.type_url)) {
     result.parse_error =
-        CdsResponseParse(client_, tracer_, response, expected_cluster_names,
-                         &result.cds_update_map, arena.ptr());
+        RdsResponseParse(client_, tracer_, symtab_.ptr(), response,
+                         expected_route_configuration_names,
+                         &result.rds_update_map, arena.ptr());
+  } else if (IsCds(result.type_url)) {
+    result.parse_error = CdsResponseParse(client_, tracer_, symtab_.ptr(),
+                                          response, expected_cluster_names,
+                                          &result.cds_update_map, arena.ptr());
   } else if (IsEds(result.type_url)) {
-    result.parse_error =
-        EdsResponseParse(client_, tracer_, response, expected_eds_service_names,
-                         &result.eds_update_map, arena.ptr());
+    result.parse_error = EdsResponseParse(client_, tracer_, symtab_.ptr(),
+                                          response, expected_eds_service_names,
+                                          &result.eds_update_map, arena.ptr());
   }
   return result;
 }
@@ -2295,120 +1921,16 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
 namespace {
 
 void MaybeLogLrsRequest(
-    XdsClient* client, TraceFlag* tracer,
-    const envoy_service_load_stats_v3_LoadStatsRequest* request,
-    const std::string& build_version) {
+    XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
+    const envoy_service_load_stats_v3_LoadStatsRequest* request) {
   if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
       gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
-    // TODO(roth): When we can upgrade upb, use upb textformat code to dump
-    // the raw proto instead of doing this manually.
-    std::vector<std::string> fields;
-    // node
-    const auto* node =
-        envoy_service_load_stats_v3_LoadStatsRequest_node(request);
-    if (node != nullptr) {
-      AddNodeLogFields(node, build_version, &fields);
-    }
-    // cluster_stats
-    size_t num_cluster_stats;
-    const struct envoy_config_endpoint_v3_ClusterStats* const* cluster_stats =
-        envoy_service_load_stats_v3_LoadStatsRequest_cluster_stats(
-            request, &num_cluster_stats);
-    for (size_t i = 0; i < num_cluster_stats; ++i) {
-      const auto* cluster_stat = cluster_stats[i];
-      fields.emplace_back("cluster_stats {");
-      // cluster_name
-      AddStringField(
-          "  cluster_name",
-          envoy_config_endpoint_v3_ClusterStats_cluster_name(cluster_stat),
-          &fields);
-      // cluster_service_name
-      AddStringField("  cluster_service_name",
-                     envoy_config_endpoint_v3_ClusterStats_cluster_service_name(
-                         cluster_stat),
-                     &fields);
-      // upstream_locality_stats
-      size_t num_stats;
-      const envoy_config_endpoint_v3_UpstreamLocalityStats* const* stats =
-          envoy_config_endpoint_v3_ClusterStats_upstream_locality_stats(
-              cluster_stat, &num_stats);
-      for (size_t j = 0; j < num_stats; ++j) {
-        const auto* stat = stats[j];
-        fields.emplace_back("  upstream_locality_stats {");
-        // locality
-        const auto* locality =
-            envoy_config_endpoint_v3_UpstreamLocalityStats_locality(stat);
-        if (locality != nullptr) {
-          fields.emplace_back("    locality {");
-          AddLocalityField(3, locality, &fields);
-          fields.emplace_back("    }");
-        }
-        // total_successful_requests
-        fields.emplace_back(absl::StrCat(
-            "    total_successful_requests: ",
-            envoy_config_endpoint_v3_UpstreamLocalityStats_total_successful_requests(
-                stat)));
-        // total_requests_in_progress
-        fields.emplace_back(absl::StrCat(
-            "    total_requests_in_progress: ",
-            envoy_config_endpoint_v3_UpstreamLocalityStats_total_requests_in_progress(
-                stat)));
-        // total_error_requests
-        fields.emplace_back(absl::StrCat(
-            "    total_error_requests: ",
-            envoy_config_endpoint_v3_UpstreamLocalityStats_total_error_requests(
-                stat)));
-        // total_issued_requests
-        fields.emplace_back(absl::StrCat(
-            "    total_issued_requests: ",
-            envoy_config_endpoint_v3_UpstreamLocalityStats_total_issued_requests(
-                stat)));
-        fields.emplace_back("  }");
-      }
-      // total_dropped_requests
-      fields.emplace_back(absl::StrCat(
-          "  total_dropped_requests: ",
-          envoy_config_endpoint_v3_ClusterStats_total_dropped_requests(
-              cluster_stat)));
-      // dropped_requests
-      size_t num_drops;
-      const envoy_config_endpoint_v3_ClusterStats_DroppedRequests* const*
-          drops = envoy_config_endpoint_v3_ClusterStats_dropped_requests(
-              cluster_stat, &num_drops);
-      for (size_t j = 0; j < num_drops; ++j) {
-        const auto* drop = drops[j];
-        fields.emplace_back("  dropped_requests {");
-        // category
-        AddStringField(
-            "    category",
-            envoy_config_endpoint_v3_ClusterStats_DroppedRequests_category(
-                drop),
-            &fields);
-        // dropped_count
-        fields.emplace_back(absl::StrCat(
-            "    dropped_count: ",
-            envoy_config_endpoint_v3_ClusterStats_DroppedRequests_dropped_count(
-                drop)));
-        fields.emplace_back("  }");
-      }
-      // load_report_interval
-      const auto* load_report_interval =
-          envoy_config_endpoint_v3_ClusterStats_load_report_interval(
-              cluster_stat);
-      if (load_report_interval != nullptr) {
-        fields.emplace_back("  load_report_interval {");
-        fields.emplace_back(absl::StrCat(
-            "    seconds: ",
-            google_protobuf_Duration_seconds(load_report_interval)));
-        fields.emplace_back(
-            absl::StrCat("    nanos: ",
-                         google_protobuf_Duration_nanos(load_report_interval)));
-        fields.emplace_back("  }");
-      }
-      fields.emplace_back("}");
-    }
+    const upb_msgdef* msg_type =
+        envoy_service_load_stats_v3_LoadStatsRequest_getmsgdef(symtab);
+    char buf[10240];
+    upb_text_encode(request, msg_type, nullptr, 0, buf, sizeof(buf));
     gpr_log(GPR_DEBUG, "[xds_client %p] constructed LRS request: %s", client,
-            absl::StrJoin(fields, "\n").c_str());
+            buf);
   }
 }
 
@@ -2423,7 +1945,8 @@ grpc_slice SerializeLrsRequest(
 
 }  // namespace
 
-grpc_slice XdsApi::CreateLrsInitialRequest() {
+grpc_slice XdsApi::CreateLrsInitialRequest(
+    const XdsBootstrap::XdsServer& server) {
   upb::Arena arena;
   // Create a request.
   envoy_service_load_stats_v3_LoadStatsRequest* request =
@@ -2432,12 +1955,12 @@ grpc_slice XdsApi::CreateLrsInitialRequest() {
   envoy_config_core_v3_Node* node_msg =
       envoy_service_load_stats_v3_LoadStatsRequest_mutable_node(request,
                                                                 arena.ptr());
-  PopulateNode(arena.ptr(), bootstrap_, build_version_, user_agent_name_,
-               node_msg);
+  PopulateNode(arena.ptr(), node_, server.ShouldUseV3(), build_version_,
+               user_agent_name_, node_msg);
   envoy_config_core_v3_Node_add_client_features(
       node_msg, upb_strview_makez("envoy.lrs.supports_send_all_clusters"),
       arena.ptr());
-  MaybeLogLrsRequest(client_, tracer_, request, build_version_);
+  MaybeLogLrsRequest(client_, tracer_, symtab_.ptr(), request);
   return SerializeLrsRequest(request, arena.ptr());
 }
 
@@ -2549,7 +2072,7 @@ grpc_slice XdsApi::CreateLrsRequest(
     google_protobuf_Duration_set_seconds(load_report_interval, timespec.tv_sec);
     google_protobuf_Duration_set_nanos(load_report_interval, timespec.tv_nsec);
   }
-  MaybeLogLrsRequest(client_, tracer_, request, build_version_);
+  MaybeLogLrsRequest(client_, tracer_, symtab_.ptr(), request);
   return SerializeLrsRequest(request, arena.ptr());
 }
 
index 44e8a8b..885dd2c 100644 (file)
@@ -29,6 +29,8 @@
 #include "absl/types/optional.h"
 #include "re2/re2.h"
 
+#include "upb/def.hpp"
+
 #include <grpc/slice_buffer.h>
 
 #include "src/core/ext/filters/client_channel/server_address.h"
 
 namespace grpc_core {
 
+// TODO(yashykt): Check to see if xDS security is enabled. This will be
+// removed once this feature is fully integration-tested and enabled by
+// default.
+bool XdsSecurityEnabled();
+
 class XdsClient;
 
 class XdsApi {
@@ -46,6 +53,17 @@ class XdsApi {
   static const char* kCdsTypeUrl;
   static const char* kEdsTypeUrl;
 
+  struct Duration {
+    int64_t seconds = 0;
+    int32_t nanos = 0;
+    bool operator==(const Duration& other) const {
+      return (seconds == other.seconds && nanos == other.nanos);
+    }
+    std::string ToString() const {
+      return absl::StrFormat("Duration seconds: %ld, nanos %d", seconds, nanos);
+    }
+  };
+
   // TODO(donnadionne): When we can use absl::variant<>, consider using that
   // for: PathMatcher, HeaderMatcher, cluster_name and weighted_clusters
   struct Route {
@@ -60,6 +78,7 @@ class XdsApi {
         PathMatcherType type;
         std::string string_matcher;
         std::unique_ptr<RE2> regex_matcher;
+        bool case_sensitive = true;
 
         PathMatcher() = default;
         PathMatcher(const PathMatcher& other);
@@ -122,11 +141,17 @@ class XdsApi {
       std::string ToString() const;
     };
     std::vector<ClusterWeight> weighted_clusters;
+    // Storing the timeout duration from route action:
+    // RouteAction.max_stream_duration.grpc_timeout_header_max or
+    // RouteAction.max_stream_duration.max_stream_duration if the former is
+    // not set.
+    absl::optional<Duration> max_stream_duration;
 
     bool operator==(const Route& other) const {
       return (matchers == other.matchers &&
               cluster_name == other.cluster_name &&
-              weighted_clusters == other.weighted_clusters);
+              weighted_clusters == other.weighted_clusters &&
+              max_stream_duration == other.max_stream_duration);
     }
     std::string ToString() const;
   };
@@ -178,9 +203,20 @@ class XdsApi {
       }
     };
 
+    struct CertificateProviderInstance {
+      std::string instance_name;
+      std::string certificate_name;
+
+      bool operator==(const CertificateProviderInstance& other) const {
+        return instance_name == other.instance_name &&
+               certificate_name == other.certificate_name;
+      }
+    };
+
     struct CombinedCertificateValidationContext {
       CertificateValidationContext default_validation_context;
-      std::string validation_context_certificate_provider_instance;
+      CertificateProviderInstance
+          validation_context_certificate_provider_instance;
 
       bool operator==(const CombinedCertificateValidationContext& other) const {
         return default_validation_context == other.default_validation_context &&
@@ -189,7 +225,7 @@ class XdsApi {
       }
     };
 
-    std::string tls_certificate_certificate_provider_instance;
+    CertificateProviderInstance tls_certificate_certificate_provider_instance;
     CombinedCertificateValidationContext combined_validation_context;
 
     bool operator==(const CommonTlsContext& other) const {
@@ -204,13 +240,17 @@ class XdsApi {
   struct LdsUpdate {
     // The name to use in the RDS request.
     std::string route_config_name;
+    // Storing the Http Connection Manager Common Http Protocol Option
+    // max_stream_duration
+    Duration http_max_stream_duration;
     // The RouteConfiguration to use for this listener.
     // Present only if it is inlined in the LDS response.
     absl::optional<RdsUpdate> rds_update;
 
     bool operator==(const LdsUpdate& other) const {
       return route_config_name == other.route_config_name &&
-             rds_update == other.rds_update;
+             rds_update == other.rds_update &&
+             http_max_stream_duration == other.http_max_stream_duration;
     }
   };
 
@@ -339,11 +379,12 @@ class XdsApi {
       std::pair<std::string /*cluster_name*/, std::string /*eds_service_name*/>,
       ClusterLoadReport>;
 
-  XdsApi(XdsClient* client, TraceFlag* tracer, const XdsBootstrap* bootstrap);
+  XdsApi(XdsClient* client, TraceFlag* tracer, const XdsBootstrap::Node* node);
 
   // Creates an ADS request.
   // Takes ownership of \a error.
-  grpc_slice CreateAdsRequest(const std::string& type_url,
+  grpc_slice CreateAdsRequest(const XdsBootstrap::XdsServer& server,
+                              const std::string& type_url,
                               const std::set<absl::string_view>& resource_names,
                               const std::string& version,
                               const std::string& nonce, grpc_error* error,
@@ -370,7 +411,7 @@ class XdsApi {
       const std::set<absl::string_view>& expected_eds_service_names);
 
   // Creates an initial LRS request.
-  grpc_slice CreateLrsInitialRequest();
+  grpc_slice CreateLrsInitialRequest(const XdsBootstrap::XdsServer& server);
 
   // Creates an LRS request sending a client-side load report.
   grpc_slice CreateLrsRequest(ClusterLoadReportMap cluster_load_report_map);
@@ -386,8 +427,8 @@ class XdsApi {
  private:
   XdsClient* client_;
   TraceFlag* tracer_;
-  const bool use_v3_;
-  const XdsBootstrap* bootstrap_;  // Do not own.
+  const XdsBootstrap::Node* node_;  // Do not own.
+  upb::SymbolTable symtab_;
   const std::string build_version_;
   const std::string user_agent_name_;
 };
index 05c3703..e48d982 100644 (file)
 #include "absl/strings/str_join.h"
 #include "absl/strings/string_view.h"
 
+#include "src/core/ext/xds/certificate_provider_registry.h"
+#include "src/core/ext/xds/xds_api.h"
 #include "src/core/lib/gpr/env.h"
 #include "src/core/lib/gpr/string.h"
 #include "src/core/lib/iomgr/load_file.h"
+#include "src/core/lib/security/credentials/credentials.h"
+#include "src/core/lib/security/credentials/fake/fake_credentials.h"
 #include "src/core/lib/slice/slice_internal.h"
 
 namespace grpc_core {
 
+//
+// XdsChannelCredsRegistry
+//
+
+bool XdsChannelCredsRegistry::IsSupported(const std::string& creds_type) {
+  return creds_type == "google_default" || creds_type == "insecure" ||
+         creds_type == "fake";
+}
+
+bool XdsChannelCredsRegistry::IsValidConfig(const std::string& creds_type,
+                                            const Json& config) {
+  // Currently, none of the creds types actually take a config, but we
+  // ignore whatever might be specified in the bootstrap file for
+  // forward compatibility reasons.
+  return true;
+}
+
+RefCountedPtr<grpc_channel_credentials>
+XdsChannelCredsRegistry::MakeChannelCreds(const std::string& creds_type,
+                                          const Json& config) {
+  if (creds_type == "google_default") {
+    return grpc_google_default_credentials_create(nullptr);
+  } else if (creds_type == "insecure") {
+    return grpc_insecure_credentials_create();
+  } else if (creds_type == "fake") {
+    return grpc_fake_transport_security_credentials_create();
+  }
+  return nullptr;
+}
+
+//
+// XdsBootstrap::XdsServer
+//
+
 bool XdsBootstrap::XdsServer::ShouldUseV3() const {
   return server_features.find("xds_v3") != server_features.end();
 }
 
+//
+// XdsBootstrap
+//
+
 namespace {
 
 std::string BootstrapString(const XdsBootstrap& bootstrap) {
@@ -59,23 +101,34 @@ std::string BootstrapString(const XdsBootstrap& bootstrap) {
         bootstrap.node()->locality_region, bootstrap.node()->locality_zone,
         bootstrap.node()->locality_subzone, bootstrap.node()->metadata.Dump()));
   }
-  parts.push_back(
-      absl::StrFormat("servers=[\n"
-                      "  {\n"
-                      "    uri=\"%s\",\n"
-                      "    creds=[\n",
-                      bootstrap.server().server_uri));
-  for (const auto& creds : bootstrap.server().channel_creds) {
-    parts.push_back(absl::StrFormat("      {type=\"%s\", config=%s},\n",
-                                    creds.type, creds.config.Dump()));
-  }
-  parts.push_back("    ],\n");
+  parts.push_back(absl::StrFormat(
+      "servers=[\n"
+      "  {\n"
+      "    uri=\"%s\",\n"
+      "    creds_type=%s,\n",
+      bootstrap.server().server_uri, bootstrap.server().channel_creds_type));
+  if (bootstrap.server().channel_creds_config.type() != Json::Type::JSON_NULL) {
+    parts.push_back(
+        absl::StrFormat("    creds_config=%s,",
+                        bootstrap.server().channel_creds_config.Dump()));
+  }
   if (!bootstrap.server().server_features.empty()) {
     parts.push_back(absl::StrCat(
         "    server_features=[",
         absl::StrJoin(bootstrap.server().server_features, ", "), "],\n"));
   }
-  parts.push_back("  }\n]");
+  parts.push_back("  }\n],\n");
+  parts.push_back("certificate_providers={\n");
+  for (const auto& entry : bootstrap.certificate_providers()) {
+    parts.push_back(
+        absl::StrFormat("  %s={\n"
+                        "    plugin_name=%s\n"
+                        "    config=%s\n"
+                        "  },\n",
+                        entry.first, entry.second.plugin_name,
+                        entry.second.config->ToString()));
+  }
+  parts.push_back("}");
   return absl::StrJoin(parts, "");
 }
 
@@ -152,6 +205,18 @@ XdsBootstrap::XdsBootstrap(Json json, grpc_error** error) {
       if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
     }
   }
+  if (XdsSecurityEnabled()) {
+    it = json.mutable_object()->find("certificate_providers");
+    if (it != json.mutable_object()->end()) {
+      if (it->second.type() != Json::Type::OBJECT) {
+        error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+            "\"certificate_providers\" field is not an object"));
+      } else {
+        grpc_error* parse_error = ParseCertificateProviders(&it->second);
+        if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
+      }
+    }
+  }
   *error = GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing xds bootstrap file",
                                          &error_list);
 }
@@ -187,14 +252,15 @@ grpc_error* XdsBootstrap::ParseXdsServer(Json* json, size_t idx) {
     server.server_uri = std::move(*it->second.mutable_string_value());
   }
   it = json->mutable_object()->find("channel_creds");
-  if (it != json->mutable_object()->end()) {
-    if (it->second.type() != Json::Type::ARRAY) {
-      error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-          "\"channel_creds\" field is not an array"));
-    } else {
-      grpc_error* parse_error = ParseChannelCredsArray(&it->second, &server);
-      if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
-    }
+  if (it == json->mutable_object()->end()) {
+    error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+        "\"channel_creds\" field not present"));
+  } else if (it->second.type() != Json::Type::ARRAY) {
+    error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+        "\"channel_creds\" field is not an array"));
+  } else {
+    grpc_error* parse_error = ParseChannelCredsArray(&it->second, &server);
+    if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
   }
   it = json->mutable_object()->find("server_features");
   if (it != json->mutable_object()->end()) {
@@ -230,6 +296,10 @@ grpc_error* XdsBootstrap::ParseChannelCredsArray(Json* json,
       if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
     }
   }
+  if (server->channel_creds_type.empty()) {
+    error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+        "no known creds type found in \"channel_creds\""));
+  }
   return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing \"channel_creds\" array",
                                        &error_list);
 }
@@ -237,7 +307,7 @@ grpc_error* XdsBootstrap::ParseChannelCredsArray(Json* json,
 grpc_error* XdsBootstrap::ParseChannelCreds(Json* json, size_t idx,
                                             XdsServer* server) {
   std::vector<grpc_error*> error_list;
-  ChannelCreds channel_creds;
+  std::string type;
   auto it = json->mutable_object()->find("type");
   if (it == json->mutable_object()->end()) {
     error_list.push_back(
@@ -246,19 +316,28 @@ grpc_error* XdsBootstrap::ParseChannelCreds(Json* json, size_t idx,
     error_list.push_back(
         GRPC_ERROR_CREATE_FROM_STATIC_STRING("\"type\" field is not a string"));
   } else {
-    channel_creds.type = std::move(*it->second.mutable_string_value());
+    type = std::move(*it->second.mutable_string_value());
   }
+  Json config;
   it = json->mutable_object()->find("config");
   if (it != json->mutable_object()->end()) {
     if (it->second.type() != Json::Type::OBJECT) {
       error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
           "\"config\" field is not an object"));
     } else {
-      channel_creds.config = std::move(it->second);
+      config = std::move(it->second);
     }
   }
-  if (!channel_creds.type.empty()) {
-    server->channel_creds.emplace_back(std::move(channel_creds));
+  // Select the first channel creds type that we support.
+  if (server->channel_creds_type.empty() &&
+      XdsChannelCredsRegistry::IsSupported(type)) {
+    if (!XdsChannelCredsRegistry::IsValidConfig(type, config)) {
+      error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+          absl::StrCat("invalid config for channel creds type \"", type, "\"")
+              .c_str()));
+    }
+    server->channel_creds_type = std::move(type);
+    server->channel_creds_config = std::move(config);
   }
   // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error
   // string is not static in this case.
@@ -370,4 +449,72 @@ grpc_error* XdsBootstrap::ParseLocality(Json* json) {
                                        &error_list);
 }
 
+grpc_error* XdsBootstrap::ParseCertificateProviders(Json* json) {
+  std::vector<grpc_error*> error_list;
+  for (auto& certificate_provider : *(json->mutable_object())) {
+    if (certificate_provider.second.type() != Json::Type::OBJECT) {
+      error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+          absl::StrCat("element \"", certificate_provider.first,
+                       "\" is not an object")
+              .c_str()));
+    } else {
+      grpc_error* parse_error = ParseCertificateProvider(
+          certificate_provider.first, &certificate_provider.second);
+      if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
+    }
+  }
+  return GRPC_ERROR_CREATE_FROM_VECTOR(
+      "errors parsing \"certificate_providers\" object", &error_list);
+}
+
+grpc_error* XdsBootstrap::ParseCertificateProvider(
+    const std::string& instance_name, Json* certificate_provider_json) {
+  std::vector<grpc_error*> error_list;
+  auto it = certificate_provider_json->mutable_object()->find("plugin_name");
+  if (it == certificate_provider_json->mutable_object()->end()) {
+    error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+        "\"plugin_name\" field not present"));
+  } else if (it->second.type() != Json::Type::STRING) {
+    error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+        "\"plugin_name\" field is not a string"));
+  } else {
+    std::string plugin_name = std::move(*(it->second.mutable_string_value()));
+    CertificateProviderFactory* factory =
+        CertificateProviderRegistry::LookupCertificateProviderFactory(
+            plugin_name);
+    if (factory != nullptr) {
+      RefCountedPtr<CertificateProviderFactory::Config> config;
+      it = certificate_provider_json->mutable_object()->find("config");
+      if (it != certificate_provider_json->mutable_object()->end()) {
+        if (it->second.type() != Json::Type::OBJECT) {
+          error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+              "\"config\" field is not an object"));
+        } else {
+          grpc_error* parse_error = GRPC_ERROR_NONE;
+          config = factory->CreateCertificateProviderConfig(it->second,
+                                                            &parse_error);
+          if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
+        }
+      } else {
+        // "config" is an optional field, so create an empty JSON object.
+        grpc_error* parse_error = GRPC_ERROR_NONE;
+        config = factory->CreateCertificateProviderConfig(Json::Object(),
+                                                          &parse_error);
+        if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
+      }
+      certificate_providers_.insert(
+          {instance_name, {std::move(plugin_name), std::move(config)}});
+    }
+  }
+  // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error
+  // string is not static in this case.
+  if (error_list.empty()) return GRPC_ERROR_NONE;
+  grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+      absl::StrCat("errors parsing element \"", instance_name, "\"").c_str());
+  for (size_t i = 0; i < error_list.size(); ++i) {
+    error = grpc_error_add_child(error, error_list[i]);
+  }
+  return error;
+}
+
 }  // namespace grpc_core
index a43c8c0..8a3393d 100644 (file)
 
 #include "absl/container/inlined_vector.h"
 
-#include <grpc/impl/codegen/slice.h>
+#include <grpc/slice.h>
 
+#include "src/core/ext/xds/certificate_provider_store.h"
 #include "src/core/lib/gprpp/map.h"
 #include "src/core/lib/gprpp/memory.h"
+#include "src/core/lib/gprpp/ref_counted_ptr.h"
 #include "src/core/lib/iomgr/error.h"
 #include "src/core/lib/json/json.h"
+#include "src/core/lib/security/credentials/credentials.h"
 
 namespace grpc_core {
 
 class XdsClient;
 
+class XdsChannelCredsRegistry {
+ public:
+  static bool IsSupported(const std::string& creds_type);
+  static bool IsValidConfig(const std::string& creds_type, const Json& config);
+  static RefCountedPtr<grpc_channel_credentials> MakeChannelCreds(
+      const std::string& creds_type, const Json& config);
+};
+
 class XdsBootstrap {
  public:
   struct Node {
@@ -48,14 +59,10 @@ class XdsBootstrap {
     Json metadata;
   };
 
-  struct ChannelCreds {
-    std::string type;
-    Json config;
-  };
-
   struct XdsServer {
     std::string server_uri;
-    absl::InlinedVector<ChannelCreds, 1> channel_creds;
+    std::string channel_creds_type;
+    Json channel_creds_config;
     std::set<std::string> server_features;
 
     bool ShouldUseV3() const;
@@ -75,6 +82,11 @@ class XdsBootstrap {
   const XdsServer& server() const { return servers_[0]; }
   const Node* node() const { return node_.get(); }
 
+  const CertificateProviderStore::PluginDefinitionMap& certificate_providers()
+      const {
+    return certificate_providers_;
+  }
+
  private:
   grpc_error* ParseXdsServerList(Json* json);
   grpc_error* ParseXdsServer(Json* json, size_t idx);
@@ -83,9 +95,13 @@ class XdsBootstrap {
   grpc_error* ParseServerFeaturesArray(Json* json, XdsServer* server);
   grpc_error* ParseNode(Json* json);
   grpc_error* ParseLocality(Json* json);
+  grpc_error* ParseCertificateProviders(Json* json);
+  grpc_error* ParseCertificateProvider(const std::string& instance_name,
+                                       Json* certificate_provider_json);
 
   absl::InlinedVector<XdsServer, 1> servers_;
   std::unique_ptr<Node> node_;
+  CertificateProviderStore::PluginDefinitionMap certificate_providers_;
 };
 
 }  // namespace grpc_core
diff --git a/src/core/ext/xds/xds_certificate_provider.cc b/src/core/ext/xds/xds_certificate_provider.cc
new file mode 100644 (file)
index 0000000..e6ad4dd
--- /dev/null
@@ -0,0 +1,240 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#include <grpc/support/port_platform.h>
+
+#include "absl/functional/bind_front.h"
+#include "absl/strings/str_cat.h"
+
+#include "src/core/ext/xds/xds_certificate_provider.h"
+
+namespace grpc_core {
+
+namespace {
+
+class RootCertificatesWatcher
+    : public grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface {
+ public:
+  // Takes a ref to \a parent instead of a raw pointer since the watcher is
+  // owned by the root certificate distributor and not by \a parent. Note that
+  // presently, the watcher is immediately deleted when
+  // CancelTlsCertificatesWatch() is called, but that can potentially change in
+  // the future.
+  explicit RootCertificatesWatcher(
+      RefCountedPtr<grpc_tls_certificate_distributor> parent)
+      : parent_(std::move(parent)) {}
+
+  void OnCertificatesChanged(absl::optional<absl::string_view> root_certs,
+                             absl::optional<PemKeyCertPairList>
+                             /* key_cert_pairs */) override {
+    if (root_certs.has_value()) {
+      parent_->SetKeyMaterials("", std::string(root_certs.value()),
+                               absl::nullopt);
+    }
+  }
+
+  void OnError(grpc_error* root_cert_error,
+               grpc_error* identity_cert_error) override {
+    if (root_cert_error != GRPC_ERROR_NONE) {
+      parent_->SetErrorForCert("", root_cert_error /* pass the ref */,
+                               absl::nullopt);
+    }
+    GRPC_ERROR_UNREF(identity_cert_error);
+  }
+
+ private:
+  RefCountedPtr<grpc_tls_certificate_distributor> parent_;
+};
+
+class IdentityCertificatesWatcher
+    : public grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface {
+ public:
+  // Takes a ref to \a parent instead of a raw pointer since the watcher is
+  // owned by the root certificate distributor and not by \a parent. Note that
+  // presently, the watcher is immediately deleted when
+  // CancelTlsCertificatesWatch() is called, but that can potentially change in
+  // the future.
+  explicit IdentityCertificatesWatcher(
+      RefCountedPtr<grpc_tls_certificate_distributor> parent)
+      : parent_(std::move(parent)) {}
+
+  void OnCertificatesChanged(
+      absl::optional<absl::string_view> /* root_certs */,
+      absl::optional<PemKeyCertPairList> key_cert_pairs) override {
+    if (key_cert_pairs.has_value()) {
+      parent_->SetKeyMaterials("", absl::nullopt, key_cert_pairs);
+    }
+  }
+
+  void OnError(grpc_error* root_cert_error,
+               grpc_error* identity_cert_error) override {
+    if (identity_cert_error != GRPC_ERROR_NONE) {
+      parent_->SetErrorForCert("", absl::nullopt,
+                               identity_cert_error /* pass the ref */);
+    }
+    GRPC_ERROR_UNREF(root_cert_error);
+  }
+
+ private:
+  RefCountedPtr<grpc_tls_certificate_distributor> parent_;
+};
+
+}  // namespace
+
+XdsCertificateProvider::XdsCertificateProvider(
+    absl::string_view root_cert_name,
+    RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor,
+    absl::string_view identity_cert_name,
+    RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor)
+    : root_cert_name_(root_cert_name),
+      identity_cert_name_(identity_cert_name),
+      root_cert_distributor_(std::move(root_cert_distributor)),
+      identity_cert_distributor_(std::move(identity_cert_distributor)),
+      distributor_(MakeRefCounted<grpc_tls_certificate_distributor>()) {
+  distributor_->SetWatchStatusCallback(
+      absl::bind_front(&XdsCertificateProvider::WatchStatusCallback, this));
+}
+
+void XdsCertificateProvider::UpdateRootCertNameAndDistributor(
+    absl::string_view root_cert_name,
+    RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor) {
+  MutexLock lock(&mu_);
+  root_cert_name_ = std::string(root_cert_name);
+  if (watching_root_certs_) {
+    // The root certificates are being watched. Swap out the watcher.
+    if (root_cert_distributor_ != nullptr) {
+      root_cert_distributor_->CancelTlsCertificatesWatch(root_cert_watcher_);
+    }
+    if (root_cert_distributor != nullptr) {
+      UpdateRootCertWatcher(root_cert_distributor.get());
+    } else {
+      root_cert_watcher_ = nullptr;
+      distributor_->SetErrorForCert(
+          "",
+          GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+              "No certificate provider available for root certificates"),
+          absl::nullopt);
+    }
+  }
+  // Swap out the root certificate distributor
+  root_cert_distributor_ = std::move(root_cert_distributor);
+}
+
+void XdsCertificateProvider::UpdateIdentityCertNameAndDistributor(
+    absl::string_view identity_cert_name,
+    RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor) {
+  MutexLock lock(&mu_);
+  identity_cert_name_ = std::string(identity_cert_name);
+  if (watching_identity_certs_) {
+    // The identity certificates are being watched. Swap out the watcher.
+    if (identity_cert_distributor_ != nullptr) {
+      identity_cert_distributor_->CancelTlsCertificatesWatch(
+          identity_cert_watcher_);
+    }
+    if (identity_cert_distributor != nullptr) {
+      UpdateIdentityCertWatcher(identity_cert_distributor.get());
+    } else {
+      identity_cert_watcher_ = nullptr;
+      distributor_->SetErrorForCert(
+          "", absl::nullopt,
+          GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+              "No certificate provider available for identity certificates"));
+    }
+  }
+  // Swap out the identity certificate distributor
+  identity_cert_distributor_ = std::move(identity_cert_distributor);
+}
+
+void XdsCertificateProvider::WatchStatusCallback(std::string cert_name,
+                                                 bool root_being_watched,
+                                                 bool identity_being_watched) {
+  // We aren't specially handling the case where root_cert_distributor is same
+  // as identity_cert_distributor. Always using two separate watchers
+  // irrespective of the fact results in a straightforward design, and using a
+  // single watcher does not seem to provide any benefit other than cutting down
+  // on the number of callbacks.
+  MutexLock lock(&mu_);
+  if (!cert_name.empty()) {
+    grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrCat("Illegal certificate name: \'", cert_name,
+                     "\'. Should be empty.")
+            .c_str());
+    distributor_->SetErrorForCert(cert_name, GRPC_ERROR_REF(error),
+                                  GRPC_ERROR_REF(error));
+    GRPC_ERROR_UNREF(error);
+    return;
+  }
+  if (root_being_watched && !watching_root_certs_) {
+    // We need to start watching root certs.
+    watching_root_certs_ = true;
+    if (root_cert_distributor_ == nullptr) {
+      distributor_->SetErrorForCert(
+          "",
+          GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+              "No certificate provider available for root certificates"),
+          absl::nullopt);
+    } else {
+      UpdateRootCertWatcher(root_cert_distributor_.get());
+    }
+  } else if (!root_being_watched && watching_root_certs_) {
+    // We need to cancel root certs watch.
+    watching_root_certs_ = false;
+    if (root_cert_distributor_ != nullptr) {
+      root_cert_distributor_->CancelTlsCertificatesWatch(root_cert_watcher_);
+      root_cert_watcher_ = nullptr;
+    }
+    GPR_ASSERT(root_cert_watcher_ == nullptr);
+  }
+  if (identity_being_watched && !watching_identity_certs_) {
+    watching_identity_certs_ = true;
+    if (identity_cert_distributor_ == nullptr) {
+      distributor_->SetErrorForCert(
+          "", absl::nullopt,
+          GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+              "No certificate provider available for identity certificates"));
+    } else {
+      UpdateIdentityCertWatcher(identity_cert_distributor_.get());
+    }
+  } else if (!identity_being_watched && watching_identity_certs_) {
+    watching_identity_certs_ = false;
+    if (identity_cert_distributor_ != nullptr) {
+      identity_cert_distributor_->CancelTlsCertificatesWatch(
+          identity_cert_watcher_);
+      identity_cert_watcher_ = nullptr;
+    }
+    GPR_ASSERT(identity_cert_watcher_ == nullptr);
+  }
+}
+
+void XdsCertificateProvider::UpdateRootCertWatcher(
+    grpc_tls_certificate_distributor* root_cert_distributor) {
+  auto watcher = absl::make_unique<RootCertificatesWatcher>(distributor());
+  root_cert_watcher_ = watcher.get();
+  root_cert_distributor->WatchTlsCertificates(std::move(watcher),
+                                              root_cert_name_, absl::nullopt);
+}
+
+void XdsCertificateProvider::UpdateIdentityCertWatcher(
+    grpc_tls_certificate_distributor* identity_cert_distributor) {
+  auto watcher = absl::make_unique<IdentityCertificatesWatcher>(distributor());
+  identity_cert_watcher_ = watcher.get();
+  identity_cert_distributor->WatchTlsCertificates(
+      std::move(watcher), absl::nullopt, identity_cert_name_);
+}
+
+}  // namespace grpc_core
diff --git a/src/core/ext/xds/xds_certificate_provider.h b/src/core/ext/xds/xds_certificate_provider.h
new file mode 100644 (file)
index 0000000..caf0e5c
--- /dev/null
@@ -0,0 +1,74 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#ifndef GRPC_CORE_EXT_XDS_XDS_CERTIFICATE_PROVIDER_H
+#define GRPC_CORE_EXT_XDS_XDS_CERTIFICATE_PROVIDER_H
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h"
+
+namespace grpc_core {
+
+class XdsCertificateProvider : public grpc_tls_certificate_provider {
+ public:
+  XdsCertificateProvider(
+      absl::string_view root_cert_name,
+      RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor,
+      absl::string_view identity_cert_name,
+      RefCountedPtr<grpc_tls_certificate_distributor>
+          identity_cert_distributor);
+
+  void UpdateRootCertNameAndDistributor(
+      absl::string_view root_cert_name,
+      RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor);
+  void UpdateIdentityCertNameAndDistributor(
+      absl::string_view identity_cert_name,
+      RefCountedPtr<grpc_tls_certificate_distributor>
+          identity_cert_distributor);
+
+  grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor()
+      const override {
+    return distributor_;
+  }
+
+ private:
+  void WatchStatusCallback(std::string cert_name, bool root_being_watched,
+                           bool identity_being_watched);
+  void UpdateRootCertWatcher(
+      grpc_tls_certificate_distributor* root_cert_distributor);
+  void UpdateIdentityCertWatcher(
+      grpc_tls_certificate_distributor* identity_cert_distributor);
+
+  Mutex mu_;
+  bool watching_root_certs_ = false;
+  bool watching_identity_certs_ = false;
+  std::string root_cert_name_;
+  std::string identity_cert_name_;
+  RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor_;
+  RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor_;
+  RefCountedPtr<grpc_tls_certificate_distributor> distributor_;
+  grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
+      root_cert_watcher_ = nullptr;
+  grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
+      identity_cert_watcher_ = nullptr;
+};
+
+}  // namespace grpc_core
+
+#endif  // GRPC_CORE_EXT_XDS_XDS_CERTIFICATE_PROVIDER_H
index 6d44864..979ebd7 100644 (file)
@@ -50,8 +50,6 @@
 #include "src/core/lib/iomgr/sockaddr.h"
 #include "src/core/lib/iomgr/sockaddr_utils.h"
 #include "src/core/lib/iomgr/timer.h"
-#include "src/core/lib/security/credentials/credentials.h"
-#include "src/core/lib/security/credentials/fake/fake_credentials.h"
 #include "src/core/lib/slice/slice_internal.h"
 #include "src/core/lib/slice/slice_string_helpers.h"
 #include "src/core/lib/surface/call.h"
@@ -143,8 +141,11 @@ class XdsClient::ChannelState::AdsCallState
  private:
   class ResourceState : public InternallyRefCounted<ResourceState> {
    public:
-    ResourceState(const std::string& type_url, const std::string& name)
-        : type_url_(type_url), name_(name) {
+    ResourceState(const std::string& type_url, const std::string& name,
+                  bool sent_initial_request)
+        : type_url_(type_url),
+          name_(name),
+          sent_initial_request_(sent_initial_request) {
       GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
                         grpc_schedule_on_exec_ctx);
     }
@@ -155,8 +156,8 @@ class XdsClient::ChannelState::AdsCallState
     }
 
     void Start(RefCountedPtr<AdsCallState> ads_calld) {
-      if (sent_) return;
-      sent_ = true;
+      if (sent_initial_request_) return;
+      sent_initial_request_ = true;
       ads_calld_ = std::move(ads_calld);
       Ref(DEBUG_LOCATION, "timer").release();
       timer_pending_ = true;
@@ -229,7 +230,7 @@ class XdsClient::ChannelState::AdsCallState
     const std::string name_;
 
     RefCountedPtr<AdsCallState> ads_calld_;
-    bool sent_ = false;
+    bool sent_initial_request_;
     bool timer_pending_ = false;
     grpc_timer timer_;
     grpc_closure timer_callback_;
@@ -238,8 +239,7 @@ class XdsClient::ChannelState::AdsCallState
   struct ResourceTypeState {
     ~ResourceTypeState() { GRPC_ERROR_UNREF(error); }
 
-    // Version, nonce, and error for this resource type.
-    std::string version;
+    // Nonce and error for this resource type.
     std::string nonce;
     grpc_error* error = GRPC_ERROR_NONE;
 
@@ -336,7 +336,7 @@ class XdsClient::ChannelState::LrsCallState
     void ScheduleNextReportLocked();
     static void OnNextReportTimer(void* arg, grpc_error* error);
     bool OnNextReportTimerLocked(grpc_error* error);
-    void SendReportLocked();
+    bool SendReportLocked();
     static void OnReportDone(void* arg, grpc_error* error);
     bool OnReportDoneLocked(grpc_error* error);
 
@@ -431,11 +431,44 @@ class XdsClient::ChannelState::StateWatcher
 // XdsClient::ChannelState
 //
 
+namespace {
+
+grpc_channel* CreateXdsChannel(const XdsBootstrap::XdsServer& server) {
+  // Build channel args.
+  absl::InlinedVector<grpc_arg, 2> args_to_add = {
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
+          5 * 60 * GPR_MS_PER_SEC),
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL), 1),
+  };
+  grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
+      g_channel_args, args_to_add.data(), args_to_add.size());
+  // Create channel creds.
+  RefCountedPtr<grpc_channel_credentials> channel_creds =
+      XdsChannelCredsRegistry::MakeChannelCreds(server.channel_creds_type,
+                                                server.channel_creds_config);
+  // Create channel.
+  grpc_channel* channel = grpc_secure_channel_create(
+      channel_creds.get(), server.server_uri.c_str(), new_args, nullptr);
+  grpc_channel_args_destroy(new_args);
+  return channel;
+}
+
+}  // namespace
+
 XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
-                                      grpc_channel* channel)
-    : InternallyRefCounted<ChannelState>(&grpc_xds_client_trace),
+                                      const XdsBootstrap::XdsServer& server)
+    : InternallyRefCounted<ChannelState>(
+          GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace) ? "ChannelState"
+                                                         : nullptr),
       xds_client_(std::move(xds_client)),
-      channel_(channel) {
+      server_(server) {
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
+    gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s",
+            xds_client_.get(), server.server_uri.c_str());
+  }
+  channel_ = CreateXdsChannel(server);
   GPR_ASSERT(channel_ != nullptr);
   StartConnectivityWatchLocked();
 }
@@ -634,7 +667,9 @@ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
 
 XdsClient::ChannelState::AdsCallState::AdsCallState(
     RefCountedPtr<RetryableCall<AdsCallState>> parent)
-    : InternallyRefCounted<AdsCallState>(&grpc_xds_client_trace),
+    : InternallyRefCounted<AdsCallState>(
+          GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace) ? "AdsCallState"
+                                                         : nullptr),
       parent_(std::move(parent)) {
   // Init the ADS call. Note that the call will progress every time there's
   // activity in xds_client()->interested_parties_, which is comprised of
@@ -642,7 +677,7 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
   GPR_ASSERT(xds_client() != nullptr);
   // Create a call with the specified method name.
   const auto& method =
-      xds_client()->bootstrap_->server().ShouldUseV3()
+      chand()->server_.ShouldUseV3()
           ? GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V3_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES
           : GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V2_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES;
   call_ = grpc_channel_create_pollset_set_call(
@@ -763,7 +798,8 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
   std::set<absl::string_view> resource_names =
       ResourceNamesForRequest(type_url);
   request_payload_slice = xds_client()->api_.CreateAdsRequest(
-      type_url, resource_names, state.version, state.nonce,
+      chand()->server_, type_url, resource_names,
+      xds_client()->resource_version_map_[type_url], state.nonce,
       GRPC_ERROR_REF(state.error), !sent_initial_message_);
   if (type_url != XdsApi::kLdsTypeUrl && type_url != XdsApi::kRdsTypeUrl &&
       type_url != XdsApi::kCdsTypeUrl && type_url != XdsApi::kEdsTypeUrl) {
@@ -774,7 +810,8 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
     gpr_log(GPR_INFO,
             "[xds_client %p] sending ADS request: type=%s version=%s nonce=%s "
             "error=%s resources=%s",
-            xds_client(), type_url.c_str(), state.version.c_str(),
+            xds_client(), type_url.c_str(),
+            xds_client()->resource_version_map_[type_url].c_str(),
             state.nonce.c_str(), grpc_error_string(state.error),
             absl::StrJoin(resource_names, " ").c_str());
   }
@@ -806,7 +843,8 @@ void XdsClient::ChannelState::AdsCallState::Subscribe(
     const std::string& type_url, const std::string& name) {
   auto& state = state_map_[type_url].subscribed_resources[name];
   if (state == nullptr) {
-    state = MakeOrphanable<ResourceState>(type_url, name);
+    state = MakeOrphanable<ResourceState>(
+        type_url, name, !xds_client()->resource_version_map_[type_url].empty());
     SendMessageLocked(type_url);
   }
 }
@@ -1170,7 +1208,8 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
       } else if (result.type_url == XdsApi::kEdsTypeUrl) {
         AcceptEdsUpdate(std::move(result.eds_update_map));
       }
-      state.version = std::move(result.version);
+      xds_client()->resource_version_map_[result.type_url] =
+          std::move(result.version);
       // ACK the update.
       SendMessageLocked(result.type_url);
       // Start load reporting if needed.
@@ -1287,8 +1326,7 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimerLocked(
     GRPC_ERROR_UNREF(error);
     return true;
   }
-  SendReportLocked();
-  return false;
+  return SendReportLocked();
 }
 
 namespace {
@@ -1307,7 +1345,7 @@ bool LoadReportCountersAreZero(const XdsApi::ClusterLoadReportMap& snapshot) {
 
 }  // namespace
 
-void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
+bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
   // Construct snapshot from all reported stats.
   XdsApi::ClusterLoadReportMap snapshot =
       xds_client()->BuildLoadReportSnapshotLocked(parent_->send_all_clusters_,
@@ -1317,8 +1355,12 @@ void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
   const bool old_val = last_report_counters_were_zero_;
   last_report_counters_were_zero_ = LoadReportCountersAreZero(snapshot);
   if (old_val && last_report_counters_were_zero_) {
+    if (xds_client()->load_report_map_.empty()) {
+      parent_->chand()->StopLrsCall();
+      return true;
+    }
     ScheduleNextReportLocked();
-    return;
+    return false;
   }
   // Create a request that contains the snapshot.
   grpc_slice request_payload_slice =
@@ -1339,6 +1381,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
             xds_client(), this, call_error);
     GPR_ASSERT(GRPC_CALL_OK == call_error);
   }
+  return false;
 }
 
 void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone(
@@ -1381,14 +1424,16 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
 
 XdsClient::ChannelState::LrsCallState::LrsCallState(
     RefCountedPtr<RetryableCall<LrsCallState>> parent)
-    : InternallyRefCounted<LrsCallState>(&grpc_xds_client_trace),
+    : InternallyRefCounted<LrsCallState>(
+          GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace) ? "LrsCallState"
+                                                         : nullptr),
       parent_(std::move(parent)) {
   // Init the LRS call. Note that the call will progress every time there's
   // activity in xds_client()->interested_parties_, which is comprised of
   // the polling entities from client_channel.
   GPR_ASSERT(xds_client() != nullptr);
   const auto& method =
-      xds_client()->bootstrap_->server().ShouldUseV3()
+      chand()->server_.ShouldUseV3()
           ? GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V3_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS
           : GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V2_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS;
   call_ = grpc_channel_create_pollset_set_call(
@@ -1398,7 +1443,7 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
   GPR_ASSERT(call_ != nullptr);
   // Init the request payload.
   grpc_slice request_payload_slice =
-      xds_client()->api_.CreateLrsInitialRequest();
+      xds_client()->api_.CreateLrsInitialRequest(chand()->server_);
   send_message_payload_ =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   grpc_slice_unref_internal(request_payload_slice);
@@ -1689,56 +1734,18 @@ grpc_millis GetRequestTimeout() {
       {15000, 0, INT_MAX});
 }
 
-grpc_channel* CreateXdsChannel(const XdsBootstrap& bootstrap,
-                               grpc_error** error) {
-  // Build channel args.
-  absl::InlinedVector<grpc_arg, 2> args_to_add = {
-      grpc_channel_arg_integer_create(
-          const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
-          5 * 60 * GPR_MS_PER_SEC),
-      grpc_channel_arg_integer_create(
-          const_cast<char*>(GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL), 1),
-  };
-  grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
-      g_channel_args, args_to_add.data(), args_to_add.size());
-  // Find credentials and create channel.
-  RefCountedPtr<grpc_channel_credentials> creds;
-  for (const auto& channel_creds : bootstrap.server().channel_creds) {
-    if (channel_creds.type == "google_default") {
-      creds.reset(grpc_google_default_credentials_create(nullptr));
-      break;
-    }
-    if (channel_creds.type == "insecure") {
-      grpc_channel* channel = grpc_insecure_channel_create(
-          bootstrap.server().server_uri.c_str(), new_args, nullptr);
-      grpc_channel_args_destroy(new_args);
-      return channel;
-    }
-    if (channel_creds.type == "fake") {
-      creds.reset(grpc_fake_transport_security_credentials_create());
-      break;
-    }
-  }
-  if (creds == nullptr) {
-    *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-        "no supported credential types found");
-    return nullptr;
-  }
-  grpc_channel* channel = grpc_secure_channel_create(
-      creds.get(), bootstrap.server().server_uri.c_str(), new_args, nullptr);
-  grpc_channel_args_destroy(new_args);
-  return channel;
-}
-
 }  // namespace
 
 XdsClient::XdsClient(grpc_error** error)
-    : DualRefCounted<XdsClient>(&grpc_xds_client_trace),
+    : DualRefCounted<XdsClient>(GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)
+                                    ? "XdsClient"
+                                    : nullptr),
       request_timeout_(GetRequestTimeout()),
       interested_parties_(grpc_pollset_set_create()),
       bootstrap_(
           XdsBootstrap::ReadFromFile(this, &grpc_xds_client_trace, error)),
-      api_(this, &grpc_xds_client_trace, bootstrap_.get()) {
+      api_(this, &grpc_xds_client_trace,
+           bootstrap_ == nullptr ? nullptr : bootstrap_->node()) {
   if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
     gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
   }
@@ -1747,19 +1754,9 @@ XdsClient::XdsClient(grpc_error** error)
             this, grpc_error_string(*error));
     return;
   }
-  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
-    gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s", this,
-            bootstrap_->server().server_uri.c_str());
-  }
-  grpc_channel* channel = CreateXdsChannel(*bootstrap_, error);
-  if (*error != GRPC_ERROR_NONE) {
-    gpr_log(GPR_ERROR, "[xds_client %p] failed to create xds channel: %s", this,
-            grpc_error_string(*error));
-    return;
-  }
   // Create ChannelState object.
   chand_ = MakeOrphanable<ChannelState>(
-      WeakRef(DEBUG_LOCATION, "XdsClient+ChannelState"), channel);
+      WeakRef(DEBUG_LOCATION, "XdsClient+ChannelState"), bootstrap_->server());
 }
 
 XdsClient::~XdsClient() {
@@ -1982,10 +1979,22 @@ RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
   auto it = load_report_map_
                 .emplace(std::make_pair(std::move(key), LoadReportState()))
                 .first;
-  auto cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
-      Ref(DEBUG_LOCATION, "DropStats"), lrs_server,
-      it->first.first /*cluster_name*/, it->first.second /*eds_service_name*/);
-  it->second.drop_stats.insert(cluster_drop_stats.get());
+  LoadReportState& load_report_state = it->second;
+  RefCountedPtr<XdsClusterDropStats> cluster_drop_stats;
+  if (load_report_state.drop_stats != nullptr) {
+    cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
+  }
+  if (cluster_drop_stats == nullptr) {
+    if (load_report_state.drop_stats != nullptr) {
+      load_report_state.deleted_drop_stats +=
+          load_report_state.drop_stats->GetSnapshotAndReset();
+    }
+    cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
+        Ref(DEBUG_LOCATION, "DropStats"), lrs_server,
+        it->first.first /*cluster_name*/,
+        it->first.second /*eds_service_name*/);
+    load_report_state.drop_stats = cluster_drop_stats.get();
+  }
   chand_->MaybeStartLrsCall();
   return cluster_drop_stats;
 }
@@ -1995,19 +2004,18 @@ void XdsClient::RemoveClusterDropStats(
     absl::string_view eds_service_name,
     XdsClusterDropStats* cluster_drop_stats) {
   MutexLock lock(&mu_);
-  auto load_report_it = load_report_map_.find(
-      std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
-  if (load_report_it == load_report_map_.end()) return;
-  LoadReportState& load_report_state = load_report_it->second;
   // TODO(roth): When we add support for direct federation, use the
   // server name specified in lrs_server.
-  auto it = load_report_state.drop_stats.find(cluster_drop_stats);
-  if (it != load_report_state.drop_stats.end()) {
-    // Record final drop stats in deleted_drop_stats, which will be
+  auto it = load_report_map_.find(
+      std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
+  if (it == load_report_map_.end()) return;
+  LoadReportState& load_report_state = it->second;
+  if (load_report_state.drop_stats == cluster_drop_stats) {
+    // Record final snapshot in deleted_drop_stats, which will be
     // added to the next load report.
-    auto dropped_requests = cluster_drop_stats->GetSnapshotAndReset();
-    load_report_state.deleted_drop_stats += dropped_requests;
-    load_report_state.drop_stats.erase(it);
+    load_report_state.deleted_drop_stats +=
+        load_report_state.drop_stats->GetSnapshotAndReset();
+    load_report_state.drop_stats = nullptr;
   }
 }
 
@@ -2026,12 +2034,24 @@ RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
   auto it = load_report_map_
                 .emplace(std::make_pair(std::move(key), LoadReportState()))
                 .first;
-  auto cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
-      Ref(DEBUG_LOCATION, "LocalityStats"), lrs_server,
-      it->first.first /*cluster_name*/, it->first.second /*eds_service_name*/,
-      locality);
-  it->second.locality_stats[std::move(locality)].locality_stats.insert(
-      cluster_locality_stats.get());
+  LoadReportState& load_report_state = it->second;
+  LoadReportState::LocalityState& locality_state =
+      load_report_state.locality_stats[locality];
+  RefCountedPtr<XdsClusterLocalityStats> cluster_locality_stats;
+  if (locality_state.locality_stats != nullptr) {
+    cluster_locality_stats = locality_state.locality_stats->RefIfNonZero();
+  }
+  if (cluster_locality_stats == nullptr) {
+    if (locality_state.locality_stats != nullptr) {
+      locality_state.deleted_locality_stats +=
+          locality_state.locality_stats->GetSnapshotAndReset();
+    }
+    cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
+        Ref(DEBUG_LOCATION, "LocalityStats"), lrs_server,
+        it->first.first /*cluster_name*/, it->first.second /*eds_service_name*/,
+        std::move(locality));
+    locality_state.locality_stats = cluster_locality_stats.get();
+  }
   chand_->MaybeStartLrsCall();
   return cluster_locality_stats;
 }
@@ -2042,22 +2062,21 @@ void XdsClient::RemoveClusterLocalityStats(
     const RefCountedPtr<XdsLocalityName>& locality,
     XdsClusterLocalityStats* cluster_locality_stats) {
   MutexLock lock(&mu_);
-  auto load_report_it = load_report_map_.find(
-      std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
-  if (load_report_it == load_report_map_.end()) return;
-  LoadReportState& load_report_state = load_report_it->second;
   // TODO(roth): When we add support for direct federation, use the
   // server name specified in lrs_server.
+  auto it = load_report_map_.find(
+      std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
+  if (it == load_report_map_.end()) return;
+  LoadReportState& load_report_state = it->second;
   auto locality_it = load_report_state.locality_stats.find(locality);
   if (locality_it == load_report_state.locality_stats.end()) return;
-  auto& locality_set = locality_it->second.locality_stats;
-  auto it = locality_set.find(cluster_locality_stats);
-  if (it != locality_set.end()) {
+  LoadReportState::LocalityState& locality_state = locality_it->second;
+  if (locality_state.locality_stats == cluster_locality_stats) {
     // Record final snapshot in deleted_locality_stats, which will be
     // added to the next load report.
-    locality_it->second.deleted_locality_stats.emplace_back(
-        cluster_locality_stats->GetSnapshotAndReset());
-    locality_set.erase(it);
+    locality_state.deleted_locality_stats +=
+        locality_state.locality_stats->GetSnapshotAndReset();
+    locality_state.locality_stats = nullptr;
   }
 }
 
@@ -2098,6 +2117,9 @@ void XdsClient::NotifyOnErrorLocked(grpc_error* error) {
 
 XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
     bool send_all_clusters, const std::set<std::string>& clusters) {
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
+    gpr_log(GPR_INFO, "[xds_client %p] start building load report", this);
+  }
   XdsApi::ClusterLoadReportMap snapshot_map;
   for (auto load_report_it = load_report_map_.begin();
        load_report_it != load_report_map_.end();) {
@@ -2116,9 +2138,15 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
     XdsApi::ClusterLoadReport snapshot;
     // Aggregate drop stats.
     snapshot.dropped_requests = std::move(load_report.deleted_drop_stats);
-    for (auto& drop_stats : load_report.drop_stats) {
-      auto dropped_requests = drop_stats->GetSnapshotAndReset();
-      snapshot.dropped_requests += dropped_requests;
+    if (load_report.drop_stats != nullptr) {
+      snapshot.dropped_requests +=
+          load_report.drop_stats->GetSnapshotAndReset();
+      if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
+        gpr_log(GPR_INFO,
+                "[xds_client %p] cluster=%s eds_service_name=%s drop_stats=%p",
+                this, cluster_key.first.c_str(), cluster_key.second.c_str(),
+                load_report.drop_stats);
+      }
     }
     // Aggregate locality stats.
     for (auto it = load_report.locality_stats.begin();
@@ -2127,34 +2155,39 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
       auto& locality_state = it->second;
       XdsClusterLocalityStats::Snapshot& locality_snapshot =
           snapshot.locality_stats[locality_name];
-      for (auto& locality_stats : locality_state.locality_stats) {
-        locality_snapshot += locality_stats->GetSnapshotAndReset();
-      }
-      // Add final snapshots from recently deleted locality stats objects.
-      for (auto& deleted_locality_stats :
-           locality_state.deleted_locality_stats) {
-        locality_snapshot += deleted_locality_stats;
+      locality_snapshot = std::move(locality_state.deleted_locality_stats);
+      if (locality_state.locality_stats != nullptr) {
+        locality_snapshot +=
+            locality_state.locality_stats->GetSnapshotAndReset();
+        if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
+          gpr_log(GPR_INFO,
+                  "[xds_client %p] cluster=%s eds_service_name=%s "
+                  "locality=%s locality_stats=%p",
+                  this, cluster_key.first.c_str(), cluster_key.second.c_str(),
+                  locality_name->AsHumanReadableString().c_str(),
+                  locality_state.locality_stats);
+        }
       }
-      locality_state.deleted_locality_stats.clear();
       // If the only thing left in this entry was final snapshots from
       // deleted locality stats objects, remove the entry.
-      if (locality_state.locality_stats.empty()) {
+      if (locality_state.locality_stats == nullptr) {
         it = load_report.locality_stats.erase(it);
       } else {
         ++it;
       }
     }
+    // Compute load report interval.
+    const grpc_millis now = ExecCtx::Get()->Now();
+    snapshot.load_report_interval = now - load_report.last_report_time;
+    load_report.last_report_time = now;
+    // Record snapshot.
     if (record_stats) {
-      // Compute load report interval.
-      const grpc_millis now = ExecCtx::Get()->Now();
-      snapshot.load_report_interval = now - load_report.last_report_time;
-      load_report.last_report_time = now;
-      // Record snapshot.
       snapshot_map[cluster_key] = std::move(snapshot);
     }
     // If the only thing left in this entry was final snapshots from
     // deleted stats objects, remove the entry.
-    if (load_report.locality_stats.empty() && load_report.drop_stats.empty()) {
+    if (load_report.locality_stats.empty() &&
+        load_report.drop_stats == nullptr) {
       load_report_it = load_report_map_.erase(load_report_it);
     } else {
       ++load_report_it;
index 3e74c2c..49ec9dc 100644 (file)
@@ -39,7 +39,7 @@
 
 namespace grpc_core {
 
-extern TraceFlag xds_client_trace;
+extern TraceFlag grpc_xds_client_trace;
 
 class XdsClient : public DualRefCounted<XdsClient> {
  public:
@@ -86,7 +86,7 @@ class XdsClient : public DualRefCounted<XdsClient> {
 
   // Callers should not instantiate directly.  Use GetOrCreate() instead.
   explicit XdsClient(grpc_error** error);
-  ~XdsClient();
+  ~XdsClient() override;
 
   grpc_pollset_set* interested_parties() const { return interested_parties_; }
 
@@ -198,8 +198,8 @@ class XdsClient : public DualRefCounted<XdsClient> {
     class LrsCallState;
 
     ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
-                 grpc_channel* channel);
-    ~ChannelState();
+                 const XdsBootstrap::XdsServer& server);
+    ~ChannelState() override;
 
     void Orphan() override;
 
@@ -226,6 +226,8 @@ class XdsClient : public DualRefCounted<XdsClient> {
     // The owning xds client.
     WeakRefCountedPtr<XdsClient> xds_client_;
 
+    const XdsBootstrap::XdsServer& server_;
+
     // The channel and its status.
     grpc_channel* channel_;
     bool shutting_down_ = false;
@@ -267,17 +269,13 @@ class XdsClient : public DualRefCounted<XdsClient> {
     absl::optional<XdsApi::EdsUpdate> update;
   };
 
-  // TODO(roth): Change this to store exactly one instance of
-  // XdsClusterDropStats and exactly one instance of
-  // XdsClusterLocalityStats per locality.  We can return multiple refs
-  // to the same object instead of registering multiple objects.
   struct LoadReportState {
     struct LocalityState {
-      std::set<XdsClusterLocalityStats*> locality_stats;
-      std::vector<XdsClusterLocalityStats::Snapshot> deleted_locality_stats;
+      XdsClusterLocalityStats* locality_stats = nullptr;
+      XdsClusterLocalityStats::Snapshot deleted_locality_stats;
     };
 
-    std::set<XdsClusterDropStats*> drop_stats;
+    XdsClusterDropStats* drop_stats = nullptr;
     XdsClusterDropStats::Snapshot deleted_drop_stats;
     std::map<RefCountedPtr<XdsLocalityName>, LocalityState,
              XdsLocalityName::Less>
@@ -317,6 +315,9 @@ class XdsClient : public DualRefCounted<XdsClient> {
       LoadReportState>
       load_report_map_;
 
+  // Stores the most recent accepted resource version for each resource type.
+  std::map<std::string /*type*/, std::string /*version*/> resource_version_map_;
+
   bool shutting_down_ = false;
 };
 
index ba29ec0..72cae4d 100644 (file)
@@ -45,12 +45,29 @@ XdsClusterDropStats::XdsClusterDropStats(RefCountedPtr<XdsClient> xds_client,
                                          absl::string_view lrs_server_name,
                                          absl::string_view cluster_name,
                                          absl::string_view eds_service_name)
-    : xds_client_(std::move(xds_client)),
+    : RefCounted(GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)
+                     ? "XdsClusterDropStats"
+                     : nullptr),
+      xds_client_(std::move(xds_client)),
       lrs_server_name_(lrs_server_name),
       cluster_name_(cluster_name),
-      eds_service_name_(eds_service_name) {}
+      eds_service_name_(eds_service_name) {
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
+    gpr_log(GPR_INFO, "[xds_client %p] created drop stats %p for {%s, %s, %s}",
+            xds_client_.get(), this, std::string(lrs_server_name_).c_str(),
+            std::string(cluster_name_).c_str(),
+            std::string(eds_service_name_).c_str());
+  }
+}
 
 XdsClusterDropStats::~XdsClusterDropStats() {
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
+    gpr_log(GPR_INFO,
+            "[xds_client %p] destroying drop stats %p for {%s, %s, %s}",
+            xds_client_.get(), this, std::string(lrs_server_name_).c_str(),
+            std::string(cluster_name_).c_str(),
+            std::string(eds_service_name_).c_str());
+  }
   xds_client_->RemoveClusterDropStats(lrs_server_name_, cluster_name_,
                                       eds_service_name_, this);
   xds_client_.reset(DEBUG_LOCATION, "DropStats");
@@ -81,13 +98,33 @@ XdsClusterLocalityStats::XdsClusterLocalityStats(
     RefCountedPtr<XdsClient> xds_client, absl::string_view lrs_server_name,
     absl::string_view cluster_name, absl::string_view eds_service_name,
     RefCountedPtr<XdsLocalityName> name)
-    : xds_client_(std::move(xds_client)),
+    : RefCounted(GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)
+                     ? "XdsClusterLocalityStats"
+                     : nullptr),
+      xds_client_(std::move(xds_client)),
       lrs_server_name_(lrs_server_name),
       cluster_name_(cluster_name),
       eds_service_name_(eds_service_name),
-      name_(std::move(name)) {}
+      name_(std::move(name)) {
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
+    gpr_log(GPR_INFO,
+            "[xds_client %p] created locality stats %p for {%s, %s, %s, %s}",
+            xds_client_.get(), this, std::string(lrs_server_name_).c_str(),
+            std::string(cluster_name_).c_str(),
+            std::string(eds_service_name_).c_str(),
+            name_->AsHumanReadableString().c_str());
+  }
+}
 
 XdsClusterLocalityStats::~XdsClusterLocalityStats() {
+  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
+    gpr_log(GPR_INFO,
+            "[xds_client %p] destroying locality stats %p for {%s, %s, %s, %s}",
+            xds_client_.get(), this, std::string(lrs_server_name_).c_str(),
+            std::string(cluster_name_).c_str(),
+            std::string(eds_service_name_).c_str(),
+            name_->AsHumanReadableString().c_str());
+  }
   xds_client_->RemoveClusterLocalityStats(lrs_server_name_, cluster_name_,
                                           eds_service_name_, name_, this);
   xds_client_.reset(DEBUG_LOCATION, "LocalityStats");
index 1906f08..523ef11 100644 (file)
@@ -131,7 +131,7 @@ class XdsClusterDropStats : public RefCounted<XdsClusterDropStats> {
                       absl::string_view lrs_server_name,
                       absl::string_view cluster_name,
                       absl::string_view eds_service_name);
-  ~XdsClusterDropStats();
+  ~XdsClusterDropStats() override;
 
   // Returns a snapshot of this instance and resets all the counters.
   Snapshot GetSnapshotAndReset();
@@ -206,7 +206,7 @@ class XdsClusterLocalityStats : public RefCounted<XdsClusterLocalityStats> {
                           absl::string_view cluster_name,
                           absl::string_view eds_service_name,
                           RefCountedPtr<XdsLocalityName> name);
-  ~XdsClusterLocalityStats();
+  ~XdsClusterLocalityStats() override;
 
   // Returns a snapshot of this instance and resets all the counters.
   Snapshot GetSnapshotAndReset();
index 47cfd86..a89bf92 100644 (file)
@@ -184,8 +184,9 @@ grpc_channel_args* grpc_channel_args_normalize(const grpc_channel_args* a) {
   for (size_t i = 0; i < a->num_args; i++) {
     args[i] = &a->args[i];
   }
-  if (a->num_args > 1)
+  if (a->num_args > 1) {
     qsort(args, a->num_args, sizeof(grpc_arg*), cmp_key_stable);
+  }
 
   grpc_channel_args* b =
       static_cast<grpc_channel_args*>(gpr_malloc(sizeof(grpc_channel_args)));
index d6d2e19..5fc0f9a 100644 (file)
@@ -67,16 +67,18 @@ ChannelTrace::ChannelTrace(size_t max_event_memory)
       max_event_memory_(max_event_memory),
       head_trace_(nullptr),
       tail_trace_(nullptr) {
-  if (max_event_memory_ == 0)
+  if (max_event_memory_ == 0) {
     return;  // tracing is disabled if max_event_memory_ == 0
+  }
   gpr_mu_init(&tracer_mu_);
   time_created_ = grpc_millis_to_timespec(grpc_core::ExecCtx::Get()->Now(),
                                           GPR_CLOCK_REALTIME);
 }
 
 ChannelTrace::~ChannelTrace() {
-  if (max_event_memory_ == 0)
+  if (max_event_memory_ == 0) {
     return;  // tracing is disabled if max_event_memory_ == 0
+  }
   TraceEvent* it = head_trace_;
   while (it != nullptr) {
     TraceEvent* to_free = it;
index 28b0de4..f39ad49 100644 (file)
@@ -55,7 +55,7 @@
  * events per channel trace node. If
  * GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE is set, it will override
  * this default value. */
-#define GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT 1024 * 4
+#define GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT (1024 * 4)
 
 namespace grpc_core {
 
@@ -87,7 +87,7 @@ class BaseNode : public RefCounted<BaseNode> {
   BaseNode(EntityType type, std::string name);
 
  public:
-  virtual ~BaseNode();
+  ~BaseNode() override;
 
   // All children must implement this function.
   virtual Json RenderJson() = 0;
index 10b0631..541f38e 100644 (file)
@@ -77,7 +77,7 @@ struct HandshakerArgs {
 
 class Handshaker : public RefCounted<Handshaker> {
  public:
-  virtual ~Handshaker() = default;
+  ~Handshaker() override = default;
   virtual void Shutdown(grpc_error* why) = 0;
   virtual void DoHandshake(grpc_tcp_server_acceptor* acceptor,
                            grpc_closure* on_handshake_done,
@@ -92,7 +92,7 @@ class Handshaker : public RefCounted<Handshaker> {
 class HandshakeManager : public RefCounted<HandshakeManager> {
  public:
   HandshakeManager();
-  ~HandshakeManager();
+  ~HandshakeManager() override;
 
   /// Add \a mgr to the server side list of all pending handshake managers, the
   /// list starts with \a *head.
index 8a0abca..d14b738 100644 (file)
@@ -150,14 +150,18 @@ grpc_slice grpc_compression_algorithm_slice(
 
 grpc_compression_algorithm grpc_compression_algorithm_from_slice(
     const grpc_slice& str) {
-  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_IDENTITY))
+  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_IDENTITY)) {
     return GRPC_COMPRESS_NONE;
-  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_DEFLATE))
+  }
+  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_DEFLATE)) {
     return GRPC_COMPRESS_DEFLATE;
-  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_GZIP))
+  }
+  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_GZIP)) {
     return GRPC_COMPRESS_GZIP;
-  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_STREAM_SLASH_GZIP))
+  }
+  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_STREAM_SLASH_GZIP)) {
     return GRPC_COMPRESS_STREAM_GZIP;
+  }
   return GRPC_COMPRESS_ALGORITHMS_COUNT;
 }
 
index e0cf6d4..50750f8 100644 (file)
 
 grpc_message_compression_algorithm
 grpc_message_compression_algorithm_from_slice(const grpc_slice& str) {
-  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_IDENTITY))
+  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_IDENTITY)) {
     return GRPC_MESSAGE_COMPRESS_NONE;
-  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_DEFLATE))
+  }
+  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_DEFLATE)) {
     return GRPC_MESSAGE_COMPRESS_DEFLATE;
-  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_GZIP))
+  }
+  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_GZIP)) {
     return GRPC_MESSAGE_COMPRESS_GZIP;
+  }
   return GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT;
 }
 
 grpc_stream_compression_algorithm grpc_stream_compression_algorithm_from_slice(
     const grpc_slice& str) {
-  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_IDENTITY))
+  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_IDENTITY)) {
     return GRPC_STREAM_COMPRESS_NONE;
-  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_GZIP))
+  }
+  if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_GZIP)) {
     return GRPC_STREAM_COMPRESS_GZIP;
+  }
   return GRPC_STREAM_COMPRESS_ALGORITHMS_COUNT;
 }
 
index 49afb94..22977f7 100644 (file)
@@ -21,7 +21,8 @@
 
 #include <grpc/support/port_platform.h>
 
-#include <grpc/impl/codegen/compression_types.h>
+#include <grpc/compression.h>
+#include <grpc/slice.h>
 
 #include "src/core/lib/gpr/useful.h"
 
index d5e3aff..78486f0 100644 (file)
@@ -82,9 +82,7 @@ grpc_stream_compression_context_create_identity(
 }
 
 static void grpc_stream_compression_context_destroy_identity(
-    grpc_stream_compression_context* /*ctx*/) {
-  return;
-}
+    grpc_stream_compression_context* /*ctx*/) {}
 
 const grpc_stream_compression_vtable grpc_stream_compression_identity_vtable = {
     grpc_stream_compress_identity, grpc_stream_decompress_identity,
index f8c27db..ceacc57 100644 (file)
@@ -280,6 +280,7 @@ const char* grpc_stats_histogram_doc[GRPC_STATS_HISTOGRAM_COUNT] = {
     "Number of streams whose payload was written per TCP write",
     "Number of streams terminated per TCP write",
     "Number of flow control updates written per TCP write",
+    // NOLINTNEXTLINE(bugprone-suspicious-missing-comma)
     "How many completion queues were checked looking for a CQ that had "
     "requested the incoming call",
 };
index 2847e03..94a724d 100644 (file)
 
 #ifdef GPR_CPU_IPHONE
 
-/* Probably 2 instead of 1, but see comment on gpr_cpu_current_cpu. */
-unsigned gpr_cpu_num_cores(void) { return 1; }
+#include <sys/sysctl.h>
+
+unsigned gpr_cpu_num_cores(void) {
+  size_t len;
+  unsigned int ncpu;
+  len = sizeof(ncpu);
+  sysctlbyname("hw.ncpu", &ncpu, &len, NULL, 0);
+
+  return ncpu;
+}
 
 /* Most code that's using this is using it to shard across work queues. So
    unless profiling shows it's a problem or there appears a way to detect the
index bf07822..3d1f4dd 100644 (file)
 #include <sys/syscall.h>
 #include <time.h>
 #include <unistd.h>
+
 #include <string>
+
 #include "absl/strings/str_format.h"
+#include "src/core/lib/gprpp/examine_stack.h"
 
 static long sys_gettid(void) { return syscall(__NR_gettid); }
 
@@ -74,10 +77,11 @@ void gpr_default_log(gpr_log_func_args* args) {
 
   timer = static_cast<time_t>(now.tv_sec);
   final_slash = strrchr(args->file, '/');
-  if (final_slash == nullptr)
+  if (final_slash == nullptr) {
     display_file = args->file;
-  else
+  } else {
     display_file = final_slash + 1;
+  }
 
   if (!localtime_r(&timer, &tm)) {
     strcpy(time_buffer, "error:localtime");
@@ -89,7 +93,17 @@ void gpr_default_log(gpr_log_func_args* args) {
   std::string prefix = absl::StrFormat(
       "%s%s.%09" PRId32 " %7ld %s:%d]", gpr_log_severity_string(args->severity),
       time_buffer, now.tv_nsec, tid, display_file, args->line);
-  fprintf(stderr, "%-60s %s\n", prefix.c_str(), args->message);
+
+  absl::optional<std::string> stack_trace =
+      args->severity >= GPR_LOG_SEVERITY_ERROR
+          ? grpc_core::GetCurrentStackTrace()
+          : absl::nullopt;
+  if (stack_trace) {
+    fprintf(stderr, "%-60s %s\n%s\n", prefix.c_str(), args->message,
+            stack_trace->c_str());
+  } else {
+    fprintf(stderr, "%-60s %s\n", prefix.c_str(), args->message);
+  }
 }
 
 #endif /* GPR_LINUX_LOG */
index 3fff01a..de293ce 100644 (file)
@@ -30,7 +30,9 @@
 #include <string.h>
 #include <time.h>
 #include <string>
+
 #include "absl/strings/str_format.h"
+#include "src/core/lib/gprpp/examine_stack.h"
 
 static intptr_t sys_gettid(void) { return (intptr_t)pthread_self(); }
 
@@ -87,7 +89,17 @@ void gpr_default_log(gpr_log_func_args* args) {
   std::string prefix = absl::StrFormat(
       "%s%s.%09d %7" PRIdPTR " %s:%d]", gpr_log_severity_string(args->severity),
       time_buffer, (int)(now.tv_nsec), sys_gettid(), display_file, args->line);
-  fprintf(stderr, "%-70s %s\n", prefix.c_str(), args->message);
+
+  absl::optional<std::string> stack_trace =
+      args->severity >= GPR_LOG_SEVERITY_ERROR
+          ? grpc_core::GetCurrentStackTrace()
+          : absl::nullopt;
+  if (stack_trace) {
+    fprintf(stderr, "%-70s %s\n%s\n", prefix.c_str(), args->message,
+            stack_trace->c_str());
+  } else {
+    fprintf(stderr, "%-70s %s\n", prefix.c_str(), args->message);
+  }
 }
 
 #endif /* defined(GPR_POSIX_LOG) */
index 060be57..bed202f 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "src/core/lib/gpr/string.h"
 #include "src/core/lib/gpr/string_windows.h"
+#include "src/core/lib/gprpp/examine_stack.h"
 
 void gpr_log(const char* file, int line, gpr_log_severity severity,
              const char* format, ...) {
@@ -92,10 +93,21 @@ void gpr_default_log(gpr_log_func_args* args) {
     strcpy(time_buffer, "error:strftime");
   }
 
-  fprintf(stderr, "%s%s.%09u %5lu %s:%d] %s\n",
-          gpr_log_severity_string(args->severity), time_buffer,
-          (int)(now.tv_nsec), GetCurrentThreadId(), display_file, args->line,
-          args->message);
+  absl::optional<std::string> stack_trace =
+      args->severity >= GPR_LOG_SEVERITY_ERROR
+          ? grpc_core::GetCurrentStackTrace()
+          : absl::nullopt;
+  if (stack_trace) {
+    fprintf(stderr, "%s%s.%09u %5lu %s:%d] %s\n%s\n",
+            gpr_log_severity_string(args->severity), time_buffer,
+            (int)(now.tv_nsec), GetCurrentThreadId(), display_file, args->line,
+            args->message, stack_trace->c_str());
+  } else {
+    fprintf(stderr, "%s%s.%09u %5lu %s:%d] %s\n",
+            gpr_log_severity_string(args->severity), time_buffer,
+            (int)(now.tv_nsec), GetCurrentThreadId(), display_file, args->line,
+            args->message);
+  }
   fflush(stderr);
 }
 
index cf25abf..95d11d3 100644 (file)
@@ -22,7 +22,7 @@
 
 #include <string.h>
 
-#define ROTL32(x, r) ((x) << (r)) | ((x) >> (32 - (r)))
+#define ROTL32(x, r) (((x) << (r)) | ((x) >> (32 - (r))))
 
 #define FMIX32(h)    \
   (h) ^= (h) >> 16;  \
index d303423..61b0419 100644 (file)
@@ -216,7 +216,7 @@ int int64_ttoa(int64_t value, char* string) {
 
 int gpr_parse_nonnegative_int(const char* value) {
   char* end;
-  long result = strtol(value, &end, 0);
+  long result = strtol(value, &end, 10);
   if (*end != '\0' || result < 0 || result > INT_MAX) return -1;
   return static_cast<int>(result);
 }
index 4d1b64b..c66b981 100644 (file)
@@ -148,8 +148,9 @@ gpr_cycle_counter gpr_get_cycle_counter() {
 
 gpr_timespec gpr_cycle_counter_to_time(gpr_cycle_counter cycles) {
   gpr_timespec ts;
-  ts.tv_sec = cycles / GPR_US_PER_SEC;
-  ts.tv_nsec = (cycles - ts.tv_sec * GPR_US_PER_SEC) * GPR_NS_PER_US;
+  ts.tv_sec = static_cast<int64_t>(cycles / GPR_US_PER_SEC);
+  ts.tv_nsec = static_cast<int64_t>((cycles - ts.tv_sec * GPR_US_PER_SEC) *
+                                    GPR_NS_PER_US);
   ts.clock_type = GPR_CLOCK_PRECISE;
   return ts;
 }
index aee8f4d..5eb6951 100644 (file)
 
    ALL functions here may be implemented as macros. */
 
+#ifdef GPR_STDCPP_TLS
+#include "src/core/lib/gpr/tls_stdcpp.h"
+#endif
+
 #ifdef GPR_GCC_TLS
 #include "src/core/lib/gpr/tls_gcc.h"
 #endif
index f4b3f0f..73e6734 100644 (file)
@@ -24,6 +24,8 @@
 
    #include tls.h to use this - and see that file for documentation */
 
+#include <cstdint>
+
 struct gpr_msvc_thread_local {
   intptr_t value;
 };
diff --git a/src/core/lib/gpr/tls_stdcpp.h b/src/core/lib/gpr/tls_stdcpp.h
new file mode 100644 (file)
index 0000000..b5b422a
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ *
+ * Copyright 2020 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef GRPC_CORE_LIB_GPR_TLS_STDCPP_H
+#define GRPC_CORE_LIB_GPR_TLS_STDCPP_H
+
+#include <grpc/support/port_platform.h>
+
+/** Thread local storage based on C++ thread_local.
+   #include tls.h to use this - and see that file for documentation */
+
+/** Use GPR_TLS_DECL to declare tls static variables outside a class */
+#define GPR_TLS_DECL(name) thread_local static intptr_t name = 0
+
+/** Use GPR_TLS_CLASS_DECL to declare tls static variable members of a class.
+ *  GPR_TLS_CLASS_DEF needs to be called to define this member. */
+#define GPR_TLS_CLASS_DECL(name) thread_local static intptr_t name
+
+#define GPR_TLS_CLASS_DEF(name) thread_local intptr_t name = 0
+
+#define gpr_tls_init(tls) \
+  do {                    \
+  } while (0)
+
+#define gpr_tls_destroy(tls) \
+  do {                       \
+  } while (0)
+
+#define gpr_tls_set(tls, new_value) (*(tls) = (new_value))
+
+#define gpr_tls_get(tls) (*(tls))
+
+#endif /* GRPC_CORE_LIB_GPR_TLS_STDCPP_H */
index a4e73b9..8382a50 100644 (file)
@@ -33,8 +33,8 @@
 #define GPR_SWAP(type, a, b) \
   do {                       \
     type x = a;              \
-    a = b;                   \
-    b = x;                   \
+    (a) = b;                 \
+    (b) = x;                 \
   } while (0)
 
 /** Set the \a n-th bit of \a i (a mutable pointer). */
@@ -59,7 +59,8 @@
 
 #define GPR_ICMP(a, b) ((a) < (b) ? -1 : ((a) > (b) ? 1 : 0))
 
-#define GPR_HASH_POINTER(x, range) \
-  ((((size_t)x) >> 4) ^ (((size_t)x) >> 9) ^ (((size_t)x) >> 14)) % (range)
+#define GPR_HASH_POINTER(x, range)                                         \
+  (((((size_t)(x)) >> 4) ^ (((size_t)(x)) >> 9) ^ (((size_t)(x)) >> 14)) % \
+   (range))
 
 #endif /* GRPC_CORE_LIB_GPR_USEFUL_H */
index f541d22..f5b8748 100644 (file)
@@ -6,7 +6,3 @@ for other open source projects written in C++.
 
 Note that this is one of the few places in src/core where we allow
 the use of portability macros.
-
-Note that this is the only place in src/core where we allow
-use of the C++ standard library (i.e., anything in the `std::`
-namespace). 
index 66935bb..91469ea 100644 (file)
@@ -27,7 +27,6 @@
 #include <cassert>
 #include <cinttypes>
 
-#include "src/core/lib/debug/trace.h"
 #include "src/core/lib/gprpp/atomic.h"
 #include "src/core/lib/gprpp/debug_location.h"
 #include "src/core/lib/gprpp/orphanable.h"
@@ -52,7 +51,7 @@ namespace grpc_core {
 template <typename Child>
 class DualRefCounted : public Orphanable {
  public:
-  virtual ~DualRefCounted() = default;
+  ~DualRefCounted() override = default;
 
   RefCountedPtr<Child> Ref() GRPC_MUST_USE_RESULT {
     IncrementRefCount();
@@ -72,10 +71,9 @@ class DualRefCounted : public Orphanable {
     const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
 #ifndef NDEBUG
     const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
-    if (trace_flag_ != nullptr && trace_flag_->enabled()) {
-      gpr_log(GPR_INFO, "%s:%p unref %d -> %d, weak_ref %d -> %d",
-              trace_flag_->name(), this, strong_refs, strong_refs - 1,
-              weak_refs, weak_refs + 1);
+    if (trace_ != nullptr) {
+      gpr_log(GPR_INFO, "%s:%p unref %d -> %d, weak_ref %d -> %d", trace_, this,
+              strong_refs, strong_refs - 1, weak_refs, weak_refs + 1);
     }
     GPR_ASSERT(strong_refs > 0);
 #endif
@@ -91,10 +89,10 @@ class DualRefCounted : public Orphanable {
     const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
 #ifndef NDEBUG
     const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
-    if (trace_flag_ != nullptr && trace_flag_->enabled()) {
+    if (trace_ != nullptr) {
       gpr_log(GPR_INFO, "%s:%p %s:%d unref %d -> %d, weak_ref %d -> %d) %s",
-              trace_flag_->name(), this, location.file(), location.line(),
-              strong_refs, strong_refs - 1, weak_refs, weak_refs + 1, reason);
+              trace_, this, location.file(), location.line(), strong_refs,
+              strong_refs - 1, weak_refs, weak_refs + 1, reason);
     }
     GPR_ASSERT(strong_refs > 0);
 #else
@@ -115,10 +113,9 @@ class DualRefCounted : public Orphanable {
       const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
 #ifndef NDEBUG
       const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
-      if (trace_flag_ != nullptr && trace_flag_->enabled()) {
+      if (trace_ != nullptr) {
         gpr_log(GPR_INFO, "%s:%p ref_if_non_zero %d -> %d (weak_refs=%d)",
-                trace_flag_->name(), this, strong_refs, strong_refs + 1,
-                weak_refs);
+                trace_, this, strong_refs, strong_refs + 1, weak_refs);
       }
 #endif
       if (strong_refs == 0) return nullptr;
@@ -135,11 +132,11 @@ class DualRefCounted : public Orphanable {
       const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
 #ifndef NDEBUG
       const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
-      if (trace_flag_ != nullptr && trace_flag_->enabled()) {
+      if (trace_ != nullptr) {
         gpr_log(GPR_INFO,
                 "%s:%p %s:%d ref_if_non_zero %d -> %d (weak_refs=%d) %s",
-                trace_flag_->name(), this, location.file(), location.line(),
-                strong_refs, strong_refs + 1, weak_refs, reason);
+                trace_, this, location.file(), location.line(), strong_refs,
+                strong_refs + 1, weak_refs, reason);
       }
 #else
       // Avoid unused-parameter warnings for debug-only parameters
@@ -167,17 +164,18 @@ class DualRefCounted : public Orphanable {
   void WeakUnref() {
 #ifndef NDEBUG
     // Grab a copy of the trace flag before the atomic change, since we
-    // can't safely access it afterwards if we're going to be freed.
-    auto* trace_flag = trace_flag_;
+    // will no longer be holding a ref afterwards and therefore can't
+    // safely access it, since another thread might free us in the interim.
+    const char* trace = trace_;
 #endif
     const uint64_t prev_ref_pair =
         refs_.FetchSub(MakeRefPair(0, 1), MemoryOrder::ACQ_REL);
     const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
 #ifndef NDEBUG
     const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
-    if (trace_flag != nullptr && trace_flag->enabled()) {
-      gpr_log(GPR_INFO, "%s:%p weak_unref %d -> %d (refs=%d)",
-              trace_flag->name(), this, weak_refs, weak_refs - 1, strong_refs);
+    if (trace != nullptr) {
+      gpr_log(GPR_INFO, "%s:%p weak_unref %d -> %d (refs=%d)", trace, this,
+              weak_refs, weak_refs - 1, strong_refs);
     }
     GPR_ASSERT(weak_refs > 0);
 #endif
@@ -188,18 +186,19 @@ class DualRefCounted : public Orphanable {
   void WeakUnref(const DebugLocation& location, const char* reason) {
 #ifndef NDEBUG
     // Grab a copy of the trace flag before the atomic change, since we
-    // can't safely access it afterwards if we're going to be freed.
-    auto* trace_flag = trace_flag_;
+    // will no longer be holding a ref afterwards and therefore can't
+    // safely access it, since another thread might free us in the interim.
+    const char* trace = trace_;
 #endif
     const uint64_t prev_ref_pair =
         refs_.FetchSub(MakeRefPair(0, 1), MemoryOrder::ACQ_REL);
     const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
 #ifndef NDEBUG
     const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
-    if (trace_flag != nullptr && trace_flag->enabled()) {
-      gpr_log(GPR_INFO, "%s:%p %s:%d weak_unref %d -> %d (refs=%d) %s",
-              trace_flag->name(), this, location.file(), location.line(),
-              weak_refs, weak_refs - 1, strong_refs, reason);
+    if (trace_ != nullptr) {
+      gpr_log(GPR_INFO, "%s:%p %s:%d weak_unref %d -> %d (refs=%d) %s", trace,
+              this, location.file(), location.line(), weak_refs, weak_refs - 1,
+              strong_refs, reason);
     }
     GPR_ASSERT(weak_refs > 0);
 #else
@@ -217,21 +216,18 @@ class DualRefCounted : public Orphanable {
   DualRefCounted& operator=(const DualRefCounted&) = delete;
 
  protected:
-  // TraceFlagT is defined to accept both DebugOnlyTraceFlag and TraceFlag.
-  // Note: RefCount tracing is only enabled on debug builds, even when a
-  //       TraceFlag is used.
-  template <typename TraceFlagT = TraceFlag>
+  // Note: Tracing is a no-op in non-debug builds.
   explicit DualRefCounted(
-      TraceFlagT*
+      const char*
 #ifndef NDEBUG
           // Leave unnamed if NDEBUG to avoid unused parameter warning
-          trace_flag
+          trace
 #endif
       = nullptr,
       int32_t initial_refcount = 1)
       :
 #ifndef NDEBUG
-        trace_flag_(trace_flag),
+        trace_(trace),
 #endif
         refs_(MakeRefPair(initial_refcount, 0)) {
   }
@@ -262,10 +258,9 @@ class DualRefCounted : public Orphanable {
     const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
     const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
     GPR_ASSERT(strong_refs != 0);
-    if (trace_flag_ != nullptr && trace_flag_->enabled()) {
-      gpr_log(GPR_INFO, "%s:%p ref %d -> %d; (weak_refs=%d)",
-              trace_flag_->name(), this, strong_refs, strong_refs + 1,
-              weak_refs);
+    if (trace_ != nullptr) {
+      gpr_log(GPR_INFO, "%s:%p ref %d -> %d; (weak_refs=%d)", trace_, this,
+              strong_refs, strong_refs + 1, weak_refs);
     }
 #else
     refs_.FetchAdd(MakeRefPair(1, 0), MemoryOrder::RELAXED);
@@ -278,10 +273,10 @@ class DualRefCounted : public Orphanable {
     const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
     const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
     GPR_ASSERT(strong_refs != 0);
-    if (trace_flag_ != nullptr && trace_flag_->enabled()) {
-      gpr_log(GPR_INFO, "%s:%p %s:%d ref %d -> %d (weak_refs=%d) %s",
-              trace_flag_->name(), this, location.file(), location.line(),
-              strong_refs, strong_refs + 1, weak_refs, reason);
+    if (trace_ != nullptr) {
+      gpr_log(GPR_INFO, "%s:%p %s:%d ref %d -> %d (weak_refs=%d) %s", trace_,
+              this, location.file(), location.line(), strong_refs,
+              strong_refs + 1, weak_refs, reason);
     }
 #else
     // Use conditionally-important parameters
@@ -297,9 +292,9 @@ class DualRefCounted : public Orphanable {
         refs_.FetchAdd(MakeRefPair(0, 1), MemoryOrder::RELAXED);
     const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
     const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
-    if (trace_flag_ != nullptr && trace_flag_->enabled()) {
-      gpr_log(GPR_INFO, "%s:%p weak_ref %d -> %d; (refs=%d)",
-              trace_flag_->name(), this, weak_refs, weak_refs + 1, strong_refs);
+    if (trace_ != nullptr) {
+      gpr_log(GPR_INFO, "%s:%p weak_ref %d -> %d; (refs=%d)", trace_, this,
+              weak_refs, weak_refs + 1, strong_refs);
     }
 #else
     refs_.FetchAdd(MakeRefPair(0, 1), MemoryOrder::RELAXED);
@@ -312,10 +307,10 @@ class DualRefCounted : public Orphanable {
         refs_.FetchAdd(MakeRefPair(0, 1), MemoryOrder::RELAXED);
     const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
     const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
-    if (trace_flag_ != nullptr && trace_flag_->enabled()) {
-      gpr_log(GPR_INFO, "%s:%p %s:%d weak_ref %d -> %d (refs=%d) %s",
-              trace_flag_->name(), this, location.file(), location.line(),
-              weak_refs, weak_refs + 1, strong_refs, reason);
+    if (trace_ != nullptr) {
+      gpr_log(GPR_INFO, "%s:%p %s:%d weak_ref %d -> %d (refs=%d) %s", trace_,
+              this, location.file(), location.line(), weak_refs, weak_refs + 1,
+              strong_refs, reason);
     }
 #else
     // Use conditionally-important parameters
@@ -326,7 +321,7 @@ class DualRefCounted : public Orphanable {
   }
 
 #ifndef NDEBUG
-  TraceFlag* trace_flag_;
+  const char* trace_;
 #endif
   Atomic<uint64_t> refs_;
 };
diff --git a/src/core/lib/gprpp/examine_stack.cc b/src/core/lib/gprpp/examine_stack.cc
new file mode 100644 (file)
index 0000000..1c5d93a
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ *
+ * Copyright 2020 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/gprpp/examine_stack.h"
+
+namespace grpc_core {
+
+gpr_current_stack_trace_func g_current_stack_trace_provider = nullptr;
+
+gpr_current_stack_trace_func GetCurrentStackTraceProvider() {
+  return g_current_stack_trace_provider;
+}
+
+void SetCurrentStackTraceProvider(
+    gpr_current_stack_trace_func current_stack_trace_provider) {
+  g_current_stack_trace_provider = current_stack_trace_provider;
+}
+
+absl::optional<std::string> GetCurrentStackTrace() {
+  if (g_current_stack_trace_provider != nullptr) {
+    return g_current_stack_trace_provider();
+  }
+  return absl::nullopt;
+}
+
+}  // namespace grpc_core
diff --git a/src/core/lib/gprpp/examine_stack.h b/src/core/lib/gprpp/examine_stack.h
new file mode 100644 (file)
index 0000000..00ba1fc
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ *
+ * Copyright 2020 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef GRPC_CORE_LIB_GPRPP_EXAMINE_STACK_H
+#define GRPC_CORE_LIB_GPRPP_EXAMINE_STACK_H
+
+#include <grpc/support/port_platform.h>
+
+#include <functional>
+#include <string>
+
+#include "absl/types/optional.h"
+
+namespace grpc_core {
+
+typedef std::string (*gpr_current_stack_trace_func)();
+
+// Returns a current_stack_trace_provider.
+gpr_current_stack_trace_func GetCurrentStackTraceProvider();
+
+// Sets current_stack_trace_provider which provides a current-stack trace.
+void SetCurrentStackTraceProvider(
+    gpr_current_stack_trace_func current_stack_trace_provider);
+
+// Returns the current stack trace as a string via current_stack_trace_provider
+// If current_stack_trace_provider is not set, it returns absl::nullopt.
+absl::optional<std::string> GetCurrentStackTrace();
+
+}  // namespace grpc_core
+
+#endif /* GRPC_CORE_LIB_GPRPP_EXAMINE_STACK_H */
index 51d1c80..45a4a89 100644 (file)
@@ -43,7 +43,7 @@
 
 GPR_GLOBAL_CONFIG_DEFINE_BOOL(grpc_enable_fork_support,
                               GRPC_ENABLE_FORK_SUPPORT_DEFAULT,
-                              "Enable folk support");
+                              "Enable fork support");
 
 namespace grpc_core {
 namespace internal {
@@ -54,7 +54,7 @@ namespace internal {
 // When blocked, the exec_ctx_count is 0-indexed.  Note that ExecCtx
 // creation can only be blocked if there is exactly 1 outstanding ExecCtx,
 // meaning that BLOCKED and UNBLOCKED counts partition the integers
-#define UNBLOCKED(n) (n + 2)
+#define UNBLOCKED(n) ((n) + 2)
 #define BLOCKED(n) (n)
 
 class ExecCtxState {
index 7f827ca..7ee1379 100644 (file)
@@ -145,7 +145,7 @@ class PolymorphicManualConstructor {
   }
   template <class DerivedType>
   void Init(DerivedType&& x) {
-    FinishInit(new (&space_) DerivedType(std::move(x)));
+    FinishInit(new (&space_) DerivedType(std::forward<DerivedType>(x)));
   }
 
   void Destroy() { get()->~BaseType(); }
index 79542de..2a95b9d 100644 (file)
@@ -27,7 +27,6 @@
 #include <cinttypes>
 #include <memory>
 
-#include "src/core/lib/debug/trace.h"
 #include "src/core/lib/gprpp/debug_location.h"
 #include "src/core/lib/gprpp/memory.h"
 #include "src/core/lib/gprpp/ref_counted.h"
@@ -85,14 +84,11 @@ class InternallyRefCounted : public Orphanable {
   template <typename T>
   friend class RefCountedPtr;
 
-  // TraceFlagT is defined to accept both DebugOnlyTraceFlag and TraceFlag.
-  // Note: RefCount tracing is only enabled on debug builds, even when a
-  //       TraceFlag is used.
-  template <typename TraceFlagT = TraceFlag>
-  explicit InternallyRefCounted(TraceFlagT* trace_flag = nullptr,
+  // Note: Tracing is a no-op on non-debug builds.
+  explicit InternallyRefCounted(const char* trace = nullptr,
                                 intptr_t initial_refcount = 1)
-      : refs_(initial_refcount, trace_flag) {}
-  virtual ~InternallyRefCounted() = default;
+      : refs_(initial_refcount, trace) {}
+  ~InternallyRefCounted() override = default;
 
   RefCountedPtr<Child> Ref() GRPC_MUST_USE_RESULT {
     IncrementRefCount();
index b69ba31..bb5e180 100644 (file)
@@ -29,7 +29,6 @@
 #include <cassert>
 #include <cinttypes>
 
-#include "src/core/lib/debug/trace.h"
 #include "src/core/lib/gprpp/atomic.h"
 #include "src/core/lib/gprpp/debug_location.h"
 #include "src/core/lib/gprpp/memory.h"
@@ -51,21 +50,19 @@ class RefCount {
 
   // `init` is the initial refcount stored in this object.
   //
-  // TraceFlagT is defined to accept both DebugOnlyTraceFlag and TraceFlag.
-  // Note: RefCount tracing is only enabled on debug builds, even when a
-  //       TraceFlag is used.
-  template <typename TraceFlagT = TraceFlag>
-  constexpr explicit RefCount(
+  // `trace` is a string to be logged with trace events; if null, no
+  // trace logging will be done.  Tracing is a no-op in non-debug builds.
+  explicit RefCount(
       Value init = 1,
-      TraceFlagT*
+      const char*
 #ifndef NDEBUG
           // Leave unnamed if NDEBUG to avoid unused parameter warning
-          trace_flag
+          trace
 #endif
       = nullptr)
       :
 #ifndef NDEBUG
-        trace_flag_(trace_flag),
+        trace_(trace),
 #endif
         value_(init) {
   }
@@ -74,9 +71,9 @@ class RefCount {
   void Ref(Value n = 1) {
 #ifndef NDEBUG
     const Value prior = value_.FetchAdd(n, MemoryOrder::RELAXED);
-    if (trace_flag_ != nullptr && trace_flag_->enabled()) {
-      gpr_log(GPR_INFO, "%s:%p ref %" PRIdPTR " -> %" PRIdPTR,
-              trace_flag_->name(), this, prior, prior + n);
+    if (trace_ != nullptr) {
+      gpr_log(GPR_INFO, "%s:%p ref %" PRIdPTR " -> %" PRIdPTR, trace_, this,
+              prior, prior + n);
     }
 #else
     value_.FetchAdd(n, MemoryOrder::RELAXED);
@@ -85,16 +82,15 @@ class RefCount {
   void Ref(const DebugLocation& location, const char* reason, Value n = 1) {
 #ifndef NDEBUG
     const Value prior = value_.FetchAdd(n, MemoryOrder::RELAXED);
-    if (trace_flag_ != nullptr && trace_flag_->enabled()) {
+    if (trace_ != nullptr) {
       gpr_log(GPR_INFO, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s",
-              trace_flag_->name(), this, location.file(), location.line(),
-              prior, prior + n, reason);
+              trace_, this, location.file(), location.line(), prior, prior + n,
+              reason);
     }
 #else
     // Use conditionally-important parameters
     (void)location;
     (void)reason;
-
     value_.FetchAdd(n, MemoryOrder::RELAXED);
 #endif
   }
@@ -103,9 +99,9 @@ class RefCount {
   void RefNonZero() {
 #ifndef NDEBUG
     const Value prior = value_.FetchAdd(1, MemoryOrder::RELAXED);
-    if (trace_flag_ != nullptr && trace_flag_->enabled()) {
-      gpr_log(GPR_INFO, "%s:%p ref %" PRIdPTR " -> %" PRIdPTR,
-              trace_flag_->name(), this, prior, prior + 1);
+    if (trace_ != nullptr) {
+      gpr_log(GPR_INFO, "%s:%p ref %" PRIdPTR " -> %" PRIdPTR, trace_, this,
+              prior, prior + 1);
     }
     assert(prior > 0);
 #else
@@ -115,10 +111,10 @@ class RefCount {
   void RefNonZero(const DebugLocation& location, const char* reason) {
 #ifndef NDEBUG
     const Value prior = value_.FetchAdd(1, MemoryOrder::RELAXED);
-    if (trace_flag_ != nullptr && trace_flag_->enabled()) {
+    if (trace_ != nullptr) {
       gpr_log(GPR_INFO, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s",
-              trace_flag_->name(), this, location.file(), location.line(),
-              prior, prior + 1, reason);
+              trace_, this, location.file(), location.line(), prior, prior + 1,
+              reason);
     }
     assert(prior > 0);
 #else
@@ -131,23 +127,22 @@ class RefCount {
 
   bool RefIfNonZero() {
 #ifndef NDEBUG
-    if (trace_flag_ != nullptr && trace_flag_->enabled()) {
+    if (trace_ != nullptr) {
       const Value prior = get();
       gpr_log(GPR_INFO, "%s:%p ref_if_non_zero %" PRIdPTR " -> %" PRIdPTR,
-              trace_flag_->name(), this, prior, prior + 1);
+              trace_, this, prior, prior + 1);
     }
 #endif
     return value_.IncrementIfNonzero();
   }
   bool RefIfNonZero(const DebugLocation& location, const char* reason) {
 #ifndef NDEBUG
-    if (trace_flag_ != nullptr && trace_flag_->enabled()) {
+    if (trace_ != nullptr) {
       const Value prior = get();
       gpr_log(GPR_INFO,
-              "%s:%p %s:%d ref_if_non_zero "
-              "%" PRIdPTR " -> %" PRIdPTR " %s",
-              trace_flag_->name(), this, location.file(), location.line(),
-              prior, prior + 1, reason);
+              "%s:%p %s:%d ref_if_non_zero %" PRIdPTR " -> %" PRIdPTR " %s",
+              trace_, this, location.file(), location.line(), prior, prior + 1,
+              reason);
     }
 #endif
     // Avoid unused-parameter warnings for debug-only parameters
@@ -160,14 +155,15 @@ class RefCount {
   bool Unref() {
 #ifndef NDEBUG
     // Grab a copy of the trace flag before the atomic change, since we
-    // can't safely access it afterwards if we're going to be freed.
-    auto* trace_flag = trace_flag_;
+    // will no longer be holding a ref afterwards and therefore can't
+    // safely access it, since another thread might free us in the interim.
+    auto* trace = trace_;
 #endif
     const Value prior = value_.FetchSub(1, MemoryOrder::ACQ_REL);
 #ifndef NDEBUG
-    if (trace_flag != nullptr && trace_flag->enabled()) {
-      gpr_log(GPR_INFO, "%s:%p unref %" PRIdPTR " -> %" PRIdPTR,
-              trace_flag->name(), this, prior, prior - 1);
+    if (trace != nullptr) {
+      gpr_log(GPR_INFO, "%s:%p unref %" PRIdPTR " -> %" PRIdPTR, trace, this,
+              prior, prior - 1);
     }
     GPR_DEBUG_ASSERT(prior > 0);
 #endif
@@ -176,15 +172,16 @@ class RefCount {
   bool Unref(const DebugLocation& location, const char* reason) {
 #ifndef NDEBUG
     // Grab a copy of the trace flag before the atomic change, since we
-    // can't safely access it afterwards if we're going to be freed.
-    auto* trace_flag = trace_flag_;
+    // will no longer be holding a ref afterwards and therefore can't
+    // safely access it, since another thread might free us in the interim.
+    auto* trace = trace_;
 #endif
     const Value prior = value_.FetchSub(1, MemoryOrder::ACQ_REL);
 #ifndef NDEBUG
-    if (trace_flag != nullptr && trace_flag->enabled()) {
+    if (trace != nullptr) {
       gpr_log(GPR_INFO, "%s:%p %s:%d unref %" PRIdPTR " -> %" PRIdPTR " %s",
-              trace_flag->name(), this, location.file(), location.line(), prior,
-              prior - 1, reason);
+              trace, this, location.file(), location.line(), prior, prior - 1,
+              reason);
     }
     GPR_DEBUG_ASSERT(prior > 0);
 #else
@@ -199,7 +196,7 @@ class RefCount {
   Value get() const { return value_.Load(MemoryOrder::RELAXED); }
 
 #ifndef NDEBUG
-  TraceFlag* trace_flag_;
+  const char* trace_;
 #endif
   Atomic<Value> value_;
 };
@@ -315,13 +312,10 @@ class RefCounted : public Impl {
   RefCounted& operator=(const RefCounted&) = delete;
 
  protected:
-  // TraceFlagT is defined to accept both DebugOnlyTraceFlag and TraceFlag.
-  // Note: RefCount tracing is only enabled on debug builds, even when a
-  //       TraceFlag is used.
-  template <typename TraceFlagT = TraceFlag>
-  explicit RefCounted(TraceFlagT* trace_flag = nullptr,
+  // Note: Tracing is a no-op on non-debug builds.
+  explicit RefCounted(const char* trace = nullptr,
                       intptr_t initial_refcount = 1)
-      : refs_(initial_refcount, trace_flag) {}
+      : refs_(initial_refcount, trace) {}
 
  private:
   // Allow RefCountedPtr<> to access IncrementRefCount().
index c28e762..62fb39f 100644 (file)
@@ -39,29 +39,27 @@ class RefCountedPtr {
 
   // If value is non-null, we take ownership of a ref to it.
   template <typename Y>
-  explicit RefCountedPtr(Y* value) {
-    value_ = value;
-  }
+  RefCountedPtr(Y* value) : value_(value) {}
 
   // Move ctors.
-  RefCountedPtr(RefCountedPtr&& other) {
+  RefCountedPtr(RefCountedPtr&& other) noexcept {
     value_ = other.value_;
     other.value_ = nullptr;
   }
   template <typename Y>
-  RefCountedPtr(RefCountedPtr<Y>&& other) {
+  RefCountedPtr(RefCountedPtr<Y>&& other) noexcept {
     value_ = static_cast<T*>(other.value_);
     other.value_ = nullptr;
   }
 
   // Move assignment.
-  RefCountedPtr& operator=(RefCountedPtr&& other) {
+  RefCountedPtr& operator=(RefCountedPtr&& other) noexcept {
     reset(other.value_);
     other.value_ = nullptr;
     return *this;
   }
   template <typename Y>
-  RefCountedPtr& operator=(RefCountedPtr<Y>&& other) {
+  RefCountedPtr& operator=(RefCountedPtr<Y>&& other) noexcept {
     reset(other.value_);
     other.value_ = nullptr;
     return *this;
@@ -192,24 +190,24 @@ class WeakRefCountedPtr {
   }
 
   // Move ctors.
-  WeakRefCountedPtr(WeakRefCountedPtr&& other) {
+  WeakRefCountedPtr(WeakRefCountedPtr&& other) noexcept {
     value_ = other.value_;
     other.value_ = nullptr;
   }
   template <typename Y>
-  WeakRefCountedPtr(WeakRefCountedPtr<Y>&& other) {
+  WeakRefCountedPtr(WeakRefCountedPtr<Y>&& other) noexcept {
     value_ = static_cast<T*>(other.value_);
     other.value_ = nullptr;
   }
 
   // Move assignment.
-  WeakRefCountedPtr& operator=(WeakRefCountedPtr&& other) {
+  WeakRefCountedPtr& operator=(WeakRefCountedPtr&& other) noexcept {
     reset(other.value_);
     other.value_ = nullptr;
     return *this;
   }
   template <typename Y>
-  WeakRefCountedPtr& operator=(WeakRefCountedPtr<Y>&& other) {
+  WeakRefCountedPtr& operator=(WeakRefCountedPtr<Y>&& other) noexcept {
     reset(other.value_);
     other.value_ = nullptr;
     return *this;
similarity index 51%
rename from src/core/lib/security/authorization/mock_cel/statusor.h
rename to src/core/lib/gprpp/stat.h
index f97a8ec..9c4fcaf 100644 (file)
@@ -1,3 +1,4 @@
+//
 // Copyright 2020 gRPC authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
+//
 
-#ifndef GRPC_CORE_LIB_SECURITY_AUTHORIZATION_MOCK_CEL_STATUSOR_H
-#define GRPC_CORE_LIB_SECURITY_AUTHORIZATION_MOCK_CEL_STATUSOR_H
+#ifndef GRPC_CORE_LIB_GPRPP_STAT_H
+#define GRPC_CORE_LIB_GPRPP_STAT_H
 
 #include <grpc/support/port_platform.h>
 
-#include <memory>
+#include <stdio.h>
+#include <time.h>
 
 #include "absl/status/status.h"
+#include "absl/strings/string_view.h"
 
 namespace grpc_core {
-namespace mock_cel {
-
-// This is a temporary stub implementation of CEL APIs.
-// Once gRPC imports the CEL library, this file will be removed.
-
-template <typename T>
-class ABSL_MUST_USE_RESULT StatusOr;
-
-template <typename T>
-class StatusOr {
- public:
-  StatusOr() = default;
-
-  StatusOr(const T& value) {}
-
-  StatusOr(const absl::Status& status) {}
-
-  StatusOr(absl::Status&& status) {}
 
-  bool ok() const { return true; }
-};
+// Gets the last-modified timestamp of a file or a directory.
+// On success, the correct timestamp will be filled with an StatusCode::kOk
+// returned. Otherwise, timestamp will be untouched and an
+// StatusCode::kInternal will be returned.
+absl::Status GetFileModificationTime(const char* filename, time_t* timestamp);
 
-}  // namespace mock_cel
 }  // namespace grpc_core
 
-#endif  // GRPC_CORE_LIB_SECURITY_AUTHORIZATION_MOCK_CEL_STATUSOR_H
\ No newline at end of file
+#endif  // GRPC_CORE_LIB_GPRPP_STAT_H
diff --git a/src/core/lib/gprpp/stat_posix.cc b/src/core/lib/gprpp/stat_posix.cc
new file mode 100644 (file)
index 0000000..888361b
--- /dev/null
@@ -0,0 +1,49 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <grpc/support/port_platform.h>
+
+#ifdef GPR_POSIX_STAT
+
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <grpc/support/log.h>
+
+#include "src/core/lib/gprpp/stat.h"
+
+namespace grpc_core {
+
+absl::Status GetFileModificationTime(const char* filename, time_t* timestamp) {
+  GPR_ASSERT(filename != nullptr);
+  GPR_ASSERT(timestamp != nullptr);
+  struct stat buf;
+  if (stat(filename, &buf) != 0) {
+    const char* error_msg = strerror(errno);
+    gpr_log(GPR_ERROR, "stat failed for filename %s with error %s.", filename,
+            error_msg);
+    return absl::Status(absl::StatusCode::kInternal, error_msg);
+  }
+  // Last file/directory modification time.
+  *timestamp = buf.st_mtime;
+  return absl::OkStatus();
+}
+
+}  // namespace grpc_core
+
+#endif  // GPR_POSIX_STAT
diff --git a/src/core/lib/gprpp/stat_windows.cc b/src/core/lib/gprpp/stat_windows.cc
new file mode 100644 (file)
index 0000000..f1435e0
--- /dev/null
@@ -0,0 +1,48 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <grpc/support/port_platform.h>
+
+#ifdef GPR_WINDOWS_STAT
+
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <grpc/support/log.h>
+
+#include "src/core/lib/gprpp/stat.h"
+
+namespace grpc_core {
+
+absl::Status GetFileModificationTime(const char* filename, time_t* timestamp) {
+  GPR_ASSERT(filename != nullptr);
+  GPR_ASSERT(timestamp != nullptr);
+  struct _stat buf;
+  if (_stat(filename, &buf) != 0) {
+    const char* error_msg = strerror(errno);
+    gpr_log(GPR_ERROR, "_stat failed for filename %s with error %s.", filename,
+            error_msg);
+    return absl::Status(absl::StatusCode::kInternal, error_msg);
+  }
+  // Last file/directory modification time.
+  *timestamp = buf.st_mtime;
+  return absl::OkStatus();
+}
+
+}  // namespace grpc_core
+
+#endif  // GPR_WINDOWS_STAT
index 8e50f54..2e7135e 100644 (file)
@@ -91,7 +91,7 @@ class Thread {
 
   /// Move constructor for thread. After this is called, the other thread
   /// no longer represents a living thread object
-  Thread(Thread&& other)
+  Thread(Thread&& other) noexcept
       : state_(other.state_), impl_(other.impl_), options_(other.options_) {
     other.state_ = MOVED;
     other.impl_ = nullptr;
@@ -101,7 +101,7 @@ class Thread {
   /// Move assignment operator for thread. After this is called, the other
   /// thread no longer represents a living thread object. Not allowed if this
   /// thread actually exists
-  Thread& operator=(Thread&& other) {
+  Thread& operator=(Thread&& other) noexcept {
     if (this != &other) {
       // TODO(vjpai): if we can be sure that all Thread's are actually
       // constructed, then we should assert GPR_ASSERT(impl_ == nullptr) here.
index 4df41a6..b441ae4 100644 (file)
@@ -105,45 +105,45 @@ class ThreadInternalsPosix : public internal::ThreadInternalsInterface {
       GPR_ASSERT(pthread_attr_setstacksize(&attr, stack_size) == 0);
     }
 
-    *success =
-        (pthread_create(&pthread_id_, &attr,
-                        [](void* v) -> void* {
-                          thd_arg arg = *static_cast<thd_arg*>(v);
-                          free(v);
-                          if (arg.name != nullptr) {
+    *success = (pthread_create(
+                    &pthread_id_, &attr,
+                    [](void* v) -> void* {
+                      thd_arg arg = *static_cast<thd_arg*>(v);
+                      free(v);
+                      if (arg.name != nullptr) {
 #if GPR_APPLE_PTHREAD_NAME
-                            /* Apple supports 64 characters, and will
-                             * truncate if it's longer. */
-                            pthread_setname_np(arg.name);
+                        /* Apple supports 64 characters, and will
+                         * truncate if it's longer. */
+                        pthread_setname_np(arg.name);
 #elif GPR_LINUX_PTHREAD_NAME
-                            /* Linux supports 16 characters max, and will
-                             * error if it's longer. */
-                            char buf[16];
-                            size_t buf_len = GPR_ARRAY_SIZE(buf) - 1;
-                            strncpy(buf, arg.name, buf_len);
-                            buf[buf_len] = '\0';
-                            pthread_setname_np(pthread_self(), buf);
+                        /* Linux supports 16 characters max, and will
+                         * error if it's longer. */
+                        char buf[16];
+                        size_t buf_len = GPR_ARRAY_SIZE(buf) - 1;
+                        strncpy(buf, arg.name, buf_len);
+                        buf[buf_len] = '\0';
+                        pthread_setname_np(pthread_self(), buf);
 #endif  // GPR_APPLE_PTHREAD_NAME
-                          }
-
-                          gpr_mu_lock(&arg.thread->mu_);
-                          while (!arg.thread->started_) {
-                            gpr_cv_wait(&arg.thread->ready_, &arg.thread->mu_,
-                                        gpr_inf_future(GPR_CLOCK_MONOTONIC));
-                          }
-                          gpr_mu_unlock(&arg.thread->mu_);
-
-                          if (!arg.joinable) {
-                            delete arg.thread;
-                          }
-
-                          (*arg.body)(arg.arg);
-                          if (arg.tracked) {
-                            Fork::DecThreadCount();
-                          }
-                          return nullptr;
-                        },
-                        info) == 0);
+                      }
+
+                      gpr_mu_lock(&arg.thread->mu_);
+                      while (!arg.thread->started_) {
+                        gpr_cv_wait(&arg.thread->ready_, &arg.thread->mu_,
+                                    gpr_inf_future(GPR_CLOCK_MONOTONIC));
+                      }
+                      gpr_mu_unlock(&arg.thread->mu_);
+
+                      if (!arg.joinable) {
+                        delete arg.thread;
+                      }
+
+                      (*arg.body)(arg.arg);
+                      if (arg.tracked) {
+                        Fork::DecThreadCount();
+                      }
+                      return nullptr;
+                    },
+                    info) == 0);
 
     GPR_ASSERT(pthread_attr_destroy(&attr) == 0);
 
index 022ef9a..b95a942 100644 (file)
@@ -42,36 +42,48 @@ static grpc_error* handle_response_line(grpc_http_parser* parser) {
   uint8_t* cur = beg;
   uint8_t* end = beg + parser->cur_line_length;
 
-  if (cur == end || *cur++ != 'H')
+  if (cur == end || *cur++ != 'H') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'H'");
-  if (cur == end || *cur++ != 'T')
+  }
+  if (cur == end || *cur++ != 'T') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'T'");
-  if (cur == end || *cur++ != 'T')
+  }
+  if (cur == end || *cur++ != 'T') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'T'");
-  if (cur == end || *cur++ != 'P')
+  }
+  if (cur == end || *cur++ != 'P') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'P'");
-  if (cur == end || *cur++ != '/')
+  }
+  if (cur == end || *cur++ != '/') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected '/'");
-  if (cur == end || *cur++ != '1')
+  }
+  if (cur == end || *cur++ != '1') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected '1'");
-  if (cur == end || *cur++ != '.')
+  }
+  if (cur == end || *cur++ != '.') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected '.'");
+  }
   if (cur == end || *cur < '0' || *cur++ > '1') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
         "Expected HTTP/1.0 or HTTP/1.1");
   }
-  if (cur == end || *cur++ != ' ')
+  if (cur == end || *cur++ != ' ') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected ' '");
-  if (cur == end || *cur < '1' || *cur++ > '9')
+  }
+  if (cur == end || *cur < '1' || *cur++ > '9') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected status code");
-  if (cur == end || *cur < '0' || *cur++ > '9')
+  }
+  if (cur == end || *cur < '0' || *cur++ > '9') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected status code");
-  if (cur == end || *cur < '0' || *cur++ > '9')
+  }
+  if (cur == end || *cur < '0' || *cur++ > '9') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected status code");
+  }
   parser->http.response->status =
       (cur[-3] - '0') * 100 + (cur[-2] - '0') * 10 + (cur[-1] - '0');
-  if (cur == end || *cur++ != ' ')
+  if (cur == end || *cur++ != ' ') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected ' '");
+  }
 
   /* we don't really care about the status code message */
 
@@ -85,36 +97,44 @@ static grpc_error* handle_request_line(grpc_http_parser* parser) {
   uint8_t vers_major = 0;
   uint8_t vers_minor = 0;
 
-  while (cur != end && *cur++ != ' ')
-    ;
-  if (cur == end)
+  while (cur != end && *cur++ != ' ') {
+  }
+  if (cur == end) {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
         "No method on HTTP request line");
+  }
   parser->http.request->method =
       buf2str(beg, static_cast<size_t>(cur - beg - 1));
 
   beg = cur;
-  while (cur != end && *cur++ != ' ')
-    ;
-  if (cur == end)
+  while (cur != end && *cur++ != ' ') {
+  }
+  if (cur == end) {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No path on HTTP request line");
+  }
   parser->http.request->path = buf2str(beg, static_cast<size_t>(cur - beg - 1));
 
-  if (cur == end || *cur++ != 'H')
+  if (cur == end || *cur++ != 'H') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'H'");
-  if (cur == end || *cur++ != 'T')
+  }
+  if (cur == end || *cur++ != 'T') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'T'");
-  if (cur == end || *cur++ != 'T')
+  }
+  if (cur == end || *cur++ != 'T') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'T'");
-  if (cur == end || *cur++ != 'P')
+  }
+  if (cur == end || *cur++ != 'P') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'P'");
-  if (cur == end || *cur++ != '/')
+  }
+  if (cur == end || *cur++ != '/') {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected '/'");
+  }
   vers_major = static_cast<uint8_t>(*cur++ - '1' + 1);
   ++cur;
-  if (cur == end)
+  if (cur == end) {
     return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
         "End of line in HTTP version string");
+  }
   vers_minor = static_cast<uint8_t>(*cur++ - '1' + 1);
 
   if (vers_major == 1) {
@@ -300,9 +320,10 @@ static grpc_error* addbyte(grpc_http_parser* parser, uint8_t byte,
     case GRPC_HTTP_FIRST_LINE:
     case GRPC_HTTP_HEADERS:
       if (parser->cur_line_length >= GRPC_HTTP_PARSER_MAX_HEADER_LENGTH) {
-        if (GRPC_TRACE_FLAG_ENABLED(grpc_http1_trace))
+        if (GRPC_TRACE_FLAG_ENABLED(grpc_http1_trace)) {
           gpr_log(GPR_ERROR, "HTTP header max line length (%d) exceeded",
                   GRPC_HTTP_PARSER_MAX_HEADER_LENGTH);
+        }
         return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
             "HTTP header max line length exceeded");
       }
index 6ffadd5..b57c10c 100644 (file)
@@ -292,7 +292,7 @@ static void internal_add_error(grpc_error** err, grpc_error* new_err) {
   memcpy((*err)->arena + slot, &new_last, sizeof(grpc_linked_error));
 }
 
-#define SLOTS_PER_INT (sizeof(intptr_t) / sizeof(intptr_t))
+#define SLOTS_PER_INT (1)  // == (sizeof(intptr_t) / sizeof(intptr_t))
 #define SLOTS_PER_STR (sizeof(grpc_slice) / sizeof(intptr_t))
 #define SLOTS_PER_TIME (sizeof(gpr_timespec) / sizeof(intptr_t))
 #define SLOTS_PER_LINKED_ERROR (sizeof(grpc_linked_error) / sizeof(intptr_t))
@@ -424,6 +424,7 @@ static grpc_error* copy_error_and_unref(grpc_error* in) {
     }
 #endif
     // bulk memcpy of the rest of the struct.
+    // NOLINTNEXTLINE(bugprone-sizeof-expression)
     size_t skip = sizeof(&out->atomics);
     memcpy((void*)((uintptr_t)out + skip), (void*)((uintptr_t)in + skip),
            sizeof(*in) + (in->arena_size * sizeof(intptr_t)) - skip);
index 055251f..d3392f3 100644 (file)
@@ -591,7 +591,10 @@ static grpc_error* pollable_create(pollable_type type, pollable** p) {
   }
 
   (*p)->type = type;
-  new (&(*p)->refs) grpc_core::RefCount(1, &grpc_trace_pollable_refcount);
+  new (&(*p)->refs) grpc_core::RefCount(
+      1, GRPC_TRACE_FLAG_ENABLED(grpc_trace_pollable_refcount)
+             ? "pollable_refcount"
+             : nullptr);
   gpr_mu_init(&(*p)->mu);
   (*p)->epfd = epfd;
   (*p)->owner_fd = nullptr;
@@ -802,12 +805,13 @@ static void pollset_init(grpc_pollset* pollset, gpr_mu** mu) {
 static int poll_deadline_to_millis_timeout(grpc_millis millis) {
   if (millis == GRPC_MILLIS_INF_FUTURE) return -1;
   grpc_millis delta = millis - grpc_core::ExecCtx::Get()->Now();
-  if (delta > INT_MAX)
+  if (delta > INT_MAX) {
     return INT_MAX;
-  else if (delta < 0)
+  } else if (delta < 0) {
     return 0;
-  else
+  } else {
     return static_cast<int>(delta);
+  }
 }
 
 static void fd_become_readable(grpc_fd* fd) { fd->read_closure.SetReady(); }
index e392a99..18d0aae 100644 (file)
@@ -140,7 +140,7 @@ void ExecCtx::GlobalInit(void) {
 }
 
 bool ExecCtx::Flush() {
-  bool did_something = 0;
+  bool did_something = false;
   GPR_TIMER_SCOPE("grpc_exec_ctx_flush", 0);
   for (;;) {
     if (!grpc_closure_list_empty(closure_list_)) {
index 474f40b..46e88b8 100644 (file)
@@ -42,7 +42,7 @@ class MPMCQueueInterface {
   // Removes the oldest element from the queue and return it.
   // This might cause to block on empty queue depending on implementation.
   // Optional argument for collecting stats purpose.
-  virtual void* Get(gpr_timespec* wait_time = nullptr) = 0;
+  virtual void* Get(gpr_timespec* wait_time) = 0;
 
   // Returns number of elements in the queue currently
   virtual int count() const = 0;
@@ -55,22 +55,22 @@ class InfLenFIFOQueue : public MPMCQueueInterface {
 
   // Releases all resources held by the queue. The queue must be empty, and no
   // one waits on conditional variables.
-  ~InfLenFIFOQueue();
+  ~InfLenFIFOQueue() override;
 
   // Puts elem into queue immediately at the end of queue. Since the queue has
   // infinite length, this routine will never block and should never fail.
-  void Put(void* elem);
+  void Put(void* elem) override;
 
   // Removes the oldest element from the queue and returns it.
   // This routine will cause the thread to block if queue is currently empty.
   // Argument wait_time should be passed in when trace flag turning on (for
   // collecting stats info purpose.)
-  void* Get(gpr_timespec* wait_time = nullptr);
+  void* Get(gpr_timespec* wait_time) override;
 
   // Returns number of elements in queue currently.
   // There might be concurrently add/remove on queue, so count might change
   // quickly.
-  int count() const { return count_.Load(MemoryOrder::RELAXED); }
+  int count() const override { return count_.Load(MemoryOrder::RELAXED); }
 
   struct Node {
     Node* next;  // Linking
index 01a00c0..5f8a968 100644 (file)
@@ -65,9 +65,9 @@ class ThreadPoolWorker {
   ThreadPoolWorker(const char* thd_name, MPMCQueueInterface* queue,
                    Thread::Options& options, int index)
       : queue_(queue), thd_name_(thd_name), index_(index) {
-    thd_ = Thread(thd_name,
-                  [](void* th) { static_cast<ThreadPoolWorker*>(th)->Run(); },
-                  this, nullptr, options);
+    thd_ = Thread(
+        thd_name, [](void* th) { static_cast<ThreadPoolWorker*>(th)->Run(); },
+        this, nullptr, options);
   }
 
   ~ThreadPoolWorker() {}
index e945f96..9e8f785 100644 (file)
@@ -18,6 +18,8 @@
 
 #include <grpc/support/port_platform.h>
 
+#include "absl/strings/str_cat.h"
+
 #include "src/core/lib/iomgr/grpc_if_nametoindex.h"
 #include "src/core/lib/iomgr/parse_address.h"
 #include "src/core/lib/iomgr/sockaddr.h"
@@ -49,24 +51,98 @@ bool grpc_parse_unix(const grpc_uri* uri,
     gpr_log(GPR_ERROR, "Expected 'unix' scheme, got '%s'", uri->scheme);
     return false;
   }
+  grpc_error* error = grpc_core::UnixSockaddrPopulate(uri->path, resolved_addr);
+  if (error != GRPC_ERROR_NONE) {
+    gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
+    GRPC_ERROR_UNREF(error);
+    return false;
+  }
+  return true;
+}
+
+bool grpc_parse_unix_abstract(const grpc_uri* uri,
+                              grpc_resolved_address* resolved_addr) {
+  if (strcmp("unix-abstract", uri->scheme) != 0) {
+    gpr_log(GPR_ERROR, "Expected 'unix-abstract' scheme, got '%s'",
+            uri->scheme);
+    return false;
+  }
+  grpc_error* error =
+      grpc_core::UnixAbstractSockaddrPopulate(uri->path, resolved_addr);
+  if (error != GRPC_ERROR_NONE) {
+    gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
+    GRPC_ERROR_UNREF(error);
+    return false;
+  }
+  return true;
+}
+
+namespace grpc_core {
+
+grpc_error* UnixSockaddrPopulate(absl::string_view path,
+                                 grpc_resolved_address* resolved_addr) {
   struct sockaddr_un* un =
       reinterpret_cast<struct sockaddr_un*>(resolved_addr->addr);
-  const size_t maxlen = sizeof(un->sun_path);
-  const size_t path_len = strnlen(uri->path, maxlen);
-  if (path_len == maxlen) return false;
+  const size_t maxlen = sizeof(un->sun_path) - 1;
+  if (path.size() > maxlen) {
+    return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrCat("Path name should not have more than ", maxlen,
+                     " characters")
+            .c_str());
+  }
   un->sun_family = AF_UNIX;
-  strcpy(un->sun_path, uri->path);
+  path.copy(un->sun_path, path.size());
+  un->sun_path[path.size()] = '\0';
   resolved_addr->len = static_cast<socklen_t>(sizeof(*un));
-  return true;
+  return GRPC_ERROR_NONE;
 }
 
-#else /* GRPC_HAVE_UNIX_SOCKET */
+grpc_error* UnixAbstractSockaddrPopulate(absl::string_view path,
+                                         grpc_resolved_address* resolved_addr) {
+  struct sockaddr_un* un =
+      reinterpret_cast<struct sockaddr_un*>(resolved_addr->addr);
+  const size_t maxlen = sizeof(un->sun_path) - 1;
+  if (path.size() > maxlen) {
+    return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrCat("Path name should not have more than ", maxlen,
+                     " characters")
+            .c_str());
+  }
+  un->sun_family = AF_UNIX;
+  un->sun_path[0] = '\0';
+  path.copy(un->sun_path + 1, path.size());
+  resolved_addr->len =
+      static_cast<socklen_t>(sizeof(un->sun_family) + path.size() + 1);
+  return GRPC_ERROR_NONE;
+}
+
+}  // namespace grpc_core
+
+#else  /* GRPC_HAVE_UNIX_SOCKET */
 
 bool grpc_parse_unix(const grpc_uri* uri,
                      grpc_resolved_address* resolved_addr) {
   abort();
 }
 
+bool grpc_parse_unix_abstract(const grpc_uri* uri,
+                              grpc_resolved_address* resolved_addr) {
+  abort();
+}
+
+namespace grpc_core {
+
+grpc_error* UnixSockaddrPopulate(absl::string_view path,
+                                 grpc_resolved_address* resolved_addr) {
+  abort();
+}
+
+grpc_error* UnixAbstractSockaddrPopulate(absl::string_view path,
+                                         grpc_resolved_address* resolved_addr) {
+  abort();
+}
+
+}  // namespace grpc_core
 #endif /* GRPC_HAVE_UNIX_SOCKET */
 
 bool grpc_parse_ipv4_hostport(const char* hostport, grpc_resolved_address* addr,
@@ -219,6 +295,8 @@ bool grpc_parse_ipv6(const grpc_uri* uri,
 bool grpc_parse_uri(const grpc_uri* uri, grpc_resolved_address* resolved_addr) {
   if (strcmp("unix", uri->scheme) == 0) {
     return grpc_parse_unix(uri, resolved_addr);
+  } else if (strcmp("unix-abstract", uri->scheme) == 0) {
+    return grpc_parse_unix_abstract(uri, resolved_addr);
   } else if (strcmp("ipv4", uri->scheme) == 0) {
     return grpc_parse_ipv4(uri, resolved_addr);
   } else if (strcmp("ipv6", uri->scheme) == 0) {
index d42daac..29c8321 100644 (file)
@@ -23,6 +23,8 @@
 
 #include <stddef.h>
 
+#include "absl/strings/string_view.h"
+
 #include "src/core/lib/iomgr/resolve_address.h"
 #include "src/core/lib/uri/uri_parser.h"
 
  * unix socket path. Returns true upon success. */
 bool grpc_parse_unix(const grpc_uri* uri, grpc_resolved_address* resolved_addr);
 
+/** Populate \a resolved_addr from \a uri, whose path is expected to contain a
+ * unix socket path in the abstract namespace. Returns true upon success. */
+bool grpc_parse_unix_abstract(const grpc_uri* uri,
+                              grpc_resolved_address* resolved_addr);
+
 /** Populate \a resolved_addr from \a uri, whose path is expected to contain an
  * IPv4 host:port pair. Returns true upon success. */
 bool grpc_parse_ipv4(const grpc_uri* uri, grpc_resolved_address* resolved_addr);
@@ -50,4 +57,17 @@ bool grpc_parse_ipv6_hostport(const char* hostport, grpc_resolved_address* addr,
 /* Converts named or numeric port to a uint16 suitable for use in a sockaddr. */
 uint16_t grpc_strhtons(const char* port);
 
+namespace grpc_core {
+
+/** Populate \a resolved_addr to be a unix socket at |path| */
+grpc_error* UnixSockaddrPopulate(absl::string_view path,
+                                 grpc_resolved_address* resolved_addr);
+
+/** Populate \a resolved_addr to be a unix socket in the abstract namespace
+ * at |path| */
+grpc_error* UnixAbstractSockaddrPopulate(absl::string_view path,
+                                         grpc_resolved_address* resolved_addr);
+
+}  // namespace grpc_core
+
 #endif /* GRPC_CORE_LIB_IOMGR_PARSE_ADDRESS_H */
index e7045df..c34430a 100644 (file)
@@ -63,8 +63,9 @@ bool grpc::experimental::LibuvEventManager::ShouldStop() {
 }
 
 void grpc::experimental::LibuvEventManager::Shutdown() {
-  if (should_stop_.Load(grpc_core::MemoryOrder::ACQUIRE))
+  if (should_stop_.Load(grpc_core::MemoryOrder::ACQUIRE)) {
     return;  // Already shut down.
+  }
 
   {
     grpc_core::MutexLock lock(&shutdown_mu_);
index 42174ab..a8c2fe4 100644 (file)
 // They are easier to define here (rather than in Cython)
 // because Cython doesn't handle #defines well.
 
-grpc_error* grpc_socket_error(char* error) {
+inline grpc_error* grpc_socket_error(char* error) {
   return grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(error),
                             GRPC_ERROR_INT_GRPC_STATUS,
                             GRPC_STATUS_UNAVAILABLE);
 }
 
-char* grpc_slice_buffer_start(grpc_slice_buffer* buffer, int i) {
+inline char* grpc_slice_buffer_start(grpc_slice_buffer* buffer, int i) {
   return (char*)GRPC_SLICE_START_PTR(buffer->slices[i]);
 }
 
-int grpc_slice_buffer_length(grpc_slice_buffer* buffer, int i) {
+inline int grpc_slice_buffer_length(grpc_slice_buffer* buffer, int i) {
   return GRPC_SLICE_LENGTH(buffer->slices[i]);
 }
 
index 1558dd5..122dbe6 100644 (file)
@@ -52,11 +52,6 @@ static grpc_error* posix_blocking_resolve_address(
   size_t i;
   grpc_error* err;
 
-  if (name[0] == 'u' && name[1] == 'n' && name[2] == 'i' && name[3] == 'x' &&
-      name[4] == ':' && name[5] != 0) {
-    return grpc_resolve_unix_domain_address(name + 5, addresses);
-  }
-
   std::string host;
   std::string port;
   /* parse name, splitting it into host and port parts */
@@ -67,6 +62,7 @@ static grpc_error* posix_blocking_resolve_address(
         GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name));
     goto done;
   }
+
   if (port.empty()) {
     if (default_port == nullptr) {
       err = grpc_error_set_str(
index 3c57034..b968ef9 100644 (file)
@@ -1689,7 +1689,7 @@ static const grpc_endpoint_vtable vtable = {tcp_read,
                                             tcp_get_fd,
                                             tcp_can_track_err};
 
-#define MAX_CHUNK_SIZE 32 * 1024 * 1024
+#define MAX_CHUNK_SIZE (32 * 1024 * 1024)
 
 grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd,
                                const grpc_channel_args* channel_args,
@@ -1798,7 +1798,8 @@ grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd,
 #endif
   }
   /* paired with unref in grpc_tcp_destroy */
-  new (&tcp->refcount) grpc_core::RefCount(1, &grpc_tcp_trace);
+  new (&tcp->refcount) grpc_core::RefCount(
+      1, GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace) ? "tcp" : nullptr);
   gpr_atm_no_barrier_store(&tcp->shutdown_count, 0);
   tcp->em_fd = em_fd;
   grpc_slice_buffer_init(&tcp->last_read_buffer);
index c550d44..4d0e4e9 100644 (file)
@@ -36,7 +36,7 @@ void grpc_custom_timer_callback(grpc_custom_timer* t, grpc_error* /*error*/) {
   grpc_core::ExecCtx exec_ctx;
   grpc_timer* timer = t->original;
   GPR_ASSERT(timer->pending);
-  timer->pending = 0;
+  timer->pending = false;
   grpc_core::ExecCtx::Run(DEBUG_LOCATION, timer->closure, GRPC_ERROR_NONE);
   custom_timer_impl->stop(t);
   gpr_free(t);
@@ -68,7 +68,7 @@ static void timer_cancel(grpc_timer* timer) {
   GRPC_CUSTOM_IOMGR_ASSERT_SAME_THREAD();
   grpc_custom_timer* tw = (grpc_custom_timer*)timer->custom_timer;
   if (timer->pending) {
-    timer->pending = 0;
+    timer->pending = false;
     grpc_core::ExecCtx::Run(DEBUG_LOCATION, timer->closure,
                             GRPC_ERROR_CANCELLED);
     custom_timer_impl->stop(tw);
index 8049893..4ebd325 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "absl/strings/str_cat.h"
 
+#include "src/core/lib/iomgr/parse_address.h"
 #include "src/core/lib/iomgr/unix_sockets_posix.h"
 
 #include <grpc/support/alloc.h>
@@ -43,25 +44,22 @@ void grpc_create_socketpair_if_unix(int sv[2]) {
 
 grpc_error* grpc_resolve_unix_domain_address(const char* name,
                                              grpc_resolved_addresses** addrs) {
-  struct sockaddr_un* un;
-  if (strlen(name) >
-      GPR_ARRAY_SIZE(((struct sockaddr_un*)nullptr)->sun_path) - 1) {
-    return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
-        absl::StrCat("Path name should not have more than ",
-                     GPR_ARRAY_SIZE(un->sun_path) - 1, " characters")
-            .c_str());
-  }
   *addrs = static_cast<grpc_resolved_addresses*>(
       gpr_malloc(sizeof(grpc_resolved_addresses)));
   (*addrs)->naddrs = 1;
   (*addrs)->addrs = static_cast<grpc_resolved_address*>(
       gpr_malloc(sizeof(grpc_resolved_address)));
-  un = reinterpret_cast<struct sockaddr_un*>((*addrs)->addrs->addr);
-  un->sun_family = AF_UNIX;
-  strncpy(un->sun_path, name, sizeof(un->sun_path));
-  (*addrs)->addrs->len =
-      static_cast<socklen_t>(strlen(un->sun_path) + sizeof(un->sun_family) + 1);
-  return GRPC_ERROR_NONE;
+  return grpc_core::UnixSockaddrPopulate(name, (*addrs)->addrs);
+}
+
+grpc_error* grpc_resolve_unix_abstract_domain_address(
+    const absl::string_view name, grpc_resolved_addresses** addrs) {
+  *addrs = static_cast<grpc_resolved_addresses*>(
+      gpr_malloc(sizeof(grpc_resolved_addresses)));
+  (*addrs)->naddrs = 1;
+  (*addrs)->addrs = static_cast<grpc_resolved_address*>(
+      gpr_malloc(sizeof(grpc_resolved_address)));
+  return grpc_core::UnixAbstractSockaddrPopulate(name, (*addrs)->addrs);
 }
 
 int grpc_is_unix_socket(const grpc_resolved_address* resolved_addr) {
@@ -79,8 +77,13 @@ void grpc_unlink_if_unix_domain_socket(
   }
   struct sockaddr_un* un = reinterpret_cast<struct sockaddr_un*>(
       const_cast<char*>(resolved_addr->addr));
-  struct stat st;
 
+  // There is nothing to unlink for an abstract unix socket
+  if (un->sun_path[0] == '\0' && un->sun_path[1] != '\0') {
+    return;
+  }
+
+  struct stat st;
   if (stat(un->sun_path, &st) == 0 && (st.st_mode & S_IFMT) == S_IFSOCK) {
     unlink(un->sun_path);
   }
@@ -93,6 +96,15 @@ std::string grpc_sockaddr_to_uri_unix_if_possible(
   if (addr->sa_family != AF_UNIX) {
     return "";
   }
+  if (((struct sockaddr_un*)addr)->sun_path[0] == '\0' &&
+      ((struct sockaddr_un*)addr)->sun_path[1] != '\0') {
+    const struct sockaddr_un* un =
+        reinterpret_cast<const struct sockaddr_un*>(resolved_addr->addr);
+    return absl::StrCat(
+        "unix-abstract:",
+        absl::string_view(un->sun_path + 1,
+                          resolved_addr->len - sizeof(un->sun_family) - 1));
+  }
   return absl::StrCat("unix:", ((struct sockaddr_un*)addr)->sun_path);
 }
 
index 423daa5..302ac17 100644 (file)
 
 #include "src/core/lib/iomgr/resolve_address.h"
 
+#include "absl/strings/string_view.h"
+
 void grpc_create_socketpair_if_unix(int sv[2]);
 
 grpc_error* grpc_resolve_unix_domain_address(
     const char* name, grpc_resolved_addresses** addresses);
 
+grpc_error* grpc_resolve_unix_abstract_domain_address(
+    absl::string_view name, grpc_resolved_addresses** addresses);
+
 int grpc_is_unix_socket(const grpc_resolved_address* resolved_addr);
 
 void grpc_unlink_if_unix_domain_socket(
index 0c144ce..7205797 100644 (file)
@@ -40,6 +40,13 @@ grpc_error* grpc_resolve_unix_domain_address(
       "Unix domain sockets are not supported on Windows");
 }
 
+grpc_error* grpc_resolve_unix_abstract_domain_address(
+    absl::string_view, grpc_resolved_addresses** addresses) {
+  *addresses = NULL;
+  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+      "Unix domain sockets are not supported on Windows");
+}
+
 int grpc_is_unix_socket(const grpc_resolved_address* addr) { return false; }
 
 void grpc_unlink_if_unix_domain_socket(const grpc_resolved_address* addr) {}
index cb17390..797cd44 100644 (file)
@@ -71,8 +71,8 @@ static grpc_error* pipe_consume(grpc_wakeup_fd* fd_info) {
 
 static grpc_error* pipe_wakeup(grpc_wakeup_fd* fd_info) {
   char c = 0;
-  while (write(fd_info->write_fd, &c, 1) != 1 && errno == EINTR)
-    ;
+  while (write(fd_info->write_fd, &c, 1) != 1 && errno == EINTR) {
+  }
   return GRPC_ERROR_NONE;
 }
 
index 8e26a46..4916fe2 100644 (file)
@@ -68,8 +68,8 @@ class Json {
   }
 
   // Moveable.
-  Json(Json&& other) { MoveFrom(std::move(other)); }
-  Json& operator=(Json&& other) {
+  Json(Json&& other) noexcept { MoveFrom(std::move(other)); }
+  Json& operator=(Json&& other) noexcept {
     MoveFrom(std::move(other));
     return *this;
   }
index f4806de..d23112e 100644 (file)
@@ -413,8 +413,9 @@ JsonReader::Status JsonReader::Run() {
 
           /* This is the \\ case. */
           case State::GRPC_JSON_STATE_STRING_ESCAPE:
-            if (unicode_high_surrogate_ != 0)
+            if (unicode_high_surrogate_ != 0) {
               return Status::GRPC_JSON_PARSE_ERROR;
+            }
             StringAddChar('\\');
             if (escaped_string_was_key_) {
               state_ = State::GRPC_JSON_STATE_OBJECT_KEY_STRING;
@@ -593,14 +594,16 @@ JsonReader::Status JsonReader::Run() {
                  */
                 if ((unicode_char_ & 0xfc00) == 0xd800) {
                   /* high surrogate utf-16 */
-                  if (unicode_high_surrogate_ != 0)
+                  if (unicode_high_surrogate_ != 0) {
                     return Status::GRPC_JSON_PARSE_ERROR;
+                  }
                   unicode_high_surrogate_ = unicode_char_;
                 } else if ((unicode_char_ & 0xfc00) == 0xdc00) {
                   /* low surrogate utf-16 */
                   uint32_t utf32;
-                  if (unicode_high_surrogate_ == 0)
+                  if (unicode_high_surrogate_ == 0) {
                     return Status::GRPC_JSON_PARSE_ERROR;
+                  }
                   utf32 = 0x10000;
                   utf32 += static_cast<uint32_t>(
                       (unicode_high_surrogate_ - 0xd800) * 0x400);
@@ -609,8 +612,9 @@ JsonReader::Status JsonReader::Run() {
                   unicode_high_surrogate_ = 0;
                 } else {
                   /* anything else */
-                  if (unicode_high_surrogate_ != 0)
+                  if (unicode_high_surrogate_ != 0) {
                     return Status::GRPC_JSON_PARSE_ERROR;
+                  }
                   StringAddUtf32(unicode_char_);
                 }
                 if (escaped_string_was_key_) {
index 071087f..00a96eb 100644 (file)
@@ -21,6 +21,9 @@
 
 #include <grpc/support/port_platform.h>
 
+#include "absl/strings/numbers.h"
+#include "absl/strings/str_cat.h"
+
 #include "src/core/lib/iomgr/exec_ctx.h"
 #include "src/core/lib/json/json.h"
 
@@ -32,6 +35,170 @@ namespace grpc_core {
 // Returns true on success, false otherwise.
 bool ParseDurationFromJson(const Json& field, grpc_millis* duration);
 
+//
+// Helper functions for extracting types from JSON.
+// Return true on success, false otherwise. If an error is encountered during
+// parsing, a descriptive error is appended to \a error_list.
+//
+template <typename NumericType, typename ErrorVectorType>
+inline bool ExtractJsonNumber(const Json& json, const std::string& field_name,
+                              NumericType* output,
+                              ErrorVectorType* error_list) {
+  static_assert(std::is_integral<NumericType>::value, "Integral required");
+  if (json.type() != Json::Type::NUMBER) {
+    error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrCat("field:", field_name, " error:type should be NUMBER")
+            .c_str()));
+    return false;
+  }
+  if (!absl::SimpleAtoi(json.string_value(), output)) {
+    error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrCat("field:", field_name, " error:failed to parse.").c_str()));
+    return false;
+  }
+  return true;
+}
+
+template <typename ErrorVectorType>
+inline bool ExtractJsonBool(const Json& json, const std::string& field_name,
+                            bool* output, ErrorVectorType* error_list) {
+  switch (json.type()) {
+    case Json::Type::JSON_TRUE:
+      *output = true;
+      return true;
+    case Json::Type::JSON_FALSE:
+      *output = false;
+      return true;
+    default:
+      error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+          absl::StrCat("field:", field_name, " error:type should be BOOLEAN")
+              .c_str()));
+      return false;
+  }
+}
+
+template <typename ErrorVectorType>
+inline bool ExtractJsonString(const Json& json, const std::string& field_name,
+                              std::string* output,
+                              ErrorVectorType* error_list) {
+  if (json.type() != Json::Type::STRING) {
+    *output = "";
+    error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrCat("field:", field_name, " error:type should be STRING")
+            .c_str()));
+    return false;
+  }
+  *output = json.string_value();
+  return true;
+}
+
+template <typename ErrorVectorType>
+inline bool ExtractJsonArray(const Json& json, const std::string& field_name,
+                             const Json::Array** output,
+                             ErrorVectorType* error_list) {
+  if (json.type() != Json::Type::ARRAY) {
+    *output = nullptr;
+    error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrCat("field:", field_name, " error:type should be ARRAY")
+            .c_str()));
+    return false;
+  }
+  *output = &json.array_value();
+  return true;
+}
+
+template <typename ErrorVectorType>
+inline bool ExtractJsonObject(const Json& json, const std::string& field_name,
+                              const Json::Object** output,
+                              ErrorVectorType* error_list) {
+  if (json.type() != Json::Type::OBJECT) {
+    *output = nullptr;
+    error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrCat("field:", field_name, " error:type should be OBJECT")
+            .c_str()));
+    return false;
+  }
+  *output = &json.object_value();
+  return true;
+}
+
+template <typename NumericType, typename ErrorVectorType>
+inline bool ExtractJsonType(const Json& json, const std::string& field_name,
+                            NumericType* output, ErrorVectorType* error_list) {
+  return ExtractJsonNumber(json, field_name, output, error_list);
+}
+
+template <typename ErrorVectorType>
+inline bool ExtractJsonType(const Json& json, const std::string& field_name,
+                            bool* output, ErrorVectorType* error_list) {
+  return ExtractJsonBool(json, field_name, output, error_list);
+}
+
+template <typename ErrorVectorType>
+inline bool ExtractJsonType(const Json& json, const std::string& field_name,
+                            std::string* output, ErrorVectorType* error_list) {
+  return ExtractJsonString(json, field_name, output, error_list);
+}
+
+template <typename ErrorVectorType>
+inline bool ExtractJsonType(const Json& json, const std::string& field_name,
+                            const Json::Array** output,
+                            ErrorVectorType* error_list) {
+  return ExtractJsonArray(json, field_name, output, error_list);
+}
+
+template <typename ErrorVectorType>
+inline bool ExtractJsonType(const Json& json, const std::string& field_name,
+                            const Json::Object** output,
+                            ErrorVectorType* error_list) {
+  return ExtractJsonObject(json, field_name, output, error_list);
+}
+
+template <typename T, typename ErrorVectorType>
+inline bool ParseJsonObjectField(const Json::Object& object,
+                                 const std::string& field_name, T* output,
+                                 ErrorVectorType* error_list,
+                                 bool required = true) {
+  auto it = object.find(field_name);
+  if (it == object.end()) {
+    if (required) {
+      error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+          absl::StrCat("field:", field_name, " error:does not exist.")
+              .c_str()));
+    }
+    return false;
+  }
+  auto& child_object_json = it->second;
+  return ExtractJsonType(child_object_json, field_name, output, error_list);
+}
+
+template <typename ErrorVectorType>
+inline bool ParseJsonObjectFieldAsDuration(const Json::Object& object,
+                                           const std::string& field_name,
+                                           grpc_millis* output,
+                                           ErrorVectorType* error_list,
+                                           bool required = true) {
+  auto it = object.find(field_name);
+  if (it == object.end()) {
+    if (required) {
+      error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+          absl::StrCat("field:", field_name, " error:does not exist.")
+              .c_str()));
+    }
+    return false;
+  }
+  if (!ParseDurationFromJson(it->second, output)) {
+    *output = GRPC_MILLIS_INF_PAST;
+    error_list->push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrCat("field:", field_name,
+                     " error:type should be STRING of the form given by "
+                     "google.proto.Duration.")
+            .c_str()));
+    return false;
+  }
+  return true;
+}
+
 }  // namespace grpc_core
 
 #endif  // GRPC_CORE_LIB_JSON_JSON_UTIL_H
index 6235a3d..74d0cf5 100644 (file)
@@ -207,8 +207,9 @@ void JsonWriter::EscapeString(const std::string& string) {
        * Any other range is technically reserved for future usage, so if we
        * don't want the software to break in the future, we have to allow
        * anything else. The first non-unicode character is 0x110000. */
-      if (((utf32 >= 0xd800) && (utf32 <= 0xdfff)) || (utf32 >= 0x110000))
+      if (((utf32 >= 0xd800) && (utf32 <= 0xdfff)) || (utf32 >= 0x110000)) {
         break;
+      }
       if (utf32 >= 0x10000) {
         /* If utf32 contains a character that is above 0xffff, it needs to be
          * broken down into a utf-16 surrogate pair. A surrogate pair is first
index d9d9972..74f2288 100644 (file)
@@ -19,6 +19,8 @@
 
 #include <memory>
 
+#include "absl/memory/memory.h"
+
 #include "src/core/lib/security/authorization/mock_cel/flat_expr_builder.h"
 
 namespace grpc_core {
@@ -31,7 +33,7 @@ struct InterpreterOptions {
   bool short_circuiting = true;
 };
 
-std::unique_ptr<CelExpressionBuilder> CreateCelExpressionBuilder(
+inline std::unique_ptr<CelExpressionBuilder> CreateCelExpressionBuilder(
     const InterpreterOptions& options) {
   return absl::make_unique<FlatExprBuilder>();
 }
index bdeba67..34a31a6 100644 (file)
 #include <memory>
 #include <vector>
 
+#include "absl/status/statusor.h"
+
 #include "google/api/expr/v1alpha1/syntax.upb.h"
 #include "src/core/lib/security/authorization/mock_cel/activation.h"
 #include "src/core/lib/security/authorization/mock_cel/cel_value.h"
-#include "src/core/lib/security/authorization/mock_cel/statusor.h"
 
 namespace grpc_core {
 namespace mock_cel {
@@ -38,7 +39,7 @@ class CelExpression {
 
   // Evaluates expression and returns value.
   // activation contains bindings from parameter names to values
-  virtual StatusOr<CelValue> Evaluate(
+  virtual absl::StatusOr<CelValue> Evaluate(
       const BaseActivation& activation) const = 0;
 };
 
@@ -52,11 +53,11 @@ class CelExpressionBuilder {
 
   // Creates CelExpression object from AST tree.
   // expr specifies root of AST tree
-  virtual StatusOr<std::unique_ptr<CelExpression>> CreateExpression(
+  virtual absl::StatusOr<std::unique_ptr<CelExpression>> CreateExpression(
       const google_api_expr_v1alpha1_Expr* expr,
       const google_api_expr_v1alpha1_SourceInfo* source_info) const = 0;
 
-  virtual StatusOr<std::unique_ptr<CelExpression>> CreateExpression(
+  virtual absl::StatusOr<std::unique_ptr<CelExpression>> CreateExpression(
       const google_api_expr_v1alpha1_Expr* expr,
       const google_api_expr_v1alpha1_SourceInfo* source_info,
       std::vector<absl::Status>* warnings) const = 0;
index e021752..d037727 100644 (file)
 
 #include <grpc/support/port_platform.h>
 
+#include <memory>
+
+#include "absl/memory/memory.h"
 #include "absl/strings/string_view.h"
+#include "absl/types/span.h"
 
 namespace grpc_core {
 namespace mock_cel {
index 7ddf495..9aab0d2 100644 (file)
 #include <set>
 #include <vector>
 
+#include "absl/status/statusor.h"
+
 #include "google/api/expr/v1alpha1/syntax.upb.h"
 #include "src/core/lib/security/authorization/mock_cel/activation.h"
 #include "src/core/lib/security/authorization/mock_cel/cel_expression.h"
 #include "src/core/lib/security/authorization/mock_cel/cel_value.h"
-#include "src/core/lib/security/authorization/mock_cel/statusor.h"
 
 namespace grpc_core {
 namespace mock_cel {
@@ -33,13 +34,11 @@ namespace mock_cel {
 // This is a temporary stub implementation of CEL APIs.
 // Once gRPC imports the CEL library, this file will be removed.
 
-class ExpressionStep {
+class ExecutionPath {
  public:
-  virtual ~ExpressionStep() = default;
+  ExecutionPath() = default;
 };
 
-using ExecutionPath = std::vector<std::unique_ptr<const ExpressionStep>>;
-
 // Implementation of the CelExpression that utilizes flattening
 // of the expression tree.
 class CelExpressionFlatImpl : public CelExpression {
@@ -56,7 +55,8 @@ class CelExpressionFlatImpl : public CelExpression {
                         bool enable_unknown_function_results = false) {}
 
   // Implementation of CelExpression evaluate method.
-  StatusOr<CelValue> Evaluate(const BaseActivation& activation) const override {
+  absl::StatusOr<CelValue> Evaluate(
+      const BaseActivation& activation) const override {
     return CelValue::CreateNull();
   }
 };
index 86f5a23..255f003 100644 (file)
@@ -33,20 +33,21 @@ class FlatExprBuilder : public CelExpressionBuilder {
  public:
   FlatExprBuilder() = default;
 
-  cel_base::StatusOr<std::unique_ptr<CelExpression>> CreateExpression(
-      const google::api::expr::v1alpha1::Expr* expr,
-      const google::api::expr::v1alpha1::SourceInfo* source_info)
-      const override {
+  absl::StatusOr<std::unique_ptr<CelExpression>> CreateExpression(
+      const google_api_expr_v1alpha1_Expr* expr,
+      const google_api_expr_v1alpha1_SourceInfo* source_info) const override {
     ExecutionPath path;
-    return absl::make_unique<CelExpressionFlatImpl>(nullptr, path, 0);
+    return absl::make_unique<CelExpressionFlatImpl>(nullptr, path, 0,
+                                                    std::set<std::string>{});
   }
 
-  cel_base::StatusOr<std::unique_ptr<CelExpression>> CreateExpression(
-      const google::api::expr::v1alpha1::Expr* expr,
-      const google::api::expr::v1alpha1::SourceInfo* source_info,
+  absl::StatusOr<std::unique_ptr<CelExpression>> CreateExpression(
+      const google_api_expr_v1alpha1_Expr* expr,
+      const google_api_expr_v1alpha1_SourceInfo* source_info,
       std::vector<absl::Status>* warnings) const override {
     ExecutionPath path;
-    return absl::make_unique<CelExpressionFlatImpl>(nullptr, path, 0);
+    return absl::make_unique<CelExpressionFlatImpl>(nullptr, path, 0,
+                                                    std::set<std::string>{});
   }
 };
 
index b199108..6ff4856 100644 (file)
@@ -54,7 +54,9 @@ struct grpc_auth_context
       grpc_core::RefCountedPtr<grpc_auth_context> chained)
       : grpc_core::RefCounted<grpc_auth_context,
                               grpc_core::NonPolymorphicRefCount>(
-            &grpc_trace_auth_context_refcount),
+            GRPC_TRACE_FLAG_ENABLED(grpc_trace_auth_context_refcount)
+                ? "auth_context_refcount"
+                : nullptr),
         chained_(std::move(chained)) {
     if (chained_ != nullptr) {
       peer_identity_property_name_ = chained_->peer_identity_property_name_;
index 90452d6..309ace8 100644 (file)
@@ -74,7 +74,7 @@ grpc_arg grpc_channel_credentials_to_arg(
 
 grpc_channel_credentials* grpc_channel_credentials_from_arg(
     const grpc_arg* arg) {
-  if (strcmp(arg->key, GRPC_ARG_CHANNEL_CREDENTIALS)) return nullptr;
+  if (strcmp(arg->key, GRPC_ARG_CHANNEL_CREDENTIALS) != 0) return nullptr;
   if (arg->type != GRPC_ARG_POINTER) {
     gpr_log(GPR_ERROR, "Invalid type %d for arg %s", arg->type,
             GRPC_ARG_CHANNEL_CREDENTIALS);
index 1cc6e2d..61e56e5 100644 (file)
@@ -102,7 +102,7 @@ struct grpc_channel_credentials
     : grpc_core::RefCounted<grpc_channel_credentials> {
  public:
   explicit grpc_channel_credentials(const char* type) : type_(type) {}
-  virtual ~grpc_channel_credentials() = default;
+  ~grpc_channel_credentials() override = default;
 
   // Creates a security connector for the channel. May also create new channel
   // args for the channel to be used in place of the passed in const args if
@@ -177,7 +177,7 @@ struct grpc_call_credentials
       grpc_security_level min_security_level = GRPC_PRIVACY_AND_INTEGRITY)
       : type_(type), min_security_level_(min_security_level) {}
 
-  virtual ~grpc_call_credentials() = default;
+  ~grpc_call_credentials() override = default;
 
   // Returns true if completed synchronously, in which case \a error will
   // be set to indicate the result.  Otherwise, \a on_request_metadata will
@@ -225,7 +225,7 @@ struct grpc_server_credentials
  public:
   explicit grpc_server_credentials(const char* type) : type_(type) {}
 
-  virtual ~grpc_server_credentials() { DestroyProcessor(); }
+  ~grpc_server_credentials() override { DestroyProcessor(); }
 
   virtual grpc_core::RefCountedPtr<grpc_server_security_connector>
   create_security_connector() = 0;
diff --git a/src/core/lib/security/credentials/external/aws_request_signer.cc b/src/core/lib/security/credentials/external/aws_request_signer.cc
new file mode 100644 (file)
index 0000000..d4c80e6
--- /dev/null
@@ -0,0 +1,208 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/security/credentials/external/aws_request_signer.h"
+
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_join.h"
+#include "absl/strings/str_split.h"
+#include "absl/time/clock.h"
+#include "absl/time/time.h"
+
+#include <openssl/hmac.h>
+#include <openssl/sha.h>
+
+namespace grpc_core {
+
+namespace {
+
+const char kAlgorithm[] = "AWS4-HMAC-SHA256";
+const char kDateFormat[] = "%a, %d %b %E4Y %H:%M:%S %Z";
+const char kXAmzDateFormat[] = "%Y%m%dT%H%M%SZ";
+
+void SHA256(const std::string& str, unsigned char out[SHA256_DIGEST_LENGTH]) {
+  SHA256_CTX sha256;
+  SHA256_Init(&sha256);
+  SHA256_Update(&sha256, str.c_str(), str.size());
+  SHA256_Final(out, &sha256);
+}
+
+std::string SHA256Hex(const std::string& str) {
+  unsigned char hash[SHA256_DIGEST_LENGTH];
+  SHA256(str, hash);
+  std::string hash_str(reinterpret_cast<char const*>(hash),
+                       SHA256_DIGEST_LENGTH);
+  return absl::BytesToHexString(hash_str);
+}
+
+std::string HMAC(const std::string& key, const std::string& msg) {
+  unsigned int len;
+  unsigned char digest[EVP_MAX_MD_SIZE];
+  HMAC(EVP_sha256(), key.c_str(), key.length(),
+       (const unsigned char*)msg.c_str(), msg.length(), digest, &len);
+  return std::string(digest, digest + len);
+}
+
+}  // namespace
+
+AwsRequestSigner::AwsRequestSigner(
+    std::string access_key_id, std::string secret_access_key, std::string token,
+    std::string method, std::string url, std::string region,
+    std::string request_payload,
+    std::map<std::string, std::string> additional_headers, grpc_error** error)
+    : access_key_id_(std::move(access_key_id)),
+      secret_access_key_(std::move(secret_access_key)),
+      token_(std::move(token)),
+      method_(std::move(method)),
+      region_(std::move(region)),
+      request_payload_(std::move(request_payload)),
+      additional_headers_(std::move(additional_headers)) {
+  auto amz_date_it = additional_headers_.find("x-amz-date");
+  auto date_it = additional_headers_.find("date");
+  if (amz_date_it != additional_headers_.end() &&
+      date_it != additional_headers_.end()) {
+    *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+        "Only one of {date, x-amz-date} can be specified, not both.");
+    return;
+  }
+  if (amz_date_it != additional_headers_.end()) {
+    static_request_date_ = amz_date_it->second;
+  } else if (date_it != additional_headers_.end()) {
+    absl::Time request_date;
+    std::string err_str;
+    if (!absl::ParseTime(kDateFormat, date_it->second, &request_date,
+                         &err_str)) {
+      *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(err_str.c_str());
+      return;
+    }
+    static_request_date_ =
+        absl::FormatTime(kXAmzDateFormat, request_date, absl::UTCTimeZone());
+  }
+  url_ = grpc_uri_parse(url, false);
+  if (url_ == nullptr) {
+    *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid Aws request url.");
+    return;
+  }
+}
+
+AwsRequestSigner::~AwsRequestSigner() { grpc_uri_destroy(url_); }
+
+std::map<std::string, std::string> AwsRequestSigner::GetSignedRequestHeaders() {
+  std::string request_date_full;
+  if (!static_request_date_.empty()) {
+    if (!request_headers_.empty()) {
+      return request_headers_;
+    }
+    request_date_full = static_request_date_;
+  } else {
+    absl::Time request_date = absl::Now();
+    request_date_full =
+        absl::FormatTime(kXAmzDateFormat, request_date, absl::UTCTimeZone());
+  }
+  std::string request_date_short = request_date_full.substr(0, 8);
+  // TASK 1: Create a canonical request for Signature Version 4
+  // https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html
+  std::vector<absl::string_view> canonical_request_vector;
+  // 1. HTTPRequestMethod
+  canonical_request_vector.emplace_back(method_);
+  canonical_request_vector.emplace_back("\n");
+  // 2. CanonicalURI
+
+  canonical_request_vector.emplace_back(*url_->path == '\0' ? "/" : url_->path);
+  canonical_request_vector.emplace_back("\n");
+  // 3. CanonicalQueryString
+  canonical_request_vector.emplace_back(url_->query);
+  canonical_request_vector.emplace_back("\n");
+  // 4. CanonicalHeaders
+  if (request_headers_.empty()) {
+    request_headers_.insert({"host", url_->authority});
+    if (!token_.empty()) {
+      request_headers_.insert({"x-amz-security-token", token_});
+    }
+    for (const auto& header : additional_headers_) {
+      request_headers_.insert(
+          {absl::AsciiStrToLower(header.first), header.second});
+    }
+  }
+  if (additional_headers_.find("date") == additional_headers_.end()) {
+    request_headers_["x-amz-date"] = request_date_full;
+  }
+  std::vector<absl::string_view> canonical_headers_vector;
+  for (const auto& header : request_headers_) {
+    canonical_headers_vector.emplace_back(header.first);
+    canonical_headers_vector.emplace_back(":");
+    canonical_headers_vector.emplace_back(header.second);
+    canonical_headers_vector.emplace_back("\n");
+  }
+  std::string canonical_headers = absl::StrJoin(canonical_headers_vector, "");
+  canonical_request_vector.emplace_back(canonical_headers);
+  canonical_request_vector.emplace_back("\n");
+  // 5. SignedHeaders
+  std::vector<absl::string_view> signed_headers_vector;
+  for (const auto& header : request_headers_) {
+    signed_headers_vector.emplace_back(header.first);
+  }
+  std::string signed_headers = absl::StrJoin(signed_headers_vector, ";");
+  canonical_request_vector.emplace_back(signed_headers);
+  canonical_request_vector.emplace_back("\n");
+  // 6. RequestPayload
+  std::string hashed_request_payload = SHA256Hex(request_payload_);
+  canonical_request_vector.emplace_back(hashed_request_payload);
+  std::string canonical_request = absl::StrJoin(canonical_request_vector, "");
+  // TASK 2: Create a string to sign for Signature Version 4
+  // https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html
+  std::vector<absl::string_view> string_to_sign_vector;
+  // 1. Algorithm
+  string_to_sign_vector.emplace_back("AWS4-HMAC-SHA256");
+  string_to_sign_vector.emplace_back("\n");
+  // 2. RequestDateTime
+  string_to_sign_vector.emplace_back(request_date_full);
+  string_to_sign_vector.emplace_back("\n");
+  // 3. CredentialScope
+  std::pair<absl::string_view, absl::string_view> host_parts =
+      absl::StrSplit(url_->authority, absl::MaxSplits('.', 1));
+  std::string service_name(host_parts.first);
+  std::string credential_scope = absl::StrFormat(
+      "%s/%s/%s/aws4_request", request_date_short, region_, service_name);
+  string_to_sign_vector.emplace_back(credential_scope);
+  string_to_sign_vector.emplace_back("\n");
+  // 4. HashedCanonicalRequest
+  std::string hashed_canonical_request = SHA256Hex(canonical_request);
+  string_to_sign_vector.emplace_back(hashed_canonical_request);
+  std::string string_to_sign = absl::StrJoin(string_to_sign_vector, "");
+  // TASK 3: Task 3: Calculate the signature for AWS Signature Version 4
+  // https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html
+  // 1. Derive your signing key.
+  std::string date = HMAC("AWS4" + secret_access_key_, request_date_short);
+  std::string region = HMAC(date, region_);
+  std::string service = HMAC(region, service_name);
+  std::string signing = HMAC(service, "aws4_request");
+  // 2. Calculate the signature.
+  std::string signature_str = HMAC(signing, string_to_sign);
+  std::string signature = absl::BytesToHexString(signature_str);
+  // TASK 4: Add the signature to the HTTP request
+  // https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html
+  std::string authorization_header = absl::StrFormat(
+      "%s Credential=%s/%s, SignedHeaders=%s, Signature=%s", kAlgorithm,
+      access_key_id_, credential_scope, signed_headers, signature);
+  request_headers_["Authorization"] = authorization_header;
+  return request_headers_;
+}
+
+}  // namespace grpc_core
diff --git a/src/core/lib/security/credentials/external/aws_request_signer.h b/src/core/lib/security/credentials/external/aws_request_signer.h
new file mode 100644 (file)
index 0000000..a4823e0
--- /dev/null
@@ -0,0 +1,73 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_EXTERNAL_AWS_REQUEST_SIGNER_H
+#define GRPC_CORE_LIB_SECURITY_CREDENTIALS_EXTERNAL_AWS_REQUEST_SIGNER_H
+
+#include <grpc/support/port_platform.h>
+
+#include <map>
+#include <string>
+
+#include "src/core/lib/iomgr/error.h"
+#include "src/core/lib/uri/uri_parser.h"
+
+namespace grpc_core {
+
+// Implements an AWS API request signer based on the AWS Signature Version 4
+// signing process.
+// https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html
+// To retrieve the subject token in AwsExternalAccountCredentials, we need to
+// sign an AWS request server and use the signed request as the subject token.
+// This class is a utility to sign an AWS request.
+class AwsRequestSigner {
+ public:
+  // Construct a signer with the necessary information to sign a request.
+  // `access_key_id`, `secret_access_key` and `token` are the AWS credentials
+  // required for signing. `method` and `url` are the HTTP method and url of the
+  // request. `region` is the region of the AWS environment. `request_payload`
+  // is the payload of the HTTP request. `additional_headers` are additional
+  // headers to be inject into the request.
+  AwsRequestSigner(std::string access_key_id, std::string secret_access_key,
+                   std::string token, std::string method, std::string url,
+                   std::string region, std::string request_payload,
+                   std::map<std::string, std::string> additional_headers,
+                   grpc_error** error);
+  ~AwsRequestSigner();
+
+  // This method triggers the signing process then returns the headers of the
+  // signed request as a map. In case there is an error, the input `error`
+  // parameter will be updated and an empty map will be returned if there is
+  // error.
+  std::map<std::string, std::string> GetSignedRequestHeaders();
+
+ private:
+  std::string access_key_id_;
+  std::string secret_access_key_;
+  std::string token_;
+  std::string method_;
+  grpc_uri* url_ = nullptr;
+  std::string region_;
+  std::string request_payload_;
+  std::map<std::string, std::string> additional_headers_;
+
+  std::string static_request_date_;
+  std::map<std::string, std::string> request_headers_;
+};
+
+}  // namespace grpc_core
+
+#endif  // GRPC_CORE_LIB_SECURITY_CREDENTIALS_EXTERNAL_AWS_REQUEST_SIGNER_H
diff --git a/src/core/lib/security/credentials/external/external_account_credentials.cc b/src/core/lib/security/credentials/external/external_account_credentials.cc
new file mode 100644 (file)
index 0000000..599b718
--- /dev/null
@@ -0,0 +1,311 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/security/credentials/external/external_account_credentials.h"
+
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_join.h"
+#include "absl/time/clock.h"
+#include "absl/time/time.h"
+
+#include "src/core/lib/http/parser.h"
+#include "src/core/lib/security/util/json_util.h"
+#include "src/core/lib/slice/b64.h"
+
+#define EXTERNAL_ACCOUNT_CREDENTIALS_GRANT_TYPE \
+  "urn:ietf:params:oauth:grant-type:token-exchange"
+#define EXTERNAL_ACCOUNT_CREDENTIALS_REQUESTED_TOKEN_TYPE \
+  "urn:ietf:params:oauth:token-type:access_token"
+#define GOOGLE_CLOUD_PLATFORM_DEFAULT_SCOPE \
+  "https://www.googleapis.com/auth/cloud-platform"
+
+namespace grpc_core {
+
+ExternalAccountCredentials::ExternalAccountCredentials(
+    ExternalAccountCredentialsOptions options, std::vector<std::string> scopes)
+    : options_(std::move(options)) {
+  if (scopes.empty()) {
+    scopes.push_back(GOOGLE_CLOUD_PLATFORM_DEFAULT_SCOPE);
+  }
+  scopes_ = std::move(scopes);
+}
+
+ExternalAccountCredentials::~ExternalAccountCredentials() {}
+
+std::string ExternalAccountCredentials::debug_string() {
+  return absl::StrFormat("ExternalAccountCredentials{Audience:%s,%s}",
+                         options_.audience,
+                         grpc_oauth2_token_fetcher_credentials::debug_string());
+}
+
+// The token fetching flow:
+// 1. Retrieve subject token - Subclass's RetrieveSubjectToken() gets called
+// and the subject token is received in OnRetrieveSubjectTokenInternal().
+// 2. Exchange token - ExchangeToken() gets called with the
+// subject token from #1. Receive the response in OnExchangeTokenInternal().
+// 3. (Optional) Impersonate service account - ImpersenateServiceAccount() gets
+// called with the access token of the response from #2. Get an impersonated
+// access token in OnImpersenateServiceAccountInternal().
+// 4. Finish token fetch - Return back the response that contains an access
+// token in FinishTokenFetch().
+// TODO(chuanr): Avoid starting the remaining requests if the channel gets shut
+// down.
+void ExternalAccountCredentials::fetch_oauth2(
+    grpc_credentials_metadata_request* metadata_req,
+    grpc_httpcli_context* httpcli_context, grpc_polling_entity* pollent,
+    grpc_iomgr_cb_func response_cb, grpc_millis deadline) {
+  GPR_ASSERT(ctx_ == nullptr);
+  ctx_ = new HTTPRequestContext(httpcli_context, pollent, deadline);
+  metadata_req_ = metadata_req;
+  response_cb_ = response_cb;
+  auto cb = [this](std::string token, grpc_error* error) {
+    OnRetrieveSubjectTokenInternal(token, error);
+  };
+  RetrieveSubjectToken(ctx_, options_, cb);
+}
+
+void ExternalAccountCredentials::OnRetrieveSubjectTokenInternal(
+    absl::string_view subject_token, grpc_error* error) {
+  if (error != GRPC_ERROR_NONE) {
+    FinishTokenFetch(error);
+  } else {
+    ExchangeToken(subject_token);
+  }
+}
+
+void ExternalAccountCredentials::ExchangeToken(
+    absl::string_view subject_token) {
+  grpc_uri* uri = grpc_uri_parse(options_.token_url, false);
+  if (uri == nullptr) {
+    FinishTokenFetch(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrFormat("Invalid token url: %s.", options_.token_url).c_str()));
+    return;
+  }
+  grpc_httpcli_request request;
+  memset(&request, 0, sizeof(grpc_httpcli_request));
+  request.host = const_cast<char*>(uri->authority);
+  request.http.path = gpr_strdup(uri->path);
+  grpc_http_header* headers = nullptr;
+  if (!options_.client_id.empty() && !options_.client_secret.empty()) {
+    request.http.hdr_count = 2;
+    headers = static_cast<grpc_http_header*>(
+        gpr_malloc(sizeof(grpc_http_header) * request.http.hdr_count));
+    headers[0].key = gpr_strdup("Content-Type");
+    headers[0].value = gpr_strdup("application/x-www-form-urlencoded");
+    std::string raw_cred =
+        absl::StrFormat("%s:%s", options_.client_id, options_.client_secret);
+    char* encoded_cred =
+        grpc_base64_encode(raw_cred.c_str(), raw_cred.length(), 0, 0);
+    std::string str = absl::StrFormat("Basic %s", std::string(encoded_cred));
+    headers[1].key = gpr_strdup("Authorization");
+    headers[1].value = gpr_strdup(str.c_str());
+    gpr_free(encoded_cred);
+  } else {
+    request.http.hdr_count = 1;
+    headers = static_cast<grpc_http_header*>(
+        gpr_malloc(sizeof(grpc_http_header) * request.http.hdr_count));
+    headers[0].key = gpr_strdup("Content-Type");
+    headers[0].value = gpr_strdup("application/x-www-form-urlencoded");
+  }
+  request.http.hdrs = headers;
+  request.handshaker = (strcmp(uri->scheme, "https") == 0)
+                           ? &grpc_httpcli_ssl
+                           : &grpc_httpcli_plaintext;
+  std::vector<std::string> body_parts;
+  body_parts.push_back(absl::StrFormat("%s=%s", "audience", options_.audience));
+  body_parts.push_back(absl::StrFormat(
+      "%s=%s", "grant_type", EXTERNAL_ACCOUNT_CREDENTIALS_GRANT_TYPE));
+  body_parts.push_back(
+      absl::StrFormat("%s=%s", "requested_token_type",
+                      EXTERNAL_ACCOUNT_CREDENTIALS_REQUESTED_TOKEN_TYPE));
+  body_parts.push_back(absl::StrFormat("%s=%s", "subject_token_type",
+                                       options_.subject_token_type));
+  body_parts.push_back(
+      absl::StrFormat("%s=%s", "subject_token", subject_token));
+  std::string scope = GOOGLE_CLOUD_PLATFORM_DEFAULT_SCOPE;
+  if (options_.service_account_impersonation_url.empty()) {
+    scope = absl::StrJoin(scopes_, " ");
+  }
+  body_parts.push_back(absl::StrFormat("%s=%s", "scope", scope));
+  std::string body = absl::StrJoin(body_parts, "&");
+  grpc_resource_quota* resource_quota =
+      grpc_resource_quota_create("external_account_credentials");
+  grpc_http_response_destroy(&ctx_->response);
+  ctx_->response = {};
+  GRPC_CLOSURE_INIT(&ctx_->closure, OnExchangeToken, this, nullptr);
+  grpc_httpcli_post(ctx_->httpcli_context, ctx_->pollent, resource_quota,
+                    &request, body.c_str(), body.size(), ctx_->deadline,
+                    &ctx_->closure, &ctx_->response);
+  grpc_resource_quota_unref_internal(resource_quota);
+  grpc_http_request_destroy(&request.http);
+  grpc_uri_destroy(uri);
+}
+
+void ExternalAccountCredentials::OnExchangeToken(void* arg, grpc_error* error) {
+  ExternalAccountCredentials* self =
+      static_cast<ExternalAccountCredentials*>(arg);
+  self->OnExchangeTokenInternal(GRPC_ERROR_REF(error));
+}
+
+void ExternalAccountCredentials::OnExchangeTokenInternal(grpc_error* error) {
+  if (error != GRPC_ERROR_NONE) {
+    FinishTokenFetch(error);
+  } else {
+    if (options_.service_account_impersonation_url.empty()) {
+      metadata_req_->response = ctx_->response;
+      metadata_req_->response.body = gpr_strdup(ctx_->response.body);
+      FinishTokenFetch(GRPC_ERROR_NONE);
+    } else {
+      ImpersenateServiceAccount();
+    }
+  }
+}
+
+void ExternalAccountCredentials::ImpersenateServiceAccount() {
+  grpc_error* error = GRPC_ERROR_NONE;
+  absl::string_view response_body(ctx_->response.body,
+                                  ctx_->response.body_length);
+  Json json = Json::Parse(response_body, &error);
+  if (error != GRPC_ERROR_NONE || json.type() != Json::Type::OBJECT) {
+    FinishTokenFetch(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
+        "Invalid token exchange response.", &error, 1));
+    GRPC_ERROR_UNREF(error);
+    return;
+  }
+  auto it = json.object_value().find("access_token");
+  if (it == json.object_value().end() ||
+      it->second.type() != Json::Type::STRING) {
+    FinishTokenFetch(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrFormat("Missing or invalid access_token in %s.", response_body)
+            .c_str()));
+    return;
+  }
+  std::string access_token = it->second.string_value();
+  grpc_uri* uri =
+      grpc_uri_parse(options_.service_account_impersonation_url, false);
+  if (uri == nullptr) {
+    FinishTokenFetch(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrFormat("Invalid service account impersonation url: %s.",
+                        options_.service_account_impersonation_url)
+            .c_str()));
+    return;
+  }
+  grpc_httpcli_request request;
+  memset(&request, 0, sizeof(grpc_httpcli_request));
+  request.host = const_cast<char*>(uri->authority);
+  request.http.path = gpr_strdup(uri->path);
+  request.http.hdr_count = 2;
+  grpc_http_header* headers = static_cast<grpc_http_header*>(
+      gpr_malloc(sizeof(grpc_http_header) * request.http.hdr_count));
+  headers[0].key = gpr_strdup("Content-Type");
+  headers[0].value = gpr_strdup("application/x-www-form-urlencoded");
+  std::string str = absl::StrFormat("Bearer %s", access_token);
+  headers[1].key = gpr_strdup("Authorization");
+  headers[1].value = gpr_strdup(str.c_str());
+  request.http.hdrs = headers;
+  request.handshaker = (strcmp(uri->scheme, "https") == 0)
+                           ? &grpc_httpcli_ssl
+                           : &grpc_httpcli_plaintext;
+  std::string scope = absl::StrJoin(scopes_, " ");
+  std::string body = absl::StrFormat("%s=%s", "scope", scope);
+  grpc_resource_quota* resource_quota =
+      grpc_resource_quota_create("external_account_credentials");
+  grpc_http_response_destroy(&ctx_->response);
+  ctx_->response = {};
+  GRPC_CLOSURE_INIT(&ctx_->closure, OnImpersenateServiceAccount, this, nullptr);
+  grpc_httpcli_post(ctx_->httpcli_context, ctx_->pollent, resource_quota,
+                    &request, body.c_str(), body.size(), ctx_->deadline,
+                    &ctx_->closure, &ctx_->response);
+  grpc_resource_quota_unref_internal(resource_quota);
+  grpc_http_request_destroy(&request.http);
+  grpc_uri_destroy(uri);
+}
+
+void ExternalAccountCredentials::OnImpersenateServiceAccount(
+    void* arg, grpc_error* error) {
+  ExternalAccountCredentials* self =
+      static_cast<ExternalAccountCredentials*>(arg);
+  self->OnImpersenateServiceAccountInternal(GRPC_ERROR_REF(error));
+}
+
+void ExternalAccountCredentials::OnImpersenateServiceAccountInternal(
+    grpc_error* error) {
+  if (error != GRPC_ERROR_NONE) {
+    FinishTokenFetch(error);
+    return;
+  }
+  absl::string_view response_body(ctx_->response.body,
+                                  ctx_->response.body_length);
+  Json json = Json::Parse(response_body, &error);
+  if (error != GRPC_ERROR_NONE || json.type() != Json::Type::OBJECT) {
+    FinishTokenFetch(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
+        "Invalid service account impersonation response.", &error, 1));
+    GRPC_ERROR_UNREF(error);
+    return;
+  }
+  auto it = json.object_value().find("accessToken");
+  if (it == json.object_value().end() ||
+      it->second.type() != Json::Type::STRING) {
+    FinishTokenFetch(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrFormat("Missing or invalid accessToken in %s.", response_body)
+            .c_str()));
+    return;
+  }
+  std::string access_token = it->second.string_value();
+  it = json.object_value().find("expireTime");
+  if (it == json.object_value().end() ||
+      it->second.type() != Json::Type::STRING) {
+    FinishTokenFetch(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrFormat("Missing or invalid expireTime in %s.", response_body)
+            .c_str()));
+    return;
+  }
+  std::string expire_time = it->second.string_value();
+  absl::Time t;
+  if (!absl::ParseTime(absl::RFC3339_full, expire_time, &t, nullptr)) {
+    FinishTokenFetch(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+        "Invalid expire time of service account impersonation response."));
+    return;
+  }
+  int expire_in = (t - absl::Now()) / absl::Seconds(1);
+  std::string body = absl::StrFormat(
+      "{\"access_token\":\"%s\",\"expires_in\":%d,\"token_type\":\"Bearer\"}",
+      access_token, expire_in);
+  metadata_req_->response = ctx_->response;
+  metadata_req_->response.body = gpr_strdup(body.c_str());
+  metadata_req_->response.body_length = body.length();
+  FinishTokenFetch(GRPC_ERROR_NONE);
+}
+
+void ExternalAccountCredentials::FinishTokenFetch(grpc_error* error) {
+  GRPC_LOG_IF_ERROR("Fetch external account credentials access token",
+                    GRPC_ERROR_REF(error));
+  // Move object state into local variables.
+  auto* cb = response_cb_;
+  response_cb_ = nullptr;
+  auto* metadata_req = metadata_req_;
+  metadata_req_ = nullptr;
+  auto* ctx = ctx_;
+  ctx_ = nullptr;
+  // Invoke the callback.
+  cb(metadata_req, error);
+  // Delete context.
+  delete ctx;
+  GRPC_ERROR_UNREF(error);
+}
+
+}  // namespace grpc_core
diff --git a/src/core/lib/security/credentials/external/external_account_credentials.h b/src/core/lib/security/credentials/external/external_account_credentials.h
new file mode 100644 (file)
index 0000000..04f09d4
--- /dev/null
@@ -0,0 +1,118 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_EXTERNAL_EXTERNAL_ACCOUNT_CREDENTIALS_H
+#define GRPC_CORE_LIB_SECURITY_CREDENTIALS_EXTERNAL_EXTERNAL_ACCOUNT_CREDENTIALS_H
+
+#include <grpc/support/port_platform.h>
+
+#include <string>
+#include <vector>
+
+#include "src/core/lib/json/json.h"
+#include "src/core/lib/security/credentials/oauth2/oauth2_credentials.h"
+
+namespace grpc_core {
+
+// Base external account credentials. The base class implements common logic for
+// exchanging external account credentials for GCP access token to authorize
+// requests to GCP APIs. The specific logic of retrieving subject token is
+// implemented in subclasses.
+class ExternalAccountCredentials
+    : public grpc_oauth2_token_fetcher_credentials {
+ public:
+  // External account credentials json interface.
+  struct ExternalAccountCredentialsOptions {
+    std::string type;
+    std::string audience;
+    std::string subject_token_type;
+    std::string service_account_impersonation_url;
+    std::string token_url;
+    std::string token_info_url;
+    Json credential_source;
+    std::string quota_project_id;
+    std::string client_id;
+    std::string client_secret;
+  };
+
+  ExternalAccountCredentials(ExternalAccountCredentialsOptions options,
+                             std::vector<std::string> scopes);
+  ~ExternalAccountCredentials() override;
+  std::string debug_string() override;
+
+ protected:
+  // This is a helper struct to pass information between multiple callback based
+  // asynchronous calls.
+  struct HTTPRequestContext {
+    HTTPRequestContext(grpc_httpcli_context* httpcli_context,
+                       grpc_polling_entity* pollent, grpc_millis deadline)
+        : httpcli_context(httpcli_context),
+          pollent(pollent),
+          deadline(deadline) {}
+    ~HTTPRequestContext() { grpc_http_response_destroy(&response); }
+
+    // Contextual parameters passed from
+    // grpc_oauth2_token_fetcher_credentials::fetch_oauth2().
+    grpc_httpcli_context* httpcli_context;
+    grpc_polling_entity* pollent;
+    grpc_millis deadline;
+
+    // Reusable token fetch http response and closure.
+    grpc_closure closure;
+    grpc_http_response response;
+  };
+
+  // Subclasses of base external account credentials need to override this
+  // method to implement the specific subject token retrieval logic.
+  // Once the subject token is ready, subclasses need to invoke
+  // the callback function (cb) to pass the subject token (or error)
+  // back.
+  virtual void RetrieveSubjectToken(
+      HTTPRequestContext* ctx, const ExternalAccountCredentialsOptions& options,
+      std::function<void(std::string, grpc_error*)> cb) = 0;
+
+ private:
+  // This method implements the common token fetch logic and it will be called
+  // when grpc_oauth2_token_fetcher_credentials request a new access token.
+  void fetch_oauth2(grpc_credentials_metadata_request* req,
+                    grpc_httpcli_context* httpcli_context,
+                    grpc_polling_entity* pollent, grpc_iomgr_cb_func cb,
+                    grpc_millis deadline) override;
+
+  void OnRetrieveSubjectTokenInternal(absl::string_view subject_token,
+                                      grpc_error* error);
+
+  void ExchangeToken(absl::string_view subject_token);
+  static void OnExchangeToken(void* arg, grpc_error* error);
+  void OnExchangeTokenInternal(grpc_error* error);
+
+  void ImpersenateServiceAccount();
+  static void OnImpersenateServiceAccount(void* arg, grpc_error* error);
+  void OnImpersenateServiceAccountInternal(grpc_error* error);
+
+  void FinishTokenFetch(grpc_error* error);
+
+  ExternalAccountCredentialsOptions options_;
+  std::vector<std::string> scopes_;
+
+  HTTPRequestContext* ctx_ = nullptr;
+  grpc_credentials_metadata_request* metadata_req_ = nullptr;
+  grpc_iomgr_cb_func response_cb_ = nullptr;
+};
+
+}  // namespace grpc_core
+
+#endif  // GRPC_CORE_LIB_SECURITY_CREDENTIALS_EXTERNAL_EXTERNAL_ACCOUNT_CREDENTIALS_H
diff --git a/src/core/lib/security/credentials/external/file_external_account_credentials.cc b/src/core/lib/security/credentials/external/file_external_account_credentials.cc
new file mode 100644 (file)
index 0000000..f2724f0
--- /dev/null
@@ -0,0 +1,136 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/security/credentials/external/file_external_account_credentials.h"
+
+#include <fstream>
+
+#include "src/core/lib/iomgr/load_file.h"
+#include "src/core/lib/slice/slice_internal.h"
+#include "src/core/lib/slice/slice_utils.h"
+
+namespace grpc_core {
+
+RefCountedPtr<FileExternalAccountCredentials>
+FileExternalAccountCredentials::Create(
+    ExternalAccountCredentialsOptions options, std::vector<std::string> scopes,
+    grpc_error** error) {
+  auto creds = MakeRefCounted<FileExternalAccountCredentials>(
+      std::move(options), std::move(scopes), error);
+  if (*error == GRPC_ERROR_NONE) {
+    return creds;
+  } else {
+    return nullptr;
+  }
+}
+
+FileExternalAccountCredentials::FileExternalAccountCredentials(
+    ExternalAccountCredentialsOptions options, std::vector<std::string> scopes,
+    grpc_error** error)
+    : ExternalAccountCredentials(options, std::move(scopes)) {
+  auto it = options.credential_source.object_value().find("file");
+  if (it == options.credential_source.object_value().end()) {
+    *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("file field not present.");
+    return;
+  }
+  if (it->second.type() != Json::Type::STRING) {
+    *error =
+        GRPC_ERROR_CREATE_FROM_STATIC_STRING("file field must be a string.");
+    return;
+  }
+  file_ = it->second.string_value();
+  it = options.credential_source.object_value().find("format");
+  if (it != options.credential_source.object_value().end()) {
+    const Json& format_json = it->second;
+    if (format_json.type() != Json::Type::OBJECT) {
+      *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "The JSON value of credential source format is not an object.");
+      return;
+    }
+    auto format_it = format_json.object_value().find("type");
+    if (format_it == format_json.object_value().end()) {
+      *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "format.type field not present.");
+      return;
+    }
+    if (format_it->second.type() != Json::Type::STRING) {
+      *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "format.type field must be a string.");
+      return;
+    }
+    format_type_ = format_it->second.string_value();
+    if (format_type_ == "json") {
+      format_it = format_json.object_value().find("subject_token_field_name");
+      if (format_it == format_json.object_value().end()) {
+        *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+            "format.subject_token_field_name field must be present if the "
+            "format is in Json.");
+        return;
+      }
+      if (format_it->second.type() != Json::Type::STRING) {
+        *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+            "format.subject_token_field_name field must be a string.");
+        return;
+      }
+      format_subject_token_field_name_ = format_it->second.string_value();
+    }
+  }
+}
+
+void FileExternalAccountCredentials::RetrieveSubjectToken(
+    HTTPRequestContext* ctx, const ExternalAccountCredentialsOptions& options,
+    std::function<void(std::string, grpc_error*)> cb) {
+  struct SliceWrapper {
+    ~SliceWrapper() { grpc_slice_unref_internal(slice); }
+    grpc_slice slice = grpc_empty_slice();
+  };
+  SliceWrapper content_slice;
+  // To retrieve the subject token, we read the file every time we make a
+  // request because it may have changed since the last request.
+  grpc_error* error = grpc_load_file(file_.c_str(), 0, &content_slice.slice);
+  if (error != GRPC_ERROR_NONE) {
+    cb("", error);
+    return;
+  }
+  absl::string_view content = StringViewFromSlice(content_slice.slice);
+  if (format_type_ == "json") {
+    Json content_json = Json::Parse(content, &error);
+    if (error != GRPC_ERROR_NONE || content_json.type() != Json::Type::OBJECT) {
+      cb("", GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+                 "The content of the file is not a valid json object."));
+      GRPC_ERROR_UNREF(error);
+      return;
+    }
+    auto content_it =
+        content_json.object_value().find(format_subject_token_field_name_);
+    if (content_it == content_json.object_value().end()) {
+      cb("", GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+                 "Subject token field not present."));
+      return;
+    }
+    if (content_it->second.type() != Json::Type::STRING) {
+      cb("", GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+                 "Subject token field must be a string."));
+      return;
+    }
+    cb(content_it->second.string_value(), GRPC_ERROR_NONE);
+    return;
+  }
+  cb(std::string(content), GRPC_ERROR_NONE);
+}
+
+}  // namespace grpc_core
diff --git a/src/core/lib/security/credentials/external/file_external_account_credentials.h b/src/core/lib/security/credentials/external/file_external_account_credentials.h
new file mode 100644 (file)
index 0000000..49b4d31
--- /dev/null
@@ -0,0 +1,49 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_EXTERNAL_FILE_EXTERNAL_ACCOUNT_CREDENTIALS_H
+#define GRPC_CORE_LIB_SECURITY_CREDENTIALS_EXTERNAL_FILE_EXTERNAL_ACCOUNT_CREDENTIALS_H
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/security/credentials/external/external_account_credentials.h"
+
+namespace grpc_core {
+
+class FileExternalAccountCredentials final : public ExternalAccountCredentials {
+ public:
+  static RefCountedPtr<FileExternalAccountCredentials> Create(
+      ExternalAccountCredentialsOptions options,
+      std::vector<std::string> scopes, grpc_error** error);
+
+  FileExternalAccountCredentials(ExternalAccountCredentialsOptions options,
+                                 std::vector<std::string> scopes,
+                                 grpc_error** error);
+
+ private:
+  void RetrieveSubjectToken(
+      HTTPRequestContext* ctx, const ExternalAccountCredentialsOptions& options,
+      std::function<void(std::string, grpc_error*)> cb) override;
+
+  // Fields of credential source
+  std::string file_;
+  std::string format_type_;
+  std::string format_subject_token_field_name_;
+};
+
+}  // namespace grpc_core
+
+#endif  // GRPC_CORE_LIB_SECURITY_CREDENTIALS_EXTERNAL_FILE_EXTERNAL_ACCOUNT_CREDENTIALS_H
diff --git a/src/core/lib/security/credentials/external/url_external_account_credentials.cc b/src/core/lib/security/credentials/external/url_external_account_credentials.cc
new file mode 100644 (file)
index 0000000..43029e0
--- /dev/null
@@ -0,0 +1,211 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/security/credentials/external/url_external_account_credentials.h"
+
+#include "absl/strings/str_format.h"
+
+namespace grpc_core {
+
+RefCountedPtr<UrlExternalAccountCredentials>
+UrlExternalAccountCredentials::Create(ExternalAccountCredentialsOptions options,
+                                      std::vector<std::string> scopes,
+                                      grpc_error** error) {
+  auto creds = MakeRefCounted<UrlExternalAccountCredentials>(
+      std::move(options), std::move(scopes), error);
+  if (*error == GRPC_ERROR_NONE) {
+    return creds;
+  } else {
+    return nullptr;
+  }
+}
+
+UrlExternalAccountCredentials::UrlExternalAccountCredentials(
+    ExternalAccountCredentialsOptions options, std::vector<std::string> scopes,
+    grpc_error** error)
+    : ExternalAccountCredentials(options, std::move(scopes)) {
+  auto it = options.credential_source.object_value().find("url");
+  if (it == options.credential_source.object_value().end()) {
+    *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("url field not present.");
+    return;
+  }
+  if (it->second.type() != Json::Type::STRING) {
+    *error =
+        GRPC_ERROR_CREATE_FROM_STATIC_STRING("url field must be a string.");
+    return;
+  }
+  grpc_uri* url = grpc_uri_parse(it->second.string_value(), false);
+  if (url == nullptr) {
+    *error =
+        GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid credential source url.");
+    return;
+  }
+  url_ = url;
+  it = options.credential_source.object_value().find("headers");
+  if (it != options.credential_source.object_value().end()) {
+    if (it->second.type() != Json::Type::OBJECT) {
+      *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "The JSON value of credential source headers is not an object.");
+      return;
+    }
+    for (auto const& header : it->second.object_value()) {
+      headers_[header.first] = header.second.string_value();
+    }
+  }
+  it = options.credential_source.object_value().find("format");
+  if (it != options.credential_source.object_value().end()) {
+    const Json& format_json = it->second;
+    if (format_json.type() != Json::Type::OBJECT) {
+      *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "The JSON value of credential source format is not an object.");
+      return;
+    }
+    auto format_it = format_json.object_value().find("type");
+    if (format_it == format_json.object_value().end()) {
+      *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "format.type field not present.");
+      return;
+    }
+    if (format_it->second.type() != Json::Type::STRING) {
+      *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "format.type field must be a string.");
+      return;
+    }
+    format_type_ = format_it->second.string_value();
+    if (format_type_ == "json") {
+      format_it = format_json.object_value().find("subject_token_field_name");
+      if (format_it == format_json.object_value().end()) {
+        *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+            "format.subject_token_field_name field must be present if the "
+            "format is in Json.");
+        return;
+      }
+      if (format_it->second.type() != Json::Type::STRING) {
+        *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+            "format.subject_token_field_name field must be a string.");
+        return;
+      }
+      format_subject_token_field_name_ = format_it->second.string_value();
+    }
+  }
+}
+
+UrlExternalAccountCredentials::~UrlExternalAccountCredentials() {
+  grpc_uri_destroy(url_);
+}
+
+void UrlExternalAccountCredentials::RetrieveSubjectToken(
+    HTTPRequestContext* ctx, const ExternalAccountCredentialsOptions& options,
+    std::function<void(std::string, grpc_error*)> cb) {
+  if (ctx == nullptr) {
+    FinishRetrieveSubjectToken(
+        "",
+        GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+            "Missing HTTPRequestContext to start subject token retrieval."));
+    return;
+  }
+  ctx_ = ctx;
+  cb_ = cb;
+  grpc_httpcli_request request;
+  memset(&request, 0, sizeof(grpc_httpcli_request));
+  request.host = const_cast<char*>(url_->authority);
+  request.http.path = gpr_strdup(url_->path);
+  grpc_http_header* headers = nullptr;
+  request.http.hdr_count = headers_.size();
+  headers = static_cast<grpc_http_header*>(
+      gpr_malloc(sizeof(grpc_http_header) * request.http.hdr_count));
+  int i = 0;
+  for (auto const& header : headers_) {
+    headers[i].key = gpr_strdup(header.first.c_str());
+    headers[i].value = gpr_strdup(header.second.c_str());
+    ++i;
+  }
+  request.http.hdrs = headers;
+  request.handshaker = (strcmp(url_->scheme, "https") == 0)
+                           ? &grpc_httpcli_ssl
+                           : &grpc_httpcli_plaintext;
+  grpc_resource_quota* resource_quota =
+      grpc_resource_quota_create("external_account_credentials");
+  grpc_http_response_destroy(&ctx_->response);
+  ctx_->response = {};
+  GRPC_CLOSURE_INIT(&ctx_->closure, OnRetrieveSubjectToken, this, nullptr);
+  grpc_httpcli_get(ctx_->httpcli_context, ctx_->pollent, resource_quota,
+                   &request, ctx_->deadline, &ctx_->closure, &ctx_->response);
+  grpc_resource_quota_unref_internal(resource_quota);
+  grpc_http_request_destroy(&request.http);
+}
+
+void UrlExternalAccountCredentials::OnRetrieveSubjectToken(void* arg,
+                                                           grpc_error* error) {
+  UrlExternalAccountCredentials* self =
+      static_cast<UrlExternalAccountCredentials*>(arg);
+  self->OnRetrieveSubjectTokenInternal(GRPC_ERROR_REF(error));
+}
+
+void UrlExternalAccountCredentials::OnRetrieveSubjectTokenInternal(
+    grpc_error* error) {
+  if (error != GRPC_ERROR_NONE) {
+    FinishRetrieveSubjectToken("", error);
+    return;
+  }
+  absl::string_view response_body(ctx_->response.body,
+                                  ctx_->response.body_length);
+  if (format_type_ == "json") {
+    grpc_error* error = GRPC_ERROR_NONE;
+    Json response_json = Json::Parse(response_body, &error);
+    if (error != GRPC_ERROR_NONE ||
+        response_json.type() != Json::Type::OBJECT) {
+      FinishRetrieveSubjectToken(
+          "", GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+                  "The format of response is not a valid json object."));
+      return;
+    }
+    auto response_it =
+        response_json.object_value().find(format_subject_token_field_name_);
+    if (response_it == response_json.object_value().end()) {
+      FinishRetrieveSubjectToken("", GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+                                         "Subject token field not present."));
+      return;
+    }
+    if (response_it->second.type() != Json::Type::STRING) {
+      FinishRetrieveSubjectToken("",
+                                 GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+                                     "Subject token field must be a string."));
+      return;
+    }
+    FinishRetrieveSubjectToken(response_it->second.string_value(), error);
+    return;
+  }
+  FinishRetrieveSubjectToken(std::string(response_body), GRPC_ERROR_NONE);
+}
+
+void UrlExternalAccountCredentials::FinishRetrieveSubjectToken(
+    std::string subject_token, grpc_error* error) {
+  // Reset context
+  ctx_ = nullptr;
+  // Move object state into local variables.
+  auto cb = cb_;
+  cb_ = nullptr;
+  // Invoke the callback.
+  if (error != GRPC_ERROR_NONE) {
+    cb("", error);
+  } else {
+    cb(subject_token, GRPC_ERROR_NONE);
+  }
+}
+
+}  // namespace grpc_core
diff --git a/src/core/lib/security/credentials/external/url_external_account_credentials.h b/src/core/lib/security/credentials/external/url_external_account_credentials.h
new file mode 100644 (file)
index 0000000..8383ab5
--- /dev/null
@@ -0,0 +1,59 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_EXTERNAL_URL_EXTERNAL_ACCOUNT_CREDENTIALS_H
+#define GRPC_CORE_LIB_SECURITY_CREDENTIALS_EXTERNAL_URL_EXTERNAL_ACCOUNT_CREDENTIALS_H
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/security/credentials/external/external_account_credentials.h"
+
+namespace grpc_core {
+
+class UrlExternalAccountCredentials final : public ExternalAccountCredentials {
+ public:
+  static RefCountedPtr<UrlExternalAccountCredentials> Create(
+      ExternalAccountCredentialsOptions options,
+      std::vector<std::string> scopes, grpc_error** error);
+
+  UrlExternalAccountCredentials(ExternalAccountCredentialsOptions options,
+                                std::vector<std::string> scopes,
+                                grpc_error** error);
+  ~UrlExternalAccountCredentials() override;
+
+ private:
+  void RetrieveSubjectToken(
+      HTTPRequestContext* ctx, const ExternalAccountCredentialsOptions& options,
+      std::function<void(std::string, grpc_error*)> cb) override;
+
+  static void OnRetrieveSubjectToken(void* arg, grpc_error* error);
+  void OnRetrieveSubjectTokenInternal(grpc_error* error);
+
+  void FinishRetrieveSubjectToken(std::string subject_token, grpc_error* error);
+
+  // Fields of credential source
+  grpc_uri* url_ = nullptr;
+  std::map<std::string, std::string> headers_;
+  std::string format_type_;
+  std::string format_subject_token_field_name_;
+
+  HTTPRequestContext* ctx_ = nullptr;
+  std::function<void(std::string, grpc_error*)> cb_ = nullptr;
+};
+
+}  // namespace grpc_core
+
+#endif  // GRPC_CORE_LIB_SECURITY_CREDENTIALS_EXTERNAL_URL_EXTERNAL_ACCOUNT_CREDENTIALS_H
diff --git a/src/core/lib/security/credentials/insecure/insecure_credentials.cc b/src/core/lib/security/credentials/insecure/insecure_credentials.cc
new file mode 100644 (file)
index 0000000..820fc47
--- /dev/null
@@ -0,0 +1,51 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#include <grpc/support/port_platform.h>
+
+#include <grpc/grpc_security.h>
+
+#include "src/core/lib/security/credentials/credentials.h"
+#include "src/core/lib/security/security_connector/insecure/insecure_security_connector.h"
+
+namespace grpc_core {
+namespace {
+
+constexpr char kCredentialsTypeInsecure[] = "insecure";
+
+class InsecureCredentials final : public grpc_channel_credentials {
+ public:
+  explicit InsecureCredentials()
+      : grpc_channel_credentials(kCredentialsTypeInsecure) {}
+
+  grpc_core::RefCountedPtr<grpc_channel_security_connector>
+  create_security_connector(
+      grpc_core::RefCountedPtr<grpc_call_credentials> call_creds,
+      const char* /* target_name */, const grpc_channel_args* /* args */,
+      grpc_channel_args** /* new_args */) override {
+    return MakeRefCounted<InsecureChannelSecurityConnector>(
+        Ref(), std::move(call_creds));
+  }
+};
+
+}  // namespace
+}  // namespace grpc_core
+
+grpc_channel_credentials* grpc_insecure_credentials_create() {
+  return new grpc_core::InsecureCredentials();
+}
index ef6259f..3b61742 100644 (file)
 #include "src/core/lib/security/util/json_util.h"
 #include "src/core/lib/slice/b64.h"
 
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmodule-import-in-extern-c"
 extern "C" {
 #include <openssl/bio.h>
 #include <openssl/evp.h>
 #include <openssl/pem.h>
 }
+#pragma clang diagnostic pop
 
 using grpc_core::Json;
 
@@ -64,7 +67,7 @@ static grpc_jwt_encode_and_sign_override g_jwt_encode_and_sign_override =
 
 int grpc_auth_json_key_is_valid(const grpc_auth_json_key* json_key) {
   return (json_key != nullptr) &&
-         strcmp(json_key->type, GRPC_AUTH_JSON_TYPE_INVALID);
+         strcmp(json_key->type, GRPC_AUTH_JSON_TYPE_INVALID) != 0;
 }
 
 grpc_auth_json_key grpc_auth_json_key_create_from_json(const Json& json) {
@@ -84,7 +87,7 @@ grpc_auth_json_key grpc_auth_json_key_create_from_json(const Json& json) {
   prop_value = grpc_json_get_string_property(json, "type", &error);
   GRPC_LOG_IF_ERROR("JSON key parsing", error);
   if (prop_value == nullptr ||
-      strcmp(prop_value, GRPC_AUTH_JSON_TYPE_SERVICE_ACCOUNT)) {
+      strcmp(prop_value, GRPC_AUTH_JSON_TYPE_SERVICE_ACCOUNT) != 0) {
     goto end;
   }
   result.type = GRPC_AUTH_JSON_TYPE_SERVICE_ACCOUNT;
index 88c0b55..d42fc25 100644 (file)
@@ -50,9 +50,10 @@ class grpc_service_account_jwt_access_credentials
   const grpc_auth_json_key& key() const { return key_; }
 
   std::string debug_string() override {
-    return absl::StrFormat("JWTAccessCredentials{ExpirationTime:%s}",
-                           absl::FormatTime(absl::FromUnixMicros(
-                               gpr_timespec_to_micros(jwt_lifetime_))));
+    return absl::StrFormat(
+        "JWTAccessCredentials{ExpirationTime:%s}",
+        absl::FormatTime(absl::FromUnixMicros(
+            static_cast<int64_t>(gpr_timespec_to_micros(jwt_lifetime_)))));
   };
 
  private:
index cd8217f..a6ed657 100644 (file)
 #include <grpc/support/string_util.h>
 #include <grpc/support/sync.h>
 
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmodule-import-in-extern-c"
 extern "C" {
 #include <openssl/bn.h>
 #include <openssl/pem.h>
 #include <openssl/rsa.h>
 }
+#pragma clang diagnostic pop
 
 #include "src/core/lib/gpr/string.h"
 #include "src/core/lib/gprpp/manual_constructor.h"
@@ -149,7 +152,8 @@ static jose_header* jose_header_from_json(Json json) {
      https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
    */
   alg_value = it->second.string_value().c_str();
-  if (it->second.type() != Json::Type::STRING || strncmp(alg_value, "RS", 2) ||
+  if (it->second.type() != Json::Type::STRING ||
+      strncmp(alg_value, "RS", 2) != 0 ||
       evp_md_from_alg(alg_value) == nullptr) {
     gpr_log(GPR_ERROR, "Invalid alg field");
     goto error;
index 322156c..8e1ec57 100644 (file)
@@ -53,7 +53,7 @@ using grpc_core::Json;
 int grpc_auth_refresh_token_is_valid(
     const grpc_auth_refresh_token* refresh_token) {
   return (refresh_token != nullptr) &&
-         strcmp(refresh_token->type, GRPC_AUTH_JSON_TYPE_INVALID);
+         strcmp(refresh_token->type, GRPC_AUTH_JSON_TYPE_INVALID) != 0;
 }
 
 grpc_auth_refresh_token grpc_auth_refresh_token_create_from_json(
@@ -73,7 +73,7 @@ grpc_auth_refresh_token grpc_auth_refresh_token_create_from_json(
   prop_value = grpc_json_get_string_property(json, "type", &error);
   GRPC_LOG_IF_ERROR("Parsing refresh token", error);
   if (prop_value == nullptr ||
-      strcmp(prop_value, GRPC_AUTH_JSON_TYPE_AUTHORIZED_USER)) {
+      strcmp(prop_value, GRPC_AUTH_JSON_TYPE_AUTHORIZED_USER) != 0) {
     goto end;
   }
   result.type = GRPC_AUTH_JSON_TYPE_AUTHORIZED_USER;
index 2189865..2aee165 100644 (file)
@@ -26,7 +26,7 @@
 
 void grpc_tls_certificate_distributor::SetKeyMaterials(
     const std::string& cert_name, absl::optional<std::string> pem_root_certs,
-    absl::optional<PemKeyCertPairList> pem_key_cert_pairs) {
+    absl::optional<grpc_core::PemKeyCertPairList> pem_key_cert_pairs) {
   GPR_ASSERT(pem_root_certs.has_value() || pem_key_cert_pairs.has_value());
   grpc_core::MutexLock lock(&mu_);
   auto& cert_info = certificate_info_map_[cert_name];
@@ -38,14 +38,17 @@ void grpc_tls_certificate_distributor::SetKeyMaterials(
       const auto watcher_it = watchers_.find(watcher_ptr);
       GPR_ASSERT(watcher_it != watchers_.end());
       GPR_ASSERT(watcher_it->second.root_cert_name.has_value());
-      absl::optional<PemKeyCertPairList> pem_key_cert_pairs_to_report;
+      absl::optional<grpc_core::PemKeyCertPairList>
+          pem_key_cert_pairs_to_report;
       if (pem_key_cert_pairs.has_value() &&
           watcher_it->second.identity_cert_name == cert_name) {
         pem_key_cert_pairs_to_report = pem_key_cert_pairs;
       } else if (watcher_it->second.identity_cert_name.has_value()) {
         auto& identity_cert_info =
             certificate_info_map_[*watcher_it->second.identity_cert_name];
-        pem_key_cert_pairs_to_report = identity_cert_info.pem_key_cert_pairs;
+        if (!identity_cert_info.pem_key_cert_pairs.empty()) {
+          pem_key_cert_pairs_to_report = identity_cert_info.pem_key_cert_pairs;
+        }
       }
       watcher_ptr->OnCertificatesChanged(
           pem_root_certs, std::move(pem_key_cert_pairs_to_report));
@@ -69,7 +72,9 @@ void grpc_tls_certificate_distributor::SetKeyMaterials(
       } else if (watcher_it->second.root_cert_name.has_value()) {
         auto& root_cert_info =
             certificate_info_map_[*watcher_it->second.root_cert_name];
-        pem_root_certs_to_report = root_cert_info.pem_root_certs;
+        if (!root_cert_info.pem_root_certs.empty()) {
+          pem_root_certs_to_report = root_cert_info.pem_root_certs;
+        }
       }
       watcher_ptr->OnCertificatesChanged(pem_root_certs_to_report,
                                          pem_key_cert_pairs);
@@ -188,7 +193,7 @@ void grpc_tls_certificate_distributor::WatchTlsCertificates(
     watchers_[watcher_ptr] = {std::move(watcher), root_cert_name,
                               identity_cert_name};
     absl::optional<absl::string_view> updated_root_certs;
-    absl::optional<PemKeyCertPairList> updated_identity_pairs;
+    absl::optional<grpc_core::PemKeyCertPairList> updated_identity_pairs;
     grpc_error* root_error = GRPC_ERROR_NONE;
     grpc_error* identity_error = GRPC_ERROR_NONE;
     if (root_cert_name.has_value()) {
@@ -319,3 +324,28 @@ void grpc_tls_certificate_distributor::CancelTlsCertificatesWatch(
     }
   }
 };
+
+/** -- Wrapper APIs declared in grpc_security.h -- **/
+
+grpc_tls_identity_pairs* grpc_tls_identity_pairs_create() {
+  return new grpc_tls_identity_pairs();
+}
+
+void grpc_tls_identity_pairs_add_pair(grpc_tls_identity_pairs* pairs,
+                                      const char* private_key,
+                                      const char* cert_chain) {
+  GPR_ASSERT(pairs != nullptr);
+  GPR_ASSERT(private_key != nullptr);
+  GPR_ASSERT(cert_chain != nullptr);
+  grpc_ssl_pem_key_cert_pair* ssl_pair =
+      static_cast<grpc_ssl_pem_key_cert_pair*>(
+          gpr_malloc(sizeof(grpc_ssl_pem_key_cert_pair)));
+  ssl_pair->private_key = gpr_strdup(private_key);
+  ssl_pair->cert_chain = gpr_strdup(cert_chain);
+  pairs->pem_key_cert_pairs.emplace_back(ssl_pair);
+}
+
+void grpc_tls_identity_pairs_destroy(grpc_tls_identity_pairs* pairs) {
+  GPR_ASSERT(pairs != nullptr);
+  delete pairs;
+}
index efc9e33..35451e7 100644 (file)
 
 #include <grpc/grpc_security.h>
 
+#include <utility>
+
 #include "absl/container/inlined_vector.h"
 #include "absl/types/optional.h"
 #include "src/core/lib/gprpp/ref_counted.h"
 #include "src/core/lib/security/security_connector/ssl_utils.h"
 
+struct grpc_tls_identity_pairs {
+  grpc_core::PemKeyCertPairList pem_key_cert_pairs;
+};
+
 // TLS certificate distributor.
 struct grpc_tls_certificate_distributor
     : public grpc_core::RefCounted<grpc_tls_certificate_distributor> {
  public:
-  typedef absl::InlinedVector<grpc_core::PemKeyCertPair, 1> PemKeyCertPairList;
-
   // Interface for watching TLS certificates update.
   class TlsCertificatesWatcherInterface {
    public:
@@ -48,7 +52,7 @@ struct grpc_tls_certificate_distributor
     // pairs.
     virtual void OnCertificatesChanged(
         absl::optional<absl::string_view> root_certs,
-        absl::optional<PemKeyCertPairList> key_cert_pairs) = 0;
+        absl::optional<grpc_core::PemKeyCertPairList> key_cert_pairs) = 0;
 
     // Handles an error that occurs while attempting to fetch certificate data.
     // Note that if a watcher sees an error, it simply means the Provider is
@@ -78,9 +82,9 @@ struct grpc_tls_certificate_distributor
   // @param cert_name The name of the certificates being updated.
   // @param pem_root_certs The content of root certificates.
   // @param pem_key_cert_pairs The content of identity key-cert pairs.
-  void SetKeyMaterials(const std::string& cert_name,
-                       absl::optional<std::string> pem_root_certs,
-                       absl::optional<PemKeyCertPairList> pem_key_cert_pairs);
+  void SetKeyMaterials(
+      const std::string& cert_name, absl::optional<std::string> pem_root_certs,
+      absl::optional<grpc_core::PemKeyCertPairList> pem_key_cert_pairs);
 
   bool HasRootCerts(const std::string& root_cert_name);
 
@@ -127,7 +131,7 @@ struct grpc_tls_certificate_distributor
   void SetWatchStatusCallback(
       std::function<void(std::string, bool, bool)> callback) {
     grpc_core::MutexLock lock(&mu_);
-    watch_status_callback_ = callback;
+    watch_status_callback_ = std::move(callback);
   };
 
   // Registers a watcher. The caller may keep a raw pointer to the watcher,
@@ -168,7 +172,7 @@ struct grpc_tls_certificate_distributor
     // The contents of the root certificates.
     std::string pem_root_certs;
     // The contents of the identity key-certificate pairs.
-    PemKeyCertPairList pem_key_cert_pairs;
+    grpc_core::PemKeyCertPairList pem_key_cert_pairs;
     // The root cert reloading error propagated by the caller.
     grpc_error* root_cert_error = GRPC_ERROR_NONE;
     // The identity cert reloading error propagated by the caller.
diff --git a/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc b/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc
new file mode 100644 (file)
index 0000000..80ea4ea
--- /dev/null
@@ -0,0 +1,78 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h"
+
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
+
+#include "src/core/lib/surface/api_trace.h"
+
+namespace grpc_core {
+
+StaticDataCertificateProvider::StaticDataCertificateProvider(
+    std::string root_certificate,
+    grpc_core::PemKeyCertPairList pem_key_cert_pairs)
+    : distributor_(MakeRefCounted<grpc_tls_certificate_distributor>()),
+      root_certificate_(std::move(root_certificate)),
+      pem_key_cert_pairs_(std::move(pem_key_cert_pairs)) {
+  distributor_->SetWatchStatusCallback([this](std::string cert_name,
+                                              bool root_being_watched,
+                                              bool identity_being_watched) {
+    if (!root_being_watched && !identity_being_watched) return;
+    absl::optional<std::string> root_certificate;
+    absl::optional<grpc_core::PemKeyCertPairList> pem_key_cert_pairs;
+    if (root_being_watched) {
+      root_certificate = root_certificate_;
+    }
+    if (identity_being_watched) {
+      pem_key_cert_pairs = pem_key_cert_pairs_;
+    }
+    distributor_->SetKeyMaterials(cert_name, std::move(root_certificate),
+                                  std::move(pem_key_cert_pairs));
+  });
+}
+
+}  // namespace grpc_core
+
+/** -- Wrapper APIs declared in grpc_security.h -- **/
+
+grpc_tls_certificate_provider* grpc_tls_certificate_provider_static_data_create(
+    const char* root_certificate, grpc_tls_identity_pairs* pem_key_cert_pairs) {
+  GPR_ASSERT(root_certificate != nullptr || pem_key_cert_pairs != nullptr);
+  grpc_core::PemKeyCertPairList identity_pairs_core;
+  if (pem_key_cert_pairs != nullptr) {
+    identity_pairs_core = std::move(pem_key_cert_pairs->pem_key_cert_pairs);
+    delete pem_key_cert_pairs;
+  }
+  std::string root_cert_core;
+  if (root_certificate != nullptr) {
+    root_cert_core = root_certificate;
+  }
+  return new grpc_core::StaticDataCertificateProvider(
+      std::move(root_cert_core), std::move(identity_pairs_core));
+}
+
+void grpc_tls_certificate_provider_release(
+    grpc_tls_certificate_provider* provider) {
+  GRPC_API_TRACE("grpc_tls_certificate_provider_release(provider=%p)", 1,
+                 (provider));
+  grpc_core::ExecCtx exec_ctx;
+  if (provider != nullptr) provider->Unref();
+}
@@ -1,5 +1,4 @@
 //
-//
 // Copyright 2020 gRPC authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // See the License for the specific language governing permissions and
 // limitations under the License.
 //
-//
 
-#ifndef GRPC_CORE_LIB_SECURITY_CERTIFICATE_PROVIDER_H
-#define GRPC_CORE_LIB_SECURITY_CERTIFICATE_PROVIDER_H
+#ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_TLS_GRPC_TLS_CERTIFICATE_PROVIDER_H
+#define GRPC_CORE_LIB_SECURITY_CREDENTIALS_TLS_GRPC_TLS_CERTIFICATE_PROVIDER_H
 
 #include <grpc/support/port_platform.h>
 
+#include <grpc/grpc_security.h>
+#include <string.h>
+
+#include "absl/container/inlined_vector.h"
+
 #include "src/core/lib/gprpp/ref_counted.h"
 #include "src/core/lib/gprpp/ref_counted_ptr.h"
 #include "src/core/lib/iomgr/pollset_set.h"
-
-// TODO(yashkt): After https://github.com/grpc/grpc/pull/23572, remove this
-// forward declaration and include the header for the distributor instead.
-struct grpc_tls_certificate_distributor;
+#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h"
+#include "src/core/lib/security/security_connector/ssl_utils.h"
 
 // Interface for a grpc_tls_certificate_provider that handles the process to
 // fetch credentials and validation contexts. Implementations are free to rely
@@ -41,20 +42,33 @@ struct grpc_tls_certificate_distributor;
 struct grpc_tls_certificate_provider
     : public grpc_core::RefCounted<grpc_tls_certificate_provider> {
  public:
-  grpc_tls_certificate_provider()
-      : interested_parties_(grpc_pollset_set_create()) {}
-
-  virtual ~grpc_tls_certificate_provider() {
-    grpc_pollset_set_destroy(interested_parties_);
-  }
-
-  grpc_pollset_set* interested_parties() const { return interested_parties_; }
+  virtual grpc_pollset_set* interested_parties() const { return nullptr; }
 
   virtual grpc_core::RefCountedPtr<grpc_tls_certificate_distributor>
   distributor() const = 0;
+};
+
+namespace grpc_core {
+
+// A basic provider class that will get credentials from string during
+// initialization.
+class StaticDataCertificateProvider final
+    : public grpc_tls_certificate_provider {
+ public:
+  StaticDataCertificateProvider(
+      std::string root_certificate,
+      grpc_core::PemKeyCertPairList pem_key_cert_pairs);
+
+  RefCountedPtr<grpc_tls_certificate_distributor> distributor() const override {
+    return distributor_;
+  }
 
  private:
-  grpc_pollset_set* interested_parties_;
+  RefCountedPtr<grpc_tls_certificate_distributor> distributor_;
+  std::string root_certificate_;
+  grpc_core::PemKeyCertPairList pem_key_cert_pairs_;
 };
 
-#endif  // GRPC_CORE_LIB_SECURITY_CERTIFICATE_PROVIDER_H
+}  // namespace grpc_core
+
+#endif  // GRPC_CORE_LIB_SECURITY_CREDENTIALS_TLS_GRPC_TLS_CERTIFICATE_PROVIDER_H
index 906a2f0..12e462b 100644 (file)
 #include <grpc/support/log.h>
 #include <grpc/support/string_util.h>
 
-/** -- gRPC TLS key materials config API implementation. -- **/
-void grpc_tls_key_materials_config::set_key_materials(
-    const char* pem_root_certs,
-    const grpc_ssl_pem_key_cert_pair** pem_key_cert_pairs,
-    size_t num_key_cert_pairs) {
-  this->set_pem_root_certs(pem_root_certs);
-  grpc_tls_key_materials_config::PemKeyCertPairList cert_pair_list;
-  for (size_t i = 0; i < num_key_cert_pairs; i++) {
-    auto current_pair = static_cast<grpc_ssl_pem_key_cert_pair*>(
-        gpr_zalloc(sizeof(grpc_ssl_pem_key_cert_pair)));
-    current_pair->cert_chain = gpr_strdup(pem_key_cert_pairs[i]->cert_chain);
-    current_pair->private_key = gpr_strdup(pem_key_cert_pairs[i]->private_key);
-    cert_pair_list.emplace_back(grpc_core::PemKeyCertPair(current_pair));
-  }
-  pem_key_cert_pair_list_ = std::move(cert_pair_list);
-}
-
-void grpc_tls_key_materials_config::set_key_materials(
-    const char* pem_root_certs,
-    const PemKeyCertPairList& pem_key_cert_pair_list) {
-  this->set_pem_root_certs(pem_root_certs);
-  grpc_tls_key_materials_config::PemKeyCertPairList dup_list(
-      pem_key_cert_pair_list);
-  pem_key_cert_pair_list_ = std::move(dup_list);
-}
-
-/** -- gRPC TLS credential reload config API implementation. -- **/
-grpc_tls_credential_reload_config::grpc_tls_credential_reload_config(
-    const void* config_user_data,
-    int (*schedule)(void* config_user_data,
-                    grpc_tls_credential_reload_arg* arg),
-    void (*cancel)(void* config_user_data, grpc_tls_credential_reload_arg* arg),
-    void (*destruct)(void* config_user_data))
-    : config_user_data_(const_cast<void*>(config_user_data)),
-      schedule_(schedule),
-      cancel_(cancel),
-      destruct_(destruct) {}
-
-grpc_tls_credential_reload_config::~grpc_tls_credential_reload_config() {
-  if (destruct_ != nullptr) {
-    destruct_((void*)config_user_data_);
-  }
-}
+#include "src/core/lib/surface/api_trace.h"
 
 /** -- gRPC TLS server authorization check API implementation. -- **/
 grpc_tls_server_authorization_check_config::
@@ -92,138 +50,99 @@ grpc_tls_server_authorization_check_config::
   }
 }
 
+int grpc_tls_server_authorization_check_config::Schedule(
+    grpc_tls_server_authorization_check_arg* arg) const {
+  if (schedule_ == nullptr) {
+    gpr_log(GPR_ERROR, "schedule API is nullptr");
+    if (arg != nullptr) {
+      arg->status = GRPC_STATUS_NOT_FOUND;
+      arg->error_details->set_error_details(
+          "schedule API in server authorization check config is nullptr");
+    }
+    return 1;
+  }
+  if (arg != nullptr && context_ != nullptr) {
+    arg->config = const_cast<grpc_tls_server_authorization_check_config*>(this);
+  }
+  return schedule_(config_user_data_, arg);
+}
+
+void grpc_tls_server_authorization_check_config::Cancel(
+    grpc_tls_server_authorization_check_arg* arg) const {
+  if (cancel_ == nullptr) {
+    gpr_log(GPR_ERROR, "cancel API is nullptr.");
+    if (arg != nullptr) {
+      arg->status = GRPC_STATUS_NOT_FOUND;
+      arg->error_details->set_error_details(
+          "schedule API in server authorization check config is nullptr");
+    }
+    return;
+  }
+  if (arg != nullptr) {
+    arg->config = const_cast<grpc_tls_server_authorization_check_config*>(this);
+  }
+  cancel_(config_user_data_, arg);
+}
+
 /** -- Wrapper APIs declared in grpc_security.h -- **/
+
 grpc_tls_credentials_options* grpc_tls_credentials_options_create() {
   return new grpc_tls_credentials_options();
 }
 
-int grpc_tls_credentials_options_set_cert_request_type(
+void grpc_tls_credentials_options_set_cert_request_type(
     grpc_tls_credentials_options* options,
     grpc_ssl_client_certificate_request_type type) {
-  if (options == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_tls_credentials_options_set_cert_request_type()");
-    return 0;
-  }
+  GPR_ASSERT(options != nullptr);
   options->set_cert_request_type(type);
-  return 1;
 }
 
-int grpc_tls_credentials_options_set_server_verification_option(
+void grpc_tls_credentials_options_set_server_verification_option(
     grpc_tls_credentials_options* options,
     grpc_tls_server_verification_option server_verification_option) {
-  if (options == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_tls_credentials_options_set_server_verification_option()");
-    return 0;
-  }
-  if (server_verification_option != GRPC_TLS_SERVER_VERIFICATION &&
-      options->server_authorization_check_config() == nullptr) {
-    gpr_log(GPR_ERROR,
-            "server_authorization_check_config needs to be specified when"
-            "server_verification_option is not GRPC_TLS_SERVER_VERIFICATION");
-    return 0;
-  }
+  GPR_ASSERT(options != nullptr);
   options->set_server_verification_option(server_verification_option);
-  return 1;
-}
-
-int grpc_tls_credentials_options_set_key_materials_config(
-    grpc_tls_credentials_options* options,
-    grpc_tls_key_materials_config* config) {
-  if (options == nullptr || config == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_tls_credentials_options_set_key_materials_config()");
-    return 0;
-  }
-  options->set_key_materials_config(config->Ref());
-  return 1;
 }
 
-int grpc_tls_credentials_options_set_credential_reload_config(
+void grpc_tls_credentials_options_set_certificate_provider(
     grpc_tls_credentials_options* options,
-    grpc_tls_credential_reload_config* config) {
-  if (options == nullptr || config == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_tls_credentials_options_set_credential_reload_config()");
-    return 0;
-  }
-  options->set_credential_reload_config(config->Ref());
-  return 1;
+    grpc_tls_certificate_provider* provider) {
+  GPR_ASSERT(options != nullptr);
+  GPR_ASSERT(provider != nullptr);
+  options->set_certificate_provider(
+      provider->Ref(DEBUG_LOCATION, "set_certificate_provider"));
 }
 
-int grpc_tls_credentials_options_set_server_authorization_check_config(
-    grpc_tls_credentials_options* options,
-    grpc_tls_server_authorization_check_config* config) {
-  if (options == nullptr || config == nullptr) {
-    gpr_log(
-        GPR_ERROR,
-        "Invalid nullptr arguments to "
-        "grpc_tls_credentials_options_set_server_authorization_check_config()");
-    return 0;
-  }
-  options->set_server_authorization_check_config(config->Ref());
-  return 1;
+void grpc_tls_credentials_options_watch_root_certs(
+    grpc_tls_credentials_options* options) {
+  GPR_ASSERT(options != nullptr);
+  options->set_watch_root_cert(true);
 }
 
-grpc_tls_key_materials_config* grpc_tls_key_materials_config_create() {
-  return new grpc_tls_key_materials_config();
+void grpc_tls_credentials_options_set_root_cert_name(
+    grpc_tls_credentials_options* options, const char* root_cert_name) {
+  GPR_ASSERT(options != nullptr);
+  options->set_root_cert_name(root_cert_name);
 }
 
-int grpc_tls_key_materials_config_set_key_materials(
-    grpc_tls_key_materials_config* config, const char* root_certs,
-    const grpc_ssl_pem_key_cert_pair** key_cert_pairs, size_t num) {
-  if (config == nullptr || key_cert_pairs == nullptr || num == 0) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_tls_key_materials_config_set_key_materials()");
-    return 0;
-  }
-  config->set_key_materials(root_certs, key_cert_pairs, num);
-  return 1;
-}
-
-int grpc_tls_key_materials_config_set_version(
-    grpc_tls_key_materials_config* config, int version) {
-  if (config == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_tls_key_materials_config_set_version()");
-    return 0;
-  }
-  config->set_version(version);
-  return 1;
+void grpc_tls_credentials_options_watch_identity_key_cert_pairs(
+    grpc_tls_credentials_options* options) {
+  GPR_ASSERT(options != nullptr);
+  options->set_watch_identity_pair(true);
 }
 
-int grpc_tls_key_materials_config_get_version(
-    grpc_tls_key_materials_config* config) {
-  if (config == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_tls_key_materials_config_get_version()");
-    return -1;
-  }
-  return config->version();
+void grpc_tls_credentials_options_set_identity_cert_name(
+    grpc_tls_credentials_options* options, const char* identity_cert_name) {
+  GPR_ASSERT(options != nullptr);
+  options->set_identity_cert_name(identity_cert_name);
 }
 
-grpc_tls_credential_reload_config* grpc_tls_credential_reload_config_create(
-    const void* config_user_data,
-    int (*schedule)(void* config_user_data,
-                    grpc_tls_credential_reload_arg* arg),
-    void (*cancel)(void* config_user_data, grpc_tls_credential_reload_arg* arg),
-    void (*destruct)(void* config_user_data)) {
-  if (schedule == nullptr) {
-    gpr_log(
-        GPR_ERROR,
-        "Schedule API is nullptr in creating TLS credential reload config.");
-    return nullptr;
-  }
-  return new grpc_tls_credential_reload_config(config_user_data, schedule,
-                                               cancel, destruct);
+void grpc_tls_credentials_options_set_server_authorization_check_config(
+    grpc_tls_credentials_options* options,
+    grpc_tls_server_authorization_check_config* config) {
+  GPR_ASSERT(options != nullptr);
+  GPR_ASSERT(config != nullptr);
+  options->set_server_authorization_check_config(config->Ref());
 }
 
 grpc_tls_server_authorization_check_config*
@@ -243,3 +162,12 @@ grpc_tls_server_authorization_check_config_create(
   return new grpc_tls_server_authorization_check_config(
       config_user_data, schedule, cancel, destruct);
 }
+
+void grpc_tls_server_authorization_check_config_release(
+    grpc_tls_server_authorization_check_config* config) {
+  GRPC_API_TRACE(
+      "grpc_tls_server_authorization_check_config_release(config=%p)", 1,
+      (config));
+  grpc_core::ExecCtx exec_ctx;
+  if (config != nullptr) config->Unref();
+}
index 52a1218..c672384 100644 (file)
@@ -26,6 +26,8 @@
 #include "absl/container/inlined_vector.h"
 
 #include "src/core/lib/gprpp/ref_counted.h"
+#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h"
+#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h"
 #include "src/core/lib/security/security_connector/ssl_utils.h"
 
 struct grpc_tls_error_details
@@ -41,126 +43,6 @@ struct grpc_tls_error_details
   std::string error_details_;
 };
 
-/** TLS key materials config. **/
-struct grpc_tls_key_materials_config
-    : public grpc_core::RefCounted<grpc_tls_key_materials_config> {
- public:
-  typedef absl::InlinedVector<grpc_core::PemKeyCertPair, 1> PemKeyCertPairList;
-
-  /** Getters for member fields. **/
-  const char* pem_root_certs() const { return pem_root_certs_.get(); }
-  const PemKeyCertPairList& pem_key_cert_pair_list() const {
-    return pem_key_cert_pair_list_;
-  }
-  int version() const { return version_; }
-
-  /** Setters for member fields. **/
-  // TODO(ZhenLian): Remove this function
-  void set_pem_root_certs(grpc_core::UniquePtr<char> pem_root_certs) {
-    pem_root_certs_ = std::move(pem_root_certs);
-  }
-  // The ownerships of |pem_root_certs| remain with the caller.
-  void set_pem_root_certs(const char* pem_root_certs) {
-    // make a copy of pem_root_certs.
-    grpc_core::UniquePtr<char> pem_root_ptr(gpr_strdup(pem_root_certs));
-    pem_root_certs_ = std::move(pem_root_ptr);
-  }
-  void add_pem_key_cert_pair(grpc_core::PemKeyCertPair pem_key_cert_pair) {
-    pem_key_cert_pair_list_.push_back(pem_key_cert_pair);
-  }
-  // The ownerships of |pem_root_certs| and |pem_key_cert_pairs| remain with the
-  // caller.
-  void set_key_materials(const char* pem_root_certs,
-                         const grpc_ssl_pem_key_cert_pair** pem_key_cert_pairs,
-                         size_t num_key_cert_pairs);
-  // The ownerships of |pem_root_certs| and |pem_key_cert_pair_list| remain with
-  // the caller.
-  void set_key_materials(const char* pem_root_certs,
-                         const PemKeyCertPairList& pem_key_cert_pair_list);
-  void set_version(int version) { version_ = version; }
-
- private:
-  int version_ = 0;
-  PemKeyCertPairList pem_key_cert_pair_list_;
-  grpc_core::UniquePtr<char> pem_root_certs_;
-};
-
-/** TLS credential reload config. **/
-struct grpc_tls_credential_reload_config
-    : public grpc_core::RefCounted<grpc_tls_credential_reload_config> {
- public:
-  grpc_tls_credential_reload_config(
-      const void* config_user_data,
-      int (*schedule)(void* config_user_data,
-                      grpc_tls_credential_reload_arg* arg),
-      void (*cancel)(void* config_user_data,
-                     grpc_tls_credential_reload_arg* arg),
-      void (*destruct)(void* config_user_data));
-  ~grpc_tls_credential_reload_config();
-
-  void* context() const { return context_; }
-  void set_context(void* context) { context_ = context; }
-
-  int Schedule(grpc_tls_credential_reload_arg* arg) const {
-    if (schedule_ == nullptr) {
-      gpr_log(GPR_ERROR, "schedule API is nullptr");
-      if (arg != nullptr) {
-        arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL;
-        arg->error_details->set_error_details(
-            "schedule API in credential reload config is nullptr");
-      }
-      return 1;
-    }
-    if (arg != nullptr) {
-      arg->config = const_cast<grpc_tls_credential_reload_config*>(this);
-    }
-    return schedule_(config_user_data_, arg);
-  }
-  void Cancel(grpc_tls_credential_reload_arg* arg) const {
-    if (cancel_ == nullptr) {
-      gpr_log(GPR_ERROR, "cancel API is nullptr.");
-      if (arg != nullptr) {
-        arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL;
-        arg->error_details->set_error_details(
-            "cancel API in credential reload config is nullptr");
-      }
-      return;
-    }
-    if (arg != nullptr) {
-      arg->config = const_cast<grpc_tls_credential_reload_config*>(this);
-    }
-    cancel_(config_user_data_, arg);
-  }
-
- private:
-  /** This is a pointer to the wrapped language implementation of
-   * grpc_tls_credential_reload_config. It is necessary to implement the C
-   * schedule and cancel functions, given the schedule or cancel function in a
-   * wrapped language. **/
-  void* context_ = nullptr;
-  /** config-specific, read-only user data that works for all channels created
-     with a credential using the config. */
-  void* config_user_data_;
-  /** callback function for invoking credential reload API. The implementation
-     of this method has to be non-blocking, but can be performed synchronously
-     or asynchronously.
-     If processing occurs synchronously, it populates \a arg->key_materials, \a
-     arg->status, and \a arg->error_details and returns zero.
-     If processing occurs asynchronously, it returns a non-zero value.
-     Application then invokes \a arg->cb when processing is completed. Note that
-     \a arg->cb cannot be invoked before \a schedule returns.
-  */
-  int (*schedule_)(void* config_user_data, grpc_tls_credential_reload_arg* arg);
-  /** callback function for cancelling a credential reload request scheduled via
-     an asynchronous \a schedule. \a arg is used to pinpoint an exact reloading
-     request to be cancelled, and the operation may not have any effect if the
-     request has already been processed. */
-  void (*cancel_)(void* config_user_data, grpc_tls_credential_reload_arg* arg);
-  /** callback function for cleaning up any data associated with credential
-     reload config. */
-  void (*destruct_)(void* config_user_data);
-};
-
 /** TLS server authorization check config. **/
 struct grpc_tls_server_authorization_check_config
     : public grpc_core::RefCounted<grpc_tls_server_authorization_check_config> {
@@ -172,43 +54,15 @@ struct grpc_tls_server_authorization_check_config
       void (*cancel)(void* config_user_data,
                      grpc_tls_server_authorization_check_arg* arg),
       void (*destruct)(void* config_user_data));
-  ~grpc_tls_server_authorization_check_config();
+  ~grpc_tls_server_authorization_check_config() override;
 
   void* context() const { return context_; }
+
   void set_context(void* context) { context_ = context; }
 
-  int Schedule(grpc_tls_server_authorization_check_arg* arg) const {
-    if (schedule_ == nullptr) {
-      gpr_log(GPR_ERROR, "schedule API is nullptr");
-      if (arg != nullptr) {
-        arg->status = GRPC_STATUS_NOT_FOUND;
-        arg->error_details->set_error_details(
-            "schedule API in server authorization check config is nullptr");
-      }
-      return 1;
-    }
-    if (arg != nullptr && context_ != nullptr) {
-      arg->config =
-          const_cast<grpc_tls_server_authorization_check_config*>(this);
-    }
-    return schedule_(config_user_data_, arg);
-  }
-  void Cancel(grpc_tls_server_authorization_check_arg* arg) const {
-    if (cancel_ == nullptr) {
-      gpr_log(GPR_ERROR, "cancel API is nullptr.");
-      if (arg != nullptr) {
-        arg->status = GRPC_STATUS_NOT_FOUND;
-        arg->error_details->set_error_details(
-            "schedule API in server authorization check config is nullptr");
-      }
-      return;
-    }
-    if (arg != nullptr) {
-      arg->config =
-          const_cast<grpc_tls_server_authorization_check_config*>(this);
-    }
-    cancel_(config_user_data_, arg);
-  }
+  int Schedule(grpc_tls_server_authorization_check_arg* arg) const;
+
+  void Cancel(grpc_tls_server_authorization_check_arg* arg) const;
 
  private:
   /** This is a pointer to the wrapped language implementation of
@@ -241,23 +95,15 @@ struct grpc_tls_server_authorization_check_config
   void (*destruct_)(void* config_user_data);
 };
 
-/* TLS credentials options. */
+// Contains configurable options specified by callers to configure their certain
+// security features supported in TLS.
+// TODO(ZhenLian): consider making this not ref-counted.
 struct grpc_tls_credentials_options
     : public grpc_core::RefCounted<grpc_tls_credentials_options> {
  public:
-  ~grpc_tls_credentials_options() {
-    if (key_materials_config_.get() != nullptr) {
-      key_materials_config_.get()->Unref();
-    }
-    if (credential_reload_config_.get() != nullptr) {
-      credential_reload_config_.get()->Unref();
-    }
-    if (server_authorization_check_config_.get() != nullptr) {
-      server_authorization_check_config_.get()->Unref();
-    }
-  }
+  ~grpc_tls_credentials_options() override = default;
 
-  /* Getters for member fields. */
+  // Getters for member fields.
   grpc_ssl_client_certificate_request_type cert_request_type() const {
     return cert_request_type_;
   }
@@ -266,18 +112,21 @@ struct grpc_tls_credentials_options
   }
   grpc_tls_version min_tls_version() const { return min_tls_version_; }
   grpc_tls_version max_tls_version() const { return max_tls_version_; }
-  grpc_tls_key_materials_config* key_materials_config() const {
-    return key_materials_config_.get();
-  }
-  grpc_tls_credential_reload_config* credential_reload_config() const {
-    return credential_reload_config_.get();
-  }
   grpc_tls_server_authorization_check_config*
   server_authorization_check_config() const {
     return server_authorization_check_config_.get();
   }
+  // Returns the distributor from provider_ if it is set, nullptr otherwise.
+  grpc_tls_certificate_distributor* certificate_distributor() {
+    if (provider_ != nullptr) return provider_->distributor().get();
+    return nullptr;
+  }
+  bool watch_root_cert() { return watch_root_cert_; }
+  const std::string& root_cert_name() { return root_cert_name_; }
+  bool watch_identity_pair() { return watch_identity_pair_; }
+  const std::string& identity_cert_name() { return identity_cert_name_; }
 
-  /* Setters for member fields. */
+  // Setters for member fields.
   void set_cert_request_type(
       const grpc_ssl_client_certificate_request_type type) {
     cert_request_type_ = type;
@@ -292,32 +141,54 @@ struct grpc_tls_credentials_options
   void set_max_tls_version(grpc_tls_version max_tls_version) {
     max_tls_version_ = max_tls_version;
   }
-  void set_key_materials_config(
-      grpc_core::RefCountedPtr<grpc_tls_key_materials_config> config) {
-    key_materials_config_ = std::move(config);
-  }
-  void set_credential_reload_config(
-      grpc_core::RefCountedPtr<grpc_tls_credential_reload_config> config) {
-    credential_reload_config_ = std::move(config);
-  }
   void set_server_authorization_check_config(
       grpc_core::RefCountedPtr<grpc_tls_server_authorization_check_config>
           config) {
     server_authorization_check_config_ = std::move(config);
   }
+  // Sets the provider in the options.
+  // This should only be used by C-core API for Tls*Creds case.
+  void set_certificate_provider(
+      grpc_core::RefCountedPtr<grpc_tls_certificate_provider> provider) {
+    provider_ = std::move(provider);
+  }
+  // If need to watch the updates of root certificates with name
+  // |root_cert_name|. The default value is false. If used in tls_credentials,
+  // it should always be set to true unless the root certificates are not
+  // needed.
+  void set_watch_root_cert(bool watch) { watch_root_cert_ = watch; }
+  // Sets the name of root certificates being watched, if |set_watch_root_cert|
+  // is called. If not set, an empty string will be used as the name.
+  void set_root_cert_name(std::string root_cert_name) {
+    root_cert_name_ = std::move(root_cert_name);
+  }
+  // If need to watch the updates of identity certificates with name
+  // |identity_cert_name|.
+  // The default value is false.
+  // If used in tls_credentials, it should always be set to true
+  // unless the identity key-cert pairs are not needed.
+  void set_watch_identity_pair(bool watch) { watch_identity_pair_ = watch; }
+  // Sets the name of identity key-cert pairs being watched, if
+  // |set_watch_identity_pair| is called. If not set, an empty string will
+  // be used as the name.
+  void set_identity_cert_name(std::string identity_cert_name) {
+    identity_cert_name_ = std::move(identity_cert_name);
+  }
 
  private:
-  grpc_ssl_client_certificate_request_type cert_request_type_;
+  grpc_ssl_client_certificate_request_type cert_request_type_ =
+      GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE;
   grpc_tls_server_verification_option server_verification_option_ =
       GRPC_TLS_SERVER_VERIFICATION;
   grpc_tls_version min_tls_version_ = grpc_tls_version::TLS1_2;
   grpc_tls_version max_tls_version_ = grpc_tls_version::TLS1_3;
-  grpc_core::RefCountedPtr<grpc_tls_key_materials_config> key_materials_config_;
-  grpc_core::RefCountedPtr<grpc_tls_credential_reload_config>
-      credential_reload_config_;
   grpc_core::RefCountedPtr<grpc_tls_server_authorization_check_config>
       server_authorization_check_config_;
+  grpc_core::RefCountedPtr<grpc_tls_certificate_provider> provider_;
+  bool watch_root_cert_ = false;
+  std::string root_cert_name_;
+  bool watch_identity_pair_ = false;
+  std::string identity_cert_name_;
 };
 
-#endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_TLS_GRPC_TLS_CREDENTIALS_OPTIONS_H \
-        */
+#endif  // GRPC_CORE_LIB_SECURITY_CREDENTIALS_TLS_GRPC_TLS_CREDENTIALS_OPTIONS_H
index 701fd3b..f2c4b3b 100644 (file)
@@ -40,18 +40,18 @@ bool CredentialOptionSanityCheck(const grpc_tls_credentials_options* options,
     gpr_log(GPR_ERROR, "TLS credentials options is nullptr.");
     return false;
   }
-  if (options->key_materials_config() == nullptr &&
-      options->credential_reload_config() == nullptr) {
-    gpr_log(GPR_ERROR,
-            "TLS credentials options must specify either key materials or "
-            "credential reload config.");
-    return false;
-  }
+  // TODO(ZhenLian): remove this when it is also supported on server side.
   if (!is_client && options->server_authorization_check_config() != nullptr) {
     gpr_log(GPR_INFO,
             "Server's credentials options should not contain server "
             "authorization check config.");
   }
+  if (options->server_verification_option() != GRPC_TLS_SERVER_VERIFICATION &&
+      options->server_authorization_check_config() == nullptr) {
+    gpr_log(GPR_ERROR,
+            "Should provider custom verifications if bypassing default ones.");
+    return false;
+  }
   return true;
 }
 
@@ -85,14 +85,16 @@ TlsCredentials::create_security_connector(
   }
   grpc_core::RefCountedPtr<grpc_channel_security_connector> sc =
       grpc_core::TlsChannelSecurityConnector::CreateTlsChannelSecurityConnector(
-          this->Ref(), std::move(call_creds), target_name,
+          this->Ref(), options_, std::move(call_creds), target_name,
           overridden_target_name, ssl_session_cache);
   if (sc == nullptr) {
     return nullptr;
   }
-  grpc_arg new_arg = grpc_channel_arg_string_create(
-      (char*)GRPC_ARG_HTTP2_SCHEME, (char*)"https");
-  *new_args = grpc_channel_args_copy_and_add(args, &new_arg, 1);
+  if (args != nullptr) {
+    grpc_arg new_arg = grpc_channel_arg_string_create(
+        (char*)GRPC_ARG_HTTP2_SCHEME, (char*)"https");
+    *new_args = grpc_channel_args_copy_and_add(args, &new_arg, 1);
+  }
   return sc;
 }
 
@@ -106,9 +108,11 @@ TlsServerCredentials::~TlsServerCredentials() {}
 grpc_core::RefCountedPtr<grpc_server_security_connector>
 TlsServerCredentials::create_security_connector() {
   return grpc_core::TlsServerSecurityConnector::
-      CreateTlsServerSecurityConnector(this->Ref());
+      CreateTlsServerSecurityConnector(this->Ref(), options_);
 }
 
+/** -- Wrapper APIs declared in grpc_security.h -- **/
+
 grpc_channel_credentials* grpc_tls_credentials_create(
     grpc_tls_credentials_options* options) {
   if (!CredentialOptionSanityCheck(options, true /* is_client */)) {
index 388c71f..214bc90 100644 (file)
@@ -38,7 +38,7 @@ class TlsCredentials final : public grpc_channel_credentials {
       const char* target_name, const grpc_channel_args* args,
       grpc_channel_args** new_args) override;
 
-  const grpc_tls_credentials_options& options() const { return *options_; }
+  grpc_tls_credentials_options* options() const { return options_.get(); }
 
  private:
   grpc_core::RefCountedPtr<grpc_tls_credentials_options> options_;
@@ -53,7 +53,7 @@ class TlsServerCredentials final : public grpc_server_credentials {
   grpc_core::RefCountedPtr<grpc_server_security_connector>
   create_security_connector() override;
 
-  const grpc_tls_credentials_options& options() const { return *options_; }
+  grpc_tls_credentials_options* options() const { return options_.get(); }
 
  private:
   grpc_core::RefCountedPtr<grpc_tls_credentials_options> options_;
index 958ba2d..0e3b1e8 100644 (file)
@@ -223,7 +223,7 @@ static void fake_check_peer(
   }
   prop_name = peer.properties[0].name;
   if (prop_name == nullptr ||
-      strcmp(prop_name, TSI_CERTIFICATE_TYPE_PEER_PROPERTY)) {
+      strcmp(prop_name, TSI_CERTIFICATE_TYPE_PEER_PROPERTY) != 0) {
     error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
         absl::StrCat("Unexpected property in fake peer: ",
                      prop_name == nullptr ? "<EMPTY>" : prop_name)
@@ -231,7 +231,7 @@ static void fake_check_peer(
     goto end;
   }
   if (strncmp(peer.properties[0].value.data, TSI_FAKE_CERTIFICATE_TYPE,
-              peer.properties[0].value.length)) {
+              peer.properties[0].value.length) != 0) {
     error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
         "Invalid value for cert type property.");
     goto end;
diff --git a/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc b/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc
new file mode 100644 (file)
index 0000000..a621ff9
--- /dev/null
@@ -0,0 +1,88 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/security/security_connector/insecure/insecure_security_connector.h"
+
+#include "src/core/lib/gprpp/ref_counted_ptr.h"
+#include "src/core/lib/security/transport/security_handshaker.h"
+#include "src/core/tsi/local_transport_security.h"
+
+namespace grpc_core {
+
+const char kInsecureTransportSecurityType[] = "insecure";
+
+// check_call_host and cancel_check_call_host are no-ops since we want to
+// provide an insecure channel.
+bool InsecureChannelSecurityConnector::check_call_host(
+    absl::string_view host, grpc_auth_context* auth_context,
+    grpc_closure* on_call_host_checked, grpc_error** error) {
+  *error = GRPC_ERROR_NONE;
+  return true;
+}
+
+void InsecureChannelSecurityConnector::cancel_check_call_host(
+    grpc_closure* on_call_host_checked, grpc_error* error) {
+  GRPC_ERROR_UNREF(error);
+}
+
+// add_handshakers should have been a no-op but we need to add a minimalist
+// security handshaker so that check_peer is invoked and an auth_context is
+// created with the security level of TSI_SECURITY_NONE.
+void InsecureChannelSecurityConnector::add_handshakers(
+    const grpc_channel_args* args, grpc_pollset_set* /* interested_parties */,
+    HandshakeManager* handshake_manager) {
+  tsi_handshaker* handshaker = nullptr;
+  // Re-use local_tsi_handshaker_create as a minimalist handshaker.
+  GPR_ASSERT(tsi_local_handshaker_create(true /* is_client */, &handshaker) ==
+             TSI_OK);
+  handshake_manager->Add(SecurityHandshakerCreate(handshaker, this, args));
+}
+
+void InsecureChannelSecurityConnector::check_peer(
+    tsi_peer peer, grpc_endpoint* ep,
+    RefCountedPtr<grpc_auth_context>* auth_context,
+    grpc_closure* on_peer_checked) {
+  *auth_context = MakeAuthContext();
+  tsi_peer_destruct(&peer);
+  ExecCtx::Run(DEBUG_LOCATION, on_peer_checked, GRPC_ERROR_NONE);
+}
+
+int InsecureChannelSecurityConnector::cmp(
+    const grpc_security_connector* other_sc) const {
+  return channel_security_connector_cmp(
+      static_cast<const grpc_channel_security_connector*>(other_sc));
+}
+
+RefCountedPtr<grpc_auth_context>
+InsecureChannelSecurityConnector::MakeAuthContext() {
+  auto ctx = MakeRefCounted<grpc_auth_context>(nullptr);
+  grpc_auth_context_add_cstring_property(
+      ctx.get(), GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
+      kInsecureTransportSecurityType);
+  GPR_ASSERT(grpc_auth_context_set_peer_identity_property_name(
+                 ctx.get(), GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME) == 1);
+  const char* security_level = tsi_security_level_to_string(TSI_SECURITY_NONE);
+  grpc_auth_context_add_property(ctx.get(),
+                                 GRPC_TRANSPORT_SECURITY_LEVEL_PROPERTY_NAME,
+                                 security_level, strlen(security_level));
+  return ctx;
+}
+
+}  // namespace grpc_core
diff --git a/src/core/lib/security/security_connector/insecure/insecure_security_connector.h b/src/core/lib/security/security_connector/insecure/insecure_security_connector.h
new file mode 100644 (file)
index 0000000..5dd640c
--- /dev/null
@@ -0,0 +1,70 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#ifndef GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_INSECURE_INSECURE_SECURITY_CONNECTOR_H
+#define GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_INSECURE_INSECURE_SECURITY_CONNECTOR_H
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/security/context/security_context.h"
+#include "src/core/lib/security/credentials/credentials.h"
+#include "src/core/lib/security/security_connector/security_connector.h"
+
+namespace grpc_core {
+
+extern const char kInsecureTransportSecurityType[];
+
+class InsecureChannelSecurityConnector
+    : public grpc_channel_security_connector {
+ public:
+  InsecureChannelSecurityConnector(
+      grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
+      grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds)
+      : grpc_channel_security_connector(/* url_scheme */ nullptr,
+                                        std::move(channel_creds),
+                                        std::move(request_metadata_creds)) {}
+
+  bool check_call_host(absl::string_view host, grpc_auth_context* auth_context,
+                       grpc_closure* on_call_host_checked,
+                       grpc_error** error) override;
+
+  void cancel_check_call_host(grpc_closure* on_call_host_checked,
+                              grpc_error* error) override;
+
+  void add_handshakers(const grpc_channel_args* args,
+                       grpc_pollset_set* /* interested_parties */,
+                       grpc_core::HandshakeManager* handshake_manager) override;
+
+  void check_peer(tsi_peer peer, grpc_endpoint* ep,
+                  grpc_core::RefCountedPtr<grpc_auth_context>* auth_context,
+                  grpc_closure* on_peer_checked) override;
+
+  int cmp(const grpc_security_connector* other_sc) const override;
+
+  // Exposed for testing purposes only.
+  // Create an auth context which is necessary to pass the santiy check in
+  // client_auth_filter that verifies if the peer's auth context is obtained
+  // during handshakes. The auth context is only checked for its existence and
+  // not actually used.
+  static RefCountedPtr<grpc_auth_context> MakeAuthContext();
+};
+
+}  // namespace grpc_core
+
+#endif /* GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_INSECURE_INSECURE_SECURITY_CONNECTOR_H \
+        */
index 5fdec15..c6b4451 100644 (file)
 #ifndef GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_LOAD_SYSTEM_ROOTS_H
 #define GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_LOAD_SYSTEM_ROOTS_H
 
+#include <grpc/support/port_platform.h>
+
+#include <grpc/slice.h>
+
 namespace grpc_core {
 
 // Returns a slice containing roots from the OS trust store
index 585c170..3313fd0 100644 (file)
@@ -157,7 +157,7 @@ class grpc_local_channel_security_connector final
       const grpc_channel_args* args, grpc_pollset_set* /*interested_parties*/,
       grpc_core::HandshakeManager* handshake_manager) override {
     tsi_handshaker* handshaker = nullptr;
-    GPR_ASSERT(local_tsi_handshaker_create(true /* is_client */, &handshaker) ==
+    GPR_ASSERT(tsi_local_handshaker_create(true /* is_client */, &handshaker) ==
                TSI_OK);
     handshake_manager->Add(
         grpc_core::SecurityHandshakerCreate(handshaker, this, args));
@@ -215,7 +215,7 @@ class grpc_local_server_security_connector final
       const grpc_channel_args* args, grpc_pollset_set* /*interested_parties*/,
       grpc_core::HandshakeManager* handshake_manager) override {
     tsi_handshaker* handshaker = nullptr;
-    GPR_ASSERT(local_tsi_handshaker_create(false /* is_client */,
+    GPR_ASSERT(tsi_local_handshaker_create(false /* is_client */,
                                            &handshaker) == TSI_OK);
     handshake_manager->Add(
         grpc_core::SecurityHandshakerCreate(handshaker, this, args));
index 0400ad6..b3825fe 100644 (file)
@@ -109,7 +109,7 @@ grpc_arg grpc_security_connector_to_arg(grpc_security_connector* sc) {
 }
 
 grpc_security_connector* grpc_security_connector_from_arg(const grpc_arg* arg) {
-  if (strcmp(arg->key, GRPC_ARG_SECURITY_CONNECTOR)) return nullptr;
+  if (strcmp(arg->key, GRPC_ARG_SECURITY_CONNECTOR) != 0) return nullptr;
   if (arg->type != GRPC_ARG_POINTER) {
     gpr_log(GPR_ERROR, "Invalid type %d for arg %s", arg->type,
             GRPC_ARG_SECURITY_CONNECTOR);
index 2ddd9db..204b695 100644 (file)
@@ -49,9 +49,11 @@ class grpc_security_connector
  public:
   explicit grpc_security_connector(const char* url_scheme)
       : grpc_core::RefCounted<grpc_security_connector>(
-            &grpc_trace_security_connector_refcount),
+            GRPC_TRACE_FLAG_ENABLED(grpc_trace_security_connector_refcount)
+                ? "security_connector_refcount"
+                : nullptr),
         url_scheme_(url_scheme) {}
-  virtual ~grpc_security_connector() = default;
+  ~grpc_security_connector() override = default;
 
   /* Check the peer. Callee takes ownership of the peer object.
      When done, sets *auth_context and invokes on_peer_checked. */
index 1fce747..d54cdee 100644 (file)
@@ -154,11 +154,11 @@ class PemKeyCertPair {
   }
 
   // Movable.
-  PemKeyCertPair(PemKeyCertPair&& other) {
+  PemKeyCertPair(PemKeyCertPair&& other) noexcept {
     private_key_ = std::move(other.private_key_);
     cert_chain_ = std::move(other.cert_chain_);
   }
-  PemKeyCertPair& operator=(PemKeyCertPair&& other) {
+  PemKeyCertPair& operator=(PemKeyCertPair&& other) noexcept {
     private_key_ = std::move(other.private_key_);
     cert_chain_ = std::move(other.cert_chain_);
     return *this;
@@ -187,6 +187,8 @@ class PemKeyCertPair {
   grpc_core::UniquePtr<char> cert_chain_;
 };
 
+typedef absl::InlinedVector<grpc_core::PemKeyCertPair, 1> PemKeyCertPairList;
+
 }  // namespace grpc_core
 
 #endif /* GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_SSL_UTILS_H \
index 3b97e1f..05f50b4 100644 (file)
@@ -46,7 +46,7 @@ namespace grpc_core {
 namespace {
 
 tsi_ssl_pem_key_cert_pair* ConvertToTsiPemKeyCertPair(
-    const grpc_tls_key_materials_config::PemKeyCertPairList& cert_pair_list) {
+    const grpc_core::PemKeyCertPairList& cert_pair_list) {
   tsi_ssl_pem_key_cert_pair* tsi_pairs = nullptr;
   size_t num_key_cert_pairs = cert_pair_list.size();
   if (num_key_cert_pairs > 0) {
@@ -65,127 +65,120 @@ tsi_ssl_pem_key_cert_pair* ConvertToTsiPemKeyCertPair(
 
 }  // namespace
 
-grpc_status_code TlsFetchKeyMaterials(
-    const grpc_core::RefCountedPtr<grpc_tls_key_materials_config>&
-        key_materials_config,
-    const grpc_tls_credentials_options& options, bool is_server,
-    grpc_ssl_certificate_config_reload_status* status) {
-  GPR_ASSERT(key_materials_config != nullptr);
-  GPR_ASSERT(status != nullptr);
-  bool is_key_materials_empty =
-      key_materials_config->pem_key_cert_pair_list().empty();
-  grpc_tls_credential_reload_config* credential_reload_config =
-      options.credential_reload_config();
-  /** If there are no key materials and no credential reload config and the
-   *  caller is a server, then return an error. We do not require that a client
-   *  always provision certificates. **/
-  if (credential_reload_config == nullptr && is_key_materials_empty &&
-      is_server) {
+// -------------------channel security connector-------------------
+grpc_core::RefCountedPtr<grpc_channel_security_connector>
+TlsChannelSecurityConnector::CreateTlsChannelSecurityConnector(
+    grpc_core::RefCountedPtr<grpc_channel_credentials> ch_creds,
+    grpc_core::RefCountedPtr<grpc_tls_credentials_options> options,
+    grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
+    const char* target_name, const char* overridden_target_name,
+    tsi_ssl_session_cache* ssl_session_cache) {
+  if (ch_creds == nullptr) {
     gpr_log(GPR_ERROR,
-            "Either credential reload config or key materials should be "
-            "provisioned.");
-    return GRPC_STATUS_FAILED_PRECONDITION;
-  }
-  grpc_status_code reload_status = GRPC_STATUS_OK;
-  /** Use |credential_reload_config| to update |key_materials_config|. **/
-  if (credential_reload_config != nullptr) {
-    grpc_tls_credential_reload_arg* arg = new grpc_tls_credential_reload_arg();
-    arg->key_materials_config = key_materials_config.get();
-    arg->error_details = new grpc_tls_error_details();
-    int result = credential_reload_config->Schedule(arg);
-    if (result) {
-      /** Credential reloading is performed async. This is not yet supported.
-       * **/
-      gpr_log(GPR_ERROR, "Async credential reload is unsupported now.");
-      *status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-      reload_status =
-          is_key_materials_empty ? GRPC_STATUS_UNIMPLEMENTED : GRPC_STATUS_OK;
-    } else {
-      /** Credential reloading is performed sync. **/
-      *status = arg->status;
-      if (arg->status == GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED) {
-        /* Key materials is not empty. */
-        gpr_log(GPR_DEBUG, "Credential does not change after reload.");
-      } else if (arg->status == GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL) {
-        gpr_log(GPR_ERROR, "Credential reload failed with an error:");
-        if (arg->error_details != nullptr) {
-          gpr_log(GPR_ERROR, "%s", arg->error_details->error_details().c_str());
-        }
-        reload_status =
-            is_key_materials_empty ? GRPC_STATUS_INTERNAL : GRPC_STATUS_OK;
-      }
-    }
-    delete arg->error_details;
-    /** If the credential reload config was constructed via a wrapped language,
-     *  then |arg->context| and |arg->destroy_context| will not be nullptr. In
-     *  this case, we must destroy |arg->context|, which stores the wrapped
-     *  language-version of the credential reload arg. **/
-    if (arg->destroy_context != nullptr) {
-      arg->destroy_context(arg->context);
-    }
-    delete arg;
+            "channel_creds is nullptr in "
+            "TlsChannelSecurityConnectorCreate()");
+    return nullptr;
   }
-  return reload_status;
-}
-
-grpc_error* TlsCheckHostName(const char* peer_name, const tsi_peer* peer) {
-  /* Check the peer name if specified. */
-  if (peer_name != nullptr && !grpc_ssl_host_matches_name(peer, peer_name)) {
-    return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
-        absl::StrCat("Peer name ", peer_name, " is not in peer certificate")
-            .c_str());
+  if (options == nullptr) {
+    gpr_log(GPR_ERROR,
+            "options is nullptr in "
+            "TlsChannelSecurityConnectorCreate()");
+    return nullptr;
   }
-  return GRPC_ERROR_NONE;
+  if (target_name == nullptr) {
+    gpr_log(GPR_ERROR,
+            "target_name is nullptr in "
+            "TlsChannelSecurityConnectorCreate()");
+    return nullptr;
+  }
+  grpc_core::RefCountedPtr<TlsChannelSecurityConnector> c =
+      grpc_core::MakeRefCounted<TlsChannelSecurityConnector>(
+          std::move(ch_creds), std::move(options),
+          std::move(request_metadata_creds), target_name,
+          overridden_target_name, ssl_session_cache);
+  return c;
 }
 
 TlsChannelSecurityConnector::TlsChannelSecurityConnector(
-    grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
+    grpc_core::RefCountedPtr<grpc_channel_credentials> ch_creds,
+    grpc_core::RefCountedPtr<grpc_tls_credentials_options> options,
     grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
-    const char* target_name, const char* overridden_target_name)
-    : grpc_channel_security_connector(GRPC_SSL_URL_SCHEME,
-                                      std::move(channel_creds),
+    const char* target_name, const char* overridden_target_name,
+    tsi_ssl_session_cache* ssl_session_cache)
+    : grpc_channel_security_connector(GRPC_SSL_URL_SCHEME, std::move(ch_creds),
                                       std::move(request_metadata_creds)),
+      options_(std::move(options)),
       overridden_target_name_(
-          overridden_target_name == nullptr ? "" : overridden_target_name) {
-  key_materials_config_ = grpc_tls_key_materials_config_create()->Ref();
+          overridden_target_name == nullptr ? "" : overridden_target_name),
+      ssl_session_cache_(ssl_session_cache) {
+  if (ssl_session_cache_ != nullptr) {
+    tsi_ssl_session_cache_ref(ssl_session_cache_);
+  }
   check_arg_ = ServerAuthorizationCheckArgCreate(this);
   absl::string_view host;
   absl::string_view port;
   grpc_core::SplitHostPort(target_name, &host, &port);
   target_name_ = std::string(host);
+  // Create a watcher.
+  auto watcher_ptr = absl::make_unique<TlsChannelCertificateWatcher>(this);
+  certificate_watcher_ = watcher_ptr.get();
+  // Register the watcher with the distributor.
+  grpc_tls_certificate_distributor* distributor =
+      options_->certificate_distributor();
+  absl::optional<std::string> watched_root_cert_name;
+  if (options_->watch_root_cert()) {
+    watched_root_cert_name = options_->root_cert_name();
+  }
+  absl::optional<std::string> watched_identity_cert_name;
+  if (options_->watch_identity_pair()) {
+    watched_identity_cert_name = options_->identity_cert_name();
+  }
+  distributor->WatchTlsCertificates(std::move(watcher_ptr),
+                                    watched_root_cert_name,
+                                    watched_identity_cert_name);
 }
 
 TlsChannelSecurityConnector::~TlsChannelSecurityConnector() {
+  if (ssl_session_cache_ != nullptr) {
+    tsi_ssl_session_cache_unref(ssl_session_cache_);
+  }
+  // Cancel all the watchers.
+  grpc_tls_certificate_distributor* distributor =
+      options_->certificate_distributor();
+  distributor->CancelTlsCertificatesWatch(certificate_watcher_);
   if (client_handshaker_factory_ != nullptr) {
     tsi_ssl_client_handshaker_factory_unref(client_handshaker_factory_);
   }
-  if (key_materials_config_.get() != nullptr) {
-    key_materials_config_.get()->Unref();
+  if (check_arg_ != nullptr) {
+    ServerAuthorizationCheckArgDestroy(check_arg_);
   }
-  ServerAuthorizationCheckArgDestroy(check_arg_);
 }
 
 void TlsChannelSecurityConnector::add_handshakers(
     const grpc_channel_args* args, grpc_pollset_set* /*interested_parties*/,
     grpc_core::HandshakeManager* handshake_mgr) {
-  if (RefreshHandshakerFactory() != GRPC_SECURITY_OK) {
-    gpr_log(GPR_ERROR, "Handshaker factory refresh failed.");
-    return;
-  }
-  // Instantiate TSI handshaker.
-  tsi_handshaker* tsi_hs = nullptr;
-  tsi_result result = tsi_ssl_client_handshaker_factory_create_handshaker(
-      client_handshaker_factory_,
-      overridden_target_name_.empty() ? target_name_.c_str()
-                                      : overridden_target_name_.c_str(),
-      &tsi_hs);
-  if (result != TSI_OK) {
-    gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
-            tsi_result_to_string(result));
+  grpc_core::MutexLock lock(&mu_);
+  if (client_handshaker_factory_ != nullptr) {
+    // Instantiate TSI handshaker.
+    tsi_handshaker* tsi_hs = nullptr;
+    tsi_result result = tsi_ssl_client_handshaker_factory_create_handshaker(
+        client_handshaker_factory_,
+        overridden_target_name_.empty() ? target_name_.c_str()
+                                        : overridden_target_name_.c_str(),
+        &tsi_hs);
+    if (result != TSI_OK) {
+      gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
+              tsi_result_to_string(result));
+      return;
+    }
+    // Create handshakers.
+    handshake_mgr->Add(grpc_core::SecurityHandshakerCreate(tsi_hs, this, args));
     return;
   }
-  // Create handshakers.
-  handshake_mgr->Add(grpc_core::SecurityHandshakerCreate(tsi_hs, this, args));
+  // TODO(ZhenLian): Implement the logic(delegation to
+  // BlockOnInitialCredentialHandshaker) when certificates are not ready.
+  gpr_log(GPR_ERROR, "%s not supported yet.",
+          "Client BlockOnInitialCredentialHandshaker");
 }
 
 void TlsChannelSecurityConnector::check_peer(
@@ -203,12 +196,9 @@ void TlsChannelSecurityConnector::check_peer(
   }
   *auth_context =
       grpc_ssl_peer_to_auth_context(&peer, GRPC_TLS_TRANSPORT_SECURITY_TYPE);
-  const TlsCredentials* creds =
-      static_cast<const TlsCredentials*>(channel_creds());
-  if (creds->options().server_verification_option() ==
-      GRPC_TLS_SERVER_VERIFICATION) {
+  if (options_->server_verification_option() == GRPC_TLS_SERVER_VERIFICATION) {
     /* Do the default host name check if specifying the target name. */
-    error = TlsCheckHostName(target_name, &peer);
+    error = internal::TlsCheckHostName(target_name, &peer);
     if (error != GRPC_ERROR_NONE) {
       grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_peer_checked, error);
       tsi_peer_destruct(&peer);
@@ -217,7 +207,7 @@ void TlsChannelSecurityConnector::check_peer(
   }
   /* Do the custom server authorization check, if specified by the user. */
   const grpc_tls_server_authorization_check_config* config =
-      creds->options().server_authorization_check_config();
+      options_->server_authorization_check_config();
   /* If server authorization config is not null, use it to perform
    * server authorization check. */
   if (config != nullptr) {
@@ -289,105 +279,86 @@ void TlsChannelSecurityConnector::cancel_check_call_host(
   GRPC_ERROR_UNREF(error);
 }
 
-grpc_core::RefCountedPtr<grpc_channel_security_connector>
-TlsChannelSecurityConnector::CreateTlsChannelSecurityConnector(
-    grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
-    grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
-    const char* target_name, const char* overridden_target_name,
-    tsi_ssl_session_cache* ssl_session_cache) {
-  if (channel_creds == nullptr) {
-    gpr_log(GPR_ERROR,
-            "channel_creds is nullptr in "
-            "TlsChannelSecurityConnectorCreate()");
-    return nullptr;
+void TlsChannelSecurityConnector::TlsChannelCertificateWatcher::
+    OnCertificatesChanged(
+        absl::optional<absl::string_view> root_certs,
+        absl::optional<grpc_core::PemKeyCertPairList> key_cert_pairs) {
+  GPR_ASSERT(security_connector_ != nullptr);
+  grpc_core::MutexLock lock(&security_connector_->mu_);
+  if (root_certs.has_value()) {
+    security_connector_->pem_root_certs_ = root_certs;
+  }
+  if (key_cert_pairs.has_value()) {
+    security_connector_->pem_key_cert_pair_list_ = std::move(key_cert_pairs);
+  }
+  bool root_being_watched = security_connector_->options_->watch_root_cert();
+  bool root_has_value = security_connector_->pem_root_certs_.has_value();
+  bool identity_being_watched =
+      security_connector_->options_->watch_identity_pair();
+  bool identity_has_value =
+      security_connector_->pem_key_cert_pair_list_.has_value();
+  if ((root_being_watched && root_has_value && identity_being_watched &&
+       identity_has_value) ||
+      (root_being_watched && root_has_value && !identity_being_watched) ||
+      (!root_being_watched && identity_being_watched && identity_has_value)) {
+    if (security_connector_->UpdateHandshakerFactoryLocked() !=
+        GRPC_SECURITY_OK) {
+      gpr_log(GPR_ERROR, "Update handshaker factory failed.");
+    }
   }
-  if (target_name == nullptr) {
+}
+
+// TODO(ZhenLian): implement the logic to signal waiting handshakers once
+// BlockOnInitialCredentialHandshaker is implemented.
+void TlsChannelSecurityConnector::TlsChannelCertificateWatcher::OnError(
+    grpc_error* root_cert_error, grpc_error* identity_cert_error) {
+  if (root_cert_error != GRPC_ERROR_NONE) {
     gpr_log(GPR_ERROR,
-            "target_name is nullptr in "
-            "TlsChannelSecurityConnectorCreate()");
-    return nullptr;
+            "TlsChannelCertificateWatcher getting root_cert_error: %s",
+            grpc_error_string(root_cert_error));
   }
-  grpc_core::RefCountedPtr<TlsChannelSecurityConnector> c =
-      grpc_core::MakeRefCounted<TlsChannelSecurityConnector>(
-          std::move(channel_creds), std::move(request_metadata_creds),
-          target_name, overridden_target_name);
-  if (c->InitializeHandshakerFactory(ssl_session_cache) != GRPC_SECURITY_OK) {
-    gpr_log(GPR_ERROR, "Could not initialize client handshaker factory.");
-    return nullptr;
+  if (identity_cert_error != GRPC_ERROR_NONE) {
+    gpr_log(GPR_ERROR,
+            "TlsChannelCertificateWatcher getting identity_cert_error: %s",
+            grpc_error_string(identity_cert_error));
   }
-  return c;
+  GRPC_ERROR_UNREF(root_cert_error);
+  GRPC_ERROR_UNREF(identity_cert_error);
 }
 
-grpc_security_status TlsChannelSecurityConnector::ReplaceHandshakerFactory(
-    tsi_ssl_session_cache* ssl_session_cache) {
-  const TlsCredentials* creds =
-      static_cast<const TlsCredentials*>(channel_creds());
+// TODO(ZhenLian): implement the logic to signal waiting handshakers once
+// BlockOnInitialCredentialHandshaker is implemented.
+grpc_security_status
+TlsChannelSecurityConnector::UpdateHandshakerFactoryLocked() {
   bool skip_server_certificate_verification =
-      creds->options().server_verification_option() ==
+      options_->server_verification_option() ==
       GRPC_TLS_SKIP_ALL_SERVER_VERIFICATION;
   /* Free the client handshaker factory if exists. */
-  if (client_handshaker_factory_) {
+  if (client_handshaker_factory_ != nullptr) {
     tsi_ssl_client_handshaker_factory_unref(client_handshaker_factory_);
   }
-  tsi_ssl_pem_key_cert_pair* pem_key_cert_pair = ConvertToTsiPemKeyCertPair(
-      key_materials_config_->pem_key_cert_pair_list());
+  std::string pem_root_certs;
+  if (pem_root_certs_.has_value()) {
+    // TODO(ZhenLian): update the underlying TSI layer to use C++ types like
+    // std::string and absl::string_view to avoid making another copy here.
+    pem_root_certs = std::string(*pem_root_certs_);
+  }
+  tsi_ssl_pem_key_cert_pair* pem_key_cert_pair = nullptr;
+  if (pem_key_cert_pair_list_.has_value()) {
+    pem_key_cert_pair = ConvertToTsiPemKeyCertPair(*pem_key_cert_pair_list_);
+  }
   grpc_security_status status = grpc_ssl_tsi_client_handshaker_factory_init(
-      pem_key_cert_pair, key_materials_config_->pem_root_certs(),
+      pem_key_cert_pair,
+      pem_root_certs.empty() ? nullptr : pem_root_certs.c_str(),
       skip_server_certificate_verification,
-      grpc_get_tsi_tls_version(creds->options().min_tls_version()),
-      grpc_get_tsi_tls_version(creds->options().max_tls_version()),
-      ssl_session_cache, &client_handshaker_factory_);
+      grpc_get_tsi_tls_version(options_->min_tls_version()),
+      grpc_get_tsi_tls_version(options_->max_tls_version()), ssl_session_cache_,
+      &client_handshaker_factory_);
   /* Free memory. */
-  grpc_tsi_ssl_pem_key_cert_pairs_destroy(pem_key_cert_pair, 1);
-  return status;
-}
-
-grpc_security_status TlsChannelSecurityConnector::InitializeHandshakerFactory(
-    tsi_ssl_session_cache* ssl_session_cache) {
-  grpc_core::MutexLock lock(&mu_);
-  const TlsCredentials* creds =
-      static_cast<const TlsCredentials*>(channel_creds());
-  grpc_tls_key_materials_config* key_materials_config =
-      creds->options().key_materials_config();
-  // key_materials_config_->set_key_materials will handle the copying of the key
-  // materials users provided
-  if (key_materials_config != nullptr) {
-    key_materials_config_->set_key_materials(
-        key_materials_config->pem_root_certs(),
-        key_materials_config->pem_key_cert_pair_list());
-  }
-  grpc_ssl_certificate_config_reload_status reload_status =
-      GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-  /** If |creds->options()| has a credential reload config, then the call to
-   *  |TlsFetchKeyMaterials| will use it to update the root cert and
-   *  pem-key-cert-pair list stored in |key_materials_config_|. **/
-  if (TlsFetchKeyMaterials(key_materials_config_, creds->options(), false,
-                           &reload_status) != GRPC_STATUS_OK) {
-    /* Raise an error if key materials are not populated. */
-    return GRPC_SECURITY_ERROR;
-  }
-  return ReplaceHandshakerFactory(ssl_session_cache);
-}
-
-grpc_security_status TlsChannelSecurityConnector::RefreshHandshakerFactory() {
-  grpc_core::MutexLock lock(&mu_);
-  const TlsCredentials* creds =
-      static_cast<const TlsCredentials*>(channel_creds());
-  grpc_ssl_certificate_config_reload_status reload_status =
-      GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-  /** If |creds->options()| has a credential reload config, then the call to
-   *  |TlsFetchKeyMaterials| will use it to update the root cert and
-   *  pem-key-cert-pair list stored in |key_materials_config_|. **/
-  if (TlsFetchKeyMaterials(key_materials_config_, creds->options(), false,
-                           &reload_status) != GRPC_STATUS_OK) {
-    return GRPC_SECURITY_ERROR;
-  }
-  if (reload_status != GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW) {
-    // Re-use existing handshaker factory.
-    return GRPC_SECURITY_OK;
-  } else {
-    return ReplaceHandshakerFactory(nullptr);
+  if (pem_key_cert_pair != nullptr) {
+    grpc_tsi_ssl_pem_key_cert_pairs_destroy(pem_key_cert_pair, 1);
   }
+  return status;
 }
 
 void TlsChannelSecurityConnector::ServerAuthorizationCheckDone(
@@ -457,40 +428,86 @@ void TlsChannelSecurityConnector::ServerAuthorizationCheckArgDestroy(
   delete arg;
 }
 
+// -------------------server security connector-------------------
+grpc_core::RefCountedPtr<grpc_server_security_connector>
+TlsServerSecurityConnector::CreateTlsServerSecurityConnector(
+    grpc_core::RefCountedPtr<grpc_server_credentials> server_creds,
+    grpc_core::RefCountedPtr<grpc_tls_credentials_options> options) {
+  if (server_creds == nullptr) {
+    gpr_log(GPR_ERROR,
+            "server_creds is nullptr in "
+            "TlsServerSecurityConnectorCreate()");
+    return nullptr;
+  }
+  if (options == nullptr) {
+    gpr_log(GPR_ERROR,
+            "options is nullptr in "
+            "TlsServerSecurityConnectorCreate()");
+    return nullptr;
+  }
+  grpc_core::RefCountedPtr<TlsServerSecurityConnector> c =
+      grpc_core::MakeRefCounted<TlsServerSecurityConnector>(
+          std::move(server_creds), std::move(options));
+  return c;
+}
+
 TlsServerSecurityConnector::TlsServerSecurityConnector(
-    grpc_core::RefCountedPtr<grpc_server_credentials> server_creds)
+    grpc_core::RefCountedPtr<grpc_server_credentials> server_creds,
+    grpc_core::RefCountedPtr<grpc_tls_credentials_options> options)
     : grpc_server_security_connector(GRPC_SSL_URL_SCHEME,
-                                     std::move(server_creds)) {
-  key_materials_config_ = grpc_tls_key_materials_config_create()->Ref();
+                                     std::move(server_creds)),
+      options_(std::move(options)) {
+  // Create a watcher.
+  auto watcher_ptr = absl::make_unique<TlsServerCertificateWatcher>(this);
+  certificate_watcher_ = watcher_ptr.get();
+  // Register the watcher with the distributor.
+  grpc_tls_certificate_distributor* distributor =
+      options_->certificate_distributor();
+  absl::optional<std::string> watched_root_cert_name;
+  if (options_->watch_root_cert()) {
+    watched_root_cert_name = options_->root_cert_name();
+  }
+  absl::optional<std::string> watched_identity_cert_name;
+  if (options_->watch_identity_pair()) {
+    watched_identity_cert_name = options_->identity_cert_name();
+  }
+  distributor->WatchTlsCertificates(std::move(watcher_ptr),
+                                    watched_root_cert_name,
+                                    watched_identity_cert_name);
 }
 
 TlsServerSecurityConnector::~TlsServerSecurityConnector() {
+  // Cancel all the watchers.
+  grpc_tls_certificate_distributor* distributor =
+      options_->certificate_distributor();
+  distributor->CancelTlsCertificatesWatch(certificate_watcher_);
   if (server_handshaker_factory_ != nullptr) {
     tsi_ssl_server_handshaker_factory_unref(server_handshaker_factory_);
   }
-  if (key_materials_config_.get() != nullptr) {
-    key_materials_config_.get()->Unref();
-  }
 }
 
 void TlsServerSecurityConnector::add_handshakers(
     const grpc_channel_args* args, grpc_pollset_set* /*interested_parties*/,
     grpc_core::HandshakeManager* handshake_mgr) {
-  /* Refresh handshaker factory if needed. */
-  if (RefreshHandshakerFactory() != GRPC_SECURITY_OK) {
-    gpr_log(GPR_ERROR, "Handshaker factory refresh failed.");
-    return;
-  }
-  /* Create a TLS TSI handshaker for server. */
-  tsi_handshaker* tsi_hs = nullptr;
-  tsi_result result = tsi_ssl_server_handshaker_factory_create_handshaker(
-      server_handshaker_factory_, &tsi_hs);
-  if (result != TSI_OK) {
-    gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
-            tsi_result_to_string(result));
+  grpc_core::MutexLock lock(&mu_);
+  if (server_handshaker_factory_ != nullptr) {
+    // Instantiate TSI handshaker.
+    tsi_handshaker* tsi_hs = nullptr;
+    tsi_result result = tsi_ssl_server_handshaker_factory_create_handshaker(
+        server_handshaker_factory_, &tsi_hs);
+    if (result != TSI_OK) {
+      gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
+              tsi_result_to_string(result));
+      return;
+    }
+    // Create handshakers.
+    handshake_mgr->Add(grpc_core::SecurityHandshakerCreate(tsi_hs, this, args));
     return;
   }
-  handshake_mgr->Add(grpc_core::SecurityHandshakerCreate(tsi_hs, this, args));
+  // TODO(ZhenLian): Implement the logic(delegation to
+  // BlockOnInitialCredentialHandshaker) when certificates are not ready.
+  gpr_log(GPR_ERROR, "%s not supported yet.",
+          "Server BlockOnInitialCredentialHandshaker");
 }
 
 void TlsServerSecurityConnector::check_peer(
@@ -510,43 +527,79 @@ int TlsServerSecurityConnector::cmp(
       static_cast<const grpc_server_security_connector*>(other));
 }
 
-grpc_core::RefCountedPtr<grpc_server_security_connector>
-TlsServerSecurityConnector::CreateTlsServerSecurityConnector(
-    grpc_core::RefCountedPtr<grpc_server_credentials> server_creds) {
-  if (server_creds == nullptr) {
+void TlsServerSecurityConnector::TlsServerCertificateWatcher::
+    OnCertificatesChanged(
+        absl::optional<absl::string_view> root_certs,
+        absl::optional<grpc_core::PemKeyCertPairList> key_cert_pairs) {
+  GPR_ASSERT(security_connector_ != nullptr);
+  grpc_core::MutexLock lock(&security_connector_->mu_);
+  if (root_certs.has_value()) {
+    security_connector_->pem_root_certs_ = root_certs;
+  }
+  if (key_cert_pairs.has_value()) {
+    security_connector_->pem_key_cert_pair_list_ = std::move(key_cert_pairs);
+  }
+  bool root_being_watched = security_connector_->options_->watch_root_cert();
+  bool root_has_value = security_connector_->pem_root_certs_.has_value();
+  bool identity_being_watched =
+      security_connector_->options_->watch_identity_pair();
+  bool identity_has_value =
+      security_connector_->pem_key_cert_pair_list_.has_value();
+  if ((root_being_watched && root_has_value && identity_being_watched &&
+       identity_has_value) ||
+      (root_being_watched && root_has_value && !identity_being_watched) ||
+      (!root_being_watched && identity_being_watched && identity_has_value)) {
+    if (security_connector_->UpdateHandshakerFactoryLocked() !=
+        GRPC_SECURITY_OK) {
+      gpr_log(GPR_ERROR, "Update handshaker factory failed.");
+    }
+  }
+}
+
+// TODO(ZhenLian): implement the logic to signal waiting handshakers once
+// BlockOnInitialCredentialHandshaker is implemented.
+void TlsServerSecurityConnector::TlsServerCertificateWatcher::OnError(
+    grpc_error* root_cert_error, grpc_error* identity_cert_error) {
+  if (root_cert_error != GRPC_ERROR_NONE) {
     gpr_log(GPR_ERROR,
-            "server_creds is nullptr in "
-            "TlsServerSecurityConnectorCreate()");
-    return nullptr;
+            "TlsServerCertificateWatcher getting root_cert_error: %s",
+            grpc_error_string(root_cert_error));
   }
-  grpc_core::RefCountedPtr<TlsServerSecurityConnector> c =
-      grpc_core::MakeRefCounted<TlsServerSecurityConnector>(
-          std::move(server_creds));
-  if (c->InitializeHandshakerFactory() != GRPC_SECURITY_OK) {
-    gpr_log(GPR_ERROR, "Could not initialize server handshaker factory.");
-    return nullptr;
+  if (identity_cert_error != GRPC_ERROR_NONE) {
+    gpr_log(GPR_ERROR,
+            "TlsServerCertificateWatcher getting identity_cert_error: %s",
+            grpc_error_string(identity_cert_error));
   }
-  return c;
+  GRPC_ERROR_UNREF(root_cert_error);
+  GRPC_ERROR_UNREF(identity_cert_error);
 }
 
-grpc_security_status TlsServerSecurityConnector::ReplaceHandshakerFactory() {
-  const TlsServerCredentials* creds =
-      static_cast<const TlsServerCredentials*>(server_creds());
+// TODO(ZhenLian): implement the logic to signal waiting handshakers once
+// BlockOnInitialCredentialHandshaker is implemented.
+grpc_security_status
+TlsServerSecurityConnector::UpdateHandshakerFactoryLocked() {
   /* Free the server handshaker factory if exists. */
-  if (server_handshaker_factory_) {
+  if (server_handshaker_factory_ != nullptr) {
     tsi_ssl_server_handshaker_factory_unref(server_handshaker_factory_);
   }
-  GPR_ASSERT(!key_materials_config_->pem_key_cert_pair_list().empty());
-  tsi_ssl_pem_key_cert_pair* pem_key_cert_pairs = ConvertToTsiPemKeyCertPair(
-      key_materials_config_->pem_key_cert_pair_list());
-  size_t num_key_cert_pairs =
-      key_materials_config_->pem_key_cert_pair_list().size();
+  // The identity certs on the server side shouldn't be empty.
+  GPR_ASSERT(pem_key_cert_pair_list_.has_value());
+  GPR_ASSERT(!(*pem_key_cert_pair_list_).empty());
+  std::string pem_root_certs;
+  if (pem_root_certs_.has_value()) {
+    // TODO(ZhenLian): update the underlying TSI layer to use C++ types like
+    // std::string and absl::string_view to avoid making another copy here.
+    pem_root_certs = std::string(*pem_root_certs_);
+  }
+  tsi_ssl_pem_key_cert_pair* pem_key_cert_pairs = nullptr;
+  pem_key_cert_pairs = ConvertToTsiPemKeyCertPair(*pem_key_cert_pair_list_);
+  size_t num_key_cert_pairs = (*pem_key_cert_pair_list_).size();
   grpc_security_status status = grpc_ssl_tsi_server_handshaker_factory_init(
       pem_key_cert_pairs, num_key_cert_pairs,
-      key_materials_config_->pem_root_certs(),
-      creds->options().cert_request_type(),
-      grpc_get_tsi_tls_version(creds->options().min_tls_version()),
-      grpc_get_tsi_tls_version(creds->options().max_tls_version()),
+      pem_root_certs.empty() ? nullptr : pem_root_certs.c_str(),
+      options_->cert_request_type(),
+      grpc_get_tsi_tls_version(options_->min_tls_version()),
+      grpc_get_tsi_tls_version(options_->max_tls_version()),
       &server_handshaker_factory_);
   /* Free memory. */
   grpc_tsi_ssl_pem_key_cert_pairs_destroy(pem_key_cert_pairs,
@@ -554,53 +607,18 @@ grpc_security_status TlsServerSecurityConnector::ReplaceHandshakerFactory() {
   return status;
 }
 
-grpc_security_status TlsServerSecurityConnector::InitializeHandshakerFactory() {
-  grpc_core::MutexLock lock(&mu_);
-  const TlsServerCredentials* creds =
-      static_cast<const TlsServerCredentials*>(server_creds());
-  grpc_tls_key_materials_config* key_materials_config =
-      creds->options().key_materials_config();
-  if (key_materials_config != nullptr) {
-    key_materials_config_->set_key_materials(
-        key_materials_config->pem_root_certs(),
-        key_materials_config->pem_key_cert_pair_list());
-  }
-  grpc_ssl_certificate_config_reload_status reload_status =
-      GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-  /** If |creds->options()| has a credential reload config, then the call to
-   *  |TlsFetchKeyMaterials| will use it to update the root cert and
-   *  pem-key-cert-pair list stored in |key_materials_config_|. Otherwise, it
-   *  will return |GRPC_STATUS_OK| if |key_materials_config_| already has
-   *  credentials, and an error code if not. **/
-  if (TlsFetchKeyMaterials(key_materials_config_, creds->options(), true,
-                           &reload_status) != GRPC_STATUS_OK) {
-    /* Raise an error if key materials are not populated. */
-    return GRPC_SECURITY_ERROR;
-  }
-  return ReplaceHandshakerFactory();
-}
+namespace internal {
 
-grpc_security_status TlsServerSecurityConnector::RefreshHandshakerFactory() {
-  grpc_core::MutexLock lock(&mu_);
-  const TlsServerCredentials* creds =
-      static_cast<const TlsServerCredentials*>(server_creds());
-  grpc_ssl_certificate_config_reload_status reload_status =
-      GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-  /** If |creds->options()| has a credential reload config, then the call to
-   *  |TlsFetchKeyMaterials| will use it to update the root cert and
-   *  pem-key-cert-pair list stored in |key_materials_config_|. Otherwise, it
-   *  will return |GRPC_STATUS_OK| if |key_materials_config_| already has
-   *  credentials, and an error code if not. **/
-  if (TlsFetchKeyMaterials(key_materials_config_, creds->options(), true,
-                           &reload_status) != GRPC_STATUS_OK) {
-    return GRPC_SECURITY_ERROR;
-  }
-  if (reload_status != GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW) {
-    /* At this point, we should have key materials populated. */
-    return GRPC_SECURITY_OK;
-  } else {
-    return ReplaceHandshakerFactory();
+grpc_error* TlsCheckHostName(const char* peer_name, const tsi_peer* peer) {
+  /* Check the peer name if specified. */
+  if (peer_name != nullptr && !grpc_ssl_host_matches_name(peer, peer_name)) {
+    return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+        absl::StrCat("Peer name ", peer_name, " is not in peer certificate")
+            .c_str());
   }
+  return GRPC_ERROR_NONE;
 }
 
+}  // namespace internal
+
 }  // namespace grpc_core
index db5c87b..d915959 100644 (file)
 
 #include "src/core/lib/gprpp/sync.h"
 #include "src/core/lib/security/context/security_context.h"
+#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h"
 #include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h"
 
 #define GRPC_TLS_TRANSPORT_SECURITY_TYPE "tls"
 
 namespace grpc_core {
 
-// TLS channel security connector.
+// Channel security connector using TLS as transport security protocol.
 class TlsChannelSecurityConnector final
     : public grpc_channel_security_connector {
  public:
@@ -37,14 +38,18 @@ class TlsChannelSecurityConnector final
   static grpc_core::RefCountedPtr<grpc_channel_security_connector>
   CreateTlsChannelSecurityConnector(
       grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
+      grpc_core::RefCountedPtr<grpc_tls_credentials_options> options,
       grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
       const char* target_name, const char* overridden_target_name,
       tsi_ssl_session_cache* ssl_session_cache);
 
   TlsChannelSecurityConnector(
       grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
+      grpc_core::RefCountedPtr<grpc_tls_credentials_options> options,
       grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
-      const char* target_name, const char* overridden_target_name);
+      const char* target_name, const char* overridden_target_name,
+      tsi_ssl_session_cache* ssl_session_cache);
+
   ~TlsChannelSecurityConnector() override;
 
   void add_handshakers(const grpc_channel_args* args,
@@ -64,15 +69,45 @@ class TlsChannelSecurityConnector final
   void cancel_check_call_host(grpc_closure* on_call_host_checked,
                               grpc_error* error) override;
 
- private:
-  // Initialize SSL TSI client handshaker factory.
-  grpc_security_status InitializeHandshakerFactory(
-      tsi_ssl_session_cache* ssl_session_cache);
+  tsi_ssl_client_handshaker_factory* ClientHandshakerFactoryForTesting() {
+    grpc_core::MutexLock lock(&mu_);
+    return client_handshaker_factory_;
+  };
 
-  // A util function to create a new client handshaker factory to replace
-  // the existing one if exists.
-  grpc_security_status ReplaceHandshakerFactory(
-      tsi_ssl_session_cache* ssl_session_cache);
+  const absl::optional<absl::string_view>& RootCertsForTesting() {
+    grpc_core::MutexLock lock(&mu_);
+    return pem_root_certs_;
+  }
+
+  const absl::optional<grpc_core::PemKeyCertPairList>&
+  KeyCertPairListForTesting() {
+    grpc_core::MutexLock lock(&mu_);
+    return pem_key_cert_pair_list_;
+  }
+
+ private:
+  // A watcher that watches certificate updates from
+  // grpc_tls_certificate_distributor. It will never outlive
+  // |security_connector_|.
+  class TlsChannelCertificateWatcher : public grpc_tls_certificate_distributor::
+                                           TlsCertificatesWatcherInterface {
+   public:
+    explicit TlsChannelCertificateWatcher(
+        TlsChannelSecurityConnector* security_connector)
+        : security_connector_(security_connector) {}
+    void OnCertificatesChanged(
+        absl::optional<absl::string_view> root_certs,
+        absl::optional<grpc_core::PemKeyCertPairList> key_cert_pairs) override;
+    void OnError(grpc_error* root_cert_error,
+                 grpc_error* identity_cert_error) override;
+
+   private:
+    TlsChannelSecurityConnector* security_connector_ = nullptr;
+  };
+
+  // Updates |client_handshaker_factory_| when the certificates that
+  // |certificate_watcher_| is watching get updated.
+  grpc_security_status UpdateHandshakerFactoryLocked();
 
   // gRPC-provided callback executed by application, which servers to bring the
   // control back to gRPC core.
@@ -91,29 +126,32 @@ class TlsChannelSecurityConnector final
   static void ServerAuthorizationCheckArgDestroy(
       grpc_tls_server_authorization_check_arg* arg);
 
-  // A util function to refresh SSL TSI client handshaker factory with a valid
-  // credential.
-  grpc_security_status RefreshHandshakerFactory();
-
   grpc_core::Mutex mu_;
-  grpc_closure* on_peer_checked_;
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options_;
+  grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
+      certificate_watcher_ = nullptr;
+  grpc_closure* on_peer_checked_ = nullptr;
   std::string target_name_;
   std::string overridden_target_name_;
   tsi_ssl_client_handshaker_factory* client_handshaker_factory_ = nullptr;
-  grpc_tls_server_authorization_check_arg* check_arg_;
-  grpc_core::RefCountedPtr<grpc_tls_key_materials_config> key_materials_config_;
+  grpc_tls_server_authorization_check_arg* check_arg_ = nullptr;
+  tsi_ssl_session_cache* ssl_session_cache_ = nullptr;
+  absl::optional<absl::string_view> pem_root_certs_;
+  absl::optional<grpc_core::PemKeyCertPairList> pem_key_cert_pair_list_;
 };
 
-// TLS server security connector.
+// Server security connector using TLS as transport security protocol.
 class TlsServerSecurityConnector final : public grpc_server_security_connector {
  public:
   // static factory method to create a TLS server security connector.
   static grpc_core::RefCountedPtr<grpc_server_security_connector>
   CreateTlsServerSecurityConnector(
-      grpc_core::RefCountedPtr<grpc_server_credentials> server_creds);
+      grpc_core::RefCountedPtr<grpc_server_credentials> server_creds,
+      grpc_core::RefCountedPtr<grpc_tls_credentials_options> options);
 
-  explicit TlsServerSecurityConnector(
-      grpc_core::RefCountedPtr<grpc_server_credentials> server_creds);
+  TlsServerSecurityConnector(
+      grpc_core::RefCountedPtr<grpc_server_credentials> server_creds,
+      grpc_core::RefCountedPtr<grpc_tls_credentials_options> options);
   ~TlsServerSecurityConnector() override;
 
   void add_handshakers(const grpc_channel_args* args,
@@ -126,58 +164,65 @@ class TlsServerSecurityConnector final : public grpc_server_security_connector {
 
   int cmp(const grpc_security_connector* other) const override;
 
- private:
-  // Initialize SSL TSI server handshaker factory.
-  grpc_security_status InitializeHandshakerFactory();
+  tsi_ssl_server_handshaker_factory* ServerHandshakerFactoryForTesting() {
+    grpc_core::MutexLock lock(&mu_);
+    return server_handshaker_factory_;
+  };
 
-  // A util function to create a new server handshaker factory to replace the
-  // existing once if exists.
-  grpc_security_status ReplaceHandshakerFactory();
+  const absl::optional<absl::string_view>& RootCertsForTesting() {
+    grpc_core::MutexLock lock(&mu_);
+    return pem_root_certs_;
+  }
 
-  // A util function to refresh SSL TSI server handshaker factory with a valid
-  // credential.
-  grpc_security_status RefreshHandshakerFactory();
+  const absl::optional<grpc_core::PemKeyCertPairList>&
+  KeyCertPairListForTesting() {
+    grpc_core::MutexLock lock(&mu_);
+    return pem_key_cert_pair_list_;
+  }
+
+ private:
+  // A watcher that watches certificate updates from
+  // grpc_tls_certificate_distributor. It will never outlive
+  // |security_connector_|.
+  class TlsServerCertificateWatcher : public grpc_tls_certificate_distributor::
+                                          TlsCertificatesWatcherInterface {
+   public:
+    explicit TlsServerCertificateWatcher(
+        TlsServerSecurityConnector* security_connector)
+        : security_connector_(security_connector) {}
+    void OnCertificatesChanged(
+        absl::optional<absl::string_view> root_certs,
+        absl::optional<grpc_core::PemKeyCertPairList> key_cert_pairs) override;
+    void OnError(grpc_error* root_cert_error,
+                 grpc_error* identity_cert_error) override;
+
+   private:
+    TlsServerSecurityConnector* security_connector_ = nullptr;
+  };
+
+  // Updates |server_handshaker_factory_| when the certificates that
+  // |certificate_watcher_| is watching get updated.
+  grpc_security_status UpdateHandshakerFactoryLocked();
 
   grpc_core::Mutex mu_;
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options_;
+  grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
+      certificate_watcher_ = nullptr;
+
   tsi_ssl_server_handshaker_factory* server_handshaker_factory_ = nullptr;
-  grpc_core::RefCountedPtr<grpc_tls_key_materials_config> key_materials_config_;
+  absl::optional<absl::string_view> pem_root_certs_;
+  absl::optional<grpc_core::PemKeyCertPairList> pem_key_cert_pair_list_;
 };
 
 // ---- Functions below are exposed for testing only -----------------------
-
-/** The |TlsFetchKeyMaterials| API ensures that |key_materials_config| has a
- *  non-empty pem-key-cert pair list. This is done as follows:
- *  - if |options| is equipped with a credential reload config, then this
- *    methods uses credential reloading to populate |key_materials_config|, and
- *    afterwards it populates |reload_status| with the status of this operation.
- *    In particular, any data stored in |key_materials_config| is overwritten.
- *  - if |options| has no credential reload config, then:
- *    - if |key_materials_config| already has a non-empty pem-key-cert pair
- *      list or is called by a client, then the method returns |GRPC_STATUS_OK|.
- *    - if |key_materials_config| has an empty pem-key-cert pair list and is
- *      called by a server, then the method return an error code.
- *
- *  The arguments are detailed below:
- *  - key_materials_config: a key materials config that will be populated by the
- *    method on success; the caller should not pass in nullptr. Any data held by
- *    the config will be overwritten.
- *  - options: the TLS credentials options whose credential reloading config
- *    will be used to populate |key_materials_config|.
- *  - is_server: true denotes that this method is called by a server, and
- *    false denotes that this method is called by a client.
- *  - status: the status of the credential reloading after the method
- *    returns; the caller should not pass in nullptr. **/
-grpc_status_code TlsFetchKeyMaterials(
-    const grpc_core::RefCountedPtr<grpc_tls_key_materials_config>&
-        key_materials_config,
-    const grpc_tls_credentials_options& options, bool is_server,
-    grpc_ssl_certificate_config_reload_status* status);
+namespace internal {
 
 // TlsCheckHostName checks if |peer_name| matches the identity information
 // contained in |peer|. This is AKA hostname check.
 grpc_error* TlsCheckHostName(const char* peer_name, const tsi_peer* peer);
 
+}  // namespace internal
+
 }  // namespace grpc_core
 
-#endif /* GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_TLS_TLS_SECURITY_CONNECTOR_H \
-        */
+#endif  // GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_TLS_TLS_SECURITY_CONNECTOR_H
index 4566657..5563d5b 100644 (file)
@@ -499,7 +499,7 @@ class FailHandshaker : public Handshaker {
   }
 
  private:
-  virtual ~FailHandshaker() = default;
+  ~FailHandshaker() override = default;
 };
 
 //
index 6f83a17..6735189 100644 (file)
@@ -123,8 +123,9 @@ static grpc_filtered_mdelem remove_consumed_md(void* user_data,
   for (i = 0; i < calld->num_consumed_md; i++) {
     const grpc_metadata* consumed_md = &calld->consumed_md[i];
     if (grpc_slice_eq(GRPC_MDKEY(md), consumed_md->key) &&
-        grpc_slice_eq(GRPC_MDVALUE(md), consumed_md->value))
+        grpc_slice_eq(GRPC_MDVALUE(md), consumed_md->value)) {
       return GRPC_FILTERED_REMOVE();
+    }
   }
   return GRPC_FILTERED_MDELEM(md);
 }
index 42f7005..cde9ca9 100644 (file)
@@ -30,6 +30,7 @@
 #define GRPC_AUTH_JSON_TYPE_INVALID "invalid"
 #define GRPC_AUTH_JSON_TYPE_SERVICE_ACCOUNT "service_account"
 #define GRPC_AUTH_JSON_TYPE_AUTHORIZED_USER "authorized_user"
+#define GRPC_AUTH_JSON_TYPE_EXTERNAL_ACCOUNT "external_account"
 
 // Gets a child property from a json node.
 const char* grpc_json_get_string_property(const grpc_core::Json& json,
index 0dacbfe..5f7e9ea 100644 (file)
@@ -555,8 +555,9 @@ int grpc_slice_buf_start_eq(grpc_slice a, const void* b, size_t len) {
 int grpc_slice_rchr(grpc_slice s, char c) {
   const char* b = reinterpret_cast<const char*> GRPC_SLICE_START_PTR(s);
   int i;
-  for (i = static_cast<int> GRPC_SLICE_LENGTH(s) - 1; i != -1 && b[i] != c; i--)
-    ;
+  for (i = static_cast<int> GRPC_SLICE_LENGTH(s) - 1; i != -1 && b[i] != c;
+       i--) {
+  }
   return i;
 }
 
@@ -574,10 +575,12 @@ int grpc_slice_slice(grpc_slice haystack, grpc_slice needle) {
 
   if (haystack_len == 0 || needle_len == 0) return -1;
   if (haystack_len < needle_len) return -1;
-  if (haystack_len == needle_len)
+  if (haystack_len == needle_len) {
     return grpc_slice_eq(haystack, needle) ? 0 : -1;
-  if (needle_len == 1)
+  }
+  if (needle_len == 1) {
     return grpc_slice_chr(haystack, static_cast<char>(*needle_bytes));
+  }
 
   const uint8_t* last = haystack_bytes + haystack_len - needle_len;
   for (const uint8_t* cur = haystack_bytes; cur != last; ++cur) {
index 2d66694..ba103d7 100644 (file)
@@ -106,8 +106,9 @@ uint8_t* grpc_slice_buffer_tiny_add(grpc_slice_buffer* sb, size_t n) {
   if (sb->count == 0) goto add_first;
   back = &sb->slices[sb->count - 1];
   if (back->refcount) goto add_new;
-  if ((back->data.inlined.length + n) > sizeof(back->data.inlined.bytes))
+  if ((back->data.inlined.length + n) > sizeof(back->data.inlined.bytes)) {
     goto add_new;
+  }
   out = back->data.inlined.bytes + back->data.inlined.length;
   back->data.inlined.length =
       static_cast<uint8_t>(back->data.inlined.length + n);
index b41628c..bfde30b 100644 (file)
@@ -74,8 +74,8 @@ InternedSliceRefcount::~InternedSliceRefcount() {
   InternedSliceRefcount* cur;
   for (prev_next = &shard->strs[TABLE_IDX(this->hash, shard->capacity)],
       cur = *prev_next;
-       cur != this; prev_next = &cur->bucket_next, cur = cur->bucket_next)
-    ;
+       cur != this; prev_next = &cur->bucket_next, cur = cur->bucket_next) {
+  }
   *prev_next = cur->bucket_next;
   shard->count--;
 }
diff --git a/src/core/lib/slice/slice_traits.h b/src/core/lib/slice/slice_traits.h
deleted file mode 100644 (file)
index 07d13cd..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *
- * Copyright 2016 gRPC authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#ifndef GRPC_CORE_LIB_SLICE_SLICE_TRAITS_H
-#define GRPC_CORE_LIB_SLICE_SLICE_TRAITS_H
-
-#include <grpc/support/port_platform.h>
-
-#include <grpc/slice.h>
-#include <stdbool.h>
-
-bool grpc_slice_is_legal_header(const grpc_slice& s);
-bool grpc_slice_is_legal_nonbin_header(const grpc_slice& s);
-bool grpc_slice_is_bin_suffixed(const grpc_slice& s);
-
-#endif /* GRPC_CORE_LIB_SLICE_SLICE_TRAITS_H */
index becb235..ebbe27c 100644 (file)
@@ -298,8 +298,9 @@ static void post_batch_completion(batch_control* bctl);
 
 static void add_init_error(grpc_error** composite, grpc_error* new_err) {
   if (new_err == GRPC_ERROR_NONE) return;
-  if (*composite == GRPC_ERROR_NONE)
+  if (*composite == GRPC_ERROR_NONE) {
     *composite = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Call creation failed");
+  }
   *composite = grpc_error_add_child(*composite, new_err);
 }
 
@@ -412,7 +413,7 @@ grpc_error* grpc_call_create(const grpc_call_create_args* args,
                                  "without Census tracing propagation"));
     }
     if (args->propagation_mask & GRPC_PROPAGATE_CANCELLATION) {
-      call->cancellation_is_inherited = 1;
+      call->cancellation_is_inherited = true;
       if (gpr_atm_acq_load(&args->parent->received_final_op_atm)) {
         immediately_cancel = true;
       }
@@ -595,7 +596,7 @@ void grpc_call_unref(grpc_call* c) {
   }
 
   GPR_ASSERT(!c->destroy_called);
-  c->destroy_called = 1;
+  c->destroy_called = true;
   bool cancel = gpr_atm_acq_load(&c->any_ops_sent_atm) != 0 &&
                 gpr_atm_acq_load(&c->received_final_op_atm) == 0;
   if (cancel) {
@@ -811,7 +812,7 @@ uint32_t grpc_call_test_only_get_message_flags(grpc_call* call) {
   return flags;
 }
 
-static void destroy_encodings_accepted_by_peer(void* /*p*/) { return; }
+static void destroy_encodings_accepted_by_peer(void* /*p*/) {}
 
 static void set_encodings_accepted_by_peer(grpc_call* /*call*/,
                                            grpc_mdelem mdel,
@@ -1253,7 +1254,7 @@ static void continue_receiving_slices(batch_control* bctl) {
     size_t remaining = call->receiving_stream->length() -
                        (*call->receiving_buffer)->data.raw.slice_buffer.length;
     if (remaining == 0) {
-      call->receiving_message = 0;
+      call->receiving_message = false;
       call->receiving_stream.reset();
       finish_batch_step(bctl);
       return;
@@ -1267,7 +1268,7 @@ static void continue_receiving_slices(batch_control* bctl) {
         call->receiving_stream.reset();
         grpc_byte_buffer_destroy(*call->receiving_buffer);
         *call->receiving_buffer = nullptr;
-        call->receiving_message = 0;
+        call->receiving_message = false;
         finish_batch_step(bctl);
         GRPC_ERROR_UNREF(error);
         return;
@@ -1303,7 +1304,7 @@ static void receiving_slice_ready(void* bctlp, grpc_error* error) {
     call->receiving_stream.reset();
     grpc_byte_buffer_destroy(*call->receiving_buffer);
     *call->receiving_buffer = nullptr;
-    call->receiving_message = 0;
+    call->receiving_message = false;
     finish_batch_step(bctl);
     if (release_error) {
       GRPC_ERROR_UNREF(error);
@@ -1315,7 +1316,7 @@ static void process_data_after_md(batch_control* bctl) {
   grpc_call* call = bctl->call;
   if (call->receiving_stream == nullptr) {
     *call->receiving_buffer = nullptr;
-    call->receiving_message = 0;
+    call->receiving_message = false;
     finish_batch_step(bctl);
   } else {
     call->test_only_last_message_flags = call->receiving_stream->flags();
index a9f65bd..5af4838 100644 (file)
@@ -126,8 +126,8 @@ grpc_error* non_polling_poller_work(grpc_pollset* pollset,
   gpr_timespec deadline_ts =
       grpc_millis_to_timespec(deadline, GPR_CLOCK_MONOTONIC);
   while (!npp->shutdown && !w.kicked &&
-         !gpr_cv_wait(&w.cv, &npp->mu, deadline_ts))
-    ;
+         !gpr_cv_wait(&w.cv, &npp->mu, deadline_ts)) {
+  }
   grpc_core::ExecCtx::Get()->InvalidateNow();
   if (&w == npp->root) {
     npp->root = w.next;
@@ -148,8 +148,9 @@ grpc_error* non_polling_poller_work(grpc_pollset* pollset,
 grpc_error* non_polling_poller_kick(grpc_pollset* pollset,
                                     grpc_pollset_worker* specific_worker) {
   non_polling_poller* p = reinterpret_cast<non_polling_poller*>(pollset);
-  if (specific_worker == nullptr)
+  if (specific_worker == nullptr) {
     specific_worker = reinterpret_cast<grpc_pollset_worker*>(p->root);
+  }
   if (specific_worker != nullptr) {
     non_polling_worker* w =
         reinterpret_cast<non_polling_worker*>(specific_worker);
@@ -422,9 +423,9 @@ static const cq_vtable g_cq_vtable[] = {
      cq_end_op_for_callback, nullptr, nullptr},
 };
 
-#define DATA_FROM_CQ(cq) ((void*)(cq + 1))
+#define DATA_FROM_CQ(cq) ((void*)((cq) + 1))
 #define POLLSET_FROM_CQ(cq) \
-  ((grpc_pollset*)(cq->vtable->data_size + (char*)DATA_FROM_CQ(cq)))
+  ((grpc_pollset*)((cq)->vtable->data_size + (char*)DATA_FROM_CQ(cq)))
 
 grpc_core::TraceFlag grpc_cq_pluck_trace(false, "queue_pluck");
 
@@ -1329,7 +1330,7 @@ static void cq_finish_shutdown_pluck(grpc_completion_queue* cq) {
 
   GPR_ASSERT(cqd->shutdown_called);
   GPR_ASSERT(!cqd->shutdown.Load(grpc_core::MemoryOrder::RELAXED));
-  cqd->shutdown.Store(1, grpc_core::MemoryOrder::RELAXED);
+  cqd->shutdown.Store(true, grpc_core::MemoryOrder::RELAXED);
 
   cq->poller_vtable->shutdown(POLLSET_FROM_CQ(cq), &cq->pollset_shutdown_done);
 }
index c945515..8872022 100644 (file)
@@ -30,6 +30,7 @@
 #include <utility>
 #include <vector>
 
+#include "absl/memory/memory.h"
 #include "absl/types/optional.h"
 
 #include <grpc/support/alloc.h>
@@ -936,7 +937,7 @@ class Server::ChannelData::ConnectivityWatcher
     GRPC_CHANNEL_INTERNAL_REF(chand_->channel_, "connectivity");
   }
 
-  ~ConnectivityWatcher() {
+  ~ConnectivityWatcher() override {
     GRPC_CHANNEL_INTERNAL_UNREF(chand_->channel_, "connectivity");
   }
 
@@ -1000,7 +1001,8 @@ void Server::ChannelData::InitTransport(RefCountedPtr<Server> server,
   if (num_registered_methods > 0) {
     uint32_t max_probes = 0;
     size_t slots = 2 * num_registered_methods;
-    registered_methods_.reset(new std::vector<ChannelRegisteredMethod>(slots));
+    registered_methods_ =
+        absl::make_unique<std::vector<ChannelRegisteredMethod>>(slots);
     for (std::unique_ptr<RegisteredMethod>& rm : server_->registered_methods_) {
       ExternallyManagedSlice host;
       ExternallyManagedSlice method(rm->method.c_str());
index 3a13b6f..af8ddab 100644 (file)
@@ -71,7 +71,7 @@ class Server : public InternallyRefCounted<Server> {
   /// listening and initiate destruction of the listener.
   class ListenerInterface : public Orphanable {
    public:
-    virtual ~ListenerInterface() = default;
+    ~ListenerInterface() override = default;
 
     /// Starts listening. This listener may refer to the pollset object beyond
     /// this call, so it is a pointer rather than a reference.
@@ -88,7 +88,7 @@ class Server : public InternallyRefCounted<Server> {
   };
 
   explicit Server(const grpc_channel_args* args);
-  ~Server();
+  ~Server() override;
 
   void Orphan() override;
 
index db3be68..07c802c 100644 (file)
 
 #include <grpc/support/port_platform.h>
 
+#include <cstring>
+
 #include <grpc/slice.h>
+
 #include "src/core/lib/iomgr/error.h"
 
 grpc_error* grpc_validate_header_key_is_legal(const grpc_slice& slice);
index bed4f42..d356efd 100644 (file)
@@ -23,6 +23,6 @@
 
 #include <grpc/grpc.h>
 
-const char* grpc_version_string(void) { return "13.0.0"; }
+const char* grpc_version_string(void) { return "14.0.0"; }
 
-const char* grpc_g_stands_for(void) { return "geeky"; }
+const char* grpc_g_stands_for(void) { return "gauntlet"; }
index 9e584b5..0cbf27e 100644 (file)
@@ -19,6 +19,8 @@
 
 #include <grpc/support/port_platform.h>
 
+#include <grpc/grpc.h>
+
 namespace grpc_core {
 
 /// Returns a channel argument containing \a authority.
index 8835e32..dd26687 100644 (file)
@@ -34,7 +34,7 @@ BdpEstimator::BdpEstimator(const char* name)
       accumulator_(0),
       estimate_(65536),
       ping_start_time_(gpr_time_0(GPR_CLOCK_MONOTONIC)),
-      inter_ping_delay_(100.0),  // start at 100ms
+      inter_ping_delay_(100),  // start at 100ms
       stable_estimate_count_(0),
       bw_est_(0),
       name_(name) {}
index ecb605a..e83fb62 100644 (file)
@@ -40,7 +40,7 @@ namespace grpc_core {
 
 class ByteStream : public Orphanable {
  public:
-  virtual ~ByteStream() {}
+  ~ByteStream() override {}
 
   // Returns true if the bytes are available immediately (in which case
   // on_complete will not be called), or false if the bytes will be available
@@ -92,7 +92,7 @@ class SliceBufferByteStream : public ByteStream {
   // Removes all slices in slice_buffer, leaving it empty.
   SliceBufferByteStream(grpc_slice_buffer* slice_buffer, uint32_t flags);
 
-  ~SliceBufferByteStream();
+  ~SliceBufferByteStream() override;
 
   void Orphan() override;
 
@@ -126,7 +126,7 @@ class ByteStreamCache {
    public:
     explicit CachingByteStream(ByteStreamCache* cache);
 
-    ~CachingByteStream();
+    ~CachingByteStream() override;
 
     void Orphan() override;
 
index 6b1d68c..cad34c2 100644 (file)
@@ -48,7 +48,7 @@ const char* ConnectivityStateName(grpc_connectivity_state state);
 class ConnectivityStateWatcherInterface
     : public InternallyRefCounted<ConnectivityStateWatcherInterface> {
  public:
-  virtual ~ConnectivityStateWatcherInterface() = default;
+  ~ConnectivityStateWatcherInterface() override = default;
 
   // Notifies the watcher that the state has changed to new_state.
   virtual void Notify(grpc_connectivity_state new_state,
@@ -63,12 +63,12 @@ class ConnectivityStateWatcherInterface
 class AsyncConnectivityStateWatcherInterface
     : public ConnectivityStateWatcherInterface {
  public:
-  virtual ~AsyncConnectivityStateWatcherInterface() = default;
+  ~AsyncConnectivityStateWatcherInterface() override = default;
 
   // Schedules a closure on the ExecCtx to invoke
   // OnConnectivityStateChange() asynchronously.
   void Notify(grpc_connectivity_state new_state,
-              const absl::Status& status) override final;
+              const absl::Status& status) final;
 
  protected:
   class Notifier;
index 4bb8d64..e6de4ea 100644 (file)
@@ -106,10 +106,10 @@ struct grpc_mdelem {
   ((grpc_mdelem_data_storage)((md).payload & (uintptr_t)3))
 #ifdef __cplusplus
 #define GRPC_MAKE_MDELEM(data, storage) \
-  (grpc_mdelem{((uintptr_t)(data)) | ((uintptr_t)storage)})
+  (grpc_mdelem{((uintptr_t)(data)) | ((uintptr_t)(storage))})
 #else
 #define GRPC_MAKE_MDELEM(data, storage) \
-  ((grpc_mdelem){((uintptr_t)(data)) | ((uintptr_t)storage)})
+  ((grpc_mdelem){((uintptr_t)(data)) | ((uintptr_t)(storage))})
 #endif
 #define GRPC_MDELEM_IS_INTERNED(md)          \
   ((grpc_mdelem_data_storage)((md).payload & \
index 26d4b4a..2740063 100644 (file)
@@ -102,8 +102,8 @@ int grpc_http2_decode_timeout(const grpc_slice& text, grpc_millis* timeout) {
   const uint8_t* end = GRPC_SLICE_END_PTR(text);
   int have_digit = 0;
   /* skip whitespace */
-  for (; p != end && *p == ' '; p++)
-    ;
+  for (; p != end && *p == ' '; p++) {
+  }
   /* decode numeric part */
   for (; p != end && *p >= '0' && *p <= '9'; p++) {
     int32_t digit = static_cast<int32_t>(*p - static_cast<uint8_t>('0'));
@@ -119,8 +119,8 @@ int grpc_http2_decode_timeout(const grpc_slice& text, grpc_millis* timeout) {
   }
   if (!have_digit) return 0;
   /* skip whitespace */
-  for (; p != end && *p == ' '; p++)
-    ;
+  for (; p != end && *p == ' '; p++) {
+  }
   if (p == end) return 0;
   /* decode unit specifier */
   switch (*p) {
index 99a3298..dccab66 100644 (file)
@@ -61,8 +61,8 @@ void slice_stream_destroy(void* arg) {
   grpc_stream_destroy(static_cast<grpc_stream_refcount*>(arg));
 }
 
-#define STREAM_REF_FROM_SLICE_REF(p)       \
-  ((grpc_stream_refcount*)(((uint8_t*)p) - \
+#define STREAM_REF_FROM_SLICE_REF(p)         \
+  ((grpc_stream_refcount*)(((uint8_t*)(p)) - \
                            offsetof(grpc_stream_refcount, slice_refcount)))
 
 grpc_slice grpc_slice_from_stream_owned_buffer(grpc_stream_refcount* refcount,
@@ -91,7 +91,9 @@ void grpc_stream_ref_init(grpc_stream_refcount* refcount, int /*initial_refs*/,
 #endif
   GRPC_CLOSURE_INIT(&refcount->destroy, cb, cb_arg, grpc_schedule_on_exec_ctx);
 
-  new (&refcount->refs) grpc_core::RefCount(1, &grpc_trace_stream_refcount);
+  new (&refcount->refs) grpc_core::RefCount(
+      1, GRPC_TRACE_FLAG_ENABLED(grpc_trace_stream_refcount) ? "stream_refcount"
+                                                             : nullptr);
   new (&refcount->slice_refcount) grpc_slice_refcount(
       grpc_slice_refcount::Type::REGULAR, &refcount->refs, slice_stream_destroy,
       refcount, &refcount->slice_refcount);
index cbb23b6..911f091 100644 (file)
@@ -224,7 +224,7 @@ struct grpc_transport_stream_op_batch_payload {
   ~grpc_transport_stream_op_batch_payload() {
     // We don't really own `send_message`, so release ownership and let the
     // owner clean the data.
-    send_message.send_message.release();
+    (void)send_message.send_message.release();
   }
 
   struct {
index e048760..5581523 100644 (file)
@@ -72,8 +72,8 @@ void grpc_lb_policy_cds_init(void);
 void grpc_lb_policy_cds_shutdown(void);
 void grpc_lb_policy_eds_init(void);
 void grpc_lb_policy_eds_shutdown(void);
-void grpc_lb_policy_eds_drop_init(void);
-void grpc_lb_policy_eds_drop_shutdown(void);
+void grpc_lb_policy_xds_cluster_impl_init(void);
+void grpc_lb_policy_xds_cluster_impl_shutdown(void);
 void grpc_lb_policy_xds_cluster_manager_init(void);
 void grpc_lb_policy_xds_cluster_manager_shutdown(void);
 void grpc_resolver_xds_init(void);
@@ -130,8 +130,8 @@ void grpc_register_built_in_plugins(void) {
                        grpc_lb_policy_cds_shutdown);
   grpc_register_plugin(grpc_lb_policy_eds_init,
                        grpc_lb_policy_eds_shutdown);
-  grpc_register_plugin(grpc_lb_policy_eds_drop_init,
-                       grpc_lb_policy_eds_drop_shutdown);
+  grpc_register_plugin(grpc_lb_policy_xds_cluster_impl_init,
+                       grpc_lb_policy_xds_cluster_impl_shutdown);
   grpc_register_plugin(grpc_lb_policy_xds_cluster_manager_init,
                        grpc_lb_policy_xds_cluster_manager_shutdown);
   grpc_register_plugin(grpc_resolver_xds_init,
index 01ef561..e7cd3cd 100644 (file)
@@ -394,9 +394,10 @@ static void on_handshaker_service_resp_recv_dedicated(void* arg,
                                                       grpc_error* /*error*/) {
   alts_shared_resource_dedicated* resource =
       grpc_alts_get_shared_resource_dedicated();
-  grpc_cq_end_op(resource->cq, arg, GRPC_ERROR_NONE,
-                 [](void* /*done_arg*/, grpc_cq_completion* /*storage*/) {},
-                 nullptr, &resource->storage);
+  grpc_cq_end_op(
+      resource->cq, arg, GRPC_ERROR_NONE,
+      [](void* /*done_arg*/, grpc_cq_completion* /*storage*/) {}, nullptr,
+      &resource->storage);
 }
 
 /* Returns TSI_OK if and only if no error is encountered. */
index 1b6b8ca..0675654 100644 (file)
@@ -577,6 +577,7 @@ static tsi_result fake_handshaker_get_bytes_to_send_to_peer(
   }
   if (!impl->outgoing_frame.needs_draining) {
     tsi_fake_handshake_message next_message_to_send =
+        // NOLINTNEXTLINE(bugprone-misplaced-widening-cast)
         static_cast<tsi_fake_handshake_message>(impl->next_message_to_send + 2);
     const char* msg_string =
         tsi_fake_handshake_message_to_string(impl->next_message_to_send);
index f7e004f..19043cd 100644 (file)
@@ -31,6 +31,8 @@
 #include "src/core/lib/iomgr/exec_ctx.h"
 #include "src/core/tsi/transport_security_grpc.h"
 
+namespace {
+
 /* Main struct for local TSI zero-copy frame protector. */
 typedef struct local_zero_copy_grpc_protector {
   tsi_zero_copy_grpc_protector base;
@@ -197,7 +199,9 @@ static const tsi_handshaker_vtable handshaker_vtable = {
     nullptr, /* shutdown */
 };
 
-tsi_result local_tsi_handshaker_create(bool is_client, tsi_handshaker** self) {
+}  // namespace
+
+tsi_result tsi_local_handshaker_create(bool is_client, tsi_handshaker** self) {
   if (self == nullptr) {
     gpr_log(GPR_ERROR, "Invalid arguments to local_tsi_handshaker_create()");
     return TSI_INVALID_ARGUMENT;
index 17213ec..fb46c1e 100644 (file)
 #define TSI_LOCAL_PROCESS_ID_PEER_PROPERTY "process_id"
 
 /**
- * Main struct for local TSI handshaker. All APIs in the header are
- * thread-comptabile.
- */
-typedef struct local_tsi_handshaker local_tsi_handshaker;
-
-/**
  * This method creates a local TSI handshaker instance.
  *
  * - is_client: boolean value indicating if the handshaker is used at the client
@@ -45,7 +39,12 @@ typedef struct local_tsi_handshaker local_tsi_handshaker;
  *   method.
  *
  * It returns TSI_OK on success and an error status code on failure.
+ *
+ * This handshaker is also being used as a minimalist handshaker for insecure
+ * security connector. If this handshaker ever needs to do anything more that
+ * does not fit with an insecure connector, we would need to add a separate
+ * handshaker for insecure connectors.
  */
-tsi_result local_tsi_handshaker_create(bool is_client, tsi_handshaker** self);
+tsi_result tsi_local_handshaker_create(bool is_client, tsi_handshaker** self);
 
 #endif /* GRPC_CORE_TSI_LOCAL_TRANSPORT_SECURITY_H */
index 108c0cd..69a91ad 100644 (file)
 
 #include <grpc/slice.h>
 
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmodule-import-in-extern-c"
 extern "C" {
 #include <openssl/ssl.h>
 }
+#pragma clang diagnostic pop
 
 #include "src/core/lib/gprpp/ref_counted.h"
 
index 5d91af7..fcdc8b6 100644 (file)
 #include <grpc/slice.h>
 #include <grpc/support/sync.h>
 
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmodule-import-in-extern-c"
 extern "C" {
 #include <openssl/ssl.h>
 }
+#pragma clang diagnostic pop
 
 #include "src/core/lib/avl/avl.h"
 #include "src/core/lib/gprpp/memory.h"
@@ -53,7 +56,7 @@ class SslSessionLRUCache : public grpc_core::RefCounted<SslSessionLRUCache> {
 
   // Use Create function instead of using this directly.
   explicit SslSessionLRUCache(size_t capacity);
-  ~SslSessionLRUCache();
+  ~SslSessionLRUCache() override;
 
   // Not copyable nor movable.
   SslSessionLRUCache(const SslSessionLRUCache&) = delete;
index 5550bb6..ad9f570 100644 (file)
@@ -45,6 +45,8 @@
 #include "absl/strings/match.h"
 #include "absl/strings/string_view.h"
 
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmodule-import-in-extern-c"
 extern "C" {
 #include <openssl/bio.h>
 #include <openssl/crypto.h> /* For OPENSSL_free */
@@ -55,6 +57,7 @@ extern "C" {
 #include <openssl/x509.h>
 #include <openssl/x509v3.h>
 }
+#pragma clang diagnostic pop
 
 #include "src/core/lib/gpr/useful.h"
 #include "src/core/tsi/ssl/session_cache/ssl_session_cache.h"
@@ -410,6 +413,10 @@ static tsi_result add_subject_alt_names_properties_to_peer(
       result = tsi_construct_string_peer_property_from_cstring(
           TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY, name,
           &peer->properties[(*current_insert_index)++]);
+    } else {
+      result = tsi_construct_string_peer_property_from_cstring(
+          TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY, "other types of SAN",
+          &peer->properties[(*current_insert_index)++]);
     }
     if (result != TSI_OK) break;
   }
@@ -463,7 +470,7 @@ static tsi_result peer_from_x509(X509* cert, int include_certificate_type,
           &current_insert_index);
       if (result != TSI_OK) break;
     }
-  } while (0);
+  } while (false);
 
   if (subject_alt_names != nullptr) {
     sk_GENERAL_NAME_pop_free(subject_alt_names, GENERAL_NAME_free);
@@ -561,7 +568,7 @@ static tsi_result ssl_ctx_use_certificate_chain(SSL_CTX* context,
       result = TSI_INVALID_ARGUMENT;
       break;
     }
-    while (1) {
+    while (true) {
       X509* certificate_authority =
           PEM_read_bio_X509(pem, nullptr, nullptr, (void*)"");
       if (certificate_authority == nullptr) {
@@ -578,7 +585,7 @@ static tsi_result ssl_ctx_use_certificate_chain(SSL_CTX* context,
          though.
        */
     }
-  } while (0);
+  } while (false);
 
   if (certificate != nullptr) X509_free(certificate);
   BIO_free(pem);
@@ -679,7 +686,7 @@ static tsi_result ssl_ctx_use_pem_private_key(SSL_CTX* context,
       result = TSI_INVALID_ARGUMENT;
       break;
     }
-  } while (0);
+  } while (false);
   if (private_key != nullptr) EVP_PKEY_free(private_key);
   BIO_free(pem);
   return result;
@@ -719,7 +726,7 @@ static tsi_result x509_store_load_certs(X509_STORE* cert_store,
     if (*root_names == nullptr) return TSI_OUT_OF_RESOURCES;
   }
 
-  while (1) {
+  while (true) {
     root = PEM_read_bio_X509_AUX(pem, nullptr, nullptr, (void*)"");
     if (root == nullptr) {
       ERR_clear_error();
@@ -1962,7 +1969,7 @@ tsi_result tsi_create_ssl_client_handshaker_factory_with_options(
       SSL_CTX_set_next_proto_select_cb(
           ssl_context, client_handshaker_factory_npn_callback, impl);
     }
-  } while (0);
+  } while (false);
   if (result != TSI_OK) {
     tsi_ssl_handshaker_factory_unref(&impl->base);
     return result;
@@ -2149,7 +2156,7 @@ tsi_result tsi_create_ssl_server_handshaker_factory_with_options(
       SSL_CTX_set_next_protos_advertised_cb(
           impl->ssl_contexts[i],
           server_handshaker_factory_npn_advertised_callback, impl);
-    } while (0);
+    } while (false);
 
     if (result != TSI_OK) {
       tsi_ssl_handshaker_factory_unref(&impl->base);
index 8476c83..e57ef88 100644 (file)
 #include "absl/strings/string_view.h"
 #include "src/core/tsi/transport_security_interface.h"
 
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmodule-import-in-extern-c"
 extern "C" {
 #include <openssl/x509.h>
 }
+#pragma clang diagnostic pop
 
 /* Value for the TSI_CERTIFICATE_TYPE_PEER_PROPERTY property for X509 certs. */
 #define TSI_X509_CERTIFICATE_TYPE "X509"
index 035e7cc..262db0d 100644 (file)
@@ -150,8 +150,9 @@ tsi_result tsi_handshaker_get_bytes_to_send_to_peer(tsi_handshaker* self,
   }
   if (self->frame_protector_created) return TSI_FAILED_PRECONDITION;
   if (self->handshake_shutdown) return TSI_HANDSHAKE_SHUTDOWN;
-  if (self->vtable->get_bytes_to_send_to_peer == nullptr)
+  if (self->vtable->get_bytes_to_send_to_peer == nullptr) {
     return TSI_UNIMPLEMENTED;
+  }
   return self->vtable->get_bytes_to_send_to_peer(self, bytes, bytes_size);
 }
 
@@ -164,8 +165,9 @@ tsi_result tsi_handshaker_process_bytes_from_peer(tsi_handshaker* self,
   }
   if (self->frame_protector_created) return TSI_FAILED_PRECONDITION;
   if (self->handshake_shutdown) return TSI_HANDSHAKE_SHUTDOWN;
-  if (self->vtable->process_bytes_from_peer == nullptr)
+  if (self->vtable->process_bytes_from_peer == nullptr) {
     return TSI_UNIMPLEMENTED;
+  }
   return self->vtable->process_bytes_from_peer(self, bytes, bytes_size);
 }
 
index 82dc8c6..299e535 100644 (file)
@@ -25,8 +25,8 @@ Pod::Spec.new do |s|
 
   s.header_mappings_dir = 'src'
 
-  s.ios.deployment_target = '7.0'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
   s.tvos.deployment_target = '9.0'
   s.watchos.deployment_target = '2.0'
 
index f4cbc97..a05761a 100644 (file)
@@ -34,14 +34,14 @@ void ClientReactor::InternalScheduleOnDone(grpc::Status s) {
     const grpc::Status status;
     ClosureWithArg(ClientReactor* reactor_arg, grpc::Status s)
         : reactor(reactor_arg), status(std::move(s)) {
-      GRPC_CLOSURE_INIT(&closure,
-                        [](void* void_arg, grpc_error*) {
-                          ClosureWithArg* arg =
-                              static_cast<ClosureWithArg*>(void_arg);
-                          arg->reactor->OnDone(arg->status);
-                          delete arg;
-                        },
-                        this, grpc_schedule_on_exec_ctx);
+      GRPC_CLOSURE_INIT(
+          &closure,
+          [](void* void_arg, grpc_error*) {
+            ClosureWithArg* arg = static_cast<ClosureWithArg*>(void_arg);
+            arg->reactor->OnDone(arg->status);
+            delete arg;
+          },
+          this, grpc_schedule_on_exec_ctx);
     }
   };
   ClosureWithArg* arg = new ClosureWithArg(this, std::move(s));
index a9be08d..98e8cb7 100644 (file)
@@ -51,6 +51,9 @@ class InsecureChannelCredentialsImpl final : public ChannelCredentials {
   }
 
   SecureChannelCredentials* AsSecureCredentials() override { return nullptr; }
+
+ private:
+  bool IsInsecure() const override { return true; }
 };
 }  // namespace
 
index 378ccea..af2841c 100644 (file)
@@ -28,6 +28,7 @@
 #include <grpcpp/impl/grpc_library.h>
 #include <grpcpp/support/channel_arguments.h>
 
+// TODO(yashykt): We shouldn't be including "src/core" headers.
 #include "src/core/lib/gpr/env.h"
 #include "src/core/lib/iomgr/error.h"
 #include "src/core/lib/iomgr/executor.h"
@@ -79,7 +80,8 @@ bool SecureCallCredentials::ApplyToCall(grpc_call* call) {
   return grpc_call_set_credentials(call, c_creds_) == GRPC_CALL_OK;
 }
 
-namespace {
+namespace internal {
+
 std::shared_ptr<ChannelCredentials> WrapChannelCredentials(
     grpc_channel_credentials* creds) {
   return creds == nullptr ? nullptr
@@ -87,6 +89,10 @@ std::shared_ptr<ChannelCredentials> WrapChannelCredentials(
                                 new SecureChannelCredentials(creds));
 }
 
+}  // namespace internal
+
+namespace {
+
 std::shared_ptr<CallCredentials> WrapCallCredentials(
     grpc_call_credentials* creds) {
   return creds == nullptr ? nullptr
@@ -97,7 +103,7 @@ std::shared_ptr<CallCredentials> WrapCallCredentials(
 
 std::shared_ptr<ChannelCredentials> GoogleDefaultCredentials() {
   grpc::GrpcLibraryCodegen init;  // To call grpc_init().
-  return WrapChannelCredentials(
+  return internal::WrapChannelCredentials(
       grpc_google_default_credentials_create(nullptr));
 }
 
@@ -112,7 +118,7 @@ std::shared_ptr<ChannelCredentials> SslCredentials(
       options.pem_root_certs.empty() ? nullptr : options.pem_root_certs.c_str(),
       options.pem_private_key.empty() ? nullptr : &pem_key_cert_pair, nullptr,
       nullptr);
-  return WrapChannelCredentials(c_creds);
+  return internal::WrapChannelCredentials(c_creds);
 }
 
 namespace experimental {
@@ -277,20 +283,20 @@ std::shared_ptr<ChannelCredentials> AltsCredentials(
   }
   grpc_channel_credentials* c_creds = grpc_alts_credentials_create(c_options);
   grpc_alts_credentials_options_destroy(c_options);
-  return WrapChannelCredentials(c_creds);
+  return internal::WrapChannelCredentials(c_creds);
 }
 
 // Builds Local Credentials
 std::shared_ptr<ChannelCredentials> LocalCredentials(
     grpc_local_connect_type type) {
   grpc::GrpcLibraryCodegen init;  // To call grpc_init().
-  return WrapChannelCredentials(grpc_local_credentials_create(type));
+  return internal::WrapChannelCredentials(grpc_local_credentials_create(type));
 }
 
 // Builds TLS Credentials given TLS options.
 std::shared_ptr<ChannelCredentials> TlsCredentials(
-    const TlsCredentialsOptions& options) {
-  return WrapChannelCredentials(
+    const TlsChannelCredentialsOptions& options) {
+  return internal::WrapChannelCredentials(
       grpc_tls_credentials_create(options.c_credentials_options()));
 }
 
@@ -356,8 +362,10 @@ std::shared_ptr<ChannelCredentials> CompositeChannelCredentials(
       channel_creds->AsSecureCredentials();
   SecureCallCredentials* s_call_creds = call_creds->AsSecureCredentials();
   if (s_channel_creds && s_call_creds) {
-    return WrapChannelCredentials(grpc_composite_channel_credentials_create(
-        s_channel_creds->GetRawCreds(), s_call_creds->GetRawCreds(), nullptr));
+    return internal::WrapChannelCredentials(
+        grpc_composite_channel_credentials_create(
+            s_channel_creds->GetRawCreds(), s_call_creds->GetRawCreds(),
+            nullptr));
   }
   return nullptr;
 }
index fe56b15..318c402 100644 (file)
@@ -26,6 +26,7 @@
 #include <grpcpp/support/config.h>
 
 #include "absl/strings/str_cat.h"
+// TODO(yashykt): We shouldn't be including "src/core" headers.
 #include "src/core/lib/security/credentials/credentials.h"
 #include "src/cpp/server/thread_pool_interface.h"
 
@@ -36,7 +37,7 @@ class Channel;
 class SecureChannelCredentials final : public ChannelCredentials {
  public:
   explicit SecureChannelCredentials(grpc_channel_credentials* c_creds);
-  ~SecureChannelCredentials() {
+  ~SecureChannelCredentials() override {
     if (c_creds_ != nullptr) c_creds_->Unref();
   }
   grpc_channel_credentials* GetRawCreds() { return c_creds_; }
@@ -58,7 +59,7 @@ class SecureChannelCredentials final : public ChannelCredentials {
 class SecureCallCredentials final : public CallCredentials {
  public:
   explicit SecureCallCredentials(grpc_call_credentials* c_creds);
-  ~SecureCallCredentials() {
+  ~SecureCallCredentials() override {
     if (c_creds_ != nullptr) c_creds_->Unref();
   }
   grpc_call_credentials* GetRawCreds() { return c_creds_; }
@@ -74,6 +75,13 @@ class SecureCallCredentials final : public CallCredentials {
   grpc_call_credentials* const c_creds_;
 };
 
+namespace internal {
+
+std::shared_ptr<ChannelCredentials> WrapChannelCredentials(
+    grpc_channel_credentials* creds);
+
+}  // namespace internal
+
 namespace experimental {
 
 // Transforms C++ STS Credentials options to core options. The pointers of the
diff --git a/src/cpp/client/xds_credentials.cc b/src/cpp/client/xds_credentials.cc
new file mode 100644 (file)
index 0000000..ff9aa61
--- /dev/null
@@ -0,0 +1,40 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#include "src/cpp/client/secure_credentials.h"
+
+namespace grpc {
+namespace experimental {
+
+std::shared_ptr<ChannelCredentials> XdsCredentials(
+    const std::shared_ptr<ChannelCredentials>& fallback_creds) {
+  if (fallback_creds->IsInsecure()) {
+    grpc_channel_credentials* insecure_creds =
+        grpc_insecure_credentials_create();
+    auto xds_creds = internal::WrapChannelCredentials(
+        grpc_xds_credentials_create(insecure_creds));
+    grpc_channel_credentials_release(insecure_creds);
+    return xds_creds;
+  } else {
+    return internal::WrapChannelCredentials(grpc_xds_credentials_create(
+        fallback_creds->AsSecureCredentials()->GetRawCreds()));
+  }
+}
+
+}  // namespace experimental
+}  // namespace grpc
index a261287..ac1b747 100644 (file)
@@ -41,7 +41,7 @@ class AlarmImpl : public ::grpc::internal::CompletionQueueTag {
     gpr_ref_init(&refs_, 1);
     grpc_timer_init_unset(&timer_);
   }
-  ~AlarmImpl() {}
+  ~AlarmImpl() override {}
   bool FinalizeResult(void** tag, bool* /*status*/) override {
     *tag = tag_;
     Unref();
@@ -80,20 +80,20 @@ class AlarmImpl : public ::grpc::internal::CompletionQueueTag {
     // Don't use any CQ at all. Instead just use the timer to fire the function
     callback_ = std::move(f);
     Ref();
-    GRPC_CLOSURE_INIT(&on_alarm_,
-                      [](void* arg, grpc_error* error) {
-                        grpc_core::Executor::Run(
-                            GRPC_CLOSURE_CREATE(
-                                [](void* arg, grpc_error* error) {
-                                  AlarmImpl* alarm =
-                                      static_cast<AlarmImpl*>(arg);
-                                  alarm->callback_(error == GRPC_ERROR_NONE);
-                                  alarm->Unref();
-                                },
-                                arg, nullptr),
-                            error);
-                      },
-                      this, grpc_schedule_on_exec_ctx);
+    GRPC_CLOSURE_INIT(
+        &on_alarm_,
+        [](void* arg, grpc_error* error) {
+          grpc_core::Executor::Run(
+              GRPC_CLOSURE_CREATE(
+                  [](void* arg, grpc_error* error) {
+                    AlarmImpl* alarm = static_cast<AlarmImpl*>(arg);
+                    alarm->callback_(error == GRPC_ERROR_NONE);
+                    alarm->Unref();
+                  },
+                  arg, nullptr),
+              error);
+        },
+        this, grpc_schedule_on_exec_ctx);
     grpc_timer_init(&timer_, grpc_timespec_to_millis_round_up(deadline),
                     &on_alarm_);
   }
index 3375237..83c2227 100644 (file)
@@ -49,7 +49,7 @@ class SecureAuthContext final : public AuthContext {
   void AddProperty(const std::string& key,
                    const grpc::string_ref& value) override;
 
-  virtual bool SetPeerIdentityPropertyName(const std::string& name) override;
+  bool SetPeerIdentityPropertyName(const std::string& name) override;
 
  private:
   grpc_core::RefCountedPtr<grpc_auth_context> ctx_;
diff --git a/src/cpp/common/tls_certificate_provider.cc b/src/cpp/common/tls_certificate_provider.cc
new file mode 100644 (file)
index 0000000..3550e28
--- /dev/null
@@ -0,0 +1,45 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <grpc/grpc_security.h>
+#include <grpc/support/alloc.h>
+#include <grpcpp/security/tls_certificate_provider.h>
+
+#include "absl/container/inlined_vector.h"
+
+namespace grpc {
+namespace experimental {
+
+StaticDataCertificateProvider::StaticDataCertificateProvider(
+    const std::string& root_certificate,
+    const std::vector<IdentityKeyCertPair>& identity_key_cert_pairs) {
+  GPR_ASSERT(!root_certificate.empty() || !identity_key_cert_pairs.empty());
+  grpc_tls_identity_pairs* pairs_core = grpc_tls_identity_pairs_create();
+  for (const IdentityKeyCertPair& pair : identity_key_cert_pairs) {
+    grpc_tls_identity_pairs_add_pair(pairs_core, pair.private_key.c_str(),
+                                     pair.certificate_chain.c_str());
+  }
+  c_provider_ = grpc_tls_certificate_provider_static_data_create(
+      root_certificate.c_str(), pairs_core);
+  GPR_ASSERT(c_provider_ != nullptr);
+};
+
+StaticDataCertificateProvider::~StaticDataCertificateProvider() {
+  grpc_tls_certificate_provider_release(c_provider_);
+};
+
+}  // namespace experimental
+}  // namespace grpc
index 011cf4b..02bc6d9 100644 (file)
  *
  */
 
+#include <grpc/grpc_security.h>
 #include <grpc/support/alloc.h>
 #include <grpcpp/security/tls_credentials_options.h>
 
 #include "absl/container/inlined_vector.h"
-#include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h"
 #include "src/cpp/common/tls_credentials_options_util.h"
 
 namespace grpc {
 namespace experimental {
 
-/** TLS key materials config API implementation **/
-void TlsKeyMaterialsConfig::set_pem_root_certs(
-    const std::string& pem_root_certs) {
-  pem_root_certs_ = pem_root_certs;
-}
-
-void TlsKeyMaterialsConfig::add_pem_key_cert_pair(
-    const PemKeyCertPair& pem_key_cert_pair) {
-  pem_key_cert_pair_list_.push_back(pem_key_cert_pair);
-}
-
-void TlsKeyMaterialsConfig::set_key_materials(
-    const std::string& pem_root_certs,
-    const std::vector<PemKeyCertPair>& pem_key_cert_pair_list) {
-  pem_key_cert_pair_list_ = pem_key_cert_pair_list;
-  pem_root_certs_ = pem_root_certs;
-}
-
-/** TLS credential reload arg API implementation **/
-TlsCredentialReloadArg::TlsCredentialReloadArg(
-    grpc_tls_credential_reload_arg* arg)
-    : c_arg_(arg) {
-  if (c_arg_ != nullptr && c_arg_->context != nullptr) {
-    gpr_log(GPR_ERROR, "c_arg context has already been set");
-  }
-  c_arg_->context = static_cast<void*>(this);
-  c_arg_->destroy_context = &TlsCredentialReloadArgDestroyContext;
-}
-
-TlsCredentialReloadArg::~TlsCredentialReloadArg() {}
-
-void* TlsCredentialReloadArg::cb_user_data() const {
-  return c_arg_->cb_user_data;
-}
-bool TlsCredentialReloadArg::is_pem_key_cert_pair_list_empty() const {
-  return c_arg_->key_materials_config->pem_key_cert_pair_list().empty();
-}
-
-grpc_ssl_certificate_config_reload_status TlsCredentialReloadArg::status()
-    const {
-  return c_arg_->status;
-}
-
-std::string TlsCredentialReloadArg::error_details() const {
-  return c_arg_->error_details->error_details();
-}
-
-void TlsCredentialReloadArg::set_cb_user_data(void* cb_user_data) {
-  c_arg_->cb_user_data = cb_user_data;
-}
-
-void TlsCredentialReloadArg::set_pem_root_certs(
-    const std::string& pem_root_certs) {
-  ::grpc_core::UniquePtr<char> c_pem_root_certs(
-      gpr_strdup(pem_root_certs.c_str()));
-  c_arg_->key_materials_config->set_pem_root_certs(std::move(c_pem_root_certs));
-}
-
-namespace {
-
-::grpc_core::PemKeyCertPair ConvertToCorePemKeyCertPair(
-    const TlsKeyMaterialsConfig::PemKeyCertPair& pem_key_cert_pair) {
-  grpc_ssl_pem_key_cert_pair* ssl_pair =
-      (grpc_ssl_pem_key_cert_pair*)gpr_malloc(
-          sizeof(grpc_ssl_pem_key_cert_pair));
-  ssl_pair->private_key = gpr_strdup(pem_key_cert_pair.private_key.c_str());
-  ssl_pair->cert_chain = gpr_strdup(pem_key_cert_pair.cert_chain.c_str());
-  return ::grpc_core::PemKeyCertPair(ssl_pair);
-}
-
-}  //  namespace
-
-void TlsCredentialReloadArg::add_pem_key_cert_pair(
-    const TlsKeyMaterialsConfig::PemKeyCertPair& pem_key_cert_pair) {
-  c_arg_->key_materials_config->add_pem_key_cert_pair(
-      ConvertToCorePemKeyCertPair(pem_key_cert_pair));
-}
-
-void TlsCredentialReloadArg::set_key_materials(
-    const std::string& pem_root_certs,
-    std::vector<TlsKeyMaterialsConfig::PemKeyCertPair> pem_key_cert_pair_list) {
-  /** Initialize the |key_materials_config| field of |c_arg_|, if it has not
-   *  already been done. **/
-  if (c_arg_->key_materials_config == nullptr) {
-    c_arg_->key_materials_config = grpc_tls_key_materials_config_create();
-  }
-  /** Convert |pem_key_cert_pair_list| to an inlined vector of ssl pairs. **/
-  ::absl::InlinedVector<::grpc_core::PemKeyCertPair, 1>
-      c_pem_key_cert_pair_list;
-  for (const auto& key_cert_pair : pem_key_cert_pair_list) {
-    c_pem_key_cert_pair_list.emplace_back(
-        ConvertToCorePemKeyCertPair(key_cert_pair));
-  }
-  /** Populate the key materials config field of |c_arg_|. **/
-  c_arg_->key_materials_config->set_key_materials(pem_root_certs.c_str(),
-                                                  c_pem_key_cert_pair_list);
-}
-
-void TlsCredentialReloadArg::set_key_materials_config(
-    const std::shared_ptr<TlsKeyMaterialsConfig>& key_materials_config) {
-  if (key_materials_config == nullptr) {
-    c_arg_->key_materials_config = nullptr;
-    return;
-  }
-  ::absl::InlinedVector<::grpc_core::PemKeyCertPair, 1>
-      c_pem_key_cert_pair_list;
-  for (const auto& key_cert_pair :
-       key_materials_config->pem_key_cert_pair_list()) {
-    grpc_ssl_pem_key_cert_pair* ssl_pair =
-        (grpc_ssl_pem_key_cert_pair*)gpr_malloc(
-            sizeof(grpc_ssl_pem_key_cert_pair));
-    ssl_pair->private_key = gpr_strdup(key_cert_pair.private_key.c_str());
-    ssl_pair->cert_chain = gpr_strdup(key_cert_pair.cert_chain.c_str());
-    ::grpc_core::PemKeyCertPair c_pem_key_cert_pair =
-        ::grpc_core::PemKeyCertPair(ssl_pair);
-    c_pem_key_cert_pair_list.emplace_back(std::move(c_pem_key_cert_pair));
-  }
-  ::grpc_core::UniquePtr<char> c_pem_root_certs(
-      gpr_strdup(key_materials_config->pem_root_certs().c_str()));
-  if (c_arg_->key_materials_config == nullptr) {
-    c_arg_->key_materials_config = grpc_tls_key_materials_config_create();
-  }
-  c_arg_->key_materials_config->set_key_materials(
-      key_materials_config->pem_root_certs().c_str(), c_pem_key_cert_pair_list);
-  c_arg_->key_materials_config->set_version(key_materials_config->version());
-}
-
-void TlsCredentialReloadArg::set_status(
-    grpc_ssl_certificate_config_reload_status status) {
-  c_arg_->status = status;
-}
-
-void TlsCredentialReloadArg::set_error_details(
-    const std::string& error_details) {
-  c_arg_->error_details->set_error_details(error_details.c_str());
-}
-
-void TlsCredentialReloadArg::OnCredentialReloadDoneCallback() {
-  if (c_arg_->cb == nullptr) {
-    gpr_log(GPR_ERROR, "credential reload arg callback API is nullptr");
-    return;
-  }
-  c_arg_->cb(c_arg_);
-}
-
-/** gRPC TLS credential reload config API implementation **/
-TlsCredentialReloadConfig::TlsCredentialReloadConfig(
-    std::shared_ptr<TlsCredentialReloadInterface> credential_reload_interface)
-    : credential_reload_interface_(std::move(credential_reload_interface)) {
-  c_config_ = grpc_tls_credential_reload_config_create(
-      nullptr, &TlsCredentialReloadConfigCSchedule,
-      &TlsCredentialReloadConfigCCancel, nullptr);
-  c_config_->set_context(static_cast<void*>(this));
-}
-
-TlsCredentialReloadConfig::~TlsCredentialReloadConfig() {}
-
 /** gRPC TLS server authorization check arg API implementation **/
 TlsServerAuthorizationCheckArg::TlsServerAuthorizationCheckArg(
     grpc_tls_server_authorization_check_arg* arg)
     : c_arg_(arg) {
-  if (c_arg_ != nullptr && c_arg_->context != nullptr) {
+  GPR_ASSERT(c_arg_ != nullptr);
+  if (c_arg_->context != nullptr) {
     gpr_log(GPR_ERROR, "c_arg context has already been set");
   }
   c_arg_->context = static_cast<void*>(this);
@@ -265,7 +109,6 @@ void TlsServerAuthorizationCheckArg::OnServerAuthorizationCheckDoneCallback() {
   c_arg_->cb(c_arg_);
 }
 
-/** gRPC TLS server authorization check config API implementation. **/
 TlsServerAuthorizationCheckConfig::TlsServerAuthorizationCheckConfig(
     std::shared_ptr<TlsServerAuthorizationCheckInterface>
         server_authorization_check_interface)
@@ -277,67 +120,66 @@ TlsServerAuthorizationCheckConfig::TlsServerAuthorizationCheckConfig(
   c_config_->set_context(static_cast<void*>(this));
 }
 
-TlsServerAuthorizationCheckConfig::~TlsServerAuthorizationCheckConfig() {}
-
-/** gRPC TLS credential options API implementation **/
-TlsCredentialsOptions::TlsCredentialsOptions(
-    grpc_tls_server_verification_option server_verification_option,
-    std::shared_ptr<TlsKeyMaterialsConfig> key_materials_config,
-    std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config,
-    std::shared_ptr<TlsServerAuthorizationCheckConfig>
-        server_authorization_check_config)
-    : TlsCredentialsOptions(
-          GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE, server_verification_option,
-          std::move(key_materials_config), std::move(credential_reload_config),
-          std::move(server_authorization_check_config)) {}
-
-TlsCredentialsOptions::TlsCredentialsOptions(
-    grpc_ssl_client_certificate_request_type cert_request_type,
-    std::shared_ptr<TlsKeyMaterialsConfig> key_materials_config,
-    std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config)
-    : TlsCredentialsOptions(cert_request_type, GRPC_TLS_SERVER_VERIFICATION,
-                            std::move(key_materials_config),
-                            std::move(credential_reload_config), nullptr) {}
+TlsServerAuthorizationCheckConfig::~TlsServerAuthorizationCheckConfig() {
+  grpc_tls_server_authorization_check_config_release(c_config_);
+}
 
 TlsCredentialsOptions::TlsCredentialsOptions(
-    grpc_ssl_client_certificate_request_type cert_request_type,
-    grpc_tls_server_verification_option server_verification_option,
-    std::shared_ptr<TlsKeyMaterialsConfig> key_materials_config,
-    std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config,
-    std::shared_ptr<TlsServerAuthorizationCheckConfig>
-        server_authorization_check_config)
-    : cert_request_type_(cert_request_type),
-      server_verification_option_(server_verification_option),
-      key_materials_config_(std::move(key_materials_config)),
-      credential_reload_config_(std::move(credential_reload_config)),
-      server_authorization_check_config_(
-          std::move(server_authorization_check_config)) {
+    std::shared_ptr<CertificateProviderInterface> certificate_provider)
+    : certificate_provider_(std::move(certificate_provider)) {
   c_credentials_options_ = grpc_tls_credentials_options_create();
-  grpc_tls_credentials_options_set_cert_request_type(c_credentials_options_,
-                                                     cert_request_type_);
-  if (key_materials_config_ != nullptr) {
-    grpc_tls_credentials_options_set_key_materials_config(
-        c_credentials_options_,
-        ConvertToCKeyMaterialsConfig(key_materials_config_));
-  }
-  if (credential_reload_config_ != nullptr) {
-    grpc_tls_credentials_options_set_credential_reload_config(
-        c_credentials_options_, credential_reload_config_->c_config());
+  if (certificate_provider_ != nullptr) {
+    grpc_tls_credentials_options_set_certificate_provider(
+        c_credentials_options_, certificate_provider_->c_provider());
   }
-  if (server_authorization_check_config_ != nullptr) {
+}
+
+void TlsCredentialsOptions::watch_root_certs() {
+  grpc_tls_credentials_options_watch_root_certs(c_credentials_options_);
+}
+
+void TlsCredentialsOptions::set_root_cert_name(
+    const std::string& root_cert_name) {
+  grpc_tls_credentials_options_set_root_cert_name(c_credentials_options_,
+                                                  root_cert_name.c_str());
+}
+
+void TlsCredentialsOptions::watch_identity_key_cert_pairs() {
+  grpc_tls_credentials_options_watch_identity_key_cert_pairs(
+      c_credentials_options_);
+}
+
+void TlsCredentialsOptions::set_identity_cert_name(
+    const std::string& identity_cert_name) {
+  grpc_tls_credentials_options_set_identity_cert_name(
+      c_credentials_options_, identity_cert_name.c_str());
+}
+
+void TlsChannelCredentialsOptions::set_server_verification_option(
+    grpc_tls_server_verification_option server_verification_option) {
+  grpc_tls_credentials_options* options = c_credentials_options();
+  GPR_ASSERT(options != nullptr);
+  grpc_tls_credentials_options_set_server_verification_option(
+      options, server_verification_option);
+}
+
+void TlsChannelCredentialsOptions::set_server_authorization_check_config(
+    std::shared_ptr<TlsServerAuthorizationCheckConfig> config) {
+  grpc_tls_credentials_options* options = c_credentials_options();
+  GPR_ASSERT(options != nullptr);
+  if (config != nullptr) {
     grpc_tls_credentials_options_set_server_authorization_check_config(
-        c_credentials_options_, server_authorization_check_config_->c_config());
+        options, config->c_config());
   }
-  grpc_tls_credentials_options_set_server_verification_option(
-      c_credentials_options_, server_verification_option);
 }
 
-/** Whenever a TlsCredentialsOptions instance is created, the caller takes
- *  ownership of the c_credentials_options_ pointer (see e.g. the implementation
- *  of the TlsCredentials API in secure_credentials.cc). For this reason, the
- *  TlsCredentialsOptions destructor is not responsible for freeing
- *  c_credentials_options_. **/
-TlsCredentialsOptions::~TlsCredentialsOptions() {}
+void TlsServerCredentialsOptions::set_cert_request_type(
+    grpc_ssl_client_certificate_request_type cert_request_type) {
+  grpc_tls_credentials_options* options = c_credentials_options();
+  GPR_ASSERT(options != nullptr);
+  grpc_tls_credentials_options_set_cert_request_type(options,
+                                                     cert_request_type);
+}
 
 }  // namespace experimental
 }  // namespace grpc
index 51cc4e2..1cea450 100644 (file)
 #include "absl/container/inlined_vector.h"
 
 #include <grpcpp/security/tls_credentials_options.h>
+
 #include "src/cpp/common/tls_credentials_options_util.h"
 
 namespace grpc {
 namespace experimental {
 
-/** Converts the Cpp key materials to C key materials; this allocates memory for
- * the C key materials. Note that the user must free
- * the underlying pointer to private key and cert chain duplicates; they are not
- * freed when the grpc_core::UniquePtr<char> member variables of PemKeyCertPair
- * are unused. Similarly, the user must free the underlying pointer to
- * c_pem_root_certs. **/
-grpc_tls_key_materials_config* ConvertToCKeyMaterialsConfig(
-    const std::shared_ptr<TlsKeyMaterialsConfig>& config) {
-  if (config == nullptr) {
-    return nullptr;
-  }
-  grpc_tls_key_materials_config* c_config =
-      grpc_tls_key_materials_config_create();
-  ::absl::InlinedVector<::grpc_core::PemKeyCertPair, 1>
-      c_pem_key_cert_pair_list;
-  for (const auto& key_cert_pair : config->pem_key_cert_pair_list()) {
-    grpc_ssl_pem_key_cert_pair* ssl_pair =
-        (grpc_ssl_pem_key_cert_pair*)gpr_malloc(
-            sizeof(grpc_ssl_pem_key_cert_pair));
-    ssl_pair->private_key = gpr_strdup(key_cert_pair.private_key.c_str());
-    ssl_pair->cert_chain = gpr_strdup(key_cert_pair.cert_chain.c_str());
-    ::grpc_core::PemKeyCertPair c_pem_key_cert_pair =
-        ::grpc_core::PemKeyCertPair(ssl_pair);
-    c_pem_key_cert_pair_list.push_back(::std::move(c_pem_key_cert_pair));
-  }
-  c_config->set_key_materials(config->pem_root_certs().c_str(),
-                              c_pem_key_cert_pair_list);
-  c_config->set_version(config->version());
-  return c_config;
-}
-
-/** The C schedule and cancel functions for the credential reload config.
- * They populate a C credential reload arg with the result of a C++ credential
- * reload schedule/cancel API. **/
-int TlsCredentialReloadConfigCSchedule(void* /*config_user_data*/,
-                                       grpc_tls_credential_reload_arg* arg) {
-  if (arg == nullptr || arg->config == nullptr ||
-      arg->config->context() == nullptr) {
-    gpr_log(GPR_ERROR, "credential reload arg was not properly initialized");
-    return 1;
-  }
-  TlsCredentialReloadConfig* cpp_config =
-      static_cast<TlsCredentialReloadConfig*>(arg->config->context());
-  TlsCredentialReloadArg* cpp_arg = new TlsCredentialReloadArg(arg);
-  int schedule_result = cpp_config->Schedule(cpp_arg);
-  return schedule_result;
-}
-
-void TlsCredentialReloadConfigCCancel(void* /*config_user_data*/,
-                                      grpc_tls_credential_reload_arg* arg) {
-  if (arg == nullptr || arg->config == nullptr ||
-      arg->config->context() == nullptr) {
-    gpr_log(GPR_ERROR, "credential reload arg was not properly initialized");
-    return;
-  }
-  if (arg->context == nullptr) {
-    gpr_log(GPR_ERROR, "credential reload arg schedule has already completed");
-    return;
-  }
-  TlsCredentialReloadConfig* cpp_config =
-      static_cast<TlsCredentialReloadConfig*>(arg->config->context());
-  TlsCredentialReloadArg* cpp_arg =
-      static_cast<TlsCredentialReloadArg*>(arg->context);
-  cpp_config->Cancel(cpp_arg);
-}
-
-void TlsCredentialReloadArgDestroyContext(void* context) {
-  if (context != nullptr) {
-    TlsCredentialReloadArg* cpp_arg =
-        static_cast<TlsCredentialReloadArg*>(context);
-    delete cpp_arg;
-  }
-}
-
 /** The C schedule and cancel functions for the server authorization check
  * config. They populate a C server authorization check arg with the result
  * of a C++ server authorization check schedule/cancel API. **/
index 4ee04d1..d624721 100644 (file)
 namespace grpc {
 namespace experimental {
 
-/** The following function is exposed for testing purposes. **/
-grpc_tls_key_materials_config* ConvertToCKeyMaterialsConfig(
-    const std::shared_ptr<TlsKeyMaterialsConfig>& config);
-
-/** The following 4 functions convert the user-provided schedule or cancel
+/** The following 2 functions convert the user-provided schedule or cancel
  *  functions into C style schedule or cancel functions. These are internal
  *  functions, not meant to be accessed by the user. **/
-int TlsCredentialReloadConfigCSchedule(void* config_user_data,
-                                       grpc_tls_credential_reload_arg* arg);
-
-void TlsCredentialReloadConfigCCancel(void* config_user_data,
-                                      grpc_tls_credential_reload_arg* arg);
-
 int TlsServerAuthorizationCheckConfigCSchedule(
     void* config_user_data, grpc_tls_server_authorization_check_arg* arg);
 
 void TlsServerAuthorizationCheckConfigCCancel(
     void* config_user_data, grpc_tls_server_authorization_check_arg* arg);
 
-/** The following 2 functions cleanup data created in the above C schedule
- *  functions. **/
-void TlsCredentialReloadArgDestroyContext(void* context);
-
 void TlsServerAuthorizationCheckArgDestroyContext(void* context);
 
 }  //  namespace experimental
index cc0f9f0..f8315d6 100644 (file)
@@ -22,5 +22,5 @@
 #include <grpcpp/grpcpp.h>
 
 namespace grpc {
-std::string Version() { return "1.33.2"; }
+std::string Version() { return "1.34.0"; }
 }  // namespace grpc
index c9d4ad6..0c945b5 100644 (file)
 #include <grpc/support/port_platform.h>
 
 #include <grpc/status.h>
+
 #include "absl/memory/memory.h"
 #include "absl/strings/string_view.h"
 #include "absl/strings/strip.h"
+
 #include "opencensus/context/context.h"
 #include "opencensus/tags/tag_map.h"
 #include "opencensus/trace/context_util.h"
 #include "opencensus/trace/span.h"
 #include "opencensus/trace/span_context.h"
 #include "opencensus/trace/trace_params.h"
+
 #include "src/core/lib/slice/slice_internal.h"
 #include "src/cpp/common/channel_filter.h"
 #include "src/cpp/ext/filters/census/rpc_encoding.h"
index 14f2481..1fb7c90 100644 (file)
 #include "opencensus/stats/stats.h"
 #include "opencensus/tags/tag_key.h"
 
-namespace grpc_impl {
-class ServerContext;
-}
-
 namespace grpc {
 
 // The tag keys set when recording RPC stats.
index 3df372f..29ecef0 100644 (file)
@@ -28,7 +28,6 @@ using grpc::StatusCode;
 using grpc::reflection::v1alpha::ErrorResponse;
 using grpc::reflection::v1alpha::ExtensionNumberResponse;
 using grpc::reflection::v1alpha::ExtensionRequest;
-using grpc::reflection::v1alpha::FileDescriptorResponse;
 using grpc::reflection::v1alpha::ListServiceResponse;
 using grpc::reflection::v1alpha::ServerReflectionRequest;
 using grpc::reflection::v1alpha::ServerReflectionResponse;
index a8e5e52..680b0ee 100644 (file)
@@ -27,10 +27,10 @@ std::unique_ptr<ServerBuilderOption> MakeChannelArgumentOption(
     StringOption(const std::string& name, const std::string& value)
         : name_(name), value_(value) {}
 
-    virtual void UpdateArguments(ChannelArguments* args) override {
+    void UpdateArguments(ChannelArguments* args) override {
       args->SetString(name_, value_);
     }
-    virtual void UpdatePlugins(
+    void UpdatePlugins(
         std::vector<std::unique_ptr<ServerBuilderPlugin>>* /*plugins*/)
         override {}
 
@@ -48,10 +48,10 @@ std::unique_ptr<ServerBuilderOption> MakeChannelArgumentOption(
     IntOption(const std::string& name, int value)
         : name_(name), value_(value) {}
 
-    virtual void UpdateArguments(ChannelArguments* args) override {
+    void UpdateArguments(ChannelArguments* args) override {
       args->SetInt(name_, value_);
     }
-    virtual void UpdatePlugins(
+    void UpdatePlugins(
         std::vector<std::unique_ptr<ServerBuilderPlugin>>* /*plugins*/)
         override {}
 
index 40bbdfe..e2e9495 100644 (file)
@@ -67,13 +67,6 @@ CreateChannelzServicePlugin() {
       new ChannelzServicePlugin());
 }
 
-}  // namespace experimental
-}  // namespace channelz
-}  // namespace grpc
-namespace grpc_impl {
-namespace channelz {
-namespace experimental {
-
 void InitChannelzService() {
   static struct Initializer {
     Initializer() {
@@ -85,4 +78,4 @@ void InitChannelzService() {
 
 }  // namespace experimental
 }  // namespace channelz
-}  // namespace grpc_impl
+}  // namespace grpc
index 77c5d6a..4131dc6 100644 (file)
@@ -27,11 +27,12 @@ namespace grpc {
 
 DynamicThreadPool::DynamicThread::DynamicThread(DynamicThreadPool* pool)
     : pool_(pool),
-      thd_("grpcpp_dynamic_pool",
-           [](void* th) {
-             static_cast<DynamicThreadPool::DynamicThread*>(th)->ThreadFunc();
-           },
-           this) {
+      thd_(
+          "grpcpp_dynamic_pool",
+          [](void* th) {
+            static_cast<DynamicThreadPool::DynamicThread*>(th)->ThreadFunc();
+          },
+          this) {
   thd_.Start();
 }
 DynamicThreadPool::DynamicThread::~DynamicThread() { thd_.Join(); }
index 6f9f943..3bc7b67 100644 (file)
@@ -34,7 +34,7 @@ namespace grpc {
 class DynamicThreadPool final : public ThreadPoolInterface {
  public:
   explicit DynamicThreadPool(int reserve_threads);
-  ~DynamicThreadPool();
+  ~DynamicThreadPool() override;
 
   void Add(const std::function<void()>& callback) override;
 
index 405ce1c..2ba2e8c 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <memory>
 
+#include "absl/memory/memory.h"
 #include "upb/upb.hpp"
 
 #include <grpc/slice.h>
@@ -114,7 +115,7 @@ DefaultHealthCheckService::HealthCheckServiceImpl*
 DefaultHealthCheckService::GetHealthCheckService(
     std::unique_ptr<ServerCompletionQueue> cq) {
   GPR_ASSERT(impl_ == nullptr);
-  impl_.reset(new HealthCheckServiceImpl(this, std::move(cq)));
+  impl_ = absl::make_unique<HealthCheckServiceImpl>(this, std::move(cq));
   return impl_.get();
 }
 
@@ -160,8 +161,8 @@ DefaultHealthCheckService::HealthCheckServiceImpl::HealthCheckServiceImpl(
   AddMethod(new internal::RpcServiceMethod(
       kHealthWatchMethodName, internal::RpcMethod::SERVER_STREAMING, nullptr));
   // Create serving thread.
-  thread_ = std::unique_ptr<::grpc_core::Thread>(
-      new ::grpc_core::Thread("grpc_health_check_service", Serve, this));
+  thread_ = absl::make_unique<::grpc_core::Thread>("grpc_health_check_service",
+                                                   Serve, this);
 }
 
 DefaultHealthCheckService::HealthCheckServiceImpl::~HealthCheckServiceImpl() {
index 0d4b60e..e62189b 100644 (file)
@@ -56,7 +56,7 @@ class DefaultHealthCheckService final : public HealthCheckServiceInterface {
     HealthCheckServiceImpl(DefaultHealthCheckService* database,
                            std::unique_ptr<ServerCompletionQueue> cq);
 
-    ~HealthCheckServiceImpl();
+    ~HealthCheckServiceImpl() override;
 
     void StartServingThread();
 
index 00ad794..dc9fade 100644 (file)
@@ -21,6 +21,8 @@
 
 #include <grpc/impl/codegen/port_platform.h>
 
+#include <stddef.h>
+
 namespace grpc {
 namespace load_reporter {
 
index f536d25..003192c 100644 (file)
@@ -43,7 +43,7 @@ bool UnorderedMapOfSetEraseKeyValue(std::unordered_map<K, std::set<V>>& map,
   auto it = map.find(key);
   if (it != map.end()) {
     size_t erased = it->second.erase(value);
-    if (it->second.size() == 0) {
+    if (it->second.empty()) {
       map.erase(it);
     }
     return erased;
index 7881f85..2ef1b49 100644 (file)
@@ -431,7 +431,7 @@ void LoadReporter::ProcessViewDataCallEnd(
       // This is due to a bug reported internally of Java server load reporting
       // implementation.
       // TODO(juanlishen): Check whether this situation happens in OSS C++.
-      if (client_ip_and_token.size() == 0) {
+      if (client_ip_and_token.empty()) {
         gpr_log(GPR_DEBUG,
                 "Skipping processing Opencensus record with empty "
                 "client_ip_and_token tag.");
index 5feac23..47ef526 100644 (file)
@@ -18,6 +18,8 @@
 
 #include <grpc/support/port_platform.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/cpp/server/load_reporter/load_reporter_async_service_impl.h"
 
 namespace grpc {
@@ -32,16 +34,16 @@ void LoadReporterAsyncServiceImpl::CallableTag::Run(bool ok) {
 LoadReporterAsyncServiceImpl::LoadReporterAsyncServiceImpl(
     std::unique_ptr<ServerCompletionQueue> cq)
     : cq_(std::move(cq)) {
-  thread_ = std::unique_ptr<::grpc_core::Thread>(
-      new ::grpc_core::Thread("server_load_reporting", Work, this));
+  thread_ = absl::make_unique<::grpc_core::Thread>("server_load_reporting",
+                                                   Work, this);
   std::unique_ptr<CpuStatsProvider> cpu_stats_provider = nullptr;
 #if defined(GPR_LINUX) || defined(GPR_WINDOWS) || defined(GPR_APPLE)
-  cpu_stats_provider.reset(new CpuStatsProviderDefaultImpl());
+  cpu_stats_provider = absl::make_unique<CpuStatsProviderDefaultImpl>();
 #endif
-  load_reporter_ = std::unique_ptr<LoadReporter>(new LoadReporter(
+  load_reporter_ = absl::make_unique<LoadReporter>(
       kFeedbackSampleWindowSeconds,
       std::unique_ptr<CensusViewProvider>(new CensusViewProviderDefaultImpl()),
-      std::move(cpu_stats_provider)));
+      std::move(cpu_stats_provider));
 }
 
 LoadReporterAsyncServiceImpl::~LoadReporterAsyncServiceImpl() {
@@ -51,8 +53,9 @@ LoadReporterAsyncServiceImpl::~LoadReporterAsyncServiceImpl() {
     grpc_core::MutexLock lock(&cq_shutdown_mu_);
     cq_->Shutdown();
   }
-  if (next_fetch_and_sample_alarm_ != nullptr)
+  if (next_fetch_and_sample_alarm_ != nullptr) {
     next_fetch_and_sample_alarm_->Cancel();
+  }
   thread_->Join();
 }
 
@@ -66,7 +69,7 @@ void LoadReporterAsyncServiceImpl::ScheduleNextFetchAndSample() {
     if (shutdown_) return;
     // TODO(juanlishen): Improve the Alarm implementation to reuse a single
     // instance for multiple events.
-    next_fetch_and_sample_alarm_.reset(new Alarm);
+    next_fetch_and_sample_alarm_ = absl::make_unique<Alarm>();
     next_fetch_and_sample_alarm_->Set(cq_.get(), next_fetch_and_sample_time,
                                       this);
   }
@@ -266,7 +269,7 @@ void LoadReporterAsyncServiceImpl::ReportLoadHandler::ScheduleNextReport(
                     std::move(self));
     // TODO(juanlishen): Improve the Alarm implementation to reuse a single
     // instance for multiple events.
-    next_report_alarm_.reset(new Alarm);
+    next_report_alarm_ = absl::make_unique<Alarm>();
     next_report_alarm_->Set(cq_, next_report_time, &next_outbound_);
   }
   gpr_log(GPR_DEBUG,
@@ -358,6 +361,7 @@ void LoadReporterAsyncServiceImpl::ReportLoadHandler::Shutdown(
 }
 
 void LoadReporterAsyncServiceImpl::ReportLoadHandler::OnFinishDone(
+    // NOLINTNEXTLINE(performance-unnecessary-value-param)
     std::shared_ptr<ReportLoadHandler> self, bool ok) {
   if (ok) {
     gpr_log(GPR_INFO,
index 969e20f..d845295 100644 (file)
@@ -41,7 +41,7 @@ class LoadReporterAsyncServiceImpl
  public:
   explicit LoadReporterAsyncServiceImpl(
       std::unique_ptr<ServerCompletionQueue> cq);
-  ~LoadReporterAsyncServiceImpl();
+  ~LoadReporterAsyncServiceImpl() override;
 
   // Starts the working thread.
   void StartThread();
index 89b3c68..25a46ed 100644 (file)
@@ -145,8 +145,7 @@ std::shared_ptr<ServerCredentials> LocalServerCredentials(
 }
 
 std::shared_ptr<ServerCredentials> TlsServerCredentials(
-    const grpc::experimental::TlsCredentialsOptions& options) {
-  grpc::GrpcLibraryCodegen init;
+    const grpc::experimental::TlsServerCredentialsOptions& options) {
   return std::shared_ptr<ServerCredentials>(new SecureServerCredentials(
       grpc_tls_server_credentials_create(options.c_credentials_options())));
 }
index 40aef8e..f6b72c0 100644 (file)
@@ -35,14 +35,14 @@ void ServerCallbackCall::ScheduleOnDone(bool inline_ondone) {
       grpc_closure closure;
       ServerCallbackCall* call;
       explicit ClosureWithArg(ServerCallbackCall* call_arg) : call(call_arg) {
-        GRPC_CLOSURE_INIT(&closure,
-                          [](void* void_arg, grpc_error*) {
-                            ClosureWithArg* arg =
-                                static_cast<ClosureWithArg*>(void_arg);
-                            arg->call->CallOnDone();
-                            delete arg;
-                          },
-                          this, grpc_schedule_on_exec_ctx);
+        GRPC_CLOSURE_INIT(
+            &closure,
+            [](void* void_arg, grpc_error*) {
+              ClosureWithArg* arg = static_cast<ClosureWithArg*>(void_arg);
+              arg->call->CallOnDone();
+              delete arg;
+            },
+            this, grpc_schedule_on_exec_ctx);
       }
     };
     ClosureWithArg* arg = new ClosureWithArg(this);
@@ -64,15 +64,15 @@ void ServerCallbackCall::CallOnCancel(ServerReactor* reactor) {
       ServerReactor* reactor;
       ClosureWithArg(ServerCallbackCall* call_arg, ServerReactor* reactor_arg)
           : call(call_arg), reactor(reactor_arg) {
-        GRPC_CLOSURE_INIT(&closure,
-                          [](void* void_arg, grpc_error*) {
-                            ClosureWithArg* arg =
-                                static_cast<ClosureWithArg*>(void_arg);
-                            arg->reactor->OnCancel();
-                            arg->call->MaybeDone();
-                            delete arg;
-                          },
-                          this, grpc_schedule_on_exec_ctx);
+        GRPC_CLOSURE_INIT(
+            &closure,
+            [](void* void_arg, grpc_error*) {
+              ClosureWithArg* arg = static_cast<ClosureWithArg*>(void_arg);
+              arg->reactor->OnCancel();
+              arg->call->MaybeDone();
+              delete arg;
+            },
+            this, grpc_schedule_on_exec_ctx);
       }
     };
     ClosureWithArg* arg = new ClosureWithArg(this, reactor);
index 361a087..dca828d 100644 (file)
@@ -42,6 +42,8 @@
 #include <grpcpp/server_context.h>
 #include <grpcpp/support/time.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/core/ext/transport/inproc/inproc_transport.h"
 #include "src/core/lib/iomgr/exec_ctx.h"
 #include "src/core/lib/profiling/timers.h"
@@ -81,12 +83,16 @@ void InitGlobalCallbacks() {
 
 class ShutdownTag : public internal::CompletionQueueTag {
  public:
-  bool FinalizeResult(void** /*tag*/, bool* /*status*/) { return false; }
+  bool FinalizeResult(void** /*tag*/, bool* /*status*/) override {
+    return false;
+  }
 };
 
 class DummyTag : public internal::CompletionQueueTag {
  public:
-  bool FinalizeResult(void** /*tag*/, bool* /*status*/) { return true; }
+  bool FinalizeResult(void** /*tag*/, bool* /*status*/) override {
+    return true;
+  }
 };
 
 class UnimplementedAsyncRequestContext {
@@ -310,7 +316,7 @@ class Server::UnimplementedAsyncResponse final
           grpc::internal::CallOpServerSendStatus> {
  public:
   UnimplementedAsyncResponse(UnimplementedAsyncRequest* request);
-  ~UnimplementedAsyncResponse() { delete request_; }
+  ~UnimplementedAsyncResponse() override { delete request_; }
 
   bool FinalizeResult(void** tag, bool* status) override {
     if (grpc::internal::CallOpSet<
@@ -343,7 +349,7 @@ class Server::SyncRequest final : public grpc::internal::CompletionQueueTag {
     grpc_metadata_array_init(&request_metadata_);
   }
 
-  ~SyncRequest() {
+  ~SyncRequest() override {
     if (call_details_) {
       delete call_details_;
     }
@@ -567,7 +573,7 @@ class Server::CallbackRequest final
     data->details = call_details_;
   }
 
-  ~CallbackRequest() {
+  ~CallbackRequest() override {
     delete call_details_;
     grpc_metadata_array_destroy(&request_metadata_);
     if (has_request_payload_ && request_payload_) {
@@ -810,9 +816,9 @@ class Server::SyncRequestThreadManager : public grpc::ThreadManager {
 
   void AddUnknownSyncMethod() {
     if (!sync_requests_.empty()) {
-      unknown_method_.reset(new grpc::internal::RpcServiceMethod(
+      unknown_method_ = absl::make_unique<grpc::internal::RpcServiceMethod>(
           "unknown", grpc::internal::RpcMethod::BIDI_STREAMING,
-          new grpc::internal::UnknownMethodHandler));
+          new grpc::internal::UnknownMethodHandler);
       sync_requests_.emplace_back(
           new SyncRequest(unknown_method_.get(), nullptr));
     }
@@ -1014,7 +1020,7 @@ bool Server::RegisterService(const std::string* host, grpc::Service* service) {
   const char* method_name = nullptr;
 
   for (const auto& method : service->methods_) {
-    if (method.get() == nullptr) {  // Handled by generic service if any.
+    if (method == nullptr) {  // Handled by generic service if any.
       continue;
     }
 
@@ -1155,7 +1161,7 @@ void Server::Start(grpc::ServerCompletionQueue** cqs, size_t num_cqs) {
   // service to handle any unimplemented methods using the default reactor
   // creator
   if (has_callback_methods_ && !has_callback_generic_service_) {
-    unimplemented_service_.reset(new grpc::CallbackGenericService);
+    unimplemented_service_ = absl::make_unique<grpc::CallbackGenericService>();
     RegisterCallbackGenericService(unimplemented_service_.get());
   }
 
@@ -1186,8 +1192,8 @@ void Server::Start(grpc::ServerCompletionQueue** cqs, size_t num_cqs) {
   // server CQs), make sure that we have a ResourceExhausted handler
   // to deal with the case of thread exhaustion
   if (sync_server_cqs_ != nullptr && !sync_server_cqs_->empty()) {
-    resource_exhausted_handler_.reset(
-        new grpc::internal::ResourceExhaustedHandler);
+    resource_exhausted_handler_ =
+        absl::make_unique<grpc::internal::ResourceExhaustedHandler>();
   }
 
   for (const auto& value : sync_req_mgrs_) {
index 9cd6b2a..f3cb004 100644 (file)
@@ -62,7 +62,7 @@ class ServerContextBase::CompletionOp final
   CompletionOp(CompletionOp&&) = delete;
   CompletionOp& operator=(CompletionOp&&) = delete;
 
-  ~CompletionOp() {
+  ~CompletionOp() override {
     if (call_.server_rpc_info()) {
       call_.server_rpc_info()->Unref();
     }
index 7127cc4..b7c04de 100644 (file)
@@ -1,3 +1,4 @@
 <Project>
   <Import Project="build\dependencies.props" />
+  <Import Project="build\common.props" />
 </Project>
\ No newline at end of file
diff --git a/src/csharp/Directory.Build.targets b/src/csharp/Directory.Build.targets
new file mode 100644 (file)
index 0000000..29026d1
--- /dev/null
@@ -0,0 +1,9 @@
+<Project>
+  <!-- Needed for the net45 build to work on Unix. See https://github.com/dotnet/designs/pull/33 -->
+  <ItemGroup>
+    <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0">
+      <PrivateAssets>all</PrivateAssets>
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
+    </PackageReference>
+  </ItemGroup>
+</Project>
\ No newline at end of file
index b3ffe35..89b7aa7 100644 (file)
@@ -101,7 +101,7 @@ namespace Grpc.Auth
         /// </summary>
         private static Task GetCompletedTask()
         {
-#if NETSTANDARD1_5 || NETSTANDARD2_0
+#if NETSTANDARD
             return Task.CompletedTask;
 #else
             return Task.FromResult<object>(null);  // for .NET45, emulate the functionality
index a6f70ea..dcc9d56 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <Authors>The gRPC Authors</Authors>
     <Copyright>Copyright 2015 The gRPC Authors</Copyright>
index ae6bea8..2acd1d7 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <Authors>The gRPC Authors</Authors>
     <Copyright>Copyright 2019 The gRPC Authors</Copyright>
index 22060f4..e727bf9 100644 (file)
@@ -33,11 +33,11 @@ namespace Grpc.Core
         /// <summary>
         /// Current <c>AssemblyFileVersion</c> of gRPC C# assemblies
         /// </summary>
-        public const string CurrentAssemblyFileVersion = "2.33.2.0";
+        public const string CurrentAssemblyFileVersion = "2.34.0.0";
 
         /// <summary>
         /// Current version of gRPC C#
         /// </summary>
-        public const string CurrentVersion = "2.33.2";
+        public const string CurrentVersion = "2.34.0";
     }
 }
index a8b1303..f2b7738 100644 (file)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <Authors>The gRPC Authors</Authors>
     <Copyright>Copyright 2015 The gRPC Authors</Copyright>
 
   <ItemGroup>
     <None Include="..\nativelibs\csharp_ext_windows_x86\grpc_csharp_ext.dll">
-      <PackagePath>runtimes/win/native/grpc_csharp_ext.x86.dll</PackagePath>
+      <PackagePath>runtimes/win-x86/native/grpc_csharp_ext.x86.dll</PackagePath>
       <Pack>true</Pack>
     </None>
     <None Include="..\nativelibs\csharp_ext_windows_x86\grpc_csharp_ext.pdb">
-      <PackagePath>runtimes/win/native/grpc_csharp_ext.x86.pdb</PackagePath>
+      <PackagePath>runtimes/win-x86/native/grpc_csharp_ext.x86.pdb</PackagePath>
       <Pack>true</Pack>
     </None>
     <None Include="..\nativelibs\csharp_ext_windows_x64\grpc_csharp_ext.dll">
-      <PackagePath>runtimes/win/native/grpc_csharp_ext.x64.dll</PackagePath>
+      <PackagePath>runtimes/win-x64/native/grpc_csharp_ext.x64.dll</PackagePath>
       <Pack>true</Pack>
     </None>
     <None Include="..\nativelibs\csharp_ext_windows_x64\grpc_csharp_ext.pdb">
-      <PackagePath>runtimes/win/native/grpc_csharp_ext.x64.pdb</PackagePath>
+      <PackagePath>runtimes/win-x64/native/grpc_csharp_ext.x64.pdb</PackagePath>
       <Pack>true</Pack>
     </None>
   </ItemGroup>
index 3cd36d4..e9809d7 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <Authors>The gRPC Authors</Authors>
     <Description>Miscellaneous code for testing Grpc.Core</Description>
index 1aa314f..b5f58c4 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
diff --git a/src/csharp/Grpc.Core.Xamarin/.gitignore b/src/csharp/Grpc.Core.Xamarin/.gitignore
new file mode 100644 (file)
index 0000000..1746e32
--- /dev/null
@@ -0,0 +1,2 @@
+bin
+obj
diff --git a/src/csharp/Grpc.Core.Xamarin/Grpc.Core.Xamarin.csproj b/src/csharp/Grpc.Core.Xamarin/Grpc.Core.Xamarin.csproj
new file mode 100644 (file)
index 0000000..277a1a4
--- /dev/null
@@ -0,0 +1,58 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <Authors>The gRPC Authors</Authors>
+    <Copyright>Copyright 2015 The gRPC Authors</Copyright>
+    <Description>Xamarin support for gRPC C#. Note that the gRPC C# support for the Xamarin platform is considered experimental.
+    This package contains the native grpc_csharp_ext libraries that are needed to run gRPC C# on mobile platforms (Android, iOS).
+    WARNING: Versions of Grpc.Core.Xamarin and Grpc.Core dependencies being used in your project must always match exactly, otherwise
+    things will be badly broken.</Description>
+    <PackageIconUrl>https://github.com/grpc/grpc.github.io/raw/master/img/grpc_square_reverse_4x.png</PackageIconUrl>
+    <PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
+    <PackageProjectUrl>https://github.com/grpc/grpc</PackageProjectUrl>
+    <PackageTags>gRPC RPC HTTP/2</PackageTags>
+    <VersionPrefix>$(GrpcCsharpVersion)</VersionPrefix>
+  </PropertyGroup>
+
+  <PropertyGroup>
+    <TargetFrameworks>net45;netstandard1.5;netstandard2.0</TargetFrameworks>
+    <GenerateDocumentationFile>true</GenerateDocumentationFile>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+  </PropertyGroup>
+
+  <Import Project="..\Grpc.Core\SourceLink.csproj.include" />
+
+  <ItemGroup>
+    <Content Include="..\nativelibs\csharp_ext_linux_android_armeabi-v7a\libgrpc_csharp_ext.so">
+      <PackagePath>native/android/armeabi-v7a/libgrpc_csharp_ext.so</PackagePath>
+      <Pack>true</Pack>
+    </Content>
+    <Content Include="..\nativelibs\csharp_ext_linux_android_arm64-v8a\libgrpc_csharp_ext.so">
+      <PackagePath>native/android/arm64-v8a/libgrpc_csharp_ext.so</PackagePath>
+      <Pack>true</Pack>
+    </Content>
+    <Content Include="..\nativelibs\csharp_ext_linux_android_x86\libgrpc_csharp_ext.so">
+      <PackagePath>native/android/x86/libgrpc_csharp_ext.so</PackagePath>
+      <Pack>true</Pack>
+    </Content>
+    <Content Include="..\nativelibs\csharp_ext_macos_ios\libgrpc_csharp_ext.a">
+      <PackagePath>native/ios/universal/libgrpc_csharp_ext.a</PackagePath>
+      <Pack>true</Pack>
+    </Content>
+    <Content Include="..\nativelibs\csharp_ext_macos_ios\libgrpc.a">
+      <PackagePath>native/ios/universal/libgrpc.a</PackagePath>
+      <Pack>true</Pack>
+    </Content>
+    <Content Include="build\MonoAndroid10\Grpc.Core.Xamarin.targets">
+      <PackagePath>build/MonoAndroid10/</PackagePath>
+      <Pack>true</Pack>
+    </Content>
+    <Content Include="build\Xamarin.iOS10\Grpc.Core.Xamarin.targets">
+      <PackagePath>build/Xamarin.iOS10/</PackagePath>
+      <Pack>true</Pack>
+    </Content>
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="../Grpc.Core/Grpc.Core.csproj" />
+  </ItemGroup>
+</Project>
diff --git a/src/csharp/Grpc.Core.Xamarin/Internal.cs b/src/csharp/Grpc.Core.Xamarin/Internal.cs
new file mode 100644 (file)
index 0000000..abd18fe
--- /dev/null
@@ -0,0 +1,24 @@
+#region Copyright notice and license
+// Copyright 2020 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#endregion
+
+namespace Grpc.Core
+{
+
+    // Generate an empty assembly
+    internal static class UnusedClass
+    {
+    }
+}
index 561c3ed..b8f83be 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="Common.csproj.include" />
-
   <PropertyGroup>
     <Authors>The gRPC Authors</Authors>
     <Copyright>Copyright 2015 The gRPC Authors</Copyright>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 
-  <PropertyGroup>
-    <LangVersion>7.2</LangVersion>
-  </PropertyGroup>
-
   <ItemGroup>
     <Compile Include="..\Grpc.Core.Api\Version.cs" />
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="..\..\..\etc\roots.pem" />
     <Content Include="..\nativelibs\csharp_ext_macos_x64\libgrpc_csharp_ext.dylib">
-      <PackagePath>runtimes/osx/native/libgrpc_csharp_ext.x64.dylib</PackagePath>
-      <Pack>true</Pack>
-    </Content>
-    <Content Include="..\nativelibs\csharp_ext_macos_x86\libgrpc_csharp_ext.dylib">
-      <PackagePath>runtimes/osx/native/libgrpc_csharp_ext.x86.dylib</PackagePath>
+      <PackagePath>runtimes/osx-x64/native/libgrpc_csharp_ext.x64.dylib</PackagePath>
       <Pack>true</Pack>
     </Content>
     <Content Include="..\nativelibs\csharp_ext_linux_x64\libgrpc_csharp_ext.so">
-      <PackagePath>runtimes/linux/native/libgrpc_csharp_ext.x64.so</PackagePath>
-      <Pack>true</Pack>
-    </Content>
-    <Content Include="..\nativelibs\csharp_ext_linux_x86\libgrpc_csharp_ext.so">
-      <PackagePath>runtimes/linux/native/libgrpc_csharp_ext.x86.so</PackagePath>
+      <PackagePath>runtimes/linux-x64/native/libgrpc_csharp_ext.x64.so</PackagePath>
       <Pack>true</Pack>
     </Content>
     <Content Include="..\nativelibs\csharp_ext_windows_x64\grpc_csharp_ext.dll">
-      <PackagePath>runtimes/win/native/grpc_csharp_ext.x64.dll</PackagePath>
+      <PackagePath>runtimes/win-x64/native/grpc_csharp_ext.x64.dll</PackagePath>
       <Pack>true</Pack>
     </Content>
     <Content Include="..\nativelibs\csharp_ext_windows_x86\grpc_csharp_ext.dll">
-      <PackagePath>runtimes/win/native/grpc_csharp_ext.x86.dll</PackagePath>
-      <Pack>true</Pack>
-    </Content>
-    <Content Include="..\nativelibs\csharp_ext_linux_android_armeabi-v7a\libgrpc_csharp_ext.so">
-      <PackagePath>native/android/armeabi-v7a/libgrpc_csharp_ext.so</PackagePath>
-      <Pack>true</Pack>
-    </Content>
-    <Content Include="..\nativelibs\csharp_ext_linux_android_arm64-v8a\libgrpc_csharp_ext.so">
-      <PackagePath>native/android/arm64-v8a/libgrpc_csharp_ext.so</PackagePath>
-      <Pack>true</Pack>
-    </Content>
-    <Content Include="..\nativelibs\csharp_ext_linux_android_x86\libgrpc_csharp_ext.so">
-      <PackagePath>native/android/x86/libgrpc_csharp_ext.so</PackagePath>
-      <Pack>true</Pack>
-    </Content>
-    <Content Include="..\nativelibs\csharp_ext_macos_ios\libgrpc_csharp_ext.a">
-      <PackagePath>native/ios/universal/libgrpc_csharp_ext.a</PackagePath>
-      <Pack>true</Pack>
-    </Content>
-    <Content Include="..\nativelibs\csharp_ext_macos_ios\libgrpc.a">
-      <PackagePath>native/ios/universal/libgrpc.a</PackagePath>
+      <PackagePath>runtimes/win-x86/native/grpc_csharp_ext.x86.dll</PackagePath>
       <Pack>true</Pack>
     </Content>
     <Content Include="build\net45\Grpc.Core.targets">
       <PackagePath>build/net45/</PackagePath>
       <Pack>true</Pack>
     </Content>
-    <Content Include="build\MonoAndroid10\Grpc.Core.targets">
-      <PackagePath>build/MonoAndroid10/</PackagePath>
-      <Pack>true</Pack>
-    </Content>
-    <Content Include="build\Xamarin.iOS10\Grpc.Core.targets">
-      <PackagePath>build/Xamarin.iOS10/</PackagePath>
-      <Pack>true</Pack>
-    </Content>
   </ItemGroup>
 
   <ItemGroup>
index 3c83b03..ef9e700 100644 (file)
@@ -448,7 +448,7 @@ namespace Grpc.Core
                         // the gRPC channels and servers before the application exits. The following
                         // hooks provide some extra handling for cases when this is not the case,
                         // in the effort to achieve a reasonable behavior on shutdown.
-#if NETSTANDARD1_5 || NETSTANDARD2_0
+#if NETSTANDARD
                         // No action required at shutdown on .NET Core
                         // - In-progress P/Invoke calls (such as grpc_completion_queue_next) don't seem
                         //   to prevent a .NET core application from terminating, so no special handling
index 9456503..7528ffa 100644 (file)
@@ -80,28 +80,25 @@ namespace Grpc.Core.Internal
         /// <summary>
         /// Detects which configuration of native extension to load and load it.
         /// </summary>
-        private static UnmanagedLibrary LoadUnmanagedLibrary()
+        private static NativeMethods LoadNativeMethodsLegacyNetFramework()
         {
             // TODO: allow customizing path to native extension (possibly through exposing a GrpcEnvironment property).
             // See https://github.com/grpc/grpc/pull/7303 for one option.
-            var assemblyDirectory = Path.GetDirectoryName(GetAssemblyPath());
+            var assemblyDirectory = GetAssemblyDirectory();
 
             // With "classic" VS projects, the native libraries get copied using a .targets rule to the build output folder
             // alongside the compiled assembly.
-            // With dotnet cli projects targeting net45 framework, the native libraries (just the required ones)
-            // are similarly copied to the built output folder, through the magic of Microsoft.NETCore.Platforms.
             var classicPath = Path.Combine(assemblyDirectory, GetNativeLibraryFilename());
 
-            // With dotnet cli project targeting netcoreappX.Y, projects will use Grpc.Core assembly directly in the location where it got restored
-            // by nuget. We locate the native libraries based on known structure of Grpc.Core nuget package.
-            // When "dotnet publish" is used, the runtimes directory is copied next to the published assemblies.
-            string runtimesDirectory = string.Format("runtimes/{0}/native", GetPlatformString());
-            var netCorePublishedAppStylePath = Path.Combine(assemblyDirectory, runtimesDirectory, GetNativeLibraryFilename());
-            var netCoreAppStylePath = Path.Combine(assemblyDirectory, "../..", runtimesDirectory, GetNativeLibraryFilename());
-
             // Look for the native library in all possible locations in given order.
-            string[] paths = new[] { classicPath, netCorePublishedAppStylePath, netCoreAppStylePath};
-            return new UnmanagedLibrary(paths);
+            string[] paths = new[] { classicPath };
+
+            // TODO(jtattermusch): the UnmanagedLibrary mechanism for loading the native extension while avoiding
+            // direct use of DllImport is quite complicated and is currently only needed to cover some niche scenarios
+            // (such legacy .NET Framework projects that use assembly shadowing) - everything else can be covered
+            // by using the [DllImport]. We should investigate the possibility of eliminating UnmanagedLibrary completely
+            // in the future.
+            return new NativeMethods(new UnmanagedLibrary(paths));
         }
 
         /// <summary>
@@ -117,7 +114,43 @@ namespace Grpc.Core.Internal
             {
                 return LoadNativeMethodsXamarin();
             }
-            return new NativeMethods(LoadUnmanagedLibrary());
+            if (PlatformApis.IsNetCore)
+            {
+                // On .NET Core, native libraries are a supported feature and the SDK makes
+                // sure that the native library is made available in the right location and that
+                // they will be discoverable by the [DllImport] default loading mechanism,
+                // even in some of the more exotic situations such as single file apps.
+                //
+                // While in theory, we could just [DllImport("grpc_csharp_ext")] for all the platforms
+                // and operating systems, the native libraries in the nuget package
+                // need to be laid out in a way that still allows things to work well under
+                // the legacy .NET Framework (where native libraries are a concept unknown to the runtime).
+                // Therefore, we use several flavors of the DllImport attribute
+                // (e.g. the ".x86" vs ".x64" suffix) and we choose the one we want at runtime.
+                // The classes with the list of DllImport'd methods are code generated,
+                // so having more than just one doesn't really bother us.
+
+                // on Windows, the DllImport("grpc_csharp_ext.x64") doesn't work for some reason,
+                // but DllImport("grpc_csharp_ext.x64.dll") does, so we need a special case for that.
+                bool useDllSuffix = PlatformApis.IsWindows;
+                if (PlatformApis.Is64Bit)
+                {
+                    if (useDllSuffix)
+                    {
+                        return new NativeMethods(new NativeMethods.DllImportsFromSharedLib_x64_dll());
+                    }
+                    return new NativeMethods(new NativeMethods.DllImportsFromSharedLib_x64());
+                }
+                else
+                {
+                    if (useDllSuffix)
+                    {
+                        return new NativeMethods(new NativeMethods.DllImportsFromSharedLib_x86_dll());
+                    }
+                    return new NativeMethods(new NativeMethods.DllImportsFromSharedLib_x86());
+                }
+            }
+            return LoadNativeMethodsLegacyNetFramework();
         }
 
         /// <summary>
@@ -129,18 +162,20 @@ namespace Grpc.Core.Internal
         /// </summary>
         private static NativeMethods LoadNativeMethodsUnity()
         {
-            switch (PlatformApis.GetUnityRuntimePlatform())
+            if (PlatformApis.IsUnityIOS)
             {
-                case "IPhonePlayer":
-                    return new NativeMethods(new NativeMethods.DllImportsFromStaticLib());
-                default:
-                    // most other platforms load unity plugins as a shared library
-                    return new NativeMethods(new NativeMethods.DllImportsFromSharedLib());
+                return new NativeMethods(new NativeMethods.DllImportsFromStaticLib());
             }
+            // most other platforms load unity plugins as a shared library
+            return new NativeMethods(new NativeMethods.DllImportsFromSharedLib());
         }
 
         /// <summary>
         /// Return native method delegates when running on the Xamarin platform.
+        /// On Xamarin, the standard <c>[DllImport]</c> loading logic just works
+        /// as the native library metadata is provided by the <c>AndroidNativeLibrary</c> or
+        /// <c>NativeReference</c> items in the Xamarin projects (injected automatically
+        /// by the Grpc.Core.Xamarin nuget).
         /// WARNING: Xamarin support is experimental and work-in-progress. Don't expect it to work.
         /// </summary>
         private static NativeMethods LoadNativeMethodsXamarin()
@@ -149,17 +184,23 @@ namespace Grpc.Core.Internal
             {
                 return new NativeMethods(new NativeMethods.DllImportsFromSharedLib());
             }
-            // not tested yet
             return new NativeMethods(new NativeMethods.DllImportsFromStaticLib());
         }
 
-        private static string GetAssemblyPath()
+        private static string GetAssemblyDirectory()
         {
             var assembly = typeof(NativeExtension).GetTypeInfo().Assembly;
-#if NETSTANDARD1_5 || NETSTANDARD2_0
+#if NETSTANDARD
             // Assembly.EscapedCodeBase does not exist under CoreCLR, but assemblies imported from a nuget package
             // don't seem to be shadowed by DNX-based projects at all.
-            return assembly.Location;
+            var assemblyLocation = assembly.Location;
+            if (!string.IsNullOrEmpty(assemblyLocation))
+            {
+                return Path.GetDirectoryName(assemblyLocation);
+            }
+            // In .NET5 single-file deployments, assembly.Location won't be available
+            // Also see https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file#other-considerations
+            return AppContext.BaseDirectory;
 #else
             // If assembly is shadowed (e.g. in a webapp), EscapedCodeBase is pointing
             // to the original location of the assembly, and Location is pointing
@@ -169,32 +210,33 @@ namespace Grpc.Core.Internal
             var escapedCodeBase = assembly.EscapedCodeBase;
             if (IsFileUri(escapedCodeBase))
             {
-                return new Uri(escapedCodeBase).LocalPath;
+                return Path.GetDirectoryName(new Uri(escapedCodeBase).LocalPath);
             }
-            return assembly.Location;
+            return Path.GetDirectoryName(assembly.Location);
 #endif
         }
 
-#if !NETSTANDARD1_5 && !NETSTANDARD2_0
+#if !NETSTANDARD
         private static bool IsFileUri(string uri)
         {
             return uri.ToLowerInvariant().StartsWith(Uri.UriSchemeFile);
         }
 #endif
 
-        private static string GetPlatformString()
+        private static string GetRuntimeIdString()
         {
+            string architecture = GetArchitectureString();
             if (PlatformApis.IsWindows)
             {
-                return "win";
+                return string.Format("win-{0}", architecture);
             }
             if (PlatformApis.IsLinux)
             {
-                return "linux";
+                return string.Format("linux-{0}", architecture);
             }
             if (PlatformApis.IsMacOSX)
             {
-                return "osx";
+                return string.Format("osx-{0}", architecture);
             }
             throw new InvalidOperationException("Unsupported platform.");
         }
index 8b60268..9bc6a48 100644 (file)
@@ -465,6 +465,438 @@ namespace Grpc.Core.Internal
             this.grpcsharp_test_call_start_unary_echo = DllImportsFromSharedLib.grpcsharp_test_call_start_unary_echo;
         }
 
+        public NativeMethods(DllImportsFromSharedLib_x86 unusedInstance)
+        {
+            this.grpcsharp_init = DllImportsFromSharedLib_x86.grpcsharp_init;
+            this.grpcsharp_shutdown = DllImportsFromSharedLib_x86.grpcsharp_shutdown;
+            this.grpcsharp_version_string = DllImportsFromSharedLib_x86.grpcsharp_version_string;
+            this.grpcsharp_batch_context_create = DllImportsFromSharedLib_x86.grpcsharp_batch_context_create;
+            this.grpcsharp_batch_context_recv_initial_metadata = DllImportsFromSharedLib_x86.grpcsharp_batch_context_recv_initial_metadata;
+            this.grpcsharp_batch_context_recv_message_length = DllImportsFromSharedLib_x86.grpcsharp_batch_context_recv_message_length;
+            this.grpcsharp_batch_context_recv_message_next_slice_peek = DllImportsFromSharedLib_x86.grpcsharp_batch_context_recv_message_next_slice_peek;
+            this.grpcsharp_batch_context_recv_status_on_client_status = DllImportsFromSharedLib_x86.grpcsharp_batch_context_recv_status_on_client_status;
+            this.grpcsharp_batch_context_recv_status_on_client_details = DllImportsFromSharedLib_x86.grpcsharp_batch_context_recv_status_on_client_details;
+            this.grpcsharp_batch_context_recv_status_on_client_error_string = DllImportsFromSharedLib_x86.grpcsharp_batch_context_recv_status_on_client_error_string;
+            this.grpcsharp_batch_context_recv_status_on_client_trailing_metadata = DllImportsFromSharedLib_x86.grpcsharp_batch_context_recv_status_on_client_trailing_metadata;
+            this.grpcsharp_batch_context_recv_close_on_server_cancelled = DllImportsFromSharedLib_x86.grpcsharp_batch_context_recv_close_on_server_cancelled;
+            this.grpcsharp_batch_context_reset = DllImportsFromSharedLib_x86.grpcsharp_batch_context_reset;
+            this.grpcsharp_batch_context_destroy = DllImportsFromSharedLib_x86.grpcsharp_batch_context_destroy;
+            this.grpcsharp_request_call_context_create = DllImportsFromSharedLib_x86.grpcsharp_request_call_context_create;
+            this.grpcsharp_request_call_context_call = DllImportsFromSharedLib_x86.grpcsharp_request_call_context_call;
+            this.grpcsharp_request_call_context_method = DllImportsFromSharedLib_x86.grpcsharp_request_call_context_method;
+            this.grpcsharp_request_call_context_host = DllImportsFromSharedLib_x86.grpcsharp_request_call_context_host;
+            this.grpcsharp_request_call_context_deadline = DllImportsFromSharedLib_x86.grpcsharp_request_call_context_deadline;
+            this.grpcsharp_request_call_context_request_metadata = DllImportsFromSharedLib_x86.grpcsharp_request_call_context_request_metadata;
+            this.grpcsharp_request_call_context_reset = DllImportsFromSharedLib_x86.grpcsharp_request_call_context_reset;
+            this.grpcsharp_request_call_context_destroy = DllImportsFromSharedLib_x86.grpcsharp_request_call_context_destroy;
+            this.grpcsharp_composite_call_credentials_create = DllImportsFromSharedLib_x86.grpcsharp_composite_call_credentials_create;
+            this.grpcsharp_call_credentials_release = DllImportsFromSharedLib_x86.grpcsharp_call_credentials_release;
+            this.grpcsharp_call_cancel = DllImportsFromSharedLib_x86.grpcsharp_call_cancel;
+            this.grpcsharp_call_cancel_with_status = DllImportsFromSharedLib_x86.grpcsharp_call_cancel_with_status;
+            this.grpcsharp_call_start_unary = DllImportsFromSharedLib_x86.grpcsharp_call_start_unary;
+            this.grpcsharp_call_start_client_streaming = DllImportsFromSharedLib_x86.grpcsharp_call_start_client_streaming;
+            this.grpcsharp_call_start_server_streaming = DllImportsFromSharedLib_x86.grpcsharp_call_start_server_streaming;
+            this.grpcsharp_call_start_duplex_streaming = DllImportsFromSharedLib_x86.grpcsharp_call_start_duplex_streaming;
+            this.grpcsharp_call_send_message = DllImportsFromSharedLib_x86.grpcsharp_call_send_message;
+            this.grpcsharp_call_send_close_from_client = DllImportsFromSharedLib_x86.grpcsharp_call_send_close_from_client;
+            this.grpcsharp_call_send_status_from_server = DllImportsFromSharedLib_x86.grpcsharp_call_send_status_from_server;
+            this.grpcsharp_call_recv_message = DllImportsFromSharedLib_x86.grpcsharp_call_recv_message;
+            this.grpcsharp_call_recv_initial_metadata = DllImportsFromSharedLib_x86.grpcsharp_call_recv_initial_metadata;
+            this.grpcsharp_call_start_serverside = DllImportsFromSharedLib_x86.grpcsharp_call_start_serverside;
+            this.grpcsharp_call_send_initial_metadata = DllImportsFromSharedLib_x86.grpcsharp_call_send_initial_metadata;
+            this.grpcsharp_call_set_credentials = DllImportsFromSharedLib_x86.grpcsharp_call_set_credentials;
+            this.grpcsharp_call_get_peer = DllImportsFromSharedLib_x86.grpcsharp_call_get_peer;
+            this.grpcsharp_call_destroy = DllImportsFromSharedLib_x86.grpcsharp_call_destroy;
+            this.grpcsharp_channel_args_create = DllImportsFromSharedLib_x86.grpcsharp_channel_args_create;
+            this.grpcsharp_channel_args_set_string = DllImportsFromSharedLib_x86.grpcsharp_channel_args_set_string;
+            this.grpcsharp_channel_args_set_integer = DllImportsFromSharedLib_x86.grpcsharp_channel_args_set_integer;
+            this.grpcsharp_channel_args_destroy = DllImportsFromSharedLib_x86.grpcsharp_channel_args_destroy;
+            this.grpcsharp_override_default_ssl_roots = DllImportsFromSharedLib_x86.grpcsharp_override_default_ssl_roots;
+            this.grpcsharp_ssl_credentials_create = DllImportsFromSharedLib_x86.grpcsharp_ssl_credentials_create;
+            this.grpcsharp_composite_channel_credentials_create = DllImportsFromSharedLib_x86.grpcsharp_composite_channel_credentials_create;
+            this.grpcsharp_channel_credentials_release = DllImportsFromSharedLib_x86.grpcsharp_channel_credentials_release;
+            this.grpcsharp_insecure_channel_create = DllImportsFromSharedLib_x86.grpcsharp_insecure_channel_create;
+            this.grpcsharp_secure_channel_create = DllImportsFromSharedLib_x86.grpcsharp_secure_channel_create;
+            this.grpcsharp_channel_create_call = DllImportsFromSharedLib_x86.grpcsharp_channel_create_call;
+            this.grpcsharp_channel_check_connectivity_state = DllImportsFromSharedLib_x86.grpcsharp_channel_check_connectivity_state;
+            this.grpcsharp_channel_watch_connectivity_state = DllImportsFromSharedLib_x86.grpcsharp_channel_watch_connectivity_state;
+            this.grpcsharp_channel_get_target = DllImportsFromSharedLib_x86.grpcsharp_channel_get_target;
+            this.grpcsharp_channel_destroy = DllImportsFromSharedLib_x86.grpcsharp_channel_destroy;
+            this.grpcsharp_sizeof_grpc_event = DllImportsFromSharedLib_x86.grpcsharp_sizeof_grpc_event;
+            this.grpcsharp_completion_queue_create_async = DllImportsFromSharedLib_x86.grpcsharp_completion_queue_create_async;
+            this.grpcsharp_completion_queue_create_sync = DllImportsFromSharedLib_x86.grpcsharp_completion_queue_create_sync;
+            this.grpcsharp_completion_queue_shutdown = DllImportsFromSharedLib_x86.grpcsharp_completion_queue_shutdown;
+            this.grpcsharp_completion_queue_next = DllImportsFromSharedLib_x86.grpcsharp_completion_queue_next;
+            this.grpcsharp_completion_queue_pluck = DllImportsFromSharedLib_x86.grpcsharp_completion_queue_pluck;
+            this.grpcsharp_completion_queue_destroy = DllImportsFromSharedLib_x86.grpcsharp_completion_queue_destroy;
+            this.gprsharp_free = DllImportsFromSharedLib_x86.gprsharp_free;
+            this.grpcsharp_metadata_array_create = DllImportsFromSharedLib_x86.grpcsharp_metadata_array_create;
+            this.grpcsharp_metadata_array_add = DllImportsFromSharedLib_x86.grpcsharp_metadata_array_add;
+            this.grpcsharp_metadata_array_count = DllImportsFromSharedLib_x86.grpcsharp_metadata_array_count;
+            this.grpcsharp_metadata_array_get_key = DllImportsFromSharedLib_x86.grpcsharp_metadata_array_get_key;
+            this.grpcsharp_metadata_array_get_value = DllImportsFromSharedLib_x86.grpcsharp_metadata_array_get_value;
+            this.grpcsharp_metadata_array_destroy_full = DllImportsFromSharedLib_x86.grpcsharp_metadata_array_destroy_full;
+            this.grpcsharp_redirect_log = DllImportsFromSharedLib_x86.grpcsharp_redirect_log;
+            this.grpcsharp_native_callback_dispatcher_init = DllImportsFromSharedLib_x86.grpcsharp_native_callback_dispatcher_init;
+            this.grpcsharp_metadata_credentials_create_from_plugin = DllImportsFromSharedLib_x86.grpcsharp_metadata_credentials_create_from_plugin;
+            this.grpcsharp_metadata_credentials_notify_from_plugin = DllImportsFromSharedLib_x86.grpcsharp_metadata_credentials_notify_from_plugin;
+            this.grpcsharp_ssl_server_credentials_create = DllImportsFromSharedLib_x86.grpcsharp_ssl_server_credentials_create;
+            this.grpcsharp_server_credentials_release = DllImportsFromSharedLib_x86.grpcsharp_server_credentials_release;
+            this.grpcsharp_server_create = DllImportsFromSharedLib_x86.grpcsharp_server_create;
+            this.grpcsharp_server_register_completion_queue = DllImportsFromSharedLib_x86.grpcsharp_server_register_completion_queue;
+            this.grpcsharp_server_add_insecure_http2_port = DllImportsFromSharedLib_x86.grpcsharp_server_add_insecure_http2_port;
+            this.grpcsharp_server_add_secure_http2_port = DllImportsFromSharedLib_x86.grpcsharp_server_add_secure_http2_port;
+            this.grpcsharp_server_start = DllImportsFromSharedLib_x86.grpcsharp_server_start;
+            this.grpcsharp_server_request_call = DllImportsFromSharedLib_x86.grpcsharp_server_request_call;
+            this.grpcsharp_server_cancel_all_calls = DllImportsFromSharedLib_x86.grpcsharp_server_cancel_all_calls;
+            this.grpcsharp_server_shutdown_and_notify_callback = DllImportsFromSharedLib_x86.grpcsharp_server_shutdown_and_notify_callback;
+            this.grpcsharp_server_destroy = DllImportsFromSharedLib_x86.grpcsharp_server_destroy;
+            this.grpcsharp_call_auth_context = DllImportsFromSharedLib_x86.grpcsharp_call_auth_context;
+            this.grpcsharp_auth_context_peer_identity_property_name = DllImportsFromSharedLib_x86.grpcsharp_auth_context_peer_identity_property_name;
+            this.grpcsharp_auth_context_property_iterator = DllImportsFromSharedLib_x86.grpcsharp_auth_context_property_iterator;
+            this.grpcsharp_auth_property_iterator_next = DllImportsFromSharedLib_x86.grpcsharp_auth_property_iterator_next;
+            this.grpcsharp_auth_context_release = DllImportsFromSharedLib_x86.grpcsharp_auth_context_release;
+            this.grpcsharp_slice_buffer_create = DllImportsFromSharedLib_x86.grpcsharp_slice_buffer_create;
+            this.grpcsharp_slice_buffer_adjust_tail_space = DllImportsFromSharedLib_x86.grpcsharp_slice_buffer_adjust_tail_space;
+            this.grpcsharp_slice_buffer_slice_count = DllImportsFromSharedLib_x86.grpcsharp_slice_buffer_slice_count;
+            this.grpcsharp_slice_buffer_slice_peek = DllImportsFromSharedLib_x86.grpcsharp_slice_buffer_slice_peek;
+            this.grpcsharp_slice_buffer_reset_and_unref = DllImportsFromSharedLib_x86.grpcsharp_slice_buffer_reset_and_unref;
+            this.grpcsharp_slice_buffer_destroy = DllImportsFromSharedLib_x86.grpcsharp_slice_buffer_destroy;
+            this.gprsharp_now = DllImportsFromSharedLib_x86.gprsharp_now;
+            this.gprsharp_inf_future = DllImportsFromSharedLib_x86.gprsharp_inf_future;
+            this.gprsharp_inf_past = DllImportsFromSharedLib_x86.gprsharp_inf_past;
+            this.gprsharp_convert_clock_type = DllImportsFromSharedLib_x86.gprsharp_convert_clock_type;
+            this.gprsharp_sizeof_timespec = DllImportsFromSharedLib_x86.gprsharp_sizeof_timespec;
+            this.grpcsharp_test_callback = DllImportsFromSharedLib_x86.grpcsharp_test_callback;
+            this.grpcsharp_test_nop = DllImportsFromSharedLib_x86.grpcsharp_test_nop;
+            this.grpcsharp_test_override_method = DllImportsFromSharedLib_x86.grpcsharp_test_override_method;
+            this.grpcsharp_test_call_start_unary_echo = DllImportsFromSharedLib_x86.grpcsharp_test_call_start_unary_echo;
+        }
+
+        public NativeMethods(DllImportsFromSharedLib_x64 unusedInstance)
+        {
+            this.grpcsharp_init = DllImportsFromSharedLib_x64.grpcsharp_init;
+            this.grpcsharp_shutdown = DllImportsFromSharedLib_x64.grpcsharp_shutdown;
+            this.grpcsharp_version_string = DllImportsFromSharedLib_x64.grpcsharp_version_string;
+            this.grpcsharp_batch_context_create = DllImportsFromSharedLib_x64.grpcsharp_batch_context_create;
+            this.grpcsharp_batch_context_recv_initial_metadata = DllImportsFromSharedLib_x64.grpcsharp_batch_context_recv_initial_metadata;
+            this.grpcsharp_batch_context_recv_message_length = DllImportsFromSharedLib_x64.grpcsharp_batch_context_recv_message_length;
+            this.grpcsharp_batch_context_recv_message_next_slice_peek = DllImportsFromSharedLib_x64.grpcsharp_batch_context_recv_message_next_slice_peek;
+            this.grpcsharp_batch_context_recv_status_on_client_status = DllImportsFromSharedLib_x64.grpcsharp_batch_context_recv_status_on_client_status;
+            this.grpcsharp_batch_context_recv_status_on_client_details = DllImportsFromSharedLib_x64.grpcsharp_batch_context_recv_status_on_client_details;
+            this.grpcsharp_batch_context_recv_status_on_client_error_string = DllImportsFromSharedLib_x64.grpcsharp_batch_context_recv_status_on_client_error_string;
+            this.grpcsharp_batch_context_recv_status_on_client_trailing_metadata = DllImportsFromSharedLib_x64.grpcsharp_batch_context_recv_status_on_client_trailing_metadata;
+            this.grpcsharp_batch_context_recv_close_on_server_cancelled = DllImportsFromSharedLib_x64.grpcsharp_batch_context_recv_close_on_server_cancelled;
+            this.grpcsharp_batch_context_reset = DllImportsFromSharedLib_x64.grpcsharp_batch_context_reset;
+            this.grpcsharp_batch_context_destroy = DllImportsFromSharedLib_x64.grpcsharp_batch_context_destroy;
+            this.grpcsharp_request_call_context_create = DllImportsFromSharedLib_x64.grpcsharp_request_call_context_create;
+            this.grpcsharp_request_call_context_call = DllImportsFromSharedLib_x64.grpcsharp_request_call_context_call;
+            this.grpcsharp_request_call_context_method = DllImportsFromSharedLib_x64.grpcsharp_request_call_context_method;
+            this.grpcsharp_request_call_context_host = DllImportsFromSharedLib_x64.grpcsharp_request_call_context_host;
+            this.grpcsharp_request_call_context_deadline = DllImportsFromSharedLib_x64.grpcsharp_request_call_context_deadline;
+            this.grpcsharp_request_call_context_request_metadata = DllImportsFromSharedLib_x64.grpcsharp_request_call_context_request_metadata;
+            this.grpcsharp_request_call_context_reset = DllImportsFromSharedLib_x64.grpcsharp_request_call_context_reset;
+            this.grpcsharp_request_call_context_destroy = DllImportsFromSharedLib_x64.grpcsharp_request_call_context_destroy;
+            this.grpcsharp_composite_call_credentials_create = DllImportsFromSharedLib_x64.grpcsharp_composite_call_credentials_create;
+            this.grpcsharp_call_credentials_release = DllImportsFromSharedLib_x64.grpcsharp_call_credentials_release;
+            this.grpcsharp_call_cancel = DllImportsFromSharedLib_x64.grpcsharp_call_cancel;
+            this.grpcsharp_call_cancel_with_status = DllImportsFromSharedLib_x64.grpcsharp_call_cancel_with_status;
+            this.grpcsharp_call_start_unary = DllImportsFromSharedLib_x64.grpcsharp_call_start_unary;
+            this.grpcsharp_call_start_client_streaming = DllImportsFromSharedLib_x64.grpcsharp_call_start_client_streaming;
+            this.grpcsharp_call_start_server_streaming = DllImportsFromSharedLib_x64.grpcsharp_call_start_server_streaming;
+            this.grpcsharp_call_start_duplex_streaming = DllImportsFromSharedLib_x64.grpcsharp_call_start_duplex_streaming;
+            this.grpcsharp_call_send_message = DllImportsFromSharedLib_x64.grpcsharp_call_send_message;
+            this.grpcsharp_call_send_close_from_client = DllImportsFromSharedLib_x64.grpcsharp_call_send_close_from_client;
+            this.grpcsharp_call_send_status_from_server = DllImportsFromSharedLib_x64.grpcsharp_call_send_status_from_server;
+            this.grpcsharp_call_recv_message = DllImportsFromSharedLib_x64.grpcsharp_call_recv_message;
+            this.grpcsharp_call_recv_initial_metadata = DllImportsFromSharedLib_x64.grpcsharp_call_recv_initial_metadata;
+            this.grpcsharp_call_start_serverside = DllImportsFromSharedLib_x64.grpcsharp_call_start_serverside;
+            this.grpcsharp_call_send_initial_metadata = DllImportsFromSharedLib_x64.grpcsharp_call_send_initial_metadata;
+            this.grpcsharp_call_set_credentials = DllImportsFromSharedLib_x64.grpcsharp_call_set_credentials;
+            this.grpcsharp_call_get_peer = DllImportsFromSharedLib_x64.grpcsharp_call_get_peer;
+            this.grpcsharp_call_destroy = DllImportsFromSharedLib_x64.grpcsharp_call_destroy;
+            this.grpcsharp_channel_args_create = DllImportsFromSharedLib_x64.grpcsharp_channel_args_create;
+            this.grpcsharp_channel_args_set_string = DllImportsFromSharedLib_x64.grpcsharp_channel_args_set_string;
+            this.grpcsharp_channel_args_set_integer = DllImportsFromSharedLib_x64.grpcsharp_channel_args_set_integer;
+            this.grpcsharp_channel_args_destroy = DllImportsFromSharedLib_x64.grpcsharp_channel_args_destroy;
+            this.grpcsharp_override_default_ssl_roots = DllImportsFromSharedLib_x64.grpcsharp_override_default_ssl_roots;
+            this.grpcsharp_ssl_credentials_create = DllImportsFromSharedLib_x64.grpcsharp_ssl_credentials_create;
+            this.grpcsharp_composite_channel_credentials_create = DllImportsFromSharedLib_x64.grpcsharp_composite_channel_credentials_create;
+            this.grpcsharp_channel_credentials_release = DllImportsFromSharedLib_x64.grpcsharp_channel_credentials_release;
+            this.grpcsharp_insecure_channel_create = DllImportsFromSharedLib_x64.grpcsharp_insecure_channel_create;
+            this.grpcsharp_secure_channel_create = DllImportsFromSharedLib_x64.grpcsharp_secure_channel_create;
+            this.grpcsharp_channel_create_call = DllImportsFromSharedLib_x64.grpcsharp_channel_create_call;
+            this.grpcsharp_channel_check_connectivity_state = DllImportsFromSharedLib_x64.grpcsharp_channel_check_connectivity_state;
+            this.grpcsharp_channel_watch_connectivity_state = DllImportsFromSharedLib_x64.grpcsharp_channel_watch_connectivity_state;
+            this.grpcsharp_channel_get_target = DllImportsFromSharedLib_x64.grpcsharp_channel_get_target;
+            this.grpcsharp_channel_destroy = DllImportsFromSharedLib_x64.grpcsharp_channel_destroy;
+            this.grpcsharp_sizeof_grpc_event = DllImportsFromSharedLib_x64.grpcsharp_sizeof_grpc_event;
+            this.grpcsharp_completion_queue_create_async = DllImportsFromSharedLib_x64.grpcsharp_completion_queue_create_async;
+            this.grpcsharp_completion_queue_create_sync = DllImportsFromSharedLib_x64.grpcsharp_completion_queue_create_sync;
+            this.grpcsharp_completion_queue_shutdown = DllImportsFromSharedLib_x64.grpcsharp_completion_queue_shutdown;
+            this.grpcsharp_completion_queue_next = DllImportsFromSharedLib_x64.grpcsharp_completion_queue_next;
+            this.grpcsharp_completion_queue_pluck = DllImportsFromSharedLib_x64.grpcsharp_completion_queue_pluck;
+            this.grpcsharp_completion_queue_destroy = DllImportsFromSharedLib_x64.grpcsharp_completion_queue_destroy;
+            this.gprsharp_free = DllImportsFromSharedLib_x64.gprsharp_free;
+            this.grpcsharp_metadata_array_create = DllImportsFromSharedLib_x64.grpcsharp_metadata_array_create;
+            this.grpcsharp_metadata_array_add = DllImportsFromSharedLib_x64.grpcsharp_metadata_array_add;
+            this.grpcsharp_metadata_array_count = DllImportsFromSharedLib_x64.grpcsharp_metadata_array_count;
+            this.grpcsharp_metadata_array_get_key = DllImportsFromSharedLib_x64.grpcsharp_metadata_array_get_key;
+            this.grpcsharp_metadata_array_get_value = DllImportsFromSharedLib_x64.grpcsharp_metadata_array_get_value;
+            this.grpcsharp_metadata_array_destroy_full = DllImportsFromSharedLib_x64.grpcsharp_metadata_array_destroy_full;
+            this.grpcsharp_redirect_log = DllImportsFromSharedLib_x64.grpcsharp_redirect_log;
+            this.grpcsharp_native_callback_dispatcher_init = DllImportsFromSharedLib_x64.grpcsharp_native_callback_dispatcher_init;
+            this.grpcsharp_metadata_credentials_create_from_plugin = DllImportsFromSharedLib_x64.grpcsharp_metadata_credentials_create_from_plugin;
+            this.grpcsharp_metadata_credentials_notify_from_plugin = DllImportsFromSharedLib_x64.grpcsharp_metadata_credentials_notify_from_plugin;
+            this.grpcsharp_ssl_server_credentials_create = DllImportsFromSharedLib_x64.grpcsharp_ssl_server_credentials_create;
+            this.grpcsharp_server_credentials_release = DllImportsFromSharedLib_x64.grpcsharp_server_credentials_release;
+            this.grpcsharp_server_create = DllImportsFromSharedLib_x64.grpcsharp_server_create;
+            this.grpcsharp_server_register_completion_queue = DllImportsFromSharedLib_x64.grpcsharp_server_register_completion_queue;
+            this.grpcsharp_server_add_insecure_http2_port = DllImportsFromSharedLib_x64.grpcsharp_server_add_insecure_http2_port;
+            this.grpcsharp_server_add_secure_http2_port = DllImportsFromSharedLib_x64.grpcsharp_server_add_secure_http2_port;
+            this.grpcsharp_server_start = DllImportsFromSharedLib_x64.grpcsharp_server_start;
+            this.grpcsharp_server_request_call = DllImportsFromSharedLib_x64.grpcsharp_server_request_call;
+            this.grpcsharp_server_cancel_all_calls = DllImportsFromSharedLib_x64.grpcsharp_server_cancel_all_calls;
+            this.grpcsharp_server_shutdown_and_notify_callback = DllImportsFromSharedLib_x64.grpcsharp_server_shutdown_and_notify_callback;
+            this.grpcsharp_server_destroy = DllImportsFromSharedLib_x64.grpcsharp_server_destroy;
+            this.grpcsharp_call_auth_context = DllImportsFromSharedLib_x64.grpcsharp_call_auth_context;
+            this.grpcsharp_auth_context_peer_identity_property_name = DllImportsFromSharedLib_x64.grpcsharp_auth_context_peer_identity_property_name;
+            this.grpcsharp_auth_context_property_iterator = DllImportsFromSharedLib_x64.grpcsharp_auth_context_property_iterator;
+            this.grpcsharp_auth_property_iterator_next = DllImportsFromSharedLib_x64.grpcsharp_auth_property_iterator_next;
+            this.grpcsharp_auth_context_release = DllImportsFromSharedLib_x64.grpcsharp_auth_context_release;
+            this.grpcsharp_slice_buffer_create = DllImportsFromSharedLib_x64.grpcsharp_slice_buffer_create;
+            this.grpcsharp_slice_buffer_adjust_tail_space = DllImportsFromSharedLib_x64.grpcsharp_slice_buffer_adjust_tail_space;
+            this.grpcsharp_slice_buffer_slice_count = DllImportsFromSharedLib_x64.grpcsharp_slice_buffer_slice_count;
+            this.grpcsharp_slice_buffer_slice_peek = DllImportsFromSharedLib_x64.grpcsharp_slice_buffer_slice_peek;
+            this.grpcsharp_slice_buffer_reset_and_unref = DllImportsFromSharedLib_x64.grpcsharp_slice_buffer_reset_and_unref;
+            this.grpcsharp_slice_buffer_destroy = DllImportsFromSharedLib_x64.grpcsharp_slice_buffer_destroy;
+            this.gprsharp_now = DllImportsFromSharedLib_x64.gprsharp_now;
+            this.gprsharp_inf_future = DllImportsFromSharedLib_x64.gprsharp_inf_future;
+            this.gprsharp_inf_past = DllImportsFromSharedLib_x64.gprsharp_inf_past;
+            this.gprsharp_convert_clock_type = DllImportsFromSharedLib_x64.gprsharp_convert_clock_type;
+            this.gprsharp_sizeof_timespec = DllImportsFromSharedLib_x64.gprsharp_sizeof_timespec;
+            this.grpcsharp_test_callback = DllImportsFromSharedLib_x64.grpcsharp_test_callback;
+            this.grpcsharp_test_nop = DllImportsFromSharedLib_x64.grpcsharp_test_nop;
+            this.grpcsharp_test_override_method = DllImportsFromSharedLib_x64.grpcsharp_test_override_method;
+            this.grpcsharp_test_call_start_unary_echo = DllImportsFromSharedLib_x64.grpcsharp_test_call_start_unary_echo;
+        }
+
+        public NativeMethods(DllImportsFromSharedLib_x86_dll unusedInstance)
+        {
+            this.grpcsharp_init = DllImportsFromSharedLib_x86_dll.grpcsharp_init;
+            this.grpcsharp_shutdown = DllImportsFromSharedLib_x86_dll.grpcsharp_shutdown;
+            this.grpcsharp_version_string = DllImportsFromSharedLib_x86_dll.grpcsharp_version_string;
+            this.grpcsharp_batch_context_create = DllImportsFromSharedLib_x86_dll.grpcsharp_batch_context_create;
+            this.grpcsharp_batch_context_recv_initial_metadata = DllImportsFromSharedLib_x86_dll.grpcsharp_batch_context_recv_initial_metadata;
+            this.grpcsharp_batch_context_recv_message_length = DllImportsFromSharedLib_x86_dll.grpcsharp_batch_context_recv_message_length;
+            this.grpcsharp_batch_context_recv_message_next_slice_peek = DllImportsFromSharedLib_x86_dll.grpcsharp_batch_context_recv_message_next_slice_peek;
+            this.grpcsharp_batch_context_recv_status_on_client_status = DllImportsFromSharedLib_x86_dll.grpcsharp_batch_context_recv_status_on_client_status;
+            this.grpcsharp_batch_context_recv_status_on_client_details = DllImportsFromSharedLib_x86_dll.grpcsharp_batch_context_recv_status_on_client_details;
+            this.grpcsharp_batch_context_recv_status_on_client_error_string = DllImportsFromSharedLib_x86_dll.grpcsharp_batch_context_recv_status_on_client_error_string;
+            this.grpcsharp_batch_context_recv_status_on_client_trailing_metadata = DllImportsFromSharedLib_x86_dll.grpcsharp_batch_context_recv_status_on_client_trailing_metadata;
+            this.grpcsharp_batch_context_recv_close_on_server_cancelled = DllImportsFromSharedLib_x86_dll.grpcsharp_batch_context_recv_close_on_server_cancelled;
+            this.grpcsharp_batch_context_reset = DllImportsFromSharedLib_x86_dll.grpcsharp_batch_context_reset;
+            this.grpcsharp_batch_context_destroy = DllImportsFromSharedLib_x86_dll.grpcsharp_batch_context_destroy;
+            this.grpcsharp_request_call_context_create = DllImportsFromSharedLib_x86_dll.grpcsharp_request_call_context_create;
+            this.grpcsharp_request_call_context_call = DllImportsFromSharedLib_x86_dll.grpcsharp_request_call_context_call;
+            this.grpcsharp_request_call_context_method = DllImportsFromSharedLib_x86_dll.grpcsharp_request_call_context_method;
+            this.grpcsharp_request_call_context_host = DllImportsFromSharedLib_x86_dll.grpcsharp_request_call_context_host;
+            this.grpcsharp_request_call_context_deadline = DllImportsFromSharedLib_x86_dll.grpcsharp_request_call_context_deadline;
+            this.grpcsharp_request_call_context_request_metadata = DllImportsFromSharedLib_x86_dll.grpcsharp_request_call_context_request_metadata;
+            this.grpcsharp_request_call_context_reset = DllImportsFromSharedLib_x86_dll.grpcsharp_request_call_context_reset;
+            this.grpcsharp_request_call_context_destroy = DllImportsFromSharedLib_x86_dll.grpcsharp_request_call_context_destroy;
+            this.grpcsharp_composite_call_credentials_create = DllImportsFromSharedLib_x86_dll.grpcsharp_composite_call_credentials_create;
+            this.grpcsharp_call_credentials_release = DllImportsFromSharedLib_x86_dll.grpcsharp_call_credentials_release;
+            this.grpcsharp_call_cancel = DllImportsFromSharedLib_x86_dll.grpcsharp_call_cancel;
+            this.grpcsharp_call_cancel_with_status = DllImportsFromSharedLib_x86_dll.grpcsharp_call_cancel_with_status;
+            this.grpcsharp_call_start_unary = DllImportsFromSharedLib_x86_dll.grpcsharp_call_start_unary;
+            this.grpcsharp_call_start_client_streaming = DllImportsFromSharedLib_x86_dll.grpcsharp_call_start_client_streaming;
+            this.grpcsharp_call_start_server_streaming = DllImportsFromSharedLib_x86_dll.grpcsharp_call_start_server_streaming;
+            this.grpcsharp_call_start_duplex_streaming = DllImportsFromSharedLib_x86_dll.grpcsharp_call_start_duplex_streaming;
+            this.grpcsharp_call_send_message = DllImportsFromSharedLib_x86_dll.grpcsharp_call_send_message;
+            this.grpcsharp_call_send_close_from_client = DllImportsFromSharedLib_x86_dll.grpcsharp_call_send_close_from_client;
+            this.grpcsharp_call_send_status_from_server = DllImportsFromSharedLib_x86_dll.grpcsharp_call_send_status_from_server;
+            this.grpcsharp_call_recv_message = DllImportsFromSharedLib_x86_dll.grpcsharp_call_recv_message;
+            this.grpcsharp_call_recv_initial_metadata = DllImportsFromSharedLib_x86_dll.grpcsharp_call_recv_initial_metadata;
+            this.grpcsharp_call_start_serverside = DllImportsFromSharedLib_x86_dll.grpcsharp_call_start_serverside;
+            this.grpcsharp_call_send_initial_metadata = DllImportsFromSharedLib_x86_dll.grpcsharp_call_send_initial_metadata;
+            this.grpcsharp_call_set_credentials = DllImportsFromSharedLib_x86_dll.grpcsharp_call_set_credentials;
+            this.grpcsharp_call_get_peer = DllImportsFromSharedLib_x86_dll.grpcsharp_call_get_peer;
+            this.grpcsharp_call_destroy = DllImportsFromSharedLib_x86_dll.grpcsharp_call_destroy;
+            this.grpcsharp_channel_args_create = DllImportsFromSharedLib_x86_dll.grpcsharp_channel_args_create;
+            this.grpcsharp_channel_args_set_string = DllImportsFromSharedLib_x86_dll.grpcsharp_channel_args_set_string;
+            this.grpcsharp_channel_args_set_integer = DllImportsFromSharedLib_x86_dll.grpcsharp_channel_args_set_integer;
+            this.grpcsharp_channel_args_destroy = DllImportsFromSharedLib_x86_dll.grpcsharp_channel_args_destroy;
+            this.grpcsharp_override_default_ssl_roots = DllImportsFromSharedLib_x86_dll.grpcsharp_override_default_ssl_roots;
+            this.grpcsharp_ssl_credentials_create = DllImportsFromSharedLib_x86_dll.grpcsharp_ssl_credentials_create;
+            this.grpcsharp_composite_channel_credentials_create = DllImportsFromSharedLib_x86_dll.grpcsharp_composite_channel_credentials_create;
+            this.grpcsharp_channel_credentials_release = DllImportsFromSharedLib_x86_dll.grpcsharp_channel_credentials_release;
+            this.grpcsharp_insecure_channel_create = DllImportsFromSharedLib_x86_dll.grpcsharp_insecure_channel_create;
+            this.grpcsharp_secure_channel_create = DllImportsFromSharedLib_x86_dll.grpcsharp_secure_channel_create;
+            this.grpcsharp_channel_create_call = DllImportsFromSharedLib_x86_dll.grpcsharp_channel_create_call;
+            this.grpcsharp_channel_check_connectivity_state = DllImportsFromSharedLib_x86_dll.grpcsharp_channel_check_connectivity_state;
+            this.grpcsharp_channel_watch_connectivity_state = DllImportsFromSharedLib_x86_dll.grpcsharp_channel_watch_connectivity_state;
+            this.grpcsharp_channel_get_target = DllImportsFromSharedLib_x86_dll.grpcsharp_channel_get_target;
+            this.grpcsharp_channel_destroy = DllImportsFromSharedLib_x86_dll.grpcsharp_channel_destroy;
+            this.grpcsharp_sizeof_grpc_event = DllImportsFromSharedLib_x86_dll.grpcsharp_sizeof_grpc_event;
+            this.grpcsharp_completion_queue_create_async = DllImportsFromSharedLib_x86_dll.grpcsharp_completion_queue_create_async;
+            this.grpcsharp_completion_queue_create_sync = DllImportsFromSharedLib_x86_dll.grpcsharp_completion_queue_create_sync;
+            this.grpcsharp_completion_queue_shutdown = DllImportsFromSharedLib_x86_dll.grpcsharp_completion_queue_shutdown;
+            this.grpcsharp_completion_queue_next = DllImportsFromSharedLib_x86_dll.grpcsharp_completion_queue_next;
+            this.grpcsharp_completion_queue_pluck = DllImportsFromSharedLib_x86_dll.grpcsharp_completion_queue_pluck;
+            this.grpcsharp_completion_queue_destroy = DllImportsFromSharedLib_x86_dll.grpcsharp_completion_queue_destroy;
+            this.gprsharp_free = DllImportsFromSharedLib_x86_dll.gprsharp_free;
+            this.grpcsharp_metadata_array_create = DllImportsFromSharedLib_x86_dll.grpcsharp_metadata_array_create;
+            this.grpcsharp_metadata_array_add = DllImportsFromSharedLib_x86_dll.grpcsharp_metadata_array_add;
+            this.grpcsharp_metadata_array_count = DllImportsFromSharedLib_x86_dll.grpcsharp_metadata_array_count;
+            this.grpcsharp_metadata_array_get_key = DllImportsFromSharedLib_x86_dll.grpcsharp_metadata_array_get_key;
+            this.grpcsharp_metadata_array_get_value = DllImportsFromSharedLib_x86_dll.grpcsharp_metadata_array_get_value;
+            this.grpcsharp_metadata_array_destroy_full = DllImportsFromSharedLib_x86_dll.grpcsharp_metadata_array_destroy_full;
+            this.grpcsharp_redirect_log = DllImportsFromSharedLib_x86_dll.grpcsharp_redirect_log;
+            this.grpcsharp_native_callback_dispatcher_init = DllImportsFromSharedLib_x86_dll.grpcsharp_native_callback_dispatcher_init;
+            this.grpcsharp_metadata_credentials_create_from_plugin = DllImportsFromSharedLib_x86_dll.grpcsharp_metadata_credentials_create_from_plugin;
+            this.grpcsharp_metadata_credentials_notify_from_plugin = DllImportsFromSharedLib_x86_dll.grpcsharp_metadata_credentials_notify_from_plugin;
+            this.grpcsharp_ssl_server_credentials_create = DllImportsFromSharedLib_x86_dll.grpcsharp_ssl_server_credentials_create;
+            this.grpcsharp_server_credentials_release = DllImportsFromSharedLib_x86_dll.grpcsharp_server_credentials_release;
+            this.grpcsharp_server_create = DllImportsFromSharedLib_x86_dll.grpcsharp_server_create;
+            this.grpcsharp_server_register_completion_queue = DllImportsFromSharedLib_x86_dll.grpcsharp_server_register_completion_queue;
+            this.grpcsharp_server_add_insecure_http2_port = DllImportsFromSharedLib_x86_dll.grpcsharp_server_add_insecure_http2_port;
+            this.grpcsharp_server_add_secure_http2_port = DllImportsFromSharedLib_x86_dll.grpcsharp_server_add_secure_http2_port;
+            this.grpcsharp_server_start = DllImportsFromSharedLib_x86_dll.grpcsharp_server_start;
+            this.grpcsharp_server_request_call = DllImportsFromSharedLib_x86_dll.grpcsharp_server_request_call;
+            this.grpcsharp_server_cancel_all_calls = DllImportsFromSharedLib_x86_dll.grpcsharp_server_cancel_all_calls;
+            this.grpcsharp_server_shutdown_and_notify_callback = DllImportsFromSharedLib_x86_dll.grpcsharp_server_shutdown_and_notify_callback;
+            this.grpcsharp_server_destroy = DllImportsFromSharedLib_x86_dll.grpcsharp_server_destroy;
+            this.grpcsharp_call_auth_context = DllImportsFromSharedLib_x86_dll.grpcsharp_call_auth_context;
+            this.grpcsharp_auth_context_peer_identity_property_name = DllImportsFromSharedLib_x86_dll.grpcsharp_auth_context_peer_identity_property_name;
+            this.grpcsharp_auth_context_property_iterator = DllImportsFromSharedLib_x86_dll.grpcsharp_auth_context_property_iterator;
+            this.grpcsharp_auth_property_iterator_next = DllImportsFromSharedLib_x86_dll.grpcsharp_auth_property_iterator_next;
+            this.grpcsharp_auth_context_release = DllImportsFromSharedLib_x86_dll.grpcsharp_auth_context_release;
+            this.grpcsharp_slice_buffer_create = DllImportsFromSharedLib_x86_dll.grpcsharp_slice_buffer_create;
+            this.grpcsharp_slice_buffer_adjust_tail_space = DllImportsFromSharedLib_x86_dll.grpcsharp_slice_buffer_adjust_tail_space;
+            this.grpcsharp_slice_buffer_slice_count = DllImportsFromSharedLib_x86_dll.grpcsharp_slice_buffer_slice_count;
+            this.grpcsharp_slice_buffer_slice_peek = DllImportsFromSharedLib_x86_dll.grpcsharp_slice_buffer_slice_peek;
+            this.grpcsharp_slice_buffer_reset_and_unref = DllImportsFromSharedLib_x86_dll.grpcsharp_slice_buffer_reset_and_unref;
+            this.grpcsharp_slice_buffer_destroy = DllImportsFromSharedLib_x86_dll.grpcsharp_slice_buffer_destroy;
+            this.gprsharp_now = DllImportsFromSharedLib_x86_dll.gprsharp_now;
+            this.gprsharp_inf_future = DllImportsFromSharedLib_x86_dll.gprsharp_inf_future;
+            this.gprsharp_inf_past = DllImportsFromSharedLib_x86_dll.gprsharp_inf_past;
+            this.gprsharp_convert_clock_type = DllImportsFromSharedLib_x86_dll.gprsharp_convert_clock_type;
+            this.gprsharp_sizeof_timespec = DllImportsFromSharedLib_x86_dll.gprsharp_sizeof_timespec;
+            this.grpcsharp_test_callback = DllImportsFromSharedLib_x86_dll.grpcsharp_test_callback;
+            this.grpcsharp_test_nop = DllImportsFromSharedLib_x86_dll.grpcsharp_test_nop;
+            this.grpcsharp_test_override_method = DllImportsFromSharedLib_x86_dll.grpcsharp_test_override_method;
+            this.grpcsharp_test_call_start_unary_echo = DllImportsFromSharedLib_x86_dll.grpcsharp_test_call_start_unary_echo;
+        }
+
+        public NativeMethods(DllImportsFromSharedLib_x64_dll unusedInstance)
+        {
+            this.grpcsharp_init = DllImportsFromSharedLib_x64_dll.grpcsharp_init;
+            this.grpcsharp_shutdown = DllImportsFromSharedLib_x64_dll.grpcsharp_shutdown;
+            this.grpcsharp_version_string = DllImportsFromSharedLib_x64_dll.grpcsharp_version_string;
+            this.grpcsharp_batch_context_create = DllImportsFromSharedLib_x64_dll.grpcsharp_batch_context_create;
+            this.grpcsharp_batch_context_recv_initial_metadata = DllImportsFromSharedLib_x64_dll.grpcsharp_batch_context_recv_initial_metadata;
+            this.grpcsharp_batch_context_recv_message_length = DllImportsFromSharedLib_x64_dll.grpcsharp_batch_context_recv_message_length;
+            this.grpcsharp_batch_context_recv_message_next_slice_peek = DllImportsFromSharedLib_x64_dll.grpcsharp_batch_context_recv_message_next_slice_peek;
+            this.grpcsharp_batch_context_recv_status_on_client_status = DllImportsFromSharedLib_x64_dll.grpcsharp_batch_context_recv_status_on_client_status;
+            this.grpcsharp_batch_context_recv_status_on_client_details = DllImportsFromSharedLib_x64_dll.grpcsharp_batch_context_recv_status_on_client_details;
+            this.grpcsharp_batch_context_recv_status_on_client_error_string = DllImportsFromSharedLib_x64_dll.grpcsharp_batch_context_recv_status_on_client_error_string;
+            this.grpcsharp_batch_context_recv_status_on_client_trailing_metadata = DllImportsFromSharedLib_x64_dll.grpcsharp_batch_context_recv_status_on_client_trailing_metadata;
+            this.grpcsharp_batch_context_recv_close_on_server_cancelled = DllImportsFromSharedLib_x64_dll.grpcsharp_batch_context_recv_close_on_server_cancelled;
+            this.grpcsharp_batch_context_reset = DllImportsFromSharedLib_x64_dll.grpcsharp_batch_context_reset;
+            this.grpcsharp_batch_context_destroy = DllImportsFromSharedLib_x64_dll.grpcsharp_batch_context_destroy;
+            this.grpcsharp_request_call_context_create = DllImportsFromSharedLib_x64_dll.grpcsharp_request_call_context_create;
+            this.grpcsharp_request_call_context_call = DllImportsFromSharedLib_x64_dll.grpcsharp_request_call_context_call;
+            this.grpcsharp_request_call_context_method = DllImportsFromSharedLib_x64_dll.grpcsharp_request_call_context_method;
+            this.grpcsharp_request_call_context_host = DllImportsFromSharedLib_x64_dll.grpcsharp_request_call_context_host;
+            this.grpcsharp_request_call_context_deadline = DllImportsFromSharedLib_x64_dll.grpcsharp_request_call_context_deadline;
+            this.grpcsharp_request_call_context_request_metadata = DllImportsFromSharedLib_x64_dll.grpcsharp_request_call_context_request_metadata;
+            this.grpcsharp_request_call_context_reset = DllImportsFromSharedLib_x64_dll.grpcsharp_request_call_context_reset;
+            this.grpcsharp_request_call_context_destroy = DllImportsFromSharedLib_x64_dll.grpcsharp_request_call_context_destroy;
+            this.grpcsharp_composite_call_credentials_create = DllImportsFromSharedLib_x64_dll.grpcsharp_composite_call_credentials_create;
+            this.grpcsharp_call_credentials_release = DllImportsFromSharedLib_x64_dll.grpcsharp_call_credentials_release;
+            this.grpcsharp_call_cancel = DllImportsFromSharedLib_x64_dll.grpcsharp_call_cancel;
+            this.grpcsharp_call_cancel_with_status = DllImportsFromSharedLib_x64_dll.grpcsharp_call_cancel_with_status;
+            this.grpcsharp_call_start_unary = DllImportsFromSharedLib_x64_dll.grpcsharp_call_start_unary;
+            this.grpcsharp_call_start_client_streaming = DllImportsFromSharedLib_x64_dll.grpcsharp_call_start_client_streaming;
+            this.grpcsharp_call_start_server_streaming = DllImportsFromSharedLib_x64_dll.grpcsharp_call_start_server_streaming;
+            this.grpcsharp_call_start_duplex_streaming = DllImportsFromSharedLib_x64_dll.grpcsharp_call_start_duplex_streaming;
+            this.grpcsharp_call_send_message = DllImportsFromSharedLib_x64_dll.grpcsharp_call_send_message;
+            this.grpcsharp_call_send_close_from_client = DllImportsFromSharedLib_x64_dll.grpcsharp_call_send_close_from_client;
+            this.grpcsharp_call_send_status_from_server = DllImportsFromSharedLib_x64_dll.grpcsharp_call_send_status_from_server;
+            this.grpcsharp_call_recv_message = DllImportsFromSharedLib_x64_dll.grpcsharp_call_recv_message;
+            this.grpcsharp_call_recv_initial_metadata = DllImportsFromSharedLib_x64_dll.grpcsharp_call_recv_initial_metadata;
+            this.grpcsharp_call_start_serverside = DllImportsFromSharedLib_x64_dll.grpcsharp_call_start_serverside;
+            this.grpcsharp_call_send_initial_metadata = DllImportsFromSharedLib_x64_dll.grpcsharp_call_send_initial_metadata;
+            this.grpcsharp_call_set_credentials = DllImportsFromSharedLib_x64_dll.grpcsharp_call_set_credentials;
+            this.grpcsharp_call_get_peer = DllImportsFromSharedLib_x64_dll.grpcsharp_call_get_peer;
+            this.grpcsharp_call_destroy = DllImportsFromSharedLib_x64_dll.grpcsharp_call_destroy;
+            this.grpcsharp_channel_args_create = DllImportsFromSharedLib_x64_dll.grpcsharp_channel_args_create;
+            this.grpcsharp_channel_args_set_string = DllImportsFromSharedLib_x64_dll.grpcsharp_channel_args_set_string;
+            this.grpcsharp_channel_args_set_integer = DllImportsFromSharedLib_x64_dll.grpcsharp_channel_args_set_integer;
+            this.grpcsharp_channel_args_destroy = DllImportsFromSharedLib_x64_dll.grpcsharp_channel_args_destroy;
+            this.grpcsharp_override_default_ssl_roots = DllImportsFromSharedLib_x64_dll.grpcsharp_override_default_ssl_roots;
+            this.grpcsharp_ssl_credentials_create = DllImportsFromSharedLib_x64_dll.grpcsharp_ssl_credentials_create;
+            this.grpcsharp_composite_channel_credentials_create = DllImportsFromSharedLib_x64_dll.grpcsharp_composite_channel_credentials_create;
+            this.grpcsharp_channel_credentials_release = DllImportsFromSharedLib_x64_dll.grpcsharp_channel_credentials_release;
+            this.grpcsharp_insecure_channel_create = DllImportsFromSharedLib_x64_dll.grpcsharp_insecure_channel_create;
+            this.grpcsharp_secure_channel_create = DllImportsFromSharedLib_x64_dll.grpcsharp_secure_channel_create;
+            this.grpcsharp_channel_create_call = DllImportsFromSharedLib_x64_dll.grpcsharp_channel_create_call;
+            this.grpcsharp_channel_check_connectivity_state = DllImportsFromSharedLib_x64_dll.grpcsharp_channel_check_connectivity_state;
+            this.grpcsharp_channel_watch_connectivity_state = DllImportsFromSharedLib_x64_dll.grpcsharp_channel_watch_connectivity_state;
+            this.grpcsharp_channel_get_target = DllImportsFromSharedLib_x64_dll.grpcsharp_channel_get_target;
+            this.grpcsharp_channel_destroy = DllImportsFromSharedLib_x64_dll.grpcsharp_channel_destroy;
+            this.grpcsharp_sizeof_grpc_event = DllImportsFromSharedLib_x64_dll.grpcsharp_sizeof_grpc_event;
+            this.grpcsharp_completion_queue_create_async = DllImportsFromSharedLib_x64_dll.grpcsharp_completion_queue_create_async;
+            this.grpcsharp_completion_queue_create_sync = DllImportsFromSharedLib_x64_dll.grpcsharp_completion_queue_create_sync;
+            this.grpcsharp_completion_queue_shutdown = DllImportsFromSharedLib_x64_dll.grpcsharp_completion_queue_shutdown;
+            this.grpcsharp_completion_queue_next = DllImportsFromSharedLib_x64_dll.grpcsharp_completion_queue_next;
+            this.grpcsharp_completion_queue_pluck = DllImportsFromSharedLib_x64_dll.grpcsharp_completion_queue_pluck;
+            this.grpcsharp_completion_queue_destroy = DllImportsFromSharedLib_x64_dll.grpcsharp_completion_queue_destroy;
+            this.gprsharp_free = DllImportsFromSharedLib_x64_dll.gprsharp_free;
+            this.grpcsharp_metadata_array_create = DllImportsFromSharedLib_x64_dll.grpcsharp_metadata_array_create;
+            this.grpcsharp_metadata_array_add = DllImportsFromSharedLib_x64_dll.grpcsharp_metadata_array_add;
+            this.grpcsharp_metadata_array_count = DllImportsFromSharedLib_x64_dll.grpcsharp_metadata_array_count;
+            this.grpcsharp_metadata_array_get_key = DllImportsFromSharedLib_x64_dll.grpcsharp_metadata_array_get_key;
+            this.grpcsharp_metadata_array_get_value = DllImportsFromSharedLib_x64_dll.grpcsharp_metadata_array_get_value;
+            this.grpcsharp_metadata_array_destroy_full = DllImportsFromSharedLib_x64_dll.grpcsharp_metadata_array_destroy_full;
+            this.grpcsharp_redirect_log = DllImportsFromSharedLib_x64_dll.grpcsharp_redirect_log;
+            this.grpcsharp_native_callback_dispatcher_init = DllImportsFromSharedLib_x64_dll.grpcsharp_native_callback_dispatcher_init;
+            this.grpcsharp_metadata_credentials_create_from_plugin = DllImportsFromSharedLib_x64_dll.grpcsharp_metadata_credentials_create_from_plugin;
+            this.grpcsharp_metadata_credentials_notify_from_plugin = DllImportsFromSharedLib_x64_dll.grpcsharp_metadata_credentials_notify_from_plugin;
+            this.grpcsharp_ssl_server_credentials_create = DllImportsFromSharedLib_x64_dll.grpcsharp_ssl_server_credentials_create;
+            this.grpcsharp_server_credentials_release = DllImportsFromSharedLib_x64_dll.grpcsharp_server_credentials_release;
+            this.grpcsharp_server_create = DllImportsFromSharedLib_x64_dll.grpcsharp_server_create;
+            this.grpcsharp_server_register_completion_queue = DllImportsFromSharedLib_x64_dll.grpcsharp_server_register_completion_queue;
+            this.grpcsharp_server_add_insecure_http2_port = DllImportsFromSharedLib_x64_dll.grpcsharp_server_add_insecure_http2_port;
+            this.grpcsharp_server_add_secure_http2_port = DllImportsFromSharedLib_x64_dll.grpcsharp_server_add_secure_http2_port;
+            this.grpcsharp_server_start = DllImportsFromSharedLib_x64_dll.grpcsharp_server_start;
+            this.grpcsharp_server_request_call = DllImportsFromSharedLib_x64_dll.grpcsharp_server_request_call;
+            this.grpcsharp_server_cancel_all_calls = DllImportsFromSharedLib_x64_dll.grpcsharp_server_cancel_all_calls;
+            this.grpcsharp_server_shutdown_and_notify_callback = DllImportsFromSharedLib_x64_dll.grpcsharp_server_shutdown_and_notify_callback;
+            this.grpcsharp_server_destroy = DllImportsFromSharedLib_x64_dll.grpcsharp_server_destroy;
+            this.grpcsharp_call_auth_context = DllImportsFromSharedLib_x64_dll.grpcsharp_call_auth_context;
+            this.grpcsharp_auth_context_peer_identity_property_name = DllImportsFromSharedLib_x64_dll.grpcsharp_auth_context_peer_identity_property_name;
+            this.grpcsharp_auth_context_property_iterator = DllImportsFromSharedLib_x64_dll.grpcsharp_auth_context_property_iterator;
+            this.grpcsharp_auth_property_iterator_next = DllImportsFromSharedLib_x64_dll.grpcsharp_auth_property_iterator_next;
+            this.grpcsharp_auth_context_release = DllImportsFromSharedLib_x64_dll.grpcsharp_auth_context_release;
+            this.grpcsharp_slice_buffer_create = DllImportsFromSharedLib_x64_dll.grpcsharp_slice_buffer_create;
+            this.grpcsharp_slice_buffer_adjust_tail_space = DllImportsFromSharedLib_x64_dll.grpcsharp_slice_buffer_adjust_tail_space;
+            this.grpcsharp_slice_buffer_slice_count = DllImportsFromSharedLib_x64_dll.grpcsharp_slice_buffer_slice_count;
+            this.grpcsharp_slice_buffer_slice_peek = DllImportsFromSharedLib_x64_dll.grpcsharp_slice_buffer_slice_peek;
+            this.grpcsharp_slice_buffer_reset_and_unref = DllImportsFromSharedLib_x64_dll.grpcsharp_slice_buffer_reset_and_unref;
+            this.grpcsharp_slice_buffer_destroy = DllImportsFromSharedLib_x64_dll.grpcsharp_slice_buffer_destroy;
+            this.gprsharp_now = DllImportsFromSharedLib_x64_dll.gprsharp_now;
+            this.gprsharp_inf_future = DllImportsFromSharedLib_x64_dll.gprsharp_inf_future;
+            this.gprsharp_inf_past = DllImportsFromSharedLib_x64_dll.gprsharp_inf_past;
+            this.gprsharp_convert_clock_type = DllImportsFromSharedLib_x64_dll.gprsharp_convert_clock_type;
+            this.gprsharp_sizeof_timespec = DllImportsFromSharedLib_x64_dll.gprsharp_sizeof_timespec;
+            this.grpcsharp_test_callback = DllImportsFromSharedLib_x64_dll.grpcsharp_test_callback;
+            this.grpcsharp_test_nop = DllImportsFromSharedLib_x64_dll.grpcsharp_test_nop;
+            this.grpcsharp_test_override_method = DllImportsFromSharedLib_x64_dll.grpcsharp_test_override_method;
+            this.grpcsharp_test_call_start_unary_echo = DllImportsFromSharedLib_x64_dll.grpcsharp_test_call_start_unary_echo;
+        }
+
         /// <summary>
         /// Delegate types for all published native methods. Declared under inner class to prevent scope pollution.
         /// </summary>
@@ -897,7 +1329,7 @@ namespace Grpc.Core.Internal
         }
         
         /// <summary>
-        /// grpc_csharp_ext used a shared library (e.g on Unity Standalone and Android).
+        /// grpc_csharp_ext used as a shared library (e.g on Unity Standalone and Android).
         /// </summary>
         internal class DllImportsFromSharedLib
         {
@@ -1215,5 +1647,1285 @@ namespace Grpc.Core.Internal
             [DllImport(ImportName)]
             public static extern CallError grpcsharp_test_call_start_unary_echo(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
         }
+
+        /// <summary>
+        /// grpc_csharp_ext used as a shared library (with x86 suffix)
+        /// </summary>
+        internal class DllImportsFromSharedLib_x86
+        {
+            private const string ImportName = "grpc_csharp_ext.x86";
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_init();
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_shutdown();
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_version_string();
+            
+            [DllImport(ImportName)]
+            public static extern BatchContextSafeHandle grpcsharp_batch_context_create();
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_initial_metadata(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_message_length(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_batch_context_recv_message_next_slice_peek(BatchContextSafeHandle ctx, out UIntPtr sliceLen, out IntPtr sliceDataPtr);
+            
+            [DllImport(ImportName)]
+            public static extern StatusCode grpcsharp_batch_context_recv_status_on_client_status(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_status_on_client_details(BatchContextSafeHandle ctx, out UIntPtr detailsLength);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_status_on_client_error_string(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_status_on_client_trailing_metadata(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_batch_context_recv_close_on_server_cancelled(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_batch_context_reset(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_batch_context_destroy(IntPtr ctx);
+            
+            [DllImport(ImportName)]
+            public static extern RequestCallContextSafeHandle grpcsharp_request_call_context_create();
+            
+            [DllImport(ImportName)]
+            public static extern CallSafeHandle grpcsharp_request_call_context_call(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_request_call_context_method(RequestCallContextSafeHandle ctx, out UIntPtr methodLength);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_request_call_context_host(RequestCallContextSafeHandle ctx, out UIntPtr hostLength);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec grpcsharp_request_call_context_deadline(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_request_call_context_request_metadata(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_request_call_context_reset(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_request_call_context_destroy(IntPtr ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallCredentialsSafeHandle grpcsharp_composite_call_credentials_create(CallCredentialsSafeHandle creds1, CallCredentialsSafeHandle creds2);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_call_credentials_release(IntPtr credentials);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_cancel(CallSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_cancel_with_status(CallSafeHandle call, StatusCode status, string description);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_unary(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_client_streaming(CallSafeHandle call, BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_server_streaming(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_duplex_streaming(CallSafeHandle call, BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_message(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, int sendEmptyInitialMetadata);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_close_from_client(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_status_from_server(CallSafeHandle call, BatchContextSafeHandle ctx, StatusCode statusCode, IntPtr statusMessage, UIntPtr statusMessageLen, MetadataArraySafeHandle metadataArray, int sendEmptyInitialMetadata, SliceBufferSafeHandle optionalSendBuffer, WriteFlags writeFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_recv_message(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_recv_initial_metadata(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_serverside(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_initial_metadata(CallSafeHandle call, BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_set_credentials(CallSafeHandle call, CallCredentialsSafeHandle credentials);
+            
+            [DllImport(ImportName)]
+            public static extern CStringSafeHandle grpcsharp_call_get_peer(CallSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_call_destroy(IntPtr call);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelArgsSafeHandle grpcsharp_channel_args_create(UIntPtr numArgs);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_args_set_string(ChannelArgsSafeHandle args, UIntPtr index, string key, string value);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_args_set_integer(ChannelArgsSafeHandle args, UIntPtr index, string key, int value);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_args_destroy(IntPtr args);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_override_default_ssl_roots(string pemRootCerts);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelCredentialsSafeHandle grpcsharp_ssl_credentials_create(string pemRootCerts, string keyCertPairCertChain, string keyCertPairPrivateKey, IntPtr verifyPeerCallbackTag);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelCredentialsSafeHandle grpcsharp_composite_channel_credentials_create(ChannelCredentialsSafeHandle channelCreds, CallCredentialsSafeHandle callCreds);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_credentials_release(IntPtr credentials);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelSafeHandle grpcsharp_insecure_channel_create(string target, ChannelArgsSafeHandle channelArgs);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelSafeHandle grpcsharp_secure_channel_create(ChannelCredentialsSafeHandle credentials, string target, ChannelArgsSafeHandle channelArgs);
+            
+            [DllImport(ImportName)]
+            public static extern CallSafeHandle grpcsharp_channel_create_call(ChannelSafeHandle channel, CallSafeHandle parentCall, ContextPropagationFlags propagationMask, CompletionQueueSafeHandle cq, string method, string host, Timespec deadline);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelState grpcsharp_channel_check_connectivity_state(ChannelSafeHandle channel, int tryToConnect);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_watch_connectivity_state(ChannelSafeHandle channel, ChannelState lastObservedState, Timespec deadline, CompletionQueueSafeHandle cq, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CStringSafeHandle grpcsharp_channel_get_target(ChannelSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_destroy(IntPtr channel);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_sizeof_grpc_event();
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueSafeHandle grpcsharp_completion_queue_create_async();
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueSafeHandle grpcsharp_completion_queue_create_sync();
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_completion_queue_shutdown(CompletionQueueSafeHandle cq);
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueEvent grpcsharp_completion_queue_next(CompletionQueueSafeHandle cq);
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueEvent grpcsharp_completion_queue_pluck(CompletionQueueSafeHandle cq, IntPtr tag);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_completion_queue_destroy(IntPtr cq);
+            
+            [DllImport(ImportName)]
+            public static extern void gprsharp_free(IntPtr ptr);
+            
+            [DllImport(ImportName)]
+            public static extern MetadataArraySafeHandle grpcsharp_metadata_array_create(UIntPtr capacity);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_metadata_array_add(MetadataArraySafeHandle array, string key, byte[] value, UIntPtr valueLength);
+            
+            [DllImport(ImportName)]
+            public static extern UIntPtr grpcsharp_metadata_array_count(IntPtr metadataArray);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_metadata_array_get_key(IntPtr metadataArray, UIntPtr index, out UIntPtr keyLength);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_metadata_array_get_value(IntPtr metadataArray, UIntPtr index, out UIntPtr valueLength);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_metadata_array_destroy_full(IntPtr array);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_redirect_log(GprLogDelegate callback);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_native_callback_dispatcher_init(NativeCallbackDispatcherCallback dispatcher);
+            
+            [DllImport(ImportName)]
+            public static extern CallCredentialsSafeHandle grpcsharp_metadata_credentials_create_from_plugin(IntPtr nativeCallbackTag);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_metadata_credentials_notify_from_plugin(IntPtr callbackPtr, IntPtr userData, MetadataArraySafeHandle metadataArray, StatusCode statusCode, string errorDetails);
+            
+            [DllImport(ImportName)]
+            public static extern ServerCredentialsSafeHandle grpcsharp_ssl_server_credentials_create(string pemRootCerts, string[] keyCertPairCertChainArray, string[] keyCertPairPrivateKeyArray, UIntPtr numKeyCertPairs, SslClientCertificateRequestType clientCertificateRequest);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_credentials_release(IntPtr credentials);
+            
+            [DllImport(ImportName)]
+            public static extern ServerSafeHandle grpcsharp_server_create(ChannelArgsSafeHandle args);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_register_completion_queue(ServerSafeHandle server, CompletionQueueSafeHandle cq);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_server_add_insecure_http2_port(ServerSafeHandle server, string addr);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_server_add_secure_http2_port(ServerSafeHandle server, string addr, ServerCredentialsSafeHandle creds);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_start(ServerSafeHandle server);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_server_request_call(ServerSafeHandle server, CompletionQueueSafeHandle cq, RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_cancel_all_calls(ServerSafeHandle server);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_shutdown_and_notify_callback(ServerSafeHandle server, CompletionQueueSafeHandle cq, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_destroy(IntPtr server);
+            
+            [DllImport(ImportName)]
+            public static extern AuthContextSafeHandle grpcsharp_call_auth_context(CallSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_auth_context_peer_identity_property_name(AuthContextSafeHandle authContext);
+            
+            [DllImport(ImportName)]
+            public static extern AuthContextSafeHandle.NativeAuthPropertyIterator grpcsharp_auth_context_property_iterator(AuthContextSafeHandle authContext);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_auth_property_iterator_next(ref AuthContextSafeHandle.NativeAuthPropertyIterator iterator);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_auth_context_release(IntPtr authContext);
+            
+            [DllImport(ImportName)]
+            public static extern SliceBufferSafeHandle grpcsharp_slice_buffer_create();
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_slice_buffer_adjust_tail_space(SliceBufferSafeHandle sliceBuffer, UIntPtr availableTailSpace, UIntPtr requestedTailSpace);
+            
+            [DllImport(ImportName)]
+            public static extern UIntPtr grpcsharp_slice_buffer_slice_count(SliceBufferSafeHandle sliceBuffer);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_slice_buffer_slice_peek(SliceBufferSafeHandle sliceBuffer, UIntPtr index, out UIntPtr sliceLen, out IntPtr sliceDataPtr);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_slice_buffer_reset_and_unref(SliceBufferSafeHandle sliceBuffer);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_slice_buffer_destroy(IntPtr sliceBuffer);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_now(ClockType clockType);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_inf_future(ClockType clockType);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_inf_past(ClockType clockType);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_convert_clock_type(Timespec t, ClockType targetClock);
+            
+            [DllImport(ImportName)]
+            public static extern int gprsharp_sizeof_timespec();
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_test_callback([MarshalAs(UnmanagedType.FunctionPtr)] NativeCallbackTestDelegate callback);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_test_nop(IntPtr ptr);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_test_override_method(string methodName, string variant);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_test_call_start_unary_echo(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+        }
+
+        /// <summary>
+        /// grpc_csharp_ext used as a shared library (with x64 suffix)
+        /// </summary>
+        internal class DllImportsFromSharedLib_x64
+        {
+            private const string ImportName = "grpc_csharp_ext.x64";
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_init();
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_shutdown();
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_version_string();
+            
+            [DllImport(ImportName)]
+            public static extern BatchContextSafeHandle grpcsharp_batch_context_create();
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_initial_metadata(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_message_length(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_batch_context_recv_message_next_slice_peek(BatchContextSafeHandle ctx, out UIntPtr sliceLen, out IntPtr sliceDataPtr);
+            
+            [DllImport(ImportName)]
+            public static extern StatusCode grpcsharp_batch_context_recv_status_on_client_status(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_status_on_client_details(BatchContextSafeHandle ctx, out UIntPtr detailsLength);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_status_on_client_error_string(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_status_on_client_trailing_metadata(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_batch_context_recv_close_on_server_cancelled(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_batch_context_reset(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_batch_context_destroy(IntPtr ctx);
+            
+            [DllImport(ImportName)]
+            public static extern RequestCallContextSafeHandle grpcsharp_request_call_context_create();
+            
+            [DllImport(ImportName)]
+            public static extern CallSafeHandle grpcsharp_request_call_context_call(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_request_call_context_method(RequestCallContextSafeHandle ctx, out UIntPtr methodLength);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_request_call_context_host(RequestCallContextSafeHandle ctx, out UIntPtr hostLength);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec grpcsharp_request_call_context_deadline(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_request_call_context_request_metadata(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_request_call_context_reset(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_request_call_context_destroy(IntPtr ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallCredentialsSafeHandle grpcsharp_composite_call_credentials_create(CallCredentialsSafeHandle creds1, CallCredentialsSafeHandle creds2);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_call_credentials_release(IntPtr credentials);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_cancel(CallSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_cancel_with_status(CallSafeHandle call, StatusCode status, string description);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_unary(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_client_streaming(CallSafeHandle call, BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_server_streaming(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_duplex_streaming(CallSafeHandle call, BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_message(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, int sendEmptyInitialMetadata);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_close_from_client(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_status_from_server(CallSafeHandle call, BatchContextSafeHandle ctx, StatusCode statusCode, IntPtr statusMessage, UIntPtr statusMessageLen, MetadataArraySafeHandle metadataArray, int sendEmptyInitialMetadata, SliceBufferSafeHandle optionalSendBuffer, WriteFlags writeFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_recv_message(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_recv_initial_metadata(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_serverside(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_initial_metadata(CallSafeHandle call, BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_set_credentials(CallSafeHandle call, CallCredentialsSafeHandle credentials);
+            
+            [DllImport(ImportName)]
+            public static extern CStringSafeHandle grpcsharp_call_get_peer(CallSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_call_destroy(IntPtr call);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelArgsSafeHandle grpcsharp_channel_args_create(UIntPtr numArgs);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_args_set_string(ChannelArgsSafeHandle args, UIntPtr index, string key, string value);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_args_set_integer(ChannelArgsSafeHandle args, UIntPtr index, string key, int value);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_args_destroy(IntPtr args);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_override_default_ssl_roots(string pemRootCerts);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelCredentialsSafeHandle grpcsharp_ssl_credentials_create(string pemRootCerts, string keyCertPairCertChain, string keyCertPairPrivateKey, IntPtr verifyPeerCallbackTag);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelCredentialsSafeHandle grpcsharp_composite_channel_credentials_create(ChannelCredentialsSafeHandle channelCreds, CallCredentialsSafeHandle callCreds);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_credentials_release(IntPtr credentials);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelSafeHandle grpcsharp_insecure_channel_create(string target, ChannelArgsSafeHandle channelArgs);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelSafeHandle grpcsharp_secure_channel_create(ChannelCredentialsSafeHandle credentials, string target, ChannelArgsSafeHandle channelArgs);
+            
+            [DllImport(ImportName)]
+            public static extern CallSafeHandle grpcsharp_channel_create_call(ChannelSafeHandle channel, CallSafeHandle parentCall, ContextPropagationFlags propagationMask, CompletionQueueSafeHandle cq, string method, string host, Timespec deadline);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelState grpcsharp_channel_check_connectivity_state(ChannelSafeHandle channel, int tryToConnect);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_watch_connectivity_state(ChannelSafeHandle channel, ChannelState lastObservedState, Timespec deadline, CompletionQueueSafeHandle cq, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CStringSafeHandle grpcsharp_channel_get_target(ChannelSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_destroy(IntPtr channel);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_sizeof_grpc_event();
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueSafeHandle grpcsharp_completion_queue_create_async();
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueSafeHandle grpcsharp_completion_queue_create_sync();
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_completion_queue_shutdown(CompletionQueueSafeHandle cq);
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueEvent grpcsharp_completion_queue_next(CompletionQueueSafeHandle cq);
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueEvent grpcsharp_completion_queue_pluck(CompletionQueueSafeHandle cq, IntPtr tag);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_completion_queue_destroy(IntPtr cq);
+            
+            [DllImport(ImportName)]
+            public static extern void gprsharp_free(IntPtr ptr);
+            
+            [DllImport(ImportName)]
+            public static extern MetadataArraySafeHandle grpcsharp_metadata_array_create(UIntPtr capacity);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_metadata_array_add(MetadataArraySafeHandle array, string key, byte[] value, UIntPtr valueLength);
+            
+            [DllImport(ImportName)]
+            public static extern UIntPtr grpcsharp_metadata_array_count(IntPtr metadataArray);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_metadata_array_get_key(IntPtr metadataArray, UIntPtr index, out UIntPtr keyLength);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_metadata_array_get_value(IntPtr metadataArray, UIntPtr index, out UIntPtr valueLength);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_metadata_array_destroy_full(IntPtr array);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_redirect_log(GprLogDelegate callback);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_native_callback_dispatcher_init(NativeCallbackDispatcherCallback dispatcher);
+            
+            [DllImport(ImportName)]
+            public static extern CallCredentialsSafeHandle grpcsharp_metadata_credentials_create_from_plugin(IntPtr nativeCallbackTag);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_metadata_credentials_notify_from_plugin(IntPtr callbackPtr, IntPtr userData, MetadataArraySafeHandle metadataArray, StatusCode statusCode, string errorDetails);
+            
+            [DllImport(ImportName)]
+            public static extern ServerCredentialsSafeHandle grpcsharp_ssl_server_credentials_create(string pemRootCerts, string[] keyCertPairCertChainArray, string[] keyCertPairPrivateKeyArray, UIntPtr numKeyCertPairs, SslClientCertificateRequestType clientCertificateRequest);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_credentials_release(IntPtr credentials);
+            
+            [DllImport(ImportName)]
+            public static extern ServerSafeHandle grpcsharp_server_create(ChannelArgsSafeHandle args);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_register_completion_queue(ServerSafeHandle server, CompletionQueueSafeHandle cq);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_server_add_insecure_http2_port(ServerSafeHandle server, string addr);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_server_add_secure_http2_port(ServerSafeHandle server, string addr, ServerCredentialsSafeHandle creds);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_start(ServerSafeHandle server);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_server_request_call(ServerSafeHandle server, CompletionQueueSafeHandle cq, RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_cancel_all_calls(ServerSafeHandle server);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_shutdown_and_notify_callback(ServerSafeHandle server, CompletionQueueSafeHandle cq, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_destroy(IntPtr server);
+            
+            [DllImport(ImportName)]
+            public static extern AuthContextSafeHandle grpcsharp_call_auth_context(CallSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_auth_context_peer_identity_property_name(AuthContextSafeHandle authContext);
+            
+            [DllImport(ImportName)]
+            public static extern AuthContextSafeHandle.NativeAuthPropertyIterator grpcsharp_auth_context_property_iterator(AuthContextSafeHandle authContext);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_auth_property_iterator_next(ref AuthContextSafeHandle.NativeAuthPropertyIterator iterator);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_auth_context_release(IntPtr authContext);
+            
+            [DllImport(ImportName)]
+            public static extern SliceBufferSafeHandle grpcsharp_slice_buffer_create();
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_slice_buffer_adjust_tail_space(SliceBufferSafeHandle sliceBuffer, UIntPtr availableTailSpace, UIntPtr requestedTailSpace);
+            
+            [DllImport(ImportName)]
+            public static extern UIntPtr grpcsharp_slice_buffer_slice_count(SliceBufferSafeHandle sliceBuffer);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_slice_buffer_slice_peek(SliceBufferSafeHandle sliceBuffer, UIntPtr index, out UIntPtr sliceLen, out IntPtr sliceDataPtr);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_slice_buffer_reset_and_unref(SliceBufferSafeHandle sliceBuffer);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_slice_buffer_destroy(IntPtr sliceBuffer);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_now(ClockType clockType);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_inf_future(ClockType clockType);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_inf_past(ClockType clockType);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_convert_clock_type(Timespec t, ClockType targetClock);
+            
+            [DllImport(ImportName)]
+            public static extern int gprsharp_sizeof_timespec();
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_test_callback([MarshalAs(UnmanagedType.FunctionPtr)] NativeCallbackTestDelegate callback);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_test_nop(IntPtr ptr);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_test_override_method(string methodName, string variant);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_test_call_start_unary_echo(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+        }
+
+        /// <summary>
+        /// grpc_csharp_ext used as a shared library (with x86.dll suffix)
+        /// </summary>
+        internal class DllImportsFromSharedLib_x86_dll
+        {
+            private const string ImportName = "grpc_csharp_ext.x86.dll";
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_init();
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_shutdown();
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_version_string();
+            
+            [DllImport(ImportName)]
+            public static extern BatchContextSafeHandle grpcsharp_batch_context_create();
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_initial_metadata(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_message_length(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_batch_context_recv_message_next_slice_peek(BatchContextSafeHandle ctx, out UIntPtr sliceLen, out IntPtr sliceDataPtr);
+            
+            [DllImport(ImportName)]
+            public static extern StatusCode grpcsharp_batch_context_recv_status_on_client_status(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_status_on_client_details(BatchContextSafeHandle ctx, out UIntPtr detailsLength);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_status_on_client_error_string(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_status_on_client_trailing_metadata(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_batch_context_recv_close_on_server_cancelled(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_batch_context_reset(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_batch_context_destroy(IntPtr ctx);
+            
+            [DllImport(ImportName)]
+            public static extern RequestCallContextSafeHandle grpcsharp_request_call_context_create();
+            
+            [DllImport(ImportName)]
+            public static extern CallSafeHandle grpcsharp_request_call_context_call(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_request_call_context_method(RequestCallContextSafeHandle ctx, out UIntPtr methodLength);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_request_call_context_host(RequestCallContextSafeHandle ctx, out UIntPtr hostLength);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec grpcsharp_request_call_context_deadline(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_request_call_context_request_metadata(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_request_call_context_reset(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_request_call_context_destroy(IntPtr ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallCredentialsSafeHandle grpcsharp_composite_call_credentials_create(CallCredentialsSafeHandle creds1, CallCredentialsSafeHandle creds2);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_call_credentials_release(IntPtr credentials);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_cancel(CallSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_cancel_with_status(CallSafeHandle call, StatusCode status, string description);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_unary(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_client_streaming(CallSafeHandle call, BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_server_streaming(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_duplex_streaming(CallSafeHandle call, BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_message(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, int sendEmptyInitialMetadata);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_close_from_client(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_status_from_server(CallSafeHandle call, BatchContextSafeHandle ctx, StatusCode statusCode, IntPtr statusMessage, UIntPtr statusMessageLen, MetadataArraySafeHandle metadataArray, int sendEmptyInitialMetadata, SliceBufferSafeHandle optionalSendBuffer, WriteFlags writeFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_recv_message(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_recv_initial_metadata(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_serverside(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_initial_metadata(CallSafeHandle call, BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_set_credentials(CallSafeHandle call, CallCredentialsSafeHandle credentials);
+            
+            [DllImport(ImportName)]
+            public static extern CStringSafeHandle grpcsharp_call_get_peer(CallSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_call_destroy(IntPtr call);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelArgsSafeHandle grpcsharp_channel_args_create(UIntPtr numArgs);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_args_set_string(ChannelArgsSafeHandle args, UIntPtr index, string key, string value);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_args_set_integer(ChannelArgsSafeHandle args, UIntPtr index, string key, int value);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_args_destroy(IntPtr args);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_override_default_ssl_roots(string pemRootCerts);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelCredentialsSafeHandle grpcsharp_ssl_credentials_create(string pemRootCerts, string keyCertPairCertChain, string keyCertPairPrivateKey, IntPtr verifyPeerCallbackTag);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelCredentialsSafeHandle grpcsharp_composite_channel_credentials_create(ChannelCredentialsSafeHandle channelCreds, CallCredentialsSafeHandle callCreds);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_credentials_release(IntPtr credentials);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelSafeHandle grpcsharp_insecure_channel_create(string target, ChannelArgsSafeHandle channelArgs);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelSafeHandle grpcsharp_secure_channel_create(ChannelCredentialsSafeHandle credentials, string target, ChannelArgsSafeHandle channelArgs);
+            
+            [DllImport(ImportName)]
+            public static extern CallSafeHandle grpcsharp_channel_create_call(ChannelSafeHandle channel, CallSafeHandle parentCall, ContextPropagationFlags propagationMask, CompletionQueueSafeHandle cq, string method, string host, Timespec deadline);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelState grpcsharp_channel_check_connectivity_state(ChannelSafeHandle channel, int tryToConnect);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_watch_connectivity_state(ChannelSafeHandle channel, ChannelState lastObservedState, Timespec deadline, CompletionQueueSafeHandle cq, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CStringSafeHandle grpcsharp_channel_get_target(ChannelSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_destroy(IntPtr channel);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_sizeof_grpc_event();
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueSafeHandle grpcsharp_completion_queue_create_async();
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueSafeHandle grpcsharp_completion_queue_create_sync();
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_completion_queue_shutdown(CompletionQueueSafeHandle cq);
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueEvent grpcsharp_completion_queue_next(CompletionQueueSafeHandle cq);
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueEvent grpcsharp_completion_queue_pluck(CompletionQueueSafeHandle cq, IntPtr tag);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_completion_queue_destroy(IntPtr cq);
+            
+            [DllImport(ImportName)]
+            public static extern void gprsharp_free(IntPtr ptr);
+            
+            [DllImport(ImportName)]
+            public static extern MetadataArraySafeHandle grpcsharp_metadata_array_create(UIntPtr capacity);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_metadata_array_add(MetadataArraySafeHandle array, string key, byte[] value, UIntPtr valueLength);
+            
+            [DllImport(ImportName)]
+            public static extern UIntPtr grpcsharp_metadata_array_count(IntPtr metadataArray);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_metadata_array_get_key(IntPtr metadataArray, UIntPtr index, out UIntPtr keyLength);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_metadata_array_get_value(IntPtr metadataArray, UIntPtr index, out UIntPtr valueLength);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_metadata_array_destroy_full(IntPtr array);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_redirect_log(GprLogDelegate callback);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_native_callback_dispatcher_init(NativeCallbackDispatcherCallback dispatcher);
+            
+            [DllImport(ImportName)]
+            public static extern CallCredentialsSafeHandle grpcsharp_metadata_credentials_create_from_plugin(IntPtr nativeCallbackTag);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_metadata_credentials_notify_from_plugin(IntPtr callbackPtr, IntPtr userData, MetadataArraySafeHandle metadataArray, StatusCode statusCode, string errorDetails);
+            
+            [DllImport(ImportName)]
+            public static extern ServerCredentialsSafeHandle grpcsharp_ssl_server_credentials_create(string pemRootCerts, string[] keyCertPairCertChainArray, string[] keyCertPairPrivateKeyArray, UIntPtr numKeyCertPairs, SslClientCertificateRequestType clientCertificateRequest);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_credentials_release(IntPtr credentials);
+            
+            [DllImport(ImportName)]
+            public static extern ServerSafeHandle grpcsharp_server_create(ChannelArgsSafeHandle args);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_register_completion_queue(ServerSafeHandle server, CompletionQueueSafeHandle cq);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_server_add_insecure_http2_port(ServerSafeHandle server, string addr);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_server_add_secure_http2_port(ServerSafeHandle server, string addr, ServerCredentialsSafeHandle creds);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_start(ServerSafeHandle server);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_server_request_call(ServerSafeHandle server, CompletionQueueSafeHandle cq, RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_cancel_all_calls(ServerSafeHandle server);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_shutdown_and_notify_callback(ServerSafeHandle server, CompletionQueueSafeHandle cq, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_destroy(IntPtr server);
+            
+            [DllImport(ImportName)]
+            public static extern AuthContextSafeHandle grpcsharp_call_auth_context(CallSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_auth_context_peer_identity_property_name(AuthContextSafeHandle authContext);
+            
+            [DllImport(ImportName)]
+            public static extern AuthContextSafeHandle.NativeAuthPropertyIterator grpcsharp_auth_context_property_iterator(AuthContextSafeHandle authContext);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_auth_property_iterator_next(ref AuthContextSafeHandle.NativeAuthPropertyIterator iterator);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_auth_context_release(IntPtr authContext);
+            
+            [DllImport(ImportName)]
+            public static extern SliceBufferSafeHandle grpcsharp_slice_buffer_create();
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_slice_buffer_adjust_tail_space(SliceBufferSafeHandle sliceBuffer, UIntPtr availableTailSpace, UIntPtr requestedTailSpace);
+            
+            [DllImport(ImportName)]
+            public static extern UIntPtr grpcsharp_slice_buffer_slice_count(SliceBufferSafeHandle sliceBuffer);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_slice_buffer_slice_peek(SliceBufferSafeHandle sliceBuffer, UIntPtr index, out UIntPtr sliceLen, out IntPtr sliceDataPtr);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_slice_buffer_reset_and_unref(SliceBufferSafeHandle sliceBuffer);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_slice_buffer_destroy(IntPtr sliceBuffer);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_now(ClockType clockType);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_inf_future(ClockType clockType);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_inf_past(ClockType clockType);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_convert_clock_type(Timespec t, ClockType targetClock);
+            
+            [DllImport(ImportName)]
+            public static extern int gprsharp_sizeof_timespec();
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_test_callback([MarshalAs(UnmanagedType.FunctionPtr)] NativeCallbackTestDelegate callback);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_test_nop(IntPtr ptr);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_test_override_method(string methodName, string variant);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_test_call_start_unary_echo(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+        }
+
+        /// <summary>
+        /// grpc_csharp_ext used as a shared library (with x64.dll suffix)
+        /// </summary>
+        internal class DllImportsFromSharedLib_x64_dll
+        {
+            private const string ImportName = "grpc_csharp_ext.x64.dll";
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_init();
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_shutdown();
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_version_string();
+            
+            [DllImport(ImportName)]
+            public static extern BatchContextSafeHandle grpcsharp_batch_context_create();
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_initial_metadata(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_message_length(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_batch_context_recv_message_next_slice_peek(BatchContextSafeHandle ctx, out UIntPtr sliceLen, out IntPtr sliceDataPtr);
+            
+            [DllImport(ImportName)]
+            public static extern StatusCode grpcsharp_batch_context_recv_status_on_client_status(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_status_on_client_details(BatchContextSafeHandle ctx, out UIntPtr detailsLength);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_status_on_client_error_string(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_batch_context_recv_status_on_client_trailing_metadata(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_batch_context_recv_close_on_server_cancelled(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_batch_context_reset(BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_batch_context_destroy(IntPtr ctx);
+            
+            [DllImport(ImportName)]
+            public static extern RequestCallContextSafeHandle grpcsharp_request_call_context_create();
+            
+            [DllImport(ImportName)]
+            public static extern CallSafeHandle grpcsharp_request_call_context_call(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_request_call_context_method(RequestCallContextSafeHandle ctx, out UIntPtr methodLength);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_request_call_context_host(RequestCallContextSafeHandle ctx, out UIntPtr hostLength);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec grpcsharp_request_call_context_deadline(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_request_call_context_request_metadata(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_request_call_context_reset(RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_request_call_context_destroy(IntPtr ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallCredentialsSafeHandle grpcsharp_composite_call_credentials_create(CallCredentialsSafeHandle creds1, CallCredentialsSafeHandle creds2);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_call_credentials_release(IntPtr credentials);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_cancel(CallSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_cancel_with_status(CallSafeHandle call, StatusCode status, string description);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_unary(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_client_streaming(CallSafeHandle call, BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_server_streaming(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_duplex_streaming(CallSafeHandle call, BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_message(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, int sendEmptyInitialMetadata);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_close_from_client(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_status_from_server(CallSafeHandle call, BatchContextSafeHandle ctx, StatusCode statusCode, IntPtr statusMessage, UIntPtr statusMessageLen, MetadataArraySafeHandle metadataArray, int sendEmptyInitialMetadata, SliceBufferSafeHandle optionalSendBuffer, WriteFlags writeFlags);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_recv_message(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_recv_initial_metadata(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_start_serverside(CallSafeHandle call, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_send_initial_metadata(CallSafeHandle call, BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_call_set_credentials(CallSafeHandle call, CallCredentialsSafeHandle credentials);
+            
+            [DllImport(ImportName)]
+            public static extern CStringSafeHandle grpcsharp_call_get_peer(CallSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_call_destroy(IntPtr call);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelArgsSafeHandle grpcsharp_channel_args_create(UIntPtr numArgs);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_args_set_string(ChannelArgsSafeHandle args, UIntPtr index, string key, string value);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_args_set_integer(ChannelArgsSafeHandle args, UIntPtr index, string key, int value);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_args_destroy(IntPtr args);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_override_default_ssl_roots(string pemRootCerts);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelCredentialsSafeHandle grpcsharp_ssl_credentials_create(string pemRootCerts, string keyCertPairCertChain, string keyCertPairPrivateKey, IntPtr verifyPeerCallbackTag);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelCredentialsSafeHandle grpcsharp_composite_channel_credentials_create(ChannelCredentialsSafeHandle channelCreds, CallCredentialsSafeHandle callCreds);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_credentials_release(IntPtr credentials);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelSafeHandle grpcsharp_insecure_channel_create(string target, ChannelArgsSafeHandle channelArgs);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelSafeHandle grpcsharp_secure_channel_create(ChannelCredentialsSafeHandle credentials, string target, ChannelArgsSafeHandle channelArgs);
+            
+            [DllImport(ImportName)]
+            public static extern CallSafeHandle grpcsharp_channel_create_call(ChannelSafeHandle channel, CallSafeHandle parentCall, ContextPropagationFlags propagationMask, CompletionQueueSafeHandle cq, string method, string host, Timespec deadline);
+            
+            [DllImport(ImportName)]
+            public static extern ChannelState grpcsharp_channel_check_connectivity_state(ChannelSafeHandle channel, int tryToConnect);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_watch_connectivity_state(ChannelSafeHandle channel, ChannelState lastObservedState, Timespec deadline, CompletionQueueSafeHandle cq, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern CStringSafeHandle grpcsharp_channel_get_target(ChannelSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_channel_destroy(IntPtr channel);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_sizeof_grpc_event();
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueSafeHandle grpcsharp_completion_queue_create_async();
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueSafeHandle grpcsharp_completion_queue_create_sync();
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_completion_queue_shutdown(CompletionQueueSafeHandle cq);
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueEvent grpcsharp_completion_queue_next(CompletionQueueSafeHandle cq);
+            
+            [DllImport(ImportName)]
+            public static extern CompletionQueueEvent grpcsharp_completion_queue_pluck(CompletionQueueSafeHandle cq, IntPtr tag);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_completion_queue_destroy(IntPtr cq);
+            
+            [DllImport(ImportName)]
+            public static extern void gprsharp_free(IntPtr ptr);
+            
+            [DllImport(ImportName)]
+            public static extern MetadataArraySafeHandle grpcsharp_metadata_array_create(UIntPtr capacity);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_metadata_array_add(MetadataArraySafeHandle array, string key, byte[] value, UIntPtr valueLength);
+            
+            [DllImport(ImportName)]
+            public static extern UIntPtr grpcsharp_metadata_array_count(IntPtr metadataArray);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_metadata_array_get_key(IntPtr metadataArray, UIntPtr index, out UIntPtr keyLength);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_metadata_array_get_value(IntPtr metadataArray, UIntPtr index, out UIntPtr valueLength);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_metadata_array_destroy_full(IntPtr array);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_redirect_log(GprLogDelegate callback);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_native_callback_dispatcher_init(NativeCallbackDispatcherCallback dispatcher);
+            
+            [DllImport(ImportName)]
+            public static extern CallCredentialsSafeHandle grpcsharp_metadata_credentials_create_from_plugin(IntPtr nativeCallbackTag);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_metadata_credentials_notify_from_plugin(IntPtr callbackPtr, IntPtr userData, MetadataArraySafeHandle metadataArray, StatusCode statusCode, string errorDetails);
+            
+            [DllImport(ImportName)]
+            public static extern ServerCredentialsSafeHandle grpcsharp_ssl_server_credentials_create(string pemRootCerts, string[] keyCertPairCertChainArray, string[] keyCertPairPrivateKeyArray, UIntPtr numKeyCertPairs, SslClientCertificateRequestType clientCertificateRequest);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_credentials_release(IntPtr credentials);
+            
+            [DllImport(ImportName)]
+            public static extern ServerSafeHandle grpcsharp_server_create(ChannelArgsSafeHandle args);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_register_completion_queue(ServerSafeHandle server, CompletionQueueSafeHandle cq);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_server_add_insecure_http2_port(ServerSafeHandle server, string addr);
+            
+            [DllImport(ImportName)]
+            public static extern int grpcsharp_server_add_secure_http2_port(ServerSafeHandle server, string addr, ServerCredentialsSafeHandle creds);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_start(ServerSafeHandle server);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_server_request_call(ServerSafeHandle server, CompletionQueueSafeHandle cq, RequestCallContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_cancel_all_calls(ServerSafeHandle server);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_shutdown_and_notify_callback(ServerSafeHandle server, CompletionQueueSafeHandle cq, BatchContextSafeHandle ctx);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_server_destroy(IntPtr server);
+            
+            [DllImport(ImportName)]
+            public static extern AuthContextSafeHandle grpcsharp_call_auth_context(CallSafeHandle call);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_auth_context_peer_identity_property_name(AuthContextSafeHandle authContext);
+            
+            [DllImport(ImportName)]
+            public static extern AuthContextSafeHandle.NativeAuthPropertyIterator grpcsharp_auth_context_property_iterator(AuthContextSafeHandle authContext);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_auth_property_iterator_next(ref AuthContextSafeHandle.NativeAuthPropertyIterator iterator);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_auth_context_release(IntPtr authContext);
+            
+            [DllImport(ImportName)]
+            public static extern SliceBufferSafeHandle grpcsharp_slice_buffer_create();
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_slice_buffer_adjust_tail_space(SliceBufferSafeHandle sliceBuffer, UIntPtr availableTailSpace, UIntPtr requestedTailSpace);
+            
+            [DllImport(ImportName)]
+            public static extern UIntPtr grpcsharp_slice_buffer_slice_count(SliceBufferSafeHandle sliceBuffer);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_slice_buffer_slice_peek(SliceBufferSafeHandle sliceBuffer, UIntPtr index, out UIntPtr sliceLen, out IntPtr sliceDataPtr);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_slice_buffer_reset_and_unref(SliceBufferSafeHandle sliceBuffer);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_slice_buffer_destroy(IntPtr sliceBuffer);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_now(ClockType clockType);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_inf_future(ClockType clockType);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_inf_past(ClockType clockType);
+            
+            [DllImport(ImportName)]
+            public static extern Timespec gprsharp_convert_clock_type(Timespec t, ClockType targetClock);
+            
+            [DllImport(ImportName)]
+            public static extern int gprsharp_sizeof_timespec();
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_test_callback([MarshalAs(UnmanagedType.FunctionPtr)] NativeCallbackTestDelegate callback);
+            
+            [DllImport(ImportName)]
+            public static extern IntPtr grpcsharp_test_nop(IntPtr ptr);
+            
+            [DllImport(ImportName)]
+            public static extern void grpcsharp_test_override_method(string methodName, string variant);
+            
+            [DllImport(ImportName)]
+            public static extern CallError grpcsharp_test_call_start_unary_echo(CallSafeHandle call, BatchContextSafeHandle ctx, SliceBufferSafeHandle sendBuffer, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags metadataFlags);
+        }
     }
 }
index 8d7e8c2..0a0aaf9 100644 (file)
@@ -20,6 +20,7 @@ using System;
 using System.Collections.Concurrent;
 using System.Diagnostics;
 using System.IO;
+using System.Linq;
 using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Threading;
@@ -32,7 +33,11 @@ namespace Grpc.Core.Internal
     /// </summary>
     internal static class PlatformApis
     {
-        const string UnityEngineApplicationClassName = "UnityEngine.Application, UnityEngine";
+        const string UnityEngineAssemblyName = "UnityEngine";
+
+        const string UnityEngineApplicationClassName = "UnityEngine.Application";
+
+        const string UnityIPhonePlayer = "IPhonePlayer";
         const string XamarinAndroidObjectClassName = "Java.Lang.Object, Mono.Android";
         const string XamarinIOSObjectClassName = "Foundation.NSObject, Xamarin.iOS";
 
@@ -41,19 +46,22 @@ namespace Grpc.Core.Internal
         static readonly bool isWindows;
         static readonly bool isMono;
         static readonly bool isNetCore;
-        static readonly bool isUnity;
-        static readonly bool isUnityIOS;
+        static readonly string unityApplicationPlatform;
         static readonly bool isXamarin;
         static readonly bool isXamarinIOS;
         static readonly bool isXamarinAndroid;
 
         static PlatformApis()
         {
-#if NETSTANDARD1_5 || NETSTANDARD2_0
+#if NETSTANDARD
             isLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
             isMacOSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
             isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
-            isNetCore = RuntimeInformation.FrameworkDescription.StartsWith(".NET Core");
+            isNetCore =
+#if NETSTANDARD2_0
+                Environment.Version.Major >= 5 ||
+#endif
+                RuntimeInformation.FrameworkDescription.StartsWith(".NET Core");
 #else
             var platform = Environment.OSVersion.Platform;
 
@@ -66,21 +74,7 @@ namespace Grpc.Core.Internal
             isMono = Type.GetType("Mono.Runtime") != null;
 
             // Unity
-            var unityApplicationClass = Type.GetType(UnityEngineApplicationClassName);
-            if (unityApplicationClass != null)
-            {
-                isUnity = true;
-                // Consult value of Application.platform via reflection
-                // https://docs.unity3d.com/ScriptReference/Application-platform.html
-                var platformProperty = unityApplicationClass.GetTypeInfo().GetProperty("platform");
-                var unityRuntimePlatform = platformProperty?.GetValue(null)?.ToString();
-                isUnityIOS = (unityRuntimePlatform == "IPhonePlayer");
-            }
-            else
-            {
-                isUnity = false;
-                isUnityIOS = false;
-            }
+            unityApplicationPlatform = TryGetUnityApplicationPlatform();
 
             // Xamarin
             isXamarinIOS = Type.GetType(XamarinIOSObjectClassName) != null;
@@ -88,79 +82,46 @@ namespace Grpc.Core.Internal
             isXamarin = isXamarinIOS || isXamarinAndroid;
         }
 
-        public static bool IsLinux
-        {
-            get { return isLinux; }
-        }
+        public static bool IsLinux => isLinux;
 
-        public static bool IsMacOSX
-        {
-            get { return isMacOSX; }
-        }
+        public static bool IsMacOSX => isMacOSX;
 
-        public static bool IsWindows
-        {
-            get { return isWindows; }
-        }
+        public static bool IsWindows => isWindows;
 
-        public static bool IsMono
-        {
-            get { return isMono; }
-        }
+        public static bool IsMono => isMono;
 
         /// <summary>
         /// true if running on Unity platform.
         /// </summary>
-        public static bool IsUnity
-        {
-            get { return isUnity; }
-        }
+        public static bool IsUnity => unityApplicationPlatform != null;
 
         /// <summary>
         /// true if running on Unity iOS, false otherwise.
         /// </summary>
-        public static bool IsUnityIOS
-        {
-            get { return isUnityIOS; }
-        }
+        public static bool IsUnityIOS => unityApplicationPlatform == UnityIPhonePlayer;
 
         /// <summary>
         /// true if running on a Xamarin platform (either Xamarin.Android or Xamarin.iOS),
         /// false otherwise.
         /// </summary>
-        public static bool IsXamarin
-        {
-            get { return isXamarin; }
-        }
+        public static bool IsXamarin => isXamarin;
 
         /// <summary>
         /// true if running on Xamarin.iOS, false otherwise.
         /// </summary>
-        public static bool IsXamarinIOS
-        {
-            get { return isXamarinIOS; }
-        }
+        public static bool IsXamarinIOS => isXamarinIOS;
 
         /// <summary>
         /// true if running on Xamarin.Android, false otherwise.
         /// </summary>
-        public static bool IsXamarinAndroid
-        {
-            get { return isXamarinAndroid; }
-        }
+        public static bool IsXamarinAndroid => isXamarinAndroid;
 
         /// <summary>
         /// true if running on .NET Core (CoreCLR), false otherwise.
         /// </summary>
-        public static bool IsNetCore
-        {
-            get { return isNetCore; }
-        }
+        public static bool IsNetCore => isNetCore;
 
-        public static bool Is64Bit
-        {
-            get { return IntPtr.Size == 8; }
-        }
+        public static bool Is64Bit => IntPtr.Size == 8;
 
         /// <summary>
         /// Returns <c>UnityEngine.Application.platform</c> as a string.
@@ -168,14 +129,49 @@ namespace Grpc.Core.Internal
         /// Value is obtained via reflection to avoid compile-time dependency on Unity.
         /// This method should only be called if <c>IsUnity</c> is <c>true</c>.
         /// </summary>
-        public static string GetUnityRuntimePlatform()
+        public static string GetUnityApplicationPlatform()
         {
             GrpcPreconditions.CheckState(IsUnity, "Not running on Unity.");
-#if NETSTANDARD1_5 || NETSTANDARD2_0
-            return Type.GetType(UnityEngineApplicationClassName).GetTypeInfo().GetProperty("platform").GetValue(null).ToString();
-#else
-            return Type.GetType(UnityEngineApplicationClassName).GetProperty("platform").GetValue(null).ToString();
+            return unityApplicationPlatform;
+        }
+
+        /// <summary>
+        /// Returns <c>UnityEngine.Application.platform</c> as a string or <c>null</c>
+        /// if not running on Unity.
+        /// Value is obtained via reflection to avoid compile-time dependency on Unity.
+        /// </summary>
+        static string TryGetUnityApplicationPlatform()
+        {
+            Assembly unityAssembly = null;
+#if !NETSTANDARD1_5
+            // On netstandard1.5, AppDomain is not available and we just short-circuit the logic there.
+            // This is fine because only the net45 or netstandard2.0 version Grpc.Core assembly is going to used in Unity.
+            // NOTE: Instead of trying to load the UnityEngine.Application class via <c>Type.GetType()</c>
+            // we are using a more sneaky approach to avoid inadvertently loading the UnityEngine
+            // assembly (that might be available even when we are not actually on Unity, resulting
+            // in false positive). See https://github.com/grpc/grpc/issues/18801
+            unityAssembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(assembly => assembly.GetName().Name == UnityEngineAssemblyName);
 #endif
+            var applicationClass = unityAssembly?.GetType(UnityEngineApplicationClassName);
+            var platformProperty = applicationClass?.GetTypeInfo().GetProperty("platform", BindingFlags.Static | BindingFlags.Public);
+            try
+            {
+                // Consult value of Application.platform via reflection
+                // https://docs.unity3d.com/ScriptReference/Application-platform.html
+                return platformProperty?.GetValue(null)?.ToString();
+            }
+            catch (TargetInvocationException)
+            {
+                // The getter for Application.platform is defined as "extern", so if UnityEngine assembly is loaded outside of a Unity application,
+                // the definition for the getter will be missing - note that this is a sneaky trick that helps us tell a real Unity application from a non-unity
+                // application which just happens to have loaded the UnityEngine.dll assembly.
+                // https://github.com/Unity-Technologies/UnityCsReference/blob/61f92bd79ae862c4465d35270f9d1d57befd1761/Runtime/Export/Application/Application.bindings.cs#L375
+                // See https://github.com/grpc/grpc/issues/23334
+
+                // If TargetInvocationException was thrown, it most likely means that the method definition for the extern method is missing,
+                // and we are going to interpret this as "not running on Unity".
+                return null;
+            }
         }
 
         [DllImport("libc")]
index 0fbcaee..577b11a 100644 (file)
@@ -120,7 +120,7 @@ namespace Grpc.Core.Internal
             {
                 throw new MissingMethodException(string.Format("The native method \"{0}\" does not exist", methodName));
             }
-#if NETSTANDARD1_5 || NETSTANDARD2_0
+#if NETSTANDARD
             return Marshal.GetDelegateForFunctionPointer<T>(ptr);  // non-generic version is obsolete
 #else
             return Marshal.GetDelegateForFunctionPointer(ptr, typeof(T)) as T;  // generic version not available in .NET45
index 21cd633..34b40cc 100644 (file)
@@ -33,7 +33,7 @@ namespace Grpc.Core.Utils
         {
             get
             {
-#if NETSTANDARD1_5 || NETSTANDARD2_0
+#if NETSTANDARD
                 return Task.CompletedTask;
 #else
                 return Task.FromResult<object>(null);  // for .NET45, emulate the functionality
index 1b0c6f0..3f33b9f 100644 (file)
     the Grpc.Core.dll assembly and the native libraries are used at all times.
   -->
   <ItemGroup Condition="'$(Grpc_SkipNativeLibsCopy)' != 'true'">
-    <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\win\native\grpc_csharp_ext.x86.dll">
+    <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\win-x86\native\grpc_csharp_ext.x86.dll">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <Link>grpc_csharp_ext.x86.dll</Link>
       <Visible>false</Visible>
     </Content>
-    <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\win\native\grpc_csharp_ext.x64.dll">
+    <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\win-x64\native\grpc_csharp_ext.x64.dll">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <Link>grpc_csharp_ext.x64.dll</Link>
       <Visible>false</Visible>
     </Content>
-    <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux\native\libgrpc_csharp_ext.x86.so">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-      <Link>libgrpc_csharp_ext.x86.so</Link>
-      <Visible>false</Visible>
-    </Content>
-    <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux\native\libgrpc_csharp_ext.x64.so">
+    <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-x64\native\libgrpc_csharp_ext.x64.so">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <Link>libgrpc_csharp_ext.x64.so</Link>
       <Visible>false</Visible>
     </Content>
-    <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\osx\native\libgrpc_csharp_ext.x86.dylib">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-      <Link>libgrpc_csharp_ext.x86.dylib</Link>
-      <Visible>false</Visible>
-    </Content>
-    <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\osx\native\libgrpc_csharp_ext.x64.dylib">
+    <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\osx-x64\native\libgrpc_csharp_ext.x64.dylib">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <Link>libgrpc_csharp_ext.x64.dylib</Link>
       <Visible>false</Visible>
index 0301823..6b95ddb 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index f969d3a..ac13edd 100644 (file)
 // See the License for the specific language governing permissions and
 // limitations under the License.
 #endregion
-using System;
-using System.Runtime.InteropServices;
-using System.Threading;
+using System.Threading.Tasks;
 using Grpc.Core;
 
 namespace Math
 {
     class MathClient
     {
-        public static void Main(string[] args)
+        public static async Task Main(string[] args)
         {
             var channel = new Channel("127.0.0.1", 23456, ChannelCredentials.Insecure);
             Math.MathClient client = new Math.MathClient(channel);
             MathExamples.DivExample(client);
 
-            MathExamples.DivAsyncExample(client).Wait();
+            await MathExamples.DivAsyncExample(client);
 
-            MathExamples.FibExample(client).Wait();
+            await MathExamples.FibExample(client);
 
-            MathExamples.SumExample(client).Wait();
+            await MathExamples.SumExample(client);
 
-            MathExamples.DivManyExample(client).Wait();
+            await MathExamples.DivManyExample(client);
 
-            MathExamples.DependendRequestsExample(client).Wait();
+            await MathExamples.DependentRequestsExample(client);
 
-            channel.ShutdownAsync().Wait();
+            await channel.ShutdownAsync();
         }
     }
 }
index 0301823..6b95ddb 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index 467a268..56cc185 100644 (file)
@@ -15,8 +15,7 @@
 #endregion
 
 using System;
-using System.Runtime.InteropServices;
-using System.Threading;
+using System.Threading.Tasks;
 using Grpc.Core;
 
 namespace Math
@@ -26,7 +25,7 @@ namespace Math
         const string Host = "0.0.0.0";
         const int Port = 23456;
 
-        public static void Main(string[] args)
+        public static async Task Main(string[] args)
         {
             Server server = new Server
             {
@@ -40,7 +39,7 @@ namespace Math
             Console.WriteLine("Press any key to stop the server...");
             Console.ReadKey();
 
-            server.ShutdownAsync().Wait();
+            await server.ShutdownAsync();
         }
     }
 }
index b3fbbff..e6304c4 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index 66ea718..915ef69 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
index b5d0b4e..d29c41a 100644 (file)
@@ -69,6 +69,7 @@ namespace Math
                 new DivArgs { Dividend = 100, Divisor = 21 },
                 new DivArgs { Dividend = 7, Divisor = 2 }
             };
+
             using (var call = client.DivMany())
             { 
                 await call.RequestStream.WriteAllAsync(divArgsList);
@@ -76,7 +77,7 @@ namespace Math
             }
         }
 
-        public static async Task DependendRequestsExample(Math.MathClient client)
+        public static async Task DependentRequestsExample(Math.MathClient client)
         {
             var numbers = new List<Num>
             {
index 0cc1b79..2ef7629 100644 (file)
@@ -16,9 +16,7 @@
 
 #endregion
 
-using System;
 using System.Collections.Generic;
-using System.Threading;
 using System.Threading.Tasks;
 using Grpc.Core;
 using Grpc.Core.Utils;
index a5dfa18..e04eaa5 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index 7c475a9..ecd781f 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <Authors>The gRPC Authors</Authors>
     <Copyright>Copyright 2015 The gRPC Authors</Copyright>
index a5baf96..659753b 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index 8f4833e..085d08c 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index a5baf96..659753b 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index a5baf96..659753b 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index a5baf96..659753b 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index 9d71989..1c93822 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index f775e4c..9a7a79a 100644 (file)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net461;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index e190208..5a6b674 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index 4dbc8d6..bc75a65 100755 (executable)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <Authors>The gRPC Authors</Authors>
     <Copyright>Copyright 2016 The gRPC Authors</Copyright>
index 85b1cf0..d7f6dc6 100644 (file)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
     <OutputType>Exe</OutputType>
index 00708c4..f7ea13c 100644 (file)
@@ -66,27 +66,53 @@ namespace Grpc.Tools
                 default: Cpu = CpuKind.Unknown; break;
             }
 #else
-            // Running under either Mono or full MS framework.
-            Os = OsKind.Windows;
-            if (Type.GetType("Mono.Runtime", throwOnError: false) != null)
+            // Using the same best-effort detection logic as Grpc.Core/PlatformApis.cs
+            var platform = Environment.OSVersion.Platform;
+            if (platform == PlatformID.Win32NT || platform == PlatformID.Win32S || platform == PlatformID.Win32Windows)
             {
-                // Congratulations. We are running under Mono.
-                var plat = Environment.OSVersion.Platform;
-                if (plat == PlatformID.MacOSX)
-                {
-                    Os = OsKind.MacOsX;
-                }
-                else if (plat == PlatformID.Unix || (int)plat == 128)
-                {
-                    // This is how Mono detects OSX internally.
-                    Os = File.Exists("/usr/lib/libc.dylib") ? OsKind.MacOsX : OsKind.Linux;
-                }
+                Os = OsKind.Windows;
+            }
+            else if (platform == PlatformID.Unix && GetUname() == "Darwin")
+            {
+                Os = OsKind.MacOsX;
+            }
+            else
+            {
+                Os = OsKind.Linux;
             }
 
             // Hope we are not building on ARM under Xamarin!
             Cpu = Environment.Is64BitProcess ? CpuKind.X64 : CpuKind.X86;
 #endif
         }
+
+        [DllImport("libc")]
+        static extern int uname(IntPtr buf);
+
+        // This code is copied from Grpc.Core/PlatformApis.cs
+        static string GetUname()
+        {
+            var buffer = Marshal.AllocHGlobal(8192);
+            try
+            {
+                if (uname(buffer) == 0)
+                {
+                    return Marshal.PtrToStringAnsi(buffer);
+                }
+                return string.Empty;
+            }
+            catch
+            {
+                return string.Empty;
+            }
+            finally
+            {
+                if (buffer != IntPtr.Zero)
+                {
+                    Marshal.FreeHGlobal(buffer);
+                }
+            }
+        }
     };
 
     // Exception handling helpers.
index f0c571e..3923a8c 100644 (file)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <AssemblyName>Protobuf.MSBuild</AssemblyName>
     <VersionPrefix>$(GrpcCsharpVersion)</VersionPrefix>
index 01d1b94..a95ee1f 100644 (file)
@@ -47,6 +47,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.Tools.Tests", "Grpc.To
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Grpc.IntegrationTesting.XdsClient", "Grpc.IntegrationTesting.XdsClient\Grpc.IntegrationTesting.XdsClient.csproj", "{7306313A-4853-4CFF-B913-0FCB1A497449}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Grpc.Core.Xamarin", "Grpc.Core.Xamarin\Grpc.Core.Xamarin.csproj", "{1DCB698B-1383-4297-975A-EC8383295141}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Grpc", "Grpc\Grpc.csproj", "{6029123D-BA2B-4333-A2FD-67FB1F6CBBCD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Grpc.Core.NativeDebug", "Grpc.Core.NativeDebug\Grpc.Core.NativeDebug.csproj", "{502E19BC-3E9A-487F-B871-94CC2E66AC0A}"
+EndProject
 Global
        GlobalSection(SolutionConfigurationPlatforms) = preSolution
                Debug|Any CPU = Debug|Any CPU
@@ -141,6 +147,18 @@ Global
                {7306313A-4853-4CFF-B913-0FCB1A497449}.Debug|Any CPU.Build.0 = Debug|Any CPU
                {7306313A-4853-4CFF-B913-0FCB1A497449}.Release|Any CPU.ActiveCfg = Release|Any CPU
                {7306313A-4853-4CFF-B913-0FCB1A497449}.Release|Any CPU.Build.0 = Release|Any CPU
+               {1DCB698B-1383-4297-975A-EC8383295141}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {1DCB698B-1383-4297-975A-EC8383295141}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {1DCB698B-1383-4297-975A-EC8383295141}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {1DCB698B-1383-4297-975A-EC8383295141}.Release|Any CPU.Build.0 = Release|Any CPU
+               {6029123D-BA2B-4333-A2FD-67FB1F6CBBCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {6029123D-BA2B-4333-A2FD-67FB1F6CBBCD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {6029123D-BA2B-4333-A2FD-67FB1F6CBBCD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {6029123D-BA2B-4333-A2FD-67FB1F6CBBCD}.Release|Any CPU.Build.0 = Release|Any CPU
+               {502E19BC-3E9A-487F-B871-94CC2E66AC0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {502E19BC-3E9A-487F-B871-94CC2E66AC0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {502E19BC-3E9A-487F-B871-94CC2E66AC0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {502E19BC-3E9A-487F-B871-94CC2E66AC0A}.Release|Any CPU.Build.0 = Release|Any CPU
        EndGlobalSection
        GlobalSection(SolutionProperties) = preSolution
                HideSolutionNode = FALSE
index 4cf52cc..2494b0a 100644 (file)
@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\Grpc.Core\Common.csproj.include" />
-
   <PropertyGroup>
     <Authors>The gRPC Authors</Authors>
     <Copyright>Copyright 2015 The gRPC Authors</Copyright>
old mode 100755 (executable)
new mode 100644 (file)
similarity index 75%
rename from src/csharp/Grpc.Core/Common.csproj.include
rename to src/csharp/build/common.props
index 41918e0..40abd03
     <PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
   </PropertyGroup>
 
-  <!-- Needed for the net45 build to work on Unix. See https://github.com/dotnet/designs/pull/33 -->
-  <ItemGroup>
-    <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0">
-      <PrivateAssets>all</PrivateAssets>
-      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
-    </PackageReference>
-  </ItemGroup>
+  <PropertyGroup>
+    <LangVersion>7.2</LangVersion>
+  </PropertyGroup>
 </Project>
+
index f778d90..9db8145 100644 (file)
@@ -1,7 +1,7 @@
 <!-- This file is generated -->
 <Project>
   <PropertyGroup>
-    <GrpcCsharpVersion>2.33.2</GrpcCsharpVersion>
+    <GrpcCsharpVersion>2.34.0</GrpcCsharpVersion>
     <GoogleProtobufVersion>3.13.0</GoogleProtobufVersion>
   </PropertyGroup>
 </Project>
diff --git a/src/csharp/build_nuget.sh b/src/csharp/build_nuget.sh
new file mode 100755 (executable)
index 0000000..9ebb6d8
--- /dev/null
@@ -0,0 +1,54 @@
+#!/bin/bash
+# Copyright 2020 The gRPC Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -ex
+
+cd "$(dirname "$0")"
+
+mkdir -p ../../artifacts
+
+# Collect the artifacts built by the previous build step
+mkdir -p nativelibs
+cp -r "${EXTERNAL_GIT_ROOT}"/input_artifacts/csharp_ext_* nativelibs || true
+
+# Collect protoc artifacts built by the previous build step
+mkdir -p protoc_plugins
+cp -r "${EXTERNAL_GIT_ROOT}"/input_artifacts/protoc_* protoc_plugins || true
+
+# Add current timestamp to dev nugets
+./expand_dev_version.sh
+
+dotnet restore Grpc.sln
+
+# To be able to build the Grpc.Core project, we also need to put grpc_csharp_ext to where Grpc.Core.csproj
+# expects it.
+mkdir -p ../../cmake/build
+cp nativelibs/csharp_ext_linux_x64/libgrpc_csharp_ext.so ../../cmake/build
+
+dotnet pack --configuration Release Grpc.Core.Api --output ../../../artifacts
+dotnet pack --configuration Release Grpc.Core --output ../../../artifacts
+dotnet pack --configuration Release Grpc.Core.Testing --output ../../../artifacts
+dotnet pack --configuration Release Grpc.Auth --output ../../../artifacts
+dotnet pack --configuration Release Grpc.HealthCheck --output ../../../artifacts
+dotnet pack --configuration Release Grpc.Reflection --output ../../../artifacts
+dotnet pack --configuration Release Grpc.Tools --output ../../../artifacts
+# rem build auxiliary packages
+dotnet pack --configuration Release Grpc --output ../../../artifacts
+dotnet pack --configuration Release Grpc.Core.NativeDebug --output ../../../artifacts
+dotnet pack --configuration Release Grpc.Core.Xamarin --output ../../../artifacts
+
+# Create a zipfile with all the nugets we just created
+cd ../../artifacts
+zip csharp_nugets_windows_dotnetcli.zip *.nupkg
diff --git a/src/csharp/build_packages_dotnetcli.bat b/src/csharp/build_packages_dotnetcli.bat
deleted file mode 100755 (executable)
index f500310..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-@rem Copyright 2016 gRPC authors.
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem     http://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-
-set DOTNET=dotnet
-
-mkdir ..\..\artifacts
-
-@rem Collect the artifacts built by the previous build step
-mkdir nativelibs
-powershell -Command "cp -r ..\..\input_artifacts\csharp_ext_* nativelibs"
-
-@rem Collect protoc artifacts built by the previous build step
-mkdir protoc_plugins
-powershell -Command "cp -r ..\..\input_artifacts\protoc_* protoc_plugins"
-
-@rem Add current timestamp to dev nugets
-expand_dev_version.sh
-
-%DOTNET% restore Grpc.sln || goto :error
-
-@rem To be able to build, we also need to put grpc_csharp_ext to its normal location
-xcopy /Y /I nativelibs\csharp_ext_windows_x64\grpc_csharp_ext.dll ..\..\cmake\build\x64\Release\
-
-%DOTNET% pack --configuration Release Grpc.Core.Api --output ..\..\..\artifacts || goto :error
-%DOTNET% pack --configuration Release Grpc.Core --output ..\..\..\artifacts || goto :error
-%DOTNET% pack --configuration Release Grpc.Core.Testing --output ..\..\..\artifacts || goto :error
-%DOTNET% pack --configuration Release Grpc.Auth --output ..\..\..\artifacts || goto :error
-%DOTNET% pack --configuration Release Grpc.HealthCheck --output ..\..\..\artifacts || goto :error
-%DOTNET% pack --configuration Release Grpc.Reflection --output ..\..\..\artifacts || goto :error
-%DOTNET% pack --configuration Release Grpc.Tools --output ..\..\..\artifacts || goto :error
-@rem build auxiliary packages
-%DOTNET% pack --configuration Release Grpc --output ..\..\..\artifacts || goto :error
-%DOTNET% pack --configuration Release Grpc.Core.NativeDebug --output ..\..\..\artifacts || goto :error
-
-@rem copy resulting nuget packages to artifacts directory
-xcopy /Y /I *.nupkg ..\..\artifacts\ || goto :error
-
-@rem create a zipfile with the artifacts as well
-powershell -Command "Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::CreateFromDirectory('..\..\artifacts', 'csharp_nugets_windows_dotnetcli.zip');"
-xcopy /Y /I csharp_nugets_windows_dotnetcli.zip ..\..\artifacts\ || goto :error
-
-goto :EOF
-
-:error
-echo Failed!
-exit /b %errorlevel%
diff --git a/src/csharp/build_unitypackage.bat b/src/csharp/build_unitypackage.bat
deleted file mode 100644 (file)
index 32e9757..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-@rem Copyright 2018 The gRPC Authors
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem     http://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-
-@rem Current package versions
-set VERSION=2.33.2
-
-@rem Adjust the location of nuget.exe
-set NUGET=nuget
-set DOTNET=dotnet
-
-mkdir ..\..\artifacts
-
-@rem Collect the artifacts built by the previous build step
-mkdir nativelibs
-powershell -Command "cp -r ..\..\input_artifacts\csharp_ext_* nativelibs"
-
-@rem Collect protoc artifacts built by the previous build step
-mkdir protoc_plugins
-powershell -Command "cp -r ..\..\input_artifacts\protoc_* protoc_plugins"
-
-%DOTNET% restore Grpc.sln || goto :error
-
-@rem To be able to build, we also need to put grpc_csharp_ext to its normal location
-xcopy /Y /I nativelibs\csharp_ext_windows_x64\grpc_csharp_ext.dll ..\..\cmake\build\x64\Release\
-
-%DOTNET% build --configuration Release Grpc.Core || goto :error
-@rem build HealthCheck to get hold of Google.Protobuf.dll assembly
-%DOTNET% build --configuration Release Grpc.HealthCheck || goto :error
-
-@rem copy Grpc assemblies to the unity package skeleton
-@rem TODO(jtattermusch): Add Grpc.Auth assembly and its dependencies
-copy /Y Grpc.Core.Api\bin\Release\net45\Grpc.Core.Api.dll unitypackage\unitypackage_skeleton\Plugins\Grpc.Core.Api\lib\net45\Grpc.Core.Api.dll || goto :error
-copy /Y Grpc.Core.Api\bin\Release\net45\Grpc.Core.Api.pdb unitypackage\unitypackage_skeleton\Plugins\Grpc.Core.Api\lib\net45\Grpc.Core.Api.pdb || goto :error
-copy /Y Grpc.Core.Api\bin\Release\net45\Grpc.Core.Api.xml unitypackage\unitypackage_skeleton\Plugins\Grpc.Core.Api\lib\net45\Grpc.Core.Api.xml || goto :error
-copy /Y Grpc.Core\bin\Release\net45\Grpc.Core.dll unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\lib\net45\Grpc.Core.dll || goto :error
-copy /Y Grpc.Core\bin\Release\net45\Grpc.Core.pdb unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\lib\net45\Grpc.Core.pdb || goto :error
-copy /Y Grpc.Core\bin\Release\net45\Grpc.Core.xml unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\lib\net45\Grpc.Core.xml || goto :error
-
-@rem copy desktop native libraries to the unity package skeleton
-copy /Y nativelibs\csharp_ext_linux_x86\libgrpc_csharp_ext.so unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\linux\x86\libgrpc_csharp_ext.so || goto :error
-copy /Y nativelibs\csharp_ext_linux_x64\libgrpc_csharp_ext.so unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\linux\x64\libgrpc_csharp_ext.so || goto :error
-copy /Y nativelibs\csharp_ext_macos_x86\libgrpc_csharp_ext.dylib unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\osx\x86\grpc_csharp_ext.bundle || goto :error
-copy /Y nativelibs\csharp_ext_macos_x64\libgrpc_csharp_ext.dylib unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\osx\x64\grpc_csharp_ext.bundle || goto :error
-copy /Y nativelibs\csharp_ext_windows_x86\grpc_csharp_ext.dll unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\win\x86\grpc_csharp_ext.dll || goto :error
-copy /Y nativelibs\csharp_ext_windows_x64\grpc_csharp_ext.dll unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\win\x64\grpc_csharp_ext.dll || goto :error
-
-@rem add Android and iOS native libraries
-copy /Y nativelibs\csharp_ext_linux_android_armeabi-v7a\libgrpc_csharp_ext.so unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\android\armeabi-v7a\libgrpc_csharp_ext.so || goto :error
-copy /Y nativelibs\csharp_ext_linux_android_arm64-v8a\libgrpc_csharp_ext.so unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\android\arm64-v8a\libgrpc_csharp_ext.so || goto :error
-copy /Y nativelibs\csharp_ext_linux_android_x86\libgrpc_csharp_ext.so unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\android\x86\libgrpc_csharp_ext.so || goto :error
-copy /Y nativelibs\csharp_ext_macos_ios\libgrpc_csharp_ext.a unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\ios\libgrpc_csharp_ext.a || goto :error
-copy /Y nativelibs\csharp_ext_macos_ios\libgrpc.a unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\ios\libgrpc.a || goto :error
-
-@rem add gRPC dependencies
-@rem TODO(jtattermusch): also include XMLdoc
-copy /Y Grpc.Core\bin\Release\net45\System.Runtime.CompilerServices.Unsafe.dll unitypackage\unitypackage_skeleton\Plugins\System.Runtime.CompilerServices.Unsafe\lib\net45\System.Runtime.CompilerServices.Unsafe.dll || goto :error
-copy /Y Grpc.Core\bin\Release\net45\System.Buffers.dll unitypackage\unitypackage_skeleton\Plugins\System.Buffers\lib\net45\System.Buffers.dll || goto :error
-copy /Y Grpc.Core\bin\Release\net45\System.Memory.dll unitypackage\unitypackage_skeleton\Plugins\System.Memory\lib\net45\System.Memory.dll || goto :error
-
-@rem add Google.Protobuf
-@rem TODO(jtattermusch): also include XMLdoc
-copy /Y Grpc.HealthCheck\bin\Release\net45\Google.Protobuf.dll unitypackage\unitypackage_skeleton\Plugins\Google.Protobuf\lib\net45\Google.Protobuf.dll || goto :error
-
-@rem create a zipfile that will act as a Unity package
-cd unitypackage\unitypackage_skeleton
-zip -r ..\..\grpc_unity_package.zip Plugins
-cd ..\..
-copy /Y grpc_unity_package.zip ..\..\artifacts\grpc_unity_package.%VERSION%.zip || goto :error
-
-goto :EOF
-
-:error
-echo Failed!
-exit /b %errorlevel%
diff --git a/src/csharp/build_unitypackage.sh b/src/csharp/build_unitypackage.sh
new file mode 100755 (executable)
index 0000000..4363ee1
--- /dev/null
@@ -0,0 +1,80 @@
+#!/bin/bash
+# Copyright 2020 The gRPC Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -ex
+
+cd "$(dirname "$0")"
+
+mkdir -p ../../artifacts
+
+# Collect the artifacts built by the previous build step
+mkdir -p nativelibs
+cp -r "${EXTERNAL_GIT_ROOT}"/input_artifacts/csharp_ext_* nativelibs || true
+
+# Add current timestamp to dev nugets
+./expand_dev_version.sh
+
+# Extract current Grpc.Core version from build/dependencies.props
+UNITYPACKAGE_VERSION="$(grep -o '<GrpcCsharpVersion>.*</GrpcCsharpVersion>' build/dependencies.props | sed 's/<GrpcCsharpVersion>//' | sed 's/<\/GrpcCsharpVersion>//')"
+
+dotnet restore Grpc.sln
+
+# To be able to build the Grpc.Core project, we also need to put grpc_csharp_ext to where Grpc.Core.csproj
+# expects it.
+mkdir -p ../../cmake/build
+cp nativelibs/csharp_ext_linux_x64/libgrpc_csharp_ext.so ../../cmake/build
+
+dotnet build --configuration Release Grpc.Core
+# build HealthCheck to get hold of Google.Protobuf.dll assembly
+dotnet build --configuration Release Grpc.HealthCheck
+
+# copy Grpc assemblies to the unity package skeleton
+# TODO(jtattermusch): Add Grpc.Auth assembly and its dependencies
+cp Grpc.Core.Api/bin/Release/net45/Grpc.Core.Api.dll unitypackage/unitypackage_skeleton/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.dll
+cp Grpc.Core.Api/bin/Release/net45/Grpc.Core.Api.pdb unitypackage/unitypackage_skeleton/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.pdb
+cp Grpc.Core.Api/bin/Release/net45/Grpc.Core.Api.xml unitypackage/unitypackage_skeleton/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.xml
+cp Grpc.Core/bin/Release/net45/Grpc.Core.dll unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/lib/net45/Grpc.Core.dll
+cp Grpc.Core/bin/Release/net45/Grpc.Core.pdb unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/lib/net45/Grpc.Core.pdb
+cp Grpc.Core/bin/Release/net45/Grpc.Core.xml unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/lib/net45/Grpc.Core.xml
+
+# copy desktop native libraries to the unity package skeleton
+cp nativelibs/csharp_ext_linux_x64/libgrpc_csharp_ext.so unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/linux/x64/libgrpc_csharp_ext.so
+cp nativelibs/csharp_ext_macos_x64/libgrpc_csharp_ext.dylib unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/osx/x64/grpc_csharp_ext.bundle
+cp nativelibs/csharp_ext_windows_x86/grpc_csharp_ext.dll unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/win/x86/grpc_csharp_ext.dll
+cp nativelibs/csharp_ext_windows_x64/grpc_csharp_ext.dll unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/win/x64/grpc_csharp_ext.dll
+
+# add Android and iOS native libraries
+cp nativelibs/csharp_ext_linux_android_armeabi-v7a/libgrpc_csharp_ext.so unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/android/armeabi-v7a/libgrpc_csharp_ext.so
+cp nativelibs/csharp_ext_linux_android_arm64-v8a/libgrpc_csharp_ext.so unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/android/arm64-v8a/libgrpc_csharp_ext.so
+cp nativelibs/csharp_ext_linux_android_x86/libgrpc_csharp_ext.so unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/android/x86/libgrpc_csharp_ext.so
+cp nativelibs/csharp_ext_macos_ios/libgrpc_csharp_ext.a unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/ios/libgrpc_csharp_ext.a
+cp nativelibs/csharp_ext_macos_ios/libgrpc.a unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/ios/libgrpc.a
+
+# add gRPC dependencies
+# TODO(jtattermusch): also include XMLdoc
+cp Grpc.Core/bin/Release/net45/System.Runtime.CompilerServices.Unsafe.dll unitypackage/unitypackage_skeleton/Plugins/System.Runtime.CompilerServices.Unsafe/lib/net45/System.Runtime.CompilerServices.Unsafe.dll
+cp Grpc.Core/bin/Release/net45/System.Buffers.dll unitypackage/unitypackage_skeleton/Plugins/System.Buffers/lib/net45/System.Buffers.dll
+cp Grpc.Core/bin/Release/net45/System.Memory.dll unitypackage/unitypackage_skeleton/Plugins/System.Memory/lib/net45/System.Memory.dll
+
+# add Google.Protobuf
+# TODO(jtattermusch): also include XMLdoc
+cp Grpc.HealthCheck/bin/Release/net45/Google.Protobuf.dll unitypackage/unitypackage_skeleton/Plugins/Google.Protobuf/lib/net45/Google.Protobuf.dll
+
+# create a zipfile that will act as a Unity package
+pushd unitypackage/unitypackage_skeleton
+zip -r ../../grpc_unity_package.zip Plugins
+popd
+
+cp grpc_unity_package.zip ../../artifacts/grpc_unity_package.${UNITYPACKAGE_VERSION}.zip
old mode 100644 (file)
new mode 100755 (executable)
index cfa9c4b..a58fbdf 100644 (file)
@@ -6,6 +6,12 @@ platforms that are not yet fully supported.
 gRPC C# now has experimental support for Xamarin.
 See [HelloworldXamarin](/examples/csharp/HelloworldXamarin) for an example how to use it.
 
+Starting from gRPC C# 2.34.x: in addition to the regular `Grpc.Core` dependency, you will also
+need to add `Grpc.Core.Xamarin` dependency to your project (which has the mobile-specific builds of c# native extension library).
+The `Grpc.Core` and `Grpc.Core.Xamarin` package versions must always match exactly for things to work.
+Also note that the `Grpc.Core.Xamarin` needs to be added to your `*.Android` and `*.iOS` projects
+in order for the native library bindings to be registered correctly (see https://github.com/grpc/grpc/issues/16250).
+
 What's currently supported:
 
 Xamarin.Android
index 130f4c5..f296142 100755 (executable)
@@ -28,8 +28,8 @@ function build {
     PATH_CC="$(xcrun --sdk $SDK --find clang)"
     PATH_CXX="$(xcrun --sdk $SDK --find clang++)"
 
-    CPPFLAGS="-O2 -Wframe-larger-than=16384 -arch $ARCH -isysroot $(xcrun --sdk $SDK --show-sdk-path) -mios-version-min=6.0 -DPB_NO_PACKED_STRUCTS=1"
-    LDFLAGS="-arch $ARCH -isysroot $(xcrun --sdk $SDK --show-sdk-path) -Wl,ios_version_min=6.0"
+    CPPFLAGS="-O2 -Wframe-larger-than=16384 -arch $ARCH -isysroot $(xcrun --sdk $SDK --show-sdk-path) -mios-version-min=9.0 -DPB_NO_PACKED_STRUCTS=1"
+    LDFLAGS="-arch $ARCH -isysroot $(xcrun --sdk $SDK --show-sdk-path) -Wl,ios_version_min=9.0"
 
     # TODO(jtattermusch): revisit the build arguments
     make -j4 static_csharp \
diff --git a/src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/linux/x86.meta b/src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/linux/x86.meta
deleted file mode 100644 (file)
index b050a3b..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-fileFormatVersion: 2
-guid: d62d998e3cdebd542a967743103c64b6
-folderAsset: yes
-timeCreated: 1531219385
-licenseType: Free
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/linux/x86/libgrpc_csharp_ext.so.meta b/src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/linux/x86/libgrpc_csharp_ext.so.meta
deleted file mode 100644 (file)
index f597b1a..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-fileFormatVersion: 2
-guid: 0165d78fa73d0cc4c8984f3d4f2a6c86
-timeCreated: 1531219386
-licenseType: Free
-PluginImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  iconMap: {}
-  executionOrder: {}
-  isPreloaded: 0
-  isOverridable: 0
-  platformData:
-  - first:
-      '': Any
-    second:
-      enabled: 0
-      settings:
-        Exclude Android: 1
-        Exclude Editor: 0
-        Exclude Linux: 0
-        Exclude Linux64: 1
-        Exclude LinuxUniversal: 0
-        Exclude OSXIntel: 1
-        Exclude OSXIntel64: 1
-        Exclude OSXUniversal: 1
-        Exclude Win: 0
-        Exclude Win64: 0
-        Exclude iOS: 1
-  - first:
-      Android: Android
-    second:
-      enabled: 0
-      settings:
-        CPU: ARMv7
-  - first:
-      Any: 
-    second:
-      enabled: 0
-      settings: {}
-  - first:
-      Editor: Editor
-    second:
-      enabled: 1
-      settings:
-        CPU: x86
-        DefaultValueInitialized: true
-        OS: Linux
-  - first:
-      Facebook: Win
-    second:
-      enabled: 0
-      settings:
-        CPU: AnyCPU
-  - first:
-      Facebook: Win64
-    second:
-      enabled: 0
-      settings:
-        CPU: AnyCPU
-  - first:
-      Standalone: Linux
-    second:
-      enabled: 1
-      settings:
-        CPU: x86
-  - first:
-      Standalone: Linux64
-    second:
-      enabled: 0
-      settings:
-        CPU: None
-  - first:
-      Standalone: LinuxUniversal
-    second:
-      enabled: 1
-      settings:
-        CPU: x86
-  - first:
-      Standalone: OSXIntel
-    second:
-      enabled: 0
-      settings:
-        CPU: None
-  - first:
-      Standalone: OSXIntel64
-    second:
-      enabled: 0
-      settings:
-        CPU: None
-  - first:
-      Standalone: OSXUniversal
-    second:
-      enabled: 0
-      settings:
-        CPU: None
-  - first:
-      Standalone: Win
-    second:
-      enabled: 1
-      settings:
-        CPU: AnyCPU
-  - first:
-      Standalone: Win64
-    second:
-      enabled: 1
-      settings:
-        CPU: AnyCPU
-  - first:
-      iPhone: iOS
-    second:
-      enabled: 0
-      settings:
-        CompileFlags: 
-        FrameworkDependencies: 
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/osx/x86.meta b/src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/osx/x86.meta
deleted file mode 100644 (file)
index 17713f8..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-fileFormatVersion: 2
-guid: 2ee63d0ffcfa72a4fbd7ad04ba34cadb
-folderAsset: yes
-timeCreated: 1531219385
-licenseType: Free
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/osx/x86/grpc_csharp_ext.bundle.meta b/src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/osx/x86/grpc_csharp_ext.bundle.meta
deleted file mode 100644 (file)
index 53822bb..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-fileFormatVersion: 2
-guid: 34ec9b69f128d6d4fa3fb46bc70b547c
-timeCreated: 1531219386
-licenseType: Free
-PluginImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  iconMap: {}
-  executionOrder: {}
-  isPreloaded: 0
-  isOverridable: 0
-  platformData:
-  - first:
-      '': Any
-    second:
-      enabled: 0
-      settings:
-        Exclude Android: 1
-        Exclude Editor: 0
-        Exclude Linux: 1
-        Exclude Linux64: 1
-        Exclude LinuxUniversal: 1
-        Exclude OSXIntel: 0
-        Exclude OSXIntel64: 1
-        Exclude OSXUniversal: 0
-        Exclude Win: 1
-        Exclude Win64: 1
-        Exclude iOS: 1
-  - first:
-      Android: Android
-    second:
-      enabled: 0
-      settings:
-        CPU: ARMv7
-  - first:
-      Any: 
-    second:
-      enabled: 0
-      settings: {}
-  - first:
-      Editor: Editor
-    second:
-      enabled: 1
-      settings:
-        CPU: x86
-        DefaultValueInitialized: true
-        OS: OSX
-  - first:
-      Facebook: Win
-    second:
-      enabled: 0
-      settings:
-        CPU: AnyCPU
-  - first:
-      Facebook: Win64
-    second:
-      enabled: 0
-      settings:
-        CPU: AnyCPU
-  - first:
-      Standalone: Linux
-    second:
-      enabled: 0
-      settings:
-        CPU: x86
-  - first:
-      Standalone: Linux64
-    second:
-      enabled: 0
-      settings:
-        CPU: x86_64
-  - first:
-      Standalone: LinuxUniversal
-    second:
-      enabled: 0
-      settings:
-        CPU: None
-  - first:
-      Standalone: OSXIntel
-    second:
-      enabled: 1
-      settings:
-        CPU: AnyCPU
-  - first:
-      Standalone: OSXIntel64
-    second:
-      enabled: 0
-      settings:
-        CPU: None
-  - first:
-      Standalone: OSXUniversal
-    second:
-      enabled: 1
-      settings:
-        CPU: x86
-  - first:
-      Standalone: Win
-    second:
-      enabled: 0
-      settings:
-        CPU: AnyCPU
-  - first:
-      Standalone: Win64
-    second:
-      enabled: 0
-      settings:
-        CPU: AnyCPU
-  - first:
-      iPhone: iOS
-    second:
-      enabled: 0
-      settings:
-        CompileFlags: 
-        FrameworkDependencies: 
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
index f531c20..9241a3f 100644 (file)
@@ -42,7 +42,7 @@ Pod::Spec.new do |s|
   # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed
   # before them.
   s.name     = '!ProtoCompiler-gRPCCppPlugin'
-  v = '1.33.2'
+  v = '1.34.0'
   s.version  = v
   s.summary  = 'The gRPC ProtoC plugin generates C++ files from .proto services.'
   s.description = <<-DESC
@@ -102,8 +102,8 @@ Pod::Spec.new do |s|
   # Restrict the protoc version to the one supported by this plugin.
   s.dependency '!ProtoCompiler', '3.13.0'
   # For the Protobuf dependency not to complain:
-  s.ios.deployment_target = '7.0'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
   s.tvos.deployment_target = '10.0'
   s.watchos.deployment_target = '2.0'
 
index efa1e69..46f2fa1 100644 (file)
@@ -42,7 +42,7 @@ Pod::Spec.new do |s|
   # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed
   # before them.
   s.name     = '!ProtoCompiler-gRPCPlugin'
-  v = '1.33.2'
+  v = '1.34.0'
   s.version  = v
   s.summary  = 'The gRPC ProtoC plugin generates Objective-C files from .proto services.'
   s.description = <<-DESC
@@ -104,8 +104,8 @@ Pod::Spec.new do |s|
   # Restrict the protoc version to the one supported by this plugin.
   s.dependency '!ProtoCompiler', '3.13.0'
   # For the Protobuf dependency not to complain:
-  s.ios.deployment_target = '7.0'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
   s.tvos.deployment_target = '10.0'
 
   # watchOS is disabled due to #20258.
index 508586b..20aa37f 100644 (file)
@@ -110,8 +110,8 @@ Pod::Spec.new do |s|
   # Restrict the protobuf runtime version to the one supported by this version of protoc.
   s.dependency 'Protobuf', '~> 3.0'
   # For the Protobuf dependency not to complain:
-  s.ios.deployment_target = '7.0'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
   s.tvos.deployment_target = '10.0'
   s.watchos.deployment_target = '4.0'
 
index ae29922..264e2cd 100644 (file)
@@ -39,7 +39,7 @@
 
 Pod::Spec.new do |s|
   s.name     = 'BoringSSL-GRPC'
-  version = '0.0.13'
+  version = '0.0.14'
   s.version  = version
   s.summary  = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.'
   # Adapted from the homepage:
@@ -76,11 +76,11 @@ Pod::Spec.new do |s|
 
   s.source = {
     :git => 'https://github.com/google/boringssl.git',
-    :commit => "88aeb757f1a415c71fb4cbf5af936ecae4bc8179",
+    :commit => "29c6e0e27268f5a43e039cd2ed4e849d6b736fc1",
   }
 
-  s.ios.deployment_target = '7.0'
-  s.osx.deployment_target = '10.7'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
   s.tvos.deployment_target = '10.0'
   s.watchos.deployment_target = '4.0'
 
@@ -213,489 +213,491 @@ Pod::Spec.new do |s|
     # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to
     # the correct location in BoringSSL.
     base64 -D <<EOF | gunzip > src/include/openssl/boringssl_prefix_symbols.h
-      H4sICAAAAAAC/2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAKy9XXOjyJaofT+/wnHm5pyIHTNlV7vb
-      +71T2aouTbtsjyT3dM0NgQSy2YVARSK73L/+zQQE+bFWwlrpiB0zXRbPsyBJ8osk8z//8+wpLdIqrtPk
-      bPPW/yPalFVWPAmRR4cq3WU/o+c0TtLqP8TzWVmcfWp+Xa1uz7blfp/V/9/Z1VWcbn67/G13Hv9yfrn9
-      7Xy3+WW72V3Gu39+/DXdxukvm+3V+W///Ld/+8//PLsuD29V9vRcn/3f7f87u/hwfvWPs9/L8ilPzxbF
-      9j/kIeqoh7TaZ0JkMl5dnh1F+g8Z7fD2j7N9mWQ7+f/jIvnPsjpLMlFX2eZYp2f1cybORLmrX+MqPdvJ
-      H+PiTbkOx+pQivTsNavlBVTN/y+P9dkuTc8k8pxWqbr6Ki5kQvzj7FCVL1kik6R+jmv5f9KzeFO+pMq0
-      7c+9KOtsm6qzaOMehvM9/XQ4pHF1lhVncZ4rMkvF6erWX+Znq/vP6/+ZLedni9XZw/L+z8XN/Obs/8xW
-      8t//52x2d9McNHtcf7lfnt0sVte3s8XX1dns9vZMUsvZ3XoxXynX/yzWX86W899nS4ncS0r6Bvfd9e3j
-      zeLu9wZcfH24Xcgog+Ds/rNyfJ0vr7/Iv8w+LW4X629N+M+L9d18tfoP6Ti7uz+b/zm/W5+tviiPdmaf
-      5me3i9mn2/nZZ/mv2d03pVs9zK8Xs9t/yPNezq/X/5CK03/Jg67v71bz/36UOnnM2c3s6+x3dSINffpn
-      c2FfZuvVvYy7lJe3erxdq8v4vLz/enZ7v1Jnfva4mssYs/VM0TIN5Smv/iG5uTzBpTrvmfzf9Xpxf6d8
-      EpCh18uZOo+7+e+3i9/nd9dzxd43wPp+KY99XHXMP85my8VKBb1/XCv6XjmbLHx/dzdvjmlTX6WHPJfm
-      LOZLmRBfZ434s3k3/qPJ/5/ul9IpH59odnMTPSznnxd/nR1iUafirH4tz2TWK+psl6WVkJlHZv6ySOVN
-      qFUWk5l6L9QflCir1dOqcly5O9vH26o8S38e4qLJhPJ/WS3O4urpuJc+cbZJJZw2geTT+x//9u+JfLKL
-      FDyd/xv/42zz/8CfooW89GV7gNehH3gWn/37v59F6v9s/m2gFvfRLpKlDHwOwx/bP/xjAP6f4RBpTbV0
-      yOC5Wd+uom2eyaSK9qksHpKpOpe0rAwd6BFp9ZJWHJ1BWlZVFkab424nsxvHDfBmhJfz6IKfsi4N2Jla
-      1MdOaZd27CEp4U+HJ5mn62yfqpqN5tVIx/osa7g8ZYpN2HGzEgG5+pB75r9jqqzIiqzO4vx0JVFy7Epe
-      aiBcNcSdL5dRXsZJpAyqdSObYlMDQexgvn+Y36kf1DlQikybG4wP869RlXbxVrK5oOrEiVaIBcybrAyy
-      W7wZ4bWStShX78CQO+D0QcEQQ/3xevEgWy5RkoptlR0oWRKmQbsqH+KjLOeLLGHodRz1b1RrhedWKOrd
-      ZgfZvg8480GAxkiyp1TUATEGARqD7fY4v/+MinifMsUd7bWzz7qFUfc+/hnJIlvw8rtlwKNkRWiUwYBG
-      CbgF3vQ/VLuAG9DRHntZl9syjwIi9AY0SrXbhqTPCUf9L3F+5MobFjcH5RtfnslEFMt6jWHuSMy6ycvt
-      966849l1AxhF1LJFGFcJ96YavBXh/utDFCdJtC33hypthmKIzcERDRBvV6UpcKQgR8REQEyZPz7Q088g
-      Yeu7XAjiQSJmCStAliA+brJAqbL+S+WDD9H2OZal+DatapLZxUH/eZj/fMzf/GLckTh/YgQCPUjEtpt6
-      PWOFOcGwO/1ZV3FYkjkOOJJoL5MToENd7/Y5leXjocpe1Cj79/SNancEQIy2vSqv7akqjwdyBBMH/Hka
-      V1rqCXIEW4DFsO8TM5KjweLtyyTlhVAkZi2bfhXz3DvYdadFvMnTqNyKg6oUD7ns6FNDQA40ksieirQr
-      BdTQhQT2B8EMCcvQ2HUu1P0ripTc3MQkbqxdfhTPp0eXfGEmDdhl/U52SsY1NZW4Srlsl21lKUC12jwW
-      QT0vPLcifVbew2zzSIRDXMV7lrshMWtb4jJKbAsH/e2DIGr1foau12jE3uf6aLthBdAFSIym2hAse4si
-      3lNzIMozUbP0hgGOIv8UH3PZJY2FeOWmkiOZGCs6irRK4jp+l6C9DY6e/oy4oToU9Rbpq2w2JOlPprzn
-      sQiBrQFQAsfKil0ZbeM838Tb75w4hgCOIQuDvHwKimIp4DhqoKspIbgPkCHAYzTDOaxhD0yCxJK3LjyW
-      LUFiMVqEJw42MluDGgp7fxwz9Ur7+Vgn5SsrSUwDHKV5nxI/U0efHBq2d60nmZ9lN4ed9q4FjkZ8owmg
-      iDcXspSRx2y/t48o62a7FjiazL7Z7i2oFLEU3jhJeqifA4I0vDcC97ZruOtv3oh2R+TlNmY9g6DEjVWk
-      smdT7w/RckUeANFZyPxKF766nirdly8pd4DDpF27+iGKt1t5p6lqDfV6o6eyTALkDe+PUKVF+lTWGaOD
-      hWiQeG0xtTvmOSvOgGP+TfSc0RtLOouZS9kp2PJucsf6zfzbrAtGYoTeaMCDRGw6I83tEtnfvGCmwhOn
-      OXDDjtHiHr9qqwf4W9zj7wqZgBC9AYnCfig8T4SaAJzyrC2KeIvjfkN8JWeiiFeE50gxJUeKsBwpxnKk
-      CMuRYixHiuAcKSbkyK5Vycs/Jxhy1x+6CZrRoSwZ1YzJIxFY44XCM17Y/nYavBE8dY8j/lPblz3+BlvA
-      aOfsNDr3pJH87Vi9cEqdHvV6WcMGNo9EYI3VDiRiFdlTnD/xEqRj/WZ+kugCJEbYuw5AgcR5j5x/PjHn
-      R7JrWb5Gx+J7Ub6qF8eHbvSFc5NwGRY7MNoUv0hz1Qjk1A62AY7Svn1n6TvU4+Xe/9H73vweOESBeZCI
-      zdBuXCSct+uOAI3Bf58ixt+niGHWKbOk0XHEH/ReRUx4r6IdE5J5DQMS5VhV6iDVBuKGMRVYHJnV910+
-      5EXRBHCM4DdRYtqbKPGub6IE8U2Ufnz3WB/i+lmExNU9SMRSNCW5LGebAWJe2toSOFYaV/lb876sm3/A
-      qcoBCxKN91ZP+N7qqR93cS5SNTek6qrdNIm6j2ebWosTcMwJn8lTlcYSC0hL0wBHyZ4KWZepBtT5x0i9
-      Bnmq4oRVM8ImJGrI20Yx/rZRhL9tFFPeNorQt41i/G2jeI+3jWLa28bTYSKVrYFdFT+pD2m5sQwJEiv0
-      zaaY9mZTMN9sCvTNZvOLCMteOj8eIYqrp9AoygFHKtS7tzYVg1r2kGcsooji5EVNzxJpEhzWksGxmwmA
-      VSoOZSFYmcIQIDF4772F7723aD4i6afCcib7oxYkmvjet0gDsjqgweN1H6eGxrM0SLxuoQxOjBaFvT+O
-      2Tbg9mg46g+Y/SAmzH4QQbMfxMjsh/b3WvU8y0K2+MRzfHH5a1Tu9P6P4EUds2Jn07WnZRtXPtnHfcqL
-      blvgaKfCcZiVyiz5QBEWM3S2iZg420Q/TnX5y6KWBXRItMHij6Ye/OQ55c518aiQuNC8bnZTELfh0bPi
-      SX2YUlayR7FvVi8S3NCAColb1QdV3e6yPOVF0wVIjLrKtsHDQq4FjtZNO1IfCwYU264Fi8bOnd7caI6D
-      h/QdYRMaVTW/2vpWfVbGbaqCoqkxQ5oLuM0fvY7rowi92l4yJRavkrAd3kjDDLywaIZnYkTxLvGEN9pR
-      DcbI8icg1EmBxJFldvLM0jekzxqWzU0FHifd8s9fsbi5EjFXLFGvNzhpdAcSqTryqqEGhJ38wXXfqHrX
-      Cn2HhgFs8kZlzZkVo3Nmj6rLvaN6WwqwyWf4oe0F/0F/cWbSY/Zotro7DwvRKEbjqPZUYBylgOMsV7Ow
-      BDMEE2Kwk821TInGTTzXAkcL+ITRwkf97JSzHeOR2tfH3LSDTeNR3yMeHkl1/dpFKeu36Dmjj4GDEjNW
-      t7hVpBZY7V8HDa+/KBFHVHBc7U3bNj6o5j0npGuBo1G/BtY5zFjuo81bTeuAujRsb7+9JS8MA+AeP29o
-      BFF44rCHu3GLJ9ohDUgzBY+49WdYBAUyTGNR27HEsHitwxPpfYaTJio959H2pdgxWxz1c97eA7jXz/o2
-      F3PgkWgTFk0St+7V2sgVdUIXbMCj9MuRMV6++jx4xK6Lnme7tJl3RK1ax1y+yPuUH2mf+s3EsTwAx/2B
-      N8d7T55jEVq4WQo8Dr9IGWjYnon2VQu3DaPzcATid4gaBvuamcS8oqNDvd6QVoWlQOOElOFirAwX71Q6
-      icml0zB6z43jy6EioAQS3hJIhJVAYqwEErIvkSfRRn3tVDzlqerZsAIBHjhiXfJb9SfWb452ZRVwswEN
-      HI8+XmWSppX+gTH0XXHA+n7etf0C1vXzrunHXl3Ps7Ke+kn1/bvJ/MfNv9JtLdR9lW1j2vDxiMqKm6uD
-      1NLT3TrlpEg2POKO8jIwQGOAojR9526oVlWceU2P4zqgSPXbIWWnlQaPuJlpZRvMKO38iOeMlDg9ZLnU
-      tJV2gTySbcAsX8iqjCMrMtLPEji/kBUXR1Zb5K18iK16yF7x0LPaIWOZAXB1ge2xrp+r8vj03Kximqe0
-      cWcAN/1JmqdPaietaFulzUBnnKt6ndSuRSVWrLLZWkN2Mr6TLkLnLKOsZBkfA2mY6WtHQvuZttv6p1p7
-      K232JlI9MUqQMRcUuRmDbat82h0AcMsfuPLm+Kqb77biJmG1zeCVNiessplWlWwjMreqcGDL/fNQVs10
-      B1X/7OUjVMlHhxQANJhRqOP27nh9v8WemgjSLJdO8bm0ba8/6J+T0rK+SwN2/ZWRqvIFOYJjgKLwKjv/
-      GqHt8ufDlPx+wRZ6KoEWIBr7XcPYOwbeWqfYOqfhbxOmvEUYjumquW4V8XYmBTMcqMLi2rM3mDEdDRCv
-      m29fpT+OssCVxS9xDQtUAsYKmVyMKKA47/I+hvQe5qlZNoG+UpnOOcaoezFNFJ4w18ecy2ChgLedqLt5
-      o29UAuCon3EH8TnEzNWA0ZWAw1YBHlsBWPu9ki3jcs+UtzDg7j4sp788d2mPfdiWgR1iUOBxhu1FmVF6
-      ARjjJSU2OnUOM1K3BDFJ13r63pwxzgzgrl/rgKgvlulp7QiAGKoxTfYqCHDR33ygb621H6K/Lj/8M1qt
-      75fzZg5RlvxkhgBMYFTWO3L/u/Fuyem9iMTxoLoXdLUGu+4d+WnZAc+J/EcmnlO6q+NcI/uL9pG1s5uf
-      X8j1ikRcT9+FivKU/IwZsOtmfwU/st528FrbE9bZDl5je8L62py1teF1tdvVJE89sKguv6dFtJGPourE
-      c/pHIzY3OmO0E13Nu5k/cupE0ZeLA3CPn9lgtXkkArdQMWDMfczz0CSyHEik5svjWjbuRDM41GQBwYoH
-      mpCoqnMU18cqHbqYrJiAB4rYZm9eC9WkATtr4xSTBKzaZGKyV2P9ZvKELFDgxuB/rT62Tn+z8O0mK6lO
-      xQAm1vfuvpX++9+EGtEotilLfIIBN71BVEEtIpFu1VMzrOmshkaYTTifC4rcjrwa3wTTQwISKFY7usTq
-      9xow6lYfkjGefZPG7Jye3UD6rM24NF/d4JCf1UNHR7HEc1ypMTTeYItJo3bGaqouDdl5pR9e7gGVXbev
-      NjkGapoWVXUOWBnI45oWmfVEIB4gInedgyf/Ggfa/OX4KY3Ed9r8UgAH/OwXmy4N249F9oM+RDuQoFX7
-      Tr1/GcQIAWnG4nFysGtwowQsBzu6W03ITjX+XWoCdqjx7k6j/UifPObAoJtT56C99ldG6/IVbF2+0ttq
-      r1Bb7VUWWSm7QWnSpj0rmF8gGqDj1BbAJEo10rHKHjNVpxDLI6JEPsMkT4s4HiVnDQLYrGNu21lEZQu5
-      LqDyUwsfHAQ1ETwmJ2rA+qIu7dqNUSveJAePxoyn2ifHQ0IcRxoo05Znmyqu3siZWecso9q0a3gBSO1N
-      ATjgb+cmtXNfBVlv0KZ9Hz9l236MpV+KqyblflRix1KLlMZ5VMoHhdrpd2DTzd0TDd8PjfgNkvPtUXHc
-      m11y0n1zadN+SFNSw0Ydbxua20WTNIjlqcqt2h+mGX48lKLmTRz1aOB4bSGlXoudMhz9E5MxlxP5JUvS
-      9hSpNbYDm+52AUqZx/urjnZ59vRcU98deUVAzGa8K09f0pwcZUABb9vs4Yk11jRXxEKjcsoJ5mZs6N5r
-      2g+cJwrAbb+wX7j/izhXHVGYcbplLYdZh5QIDmy71cLUMnLefshBU5usbW6f1iqlToM3SdvK2W0K22kq
-      YJcp7w5TzY/UofgeAlxB+/VM2aWqOeaVc8av0Bmfs+7ROXKPOLtcoTtchexu5d/ZqvkV+oaDHAKSALHI
-      b7ix3bO4O2fhu2YF7Zg1sltW4E5Zo7tkhe+QNWV3LMGbiSqwmajNXlLtvrNqBI56vgYLmHn7aHn30FI/
-      0kucCCpvOJsMobtjBe0kNbKLVMDuTt6dncJ2dRrb0an5vdvqlpW5DBhwc/dWGtlXKXwvnin78DTHFLuy
-      2qbNoE8zviHiJ3IqgRIgFn3OJbrKhCDPIxTAPML32T1n6s45QbvmjOyYo37+V/L9/Dx6LavvcVUeC3Lq
-      2LwbgT1DcGSPnOD9cSbsjRO8L86EPXGC98OZsBcOZx8ceA+ckP1v/HvfhO57M77nTXNEfSRL66PrYX/u
-      NrKLDHMHGXT3mPCdY6bsGvMOO8ZM2i3mHXaKmbRLDHOHGHR3mH5rF33ZTPr3ax4NEo93u9FdaPofQyaK
-      ohIwFnMGzdhON/xdbnw73LS/DUNpnDLX5qEI77l/DmfvHEGfgSigGYiCN1dMYHPFwvefmbL3THPMc5po
-      Q9vyuF1Grq5ACRSLl//xnP8+n7dSdq55p11rJu9YE7RbzchONe3+MoyeIdIjDNvxZspuN++zR8zU/WG0
-      DTOe1Qs06lw9iEcjhMwZE1PnjIngOWNiwpyxwL1KRvcp4e1Rgu1PErg3yei+JNw9SfD9SJh7kaD7kITu
-      QTK+/0hzhPtpFrkwgxxAJOouJ8gOJ7zdTbCdTd5nV5OpO5qE7Gbi38lEhMx/FP75j4I+y1BAswxZLQ24
-      lUGuH4G6Uf2JsQygzuFG8uJ/Dmy661K9HObPtIF4MwJ/5xrfrjWBO9aM7lYTuFPN6C41QTvUjOxOE74z
-      zZRdacJ3pJmyG03ATjTeXWhCd6AZ330mdA+Y8f1fgvd+mbDvi5rfET2neV6q7nb1dlrriBgGdJiRGGPI
-      4Kjxa0xLBHW8ZVATqEgKBRiOl4uPp4EI8mCWwzpmlhJxdSOKLKXBDub17Yp38Q5oOukyyMK6YAc0nWoX
-      o2hz3O1khmSYAdzwv5xH5+wUdWHXzZNiNm4Ku7DtvghJhQt/KlwwpZgtIBUu/KkQkAbeFOAIYVPAtSNX
-      nlxkkbbm/FSnhaE+yiwXAB282UXCOU8LQ32U8wTQwStr/evlt4f1ffTp8fPn+bLpyrdbsu2OxXZqjBHN
-      WDy1/uo7xOs1nnhJmh6aE2OH6g2eKGoSfHHMc3aQk8AX47jn6497j/lwFM9stYI9bjH92wKI9ZhJSy/C
-      tGFfLdcP8vj79fx6rZ4b+Z+fF7dzzr0dU02LS7rfHsukaMQ84NOY8dSMyMXDl76M2B+oTz6mwOKoObp1
-      ygvQsqj5eGBqjwfMKf+U8KSKxKycTOvSqJ2WNQ0Qc1IzoEliVmohYaOGt1mw8G72dc7OyojBG4VRN2MK
-      XxxOnYwpkDicuhigETvxQTJBzElYWN4BESfhE0mbw43Uh92FEfehPPBT4QRjbtojb4KIs5l3HPJg6gIs
-      BmG5KQd0nWGP39iTx80ceL6glf4nxPVwsxaeq8RztiPfmQZyXdSaY4AG1+z6WnbCopv56nq5eFhTt5hG
-      cK9/+gf6IOx1E0oumNbs81V0/XV2PdnXHW8atpttlBbb6m36lnMWZvl2m/OLK5bSIC1rXXGtBmlak5Ss
-      6xDTk243nFPTMMvHcEGekn0vSs+9EM1S380PlO+HANT1dgE5Xg01vcfitYoPVOVAYbboECfJ9AlVIGy6
-      OecJn2XAOeJnuLo7j2Z33yjl44BYnk+LdbRaq+PbbeZIRhvG3aSqAmBx81PzsV7NlXc47uerfVZK9eOi
-      uJcwRAWgXm9IKgs4lb8+sLOHgaJe6hlrIOok3zqdtK3397fz2R35PHvM8s3vHr/Ol7P1/IaepBaLm5+I
-      ecxEcW/G1vrSgXq7TBT3Cn4qCF8q1GX06Y5rbmDL/ZmZyT6juez3+Z2Md7v43/nNeiG7gnHyL5IZ4Eci
-      0Ksm0DAShfzIQIKRGMSb4OIjfmp2B/iRCIeKMEUHN4xEoT5eAD8egTjFcUQDx+PWcC7u9fPyFVbbmT8z
-      8xRa6y1ml9xUMVHUS0wNHUSd1FQwSNt6t57/rt4B7Q8058AhRsJrHZtDjPR7pIGIk9qE0DjEmPGEGeYj
-      3+2BQ4yCec0CvWZV9BxlUfrrL1xxhyN+elPEIC3r3ePtLT0z9RRkI970joFM1Nt9gizX/af/ml+v1XpK
-      hIm+LglbyWmncbCRmH49BduoaThgtu96Pe+7jnc388/kEwUEvhjUYtiGfW5qgWzDPjc9R9i0zx6S6P70
-      JucUC/a5qcWsDVvuB/n39ezT7Zyb5JBgJAYx4V18xE9NfoDHIgSkjzdl2GniSQ1+OnhTgPKBKoBa3tX8
-      vx/nd9dzzoCvxWJmrhUwrnmnuUbOsM1ubdrESUKzWrDPvc3TuCCW05DAF4Pa5LVh2E2tudA66/QDYUaL
-      zcFGyiJiNocYeXcqwe4PucjCS/LhpcIH9oX3MOruN/jdx+I7M4ThgCPlafE0/Ttcl4St1EIXrXO6H+jD
-      UTrocUbTd+mFWL852h1C5BKH/YJXygisfFGL7zKFH1Cj2i3+bnHD9HY0bg99OsSkp8M+KorF9j2iKQ8c
-      UXaqH9efrzhBOhTxUhssGocbuQ/6ibXM61/PucW1iaJeYqtFB1EnNQ0M0rYy3+Os0fc4rJc3yBsb5msa
-      9N1M80OS7XZ0naIgGz3jIO90OC9y4Lc3rFc2yHsa5ssZ9I0M6zUM8u4l5IWL/y1L86ss3p7SIq3iPPs7
-      TdRqWPQIrsOO9O1hTm5vnyDIRc+PJwqyUfsXJwhykXNkB0EuwTkvAZ+XWvGcJTu3bI93iz/nyxX/7Rwk
-      GIlBLDBcfMRPvWkAb0dYX7OqCI1DjPSKwiAx6/7QLIUX1Tx1jyN+ei7RQMSZ8c41w86RnAsGDjHSqxSD
-      RKzUYkHjcCOnenFxx//5il1MmCxuJmcDjcSt9Mygo5b3z8VqETAO7uJePzFBbNjrpiaLQ1t22hbQGmJ5
-      2vZHLbs/akFSks9EMe/LR5705aNjrKNyQ9mHysIsX1an+yi5yEi2E4S4KOsMOCDmJA7baBxopGccjQON
-      R84JHsGzU1s5cG5JyyFGcrmhg4gzu0hYSskhRmoJoXGQkXfR2BWzLhe5VrXABus56UDMyXlOWg4yFvIv
-      vMs+kaCVc5ORO3yIie3ZnoJsaqFluk1RmC3a1j95RkVC1mPBu+aWg4y0lUttzjLuN916keQ3WgaJWQu+
-      tgC8baUo0/tvWjmhcZZRtr33WZ29pPTCx0RRL/XxMUjbeqyjtKSNn3cMYGK0TAbM8tXx0wX1w5eOAUxi
-      +rbKOmOb0v0hb9ZTpN5ag8Ss1Burg5rzcf1FHr/+Fi3uPt9H3Ue0pDNGDWNRCPcL4cciUNIIE0Ax/ph/
-      W9wwU2lgcTMnZU4kbmWlRo8O3k+z1eI6ur6/k12t2eJuTcsvMO2zT08NiPWZCSkCwpp7cR/Fh0OzjVWW
-      p5Ql/QHU9PY7Nm3rKqdYDdBy5mlcRbs8nr7Jp4VBvnbRVaZVgy23Wkym2bS4OYRkNlHLS01ONxXlX5ru
-      crPhDXHBWlSAxGh32346xlVc1GnKCmM5gEjEzbFtzjQm5Wm3R4pvoExbWu4oGnm4yatVd0iv0Q3IcuWE
-      lWR6wHJUtLtolZPdX6I4z6kWxZimZq4RYSqUzrim6UvtDwRgOZAtB9eSFVlN9SjGNe3VIAwjjU4cbDxM
-      b2xamOtTK+jI/Dp9SpQDuk5mmW6hmFeWe2L6UtwQ65qpuzTYnGOkXrh1tc/pz+S4J2XmDjE96gYVpLzc
-      EralJtd8J8Y0qWzYbABW0FJI52xj/UwuFnsIcFEaeBoDmJpFukgfDAEo5iXeDgNEnIlsSFTlG0vbsYiZ
-      +kAYIOKUHXueU4GIsyJsXOiAiJO0YL9LutaS3iLRMNNHzOxOPleVwCYro0OcVURRz7lGRgNQw1wfrW3R
-      EoCFsEeGzgCmA9lzcC2qTNwcd1RVh7k+UW6/p+REbynb9pPo+WkbjvtNWpGfRw0DfeqJknUIQ9mRppXR
-      8QH7PIeSlCHk4RavpmOQMkJLWJa6IlcrJ8YyETs6B6efQy3c3TKdmnXcPNPuSCuKc6qmgQAXZ5THAG2n
-      oD2uDWA5Xnln9Yqck+CU3QIuuQWx3BZOqS3IZbYASmy168meJpGA7aCXrgIsW5s2XE7YRduAAJdM+mZP
-      UGoecGDErToCB8JatCCMuNle2EntqQtwNEOQRzMEMJrR/I3ag+4hwHUgiw6uhToyIsCREdENSBBbLxoG
-      +9Jyp/r5x6rgaAfatReEqRQ645r6cQhyDhlIzCoO6TaLc564gzE3uRtjoa6XM+Yi0DGXvsPU7VVFeuWO
-      CqwYz+UxTyLZb+GktA2DbnLGGDDER3z9oXOgkZ4RNM42tndS/kYT9pjlK+gt4RNjmupUMIrfgTJtR7UB
-      NumsWsK0vFBHuV7cEa4XThK9wGn0yuj+vIL9H3KWAvJS++gSX2z0EOTiNIxNUrPeRZ9uF3c37Rf1xUtK
-      aLe4KOwlZQ+Lg41Z8RLnWUIZwARp1M5MhsyTCpQRLRMzfNfrv6J0+lYdA+FYiLflhDgewmdgA+FYaMnT
-      EY5F1HFFPZuGMUy/z++uPzUzDgiqAQJcgpRGPWOYvt7frZsTpkwEtDnYSMwKBgcbabdTx1CfKmRETfnU
-      EhXgMXZlFe3L5JgfBTeKpoDj0DKDjqG+KFc98oSp7WjDHm9ElInotawoVo0ybQnJkjg0+UQ6xPSI7cWm
-      oFgawHBssoLmaAHTIf+SkRwNADiIi/zbHGA8xHTbIXZM282GdW4DZxuTdEtTScB2PBNmE5wA25GnrAvr
-      Mdu3P2Q0kwQMRzPjjKBojncNlMX2dQYwEauTATJdhGkGd+YX7+2/qWXGCTE9tMrWqWO35bFQBexr9Hda
-      lSrBBEnn0IZd5nFaadQCpiN7oQiyF5umpvMJMT1Hyt02vh+T/06L57jYpkm0z/JcvWiLm0KuyvaypV+/
-      NR1ggn6Kzoz/4xjnrAaKRZrWn5Q0kUcbNPEpdJ6/XVXuZUOmqJ/KfVq9kVQGaViftpSsIo826dP3oepe
-      pBGpOHdYy1xH1W778fLi1+6A88uPv5L0kMCJcZy+dPJAOBbiE3dCDI+s22hlRwsYDtKw+5094n6n2oqy
-      TCO2iAfIdhXpU6y+96HJTpRtK0mN1hZwHAXxZCRgOw7l6wVNogjHQn9iNAq27WJZaqmxRZ5Ww20/MYND
-      fQ75N1Vp0iyKMCx5SntImuNNA2lfxR4AHOdkyblh2ceVeJa1DWnugIlZPvGd2qLpGdNUJsQ+YkdAlujH
-      MZv+najNOUZaLdwRkOWiqRPprpaDjEyh38dqxsACPAbx+XZYx9wMvQrqKXcUZos2uZp2nPCsJxq1lwnX
-      XAI5n1zODBDiOmfJzjEb67k0WMQcIEa8+2NO1EkCsvAa0C7suImNghPieMSPiqiRBGSp6Ro334njhqo5
-      biALK0v0nGNkFFduKXXIaE2JFjAdtHxp50mZpahX0iGGhza4b4/pF4VMHgqvjncN1CdggEzXcU9twpwQ
-      0ENNYINzjW+yfUy1KcYw0Tohdg/kEKsaRzX+omOh1ucg1YcAbdq5YzSe0RjS+nGn410DZWragJgekR6T
-      Mqpi0htbjcJs6v88pTxnyxpm4gk6Z8Y6Jc+5tH+mdSsNzjRSW0aV2yqqyC2iCmgNETe1HQjHwhjq0DHH
-      RxuXEsC4lKCPSwloXIrWIrFbI8SWiNMKobVA7NaHakFQ06BDDE9dRtZGqwSjC4Pubuc0hrgjbSurqWtw
-      hvFIGxA42qMBR9oLpKP9BulIywpHOy+8xPkxJda9PWOYiMNY1hhWf8juWGzrrCyiZ0IJBNKQXaT5jlaH
-      u6jmffwcfZ1/7RYTmaw0KNdGeiWiMa7pqSpfqSbFwKZ2Nx+OryVdK6WJPiCuR32aU72QE63DTN8+3VPe
-      8vWEaRF1RbS0hGPJt3FN1CgE8BDeEA+I4ynol1VA11XkaUH15PoXhNefPjXDoZRhYp2BTdGmLHOOrgER
-      J2krUpdErOW2Jq/sjAqwGFnSvietCd+k4gYkypGfQEckhUhdUgNyXeIQb1Oqq4Fc1/H8V6pJIqCn201K
-      dunkTz+nd3c9CjBOnjLMOXTtF+R7LBHQE3ztrgKI8/GC7P14AXoYaaggwEV/To7Q8yH/yDgnBQGuK7Lo
-      CrIE39Qr/z0l7maoIaaH8p3j6XjLkBE/BDIg2yW2cZVE2+csT2g+DTSd8j+y6d+gDwRkoaxPbFKWjbL+
-      Vw8AjrbiUJ366aubgbDppkwyOR3vGiJyzh8o00ZoX3WHmzyxTa0hpofSLTwdrxtWXfMqrVQvPEmr6TIH
-      hbxZ3a0//BwLyqgXbgCiqFaQPAVaK8plTbNa0SnOCtHNunyjFCcQbdsPb9RmlE6ZNlqZuXLKzFUzOywu
-      3ojtfZPDjVGap3vCWl8YD0dQOTA0iu0AInFSBk4Vek/IAhEn9/pHrzvK9oc822b0DhHuwCLROis2iViP
-      fO0R8ZIf3h5yXXksalJDz8BcX3lQo3TEWV4gPOJmZWPXMBaF1xkfM41F5WUayOFGIvVUewT08Bv2qAKM
-      k6cMc54Crgtyolo91f6Pwdfu76l2B1F6qj0CehhpaPdUV9Qp5BoCehjnZPdUuz+TCzCo7ArpqWIGMwqt
-      L7Fy+hIrNUm4+XzcaqKSpLDCjEPqZazsXsaqXTlGfVxCsfSQ6Tqk6ff2ZOuYdKUGaDrF9+xAUanjLUM9
-      /R3M6XjbQHmXMBCaZb5cLz4vrmfr+cP97eJ6MaftIIDx/giEPAzSfjvh3RGCa/6vs2vyR+sGBLhICaxD
-      gItysRpjmT5nBeFB6wnLsqAUTifAciwpi+8NhGV5PFAW19AQzXN/9zn6c3b7SNoh1KQsW/NVfSpo998G
-      EWdedusZssQ9bdnb2W95Nv2tuIVpvuVtdLNYraOHe/I+JRCLmwmZ0CFxKyUTuKju/fawvo8+PX7+PF/K
-      I+5viUkB4l4/6dQhGrPHeT59CyoAxbykMSGHxKz8ZPalcDPKKqtWnvlEY3ZKK8oGMSc7O3hyQrNwiHqZ
-      y04J3YBFoa33BbGO+evjev4X+QUQwCJmUoPdBhGnWu6EtKAdTPvstHdQMI74j0XY+Wu8PwL/GnSBE0M2
-      FL/JGp76KgyCUTcj1+go6j02jZxooy5PMAMYDifSaj1bL64DMyosmRCLc8sRiz8aPxNjmknxgq/Pm7PX
-      X5bz2c3iJtoeq4oyGA/juL9ZLrjbEI0bRHf4IxXHfVpl25BAncIf51BmRU14C4krnDjbzfb84kqtflK9
-      Haj3xYQxd1oEuDvYde826udzrt3CMf9VmH/0/IPsqPs5lv+LLj5QtSfONbYtEdW2brYUp7eiAYMbpa4C
-      0sSAR9zqn4Txa1zhxNmV1Xf5QNRqK+DsqSirNNrHyUv0mh3Ssmh+VcvgqTndlLFRjtw9N7UpHO/26ajj
-      fdruVcLE5BprADEnr1wy4RE3Ky9ACiwOLz+b8Ig75Br8+bk7iNUkNVjM3PRTv6dvPPeJxuyy6pu+iBeA
-      Yl7KaL8Nuk61KcFb235qtxDjtmE8Jm/Ubi+w9whrq7xx2xMND2p4wIi8Yk8jMSt5N0YEB/1Nkd4tz5WV
-      BSOEZQCjNKlHWTcbYlGzmqUWcIttBRinfm523ZHHEl42wLjrf47V3FB6v3kAHaeatReLPVHYUa6tbbiR
-      23s95xibYlW8CcrXzwDqepuNg3aZ2rAyi/Noc6RMIPY4nEh5tqni6o1z33TU8e6b4WWOViNda7onfJNp
-      QI5LlSi80k4jXetxH3HGdnrOMZYhPaDS3wMqiy21MFOI4zmU+dv5xw+XvPaPReN2Rm4yWNx8pL2uBGnX
-      LvsdQj7em/In69Qt3PFXCaPcaSHEpVZrqbNDnl5RdjDyKNw46a5dklZ2CSJ1eLN8H2ki+pgIj5kVW24U
-      iTpeNV6kPm4JaZ2BDjDS+7R8BaHlK96v5SsoLV/xTi1fMbnlK9gtX+Fp+TZbhCUhZ6/RoD2w3SimtBtF
-      WLtRjLUbec0nrOXU/T3KdlH8Emd5vMlTntpQOHHqXJzLEppaRp4wzbdeRjfLT7/TVmE3KcB2WquYLDyB
-      gJNUh+kQ4FLfIxEmZ5qY5nuOr1XLnDiwY1CD7Wa+Og1VfZzq0hnTlG43H6nNNptzjEwh4kvSC/UCgSW1
-      WMf8McD80WMu6PfnxJimgnl+BXpuqqwjDNFpCOiJjsX2OaVsywLCrruUDY5DXGU1+VQHUrN+iZpIk13d
-      8a4hOhw3pAS0ONNY7g9H2bwh+gbKsFGmLnWHG3y/djztdHQM9sm7Ee/TOq0EYbEzVGDFqD9ETySnAlwH
-      9ZpbxPUcqJYD4PhBviKJAJ4qe+Fc2IkDjOTMr2Ou7wfV9MN2UNvEJgXZyKPAAGp4T0uLD7mYYHZhw02Y
-      ptcebdLEdUE1xPC0U3lZ12ejhlfQn0wBPZmC/lQJ6KkSrPwmkPzWdG2a73iIshYyXYT9drvDDZ42abIH
-      dEdzDwVljxud0UyL5fx6fb/8tlovqTtrQixunt5VcEncSnkkXVT3rh5uZ9/W87/WxDQwOdhIuXadgm2k
-      azYww9dNho/uZl/n1Gt2WNxMunaLxK20NLBR0MtMAvTqWReOXDPvcrErbcbBDpQXlyCsuVezaLUglh4a
-      45q6mpgq6zDXR0nAAXE9TQ1KNTWQ6Wq7KWr16rg+ViSjhZrepAxRu7RjV78QlQpxPC9ple3eiKYWslyy
-      crz5QhI1hGmh5lw317I6dBaHGHldOtRgRyF16noCsJCv3Gk9nv56IHsOkOUH/brMVmj/V2rnzgYhJ7F7
-      Z3GA8QfZ9cOxkJvcJgb66J08gDXNAd08kEbs8u4xHmkAR/zHTZ5t2fqeNu3Eus6p59gdTIAFzbxUdWDQ
-      zUpRmzXNglG2CbBsE4xSSYClkuA9qQJ7UqnVulunkzrF3fGmgdgt7gnTQm9YAK0KRvdahwbX/Jo38mxz
-      uDHaZQfB1Taw4Wa05E0KtpXEnWcgFjKrWozuVBRmiyqeL6pQo2AawSsm9owcEHb+pHzX7ICQk1ALGRDk
-      IvW6LAzyCVauEUiuqUtu3j6RtpXYzzIgwEUrEi3M9tFPDDorSm0xELaFc2HuVUW/f+72gZRtlufpO4m5
-      pGMtMlEfLi5+4ZktGrFf/hpi72nQ/neQ/W/Mvrx/fIgIE3d1BjARqmmdAUy0ak+DAFfbTW574GVFtpo4
-      5i8rwiq7AAp7ZRNhF2+ZZ93DmPtYvaQqj/DkJ9prp4xtIjjiT9InTh4ZUMTLvpHofWwfPMLC2S4JWFV/
-      fPMWksyOAYnCzycGDdibFCO9iwVQwCtOq7zu8umfucE0YucXJwaN2Jtv3dVHImpLYLUx066s9qxIoMmI
-      +sf8WzfWTOu/WCDiJPW0TM4xyhueyazU9ENEuq2mL4aGCtwYpBqsIxwLsfY6IY6HM5QNoF4v57Y7PBBB
-      VZpVSU7OAYSdjDErBEf85HErmIbszXNIfZYdFjSnxbYprgTD3LOwmTa45ZKYlTwYjeCOPxNReYh/HKmP
-      YM85Rnk/Lwif3ZiUYzsNG7OqbliAxuA/Lt6x8+4Y0tDCiYAs7JYMyIMRyJ0nE3Sc7VA1+6RtHPHTB/8R
-      HPOz84fnLUB3BLcV5rCgmVuWCm9ZKgLKUuEtSwW7LBWesrRpTTKq2Z4DjfxcYdGwnVvFmvCIO4p36kd5
-      r2VXISti0rjgNJ9zBrQXJwZkuL7O11/ub9rlD7I0T6L67UApYEDeiNBOISJsw6szgKn52ona7rVRyEsa
-      m+oZyERYpdqAAFeyyckqyUCmI/367B4HfdacAQGuZpcUJ7sThwDGVEDcTHVTa3KMFoN8IorVF8Lq8/Wa
-      fvdNHPbLLnVTiXPkJxYw74/0HCYZwERrowHzFfu/ltv6ohlPIPt6ErA2f7/YbjZka0+iVhmXaZUkYBXv
-      91wIynPRtln2hyoVIk3eJTauQ+LXJf9BsngjQtcEzpKLgrCWugOCTlHL3xKGswUNZ7PP0zHL66x7ainN
-      CRfW3DcXl5fn/1RtjEOcTR9QNDHUdxrumv6tIipwY5DeQWqMayK+QTQo3bZ4mC3X38hT6R0QcU6fS25h
-      iI9SOlucZrz7fXFHvN4BcTwqs7avaIl9ZhgH/csQ+xJ3N7s1nJ60tHiSPwliBEjhxKHct55wLFX6JIsa
-      tUdhnjclcp7W1FsIOpxIIuyeirF7KkLuqcDu6XIZrWZ/zpt1mon520VNr1raJa2qsqL1yB3SZ93xtTvT
-      2/aRmp8pTg2DfOJNZpw9V6vTpr29DNrmWTaHG6OC64wK09qsCdv+JChOnbOMx2LLvnwHNt3NuDf1VvUQ
-      4opy9SeOsCF9VvKDBeCuv0h/Dkc1y9xRQ7gGM4r8I/sW2qxlVjXLp8U9J8/ZLGBW/8E1ayxgXs7ubthq
-      HQbczWodJdtu4qa/2aKO/MgMFGYjPzQW6vWSHxuIByI0u8ryEmNAvV5eslj8eAReAkESK1Z5UJ3UfVx9
-      J9kHzPJVaupFE5KUrXUON0bbDVcqUY93d2B7dwfLe+TkuCOY16o0FmXBLpgB3PbvyxdVqxOW5rI50Ngt
-      scYV67jtF7VaQJ9h1kDTKWJOGgyUZZO1LfVxOjGa6c+HaDaf3TT7M8aEXWUcEHESd7iCWMRM6rHYIOJU
-      TZjpK8IDKOKlrCHngB5n9JrVz1GSVemWsgL4mAeJSOmXWxxiLA8p76QV6HFGT3H9TJhpivBIBJESvkyx
-      QY8zEtu4rpmnrQuQGHX8RPoABmARM2UlWwcEnOqVMG0dGwAFvOpLHlnwV8+ckk6HETc3hTUWMBdq9Wlu
-      euiw6f6kPspZl38QpgoYlGm7Xjx8mS+bm9ps0Ub7+AUToDG22YH4gDsw7qbXWS6N2ynvyl0U99ZVzvVK
-      FPV2az5S2oSYAI1BmxEEsLiZ2EqwUNTbvHo/HGj9JVyBxqG2HCwU974wChSIRyPwynBQgMbYlwn37ioU
-      9RJbOiaJW7OEa80S1FpRdi6HWNQswvO4mJLH1UEhJUDPeyME50dT4o11iJOEX2BqBjBKUP06Urdy7wOe
-      /iEljb+UCbqjI3eSWbKgpQrv2Xefe3qzB2rrNH/7nBVxTlhrySUh64JaYfUUZmOdYgdCzkfSric2Zxpv
-      0q28459ikf76C8Woc6BRPaUMocIgX3PH6L4Gg3zUuzxQkI1+R3QOMia35HLBAB2nasFyHhgLBb2MxDxh
-      qI93muBT0/3GukkDaDmzp1TQLrohIAs9bw8Y6vvr/jNTKUnUSr0rBglZyVmnpzAb6xThfNP8tKLMYjMo
-      zMa83z2KeXlpeSIxK+OxsVjIzLXixj9pcwQtDjcy75YG427eHRtY3MxNX5027fOCVa9rGOQjp66GQT5q
-      ig4UZKOnos5BRka9boCOk1uvWyjoZSQmXK9rP/BOEyyfu99YNwmr1788/DHnjqHaLGJOfx7KqmaJWxTx
-      UkfaDBBxct83gAIkBvUdmgEiTuobLgNEnfXxEG1klyeqop/NFHNmCMczHlG8U0RBjqg+hW12aXyv0L3Q
-      ew4H8f09klnXjMYT7xNPUOO9RxKDPvMMvt4EvN1yYNDNKDW/euZKnH4jvnHSMNRHrIdMErY2+3JypA0I
-      OrtNNxnSjgSt1HdKX7F5J195s0O+YnNDuh/2CcO2T0AX8U3IV2TGR/d38rsKnQONrHcHNgubeU84+myT
-      PjM3McfHLoM85Q8nFeHUU5+atN/HM5Qm7LgZ1wxeLeNuuHfi4dM8EqSdFE3Ksv1xvbq6kNXSN5Ktp2zb
-      /NtF8yPNdqJcG2uWgQEizoRW4+kcYqSW0AaIONs1qL7TZsu4tM9eiTgq4/QQ5fEmzflxTA8esTlw/7Q7
-      J1YZmGMkUnNKgZE6x0gkxvtXzDEWSYhIxHlNnPXl83gi9jvWhCSjLkFiEWt9ncONUZZwpVGGnal4p+dG
-      TH5umhWDtu3qT2puEzecIZkQ6ykths/yg4MaNk90lSSy1FKHk5YSHfFMi3g4btKfh/eI2ZpGooaUhGJS
-      SSjeoSQUk0pC8Q4loZhUEgqtBOtSO/DKDBMh6jvcPlc3PX5INYDrJsR/r8DjEYPrHzFe/8RCEF8Zahjq
-      i25WM6ZTobi3XWiMq25p3L7kn/USPOtmKJFRf3QcZORUC0gdQFmRTGNgE2d9RxiH/GokKySAyQMRkpTe
-      s9Q43Egeb3Jg0K2Wf2ZYFYb6uKfas7i5mWSZ0ubSQTwQoZvwTjZ3HG7kJYcOA25WXxnpJze9z+n7VNoc
-      amSUgicQczLLbY3FzEvu2S6xsz1npuk5mqbn3DQ9x9P0PCBNz71pes5N03Nfmta5UM+GmhxAW3nPa4Gj
-      RVX8ylr51ePwRaKvAosrgDiMBgTYdqCvJu6QgLVtQJOVLYb6eIWvxgLmfSbbasVTSEPCVQBxOOM58FiO
-      GowJzcuAwxeJn5ddBRDnNBxCtp9Aj5OXZwwasjfrQrQbMdLlGoy72zvDlbc0bm9uB1fewIBbcGs1gddq
-      IqBWE95aTXBrNYHXauJdajUxsVZr1h0lvkUzQMjJ6fkj/f6mE8x6/noStP7NuGLnDWTzZ1bqISlHXB3d
-      xADfC3k6sIahPt790FjcXKVbNVGOK+/wUX/QFegOMxJrXjsyo50zlx2exX76K3Gyj4a5Pvp0U2wmPHN+
-      OTqznDenHJtNPvydmHoGCDnpKYjPSlcLY7arIURxnsWk5oTNuuaE/JXPQFk2tU5TnIro/OIq2m62kXiO
-      m1qKJMckE2NF2f4g2x4ZdY2gScLxc1D7jL7DFXcaX7ztPtrkx7QuS9pUe9wyNVp09T7xoitfxLqKnvfx
-      KTX4EU2PJ+LTds+OIlm/WTYvXkLsih+JIPPL+UVQjMYwIcrH4CgfsSj/vODfh5ZFzOqJCi6TbMnEWMFl
-      kk84fg4hZZKrGY/38eqX94jXaXzx3qGMADyeiNy82bF+M7uM0PiRCPwywjBMiPIxOApURmyfY/m/iw/R
-      oczfzj9+uCRHcQxAlESeSZqkH8MKDNAyNVpQkTFqBM6iOOY5/1oNGrD/DL9xP0fvXN+Corl7DPHVFctX
-      V7AvJaxba2Kwj1wkoS2W9odyxzo/iQE+WSVz7keLIT7G/Wgx2Me5Hy0G+zj3A265tD9w7keLub6udqX6
-      Ogzx0e9Hh8E+xv3oMNjHuB9Ibd3+wLgfHWb6GJ+Rgd+PqcKeeE87xPUQ075DAA9tXaYOAT0fGaKPsImT
-      TCcOMXISrONAI/MU3TNU27CqSpkiOzGmqdl6uxlB2ryRtvkFWI+Z9rbaQl1vOz7FO2Od9ZjpZ6yhuLfc
-      /IvrlajpfY5FUwA9x1XyGleklLBZ03zaHLsNHcX5U1ll9TOpqMUccCTmy2z/Lt76AaxX2C5t2RPSkmPy
-      cJu/pPGXDt+0y4mShjFN7XbXIfcbNkBRmPfatyP38DPrPtusaa62F9EvH6iF90C5NoYK8PxCc1h5j5pv
-      3DyjxlMufiE6JOFaaKM70DhOO6JEtEjCsVzSRlBaArJE9KvqKNOmOveqp99MV97HpIxjs7C5e2bVq9Eq
-      4egNARyj/e10pDge1DIwKSsaosLiNtuMML7BgQ1alL/W87ub+U2zyfnjavY7cQc/GPf6Ca9FIdjrpsxP
-      A+nB/nnxsCKt3toDgCMiLFdgQIPr9/ndfDm7jdTOoivSTXJJzDr91tgcZiTcEAeEnZRvO2wOMRK+G7c5
-      xMi9PZ67007tLtV2IneEDoNH4YvzEufHgBgNjvh5mQzNY9ws5slhzQRBlrMhEavoE7/g3j9T4YvDv3/C
-      c/9Wj5/Wyzkve+ssbqZnjoHErYwsoqGD98sfN5NXc1XHmqRaNi4uEoqgQxxPXcXbmihqGM30dXY92SCP
-      NUnOKlM2BxkJK0wZEOIiTJmyOcBIyfYGBLgo0/8MCHARsrfOACbSukomZdlI0+kGwrIsqKm0cFOIOHVO
-      ZywTbcKchlgeytzfHtAcy9VKfUYZT3/yesKypAXV0hCW5Skt0oo4FuKAlpM/5IXglp870ALCtrvM3z7K
-      h/Ulnb6+qAOCzv0xZwglNdgWq9WjPDS6WazW0cP94m5NKtcQ3Ouf/gyDsNdNKPtgerB/vZk89CIPNTha
-      cdcDpoNS2J2ONw3rKi7Erqz2FE0PmS5aYTcQuuVyOn5pcNT0vHTT85KYnpdOel5y0vMSTs9Lcnpeuuk5
-      X3+5v6F8njEQjuVY0D0NM5ia7sL1/d1qvZzJh2kVbZ/T6YuSw7THTimlQNjjnp5RANTjJZROEKuZ5S+f
-      aUnQE7alWbuLttGrA4JO0obPNmcb1cbxNJciIEu0yUq6SVG2jXI7T4DmmK9X17OHebR6+EM26kg300VR
-      LyEv2yDqpFy4Q8LWRbT59RfVKCUMsWK8L0L79SE/QstjEbg3ceG5h4vmqZCtS0KzFOOxCLxMskDzyIKb
-      RRa+HCIC00GMpgPlQ1GXxKy0jx4hVjPfrxfXc3koLa8ZFGQj5ACNgUyUO69Dg+v+039F2424IMxX0RDL
-      QxuU0hDLs6c59jZPWoZ8IExLQruSxL4K+R+JyqpZomYzCIrLQlHv5i1E3dGmvXmHQNkt1IBMF21jx4Gw
-      LAU1c7aEaZF/uNhuNhRNh7ievKBq8sK1EGZyaYjrEeSzEdbZSC01iTvE9dQ/a6pHIqZHkO+4AO641FI1
-      HeJ6iPeqQzTPw/xOHaS+jY3zfJjeJKJtWUzuDI5o3HibY5arVcPadWIFNY6Fu/6m+BYp1dthiI9Q7poY
-      7KtItbdLAlaZ1tkT2dhQgO1wlIVxs4UJWTmgrpdz1fD1Pu3rbE92tRRmk3n4XzyjIlFrku12TK1CXe9z
-      LJ4/XlCVLeXasvjjxTY+RA9UYQ8CTvXCpFkesCRbB9T1tj1xVQLIAmBfJsecXoBADjfSXpZl5ZbqbinM
-      RnrLB6CAN90n9Ee0pVxbUTKLkR50nbIRy0nIDnN9oq62sUgpzXGHBK2MdGwp0JZv45qhUxjim/4m3MJA
-      X8FPxMKXigUvGQssHQvCAtQW5vrqMi9fp6/lY2Gab/1lvqROPjMgyEWqGw0KshEKGo2BTIT+vAFprkNa
-      wE3EyWLUgEdpP7Zhh+hw3N/O1WX7O9z1v8iohLF4C0N9UXHcM50KHbwP86/RbHV3rsroyT0ZA0JclIF5
-      BwScrzKHpGRhQ2E21in2pGn96/LDP6PF3ed7ckKapM9KPV+Xxuys5ABw0795q1PBOnOTNK3yP6OtfOY2
-      8fT3kTZnG7/LFtmupNlaxjKVkdqEdXqtZECmS43zq1n+14sHWQ43CU2xArjpP1SyIUpZXdCATBc1z7s5
-      vbnXN19o65U6IORczR7aD7L+mP6mAaZhe/Tw+Imw9CeAwl5uUpxIwDq/DkgKHQbd3IToScCqdpn7jWxs
-      KMR2xbJdYTZ5+OLP5jMT6gOKOaBIvITFU5WfC7x5YBn0rC1HnjX1ezMrjys/wbCbm8pL33Os6kiyUUGI
-      K5o9/sXyKRBzXi9veU4JYs7l/L95TgkCTmL7AW45nP7Kr2d0GHMHPQOOAY/Cza8mjvtDkshTB6nfg+oh
-      W4DGCEkgX52kfufVSz3psV6xrVc+a2A9hXiwiPyE96d6WK4ZzTPL4Gd3OeHZDarHbAEeI+QuLMfKB1a9
-      dgI9Tlb9psM+N6ee02Gfm1Pf6bDpJg92AOMcbaecU9WZJGjlPigAjvgZ2ddmETM7QeBarf2RW6W5NGxn
-      JwdSk7U/kqsxDcN8VzzfFeoLSVhLMCEGZeNcrwSNxa+KUQkYi5lhPLkl5EZ478EyrDxZjpUn3CrXpRE7
-      O7WX3tKKWs0OFGajVrAmiVqJVatJolZipWqSPmt0N/8fvlnRkJ3YSUVGzfs/B9TdeD9V+z3smRvpqRoH
-      sZ8OX1/VOCIooXz1ekh3FTbgUYKSyVvPs7qsFurzXvG9V15vaMJPqP+Bw3htAETkjRnaFpjUL9cODchg
-      I7kr9EaN3qNleHm1nFJehbUV/P1z45igu7EcLRV5bQe4j27+xmtD4L1063dWWwLvp1u/s9oUIz1143de
-      28I2aFHk431+ET18mqvZJpPNBuXYaB+wGJDjokx10hDHo95Yf5dlZlwk0Tatpk/GwXgnQrO0A9HaMI6p
-      26uNsNihA5rOS3mr/rj5fBFRlu5xQI8zWn2ZnbPFDW3bD5v0grVfPIKDfs6u5ghu+n+LNsciyVNVYpCy
-      mgEiTpX/sl22lc8Lz60L7BjUB+434Hn7rXlc6Jd+oiCbKs14xhOJWfnJCRmgKGERxuxqf+GwCLbBjkL5
-      1nUgbIua2aN2zaZ8nueSqJW00x/EYubuKU8TnrzHcf9LmpcHvr/DMb+6F1x5y/rNsyKZh12C6zEjWh0Q
-      chkF8f4ItOrApf12wjxpBLf9XU1Hs3aQ7eoyLM3VQbbrtJpW/xBwVj+foLLjtutsvUNUj8iJqdqH6lti
-      YoQTBvoEzydM39dP6/s/5nfqyPY/SE8QSGv2+9vF9Tf6g2lioI/wGOoQ6KI8dAZl2/77cXbLvFoDRb3U
-      q9ZA1Em+ep20rezVlRDc66emBrrGEvAzOVXwdZa637/OHh4UST9tjcSsnLTWUdTLPVnfudLTViM16/L+
-      L5ns8+W6rfya1ddXi3tiGea1TIlGSCKPY0okSsL5JHasLpXpyaaBiJOaOD2G+MhJMHCDcTm7u4nkoWk8
-      uc7XEMtDGB07HW8Zms9OSI6GgCzRa1Y/qxCZWlFNbTJE6FKNaKx4xCUNdMYypU+0FJTH24Yi3uRptCur
-      79GxEPEujTbH3S6lLB43KrJi7jJ5IGXZdZOybG1nu0iifVo/l7T0sFjL3HyqrsKSnD1l2Q7l9M3VesB2
-      iPSYlIxsr4OWU6QpLdEU4Dj490B474Go4/pIu9YW0TzXk1eSlYcaXHNyhP6Nhmge/SUWZQ0pBzSdpzdW
-      VKXOGcb/jc4/XPyiFmVQK91H8cvPC4IXoA179LBaRQ+z5ewrrX0LoKh3ep3pgKiTUG+6pGlVHx8fvm/F
-      uezyyr/+pHht1jRvsulvX07HW4Y8K9RuRNH0b58tzPQ1C8jKcvBAOq+BgmyUJ1GHTBdxXEdDbM8uPuY1
-      tcxzSNNKHCnSENOzy+MnUtI3gOUgPqbus6mvKU9Y9h9APV5qJnNg211/iLZVHdHmKAEo4E3IugSy7A/n
-      dJGEQNcPjusH5ErJohSw7OJtXVb0hO84wJj92B/IOgUBLmIhdGIAU0H2FICFfmHQVf0gW344FvmU0npN
-      Jgb6ZB0ayRqGWnSYrGnORFQe4h9HUmbtIdMVsNcsgiN+8tYYMG3aiU0bpz2jEphe+w2Uaeu2Q2xaOs3k
-      i+h+Nn+I9k87Uvnk0YzFU2238HAny1i05k1dYKzWMSnSxTtEusAjFWWRciMoFja3Tbh3yA2gaDwm/x65
-      lonRLt4lmnOnmLskgzDoZpVQ+N49za+Urf96wHE0p81o9Vso7GW01y0U9jZt06rcEwd7UAMepS7DYtSl
-      L0JN3bUFhC13m184t9QgQSvnhhokaA24nZAAjcG6mS5u+gW/RyR8PSLBbO0LtLUvGC10AbbQBa89K7D2
-      LGW+1+l41xAdhCDXgQYIOKv4layTjG36O6VZ/rbq/OOBspvSQJgW2m4PAwFZApqFoACMwbmjFgp6iXd1
-      oAYbZQayOd9Y/Yu2bdhAWBbKxmE9YDnIW4eZlGWjbR6mIYbn4uIXgkIebdPk9O0Zx0RM4xPieMgpM0Cm
-      6/JXiuTyV5ump82JcUzUtOkQx8PJgwaHGz/l5fa74Hpb2rHT72UPGa6PV5R8Lo+2afK97BnHRLyXJ8Tx
-      kNNmgAzX5fkFQSKPtumI9qR0BGQhp7LBgUZiausY6COnugk6Ts4Vw1fLuFLwKjllhME5RlaaOem1ePgy
-      W32JCDVWT2iWh9kf8wvy3t0WBvoIA5km5dj6d0N78URU6qjjVeuwpqq5RtZqpGYlTcGyZ1+1/6YudW1S
-      g229fFyto3YW8/XtYn63bgb1CL0w3OCNskmfsiLKhDjGxTYNCGaKJsSs0iTdHyh7dk5QeePKv2fi+T0u
-      1jJNifoul+u4/JEJJQSCe/2EEgOmvXY1CiCqKvAZ0CxwNLWH9nwZ8rSZBm8U7h3RcK9fZciQAA3vjcC8
-      5wPttauMne4DArQCbwyVI/ZpHavhpcBbbqtG4wbkZ9cCR2v3j+1Hf0+nxwmJqOC46c9DWmX7tKijl3NO
-      NEMwHkNW6vtNaJxGMinW4R1CHeBI3EIBLw30yTkcs87DEZjFgPH8P67my3b7VFISWBjom96TMCDQRbhU
-      k9Js689XakLF5HUTesByHI5EhwIGx18Xl5fnk9dHaY+2aZUnDnFW0SwnyrF1702atzJdQUM0AwYtyuWH
-      f/75UX1/oj61b1+UU7aGxHgwglrFJCSCwYMRCF97mBRmi+I8iwXP2bKoOc+mf/YOoKiXm7qjKdv+Gonv
-      IXKJg37i9youCVqTi4xhlBRoo5TCFgb6ZAHG0EkKs1GWKHNJ0JpdcIySAm3cvInnyzZT8a67Z0EzaWKI
-      zeHGaHfgSiUKel+a2X0FQ9uRjrXbd07WGCLdUvrkGO9EkAXCOSNznTDIpz7KKZK4Ut+G1GmhBpAEXQ9Z
-      wGgy7Y4pw99wuDHalGXO1TbwiDsiP4EO74lAf2YM1mM+bp/jiu1uaMfeFACMYr3nHOOQaVgFiI07flVW
-      02u1jgJtvCdcI2FrTfm60wFBJ/v5MGGPm37DDNYxt1MPGS29AXScXapzsq2OAt462tY/ycqGAm2c2r7n
-      XGOTMViXPZCmNZrd/n6/pHzSZ1KQjbJhrEmBtuTIsSVH2EZNPA0DfZRVcywM9HFuBHYfCOMSJgXaBO9K
-      BXalzdBowjNK0Hau18vFp8f1PFrN1+RUtGDUvS2PBVfdsLiZtPIoCI+4o81bdLe4CQrROSZEuv/0X8GR
-      pGNCpPpnHRxJOtBI5PJHJ1ErvRwyUNTbfjdIGM7HeH+EcvMvWZOGxGgN/iiUbVgxHo3ALiM85QO5xNVJ
-      1CoLvPOQe9rz/ghB91QzWFGaNX5mj3/Rs7xBYlbibdQ4zEi9iTqIOck9IQu1vYu7z4z0PFGQrel5ZE9F
-      XB8rhtbAIT/1PrUMZCLfnw6CXE1bokyyXZYmdKlO2/blLX3FT5fErNTUHDjMSE5VDQScX+frL/c3vKvX
-      WNzMOd8BBbxxknyIqvSl/E7NChYMu8/VyAZ1vM+BYbf6laNVHGBsP3MUx6xON2StDkNuYt+wYwBTkuap
-      +ryPcekDCnmz3Y5ulBDooiztbGGQ70hPPbcVqv7KejCRJ7Jpa8lWtFqIm+zUYY9bpFUW52x7i2N+3mg5
-      xGMR8ljUtEnCGI9FKORJhEQYeCwCs3Xg4LA/Ws7/vP9jfsORn1jEzCkiOg43crrTLu73UzvRLu73b6us
-      zra8x8p2eCLRR00c2mMnvguwWcTczHOsWOIWRbxhBcFoOdAs+UHvKzo0Yg8rZEbLmKGMoL7Phg1IFOKM
-      fIgFzIwmOdga38f19pmsaijAxmkmw+1jRhf2RGE24kwAAwSczRhEwANm8ViEgIfA4uEIzCXvPAokTltQ
-      kdaIxXgkAr80EiOlkQh4joX3OaYsIWBAiIv6StEAIWfJaGUrCHDRFgOwMMBHWxbAwixfvyI4+e2kQWLW
-      gLciiGNCJGqDDnGgkaj9Q4NEreS+IrZGvfVjs0UUpwkKK7xxyIWQi3v9jMFzSIDG4D4CvieA2jZA1ui3
-      fhPhd1VMuasi7K6KsbsqQu+qwO4qb1wYGxNmjd4iI7e39/d/PD6oUoY869tmUbP821Na0VuToAGN0rVN
-      GMNGiAONJI70TOLQsH1bV6xzVxxspKyzb3OIkZqPNQ42PsdCNvuyimM9sbCZslmmzcFG6nM3YLBPPB/r
-      pHwtONITa5mbmcjzu/VyMSe3pCwWM38LaExhkimxqM0pTDIlFnWaCSbBY1EbbyaKe8lPqMXiZlbDCuD9
-      ERiVMGjAo2Rsu++ZoJYNJop7Rco+XZHWXm/Q3RSjd1ME303hvZuLu/V8eTe7Zd1QDYbczevSoq7e6OYe
-      9XrZhadtGI3CKjZtw2gUVoFpG6Ao1FfIJwhynd4E826sToN2+utfjQONnDoCqR3adKa/nLFhyM2rc7Da
-      pp2USHwdY5CIlXvjexTzNgvis59o2zAahfVE2wYsSs182wkJxmKwL6RG33k2h6h+AV2sKMwWlXnCMyoS
-      snIqLbiuYrU8kDZHWaR5VjAe5g6EnPTO/4ChPsLGNy7ps1LfUtkw5Ga14dzWm8zt8+v2+2r1RV4tyyTa
-      oA0kgGM0Jan6A8ffw6ibPtfbYmFzlvzkjtGABjhKldZVlr6kgaEAzUg8+rti0ABHad/yMBoIAG9FeFA7
-      wpPbCD0F2ahl3gmyXe12rHf3N5xiyqFt++Mn3pUPHGwkLqSgYajvQ7uYPFPb0bA9Y51shpwr+c73GOwT
-      vLQUWFqKoLQUeFouH+5Xc+qKLzqHGBkrkdgsYiZ/LamDHid9DoND++wiTC/8/uZVQ8LVt7TfHnT+vcAT
-      g15HOLTHHpA43pSpq6Pgn3VDI3Z6EdJzllGt+MR7X2iQmJVYEmscZqSWxjoIOJuPH+K6rsjSnvRZOf1a
-      SDAWg9qvhQRjMagDbpAAjsGdIO/io37yxE9YAcRpP0xhbM6FG4Ao3ZAgK8dqLGSmDyYOGOQj1vAdA5j6
-      pGfdPIMG7KyCDynzAr5jcHHYfx6l+zjLOe4Ohb28LHUCPU5uEWjxIxE4BaDF+yLQGyAujviN/ClYMUzF
-      WJzAGJj/cNxwCr0BRbz8OfugAYvSjofQG/qQAInBmU9ssYCZ0cQCW1echhXcpqKPa/QUZqMOvuog6twd
-      mM4dVEuJ8GdZTHmWBf9ZE75nTYQ+BWL8KRABT4HwPgXkWfUnCHGRZ9XrIOCsS/rgtsYBRsZc+AFzfM33
-      jfzvyCEBHoP8xaTFImbmF9sujvnJLdqeQ4yMtucAIs6QL44Rhy+SWpRgG6tF726oXyx5PL6I7XzZu+N+
-      k1b8eLoFj8bOTPD3vdavvKYxpBiPQ28gQ4rxOKyp+R7PSEROwxwwjEShfgMM8EiEjHfyGXbG9FZczyFG
-      Ve++w0Puajzxgh9xW2LFWi1+p5e9Jwhwkd87nCDYtee49oCLmLtaBPBQc1XH2Kb1/XLe7NnGeQPk0Kid
-      fmcNFPU29QZ5ERKAH4nwHGdFUAglGIlxrCq1KcyW+AEIrpkWj7Hsgdfkj0p/KQoJRmM0KUDsLqCWkWhl
-      nm3fopqfw22NP56oyyooUiPwx5DVr3rVRVwVC5P4Yp2HPlvn48/WeXAeP5+Qt0MvZPw6hmc7qMAzNN54
-      aVWVAanW8uMRZDfvUD+Hxmkt/mg/6V87gIaxKLKibefZhoXqNSPxDrLoyOquCAkKaZjQqOSP6kwU9ZLb
-      NDqJWg/H6lAKtVb9s2x+ck/csqDRmsk7svIVzDg9748QUo+K8Xq0+RybX8qccL8/oLwUo+WltiRKQIzO
-      MBKFX3r1vDdCSDksRsthEVwyigklozpml8dPAc9Fy3sjdE9pQIzO4I1SZ/uQEAr3+8mzlADeG6Edco62
-      m4AovQON1LX/1O5C2+/MSIYDjfR3WpXMAAoFvWpkm1kGnlDcy+rkdSRqzcvyO6sLP8Cgm9l7R3vu2mrw
-      nOJAx3E/t4Yc6WW2XQ55b5ln3sEeN6/t0LOYmfulAiRAY6hrY2ZuHcf9zXysgAAnfiRC091LgoK0ipE4
-      w/BrUKxBg8djj+9pNGpvF2Xi3pWO9trZXXhTgMZoi7+QJ9tQjMZhP+W6AY3CeBNtwyNuXtvhabTdkJex
-      qova3MxJIlMAxuD1M7E+ZtOdkjVopgLGedDgGerCIp+z67kBxtwhpbkYK81FYGkuRktzEV6aiymluXif
-      0lxMLc1FUGkuRkpzfSnRQ1w/C2YMw+GJxOs7+/vNIX1Nfz9TBNV1YqSuE6F1nRiv60R4XSem1HUiuK4T
-      E+q6sD7/WH8/pC/u74eLkDpa+Ovo0P79eN+esYasDlrO9fJxRd7FfqBAG6d8NEjQSp5TMGCojz6x02Ix
-      M+MbQ4tFzfQZPhaLmumltsWiZvpzbLGgmfrVX09hNtaYtUNb9j9njN1fThDgIr5E+RNaYUv9kdoO7xjb
-      NF8uPn+LHmbL2dd2VybGizBMMhqrjjfE9TURx0ik8+i5JGZgWOGLowq/ivEQYhJfLHqGtGmfnVxUO/SY
-      nV5ww4rROIc0rd4h1kkzEo9RuMOKsTj0pj+sGIsTmJuxmsU4iPNqGRL4YjAG9wHeF4FcHFuwz61GG/hy
-      RY/ZGR9hIo7RSGElca8YjZMdAqNkhwkxolhsg+MoyWissFKsV4zGaaruLBWBsU6akXihJZmYUpKJ8JJM
-      TCnJ1EEqb75DrF4zFo/TgcckY7HIr+5Bw2gUcmcDVvjiNI1GVkcX11jx2N+eeb45a36q0uaTRMbCwC4O
-      +ZvEY+t12rWTvz+Cv5BrdkygN1MHDPSRq9kBs3zN7Cr+vrAuDvoZI0k66DhVuPg7cdhjwEDfNmbYtjHo
-      ordRNA40ktsiAwb6iG2OE4S4yG0LHYSd9Hc5njc4YSvEjK0O0/3OqN4MErTSqxiNs43E5bXdlbXlX/pp
-      5eQq1oYBN8sJuJjfI6PfITNW6AFX56F+x+x+v9yUEPRBlQGzfPK/Em1HnFj+i7GzDmpBonEmKFmsbaam
-      CJAWzfhJfKyfS9lHf+O8ngMN/iiyOKGO34MGfxTGPQUNUBTmF+/+L93bcbOynu1qzj04kYj1U7qjfl1l
-      opC3Xd8j2mS1qBmnbOCQn/1p7thX9wFrZ3nXzWp/7NYl4eZzk4ci1BuhTiHOn+j2gYXMR+pSMj3l2jgD
-      V+jKYc0P5VYc6DpFubZIW5iW6tRZwNxMD8qKXUn29iRgPc07aY6JqzQm2x3DWBTqxmWQYEKMKC1eguMo
-      yVgs8o5xoGFKlPBLOlk80U7t85DbpDmASJyvZ/CvCYO+IRz5cpCzfgq8bkrAeinedVIC1kfxrosSuh7K
-      +Doo/PVPfOuecNc7wdc56ZcOTNKkqT2PIn5KOXJLgcVplk6jDygDPBCBu6P5k3c3c/UrP2l8KcJtunpa
-      rvyGq6/d2szczNOC7Ow4yEhfIw9di/IpZE2aJ/9aNGFrXI6tbxm0tuXIupbcNS3x9SzVMjbsTLv35No9
-      P9vu8Xy7V4M+UZz8i+bsMcvnjFuQx8pAw2gU8uZVsAKOo/IN9zpOrMfMPfceHnGTt+GCBHYMWoXtzNSQ
-      5VOW0N/mDBjoI7/NGTDL13wUc/oeg97Ad3HUH+BGvfxThs+WOtHFnduiOssypenL6uqg5TzElUijXVXu
-      o81xtyOWtg5t29v1hZqXADSxBsLOPH1J89M4WJJy7JbCF0f9zmhjIw44UvO7tgoUJ5LtGI1En7SKOMYi
-      /TjGebbLZHUfFm3wwBHVWlb08Xcb9ribs2juKDvCoBiLw5pUhFrGoh1lLf5OIQ2VJ277aLCfLNthRyIX
-      lWAZyVl5HFl1nLvZI77PI2sNc2T98m7Un/GC0SAtazdzppmiTZLqoOVs5+VxeggGiVgZPQQTdb2s8Tp8
-      jRsRMAohvKMQgjteIPDxAsEeLxCe8QLmCvjo6vdBK86OrDQbtKr+yIr63NX08ZX0yavoAyvos1bPR1bO
-      H0Y2kiOxC2miqJdeU1isbdZuF7nba8M+N7nj69BjdnLXFzQ4UQ6HslJrLPWjrcQYDm9FYI3JICMypz9T
-      GwEaZxvb/RzUVgw048DZxmYCKb2S1TjLyJgnCc6QZHxzDH5pfPo+mLo8lsbhxm49T1HLh/mJqzckZqy4
-      5u0xqHO4kfFGDMD9fuKbMQD3+4n7CgK442fukmeSjrXp4Kg2GS9VbBzyc04Z3oNN+4GXSbz7r1m/sxLD
-      m0P4O685sOl++ciZVz9Qjo03y9MAHSfjzflAYTZGNnBgn5uYCRzY5+a8RYcNaBRyRrPZwRxfZNHv87v5
-      cnYb3c2+zqdabc40Lh4kvJyvVhRdDyGu6O6apZOcacwOhEU1ekBzbLKoTmWLZBMn0bF4VfNs63QvG3tx
-      NbkN4ZX4Y71WZfEkGzFPmSB0gMdNQNRtXm5kTzGqzj+Q42is13weYD73mi8CzBde88cA80ev+ZcA8y9e
-      82WA+dJnvuKLr3zef/K9//R54598cfzTZ94c+ObNwWsOOOeN95y3Aeat15xkfHOSec0B55x4z1kEnLPw
-      nfPP/Z5fhCrY7z4PcZ+PuINO/HzszMNOfezcL4LsFyP2j0H2jyP2X4Lsv4zYL4Psl357ULKPpHpQoo+k
-      eVCSj6R4UIKPpPevIe5f/e7fQty/+d1XIe4rv/ufIW6oBdF01mWzuV3JKcmqdFuf5uCSY/lkQOxmNYyw
-      iK4CiFNX8V69uS5Ssn9AAW/X46jS+lgVZLVB43ZRx9MHXkHY5y4PfHWpt+5ScX5x9bTdi+wlkv+Ivk+e
-      yQCgXm+UFtvo53mAvjMgUZJ0y3JLDjGm200TcpOX0ydk4QYsivx9L56in7/wQvT4mP8qzH+F+L8nO5ZY
-      cobx4vJXbj60Ua+Xng8RAxKFlg8NDjFy8yFiwKJw8iGEj/mvwvxXiJ+WDw3OMEbbumrqJ8JMCQszfc+v
-      0XazVRdQvR1qitIkXWtdfbw4/dreW0HVAwonjsyZjDPvKMfW5UWGUSNdK8+I2Nr1vtpEIWYDlwbtpyTn
-      2TXatBclP7fZLGQOzHGoBIjFyHU6Bxi5aYKnR0A+gXgkAjOvQLwRoSsAn5v1xX4lbRkJ07g9SD7mlg39
-      t5fpb7kwHorQ/RQ9l1VBeL+B8EaEIovkQYxsboKQk57RTVBziuI8SsooTiavLaYhlkdV4ZS55gYEuEh5
-      SocAV5WSNm22OcAo4he6TkG262e0nf5hsYa4nuxiS/VIxPI8pTInx3n2d5o0E7bqMqr3JC1ocKKorVbK
-      bJvKIixPt/X03TUxHoiwy9I8iQ413d2TljWr0320Lfcb+Rd6Zndoy16lu+aluXr4mxGbpmdP2VlxRIPF
-      U9VIWaS8KB1suUXgHRajd/hYb5k51CAH6yZNj9G+TGQhomYCp9FLXFGWPcN4LUJWdqNwQjaLqPvKwrRp
-      3yWReC6PeTOCNX2OAICaXrUeoMxJapqpSrbuBNSf4iQhXYHfZEZVP9LTaKBcm5pBL/+bquswzVdEsVqg
-      6LiRD3QhalI+AVjTnCTRa1lNX+FIZwzTtjy8kVUDZLgS2eDhXKvBGcb050Hed4KqBQzHLquFfODIF2lw
-      plF9wbkvi/qp3KeER8ghfdZI7OM857tb3ojwFNfPaXVJcHaEYZFJUsXFU0pOUBM0nUKtndYU6WSrhdre
-      Ks3jOntJ8zf15QEpXwK0Yf9XvC03GUHYAoYj3+5Zz4zBmcZUiKh+jgs9MywpalCAxKDeLos0rPssz5uJ
-      LbL5Q2rcQ6zHXMvWJ2UHQFRgxSgy+chFr1kyfal5mzONZdLuJ83IHw4Lmql3z+Acoyx8o00smzUX7FOG
-      FGAclTXJRaQLO+6uZfahfdz5YVAPFpGdZA6PRqCWfw6LmkW6rdI6KICucOLk4jnbqc2zmWnk8EiEwAAe
-      //6Yh1TumMKJw21vOixo5pQXPecYj+e/ss/VYC2zfNSKDyRfQ5gWmdisElLnHKPq2se/EHUtBLuuOK4r
-      wMW4CzrnGFWaEmUKAT2MhquNOl7yA3hiHBMnh7i5o5R5pmg+hVbNznLzkpVHIVud8oYdSiFbHIQIoy4z
-      ctGMc7D6Mw5rmA/lK+2utYDhqFS/n9ffsFHX29U5zTFUsc6a5jQ5blOZNFuSc6Awm+pAHfKYq+1xyy+y
-      vxlpq2Gmr6tpyUKdA4yn9G7+QfYaNGTnnS5wtmIb1zUt158Q09MMaZLPS8csX83uoTisY6afJniOP6qr
-      nzKb1moXRErhbIK2k17rDhDsuuK4rgAXvdY1OMdIrdV6xjGR7+iJsU0/2bf0J3pPGS1RuBVq1F3k1ANo
-      w37kdt6PeM/9yG3gH/HW/St5mPXVGWct1Tf8Qqi1/A5qs6p817xUmuxE+CHC9iKLZqu78+jTYh2t1kow
-      VQ6ggHdxt57/Pl+SpR0HGO8//df8ek0Wtpjm22yaLoUaiSwmz1s0Kdd23IqLaJNSdR0G+OrdR5aw40Dj
-      FcN2ZZrUy1r114iwTrLN6cZmZzfyvdAp10a+FwYG+Mj3wuRA4xXDpt+L51j+76JZXu/t/OOHy6g8EO4I
-      SPvsIp1e38C0ZleTYspmhsw2V/23tFAThyaXmBg/REjUw399rT4Rv5mvrpeLh/Xi/m6qH6YtO6/sTHxl
-      5/Dj1weu9kRC1vv72/nsju5sOcA4v3v8Ol/O1vMbsnRAAW+3/MDif+c368X0lQswHo/ATGWDBuyL2SXT
-      3JOQlVajJmiN2v9y93h7S9YpCHDRaucEq52HH67Xc/bTpcOA+0H+fT37dEvPWT3pszJP2uKBCKv5fz/O
-      767n0ezuG1mvw6B7zdSuEeP613NmSvQkZOUUCEgpsP72wHBJCHA93i3+nC9X7DLF4qEI62vWxXccaPx8
-      xT3dHgW8fy5WC/5zYNCW/XH9RYLrb7JQ+3zfVdKkAJAAi/HH/NvihmdvUMt7rMuHdlOlP6bPPHdJ0/pp
-      tlpcR9f3dzK5ZrL8IKWGA5vu6/lyvfi8uJa19MP97eJ6MSfZAdzyL2+jm8VqHT3cU8/cQk3vzZdDXMV7
-      QRGeGNgUEaaw2ZxlXCxlfXe//EZ/OCzU9q4ebmff1vO/1jRnjzm+LnGJuo7CbKSlqADU8q5mvEfKAD1O
-      8o23YZ97+rLZEOuaj5s82zIS4sQ5RuIuiCaF2RhJqpGolZyYA+g6V4vfqTaJOB5GMXSCTNf8mnFWPWS7
-      HlSEtCbshmBzjpH1EOocbqTmF5v1mGl5xkJtL+Nh6SHERb909EkZfqJeNPaczG8WD7Pl+hu1QNc5y/jX
-      en53M79RrafocTX7neZ1aNPOWQsxQddCtH9ZcZVW22WxWj1Kgln/urRpv5uvV9ezh3m0evhjdk0xmyRu
-      XXClC8t5v17IBuT8M8l3gkzX/frLfEm97T1kuh7+uF5NX3lqICAL9fEeKNBGe7B7yHX9RvX8Bjg4F/cb
-      fG1X/MoAwP1+eiJeeWqF5nc1sPNnUyqpPidZb+KjflYKuYrxOIyUcgxQFNb5I2fMOUfnrFTf9Rv51vUU
-      ZPvvx9ktz3giLevy/q9vTYe7TdmmLlwRX3mgEihWezZ0fctZRnLDCWo18ZpMWHuJ1VhCWkq81jHWNg4o
-      DH3lILsI9JR+nA4p0htdcnv6S7ynvwzp6S/9Pf1lQE9/6e3pL5k9/SXa09d/4SSDznrM9ETQUMcbPaxW
-      kexIzL6uiFqNBKzksmiJjHgs2SMeS8+Ix5I74rHERzweV7Kl2zSdKcKBMm1qVXqKRx3vGqLZ7e/3S6qn
-      pTDbiqdbQb71ern49Lie05UnErI+/kX3Pf4FmJpanKM7gZBTtgroPglBruUtXbW8hU3kdrUBIk7iM6tz
-      iJH2vGoY4GM18EzSZ13xtdDTQu179xDiiuZ36+U3lrFFAS+94NcwwEfYW0tnYBMvh59AxMnJ4R2HGBk5
-      vMVA35/3f9AmFukcYCQOn58YwPTnjF56SQYwce4BnP6MtDfSXcRRs1bLPp3+MYMBma5m8+zoQH/TALCD
-      Od1Gv3/uPjgm7PRiYbAv2eQcn8Rg3y7N0323PflbPX1LY5/DF2l/zPkhJOxzix8V3y1hn7suQ9PnZICj
-      PFXl8RDJP2fT96rEeF8EygoLMO2zN8szHavpa6B5FHAcdQbRoUrVZ42cIDoPR2DmUDRvqqm/anUDprRh
-      feZ6+8xXSxh3BySzhnv8Tc857BJ0hxNJPgy12m1zWyap+uIujyu1bgz1IcY0TjyR7Q95sx1t9DPalmWV
-      ZEVcU+88YsGiBZbgiMUfjVkagg4sUkCJCBj8UZ6Y5RYs8cdilMAO748g3uNqxNjVNGt4MK+kZVGziGJV
-      Uqs7V78xIxgOT6SyCEkrTYDFOJRZUTerp/FCDLw/Aj9fDbw/gsoS8qkNuzGgyhtXROmPY5wHhOsMRpR4
-      p/6rW50rLsgxQB6K0H6dTTe3HGSUCXcKS9dqsOmmdqt0xjBtsqfi2JTvTUFP8FkkYm1rYJa2RQ1vQGXt
-      raFV0+dYp9Hr3ewzxalhhq+tNGndyZ4BTNT8rlGAjdX88LY52h+L9IkslAxkkuW0Wuw22sfiO92p04Cd
-      /JDrGOQ7buiy4wYwqWZWk//Jvp5ErKy7Dbb6VMtJf5BkwULWo47RSOTyBJeYsZp2VJG+UtQnxjA9x+JZ
-      pVzTzogOH69+iX7u1bq88eX5RSTE6zFKqnhXf/iNEGq6FDyXrh9kc/zz8AuNc2AOAqB9/74Sl6fRVpME
-      qwuPuMkdXkxhxDl8T9+o9XfPmKamhdYUy8dCpVWVCpFS6h3EAERpVtiiPn826vVSx15AfiwC7X7CAn8M
-      em7HFCNxmvGUoDCNYUqU8IRDR39OvQxiraxjoK8+PYBD6S8YfkgDxGPUsiZoOtv7z0gVAzScalW0smke
-      Na0j8qMM8kaE7k7TGr4DBLmaRix1GX8Eh/ysxrDDomb6on2oAIqRFS8fgmJYAjCGIO1f4YCQ01wpla42
-      eSgCrTMyQJCrXaOPrms5yEh+rA0ONJI6IQMEuRhFmUUi1pBbjqxiiRygMja/1EBVZtx2XEzEu27oihLI
-      Zk1zOx4W/pD7PJ6I75KU04z6WbRvb/6+uPw1il9+XvRrJRJ6KKgCiUNdCReEETepCDI5xCjbH2FnrAs8
-      MdRagUExTgIkRtvwITUTIHrMTu4feiTeWEkp27YhcVoBEuOUhy9ZAXp6xP5bkB17voJyEpCLkovLy/N/
-      MgbAbdB10jvlNjg41UJiT81giSyFpvoMCHI1S5PRbQ0G+dT+k3SdoiCbECL9SNc1mOWT51uTU+4EQS56
-      yg0Y5COnXE9BNnrKDZjpa0bNiAl3YgATOdkGCrBRE62HABc5yQZqsGUXccCafjBt2Xlr2gEo4CWu3mZz
-      gJG24pqFAT7aijQWpvu23NURARTwklNyi6ZkEpSjkpEclfDTIfGlQ8JcJdIlISttlUibA4ycJyrxPVFJ
-      0CqRGI9HYKYyskpk/zt5lUiXhKzUpyPxPR3UVSINCHBRy6wEK7MS/iqRIAy4yatEuqTPyjxpdJXI/gjO
-      KpEgDLrXTO0aMZJXiXRJyMopEJBSgLJKpAEBLuYqkRgPRaCtEmlzoJG6SiSAAl7WKpEwbdlDVolEBVgM
-      0iqRAGp62es5grDpDljPEcEtP289RwA1vdT1HHUGNlG+u7I5y8hbzxFAbS95PUcLc3zE9aRMCrORvu0E
-      UMvLWeXBAT1O8o3HV3lwf57+CR7EumbqKg825xiJH7maFGZjJCm4uoH1GzkxodUNTj8RPv3UEMfDKIbc
-      9RzVn8nrORqQ7aKv52hzjpH1EMLrOdq/UPMLvp6j8ystz6DrObY/Mh4WYD1H48/0S0efFM56jjZnGRnr
-      OdqcZWSv5wjTpp2znqPN4cYVV2m1XfjrOcK0aeet5+iSuHXBlS4sJ3U9RwMyXeT1HA3IdNHWcxwIyEJ9
-      vKH1HLW/0x5sYD3H059/o3p+Axyci/sNvjZtxcRFsSs5ZkAxHoeeoK7BGyXwSkavIuwKRs++yJLQK+gU
-      43HCrqQ1AFF4a20i+KiflVq+tTaxgxip5VlrcziGdf7IGXPO0Tkr8lqbJgXZqGttuqRlDV1r0yuBYtHW
-      2rQ5y0hu1EItWl5zFmvLshqySCuW13PB+i0BRbuvVGcX6J6ynDNYgIwULLmjMEt8FGYZMgqz9I/CLANG
-      YZbeUZglcxRmiY7CcNfahFiPmZ4I4Fqb3Y+MtTZdErCSy6IlMhq1ZI9GLT2jUUvuaNTy/2/tDJocRcEw
-      fN9/srdte6Z2z1t77KqtmkztlTJKEitGHcBMun/9ghr1g4+ML+lbV+B5sFUQBD/ib6PwWJuUojYk1uY9
-      f2jAYm1SKmbbpel2nA+NtRmSnHV7cMw1w5jQWJsByDmBWJsE4lzf3nDVtzfeBPerI7E2SRJYZ/lYmyQF
-      q69srM05IamDF4u1Gabt0rVcbUHfizCxNsnPWKxNBmW8eMPPxtqcE4BYm2uGN6Xd4WGsTZKUcocHsTZJ
-      SsId7sfaXCVAsTZ9jjGCUxthrM35VyDW5pphTCnXgD//CefeP+9KLq2O2UMTNx7Ke921TvROKO9NdHq+
-      1k2+4B1rgq19On2loX600jBIFOCCsIiAKQNet6ej6/b0M2vj9OO1cSZtHZ+JreO7pq+RvT5aI3tNnB+6
-      RueHrqnzQ9fY/ND571ZVzdHmtgOG3Q9lvv/c3EJx7GPzm2yekVt85f+3k41Llrlum51xuf/JTb65gAgf
-      K+G/vO63f+HKsY/NyLnh8cVfy6ush2/Rmrbc/JkZpXyb/TNFN2Mr30mUspbbo3HNAHW0eW0PVx0RzZ0h
-      poOSyLG47ISvGg0ES5wB4gAiCY25Kd1fRGXk9oUha4aYlLQ1QV6R83FHWI84b3+6ehjxaaPc11+AaiIW
-      y6X8IvZ1W5xFaeu5++xUbo5mwbFr89cpNdeXJDvPLyW04+afaH/FwxZfdy70S+auv8pN1TZa5EUhO5MD
-      n6U+cgQluU8ej9ubOEoFtm4vhWwK9d5hoTEjOPX/KfZ9U2Ln4c74pi5XWoqTzIG7ISSp9a/h+Es5HD8i
-      JeDKedmb9iwbIW/di70PbYu92RqiMW9RV7IxwxXFQ6hsUMXKtbePuz+hhihuiJdihH0ytErYQzG2K5Fa
-      lKeJlVdp3Uv1KWeTVcXKVfZ+TCvGkTGrro5NmtWRMWvfPHEvTzDvztJrSSYeej+tlmRILcmeriXZhlqS
-      fU4tybbWkuzzakmG1JIsuZZkD2pJllxLsge1JHumlmRMLWltT+NdFHlxkmPfvwTGZDwdswO99gCMOLU0
-      SUrLxY3ikncdcrNH+KCEoaOYcBpmjjcCQxEPC3xu4DdEUsada5T3JvznM8cbL0jIwgAkznfx7Qey28gK
-      WTwugJ5r5862og2Rn/b94SDdmwrbfXXd7M3V9temVakp+zApfh8mteylNEZzBJ4vHEvN9s/cBbYA+8IM
-      ynu7cVmGMPb0aXv2LiklBBK+LNdGC5X/TCnizsbMHzLN+iGpEY54QyDi+hAvf2RfxDE3J6m+DrG3AClD
-      c3YXuSrNfCc5a2OvYaZkmagmOOe3aZnLlOgnOOfXRW5M+kknOOv/oVLVE7lYdVYlzU34HGNMmZtg4ZX7
-      lL8kv2JiYeJ2Ia6esHM48buI3E/4OXzltz9L2UF7pawZz4S8P54BxiE6o2CPg6ir7xBJ3xH6APS/p+yU
-      BzpCU3bCY++vZ4A6tNCtMhL5R2aGmICu4pjbp0XT1zWmGBDq2b6nwpib0F2L3A82t0+j1/SOsB47VktQ
-      WYra+u2v36fshAfGVmNunx5GA4e+KTDNjFHfqTpAx+PyU0ML1RmXnfBXN28HCIb8xIBEWZ6yL7xxl3gY
-      Y2/fMWXNLKbr/aGIz6AzKPWmzKD7XNy4S1Xu4k6gsjHoyvsqctdzrja3qAtBLbVBDLUh9L5oGw3wQ35i
-      KOzQFjEM+alB1S4CcAls4ESpwAa07gsRWNQw/w6KRsh3lZiFXmHbKbH9LfszIJkZYpI3I849oBkB4rDP
-      Dn2S2oAHtMaIryo7QGNzU7o5tAhus3v8qdq7eJfNO3QYK4z4XAXtdX5E7uSZIaYmv7gtJhptVO62wQOE
-      Pkq9WlT5V1FXGmk3VpRnK4C+5QwQR1vozs0t2zsEuQZrLPQ17fBuCfVNGPF1RQVobG5KT697k65kCHPu
-      6QVygvhOEqsGK5UOapWGn2w6eLJ1udSi2Bf3mfzNMh8MnEa9ZvP6gGFEq0E5Y/BLAd9ZEsh3JZ2ByH/v
-      esxTMcjLWhbm3PezkuRewYv7lhji+xaN8D2lHCUScp5AnMvNGw7ThujmCA8UXDndS/fi9k/oMryAhX1o
-      fn3C/MqaX4fd6tyUV8IJX9OcfdxTwsXAxt0L+9gMbUUWFfyiDH1x6xfB7cJ+bWJL3b4/DIE4l2mhmfcA
-      DJzwRMQtGnl/StEFuGuPz62M7muDsjq6zuwwM5PXx1ZV5rR5zBE38KVcpaoO79BKuAju+TvlNpsYZnG0
-      FljssajAK2OY5jO3oW3QmJ2ijNcV6loGc4O9C0q9bow7tMA28SQhr4cG3nHG3w6pZKMrYNgdwQO/LRPe
-      qolBA2/dtmdtu/5nKUo7DnCjC1DPGIJSxkEL0OxR7Pff/gfasAu8PYoEAA==
+      H4sICAAAAAAC/2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAKydXXPbuJZo3+dXuO683Kk6NRM7nbT7
+      vim20tG0Y/tIck9nXliUSNk8oUiFoOy4f/0FSIrEx94g94arTs10LK61SRDEF0Hgv/7r7DEt0iqu0+Rs
+      89r/I9qUVVY8CpFHhyrdZT+jpzRO0uo/xdNZWZx9an5drW7OtuV+n9X/7+zit+3H9F168evFx8vdh/iX
+      9+m7979tk4s0+SW9/OW35OPm1/cfd9vzf/u3//qvs6vy8Fplj0/12f/d/sfZxbvzy3+c/V6Wj3l6tii2
+      /ykPUUfdp9U+EyKT8ery7CjSf8hoh9d/nO3LJNvJ/x8XyX+V1VmSibrKNsc6PaufMnEmyl39Elfp2U7+
+      GBevynU4VodSpGcvWS0voGr+f3msz3ZpeiaRp7RK1dVXcSET4h9nh6p8zhKZJPVTXMv/k57Fm/I5VaZt
+      f+5FWWfbVJ1FG/cwnO/pp8MhjauzrDiL81yRWSpOV7f+Mj9b3X1e/89sOT9brM7ul3d/Lq7n12f/Z7aS
+      //4/Z7Pb6+ag2cP6y93y7HqxurqZLb6uzmY3N2eSWs5u14v5Srn+Z7H+crac/z5bSuROUtI3uG+vbh6u
+      F7e/N+Di6/3NQkYZBGd3n5Xj63x59UX+ZfZpcbNYf2vCf16sb+er1X9Kx9nt3dn8z/nt+mz1RXm0M/s0
+      P7tZzD7dzM8+y3/Nbr8p3ep+frWY3fxDnvdyfrX+h1Sc/ksedHV3u5r/80Hq5DFn17Ovs9/ViTT06Z/N
+      hX2ZrVd3Mu5SXt7q4WatLuPz8u7r2c3dSp352cNqLmPM1jNFyzSUp7z6h+Tm8gSX6rxn8n9X68XdrfJJ
+      QIZeL2fqPG7nv98sfp/fXs0Ve9cA67ulPPZh1TH/OJstFysV9O5hreg75Wyy8N3t7bw5pk19lR7yXJqz
+      mC9lQnydNeLP5t34zyb/f7pbSqd8fKLZ9XV0v5x/Xvx1dohFnYqz+qU8k1mvqLNdllZCZh6Z+csilTeh
+      VllMZuq9UH9QoqxWT6vKceXubB9vq/Is/XmIiyYTyv9ltTiLq8fjXvrE2SaVcNoEkk/vf/7bvyfyyS5S
+      8HT+b/yPs81/gD9FC3npy/YAr0M/8Cw++/d/P4vU/9n820At7qJdJEsZ+ByGP7Z/+McA/IfhEGlNtXTI
+      4Lle36yibZ7JpIr2qSwekqk6l7SsDB3oEWn1nFYcnUFaVlUWRpvjbiezG8cN8GaE5/Pogp+yLg3YmVrU
+      x05pl3bsISnhT4dHmafrbJ+qmo3m1UjH+iRruDxlik3YcbMSAbn6kHvmv2OqrMiKrM7i/HQlUXLsSl5q
+      IFw1xJ0vl1FexkmkDKp1I5tiUwNB7GC+u5/fqh/UOVCKTJsbjPfzr1GVdvFWsrmg6sSJVogFzJusDLJb
+      vBnhpZK1KFfvwJA74PRBwRBD/fFqcS9bLlGSim2VHShZEqZBuyof4qMs54ssYeh1HPVvVGuF51Yo6t1m
+      B9m+DzjzQYDGSLLHVNQBMQYBGoPt9ji//4yKeJ8yxR3ttbPPuoVR9z7+GckiW/Dyu2XAo2RFaJTBgEYJ
+      uAXe9D9Uu4Ab0NEee1mX2zKPAiL0BjRKtduGpM8JR/3PcX7kyhsWNwflG1+eyUQUy3qNYe5IzLrJy+33
+      rrzj2XUDGEXUskUYVwn3phq8FeHu630UJ0m0LfeHKm2GYojNwRENEG9XpSlwpCBHxERATJk/3tHTzyBh
+      65tcCOJBImYJK0CWID5uskCpsv5L5YN30fYplqX4Nq1qktnFQf95mP98zN/8YtyROH9kBAI9SMS2m3o1
+      Y4U5wbA7/VlXcViSOQ44kmgvkxOgQ13v9imV5eOhyp7VKPv39JVqdwRAjLa9Kq/tsSqPB3IEEwf8eRpX
+      WuoJcgRbgMWw7xMzkqPB4u3LJOWFUCRmLZt+FfPcO9h1p0W8ydOo3IqDqhQPuezoU0NADjSSyB6LtCsF
+      1NCFBPYHwQwJy9DYdS7U/SuKlNzcxCRurF1+FE+nR5d8YSYN2GX9TnZKxjU1lbhKuWyXbWUpQLXaPBZB
+      PS88tyJ9Vt7DbPNIhENcxXuWuyExa1viMkpsCwf97YMgavV+hq7XaMTe5/pou2EF0AVIjKbaECx7iyLe
+      U3MgyjNRs/SGAY4i/xQfc9kljYV44aaSI5kYKzqKtEriOn6ToL0Njp7+jLihOhT1FumLbDYk6U+mvOex
+      CIGtAVACx8qKXRlt4zzfxNvvnDiGAI4hC4O8fAyKYingOGqgqykhuA+QIcBjNMM5rGEPTILEkrcuPJYt
+      QWIxWoQnDjYyW4MaCnt/HDP1SvvpWCflCytJTAMcpXmfEj9RR58cGrZ3rSeZn2U3h532rgWORnyjCaCI
+      NxeylJHHbL+3jyjrZrsWOJrMvtnuNagUsRTeOEl6qJ8CgjS8NwL3tmu462/eiHZH5OU2Zj2DoMSNVaSy
+      Z1PvD9FyRR4A0VnI/EIXvrieKt2Xzyl3gMOkXbv6IYq3W3mnqWoN9Xqjx7JMAuQN749QpUX6WNYZo4OF
+      aJB4bTG1O+Y5K86AY/5N9JTRG0s6i5lL2SnY8m5yx/rN/NusC0ZihN5owINEbDojze0S2d+8YKbCE6c5
+      cMOO0eIev2qrB/hb3OPvCpmAEL0BicJ+KDxPhJoAnPKsLYp4i+N+Q3wlZ6KIV4TnSDElR4qwHCnGcqQI
+      y5FiLEeK4BwpJuTIrlXJyz8nGHLX77oJmtGhLBnVjMkjEVjjhcIzXtj+dhq8ETx1jyP+U9uXPf4GW8Bo
+      5+w0OvekkfztWD1zSp0e9XpZwwY2j0RgjdUOJGIV2WOcP/ISpGP9Zn6S6AIkRti7DkCBxHmLnH8+MedH
+      smtZvkTH4ntRvqgXx4du9IVzk3AZFjsw2hS/SHPVCOTUDrYBjtK+fWfpO9Tj5d7/0fve/B44RIF5kIjN
+      0G5cJJy3644AjcF/nyLG36eIYdYps6TRccQf9F5FTHivoh0TknkNAxLlWFXqINUG4oYxFVgcmdX3XT7k
+      RdEEcIzgN1Fi2pso8aZvogTxTZR+fPdYH+L6SYTE1T1IxFI0JbksZ5sBYl7a2hI4VhpX+Wvzvqybf8Cp
+      ygELEo33Vk/43uqpH3dxLlI1N6Tqqt00ibqPZ5taixNwzAmfyWOVxhILSEvTAEfJHgtZl6kG1Pn7SL0G
+      eazihFUzwiYkasjbRjH+tlGEv20UU942itC3jWL8baN4i7eNYtrbxtNhIpWtgV0VP6oPabmxDAkSK/TN
+      ppj2ZlMw32wK9M1m84sIy146Px4hiqvH0CjKAUcq1Lu3NhWDWvaQZyyiiOLkWU3PEmkSHNaSwbGbCYBV
+      Kg5lIViZwhAgMXjvvYXvvbdoPiLpp8JyJvujFiSa+N63SAOyOqDB43Ufp4bGszRIvG6hDE6MFoW9P47Z
+      NuD2aDjqD5j9ICbMfhBBsx/EyOyH9vda9TzLQrb4xFN88eFjVO70/o/gRR2zYmfTtadlG1c+2cd9yotu
+      W+Bop8JxmJXKLPlAERYzdLaJmDjbRD9OdfnLopYFdEi0weKPph785CnlznXxqJC40LxudlMQt+HRs+JR
+      fZhSVrJHsW9WLxLc0IAKiVvVB1Xd7rI85UXTBUiMusq2wcNCrgWO1k07Uh8LBhTbrgWLxs6d3txojoOH
+      9B1hExpVNb/a+lZ9VsZtqoKiqTFDmgu4zR+9juujCL3aXjIlFq+SsB3eSMMMvLBohmdiRPEm8YQ32lEN
+      xsjyJyDUSYHEkWV28sTSN6TPGpbNTQUeJ93yz1+xuLkSMVcsUa83OGl0BxKpOvKqoQaEnfzBdd+oetcK
+      fYOGAWzyRmXNmRWjc2aPqsu9o3pbCrDJZ/i+7QX/QX9xZtJj9mi2uj0PC9EoRuOo9lRgHKWA4yxXs7AE
+      MwQTYrCTzbVMicZNPNcCRwv4hNHCR/3slLMd45Ha18fctINN41HfIh4eSXX92kUp69foKaOPgYMSM1a3
+      uFWkFljtXwcNr78oEUdUcFztTds2PqjmPSeka4GjUb8G1jnMWO6jzWtN64C6NGxvv70lLwwD4B4/b2gE
+      UXjisIe7cYsn2iENSDMFj7j1Z1gEBTJMY1HbscSweK3DE+lthpMmKj3n0fal2DFbHPVz3t4DuNfP+jYX
+      c+CRaBMWTRK37tXayBV1QhdswKP0y5ExXr76PHjEroueZ7u0mXdErVrHXL7I+5QfaZ/6zcSxPADH/YE3
+      x3tPnmIRWrhZCjwOv0gZaNieifZVC7cNo/NwBOJ3iBoG+5qZxLyio0O93pBWhaVA44SU4WKsDBdvVDqJ
+      yaXTMHrPjePLoSKgBBLeEkiElUBirAQSsi+RJ9FGfe1UPOap6tmwAgEeOGJd8lv1J9ZvjnZlFXCzAQ0c
+      jz5eZZKmlf6BMfRdccD6ft61/QLW9fOu6acWl4sPhzxrvz5XGbamrA7uc7iRWOv4edbwUz+pUYbus4Hj
+      5l/pthYqB8lWOG2gekRlxc3VQWqR625FdFIkGx5xR3kZGKAxQFGaXno3KKyq6Lymx3EdUKT69ZCy00qD
+      R9zMtLINZpR2JsZTRkqcHrJcaoJMuxQfyTZgli9k/ceRtR/pZwmcX8jajiPrOvLWWMTWV2SvrehZV5Gx
+      oAG4jsH2WNdPVXl8fGrWS81T2gg3gJv+JM3TR7VnV7St0mZINc5VC4LUgkYlVqyy2cRDdme+ky5C5yyj
+      rM4Znx1pmOlrx1z7Ob3b+qda5SttdkFSfT5KkDEXFLkZ7W0bF7Q7AOCoX327oOpqcpGMOaxIgauJjq8k
+      +mariBJWEA1ePXTCyqFpVcl2L3P7DQe23D8PZdVM4VA13V4+rJV8SEkBQIMZhfouwn0H0W8bqCa3NEvA
+      U3wubdvrd/onsrSHzKUBu/4aTDUuBDmCY4Ci8KpV/7qn7ZLuw2cG/SI09FQCLUA09vuTsfcmvPVbsbVb
+      h/cMoT0mvwmLyn0vM+V9zHBMV41367G3c1KY4UAVFteeB8OM6WiAeN2XC1X64yiLeVnoE1cDQSVgrJBp
+      2ogCivMmb7ZIb7QemwUo6Gu+6ZxjjLpX/EThCXN9zFkhFgp42ynPm1f6li8AjvoZdxCfjc1cVxldUzls
+      PeWxtZS13yvZ8i/3THkLA+7uE336NASX9tiHDS7YIQYFHmfYqJUZpReAMZ5TYlNX5zAjdXMVk3Stpy/3
+      GSP2AO76nb4PNYIjAGKoJjzZqyDARX+HhL7/136I/vrw7rdotb5bzpvZWFnykxkCMIFRWbMN/LMMusW7
+      9yISx4Pq1NDVGuy6d+SnZQc8J/IfmXhK6a6Oc43stQFGViFvfn4m1ysScT19xy3KU/IzZsCum72ewMjK
+      5cGrlk9YsTx4tfIJK5VzVimHVyhv1+U89fuiuvyeFtFGPopq6IDTKxuxudEZo7nouujNTJxTJ4q+8B6A
+      e/zMBqvNIxG4hYoBY+5jnocmkeVAIjXfcNeycSeaIakmCwhWPNCERFWdo7g+VunQxWTFBDxQxDZ781qo
+      Jg3YWVvQmCRg1aZlk70a6zeTp7aBAjcG/7v/sR0PmiWEN1lJdSoGMLFWDvDtmdD/JtSIRrFNWeITDLjp
+      DaIKahGJdKuemmF17GbojNeE87mgyO14r/F1NT0kIIFitaNLrH6vAaNu9Uke49k3aczO6dkNpM/ajIbz
+      1Q0O+Vk9dHQUSzzFlRpD4w22mDRqZ6xL69KQnVf64eUeUNl1O5STY6CmaVFV54CVgTyuaZFZTwTiASJy
+      V4x49K8Woc0Ejx/TSHynzdQFcMDPfp3q0rD9WGQ/6EO0AwlatS/++1dQjBCQZiweJwe7BjdKwMK6o/v+
+      hOz549/vJ2CvH+8+P9qP9MlxDgy6OXUO2mt/YbQuX8DW5Qu9rfYCtdVeZJGVshuUJm3a1TcLoW9hMYcZ
+      KSuYX40aoOPUFi0lSjXSscq+OVWnEMsjokSWFiRPizgeJWcNN9isY25bdERlC7kuoJpVi1UcBDURPCYn
+      asCasC7t2o3xMd4kDo/GjKdaQsdDQhyxGijTlmebKq5eyZlZ5yyj2mhteNVI7bcBOOBv5161k+EEWW/Q
+      pn0fP2bbfjSnXz6tJuV+VGLHUgvLxnlUygeFOrzgwKabu48dvocd8bsx53ux4rg3O/+k++bSpv2QpqQm
+      lDreNjS3iyZpEMtTlVu1p08z0HkoRc2bguvRwPHaQkq9gDtlOPpnQWMuJ/JzlqTtKVJrbAc23e2ioTKP
+      91cd7fLs8ammvqXyioCYzchanj6nOTnKgALetoHFE2usaa6IhUbllBPMDfTQ/fK0HzhPFIDbfmG/2v8X
+      cdY/ojDjdEuRDrMqKREc2HarxcRl5Lz9JIamNlnb3D6tVUr9oMAkbStnhzBsd7CAncG8u4I1P1IH/XsI
+      cAXtsTRlZ7HmmBfOGb9AZ3zOukfnyD3i7EyG7koWsiOZfzey5lfoaxhyCEgCxCK/S8d2POPudobvdBa0
+      y9nIDmeBu5uN7mwWvqvZlB3NBG/Oq8DmvDb7f7V7BauxPur5Gixg5u195t33TP1IL3EiqLzhbAyF7mgW
+      tPvXyM5fATtyeXfjCtuJa2wXrub3bntiVuYyYMDN3Q9rZC+s8P2Tpuyd1BxT7MpqmzaDPs34hogfyakE
+      SoBY9Nmd6MoggjxjUQAzFt9mx6Opux0F7XQ0ssuR+vlfyffz8+ilrL7HVXksyKlj824E9lzEkX2Ngvc0
+      mrCfUfBeRhP2MQrew2jC/kWcvYvgfYtC9izy71cUulfR+D5FzRH1kSytj66H/TnfyM4/zF1/0B1/wnf7
+      mbLTzxvs8jNph5832N1n0s4+zF190B19+u149KVO6V/KeTRIPN7tRncO6n8MmZKKSsBYzLk6Y7sT8Xcm
+      8u1K1P42DKVxylybhyK85Z5HnP2OBH2uo4DmOgrerDSBzUoL3zNoyn5BzTFPaaINbcvjdhm5ugIlUCxe
+      /sdz/tt8SEvZbeiNdhqavMtQ0A5DI7sLtXsCMXqGSI8wbJeiKTsUvc2+PlP39NE2OXlSL9CoswIhHo0Q
+      MjtNTJ2dJoJnp4kJs9MC95cZ3VuGt68MtqdM4H4yo3vJcPeRwfeQYe4fg+4dE7pvzPieMc0R7kdg5MIM
+      cgCRqDvTILvS8HakwXajeZudaKbuQhOyA41/9xkRMtNS+GdaCvp8RgHNZ2S1NOBWBrl+BOpG9SfG6l06
+      hxvJyyg6sOmuS/VymD/TBuLNCPzdhnw7DQXuMjS6w1Dg7kKjOwsF7So0sqNQ+G5CU3YSCt9FaMoOQgG7
+      B3l3DgrdNWh8x6DQfXvG9+wJ3q9nwl49an5H9JTmeam629XraVUlYhjQYUZijCGDo8YvMS0R1PGWQU2g
+      IikUYDieL96fBiLIg1kO65hZSsTVjSiylAY7mNc3K97FO6DppMsgC+uCHdB0qp2nos1xt5MZkmEGcMP/
+      fB6ds1PUhV03T4rZuCnswrb7IiQVLvypcMGUYraAVLjwp0JAGnhTgCOETQHXjlx5cpFF2j4BU50Whvoo
+      s1wAdPBmFwnnPC0M9VHOE0AHr6z1r5bf7td30aeHz5/ny6Yr326jtzsW26kxRjRj8dT6sm8Qr9d44iVp
+      emhOjB2qN3iiqEnwxTHP2UFOAl+M456vP+495sNRPLHVCva4xfRvCyDWYyYt8gjThn21XN/L4+/W86u1
+      em7kf35e3Mw593ZMNS0u6X57LJOiEfOAT2PGUzMiF/df+jJif6A++ZgCi6Pm6NYpL0DLoubjgak9HjCn
+      /FPCkyoSs3IyrUujdlrWNEDMSc2AJolZqYWEjRreZmnE29nXOTsrIwZvFEbdjCl8cTh1MqZA4nDqYoBG
+      7MQHyQQxJ2HhfAdEnIRPJG0ON1IfdhdG3IfywE+FE4y5aY+8CSLOZt5xyIOpC7AYhIWtHNB1hj1+Y08e
+      N3Pg+YJW+p8Q18PNWniuEk/ZjnxnGsh1UWuOARpcs6sr2QmLruerq+Xifk3dFhzBvf7pH+iDsNdNKLlg
+      WrPPV9HV19nVZF93vGnYbrZRWmyr1+nbBFqY5dttzi8uWUqDtKx1xbUapGlNUrKuQ0xPut1wTk3DLB/D
+      BXlK9r0oPfdCNIuKNz9Qvh8CUNfbBeR4NdT0HouXKj5QlQOF2aJDnCTTJ1SBsOnmnCd8lgHniJ/h6vY8
+      mt1+o5SPA2J5Pi3W0Wqtjm837CMZbRh3k6oKgMXNj83HejVX3uG4n6/2WSnVj4viXsIQFYB6vSGpLOBU
+      /nrPzh4GinqpZ6yBqJN863TStt7d3cxnt+Tz7DHLN799+Dpfztbza3qSWixufiTmMRPFvRlb60sH6u0y
+      Udwr+KkgfKlQl9GnW665gS33Z2Ym+4zmst/ntzLezeJ/59frhewKxsm/SGaAH4lAr5pAw0gU8iMDCUZi
+      EG+Ci4/4qdkd4EciHCrCFB3cMBKF+ngB/HgE4hTHEQ0cj1vDubjXz8tXWG1n/szMU2itt5h94KaKiaJe
+      YmroIOqkpoJB2tbb9fx39Q5of6A5Bw4xEl7r2BxipN8jDUSc1CaExiHGjCfMMB/5bg8cYhTMaxboNaui
+      5yiL0o+/cMUdjvjpTRGDtKy3Dzc39MzUU5CNeNM7BjJRb/cJslx3n/57frVW6ykRJvq6JGwlp53GwUZi
+      +vUUbKOm4YDZvqv1vO863l7PP5NPFBD4YlCLYRv2uakFsg373PQcYdM+e0ii+9ObnFMs2OemFrM2bLnv
+      5d/Xs083c26SQ4KRGMSEd/ERPzX5AR6LEJA+3pRhp4knNfjp4E0BygeqAGp5V/N/Psxvr+acAV+Lxcxc
+      K2Bc805zjZxhm93atImThGa1YJ97m6dxQSynIYEvBrXJa8Owm1pzoXXW6QfCjBabg42URcRsDjHy7lSC
+      3R9ykYWX5MNLhXfsC+9h1N1vJbyPxXdmCMMBR8rT4nH6d7guCVuphS5a53Q/0IejdNDjjKbvBwyxfnO0
+      O4TIJQ77Ba+UEVj5ohbfZQrfoUa1L/3t4prp7WjcHvp0iElPh31UFIvtW0RTHjii7FQ/rD9fcoJ0KOKl
+      Nlg0DjdyH/QTa5nXH8+5xbWJol5iq0UHUSc1DQzStjLf46zR9zislzfIGxvmaxr03UzzQ5LtdnSdoiAb
+      PeMg73Q4L3LgtzesVzbIexrmyxn0jQzrNQzy7iXkhYv/LUvzqyzeHtMireI8+ztN1GpY9Aiuw4707X5O
+      bm+fIMhFz48nCrJR+xcnCHKRc2QHQS7BOS8Bn5da8ZwlO7dsD7eLP+fLFf/tHCQYiUEsMFx8xE+9aQBv
+      R1hfsaoIjUOM9IrCIDHr/tAshRfVPHWPI356LtFAxJnxzjXDzpGcCwYOMdKrFINErNRiQeNwI6d6cXHH
+      //mSXUyYLG4mZwONxK30zKCjlvfPxWoRMA7u4l4/MUFs2OumJotDW3baZtMaYnna9kctuz9qQVKSz0Qx
+      7/N7nvT5vWOso3JD2YfKwixfVqf7KLnISLYThLgo6ww4IOYkDttoHGikZxyNA41HzgkewbNTWzlwbknL
+      IUZyuaGDiDO7SFhKySFGagmhcZCRd9HYFbMuF7lWtcAG6znpQMzJeU5aDjIW8i+8yz6RoJVzk5E7fIiJ
+      7dmegmxqoWW6TVGYLdrWP3lGRULWY8G75paDjLSVS23OMu433XqR5DdaBolZC762ALxtpSjT+29aOaFx
+      llG2vfdZnT2n9MLHRFEv9fExSNt6rKO0pI2fdwxgYrRMBszy1fHjBfXDl44BTGL6tso6Y5vS/SFv1lOk
+      3lqDxKzUG6uDmvNh/UUev/4WLW4/30XdR7SkM0YNY1EI9wvhxyJQ0ggTQDH+mH9bXDNTaWBxMydlTiRu
+      ZaVGjw7eT7PV4iq6uruVXa3Z4nZNyy8w7bNPTw2I9ZkJKQLCmntxF8WHQ7ONVZanlCX9AdT09js2besq
+      p1gN0HLmaVxFuzyevsmnhUG+dtFVplWDLbdaTKbZtLg5hGQ2UctLTU43FeVfmu5ys+ENccFaVIDEaHfb
+      fjzGVVzUacoKYzmASMTNsW3ONCblabdHim+gTFta7igaebjJq1V3SK/RDchy5YSVZHrAclS0u2iVk91f
+      ojjPqRbFmKZmrhFhKpTOuKbpS+0PBGA5kC0H15IVWU31KMY17dUgDCONThxsPExvbFqY61Mr6Mj8On1K
+      lAO6TmaZbqGYV5Z7YvpS3BDrmqm7NNicY6ReuHW1T+nP5LgnZeYOMT3qBhWkvNwStqUm13wnxjSpbNhs
+      AFbQUkjnbGP9RC4WewhwURp4GgOYmkW6SB8MASjmJd4OA0SciWxIVOUrS9uxiJn6QBgg4pQde55TgYiz
+      Imxc6ICIk7Rgv0u61pLeItEw00fM7E4+V5XAJiujQ5xVRFHPuUZGA1DDXB+tbdESgIWwR4bOAKYD2XNw
+      LapM3Bx3VFWHuT5Rbr+n5ERvKdv2k+j5aRuO+01akZ9HDQN96omSdQhD2ZGmldHxAfs8h5KUIeThFq+m
+      Y5AyQktYlroiVysnxjIROzoHp59DLdzdMp2addw80+5IK4pzqqaBABdnlMcAbaegPa4NYDleeGf1gpyT
+      4JTdAi65BbHcFk6pLchltgBKbLXryZ4mkYDtoJeuAixbmzZcTthF24AAl0z6Zk9Qah5wYMStOgIHwlq0
+      IIy42V7YSe2pC3A0Q5BHMwQwmtH8jdqD7iHAdSCLDq6FOjIiwJER0Q1IEFsvGgb70nKn+vnHquBoB9q1
+      F4SpFDrjmvpxCHIOGUiPlTgyIrwjI8Ov4pBuszjnqTsYc5M7SBbqejmjOQIdzem7Yt0uWKSX+ajAivFU
+      HvMkkj0iTkrbMOgmZ7kBQ3zEFys6BxrpGUHjbGN7J+VvNGGPWb6C3sY+MaapTgWjYB8o03ZUW2uTzqol
+      TMszdfzs2R07e+Yk0TOcRi+MjtUL2LMiZykgL7WPLvGVSQ9BLk6T2yQ162306WZxe91+q188p4QWkYvC
+      XlL2sDjYmBXPcZ4llKFRkEbtzGTIPKlAGSszMcN3tf4rSqdvAjIQjoV4W06I4yF8YDYQjoWWPB3hWEQd
+      V9SzaRjD9Pv89upTM5eBoBogwCVIadQzhunr3e26OWHKFEObg43ErGBwsJF2O3UM9alCRtSUjzhRAR5j
+      V1bRvkyO+VFwo2gKOA4tM+gY6oty1ddPmNqONuzxRkSZiF7KimLVKNOWkCyJQ5NPpENMj9hebAqKpQEM
+      xyYraI4WMB3yLxnJ0QCAg7h9gM0BxkNMtx1ix7TdbFjnNnC2MUm3NJUEbMcTYZ7CCbAdecq6sB6zfftD
+      RjNJwHA0c9kIiuZ410BZxl9nABOxOhkg00WYwHBrfkvf/ptaZpwQ00OrbJ06dlseC1XAvkR/p1WpEkyQ
+      dA5t2GUep5VGLWA6smeKIHu2aWo6nxDTc6TcbePLNPnvtHiKi22aRPssz9UrvLgp5KpsL1v69WvTASbo
+      p+jM+D+Occ5qoFikaf1JSRN5tEETn0Ln+dtV5V42ZIr6sdyn1StJZZCG9XFLySryaJM+fXmq7kUakYpz
+      h7XMdVTttu8/XHzsDjj/8P4jSQ8JnBjH6YsyD4RjIT5xJ8TwyLqNVna0gOEgDejf2mP5t6qtKMs0Yot4
+      gGxXkT7G6ksimuxE2baS1GhtAcdREE9GArbjUL5c0CSKcCz0J0ajYNsulqWWGlvkaTXc9hMzONTnkH9T
+      lSbNogjDkqe0h6Q53jSQdmzsAcBxTpacG5Z9XIknWduQZiWYmOUT36ktmp4xTWVC7CN2BGSJfhyz6V+g
+      2pxjpNXCHQFZLpo6ke5qOcjIFPp9rGYMLMBjEJ9vh3XMzdCroJ5yR2G2aJOrCc0Jz3qiUXuZcM0lkPPJ
+      5cwAIa5zluwcs7GeS4NFzAFixLs/5kSdJCALrwHtwo6b2Cg4IY5H/KiIGklAlpqucfOdOG6omuMGsrCy
+      RM85RkZx5ZZSh4zWlGgB00HLl3aelFmKeiUdYnhog/v2mH5RyOSh8Op410B9AgbIdB331CbMCQE91AQ2
+      ONf4KtvHVJtiDBOtE2L3QA6xqnFU4y86FmrlD1J9CNCmnTtG4xmNIa1MdzreNVAmvQ2I6RHpMSmjKia9
+      sdUozKb+z2PKc7asYSaeoHNmrFPynEv7Z1q30uBMI7VlVLmtoorcIqqA1hBxu9yBcCyMoQ4dc3y0cSkB
+      jEsJ+riUgMalaC0SuzVCbIk4rRBaC8RufagWBDUNOsTw1GVkbeFKMLow6O72ZGOIO9K2spq6BmcYj7QB
+      gaM9GnCkvUA62m+QjrSscLTzwnOcH1Ni3dszhok4jGWNYfWH7I7Fts7KInoilEAgDdlFmu9odbiLat6H
+      z9HX+ddumZLJSoNybaRXIhrjmh6r8oVqUgxsavcJ4vha0rVSmugD4nrURz/VMznROsz07dM95S1fT5gW
+      UVdES0s4lnwb10SNQgAP4Q3xgDiegn5ZBXRdRZ4WVE+uf5t49elTMxxKGSbWGdgUbcoy5+gaEHGSNjl1
+      ScRabmvymtGoAIuRJe170prwtStuQKIc+Ql0RFKI1CU1INclDvE2pboayHUdzz9STRIBPd0+VbJLJ3/6
+      Ob2761GAcfKUYc6ha78g32OJgJ7ga3cVQJz3F2Tv+wvQw0hDBQEu+nNyhJ4P+UfGOSkIcF2SRZeQJfim
+      XvrvKXGfRA0xPZQvKE/HW4aM+CGQAdkusY2rJNo+ZXlC82mg6ZT/kU3/un0gIAtl5WOTsmyUlcV6AHC0
+      FYfq1E9fNw2ETTdlksnpeNcQkXP+QJk2QvuqO9zkiW1qDTE9lG7h6XjdsOqaV2mleuFJWk2XOSjkzepu
+      ZeOnWFBGvXADEEW1guQp0FpRLmua1VpRcVaIbtblK6U4gWjbfnilNqN0yrTRysyVU2aumtlhcfFKbO+b
+      HG6M0jzdE1YRw3g4gsqBoVFsBxCJkzJwqtB7QhaIOLnXP3rdUbY/5Nk2o3eIcAcWidZZsUnEeuRrj4iX
+      /PD2kOvKY1GTGnoG5vrKgxqlI87yAuERNysbu4axKLzO+JhpLCov00AONxKpp9ojoIffsEcVYJw8ZZjz
+      FHBdkBPV6qn2fwy+dn9PtTuI0lPtEdDDSEO7p7qiTiHXENDDOCe7p9r9mVyAQWVXSE8VM5hRaH2JldOX
+      WKlJws3n41YTlSSFFWYcUi9jZfcyVu2aNOrjEoqlh0zXIU2/tydbx6QrNUDTKb5nB4pKHW8Z6unvYE7H
+      2wbKu4SB0Czz5XrxeXE1W8/v724WV4s5bW8CjPdHIORhkPbbCe+OEFzzf51dkT9aNyDARUpgHQJclIvV
+      GMv0OSsID1pPWJYFpXA6AZZjSVnWbyAsy8OBsriGhmieu9vP0Z+zmwfS3qMmZdmar+pTQbv/Nog487Jb
+      KZEl7mnL3s5+y7Ppb8UtTPMtb6LrxWod3d+Rd0CBWNxMyIQOiVspmcBFde+3+/Vd9Onh8+f5Uh5xd0NM
+      ChD3+kmnDtGYPc7z6ZtbASjmJY0JOSRm5SezL4WbUVZZtfLMJxqzU1pRNog52dnBkxOahUPUy1x2SugG
+      LAptvS+IdcxfH9bzv8gvgAAWMZMa7DaIONVyJ6QF7WDaZ6e9g4JxxH8sws5f4/0R+NegC5wYsqH4Tdbw
+      1FdhEIy6GblGR1HvsWnkRBt1eYIZwHA4kVbr2XpxFZhRYcmEWJxbjlj80fiZGNNMihd8fd6cvf6ynM+u
+      F9fR9lhVlMF4GMf9zULE3VZr3CC6wx+pOO7TKtuGBOoU/jiHMitqwltIXOHE2W625xeXavWT6vVAvS8m
+      jLnTIsDdwa57t1E/n3PtFo75L8P8o+cfZEfdT7H8X3Txjqo9ca6xbYmotnWzWTm9FQ0Y3Ch1FZAmBjzi
+      Vv8kjF/jCidOs6UbL4l01PE+bvcqeEyuFQYQc/KefRMecbPSG1JgcXh5xoRH3CHX4M8z3UGsZp/BYuam
+      L/g9feW5TzRml9XL9IWyABTzUkbUbdB1qi0FXts2SrsBGLed4DF5o3Y7eb1FWFvljdueaHhQwwNG5BV7
+      GolZyXspIjjo35XV99MSWFlZMEJYBjBKk3qUtakhFjWrmWABt9hWgHHqp2bPHHksYUAfxl3/U6zmX9L7
+      pgPoONXMuFjsicKOcm1t44jcpuo5x9gUq+JVUL4wBlDX22z7s8vUdpNZnEebI2WSrsfhRMqzTRVXr5z7
+      pqOOd98M4XK0Gula0z3hu0cDclyqROGVdhrpWo/7iDN+0nOOsQzpZZT+XkZZbKmFmUIcz6HMX8/fv/vA
+      a/9YNG5n5CaDxc1H2itBkHbtVRoJ+Xhvyp+sU7dwx18ljHKnhRCXWhGlzg55eknZf8ijcOOku3bZV9kl
+      iNThzRJ5pMneYyI8ZlZsuVEk6njVmIz6gCSkdQY6wEhv0/IVhJaveLuWr6C0fMUbtXzF5JavYLd8hafl
+      22zwlYScvUaD9sB2o5jSbhRh7UYx1m7kNZ+wllP39yjbRfFznOXxJk95akPhxKlzcS5LaGoZecI033oZ
+      XS8//U5b6dykANtpPWCy8AQCTlIdpkOAS33zQ5gAaWKa7ym+Ui1z4sCOQQ226/nqNFT1fqpLZ0xTut28
+      pzbbbM4xMoWIL0kv1CA9S2qxjvl9gPm9x1zQ78+JMU0F8/wK9NxUWUcYotMQ0BMdi+1TStn6BIRddykb
+      HIe4ymryqQ6kZv0SNZEmu7rjXUN0OG5ICWhxprHcH46yeUP0DZRho0wP6g43+H59dtrp6Bjsk3cj3qd1
+      WgnCgmKowIpRv4seSU4FuA7qNbeI6zlQLQfA8YN8RRIBPFX2zLmwEwcYyZlfx1zfD6rph+2gtolNCrKR
+      R4EB1PCelu8ecjHB7MKGmzAVrj3apIlrb2qI4Wmny7Kuz0YNr6A/mQJ6MgX9qRLQUyVY+U0g+a3p2jTf
+      yhBlLWS6CHvadocbPG1iYg/ojuYeCso+MjqjmRbL+dX6bvlttV5Sd6+EWNw8vavgkriV8ki6qO5d3d/M
+      vq3nf62JaWBysJFy7ToF20jXbGCGr5twHt3Ovs6p1+ywuJl07RaJW2lpYKOgl5kE6NWzLhy5Zt7lYlfa
+      jIMdKC8uQVhzr2bRakEsPTTGNXU1MVXWYa6PkoAD4nqaGpRqaiDT1XZT1ArRcX2sSEYLNb1JGaJ2aceu
+      fiEqFeJ4ntMq270STS1kuWTleP2FJGoI00LNuW6uZXXoLA4x8rp0qMGOQurU9QRgIV+503o8/fVA9hwg
+      yw/6dZmt0P6v1M6dDUJOYvfO4gDjD7Lrh2MhN7lNDPTRO3kAa5oDunkgjdjl3WM80gCO+I+bPNuy9T1t
+      2ol1nVPPsTuYAAuaeanqwKCblaI2a5oFo2wTYNkmGKWSAEslwXtSBfakUqt1t04ndYq7400DsVvcE6aF
+      3rAAWhWM7rUODa75FW/k2eZwY7TLDoKrbWDDzWjJmxRsK4m7u0AsZFa1GN2pKMwWVTxfVKFGwTSCV0zs
+      GTkg7PxJ+XbYASEnoRYyIMhF6nVZGOQTrFwjkFxTl9y8fSJtK7GfZUCAi1YkWpjto58YdFaU2mIgbAvn
+      wtyrin7/3O21KNssT9N363JJx1pkoj5cXPzCM1s0Yv/wMcTe06D97yD735h9efdwT9nxXmcAE6Ga1hnA
+      RKv2NAhwtd3ktgdeVmSriWP+siKsZAugsFc2EXbxlnnWPYy5j9VzqvIIT36ivXbK2CaCI/4kfeTkkQFF
+      vOwbid7H9sEjLE7tkoBV9cc3ryHJ7BiQKPx8YtCAvUkx0rtYAAW84rSS6i6f/pkbTCN2fnFi0Ii9+Z5c
+      fSSitt1Vmx/tymrPigSajKh/zL91Y820/osFIk5ST8vkHKO84ZnMSk0/RKTbavqCY6jAjUGqwTrCsRBr
+      rxPieDhD2QDq9XJuu8MDEVSlWZXk5BxA2MkYs0JwxE8et4JpyN48h9Rn2WFBc1psm+JKMMw9C5tpg1su
+      iVnJg9EI7vgzEZWH+MeR+gj2nGOU9/OC8NmNSTm207Axq+qGBWgM/uPiHTvvjiENLZwIyMJuyYA8GIHc
+      eTJBx9kOVbNP2sYRP33wH8ExPzt/eN4CdEdwW2EOC5q5ZanwlqUioCwV3rJUsMtS4SlLm9Yko5rtOdDI
+      zxUWDdu5VawJj7ijeKd+lPdadhWyIiaNC07zOWdAe3FiQIbr63z95e66Xf4gS/Mkql8PlAIG5I0I7RQi
+      wla3OgOYmq+dqO1eG4W8pLGpnoFMhJWgDQhwJZucrJIMZDrSr8/ucdBnzRkQ4Gp2InGyO3EIYEwFxM1U
+      N7Umx2gxyCeiWH0hrD5fr+l338Rhv+xSN5U4R35iAfP+SM9hkgFMtDYaMF+x/2u5rS+a8QSyrycBa/P3
+      i+1mQ7b2JGqVcZlWSQJW8XbPhaA8F22bZX+oUiHS5E1i4zokfl3yHySLNyJ0TeAsuSgI65U7IOgUtfwt
+      YThb0HA2eykds7zOuqeW0pxwYc19ffHhw/lvqo1xiLPpA4omhvpOw13Tv1VEBW4M0jtIjXFNxDeIBqXb
+      Fvez5fobeSq9AyLO6XPJLQzxUUpni9OMt78vbonXOyCOR2XW9hUtsc8M46B/GWJf4u5mR4TTk5YWj/In
+      QYwAKZw4lPvWE46lSh9lUaP2AczzpkTO05p6C0GHE0mE3VMxdk9FyD0V2D1dLqPV7M95sxYyMX+7qOlV
+      S7ukVVVWtB65Q/qsO752Z3rbPlLzM8WpYZBPvMqMs+dqddq0t5dB26DK5nBjVHCdUWFamzVh258Exalz
+      lvFYbNmX78Cmuxn3pt6qHkJcUa7+xBE2pM9KfrAA3PUX6c/hqGaZO2oI12BGkX9k30KbtcyqZvm0uOPk
+      OZsFzOo/uGaNBczL2e01W63DgLtZraNk203c9DfbwJEfmYHCbOSHxkK9XvJjA/FAhGbnVl5iDKjXy0sW
+      ix+PwEsgSGLFKg+qk7qPq+8k+4BZvkpNvWhCkrK1zuHGaLvhSiXq8e4ObO/uYHmPnBx3BPNalcaiLNgF
+      M4Db/n35rGp1wtJcNgcauyXWuGIdt/2iLivWKWug6RQxJw0GyrLJ2pb6OJ0YzfTnfTSbz66bPRBjws4t
+      Dog4ibtIQSxiJvVYbBBxqibM9BXhARTxUtaQc0CPM3rJ6qcoyap0S1kBfMyDRKT0yy0OMZaHlHfSCvQ4
+      o8e4fiLMNEV4JIJICV+m2KDHGYltXNfM09YFSIw6fiR9AAOwiJmykq0DAk71Spi2jg2AAl71JY8s+Ksn
+      Tkmnw4ibm8IaC5gLtfo0Nz102HR/Uh/lrMs/CFMFDMq0XS3uv8yXzU1ttkGjffyCCdAY2+xAfMAdGHfT
+      6yyXxu2Ud+UuinvrKud6JYp6uzUfKW1CTIDGoM0IAljcTGwlWCjqbV69Hw60/hKuQONQWw4WinufGQUK
+      xKMReGU4KEBj7MuEe3cVinqJLR2TxK1ZwrVmCWqtKLuDQyxqFuF5XEzJ4+qgkBKg570RgvOjKfHGOsRJ
+      wi8wNQMYJah+HalbufcBT/+QksZfygTd0ZE7ySxZ0FKF9+y7zz292QO1dZq/fc6KOCesteSSkHVBrbB6
+      CrOxTrEDIecDadcTmzON1+lW3vFPsUg//kIx6hxoVE8pQ6gwyNfcMbqvwSAf9S4PFGSj3xGdg4zJDblc
+      MEDHqVqwnAfGQkEvIzFPGOrjnSb41HS/sW7SAFrO7DEVtItuCMhCz9sDhvr+uvvMVEoStVLvikFCVnLW
+      6SnMxjpFON80P60os9gMCrMx73ePYl5eWp5IzMp4bCwWMnOtuPFP2hxBi8ONzLulwbibd8cGFjdz01en
+      Tfu8YNXrGgb5yKmrYZCPmqIDBdnoqahzkJFRrxug4+TW6xYKehmJCdfr2g+80wTL5+431k3C6vUv93/M
+      uWOoNouY05+HsqpZ4hZFvNSRNgNEnNz3DaAAiUF9h2aAiJP6hssAUWd9PEQb2eWJquhnM8WcGcLxjEcU
+      bxRRkCOqT2GbXRrfKnQv9J7DQXx/i2TWNaPxxNvEE9R4b5HEoM88g6/XAW+3HBh0M0rNr565EqffiG+c
+      NAz1Eeshk4Stzb6cHGkDgs5u002GtCNBK/Wd0lds3slX3uyQr9jckO6HfcKw7RPQRXwT8hWZ8dH9nfyu
+      QudAI+vdgc3CZt4Tjj7bpM/MTczxscsgT/nDSUU49dSnJu338QylCTtuxjWDV8u4G+6duP80jwRpJ0WT
+      smx/XK0uL2S19I1k6ynbNv920fxIs50o18aaZWCAiDOh1Xg6hxipJbQBIs52DarvtNkyLu2zVyKOyjg9
+      RHm8SXN+HNODR2wO3D/uzolVBuYYidScUmCkzjESifH+FXOMRRIiEnFeE2d9+TyeiP2ONSHJqEuQWMRa
+      X+dwY5QlXGmUYWcq3ui5EZOfm2bFoG27+pOa28QNZ0gmxHpMi+Gz/OCghs0TXSWJLLXU4aSlREc80yIe
+      jpv05+EtYramkaghJaGYVBKKNygJxaSSULxBSSgmlYRCK8G61A68MsNEiPoGt8/VTY8fUg3gugnx3yrw
+      eMTg+keM1z+xEMRXhhqG+qLr1YzpVCjubRca46pbGrcv+We9BM+6GUpk1B8dBxk51QJSB1BWJNMY2MRZ
+      3xHGIb8ayQoJYPJAhCSl9yw1DjeSx5scGHSr5Z8ZVoWhPu6p9ixubiZZprS5dBAPROgmvJPNHYcbecmh
+      w4Cb1VdG+slN73P6PpU2hxoZpeAJxJzMcltjMfOSe7ZL7GzPmWl6jqbpOTdNz/E0PQ9I03Nvmp5z0/Tc
+      l6Z1LtSzoSYH0Fbe81rgaFEVv7BWfvU4fJHoq8DiCiAOowEBth3oq4k7JGBtG9BkZYuhPl7hq7GAeZ/J
+      tlrxGNKQcBVAHM54DjyWowZjQvMy4PBF4udlVwHEOQ2HkO0n0OPk5RmDhuzNuhDtRox0uQbj7vbOcOUt
+      jdub28GVNzDgFtxaTeC1mgio1YS3VhPcWk3gtZp4k1pNTKzVmnVHiW/RDBBycnr+SL+/6QSznr+eBK1/
+      M67YeQPZ/JmVekjKEVdHNzHA90yeDqxhqI93PzQWN1fpVk2U48o7fNQfdAW6w4zEmteOzGjnzGWHZ7Gf
+      /kqc7KNhro8+3RSbCc+cX47OLOfNKcdmkw9/J6aeAUJOegris9LVwpjtaghRnGcxqTlhs645IX/lM1CW
+      Ta3TFKciOr+4jLabbSSe4qaWIskxycRYUbY/yLZHRl0jaJJw/BzUPqNvcMWdxhdvu482+TGty5I21R63
+      TI0WXb5NvOjSF7Guoqd9fEoNfkTT44n4uN2zo0jWb5ZdnCJplnkJiTFYRqKJgMzf8SMRZO48vwiK0Rgm
+      RHkfHOU9FuW3C/5db1nErJ7f4BLQlkyMFVwC+oTj5xBSArqa8XjvL395i3idxhfvDUokwOOJyM2bHes3
+      B5ZIjmUkmgjIjP4S6XQEv0QyDBOivA+OApVI26dY/u/iXXQo89fz9+8+kKM4BiBKIs8kTdL3YcUTaJka
+      LaiAGjUCZ1Ec85x/rQYN2H+G37ifo3eubx3S3D2G+OqK5asr2JcS1uQ1MdhHLgDR1lj7Q7ljnZ/EAJ9s
+      AHDuR4shPsb9aDHYx7kfLQb7OPcDbie1P3DuR4u5vq4up/o6DPHR70eHwT7G/egw2Me4H0jboP2BcT86
+      zPQxPpEDv41ThT3xnnaI6yGmfYcAHtqaUx0Cet4zRO9hEyeZThxi5CRYx4FG5im6Z6i2mFWVMkV2YkxT
+      s614Mzq2eSVtYQywHjPtTbyFut527I13xjrrMdPPWENxb7n5F9crUdP7FIumAHqKq+QlrkgpYbOm+bTx
+      dxs6ivPHssrqJ1JRizngSMwX9f4dyvUDWK/nXdqyJ6Tl1OThNv+Bxn9w+KZdTpQ0jGlqt/IOud+wAYrC
+      vNe+3caHn1n32WZNc7W9iH55Ry28B8q1MVSA5xeaw8p71Hzj5hk1enPxC9EhCddCG0uCRo3a8SuiRRKO
+      5QNtBKUlIEtEv6qOMm2qc696+s1U7H1Myjg2C5u7Z1a99q0Sjt4QwDHa305HiuNBLXGTsqIhKixus4UK
+      4/si2KBF+Ws9v72eXzcbuD+sZr8TdyeEca+f8MoXgr1uytw7kB7snxf3K9LKtD0AOCLCUgwGNLh+n9/O
+      l7ObSO2auiLdJJfErNNvjc1hRsINcUDYSfluxeYQI+GbeJtDjNzb47k77bT1Um2VckvoMHgUvjjPcX4M
+      iNHgiJ+XydA8xs1inhzWTH5kORsSsYo+8Qvu/TMVvjj8+yc892/18Gm9nPOyt87iZnrmGEjcysgiGjp4
+      v/xxPXmlWnWsSaol8eIioQg6xPHUVbytiaKG0UxfZ1eTDfJYk+SsoGVzkJGwepYBIS7CdDCbA4yUbG9A
+      gIsytdGAABche+sMYCKtGWVSlo00VXAgLMuCmkoLN4WI0wJ1xjLRJgNqiOWhzGvuAc2xXK3UJ6Lx9Cev
+      JyxLWlAtDWFZHtMirYhjIQ5oOflDXghu+bkDLSBsu8v89b18WJ/T6WunOiDo3B9zhlBSg22xWj3IQ6Pr
+      xWod3d8tbtekcg3Bvf7pzzAIe92Esg+mB/vX68lDL/JQg6MVdz1gOiiF3el407Cu4kLsympP0fSQ6aIV
+      dgOhWz5Mxz8YHDU9P7jp+YGYnh+c9PzASc8PcHp+IKfnBzc95+svd9eUT08GwrEcC7qnYQZT0124urtd
+      rZcz+TCtou1TOn3BdZj22CmlFAh73NMzCoB6vITSCWI1s/zlMy0JesK2NOuS0TaxdUDQSdrM2uZsY15O
+      X8Z7ICBLtMlKuklRto1yO0+A5pivV1ez+3m0uv9DNupIN9NFUS8hL9sg6qRcuEPC1kW0+fiLapQShlgx
+      3heh/bKSH6HlsQjcm7jw3MNF81TI1iWhWYrxWAReJlmgeWTBzSILXw4RgekgRtOB8hGsS2JW2gedEKuZ
+      79aLq7k8lJbXDAqyEXKAxkAmyp3XocF19+m/o+1GXBDmq2iI5aENSmmI5dnTHHubJy2xPhCmJaFdSWJf
+      hfyPRGXVLFGzGQTFZaGod/Maou5o0968Q6DshGpApou2aeVAWJaCmjlbwrTIP1xsNxuKpkNcT15QNXnh
+      WggzuTTE9Qjy2QjrbKSWmsQd4nrqnzXVIxHTI8h3XAB3XGqpmg5xPcR71SGa535+qw5S3/3GeT5MbxLR
+      tiwmdwZHNG68zTHL1Ypo7Rq4ghrHwl1/U3yLlOrtMMRHKHdNDPZVpNrbJQGrTOvskWxsKMB2OMrCuNme
+      hawcUNfLuWr4eh/3dbYnu1oKs8k8/C+eUZGoNcl2O6ZWoa73KRZP7y+oypZybVn8/mIbH6J7qrAHAad6
+      YdIsfViSrQPqetueuCoBZAGwL5NjTi9AIIcbaS/LsnJLdbcUZiO95QNQwJvuE/oj2lKurSiZxUgPuk7Z
+      iOUkZIe5PlFX21iklOa4Q4JWRjq2FGjLt3HN0CkM8U1/E25hoK/gJ2LhS8WCl4wFlo4FYXFtC3N9dZmX
+      L9PXKbIwzbf+Ml9SJ58ZEOQi1Y0GBdkIBY3GQCZCf96ANNchLeAm4mQxasCjtB/bsEN0OO5v5+qy/R3u
+      +p9lVMJYvIWhvqg47plOhQ7e+/nXaLa6PVdl9OSejAEhLsrAvAMCzheZQ1KysKEwG+sUe9K0/vXh3W/R
+      4vbzHTkhTdJnpZ6vS2N2VnIAuOnfvNapYJ25SZpW+Z/RVj5zm3j6+0ibs43fZYtsV9JsLWOZykhtMDu9
+      VjIg06XG+dUs/6vFvSyHm4SmWAHc9B8q2RClrJxoQKaLmufdnN7c6+svtLVYHRByrmb37QdZf0x/0wDT
+      sD26f/hEWNYUQGEvNylOJGCdXwUkhQ6Dbm5C9CRgVTvo/Uo2NhRiu2TZLjGbPHzxZ/OZCfUBxRxQJF7C
+      4qnKzwXePLAMetaWI8+a+r2ZlceVn2DYzU3lpe85VnUk2aggxBXNHv5i+RSIOa+WNzynBDHncv5PnlOC
+      gJPYfoBbDqe/8usZHcbcQc+AY8CjcPOrieP+kCTy1EHq96B6yBagMUISyFcnqd959VJPeqyXbOulzxpY
+      TyEeLCI/4f2pHpZrRvPMMvjZXU54doPqMVuAxwi5C8ux8oFVr51Aj5NVv+mwz82p53TY5+bUdzpsusmD
+      HcA4R9sp51R1JglauQ8KgCN+Rva1WcTMThC4Vmt/5FZpLg3b2cmB1GTtj+RqTMMw3yXPd4n6QhLWEkyI
+      QdkU2CtBY/GrYlQCxmJmGE9uCbkR3nuwDCtPlmPlCbfKdWnEzk7tpbe0olazA4XZqBWsSaJWYtVqkqiV
+      WKmapM8a3c7/h29WNGQndlKRUfP+zwF1N95P1X4Pe+ZGeqrGQeynw9dXNY4ISihfvR7SXYUNeJSgZPLW
+      86wuq4X6vJd876XXG5rwE+p/4DBeGwAReWOGtgUm9cu1QwMy2EjuCr1Ro/doGV5eLaeUV2FtBX//3Dgm
+      6G4sR0tFXtsB7qObv/HaEHgv3fqd1ZbA++nW76w2xUhP3fid17awDVoU+XifX0T3n+Zqtslks0E5NtoH
+      LAbkuChTnTTE8ag31t9lmRkXSbRNq+mTcTDeidAs7UC0Noxj6vahIyx26ICm84O8VX9cf76IKEv3OKDH
+      Ga2+zM7Z4oa27YdNemFsZ0/TOzjo5+zYjuCm/9docyySPFUlBimrGSDiVPkv22Vb+bzw3LrAjkF94H4F
+      nrdfm8eFfuknCrKp0oxnPJGYlZ+ckAGKEhZhzK72Tg6LYBvsKJRvXQfCtqiZPWpHcMrneS6JWkm7GEIs
+      Zu6e8jThyXsc9z+neXng+zsc86t7wZW3rN88K5J52CW4HjOi1QEhl1EQ749Aqw5c2m8nzJNGcNvf1XQ0
+      awfZri7D0lwdZLtOq2n1DwFn9fMJKjtuu87WG0T1iJyYqn2oviUmRjhhoE/wfML03d0srr7RHx0TA32E
+      B0WHQBflsTAo2/bPh9kN82oNFPVSr1oDUSf56nXStrLXP0Jwr5+aGugqSMDP5FTBV0Lqfv86u79XJP20
+      NRKzctJaR1Ev92R950pPW43UrMu7v2Syz5frtnpq1kdfLe5uaYnhtUyJRkgij2NKJErC+SR2rC6V6cmm
+      gYiTmjg9hvjISTBwg3E5u72O5KFpPLlW1hDLQxi/Oh1vGZoPQ0iOhoAs0UtWP6kQmVrzTG0DROj0jGis
+      eMRFB3TGMqWPtBSUx9uGIt7kabQrq+/RsRDxLo02x90upSzvNiqyYu4yeSBlYXSTsmxtd7hIon1aP5W0
+      9LBYy9x8TK7Ckpw9ZdkO5fTtz3rAdoj0mJSMbK+DllOkKS3RFOA4+PdAeO+BqOP6SLvWFtE8V5PXepWH
+      GlxzcoQeiIZoHv01E2WVJwc0nad3SlSlzhnG/43O3138opZNUGvRR/HzzwuCF6ANe3S/WkX3s+XsK619
+      C6Cod3qd6YCok1BvuqRpVZ8HH75vxbnslMq//qR4bdY0b7Lp70dOx1uGPCvUfkHR9K+TLcz0NUu8ynLw
+      QDqvgYJslCdRh0wXceRFQ2zPLj7mNbXMc0jTShzL0RDTs8vjR1LSN4DlID6m7rOpr/pOWJgfQD1eaiZz
+      YNtdv4u2VR3RZhEBKOBNyLoEsuwP53SRhEDXD47rB+RKyaIUsOzibV1W9ITvOMCY/dgfyDoFAS5iIXRi
+      AFNB9hSAhX5h0FX9IFt+OBb5lNJ6TSYG+mQdGskahlp0mKxpzkRUHuIfR1Jm7SHTFbAbLIIjfvLmFTBt
+      2olNG6c9oxKYXvsNlGnrNixsWjrN9Ijobja/j/aPO1L55NGMxVNtt/BwJ8tYtOZdWmCs1jEp0sUbRLrA
+      IxVlkXIjKBY2t024N8gNoGg8Jv8euZaJ0S7eJJpzp5j7GIMw6GaVUPjuOs2vlM35esBxNKfNaPVbKOxl
+      tNctFPY2bdOq3BMHe1ADHqUuw2LUpS9CTd1XBYQtd5tfOLfUIEEr54YaJGgNuJ2QAI3BupkubvoFv0ck
+      fD0iwWztC7S1LxgtdAG20AWvPSuw9ixlRtbpeNcQHYQg14EGCDir+IWsk4xt+julWf626vzjgbLf0UCY
+      Ftp+DAMBWQKahaAAjMG5oxYKeol3daAGG2WOsDkjWP2LtrHXQFgWytZePWA5yJt7mZRlo23vpSGG5+Li
+      F4JCHm3T5PTtGcdETOMT4njIKTNApuvDR4rkw0ebpqfNiXFM1LTpEMfDyYMGhxs/5eX2u+B6W9qx0+9l
+      Dxmu95eUfC6PtmnyvewZx0S8lyfE8ZDTZoAM14fzC4JEHm3TEe1J6QjIQk5lgwONxNTWMdBHTnUTdJyc
+      K4avlnGl4FVyygiDc4ysNHPSa3H/Zbb6EhFqrJ7QLPezP+YX5N21LQz0EQYyTcqx9e+G9uKRqNRRx6tW
+      Sk1Vc42s1UjNSpqCZc++av9NXYzapAbbevmwWkfruz/mt9HVzWJ+u24G9Qi9MNzgjbJJH7MiyoQ4xsU2
+      DQhmiibErNIk3R8ou2pOUHnjyr9n4uktLtYyTYn6JpfruPyRCSUEgnv9hBIDpr12NQogqirwGdAscDS1
+      y/V8GfK0mQZvFO4d0XCvX2XIkAAN743AvOcD7bWrjJ3uAwK0ggkxKF17r8QbS+W+fVrHaigrMHvZqtG4
+      Ac+Oa4GjSbb9D26+NgRwjHbH2n40+5QEnGiICo6b/jykVbZPizp6PudEMwTjMWQjZb8JjdNIpsR6Lg/V
+      Ljxao4HjcbMEnhP0KUccs87DEZiFm1GqPazmy3bbVlISWBjom94/MiDQRbhUk9Js68+XaprI5PUaesBy
+      HI5EhwIGx18XHz6cT16XpT3aplWeOMRZRbOcKMfWvQ1q3jV1xQ3RDBi0KB/e/fbne/VVjfrEv339T9mS
+      EuPBCGr1lJAIBg9GIHzDYlKYLYrzLBY8Z8ui5jyb/rk9gKJebuqOpmz7ayS+h8glDvqJX+G4JGhNLjKG
+      UVKgjVIKWxjokwUYQycpzEZZGs0lQWt2wTFKCrRx8yaeL9tMxbvungXNpOkuNocbo92BK5Uo6H1u5iwW
+      DG1HOtZuvztZY4h0SxlpwHgngiwQzhmZ64RBPvWpUZHElfripU4LNSwm6HrIAkaTaXdMGf6Gw43Rpixz
+      rraBR9wR+Ql0eE8E+jNjsB7zcfsUV2x3Qzv2pgBgFOs95xiHTMMqQGzc8auyml6rdRRo4z3hGglba8o3
+      qw4IOtnPhwl73PQbZrCOuZ1QyWjpDaDj7FKdk211FPDW0bb+SVY2FGjj1PY95xqbjMG67IE0rdHs5ve7
+      JeVDRZOCbJSNak0KtCVHji05wjZq4mkY6KOs1mNhoI9zI7D7QBiXMCnQJnhXKrArbQZhE55RgrZzvV4u
+      Pj2s59FqvianogWj7m15LLjqhsXNpBVPQXjEHW1eo9vFdVCIzjEh0t2n/w6OJB0TItU/6+BI0oFGIpc/
+      Oola6eWQgaLe9mtIwqA+xvsjlJt/yZo0JEZr8EehbP+K8WgEdhnhKR/IJa5OolZZ4J2H3NOe90cIuqea
+      wYrSrFw0e/iLnuUNErMSb6PGYUbqTdRBzEnuCVmo7V3cfmak54mCbE3PI3ss4vpYMbQGDvmp96llIBP5
+      /nQQ5GraEmWS7bI0oUt12rYvb+grjbokZqWm5sBhRnKqaiDg/Dpff7m75l29xuJmzvkOKOCNk+RdVKXP
+      5XdqVrBg2H2uRjao430ODLvVrxyt4gBj+/GmOGZ1uiFrdRhyE/uGHQOYkjRP1UeLjEsfUMib7XZ0o4RA
+      F2VJaQuDfEd66rmtUPVX1oOJPJFNW0u2otUC4GSnDnvcIq2yOGfbWxzz80bLIR6LkMeipk19xngsQiFP
+      IiTCwGMRmK0DB4f90XL+590f82uO/MQiZk4R0XG4kdOddnG/n9qJdnG/f1tldbblPVa2wxOJPmri0B47
+      8V2AzSLmZvZmxRK3KOINKwhGy4FmIRN6X9GhEXtYITNaxgxlBPV9NmxAohC/M4BYwMxokoOt8X1cb5/I
+      qoYCbJxmMtw+ZnRhTxRmI84EMEDA2YxBBDxgFo9FCHgILB6OwFzIz6NA4rQFFWnlW4xHIvBLIzFSGomA
+      51h4n2PKwggGhLiorxQNEHKWjFa2ggAXbYkDCwN8tMUOLMzy9euck99OGiRmDXgrgjgmRKI26BAHGona
+      PzRI1EruK2Ir71s/NltTcZqgsMIbh1wIubjXzxg8hwRoDO4j4HsCqG0DZOcB6zcRflfFlLsqwu6qGLur
+      IvSuCuyu8saFsTFh1ugtMnJ7c3f3x8O9KmXIs75tFjXLvz2mFb01CRrQKF3bhDFshDjQSOJIzyQODdu3
+      dcU6d8XBRsruATaHGKn5WONg41MsZLMvqzjWEwubKZt02hxspD53Awb7xNOxTsqXgiM9sZa5mYk8v10v
+      F3NyS8piMfO3gMYUJpkSi9qcwiRTYlGnmWASPBa18WaiuJf8hFosbmY1rADeH4FRCYMGPErGtvueCWrZ
+      YKK4V6Ts0xVp7fUG3U0xejdF8N0U3ru5uF3Pl7ezG9YN1WDI3bwuLerqlW7uUa+XXXjahtEorGLTNoxG
+      YRWYtgGKQn2FfIIg1+lNMO/G6jRop7/+1TjQyKkjkNqhTWf6yxkbhty8OgerbdpJicTXMQaJWLk3vkcx
+      b7PMP/uJtg2jUVhPtG3AotTMt52QYCwG+0Jq9J1nc4jqF9DFisJsUZknPKMiISun0oLrKlbLA2lzlEWa
+      ZwXjYe5AyEnv/A8Y6iNs5+OSPiv1LZUNQ25WG85tvcncPr9qv69WX+TVskyiDdpAAjhGU5KqP3D8PYy6
+      6XO9LRY2Z8lP7hgNaICjVGldZelzGhgK0IzEo78rBg1wlPYtD6OBAPBWhHu1Ez25jdBTkI1a5p0g29Vu
+      Mnt7d80pphzatj984l35wMFG4kIKGob63rVL5DO1HQ3bM9bJZsi5ku98j8E+wUtLgaWlCEpLgafl8v5u
+      Naeu+KJziJGxEonNImby15I66HHS5zA4tM8uwvTC729eNSRcfUv77UHn3ws8Meh1hEN77AGJ402ZujoK
+      /lk3NGKnFyE9ZxnVik+894UGiVmJJbHGYUZqaayDgLP5+CGu64os7UmfldOvhQRjMaj9WkgwFoM64AYJ
+      4BjcCfIuPuonT/yEFUCc9sMUxpZjuAGI0g0JsnKsxkJm+mDigEE+Yg3fMYCpT3rWzTNowM4q+JAyL+A7
+      BheH/edRuo+znOPuUNjLy1In0OPkFoEWPxKBUwBavC8CvQHi4ojfyJ+CFcNUjMUJjIH5D8cNp9AbUMTL
+      n7MPGrAo7XgIvaEPCZAYnPnEFguYGU0ssHXFaVjBbSr6uEZPYTbq4KsOos7dgencQbWUCH+WxZRnWfCf
+      NeF71kToUyDGnwIR8BQI71NAnlV/ghAXeVa9DgLOuqQPbmscYGTMhR8wx9d838j/jhwS4DHIX0xaLGJm
+      frHt4pif3KLtOcTIaHsOIOIM+eIYcfgiqUUJtrFa9O6a+sWSx+OL2M6XvT3uN2nFj6db8GjszAR/32v9
+      ymsaQ4rxOPQGMqQYj8Oamu/xjETkNMwBw0gU6jfAAI9EyHgnn2FnTG/F9RxiVPXuGzzkrsYTL/gRtyVW
+      rNXid3rZe4IAF/m9wwmCXXuOaw+4iLmrRQAPNVd1jG1a3y3nzU50nDdADo3a6XfWQFFvU2+QFyEB+JEI
+      T3FWBIVQgpEYx6pS+8JsiR+A4Jpp8RjLHnhN/qj0l6KQYDRGkwLE7gJqGYlW5tn2Nar5OdzW+OOJuqyC
+      IjUCfwxZ/apXXcRVsTCJL9Z56LN1Pv5snQfn8fMJeTv0QsavY3i2gwo8Q+ONl1ZVGZBqLT8eQXbzDvVT
+      aJzW4o/2k/61A2gYiyIr2naebVioXjMS7yCLjqzuipCgkIYJjUr+qM5EUS+5TaOTqPVwrA6lUGvVP8nm
+      J/fELQsarZm8IytfwYzT8/4IIfWoGK9Hm8+x+aXMCff7A8pLMVpeakuiBMToDCNR+KVXz3sjhJTDYrQc
+      FsElo5hQMqpjdnn8GPBctLw3QveUBsToDN4odbYPCaFwv588SwngvRHaIedouwmI0jvQSF37T+0utP3O
+      jGQ40Eh/p1XJDKBQ0KtGtpll4AnFvaxOXkei1rwsv7O68AMMupm9d7Tnrq0GzykOdBz3c2vIkV5m2+WQ
+      95Z55h3scfPaDj2LmblfKkACNIa6Nmbm1nHc38zHCghw4kciNN29JChIqxiJMwy/BsUaNHg89vieRqP2
+      dlEm7l3paK+d3YU3BWiMtvgLebINxWgc9lOuG9AojDfRNjzi5rUdHkfbDXkZq7qozc2cJDIFYAxePxPr
+      YzbdKVmDZipgnAcNnqEuLPI5u54bYMwdUpqLsdJcBJbmYrQ0F+GluZhSmou3Kc3F1NJcBJXmYqQ015cS
+      PcT1k2DGMByeSLy+s7/fHNLX9PczRVBdJ0bqOhFa14nxuk6E13ViSl0ngus6MaGuC+vzj/X3Q/ri/n64
+      CKmjhb+ODu3fj/ftGWvI6qDlXC8fVuRd7AcKtHHKR4MEreQ5BQOG+ugTOy0WMzO+MbRY1Eyf4WOxqJle
+      alssaqY/xxYLmqlf/fUUZmONWTu0Zf9zxtj95QQBLuJLlD+hFbbUH6nt8I6xTfPl4vO36H62nH1td2Vi
+      vAjDJKOx6nhDXF8TcYxEOo+eSmIGhhW+OKrwqxgPISbxxaJnSJv22clFtUOP2ekFN6wYjXNI0+oNYp00
+      I/EYhTusGItDb/rDirE4gbkZq1mMgzivliGBLwZjcB/gfRHIxbEF+9xqtIEvV/SYnfERJuIYjRRWEveK
+      0TjZITBKdpgQI4rFNjiOkozGCivFesVonKbqzlIRGOukGYkXWpKJKSWZCC/JxJSSTB2k8uYbxOo1Y/E4
+      HXhMMhaL/OoeNIxGIXc2YIUvTtNoZHV0cY0Vj/3tmeebs+anKm0+SWQsDOzikL9JPLZep107+fsj+Au5
+      ZscEejN1wEAfuZodMMvXzK7i7wvr4qCfMZKkg45ThYu/E4c9Bgz0bWOGbRuDLnobReNAI7ktMmCgj9jm
+      OEGIi9y20EHYSX+X43mDE7ZCzNjqMN3vjOrNIEErvYrRONtIXF7bXVlb/qWfVk6uYm0YcLOcgIv5PTL6
+      HTJjhR5wdR7qd8zu98tNCUEfVBkwyyf/K9F2xInlvxg766AWJBpngpLF2mZqigBp0YyfxMf6qZR99FfO
+      6znQ4I8iixPq+D1o8Edh3FPQAEVhfvHu/9K9HTcr69mu5tyDE4lYP6U76tdVJgp52/U9ok1Wi5pxygYO
+      +dmf5o59dR+wdpZ33az2x25dEm4+N3koQr0R6hTi/JFuH1jIfKQuJdNTro0zcIWuHNb8UG7Fga5TlGuL
+      tIVpqU6dBczN9KCs2JVkb08C1tO8k+aYuEpjst0xjEWhblwGCSbEiNLiOTiOkozFIu8YBxqmRAm/pJPF
+      E+3UPg+5TZoDiMT5egb/mjDoG8KRLwc566fA66YErJfiXSclYH0U77oooeuhjK+Dwl//xLfuCXe9E3yd
+      k37pwCRNmtrzKOLHlCO3FFicZuk0+oAywAMRuDuaP3p3M1e/8pPGlyLcpqun5cpvuPrarc3MzTwtyM6O
+      g4z0NfLQtSgfQ9akefSvRRO2xuXY+pZBa1uOrGvJXdMSX89SLWPDzrR7T67d87PtHs+3ezXoE8XJv2jO
+      HrN8zrgFeawMNIxGIW9eBSvgOCrfcK/jxHrM3HPv4RE3eRsuSGDHoFXYzkwNWT5lCf1tzoCBPvLbnAGz
+      fM1HMafvMegNfBdH/QFu1Ms/ZfhsqRNd3LktqrMsU5q+rK4OWs5DXIk02lXlPtocdztiaevQtr1dX6h5
+      CUATayDszNPnND+NgyUpx24pfHHU74w2NuKAIzW/a6tAcSLZjtFI9EmriGMs0o9jnGe7TFb3YdEGDxxR
+      rWVFH3+3YY+7OYvmjrIjDIqxOKxJRahlLNpR1uJvFNJQeeK2jwb7ybIddiRyUQmWkZyVx5FVx7mbPeL7
+      PLLWMEfWL+9G/RkvGA3SsnYzZ5op2iSpDlrOdl4ep4dgkIiV0UMwUdfLGq/D17gRAaMQwjsKIbjjBQIf
+      LxDs8QLhGS9groCPrn4ftOLsyEqzQavqj6yoz11NH19Jn7yKPrCCPmv1fGTl/GFkIzkSu5AminrpNYXF
+      2mbtdpG7vTbsc5M7vg49Zid3fUGDE+VwKCu1xlI/2kqM4fBWBNaYDDIic/oztRGgcbax3c9BbcVAMw6c
+      bWwmkNIrWY2zjIx5kuAMScY3x+CXxqfvg6nLY2kcbuzW8xS1fJgfuXpDYsaKa94egzqHGxlvxADc7ye+
+      GQNwv5+4ryCAO37mLnkm6VibDo5qk/FSxcYhP+eU4T3YtB94mcS7/5r1OysxvDmEv/OaA5vu5/ecefUD
+      5dh4szwN0HEy3pwPFGZjZAMH9rmJmcCBfW7OW3TYgEYhZzSbHczxRRb9Pr+dL2c30e3s63yq1eZM4+Je
+      wsv5akXR9RDiim6vWDrJmcbsQFhUowc0xyaL6lS2SDZxEh2LFzXPtk73srEXV5PbEF6JP9ZLVRaPshHz
+      mAlCB3jcBETd5uVG9hSj6vwdOY7Ges3nAeZzr/kiwHzhNb8PML/3mn8JMP/iNX8IMH/wmS/54kuf9ze+
+      9zefN/7JF8c/febNgW/eHLzmgHPeeM95G2Dees1JxjcnmdcccM6J95xFwDkL3zn/3O/5RaiC/e7zEPf5
+      iDvoxM/Hzjzs1MfO/SLIfjFifx9kfz9i/yXI/suI/UOQ/YPfHpTsI6kelOgjaR6U5CMpHpTgI+n9McT9
+      0e/+NcT9q999GeK+9Lt/C3FDLYimsy6bze1KTklWpdv6NAeXHMsnA2I3q2GERXQVQJy6ivfqzXWRkv0D
+      Cni7HkeV1seqIKsNGreLOp4+8ArCPnd54KtLvXWXivOLy8ftXmTPkfxH9H3yTAYA9XqjtNhGP88D9J0B
+      iZKkW5Zbcogx3W6akJu8nD4hCzdgUeTve/EY/fyFF6LHx/yXYf5LxP892bHEkjOMFx8+cvOhjXq99HyI
+      GJAotHxocIiRmw8RAxaFkw8hfMx/Gea/RPy0fGhwhjHa1lVTPxFmSliY6Xt6ibabrbqA6vVQU5Qm6Vrr
+      6v3F6df23gqqHlA4cWTOZJx5Rzm2Li8yjBrpWnlGxNau99UmCjEbuDRoPyU5z67Rpr0o+bnNZiFzYI5D
+      JUAsRq7TOcDITRM8PQLyCcQjEZh5BeKNCF0B+NSsL/aRtGUkTOP2IPmYWzb0X5+nv+XCeChC91P0VFYF
+      4f0GwhsRiiySBzGyuQlCTnpGN0HNKYrzKCmjOJm8tpiGWB5VhVPmmhsQ4CLlKR0CXFVK2rTZ5gCjiJ/p
+      OgXZrp/RdvqHxRrierKLLdUjEcvzmMqcHOfZ32nSTNiqy6jek7SgwYmitlops20qi7A83dbTd9fEeCDC
+      LkvzJDrUdHdPWtasTvfRttxv5F/omd2hLXuV7pqX5urhb0Zsmp49ZWfFEQ0WT1UjZZHyonSw5RaBd1iM
+      3uFjvWXmUIMcrJs0PUb7MpGFiJoJnEbPcUVZ9gzjtQhZ2Y3CCdksou4rC9OmfZdE4qk85s0I1vQ5AgBq
+      etV6gDInqWmmKtm6E1B/ipOEdAV+kxlV/UhPo4FybWoGvfxvqq7DNF8RxWqBouNGPtCFqEn5BGBNc5JE
+      L2U1fYUjnTFM2/LwSlYNkOFKZIOHc60GZxjTnwd53wmqFjAcu6wW8oEjX6TBmUb1Bee+LOrHcp8SHiGH
+      9FkjsY/znO9ueSPCY1w/pdUHgrMjDItMkiouHlNygpqg6RRq7bSmSCdbLdT2Vmke19lzmr+qLw9I+RKg
+      Dfu/4m25yQjCFjAc+XbPemYMzjSmQkT1U1zomWFJUYMCJAb1dlmkYd1ned5MbJHNH1LjHmI95lq2Pik7
+      AKICK0aRyUcuesmS6UvN25xpLJN2P2lG/nBY0Ey9ewbnGGXhG21i2ay5YJ8ypADjqKxJLiJd2HF3LbN3
+      7ePOD4N6sIjsJHN4NAK1/HNY1CzSbZXWQQF0hRMnF0/ZTm2ezUwjh0ciBAbw+PfHPKRyxxROHG5702FB
+      M6e86DnHeDz/yD5Xg7XM8lEr3pF8DWFaZGKzSkidc4yqax//QtS1EOy65LguARfjLuicY1RpSpQpBPQw
+      Gq426njJD+CJcUycHOLmjlLmmaL5FFo1O8vNc1YehWx1yht2KIVscRAijLrMyEUzzsHqzzisYT6UL7S7
+      1gKGo1L9fl5/w0Zdb1fnNMdQxTprmtPkuE1l0mxJzoHCbKoDdchjrrbHLb/I/makrYaZvq6mJQt1DjCe
+      0rv5B9lr0JCdd7rA2YptXNe0XH9CTE8zpEk+Lx2zfDW7h+Kwjpl+muA5/qguf8psWqtdECmFswnaTnqt
+      O0Cw65LjugRc9FrX4BwjtVbrGcdEvqMnxjb9ZN/Sn+g9ZbRE4VaoUXeRUw+gDfuR23k/4j33I7eBf8Rb
+      9y/kYdYXZ5y1VN/wC6HW8juozaryXfNSabIT4YcI24ssmq1uz6NPi3W0WivBVDmAAt7F7Xr++3xJlnYc
+      YLz79N/zqzVZ2GKab7NpuhRqJLKYPG/RpFzbcSsuok1K1XUY4Kt371nCjgONlwzbpWlSL2vVXyPCOsk2
+      pxubnd3I90KnXBv5XhgY4CPfC5MDjZcMm34vnmL5v4tmeb3X8/fvPkTlgXBHQNpnF+n0+gamNbuaFFM2
+      M2S2ueq/pYWaODS5xMT4IUKiHv6rK/WJ+PV8dbVc3K8Xd7dT/TBt2XllZ+IrO4cfv95ztScSst7d3cxn
+      t3RnywHG+e3D1/lytp5fk6UDCni75QcW/zu/Xi+mr1yA8XgEZiobNGBfzD4wzT0JWWk1aoLWqP0vtw83
+      N2SdggAXrXZOsNp5+OFqPWc/XToMuO/l39ezTzf0nNWTPivzpC0eiLCa//Nhfns1j2a338h6HQbda6Z2
+      jRjXH8+ZKdGTkJVTICClwPrbPcMlIcD1cLv4c75cscsUi4cirK9YF99xoPHzJfd0exTw/rlYLfjPgUFb
+      9of1Fwmuv8lC7fNdV0mTAkACLMYf82+La569QS3vsS7v202V/pg+89wlTeun2WpxFV3d3crkmsnyg5Qa
+      Dmy6r+bL9eLz4krW0vd3N4urxZxkB3DLv7yJrherdXR/Rz1zCzW9118OcRXvBUV4YmBTRJjCZnOWcbGU
+      9d3d8hv94bBQ27u6v5l9W8//WtOcPeb4usQl6joKs5GWogJQy7ua8R4pA/Q4yTfehn3u6ctmQ6xrPm7y
+      bMtIiBPnGIm7IJoUZmMkqUaiVnJiDqDrXC1+p9ok4ngYxdAJMl3zK8ZZ9ZDtulcR0pqwG4LNOUbWQ6hz
+      uJGaX2zWY6blGQu1vYyHpYcQF/3S0Sdl+Il60dhzMr9e3M+W62/UAl3nLONf6/nt9fxatZ6ih9Xsd5rX
+      oU07Zy3EBF0L0f5lxVVabZfFavUgCWb969Km/Xa+Xl3N7ufR6v6P2RXFbJK4dcGVLizn3XohG5DzzyTf
+      CTJdd+sv8yX1tveQ6br/42o1feWpgYAs1Md7oEAb7cHuIdf1K9XzK+DgXNyv8LVd8isDAPf76Yl46akV
+      mt/VwM6fTamk+pxkvYmP+lkp5CrG4zBSyjFAUVjnj5wx5xyds1J912/kW9dTkO2fD7MbnvFEWtbl3V/f
+      mg53m7JNXbgivvJAJVCs9mzo+pazjOSGE9Rq4jWZsPYSq7GEtJR4rWOsbRxQGPrKQXYR6Cn9OB1SpDe6
+      5Pb0l3hPfxnS01/6e/rLgJ7+0tvTXzJ7+ku0p6//wkkGnfWY6YmgoY43ul+tItmRmH1dEbUaCVjJZdES
+      GfFYskc8lp4RjyV3xGOJj3g8rGRLt2k6U4QDZdrUqvQUjzreNUSzm9/vllRPS2G2FU+3gnzr9XLx6WE9
+      pytPJGR9+Ivue/gLMDW1OEd3AiGnbBXQfRKCXMsbump5A5vI7WoDRJzEZ1bnECPtedUwwMdq4Jmkz7ri
+      a6Gnhdr37iHEFc1v18tvLGOLAl56wa9hgI+wt5bOwCZeDj+BiJOTwzsOMTJyeIuBvj/v/qBNLNI5wEgc
+      Pj8xgOnPGb30kgxg4twDOP0ZaW+ku4ijZq2WfTr9YwYDMl3N5tnRgf6mAWAHc7qNfv/cfXBM2OnFwmBf
+      ssk5PonBvl2ap/tue/LXevqWxj6HL9L+mPNDSNjnFj8qvlvCPnddhqbPyQBHeazK4yGSf86m71WJ8b4I
+      lBUWYNpnb5ZnOlbT10DzKOA46gyiQ5Wqzxo5QXQejsDMoWjeVFN/1eoGTGnD+sz19omvljDuDkhmDff4
+      m55z2CXoDieSfBhqtdvmtkxS9cVdHldq3RjqQ4xpnHgi2x/yZjva6Ge0LcsqyYq4pt55xIJFCyzBEYs/
+      GrM0BB1YpIASETD4ozwyyy1Y4o/FKIEd3h9BvMXViLGradbwYF5Jy6JmEcWqpFZ3rn5lRjAcnkhlEZJW
+      mgCLcSizom5WT+OFGHh/BH6+Gnh/BJUl5FMbdmNAlTeuiNIfxzgPCNcZjCjxTv1XtzpXXJBjgDwUof06
+      m25uOcgoE+4Ulq7VYNNN7VbpjGHaZI/FsSnfm4Ke4LNIxNrWwCxtixregMraW0Orps+xTqOX29lnilPD
+      DF9badK6kz0DmKj5XaMAG6v54W1ztD8W6SNZKBnIJMtptdhttI/Fd7pTpwE7+SHXMch33NBlxw1gUs2s
+      Jv+TfT2JWFl3G2z1qZaT/iDJgoWsRx2jkcjlCS4xYzXtqCJ9oahPjGF6isWTSrmmnREd3l/+Ev3cq3V5
+      4w/nF5EQL8coqeJd/e5XQqjpUvBcun6QzfHPwy80zoE5CID2/ftKXJ5GW00SrC484iZ3eDGFEefwPX2l
+      1t89Y5qaFlpTLB8LlVZVKkRKqXcQAxClWWGL+vzZqNdLHXsB+bEItPsJC/wx6LkdU4zEacZTgsI0hilR
+      whMOHf059TKItbKOgb769AAOpb9g+CENEI9Ry5qg6WzvPyNVDNBwqlXRyqZ51LSOyI8yyBsRujtNa/gO
+      EORqGrHUZfwRHPKzGsMOi5rpi/ahAihGVjy/C4phCcAYgrR/hQNCTnOlVLra5KEItM7IAEGudo0+uq7l
+      ICP5sTY40EjqhAwQ5GIUZRaJWENuObKKJXKAytj8UgNVmXHbcTER77qhK0ogmzXN7XhY+EPu83givklS
+      TjPqZ9G+vfn74sPHKH7+edGvlUjooaAKJA51JVwQRtykIsjkEKNsf4SdsS7wxFBrBQbFOAmQGG3Dh9RM
+      gOgxO7l/6JF4YyWlbNuGxGkFSIxTHv7ACtDTI/Zfg+zY8xWUk4BclFx8+HD+G2MA3AZdJ71TboODUy0k
+      9tgMlshSaKrPgCBXszQZ3dZgkE/tP0nXKQqyCSHS93Rdg1k+eb41OeVOEOSip9yAQT5yyvUUZKOn3ICZ
+      vmbUjJhwJwYwkZNtoAAbNdF6CHCRk2ygBlt2EQes6QfTlp23ph2AAl7i6m02BxhpK65ZGOCjrUhjYbpv
+      y10dEUABLzklt2hKJkE5KhnJUQk/HRJfOiTMVSJdErLSVom0OcDIeaIS3xOVBK0SifF4BGYqI6tE9r+T
+      V4l0SchKfToS39NBXSXSgAAXtcxKsDIr4a8SCcKAm7xKpEv6rMyTRleJ7I/grBIJwqB7zdSuESN5lUiX
+      hKycAgEpBSirRBoQ4GKuEonxUATaKpE2Bxqpq0QCKOBlrRIJ05Y9ZJVIVIDFIK0SCaCml72eIwib7oD1
+      HBHc8vPWcwRQ00tdz1FnYBPluyubs4y89RwB1PaS13O0MMdHXE/KpDAb6dtOALW8nFUeHNDjJN94fJUH
+      9+fpn+BBrGumrvJgc46R+JGrSWE2RpKCqxtYv5ETE1rd4PQT4dNPDXE8jGLIXc9R/Zm8nqMB2S76eo42
+      5xhZDyG8nqP9CzW/4Os5Or/S8gy6nmP7I+NhAdZzNP5Mv3T0SeGs52hzlpGxnqPNWUb2eo4wbdo56zna
+      HG5ccZVW24W/niNMm3beeo4uiVsXXOnCclLXczQg00Vez9GATBdtPceBgCzUxxtaz1H7O+3BBtZzPP35
+      V6rnV8DBubhf4WvTVkxcFLuSYwYU43HoCeoavFECr2T0KsKuYPTsiywJvYJOMR4n7EpaAxCFt9Ymgo/6
+      WanlW2sTO4iRWp61NodjWOePnDHnHJ2zIq+1aVKQjbrWpkta1tC1Nr0SKBZtrU2bs4zkRi3UouU1Z7G2
+      LKshi7RieT0XrN8SULT7SnV2ge4pyzmDBchIwZI7CrPER2GWIaMwS/8ozDJgFGbpHYVZMkdhlv+/tbPp
+      cdWGwvC+/6S7DnNH7brq8kqVkqtuLUKcBIUA1za5mfn1tQkBjn3M8DqzGwU/jxnAxl8cR0dhUmNtcuyC
+      Gb8IbKzN4WBCrM2QZKxwXbSJjEZtkkejNgujUZvU0ahNfDQKj7VJKWpDYm0+0ocGLNYmpWK2bZpuy/nQ
+      WJshyVnXB8ecM4wJjbUZgJwTiLVJIM61+Y6rNt95E9yujsTaJIfAMsvH2iRHsPLKxtocDyQ18GKxNsNj
+      23QtV1rQcREm1ib5GYu1yaCMF6/42Vib4wEg1uac4U1pT3gYa5McSnnCg1ib5EjCE+7H2pwdgGJt+hxj
+      BKc2wlib469ArM05w5hS7gF//ROuvX/dlZxqHbODJm48lPe6e53oHVDem+j0fI2bfMEb1gSb+3T6SkO9
+      tNIwOCjABWERAZMHvG5PR9ft6WfWxunltXEmbR2fia3ju6avkb0urZG9Js4PXaPzQ9fU+aFrbH7o/Hej
+      yvpoU9sOw/anMj9+ra6hOHbZ/F3Wz8gtPvP/28raHZa5buqtcan/yU2+OoMIH8vhv7zq1n/hyrHLZuTa
+      8Pjkr+RVVv23aHWzX/2ZGaV8m/0zRTdiM99J7GUl10fjGgHqaPLKnq46IpoHQ0wHJZFzcckJX9YaCJY4
+      AsQBRBK6p6Z0dxGlkesXhswZYlLSlgR5Ra7HA2E94rz+7ephxKeNcl9/AaqBmCyX/Texq5riLPa2nLvP
+      TuXqaBYcOze/DUdzfUmy8/yUQ3Pf/BNtr3jY5GvPhX7J3P1XuSmbWou8KGRrcuCz1CVHkJP75PG4voqj
+      VGBrd1LIulDvLRYaM4JT/59i19V77Do8GN/U5kpLcZI58DSEJLX+1Z//Xvbnj0gJOHNedqY5y1rIW/ti
+      n0NbY6+2hmjMW1SlrE1/R/EQKitUsXzt4+OeT6giihviuRhh3wyNEvZUjG1KpGblaWL5lVp3Un3J1WRV
+      sXyVfR7TsnFkzKrLY51mdWTM2tVPPMsDzLuz9FKSiUXvl5WSDCkl2dOlJFtRSrKvKSXZ2lKSfV0pyZBS
+      kiWXkmyhlGTJpSRbKCXZM6UkY0pJY1sa76LIi5O8t/33QJ+Mp2N2oNUegBGnliZJabm4UVzytkUe9ggf
+      5NA3FBMuw8jxRqAr4mGBz3X8+kjKuHOO8t6E/3zkeOMFCVkYgJPTBb5z9dPZFpA+YtOuOxykG2GwzU7X
+      PF5d3D43zXJN2T9J8fsnqWkPpHsURuC9wLHUbP/MXUAKsA3LoLy3vS+nEMZePm2v3iUlh0DC5+XqVqHy
+      XylZPNiY+UOmWT8kNcKRaghEXB/i5Y/smzjm5iTVWx8zC5AyNGd3EafSzA+Ss9b2HmZK7hPVBOf89ljm
+      EiX6Cc75dZEbk37RCc76f6pU9UBOVp2VSXMKPscYU+YUWHjmPuUvyUNDLEzcLjTVE3YOJ34XSfsJP4fP
+      /PZnKVtoj5M545mQcd8RYByiNQr2OIi6uhaRdC2hD0C7eUhOeaABMyQnPDbuPALUoYVulJHIPzIyxAQ0
+      8e6pfVrUXVVhih6hnvV7IdxTE7ptkOfBpvZp9J4+ENZj+1gJKktRW7d+2HxITnigT3RP7dN9K/7Q1QWm
+      GTHqO5UH6HxcempooDLjkhP+6ubbAEGfnhiQ6MhD8ok37hb3feP1O53Mmcl0fbwU8ZlvBqXelJlvn4sb
+      t6nKbdwJFDYGnXlfRe5azuXqGnUiqKUyiKEyhN4VTa0Bvk9PDIXt4CKGPj01qMpF7t0DGy9RKrABtftE
+      BBbVz5uDojvku/aYhd5h2yix7S37MyAZGWKSNyPOHaC5A8Rh3x36JLUBT2iOEV+5bwGNTU3p+tAguE3u
+      8ady5+JU1u/Qacww4nMFtNP5EXmSR4aY6vzitoaotVG5274OEPoo9WpR5m+iKjVSb8woz1YAbcsRII6m
+      0K2bE7ZPCHIP5ljoq5t+bAn1DRjxtUUJaGxqSg/DtEl3MoQ59zDwmyB+kMSqwUKlg1Kl4TebDt5sTasO
+      CZNoPscan5o++8zD5pgycRbBWf9TU1ifedgckckrD2N9yLSVh7E+cMIqJGfWNpdaFLvisRpktdQHA6dR
+      r9m4xqQfXdGgnDH4uYDj5wTyXUlXIPLfu97bkA1ULjiYcz+uSpJ7Bk/uW2KY+Fs0Svxw5CiRbQsIxLlc
+      2e2LLrrBxoKCy6d9aV/cHhxthmcwsYvm1yfMr6z5td/x0E2bJlzwOc3Z7/uSuDjquHtil83QdnZRwSd5
+      6ItbAwtuOfe5ic11/R5DBOJcpoFefQEYOOFJsVt094bhiC7AnZ98bmZ0X6zsy6PrWPWzhHl1bFRpTqv7
+      v3EDn8tVqvLwDq2mjOCev1Vuw5J+RlFrgcWviwq8PPopZ3Pr6waN2SnKeF2mrmYwN9g7odTrxlv6Gtge
+      PEnI66GB975qxHbvZa1LYAgoggd+mye83ReDBt6qac7adkPPUuxtn9T1dEE9YwhyuXeggWqPYr//9j+x
+      hwL4R48EAA==
     EOF
 
     # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists
index 66db394..f6b70d9 100644 (file)
@@ -69,7 +69,7 @@ Pod::Spec.new do |s|
   }
   s.vendored_framework = "Cronet.framework"
   s.author             = "The Chromium Authors"
-  s.ios.deployment_target = "8.0"
+  s.ios.deployment_target = "9.0"
   s.source       = { :http => "https://storage.googleapis.com/grpc-precompiled-binaries/cronet/Cronet.framework-v#{v}.zip"}
   s.preserve_paths = "Cronet.framework"
   s.public_header_files = "Cronet.framework/Headers/**/*{.h}"
index 35402b7..5483aac 100644 (file)
 - (NSDictionary *)channelArgs {
   NSMutableDictionary *args = [NSMutableDictionary new];
 
-  NSString *userAgent = @"grpc-objc/" GRPC_OBJC_VERSION_STRING;
+  NSString *userAgent = [NSString
+      stringWithFormat:@"grpc-objc-%@/%@", [self getTransportTypeString], GRPC_OBJC_VERSION_STRING];
   NSString *userAgentPrefix = _callOptions.userAgentPrefix;
   if (userAgentPrefix.length != 0) {
     args[@GRPC_ARG_PRIMARY_USER_AGENT_STRING] =
   return args;
 }
 
+- (NSString *)getTransportTypeString {
+  switch (_callOptions.transportType) {
+    case GRPCTransportTypeCronet:
+      return @"cronet";
+    case GRPCTransportTypeInsecure:
+    case GRPCTransportTypeChttp2BoringSSL:
+      return @"cfstream";
+    default:
+      return @"unknown";
+  }
+}
+
 - (id)copyWithZone:(NSZone *)zone {
   GRPCChannelConfiguration *newConfig =
       [[GRPCChannelConfiguration alloc] initWithHost:_host callOptions:_callOptions];
index e52d028..f704b8b 100644 (file)
@@ -22,4 +22,4 @@
 // instead. This file can be regenerated from the template by running
 // `tools/buildgen/generate_projects.sh`.
 
-#define GRPC_OBJC_VERSION_STRING @"1.33.2"
+#define GRPC_OBJC_VERSION_STRING @"1.34.0"
index 83775f8..2f5e330 100644 (file)
@@ -1,7 +1,7 @@
 [![Cocoapods](https://img.shields.io/cocoapods/v/gRPC.svg)](https://cocoapods.org/pods/gRPC)
 # gRPC for Objective-C
 gRPC Objective C library provides Objective C API for users to make gRPC calls on iOS or OS X
-platforms. Currently, the minimum supported iOS version is 7.0 and OS X version is 10.9 (Mavericks).
+platforms. Currently, the minimum supported iOS version is 9.0 and OS X version is 10.10 (Yosemite).
 
 While gRPC doesn't require the use of an IDL to describe the API of services, using one simplifies
 usage and adds some interoperability guarantees. Here we use [Protocol Buffers][], and provide a
@@ -43,8 +43,8 @@ Pod::Spec.new do |s|
   s.summary = '...'
   s.source = { :git => 'https://github.com/...' }
 
-  s.ios.deployment_target = '7.1'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
 
   # Base directory where the .proto files are.
   src = '.'
index 9f5003e..73f0cb7 100644 (file)
@@ -77,7 +77,7 @@ ios_application(
         "ipad",
     ],
     infoplists = ["Sample/Sample/Info.plist"],
-    minimum_os_version = "8.0",
+    minimum_os_version = "9.0",
     visibility = ["//visibility:public"],
     deps = ["Sample-lib"],
 )
index 8b8811d..88c56ad 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 12.1;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
                                MTL_FAST_MATH = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 12.1;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                MTL_FAST_MATH = YES;
                                SDKROOT = iphoneos;
index 0252451..e61aacd 100644 (file)
@@ -1,4 +1,4 @@
-platform :ios, '8.0'
+platform :ios, '9.0'
 
 install! 'cocoapods', :deterministic_uuids => false
 
index ca45fd0..3c2b09a 100644 (file)
@@ -7,8 +7,8 @@ Pod::Spec.new do |s|
   s.summary = 'RemoteTest example'
   s.source = { :git => 'https://github.com/grpc/grpc.git' }
 
-  s.ios.deployment_target = '7.1'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
   s.tvos.deployment_target = '10.0'
   s.watchos.deployment_target = '4.0'
 
index e7ee700..c1ae381 100644 (file)
@@ -1,5 +1,5 @@
 source 'https://github.com/CocoaPods/Specs.git'
-platform :ios, '8.0'
+platform :ios, '9.0'
 
 install! 'cocoapods', :deterministic_uuids => false
 
index 2c8156d..1d58117 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.1;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.1;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = iphoneos;
                                TARGETED_DEVICE_FAMILY = "1,2";
index 8214371..c5c49cf 100644 (file)
@@ -1,5 +1,5 @@
 source 'https://github.com/CocoaPods/Specs.git'
-platform :ios, '8.0'
+platform :ios, '9.0'
 
 install! 'cocoapods', :deterministic_uuids => false
 
index 7f74fb0..dded999 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.4;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.4;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = iphoneos;
                                SWIFT_VERSION = 2.3;
index 3e2fe55..198492e 100644 (file)
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = appletvos;
-                               TVOS_DEPLOYMENT_TARGET = 11.2;
+                               TVOS_DEPLOYMENT_TARGET = 10.0;
                        };
                        name = Debug;
                };
                                GCC_WARN_UNUSED_VARIABLE = YES;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = appletvos;
-                               TVOS_DEPLOYMENT_TARGET = 11.2;
+                               TVOS_DEPLOYMENT_TARGET = 10.0;
                                VALIDATE_PRODUCT = YES;
                        };
                        name = Release;
index 59d30ab..30dffad 100644 (file)
@@ -16,7 +16,7 @@ def grpc_deps
 end
 
 target 'watchOS-sample' do
-platform :ios, '8.0'
+platform :ios, '9.0'
   grpc_deps
 end
 
index af34d80..ada92b8 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = iphoneos;
                                VALIDATE_PRODUCT = YES;
index 3ad16c3..f6d8ecf 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
                                MTL_FAST_MATH = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                MTL_FAST_MATH = YES;
                                SDKROOT = iphoneos;
                                CODE_SIGN_STYLE = Manual;
                                DEVELOPMENT_TEAM = EQHXZ8M8AV;
                                INFOPLIST_FILE = Info.plist;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                LD_RUNPATH_SEARCH_PATHS = (
                                        "$(inherited)",
                                        "@executable_path/Frameworks",
                                CODE_SIGN_STYLE = Manual;
                                DEVELOPMENT_TEAM = EQHXZ8M8AV;
                                INFOPLIST_FILE = Info.plist;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                LD_RUNPATH_SEARCH_PATHS = (
                                        "$(inherited)",
                                        "@executable_path/Frameworks",
index 919e649..ef07d41 100644 (file)
@@ -1,5 +1,5 @@
 source 'https://github.com/CocoaPods/Specs.git'
-platform :ios, '8.0'
+platform :ios, '9.0'
 
 install! 'cocoapods', :deterministic_uuids => false
 
index 888aab6..f029984 100644 (file)
@@ -174,7 +174,7 @@ grpc_objc_testing_library(
 
 ios_unit_test(
     name = "UnitTests",
-    minimum_os_version = "8.0",
+    minimum_os_version = "9.0",
     test_host = ":ios-host",
     deps = [
         ":APIv2Tests-lib",
@@ -188,7 +188,7 @@ ios_unit_test(
 
 ios_unit_test(
     name = "InteropTests",
-    minimum_os_version = "8.0",
+    minimum_os_version = "9.0",
     test_host = ":ios-host",
     deps = [
         ":InteropTestsLocalCleartext-lib",
@@ -199,7 +199,7 @@ ios_unit_test(
 
 macos_unit_test(
     name = "MacTests",
-    minimum_os_version = "10.9",
+    minimum_os_version = "10.10",
     deps = [
         ":APIv2Tests-lib",
         ":InteropTestsLocalCleartext-lib",
index 7a03f9b..27ec3d1 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = iphoneos;
                                VALIDATE_PRODUCT = YES;
index 2c23443..6da2d6e 100644 (file)
@@ -1,5 +1,5 @@
 install! 'cocoapods', :deterministic_uuids => false
-platform :ios, '8.0'
+platform :ios, '9.0'
 
 # Location of gRPC's repo root relative to this file.
 GRPC_LOCAL_SRC = '../../../..'
index 7371e1d..e277398 100644 (file)
@@ -1371,7 +1371,6 @@ static dispatch_once_t initGlobalInterceptorFactory;
   [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil];
 }
 
-/* TODO(yulin-liang) - Re-enable after fixing https://github.com/grpc/grpc/issues/24039
 - (void)testKeepaliveWithV2API {
   XCTAssertNotNil([[self class] host]);
   if ([[self class] transport] == gGRPCCoreCronetID) {
@@ -1412,7 +1411,7 @@ static dispatch_once_t initGlobalInterceptorFactory;
 
   [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil];
   [call finish];
-}*/
+}
 
 - (void)testDefaultInterceptor {
   XCTAssertNotNil([[self class] host]);
index 664ff94..6dac4d0 100644 (file)
@@ -14,7 +14,7 @@ def grpc_deps
   pod 'BoringSSL-GRPC',       :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c", :inhibit_warnings => true
   
   pod 'gRPC/InternalTesting',           :path => GRPC_LOCAL_SRC
-  pod 'gRPC-Core',                      :path => GRPC_LOCAL_SRC
+  pod 'gRPC-Core',                      :path => GRPC_LOCAL_SRC, :inhibit_warnings => true
   pod 'gRPC-RxLibrary',                 :path => GRPC_LOCAL_SRC
   pod 'gRPC-ProtoRPC',                  :path => GRPC_LOCAL_SRC, :inhibit_warnings => true
   pod 'RemoteTest', :path => "RemoteTestClient", :inhibit_warnings => true
@@ -35,13 +35,13 @@ end
   InteropTests
 ).each do |target_name|
   target target_name do
-    platform :ios, '8.0'
+    platform :ios, '9.0'
     grpc_deps
   end
 end
 
 target 'CronetTests' do
-  platform :ios, '8.0'
+  platform :ios, '9.0'
   grpc_deps
 
   pod 'gRPC/GRPCCoreCronet',           :path => GRPC_LOCAL_SRC
@@ -50,7 +50,7 @@ target 'CronetTests' do
 end
 
 target 'PerfTests' do
-  platform :ios, '8.0'
+  platform :ios, '9.0'
   grpc_deps
 
   pod 'gRPC/GRPCCoreCronet',           :path => GRPC_LOCAL_SRC
index 4a35328..be0ed3e 100644 (file)
@@ -7,8 +7,8 @@ Pod::Spec.new do |s|
   s.summary = "RemoteTest example"
   s.source = { :git => 'https://github.com/grpc/grpc.git' }
 
-  s.ios.deployment_target = '7.1'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
   s.tvos.deployment_target = '10.0'
   s.watchos.deployment_target = '4.0'
 
index 0279bde..c23f16c 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.3;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.3;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.3;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.3;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = iphoneos;
                                VALIDATE_PRODUCT = YES;
                                GCC_C_LANGUAGE_STANDARD = gnu11;
                                INFOPLIST_FILE = MacTests/Info.plist;
                                LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
-                               MACOSX_DEPLOYMENT_TARGET = 10.13;
+                               MACOSX_DEPLOYMENT_TARGET = 10.10;
                                MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
                                MTL_FAST_MATH = YES;
                                PRODUCT_BUNDLE_IDENTIFIER = io.grpc.MacTests;
                                );
                                INFOPLIST_FILE = MacTests/Info.plist;
                                LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
-                               MACOSX_DEPLOYMENT_TARGET = 10.13;
+                               MACOSX_DEPLOYMENT_TARGET = 10.10;
                                MTL_FAST_MATH = YES;
                                PRODUCT_BUNDLE_IDENTIFIER = io.grpc.MacTests;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                GCC_C_LANGUAGE_STANDARD = gnu11;
                                INFOPLIST_FILE = MacTests/Info.plist;
                                LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
-                               MACOSX_DEPLOYMENT_TARGET = 10.13;
+                               MACOSX_DEPLOYMENT_TARGET = 10.10;
                                MTL_FAST_MATH = YES;
                                PRODUCT_BUNDLE_IDENTIFIER = io.grpc.MacTests;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                GCC_C_LANGUAGE_STANDARD = gnu11;
                                INFOPLIST_FILE = MacTests/Info.plist;
                                LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
-                               MACOSX_DEPLOYMENT_TARGET = 10.13;
+                               MACOSX_DEPLOYMENT_TARGET = 10.10;
                                MTL_FAST_MATH = YES;
                                PRODUCT_BUNDLE_IDENTIFIER = io.grpc.MacTests;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                DEBUG_INFORMATION_FORMAT = dwarf;
                                ENABLE_TESTABILITY = YES;
                                GCC_C_LANGUAGE_STANDARD = gnu11;
-                               IPHONEOS_DEPLOYMENT_TARGET = 12.1;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
                                MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
                                MTL_FAST_MATH = YES;
                                CODE_SIGN_IDENTITY = "iPhone Developer";
                                CODE_SIGN_STYLE = Automatic;
                                GCC_C_LANGUAGE_STANDARD = gnu11;
-                               IPHONEOS_DEPLOYMENT_TARGET = 12.1;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
                                MTL_FAST_MATH = YES;
                                PRODUCT_BUNDLE_IDENTIFIER = org.grpc.PerfTests;
                                CODE_SIGN_IDENTITY = "iPhone Developer";
                                CODE_SIGN_STYLE = Automatic;
                                GCC_C_LANGUAGE_STANDARD = gnu11;
-                               IPHONEOS_DEPLOYMENT_TARGET = 12.1;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
                                MTL_FAST_MATH = YES;
                                PRODUCT_BUNDLE_IDENTIFIER = org.grpc.PerfTests;
                                CODE_SIGN_IDENTITY = "iPhone Developer";
                                CODE_SIGN_STYLE = Automatic;
                                GCC_C_LANGUAGE_STANDARD = gnu11;
-                               IPHONEOS_DEPLOYMENT_TARGET = 12.1;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
                                MTL_FAST_MATH = YES;
                                PRODUCT_BUNDLE_IDENTIFIER = org.grpc.PerfTests;
index f46dc67..b8b8b26 100644 (file)
@@ -226,7 +226,7 @@ static const NSTimeInterval kInvertedTimeout = 2;
                      initWithInitialMetadataCallback:^(NSDictionary *initialMetadata) {
                        NSString *userAgent = initialMetadata[@"x-grpc-test-echo-useragent"];
                        // Test the regex is correct
-                       NSString *expectedUserAgent = @"Foo grpc-objc/";
+                       NSString *expectedUserAgent = @"Foo grpc-objc-cfstream/";
                        expectedUserAgent =
                            [expectedUserAgent stringByAppendingString:GRPC_OBJC_VERSION_STRING];
                        expectedUserAgent = [expectedUserAgent stringByAppendingString:@" grpc-c/"];
index 978b718..85d6ba1 100644 (file)
@@ -301,7 +301,7 @@ static GRPCProtoMethod *kFullDuplexCallMethod;
         NSError *error = nil;
 
         // Test the regex is correct
-        NSString *expectedUserAgent = @"Foo grpc-objc/";
+        NSString *expectedUserAgent = @"Foo grpc-objc-cfstream/";
         expectedUserAgent = [expectedUserAgent stringByAppendingString:GRPC_OBJC_VERSION_STRING];
         expectedUserAgent = [expectedUserAgent stringByAppendingString:@" grpc-c/"];
         expectedUserAgent = [expectedUserAgent stringByAppendingString:GRPC_C_VERSION_STRING];
index 2910d68..f868683 100644 (file)
@@ -22,5 +22,5 @@
 // instead. This file can be regenerated from the template by running
 // `tools/buildgen/generate_projects.sh`.
 
-#define GRPC_OBJC_VERSION_STRING @"1.33.2"
-#define GRPC_C_VERSION_STRING @"13.0.0"
+#define GRPC_OBJC_VERSION_STRING @"1.34.0"
+#define GRPC_C_VERSION_STRING @"14.0.0"
index defc555..77e2df7 100755 (executable)
@@ -17,7 +17,7 @@ set -e
 cd $(dirname $0)/../../..
 
 ALL_IMAGES=( grpc-ext grpc-src alpine centos7 php-src php-future php-zts
-             fork-support i386 )
+             fork-support i386 php8 )
 
 if [[ "$1" == "--cmds" ]]; then
   for arg in "${ALL_IMAGES[@]}"
index 7969c28..a103458 100755 (executable)
@@ -17,7 +17,7 @@ set -e
 cd $(dirname $0)/../../..
 
 ALL_IMAGES=( grpc-ext grpc-src alpine centos7 php-src php-future php-zts
-             fork-support i386 )
+             fork-support i386 php8 )
 
 if [[ "$1" == "--cmds" ]]; then
   for arg in "${ALL_IMAGES[@]}"
index c6f109f..cf9ffad 100644 (file)
@@ -2,9 +2,9 @@
   "name": "grpc/grpc-dev",
   "description": "gRPC library for PHP - for Development use only",
   "license": "Apache-2.0",
-  "version": "1.33.2",
+  "version": "1.34.0",
   "require": {
-    "php": ">=5.5.0",
+    "php": ">=7.0.0",
     "google/protobuf": "^v3.3.0"
   },
   "require-dev": {
index a71c2af..67ede05 100644 (file)
@@ -21,8 +21,8 @@ ARG MAKEFLAGS=-j8
 
 WORKDIR /tmp
 
-RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && \
-  mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \
+RUN wget https://phar.phpunit.de/phpunit-8.5.8.phar && \
+  mv phpunit-8.5.8.phar /usr/local/bin/phpunit && \
   chmod +x /usr/local/bin/phpunit
 
 
index e6df3ef..9c5278e 100644 (file)
@@ -35,8 +35,8 @@ ARG MAKEFLAGS=-j8
 
 WORKDIR /tmp
 
-RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && \
-  mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \
+RUN wget https://phar.phpunit.de/phpunit-8.5.8.phar && \
+  mv phpunit-8.5.8.phar /usr/local/bin/phpunit && \
   chmod +x /usr/local/bin/phpunit
 
 
index 93d0307..137724b 100644 (file)
@@ -23,8 +23,8 @@ ARG MAKEFLAGS=-j8
 
 WORKDIR /tmp
 
-RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && \
-  mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \
+RUN wget https://phar.phpunit.de/phpunit-8.5.8.phar && \
+  mv phpunit-8.5.8.phar /usr/local/bin/phpunit && \
   chmod +x /usr/local/bin/phpunit
 
 
index 936ddc0..bd3acc1 100644 (file)
@@ -23,8 +23,8 @@ ARG MAKEFLAGS=-j8
 
 WORKDIR /tmp
 
-RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && \
-  mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \
+RUN wget https://phar.phpunit.de/phpunit-8.5.8.phar && \
+  mv phpunit-8.5.8.phar /usr/local/bin/phpunit && \
   chmod +x /usr/local/bin/phpunit
 
 
index dff4355..5855603 100644 (file)
@@ -23,8 +23,8 @@ ARG MAKEFLAGS=-j8
 
 WORKDIR /tmp
 
-RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && \
-  mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \
+RUN wget https://phar.phpunit.de/phpunit-8.5.8.phar && \
+  mv phpunit-8.5.8.phar /usr/local/bin/phpunit && \
   chmod +x /usr/local/bin/phpunit
 
 
index b55513e..1817da1 100644 (file)
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-FROM php:7.4.5-buster
+FROM php:7.4.11-buster
 
 RUN apt-get -qq update && apt-get -qq install -y \
   autoconf automake git libtool pkg-config \
@@ -23,8 +23,8 @@ ARG MAKEFLAGS=-j8
 
 WORKDIR /tmp
 
-RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && \
-  mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \
+RUN wget https://phar.phpunit.de/phpunit-8.5.8.phar && \
+  mv phpunit-8.5.8.phar /usr/local/bin/phpunit && \
   chmod +x /usr/local/bin/phpunit
 
 
index 972a297..f77e3dc 100644 (file)
@@ -23,8 +23,8 @@ RUN apt-get -qq update && apt-get -qq install -y \
 
 WORKDIR /tmp
 
-RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && \
-  mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \
+RUN wget https://phar.phpunit.de/phpunit-8.5.8.phar && \
+  mv phpunit-8.5.8.phar /usr/local/bin/phpunit && \
   chmod +x /usr/local/bin/phpunit
 
 
index 9bc9d37..9889645 100644 (file)
@@ -23,8 +23,8 @@ ARG MAKEFLAGS=-j8
 
 WORKDIR /tmp
 
-RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && \
-  mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \
+RUN wget https://phar.phpunit.de/phpunit-8.5.8.phar && \
+  mv phpunit-8.5.8.phar /usr/local/bin/phpunit && \
   chmod +x /usr/local/bin/phpunit
 
 
diff --git a/src/php/docker/php8/Dockerfile b/src/php/docker/php8/Dockerfile
new file mode 100644 (file)
index 0000000..47ab8f6
--- /dev/null
@@ -0,0 +1,40 @@
+# Copyright 2020 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM php:8.0.0RC3-cli-buster
+
+RUN apt-get -qq update && apt-get -qq install -y \
+  autoconf automake git libtool pkg-config \
+  valgrind wget zlib1g-dev
+
+ARG MAKEFLAGS=-j8
+
+
+WORKDIR /tmp
+
+# install pear
+RUN apt-get install expect -y && \
+  curl -LO http://pear.php.net/go-pear.phar && \
+  expect -c 'spawn php ./go-pear.phar; expect "or Enter to continue:"; send "\n"; expect "Currently used php.ini"; send "\n"; expect eof' && \
+  rm go-pear.phar
+
+WORKDIR /github/grpc
+
+COPY . .
+
+RUN pear package && \
+  find . -name grpc-*.tgz | xargs -I{} pecl install {}
+
+
+CMD php -d extension=grpc.so -r '$a = new \Grpc\Channel("dummy", []); echo get_class($a)."\n";'
index 2c090f2..b43e344 100644 (file)
@@ -31,30 +31,6 @@ grpc_byte_buffer *string_to_byte_buffer(char *string, size_t length) {
   return buffer;
 }
 
-#if PHP_MAJOR_VERSION < 7
-
-void byte_buffer_to_string(grpc_byte_buffer *buffer, char **out_string,
-                           size_t *out_length) {
-  grpc_byte_buffer_reader reader;
-  if (buffer == NULL || !grpc_byte_buffer_reader_init(&reader, buffer)) {
-    /* TODO(dgq): distinguish between the error cases. */
-    *out_string = NULL;
-    *out_length = 0;
-    return;
-  }
-
-  grpc_slice slice = grpc_byte_buffer_reader_readall(&reader);
-  size_t length = GRPC_SLICE_LENGTH(slice);
-  char *string = ecalloc(length + 1, sizeof(char));
-  memcpy(string, GRPC_SLICE_START_PTR(slice), length);
-  grpc_slice_unref(slice);
-
-  *out_string = string;
-  *out_length = length;
-}
-
-#else
-
 zend_string* byte_buffer_to_zend_string(grpc_byte_buffer *buffer) {
   grpc_byte_buffer_reader reader;
   if (buffer == NULL || !grpc_byte_buffer_reader_init(&reader, buffer)) {
@@ -78,5 +54,3 @@ zend_string* byte_buffer_to_zend_string(grpc_byte_buffer *buffer) {
   
   return zstr;
 }
-
-#endif // PHP_MAJOR_VERSION < 7
index e58d131..69d4704 100644 (file)
 
 grpc_byte_buffer *string_to_byte_buffer(char *string, size_t length);
 
-#if PHP_MAJOR_VERSION < 7
-void byte_buffer_to_string(grpc_byte_buffer *buffer, char **out_string,
-                           size_t *out_length);
-#else
 zend_string* byte_buffer_to_zend_string(grpc_byte_buffer *buffer);
-#endif // PHP_MAJOR_VERSION < 7
 
 #endif /* NET_GRPC_PHP_GRPC_BYTE_BUFFER_H_ */
index 03f4d56..e1b81f3 100644 (file)
@@ -104,9 +104,7 @@ zval *grpc_parse_metadata_array(grpc_metadata_array
       PHP_GRPC_FREE_STD_ZVAL(inner_array);
     }
     efree(str_key);
-#if PHP_MAJOR_VERSION >= 7
     efree(str_val);
-#endif
   }
   return array;
 }
@@ -300,12 +298,7 @@ PHP_METHOD(Call, startBatch) {
   int cancelled;
   grpc_call_error error;
 
-  #if PHP_MAJOR_VERSION < 7
-  char *message_str;
-  size_t message_len;
-  #else
   zend_string* zmessage = NULL;
-  #endif // PHP_MAJOR_VERSION < 7
 
   grpc_metadata_array_init(&metadata);
   grpc_metadata_array_init(&trailing_metadata);
@@ -463,9 +456,7 @@ PHP_METHOD(Call, startBatch) {
   }
   grpc_completion_queue_pluck(completion_queue, call->wrapped,
                               gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
-#if PHP_MAJOR_VERSION >= 7
   zval *recv_md;
-#endif
   for (int i = 0; i < op_num; i++) {
     switch(ops[i].op) {
     case GRPC_OP_SEND_INITIAL_METADATA:
@@ -481,54 +472,31 @@ PHP_METHOD(Call, startBatch) {
       add_property_bool(result, "send_status", true);
       break;
     case GRPC_OP_RECV_INITIAL_METADATA:
-#if PHP_MAJOR_VERSION < 7
-      array = grpc_parse_metadata_array(&recv_metadata TSRMLS_CC);
-      add_property_zval(result, "metadata", array);
-#else
       recv_md = grpc_parse_metadata_array(&recv_metadata);
       add_property_zval(result, "metadata", recv_md);
       zval_ptr_dtor(recv_md);
       PHP_GRPC_FREE_STD_ZVAL(recv_md);
-#endif
       PHP_GRPC_DELREF(array);
       break;
     case GRPC_OP_RECV_MESSAGE:
-#if PHP_MAJOR_VERSION < 7
-      byte_buffer_to_string(message, &message_str, &message_len);
-#else
       zmessage = byte_buffer_to_zend_string(message);
-#endif // PHP_MAJOR_VERSION < 7
 
-#if PHP_MAJOR_VERSION < 7
-      if (message_str == NULL) {
-#else
       if (zmessage == NULL) {
-#endif // PHP_MAJOR_VERSION < 7
         add_property_null(result, "message");
       } else {
-#if PHP_MAJOR_VERSION < 7
-        php_grpc_add_property_stringl(result, "message", message_str,
-                                      message_len, false);
-#else
         zval zmessage_val;
         ZVAL_NEW_STR(&zmessage_val, zmessage);
         add_property_zval(result, "message", &zmessage_val);
         zval_ptr_dtor(&zmessage_val);
-#endif // PHP_MAJOR_VERSION < 7
       }
       break;
     case GRPC_OP_RECV_STATUS_ON_CLIENT:
       PHP_GRPC_MAKE_STD_ZVAL(recv_status);
       object_init(recv_status);
-#if PHP_MAJOR_VERSION < 7
-      array = grpc_parse_metadata_array(&recv_trailing_metadata TSRMLS_CC);
-      add_property_zval(recv_status, "metadata", array);
-#else
       recv_md = grpc_parse_metadata_array(&recv_trailing_metadata);
       add_property_zval(recv_status, "metadata", recv_md);
       zval_ptr_dtor(recv_md);
       PHP_GRPC_FREE_STD_ZVAL(recv_md);
-#endif
       PHP_GRPC_DELREF(array);
       add_property_long(recv_status, "code", status);
       char *status_details_text = grpc_slice_to_c_string(recv_status_details);
@@ -536,9 +504,7 @@ PHP_METHOD(Call, startBatch) {
                                    true);
       gpr_free(status_details_text);
       add_property_zval(result, "status", recv_status);
-#if PHP_MAJOR_VERSION >= 7
       zval_ptr_dtor(recv_status);
-#endif
       PHP_GRPC_DELREF(recv_status);
       PHP_GRPC_FREE_STD_ZVAL(recv_status);
       break;
@@ -563,9 +529,6 @@ cleanup:
     }
     if (ops[i].op == GRPC_OP_RECV_MESSAGE) {
       grpc_byte_buffer_destroy(message);
-      #if PHP_MAJOR_VERSION < 7
-      PHP_GRPC_FREE_STD_ZVAL(message_str);
-      #endif // PHP_MAJOR_VERSION < 7
     }
   }
   RETURN_DESTROY_ZVAL(result);
index a57a841..7082b41 100644 (file)
@@ -158,16 +158,9 @@ int plugin_get_metadata(
   php_grpc_add_property_string(arg, "service_url", context.service_url, true);
   php_grpc_add_property_string(arg, "method_name", context.method_name, true);
   zval *retval = NULL;
-#if PHP_MAJOR_VERSION < 7
-  zval **params[1];
-  params[0] = &arg;
-  state->fci->params = params;
-  state->fci->retval_ptr_ptr = &retval;
-#else
   PHP_GRPC_MAKE_STD_ZVAL(retval);
   state->fci->params = arg;
   state->fci->retval = retval;
-#endif
   state->fci->param_count = 1;
 
   PHP_GRPC_DELREF(arg);
@@ -195,14 +188,10 @@ int plugin_get_metadata(
   }
 
   if (retval != NULL) {
-#if PHP_MAJOR_VERSION < 7
-    zval_ptr_dtor(&retval);
-#else
     zval_ptr_dtor(arg);
     zval_ptr_dtor(retval);
     PHP_GRPC_FREE_STD_ZVAL(arg);
     PHP_GRPC_FREE_STD_ZVAL(retval);
-#endif
   }
   if (should_return) {
     return true;
@@ -233,10 +222,6 @@ void plugin_destroy_state(void *ptr) {
   plugin_state *state = (plugin_state *)ptr;
   free(state->fci);
   free(state->fci_cache);
-#if PHP_MAJOR_VERSION < 7
-  PHP_GRPC_FREE_STD_ZVAL(state->fci->params);
-  PHP_GRPC_FREE_STD_ZVAL(state->fci->retval);
-#endif
   free(state);
 }
 
index e9b6d67..b308e3b 100644 (file)
 
 #include <ext/standard/php_var.h>
 #include <ext/standard/sha1.h>
-#if PHP_MAJOR_VERSION < 7
-#include <ext/standard/php_smart_str.h>
-#else
 #include <zend_smart_str.h>
-#endif
 #include <ext/spl/spl_exceptions.h>
 #include <zend_exceptions.h>
 
@@ -793,14 +789,12 @@ GRPC_STARTUP_FUNCTION(channel) {
   gpr_mu_init(&global_persistent_list_mu);
   le_plink = zend_register_list_destructors_ex(
       NULL, php_grpc_channel_plink_dtor, "Persistent Channel", module_number);
-  zend_hash_init_ex(&grpc_persistent_list, 20, NULL,
-                    EG(persistent_list).pDestructor, 1, 0);
+  ZEND_HASH_INIT(&grpc_persistent_list, 20, EG(persistent_list).pDestructor, 1);
   // Register the target->upper_bound map.
   le_bound = zend_register_list_destructors_ex(
       NULL, php_grpc_target_bound_dtor, "Target Bound", module_number);
-  zend_hash_init_ex(&grpc_target_upper_bound_map, 20, NULL,
-                    EG(persistent_list).pDestructor, 1, 0);
-
+  ZEND_HASH_INIT(&grpc_target_upper_bound_map, 20, EG(persistent_list).pDestructor, 1);
+  
   PHP_GRPC_INIT_HANDLER(wrapped_grpc_channel, channel_ce_handlers);
   return SUCCESS;
 }
index ce17c4a..d80e776 100644 (file)
 #include "channel_credentials.h"
 #include "php_grpc.h"
 
+#if PHP_MAJOR_VERSION >= 8
+#define ZEND_HASH_INIT(hash_table, limit, descriptor, zend_bool) _zend_hash_init(hash_table, limit, descriptor, zend_bool);
+#else
+#define ZEND_HASH_INIT(hash_table, limit, descriptor, zend_bool) zend_hash_init_ex(hash_table, limit, NULL, descriptor, zend_bool, 0);
+#endif
+
 /* Class entry for the PHP Channel class */
 extern zend_class_entry *grpc_ce_channel;
 
index 5cea81b..4d6b63c 100644 (file)
 
 #include <grpc/grpc.h>
 
+#if PHP_MAJOR_VERSION >= 8
+#define TSRMLS_D
+#endif
+
 /* The global completion queue for all operations */
 extern grpc_completion_queue *completion_queue;
 
index 5afe656..0da47c5 100644 (file)
 #ifndef PHP7_WRAPPER_GRPC_H
 #define PHP7_WRAPPER_GRPC_H
 
-#if PHP_MAJOR_VERSION < 7
-
-#define php_grpc_int int
-#define php_grpc_long long
-#define php_grpc_ulong ulong
-#define php_grpc_zend_object zend_object_value
-#define php_grpc_add_property_string(arg, name, context, b) \
-  add_property_string(arg, name, context, b)
-#define php_grpc_add_property_stringl(res, name, str, len, b) \
-  add_property_stringl(res, name, str, len, b)
-#define php_grpc_add_property_zval(res, name, val) \
-  add_property_zval(res, name, val)
-#define php_grpc_add_next_index_stringl(data, str, len, b) \
-  add_next_index_stringl(data, str, len, b)
-
-#define PHP_GRPC_RETVAL_STRING(val, dup) RETVAL_STRING(val, dup)
-#define PHP_GRPC_RETURN_STRING(val, dup) RETURN_STRING(val, dup)
-#define PHP_GRPC_MAKE_STD_ZVAL(pzv) MAKE_STD_ZVAL(pzv)
-#define PHP_GRPC_FREE_STD_ZVAL(pzv)
-#define PHP_GRPC_DELREF(zv) Z_DELREF_P(zv)
-#define PHP_GRPC_ADD_STRING_TO_ARRAY(val, key, key_len, str, dup) \
-   add_assoc_string_ex(val, key, key_len , str, dup);
-#define PHP_GRPC_ADD_LONG_TO_ARRAY(val, key, key_len, str) \
-   add_assoc_long_ex(val, key, key_len, str);
-#define PHP_GRPC_ADD_BOOL_TO_ARRAY(val, key, key_len, str) \
-   add_assoc_bool_ex(val, key, key_len, str);
-#define PHP_GRPC_ADD_LONG_TO_RETVAL(val, key, key_len, str) \
-   add_assoc_long_ex(val, key, key_len+1, str);
-
-#define RETURN_DESTROY_ZVAL(val) \
-  RETURN_ZVAL(val, false /* Don't execute copy constructor */, \
-              true /* Dealloc original before returning */)
-
-#define PHP_GRPC_WRAP_OBJECT_START(name) \
-  typedef struct name { \
-    zend_object std;
-#define PHP_GRPC_WRAP_OBJECT_END(name) \
-  } name;
-
-#define PHP_GRPC_FREE_WRAPPED_FUNC_START(class_object) \
-  void free_##class_object(void *object TSRMLS_DC) { \
-    class_object *p = (class_object *)object;
-#define PHP_GRPC_FREE_WRAPPED_FUNC_END() \
-    zend_object_std_dtor(&p->std TSRMLS_CC); \
-    efree(p); \
-  }
-
-#define PHP_GRPC_ALLOC_CLASS_OBJECT(class_object) \
-  class_object *intern; \
-  zend_object_value retval; \
-  intern = (class_object *)emalloc(sizeof(class_object)); \
-  memset(intern, 0, sizeof(class_object));
-
-#define PHP_GRPC_FREE_CLASS_OBJECT(class_object, handler) \
-  retval.handle = zend_objects_store_put( \
-    intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, \
-    free_##class_object, NULL TSRMLS_CC); \
-  retval.handlers = zend_get_std_object_handlers(); \
-  return retval;
-
-#define PHP_GRPC_HASH_FOREACH_VAL_START(ht, data) \
-  zval **tmp_data = NULL; \
-  for (zend_hash_internal_pointer_reset(ht); \
-       zend_hash_get_current_data(ht, (void**)&tmp_data) == SUCCESS; \
-       zend_hash_move_forward(ht)) { \
-    data = *tmp_data;
-
-#define PHP_GRPC_HASH_FOREACH_STR_KEY_VAL_START(ht, key, key_type, data) \
-  zval **tmp##key = NULL; \
-  ulong index##key; \
-  uint len##key; \
-  for (zend_hash_internal_pointer_reset(ht); \
-       zend_hash_get_current_data(ht, (void**)&tmp##key) == SUCCESS; \
-       zend_hash_move_forward(ht)) { \
-    key_type = zend_hash_get_current_key_ex(ht, &key, &len##key, &index##key,\
-                                         0, NULL); \
-    data = *tmp##key;
-
-#define PHP_GRPC_HASH_VALPTR_TO_VAL(data) \
-  &data;
-
-#define PHP_GRPC_HASH_FOREACH_LONG_KEY_VAL_START(ht, key, key_type, index,\
-                                                 data) \
-  zval **tmp##key = NULL; \
-  uint len##key; \
-  for (zend_hash_internal_pointer_reset(ht); \
-       zend_hash_get_current_data(ht, (void**)&tmp##key) == SUCCESS; \
-       zend_hash_move_forward(ht)) { \
-    key_type = zend_hash_get_current_key_ex(ht, &key, &len##key, &index,\
-                                         0, NULL); \
-    data = *tmp##key;
-
-#define PHP_GRPC_HASH_FOREACH_END() }
-
-static inline int php_grpc_zend_hash_find(HashTable *ht, char *key, int len,
-                                          void **value) {
-  zval **data = NULL;
-  if (zend_hash_find(ht, key, len, (void **)&data) == SUCCESS) {
-    *value = *data;
-    return SUCCESS;
-  } else {
-    *value = NULL;
-    return FAILURE;
-  }
-}
-
-#define php_grpc_zend_hash_del zend_hash_del
-#define php_grpc_zend_resource zend_rsrc_list_entry
-
-#define PHP_GRPC_BVAL_IS_TRUE(zv) Z_LVAL_P(zv)
-#define PHP_GRPC_VAR_SERIALIZE(buf, zv, hash) \
-  php_var_serialize(buf, &zv, hash TSRMLS_CC)
-#define PHP_GRPC_SERIALIZED_BUF_STR(buf) buf.c
-#define PHP_GRPC_SERIALIZED_BUF_LEN(buf) buf.len
-#define PHP_GRPC_SHA1Update(cxt, str, len)     \
-  PHP_SHA1Update(cxt, (const unsigned char *)str, len)
-#define PHP_GRPC_PERSISTENT_LIST_FIND(plist, key, len, rsrc) \
-  zend_hash_find(plist, key, len+1, (void **)&rsrc) != FAILURE
-#define PHP_GRPC_PERSISTENT_LIST_UPDATE(plist, key, len, rsrc) \
-  zend_hash_update(plist, key, len+1, rsrc, sizeof(php_grpc_zend_resource), \
-                   NULL)
-#define PHP_GRPC_PERSISTENT_LIST_SIZE(plist) \
-  *plist.nNumOfElements
-
-#define PHP_GRPC_GET_CLASS_ENTRY(object) zend_get_class_entry(object TSRMLS_CC)
-
-#define PHP_GRPC_INIT_HANDLER(class_object, handler_name)
-
-#define PHP_GRPC_DECLARE_OBJECT_HANDLER(handler_name)
-
-#define PHP_GRPC_GET_WRAPPED_OBJECT(class_object, zv) \
-  (class_object *)zend_object_store_get_object(zv TSRMLS_CC)
-
-#else
 
 #define php_grpc_int size_t
 #define php_grpc_long zend_long
@@ -283,6 +149,4 @@ static inline int php_grpc_zend_hash_del(HashTable *ht, char *key, int len) {
 #define PHP_GRPC_GET_WRAPPED_OBJECT(class_object, zv) \
   class_object##_from_obj(Z_OBJ_P((zv)))
 
-#endif /* PHP_MAJOR_VERSION */
-
 #endif /* PHP7_WRAPPER_GRPC_H */
index 01764a7..360aa68 100644 (file)
@@ -191,7 +191,7 @@ void postfork_child() {
   grpc_php_shutdown_completion_queue(TSRMLS_C);
 
   // clean-up grpc_core
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   if (grpc_is_initialized() > 0) {
     zend_throw_exception(spl_ce_UnexpectedValueException,
                          "Oops, failed to shutdown gRPC Core after fork()",
@@ -567,7 +567,7 @@ PHP_MSHUTDOWN_FUNCTION(grpc) {
     zend_hash_destroy(&grpc_target_upper_bound_map);
     grpc_shutdown_timeval(TSRMLS_C);
     grpc_php_shutdown_completion_queue(TSRMLS_C);
-    grpc_shutdown_blocking();
+    grpc_shutdown();
     GRPC_G(initialized) = 0;
   }
   return SUCCESS;
index b848ee3..0c7cc65 100644 (file)
@@ -46,6 +46,14 @@ extern zend_module_entry grpc_module_entry;
 #define PHP_GRPC_API
 #endif
 
+#if PHP_MAJOR_VERSION >= 8
+#define TSRMLS_CC
+#define TSRMLS_C
+#define TSRMLS_DC
+#define TSRMLS_D
+#define TSRMLS_FETCH()
+#endif
+
 #ifdef ZTS
 #include "TSRM.h"
 #endif
index bb0749e..7dece7b 100644 (file)
@@ -20,6 +20,6 @@
 #ifndef VERSION_H
 #define VERSION_H
 
-#define PHP_GRPC_VERSION "1.33.2"
+#define PHP_GRPC_VERSION "1.34.0"
 
 #endif /* VERSION_H */
index f7b4735..a689546 100644 (file)
@@ -23,7 +23,7 @@ require_once realpath(dirname(__FILE__).'/../../vendor/autoload.php');
 @include_once dirname(__FILE__).'/math.pb.php';
 @include_once dirname(__FILE__).'/math_grpc_pb.php';
 
-abstract class AbstractGeneratedCodeTest extends PHPUnit_Framework_TestCase
+abstract class AbstractGeneratedCodeTest extends \PHPUnit\Framework\TestCase
 {
     /**
      * These tests require that a server exporting the math service must be
index 91339d3..f9fa573 100755 (executable)
@@ -20,7 +20,7 @@ require_once dirname(__FILE__).'/AbstractGeneratedCodeTest.php';
 
 class GeneratedCodeTest extends AbstractGeneratedCodeTest
 {
-    public function setUp()
+    public function setUp(): void
     {
         self::$client = new Math\MathClient(
             getenv('GRPC_TEST_HOST'), [
@@ -28,7 +28,7 @@ class GeneratedCodeTest extends AbstractGeneratedCodeTest
             ]);
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         self::$client->close();
     }
index 60a90fa..fb55d16 100644 (file)
@@ -20,7 +20,7 @@ require_once dirname(__FILE__).'/AbstractGeneratedCodeTest.php';
 
 class GeneratedCodeWithCallbackTest extends AbstractGeneratedCodeTest
 {
-    public function setUp()
+    public function setUp(): void
     {
         self::$client = new Math\MathClient(
         getenv('GRPC_TEST_HOST'),
@@ -35,7 +35,7 @@ class GeneratedCodeWithCallbackTest extends AbstractGeneratedCodeTest
          ]);
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         self::$client->close();
     }
index f6ae683..908fb3c 100755 (executable)
@@ -609,6 +609,31 @@ function statusCodeAndMessage($stub)
                $status->details);
 }
 
+function specialStatusMessage($stub)
+{
+    $test_code = Grpc\STATUS_UNKNOWN;
+    $test_msg = "\t\ntest with whitespace\r\nand Unicode BMP ☺ and non-BMP 😈\t\n";
+
+    $echo_status = new Grpc\Testing\EchoStatus();
+    $echo_status->setCode($test_code);
+    $echo_status->setMessage($test_msg);
+
+    $request = new Grpc\Testing\SimpleRequest();
+    $request->setResponseStatus($echo_status);
+
+    $call = $stub->UnaryCall($request);
+    list($result, $status) = $call->wait();
+
+    hardAssert(
+        $status->code === $test_code,
+        'Received unexpected UnaryCall status code: ' . $status->code
+    );
+    hardAssert(
+        $status->details === $test_msg,
+        'Received unexpected UnaryCall status details: ' . $status->details
+    );
+}
+
 # NOTE: the stub input to this function is from UnimplementedService
 function unimplementedService($stub)
 {
@@ -761,6 +786,8 @@ function interop_main($args, $stub = false)
         case 'status_code_and_message':
             statusCodeAndMessage($stub);
             break;
+        case 'special_status_message':
+            specialStatusMessage($stub);
         case 'unimplemented_service':
             unimplementedService($stub);
             break;
index c63029f..35cf821 100644 (file)
@@ -17,9 +17,9 @@
  *
  */
 
-class CallCredentials2Test extends PHPUnit_Framework_TestCase
+class CallCredentials2Test extends \PHPUnit\Framework\TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         $credentials = Grpc\ChannelCredentials::createSsl(
             file_get_contents(dirname(__FILE__).'/../data/ca.pem'));
@@ -43,7 +43,7 @@ class CallCredentials2Test extends PHPUnit_Framework_TestCase
         );
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         unset($this->channel);
         unset($this->server);
index 818b823..a88a268 100644 (file)
@@ -17,9 +17,9 @@
  *
  */
 
-class CallCredentialsTest extends PHPUnit_Framework_TestCase
+class CallCredentialsTest extends \PHPUnit\Framework\TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         $this->credentials = Grpc\ChannelCredentials::createSsl(
             file_get_contents(dirname(__FILE__).'/../data/ca.pem'));
@@ -49,7 +49,7 @@ class CallCredentialsTest extends PHPUnit_Framework_TestCase
         );
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         unset($this->channel);
         unset($this->server);
index 00b5b99..300d805 100644 (file)
@@ -159,16 +159,16 @@ class CallInvokerChangeRequestCall
     }
 }
 
-class CallInvokerTest extends PHPUnit_Framework_TestCase
+class CallInvokerTest extends \PHPUnit\Framework\TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         $this->server = new Grpc\Server([]);
         $this->port = $this->server->addHttp2Port('0.0.0.0:0');
         $this->server->start();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         unset($this->server);
     }
index 23d8e77..4d1be1b 100644 (file)
  * limitations under the License.
  *
  */
-class CallTest extends PHPUnit_Framework_TestCase
+class CallTest extends \PHPUnit\Framework\TestCase
 {
     public static $server;
     public static $port;
 
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         self::$server = new Grpc\Server([]);
         self::$port = self::$server->addHttp2Port('0.0.0.0:53000');
         self::$server->start();
     }
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->channel = new Grpc\Channel('localhost:'.self::$port, [
             'force_new' => true,
@@ -38,7 +38,7 @@ class CallTest extends PHPUnit_Framework_TestCase
                                     Grpc\Timeval::infFuture());
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         $this->channel->close();
     }
index e7e695c..73963ce 100644 (file)
  *
  */
 
-class ChanellCredentialsTest extends PHPUnit_Framework_TestCase
+class ChanellCredentialsTest extends \PHPUnit\Framework\TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
     }
 
index 58f96a7..8ae3945 100644 (file)
  *
  */
 
-class ChannelTest extends PHPUnit_Framework_TestCase
+class ChannelTest extends \PHPUnit\Framework\TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         if (!empty($this->channel)) {
             $this->channel->close();
index d096565..08b28e0 100644 (file)
@@ -16,9 +16,9 @@
  * limitations under the License.
  *
  */
-class EndToEndTest extends PHPUnit_Framework_TestCase
+class EndToEndTest extends \PHPUnit\Framework\TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         $this->server = new Grpc\Server([]);
         $this->port = $this->server->addHttp2Port('0.0.0.0:0');
@@ -28,7 +28,7 @@ class EndToEndTest extends PHPUnit_Framework_TestCase
         $this->server->start();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         $this->channel->close();
         unset($this->server);
index acd68fc..5e87679 100644 (file)
@@ -215,9 +215,9 @@ class StopCallInterceptor extends Grpc\Interceptor
     }
 }
 
-class InterceptorTest extends PHPUnit_Framework_TestCase
+class InterceptorTest extends \PHPUnit\Framework\TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         $this->server = new Grpc\Server([]);
         $this->port = $this->server->addHttp2Port('0.0.0.0:0');
@@ -227,7 +227,7 @@ class InterceptorTest extends PHPUnit_Framework_TestCase
         $this->server->start();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         $this->channel->close();
         unset($this->server);
index 7b44221..f10daeb 100644 (file)
 /**
  * @group persistent_list_bound_tests
  */
-class PersistentListTest extends PHPUnit_Framework_TestCase
+class PersistentListTest extends \PHPUnit\Framework\TestCase
 {
-  public function setUp()
+  public function setUp(): void
   {
   }
 
-  public function tearDown()
+  public function tearDown(): void
   {
     $channel_clean_persistent =
         new Grpc\Channel('localhost:50010', []);
index 071598c..da9d9d0 100644 (file)
@@ -16,9 +16,9 @@
  * limitations under the License.
  *
  */
-class SecureEndToEndTest extends PHPUnit_Framework_TestCase
+class SecureEndToEndTest extends \PHPUnit\Framework\TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         $credentials = Grpc\ChannelCredentials::createSsl(
             file_get_contents(dirname(__FILE__).'/../data/ca.pem'));
@@ -42,7 +42,7 @@ class SecureEndToEndTest extends PHPUnit_Framework_TestCase
         );
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         $this->channel->close();
         unset($this->server);
index cab92e5..b29a6b0 100644 (file)
  *
  */
 
-class ServerTest extends PHPUnit_Framework_TestCase
+class ServerTest extends \PHPUnit\Framework\TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         $this->server = null;
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         unset($this->server);
     }
index 000b2db..1a52508 100644 (file)
  * limitations under the License.
  *
  */
-class TimevalTest extends PHPUnit_Framework_TestCase
+class TimevalTest extends \PHPUnit\Framework\TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         unset($this->time);
     }
index 3900ac2..e310d4c 100755 (executable)
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 """Generates the appropriate build.json data for all the proto files."""
-from __future__ import print_function
+
 import yaml
 import collections
 import os
index 70e3427..5acc2f0 100644 (file)
@@ -212,3 +212,40 @@ message LoadBalancerStatsResponse {
   int32 num_failures = 2;
   map<string, RpcsByPeer> rpcs_by_method = 3;
 }
+
+// Request for retrieving a test client's accumulated stats.
+message LoadBalancerAccumulatedStatsRequest {}
+
+// Accumulated stats for RPCs sent by a test client.
+message LoadBalancerAccumulatedStatsResponse {
+  // The total number of RPCs have ever issued for each type.
+  map<string, int32> num_rpcs_started_by_method = 1;
+  // The total number of RPCs have ever completed successfully for each type.
+  map<string, int32> num_rpcs_succeeded_by_method = 2;
+  // The total number of RPCs have ever failed for each type.
+  map<string, int32> num_rpcs_failed_by_method = 3;
+}
+
+// Configurations for a test client.
+message ClientConfigureRequest {
+  // Type of RPCs to send.
+  enum RpcType {
+    EMPTY_CALL = 0;
+    UNARY_CALL = 1;
+  }
+
+  // Metadata to be attached for the given type of RPCs.
+  message Metadata {
+    RpcType type = 1;
+    string key = 2;
+    string value = 3;
+  }
+
+  // The types of RPCs the client sends.
+  repeated RpcType types = 1;
+  // The collection of custom metadata to be attached to RPCs sent by the client.
+  repeated Metadata metadata = 2;
+}
+
+// Response for updating a test client's configuration.
+message ClientConfigureResponse {}
index 1da43f4..5805a41 100644 (file)
@@ -83,6 +83,10 @@ service LoadBalancerStatsService {
   // Gets the backend distribution for RPCs sent by a test client.
   rpc GetClientStats(LoadBalancerStatsRequest)
       returns (LoadBalancerStatsResponse) {}
+
+  // Gets the accumulated stats for RPCs sent by a test client.
+  rpc GetClientAccumulatedStats(LoadBalancerAccumulatedStatsRequest)
+      returns (LoadBalancerAccumulatedStatsResponse) {}
 }
 
 // A service to remotely control health status of an xDS test server.
@@ -90,3 +94,9 @@ service XdsUpdateHealthService {
   rpc SetServing(grpc.testing.Empty) returns (grpc.testing.Empty);
   rpc SetNotServing(grpc.testing.Empty) returns (grpc.testing.Empty);
 }
+
+// A service to dynamically update the configuration of an xDS test client.
+service XdsUpdateClientConfigureService {
+  // Update the tes client's configuration.
+  rpc Configure(ClientConfigureRequest) returns (ClientConfigureResponse);
+}
index ea82823..62e2813 100644 (file)
@@ -141,6 +141,14 @@ grpc_proto_library(
 )
 
 grpc_proto_library(
+    name = "protocol_proto",
+    srcs = [
+        "protocol.proto",
+    ],
+    well_known_protos = True,
+)
+
+grpc_proto_library(
     name = "range_proto",
     srcs = [
         "range.proto",
@@ -175,6 +183,7 @@ grpc_proto_library(
     ],
     deps = [
         "config_source_proto",
+        "protocol_proto",
         "route_proto",
     ],
 )
index 998ad56..786ac0f 100644 (file)
@@ -19,13 +19,13 @@ syntax = "proto3";
 package envoy.extensions.filters.network.http_connection_manager.v3;
 
 import "src/proto/grpc/testing/xds/v3/config_source.proto";
+import "src/proto/grpc/testing/xds/v3/protocol.proto";
 import "src/proto/grpc/testing/xds/v3/route.proto";
 
 // [#protodoc-title: HTTP connection manager]
 // HTTP connection manager :ref:`configuration overview <config_http_conn_man>`.
 // [#extension: envoy.filters.network.http_connection_manager]
 
-// [#next-free-field: 38]
 message HttpConnectionManager {
   oneof route_specifier {
     // The connection manager’s route table will be dynamically loaded via the RDS API.
@@ -39,6 +39,10 @@ message HttpConnectionManager {
     // specified in this message.
     ScopedRoutes scoped_routes = 31;
   }
+
+  // Additional settings for HTTP requests handled by the connection manager. These will be
+  // applicable to both HTTP1 and HTTP2 requests.
+  config.core.v3.HttpProtocolOptions common_http_protocol_options = 35;
 }
 
 message Rds {
diff --git a/src/proto/grpc/testing/xds/v3/protocol.proto b/src/proto/grpc/testing/xds/v3/protocol.proto
new file mode 100644 (file)
index 0000000..886cc11
--- /dev/null
@@ -0,0 +1,27 @@
+// Copyright 2020 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Local copy of Envoy xDS proto file, used for testing only.
+
+syntax = "proto3";
+
+package envoy.config.core.v3;
+
+import "google/protobuf/duration.proto";
+
+// [#next-free-field: 5]
+message HttpProtocolOptions {
+  // The maximum duration of a connection.
+  google.protobuf.Duration max_stream_duration = 4;
+}
index 309f80a..b7fc40b 100644 (file)
@@ -23,6 +23,7 @@ import "src/proto/grpc/testing/xds/v3/regex.proto";
 import "src/proto/grpc/testing/xds/v3/percent.proto";
 import "src/proto/grpc/testing/xds/v3/range.proto";
 
+import "google/protobuf/duration.proto";
 import "google/protobuf/wrappers.proto";
 
 // [#protodoc-title: HTTP route components]
@@ -180,7 +181,25 @@ message RouteMatch {
   repeated QueryParameterMatcher query_parameters = 7;
 }
 
-// [#next-free-field: 34]
+message MaxStreamDuration {
+  // Specifies the maximum duration allowed for streams on the route. If not specified, the value
+  // from the :ref:`max_stream_duration
+  // <envoy_api_field_config.core.v3.HttpProtocolOptions.max_stream_duration>` field in
+  // :ref:`HttpConnectionManager.common_http_protocol_options
+  // <envoy_api_field_extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.common_http_protocol_options>`
+  // is used. If this field is set explicitly to zero, any
+  // HttpConnectionManager max_stream_duration timeout will be disabled for
+  // this route.
+  google.protobuf.Duration max_stream_duration = 1;
+
+  // If present, and the request contains a `grpc-timeout header
+  // <https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md>`_, use that value as the
+  // *max_stream_duration*, but limit the applied timeout to the maximum value specified here.
+  // If set to 0, the `grpc-timeout` header is used without modification.
+  google.protobuf.Duration grpc_timeout_header_max = 2;
+}
+
+// [#next-free-field: 37]
 message RouteAction {
   oneof cluster_specifier {
     // Indicates the upstream cluster to which the request should be routed
@@ -205,6 +224,8 @@ message RouteAction {
     // for additional documentation.
     WeightedCluster weighted_clusters = 3;
   }
+  // Specifies the maximum stream duration for this route.
+  MaxStreamDuration max_stream_duration = 36;
 }
 
 // .. attention::
index 8240beb..a8b2ff5 100644 (file)
@@ -217,15 +217,18 @@ class BuildExt(build_ext.build_ext):
             """Test if default compiler is okay with specifying c++ version
             when invoked in C mode. GCC is okay with this, while clang is not.
             """
-            if platform.system() != 'Windows':
+            try:
+                # TODO(lidiz) Remove the generated a.out for success tests.
+                cc_test = subprocess.Popen(['cc', '-x', 'c', '-std=c++11', '-'],
+                                           stdin=subprocess.PIPE,
+                                           stdout=subprocess.PIPE,
+                                           stderr=subprocess.PIPE)
+                _, cc_err = cc_test.communicate(input=b'int main(){return 0;}')
+                return not 'invalid argument' in str(cc_err)
+            except:
+                sys.stderr.write('Non-fatal exception:' +
+                                 traceback.format_exc() + '\n')
                 return False
-            # TODO(lidiz) Remove the generated a.out for success tests.
-            cc_test = subprocess.Popen(['cc', '-x', 'c', '-std=c++11', '-'],
-                                       stdin=subprocess.PIPE,
-                                       stdout=subprocess.PIPE,
-                                       stderr=subprocess.PIPE)
-            _, cc_err = cc_test.communicate(input=b'int main(){return 0;}')
-            return not 'invalid argument' in str(cc_err)
 
         # This special conditioning is here due to difference of compiler
         #   behavior in gcc and clang. The clang doesn't take --stdc++11
index 06c92ca..9aec955 100644 (file)
@@ -94,7 +94,7 @@ def _grpc_shutdown_wrapper(_):
     Define functions are not allowed in "cdef" functions, and Cython complains
     about a simple lambda with a C function.
     """
-    grpc_shutdown_blocking()
+    grpc_shutdown()
 
 
 cdef _actual_aio_shutdown():
@@ -106,7 +106,7 @@ cdef _actual_aio_shutdown():
         future.add_done_callback(_grpc_shutdown_wrapper)
     elif _global_aio_state.engine is AsyncIOEngine.POLLER:
         (<PollerCompletionQueue>_global_aio_state.cq).shutdown()
-        grpc_shutdown_blocking()
+        grpc_shutdown()
     else:
         raise ValueError('Unsupported engine type [%s]' % _global_aio_state.engine)
 
index a630ed8..8c74d3e 100644 (file)
@@ -884,6 +884,8 @@ cdef class AioServer:
 
     def _serving_task_crash_handler(self, object task):
         """Shutdown the server immediately if unexpectedly exited."""
+        if task.cancelled():
+            return
         if task.exception() is None:
             return
         if self._status != AIO_SERVER_STATUS_STOPPING:
index bdd155b..f68e166 100644 (file)
@@ -86,7 +86,7 @@ cdef class Call:
     with nogil:
       if self.c_call != NULL:
         grpc_call_unref(self.c_call)
-      grpc_shutdown_blocking()
+      grpc_shutdown()
 
   # The object *should* always be valid from Python. Used for debugging.
   @property
index 74c7f6c..ebffb7b 100644 (file)
@@ -425,7 +425,7 @@ cdef _close(Channel channel, grpc_status_code code, object details,
       _destroy_c_completion_queue(state.c_connectivity_completion_queue)
       grpc_channel_destroy(state.c_channel)
       state.c_channel = NULL
-      grpc_shutdown_blocking()
+      grpc_shutdown()
       state.condition.notify_all()
     else:
       # Another call to close already completed in the past or is currently
index a47403a..54c55f8 100644 (file)
@@ -115,4 +115,4 @@ cdef class CompletionQueue:
             self.c_completion_queue, c_deadline, NULL)
         self._interpret_event(event)
       grpc_completion_queue_destroy(self.c_completion_queue)
-    grpc_shutdown_blocking()
+    grpc_shutdown()
index c75579c..b1d0a8b 100644 (file)
@@ -58,7 +58,7 @@ cdef int _get_metadata(void *state,
 
 cdef void _destroy(void *state) except * with gil:
   cpython.Py_DECREF(<object>state)
-  grpc_shutdown_blocking()
+  grpc_shutdown()
 
 
 cdef class MetadataPluginCallCredentials(CallCredentials):
@@ -124,7 +124,7 @@ cdef class SSLSessionCacheLRU:
   def __dealloc__(self):
     if self._cache != NULL:
         grpc_ssl_session_cache_destroy(self._cache)
-    grpc_shutdown_blocking()
+    grpc_shutdown()
 
 
 cdef class SSLChannelCredentials(ChannelCredentials):
@@ -190,7 +190,7 @@ cdef class ServerCertificateConfig:
   def __dealloc__(self):
     grpc_ssl_server_certificate_config_destroy(self.c_cert_config)
     gpr_free(self.c_ssl_pem_key_cert_pairs)
-    grpc_shutdown_blocking()
+    grpc_shutdown()
 
 
 cdef class ServerCredentials:
@@ -206,7 +206,7 @@ cdef class ServerCredentials:
   def __dealloc__(self):
     if self.c_credentials != NULL:
       grpc_server_credentials_release(self.c_credentials)
-    grpc_shutdown_blocking()
+    grpc_shutdown()
 
 cdef const char* _get_c_pem_root_certs(pem_root_certs):
   if pem_root_certs is None:
index a713135..b873bb0 100644 (file)
@@ -334,6 +334,7 @@ cdef extern from "grpc/grpc.h":
     grpc_op_data data
 
   void grpc_init() nogil
+  void grpc_shutdown() nogil
   void grpc_shutdown_blocking() nogil
   int grpc_is_initialized() nogil
 
index 0f693ec..d857317 100644 (file)
@@ -39,7 +39,7 @@ cdef class SocketWrapper:
     self.len = 0
 
   def __dealloc__(self):
-    grpc_shutdown_blocking()
+    grpc_shutdown()
 
 cdef grpc_error* socket_init(grpc_custom_socket* socket, int domain) with gil:
   sw = SocketWrapper()
@@ -267,7 +267,7 @@ cdef class ResolveWrapper:
     self.c_port = NULL
 
   def __dealloc__(self):
-    grpc_shutdown_blocking()
+    grpc_shutdown()
 
 cdef socket_resolve_async_cython(ResolveWrapper resolve_wrapper):
   try:
@@ -323,7 +323,7 @@ cdef class TimerWrapper:
     self.timer.stop()
 
   def __dealloc__(self):
-    grpc_shutdown_blocking()
+    grpc_shutdown()
 
 cdef void timer_start(grpc_custom_timer* t) with gil:
   timer = TimerWrapper(t.timeout_ms / 1000.0)
index 308d677..05db7e3 100644 (file)
@@ -137,7 +137,7 @@ cdef class CallDetails:
   def __dealloc__(self):
     with nogil:
       grpc_call_details_destroy(&self.c_details)
-    grpc_shutdown_blocking()
+    grpc_shutdown()
 
   @property
   def method(self):
index eff95c4..48014b6 100644 (file)
@@ -154,4 +154,4 @@ cdef class Server:
 
   def __dealloc__(self):
     if self.c_server == NULL:
-      grpc_shutdown_blocking()
+      grpc_shutdown()
index f5d0668..ec26a4f 100644 (file)
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc/_grpcio_metadata.py.template`!!!
 
-__version__ = """1.33.2"""
+__version__ = """1.34.0"""
index 587490d..f9482c0 100644 (file)
@@ -43,7 +43,7 @@ CORE_SOURCE_FILES = [
     'src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc',
     'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc',
     'src/core/ext/filters/client_channel/lb_policy/xds/eds.cc',
-    'src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc',
+    'src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc',
     'src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc',
     'src/core/ext/filters/client_channel/lb_policy_registry.cc',
     'src/core/ext/filters/client_channel/local_subchannel_pool.cc',
@@ -208,10 +208,91 @@ CORE_SOURCE_FILES = [
     'src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c',
     'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c',
     'src/core/ext/upb-generated/validate/validate.upb.c',
+    'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c',
+    'src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c',
+    'src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c',
+    'src/core/ext/upbdefs-generated/google/api/http.upbdefs.c',
+    'src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c',
+    'src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c',
+    'src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c',
+    'src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c',
+    'src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c',
+    'src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c',
+    'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c',
+    'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c',
+    'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c',
+    'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c',
+    'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c',
+    'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c',
+    'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c',
+    'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c',
+    'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c',
+    'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c',
+    'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c',
+    'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c',
+    'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c',
+    'src/core/ext/upbdefs-generated/validate/validate.upbdefs.c',
     'src/core/ext/xds/certificate_provider_registry.cc',
+    'src/core/ext/xds/certificate_provider_store.cc',
+    'src/core/ext/xds/file_watcher_certificate_provider_factory.cc',
     'src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc',
     'src/core/ext/xds/xds_api.cc',
     'src/core/ext/xds/xds_bootstrap.cc',
+    'src/core/ext/xds/xds_certificate_provider.cc',
     'src/core/ext/xds/xds_client.cc',
     'src/core/ext/xds/xds_client_stats.cc',
     'src/core/lib/avl/avl.cc',
@@ -269,10 +350,13 @@ CORE_SOURCE_FILES = [
     'src/core/lib/gpr/tmpfile_windows.cc',
     'src/core/lib/gpr/wrap_memcpy.cc',
     'src/core/lib/gprpp/arena.cc',
+    'src/core/lib/gprpp/examine_stack.cc',
     'src/core/lib/gprpp/fork.cc',
     'src/core/lib/gprpp/global_config_env.cc',
     'src/core/lib/gprpp/host_port.cc',
     'src/core/lib/gprpp/mpscq.cc',
+    'src/core/lib/gprpp/stat_posix.cc',
+    'src/core/lib/gprpp/stat_windows.cc',
     'src/core/lib/gprpp/thd_posix.cc',
     'src/core/lib/gprpp/thd_windows.cc',
     'src/core/lib/http/format_request.cc',
@@ -394,10 +478,15 @@ CORE_SOURCE_FILES = [
     'src/core/lib/security/credentials/composite/composite_credentials.cc',
     'src/core/lib/security/credentials/credentials.cc',
     'src/core/lib/security/credentials/credentials_metadata.cc',
+    'src/core/lib/security/credentials/external/aws_request_signer.cc',
+    'src/core/lib/security/credentials/external/external_account_credentials.cc',
+    'src/core/lib/security/credentials/external/file_external_account_credentials.cc',
+    'src/core/lib/security/credentials/external/url_external_account_credentials.cc',
     'src/core/lib/security/credentials/fake/fake_credentials.cc',
     'src/core/lib/security/credentials/google_default/credentials_generic.cc',
     'src/core/lib/security/credentials/google_default/google_default_credentials.cc',
     'src/core/lib/security/credentials/iam/iam_credentials.cc',
+    'src/core/lib/security/credentials/insecure/insecure_credentials.cc',
     'src/core/lib/security/credentials/jwt/json_token.cc',
     'src/core/lib/security/credentials/jwt/jwt_credentials.cc',
     'src/core/lib/security/credentials/jwt/jwt_verifier.cc',
@@ -406,11 +495,13 @@ CORE_SOURCE_FILES = [
     'src/core/lib/security/credentials/plugin/plugin_credentials.cc',
     'src/core/lib/security/credentials/ssl/ssl_credentials.cc',
     'src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc',
+    'src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc',
     'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc',
     'src/core/lib/security/credentials/tls/tls_credentials.cc',
     'src/core/lib/security/credentials/xds/xds_credentials.cc',
     'src/core/lib/security/security_connector/alts/alts_security_connector.cc',
     'src/core/lib/security/security_connector/fake/fake_security_connector.cc',
+    'src/core/lib/security/security_connector/insecure/insecure_security_connector.cc',
     'src/core/lib/security/security_connector/load_system_roots_fallback.cc',
     'src/core/lib/security/security_connector/load_system_roots_linux.cc',
     'src/core/lib/security/security_connector/local/local_security_connector.cc',
@@ -494,7 +585,6 @@ CORE_SOURCE_FILES = [
     'src/core/tsi/ssl_transport_security.cc',
     'src/core/tsi/transport_security.cc',
     'src/core/tsi/transport_security_grpc.cc',
-    'third_party/abseil-cpp/absl/base/dynamic_annotations.cc',
     'third_party/abseil-cpp/absl/base/internal/cycleclock.cc',
     'third_party/abseil-cpp/absl/base/internal/exponential_biased.cc',
     'third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc',
@@ -721,6 +811,7 @@ CORE_SOURCE_FILES = [
     'third_party/boringssl-with-bazel/src/crypto/thread_win.c',
     'third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c',
     'third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c',
+    'third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c',
     'third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c',
     'third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c',
     'third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c',
@@ -911,10 +1002,13 @@ CORE_SOURCE_FILES = [
     'third_party/re2/util/rune.cc',
     'third_party/re2/util/strutil.cc',
     'third_party/upb/upb/decode.c',
+    'third_party/upb/upb/def.c',
     'third_party/upb/upb/encode.c',
     'third_party/upb/upb/msg.c',
     'third_party/upb/upb/port.c',
+    'third_party/upb/upb/reflection.c',
     'third_party/upb/upb/table.c',
+    'third_party/upb/upb/text_encode.c',
     'third_party/upb/upb/upb.c',
     'third_party/zlib/adler32.c',
     'third_party/zlib/compress.c',
@@ -946,62 +1040,51 @@ ASM_SOURCE_FILES = {
         'third_party/boringssl-with-bazel/ios-aarch64/crypto/fipsmodule/vpaes-armv8.S',
         'third_party/boringssl-with-bazel/ios-aarch64/crypto/test/trampoline-armv8.S',
     ],
-    'crypto_mac_x86_64': [
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/chacha/chacha-x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/aesni-x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/ghash-x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/md5-x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/p256-x86_64-asm.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/rdrand-x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/rsaz-avx2.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/sha1-x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/sha256-x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/sha512-x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/vpaes-x86_64.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/x86_64-mont.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/x86_64-mont5.S',
-        'third_party/boringssl-with-bazel/mac-x86_64/crypto/test/trampoline-x86_64.S',
+    'crypto_ios_arm': [
+        'third_party/boringssl-with-bazel/ios-arm/crypto/chacha/chacha-armv4.S',
+        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/aesv8-armx32.S',
+        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/armv4-mont.S',
+        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/bsaes-armv7.S',
+        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/ghash-armv4.S',
+        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/ghashv8-armx32.S',
+        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/sha1-armv4-large.S',
+        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/sha256-armv4.S',
+        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/sha512-armv4.S',
+        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/vpaes-armv7.S',
+        'third_party/boringssl-with-bazel/ios-arm/crypto/test/trampoline-armv4.S',
     ],
-    'crypto_win_x86': [
-        'third_party/boringssl-with-bazel/win-x86/crypto/chacha/chacha-x86.asm',
-        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/aesni-x86.asm',
-        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/bn-586.asm',
-        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/co-586.asm',
-        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/ghash-ssse3-x86.asm',
-        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/ghash-x86.asm',
-        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/md5-586.asm',
-        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/sha1-586.asm',
-        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/sha256-586.asm',
-        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/sha512-586.asm',
-        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/vpaes-x86.asm',
-        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/x86-mont.asm',
-        'third_party/boringssl-with-bazel/win-x86/crypto/test/trampoline-x86.asm',
+    'crypto_linux_aarch64': [
+        'third_party/boringssl-with-bazel/linux-aarch64/crypto/chacha/chacha-armv8.S',
+        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S',
+        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/armv8-mont.S',
+        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S',
+        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S',
+        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/sha1-armv8.S',
+        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/sha256-armv8.S',
+        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/sha512-armv8.S',
+        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/vpaes-armv8.S',
+        'third_party/boringssl-with-bazel/linux-aarch64/crypto/test/trampoline-armv8.S',
+    ],
+    'crypto_linux_arm': [
+        'third_party/boringssl-with-bazel/linux-arm/crypto/chacha/chacha-armv4.S',
+        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/aesv8-armx32.S',
+        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/armv4-mont.S',
+        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/bsaes-armv7.S',
+        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/ghash-armv4.S',
+        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/ghashv8-armx32.S',
+        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/sha1-armv4-large.S',
+        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/sha256-armv4.S',
+        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/sha512-armv4.S',
+        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/vpaes-armv7.S',
+        'third_party/boringssl-with-bazel/linux-arm/crypto/test/trampoline-armv4.S',
+        'third_party/boringssl-with-bazel/src/crypto/curve25519/asm/x25519-asm-arm.S',
+        'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm_asm.S',
     ],
     'crypto_linux_ppc64le': [
         'third_party/boringssl-with-bazel/linux-ppc64le/crypto/fipsmodule/aesp8-ppc.S',
         'third_party/boringssl-with-bazel/linux-ppc64le/crypto/fipsmodule/ghashp8-ppc.S',
         'third_party/boringssl-with-bazel/linux-ppc64le/crypto/test/trampoline-ppc.S',
     ],
-    'crypto_mac_x86': [
-        'third_party/boringssl-with-bazel/mac-x86/crypto/chacha/chacha-x86.S',
-        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/aesni-x86.S',
-        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/bn-586.S',
-        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/co-586.S',
-        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/ghash-ssse3-x86.S',
-        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/ghash-x86.S',
-        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/md5-586.S',
-        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/sha1-586.S',
-        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/sha256-586.S',
-        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/sha512-586.S',
-        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/vpaes-x86.S',
-        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/x86-mont.S',
-        'third_party/boringssl-with-bazel/mac-x86/crypto/test/trampoline-x86.S',
-    ],
     'crypto_linux_x86': [
         'third_party/boringssl-with-bazel/linux-x86/crypto/chacha/chacha-x86.S',
         'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/aesni-x86.S',
@@ -1017,19 +1100,6 @@ ASM_SOURCE_FILES = {
         'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/x86-mont.S',
         'third_party/boringssl-with-bazel/linux-x86/crypto/test/trampoline-x86.S',
     ],
-    'crypto_ios_arm': [
-        'third_party/boringssl-with-bazel/ios-arm/crypto/chacha/chacha-armv4.S',
-        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/aesv8-armx32.S',
-        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/armv4-mont.S',
-        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/bsaes-armv7.S',
-        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/ghash-armv4.S',
-        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/ghashv8-armx32.S',
-        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/sha1-armv4-large.S',
-        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/sha256-armv4.S',
-        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/sha512-armv4.S',
-        'third_party/boringssl-with-bazel/ios-arm/crypto/fipsmodule/vpaes-armv7.S',
-        'third_party/boringssl-with-bazel/ios-arm/crypto/test/trampoline-armv4.S',
-    ],
     'crypto_linux_x86_64': [
         'third_party/boringssl-with-bazel/linux-x86_64/crypto/chacha/chacha-x86_64.S',
         'third_party/boringssl-with-bazel/linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S',
@@ -1052,6 +1122,57 @@ ASM_SOURCE_FILES = {
         'third_party/boringssl-with-bazel/linux-x86_64/crypto/test/trampoline-x86_64.S',
         'third_party/boringssl-with-bazel/src/crypto/hrss/asm/poly_rq_mul.S',
     ],
+    'crypto_mac_x86': [
+        'third_party/boringssl-with-bazel/mac-x86/crypto/chacha/chacha-x86.S',
+        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/aesni-x86.S',
+        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/bn-586.S',
+        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/co-586.S',
+        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/ghash-ssse3-x86.S',
+        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/ghash-x86.S',
+        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/md5-586.S',
+        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/sha1-586.S',
+        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/sha256-586.S',
+        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/sha512-586.S',
+        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/vpaes-x86.S',
+        'third_party/boringssl-with-bazel/mac-x86/crypto/fipsmodule/x86-mont.S',
+        'third_party/boringssl-with-bazel/mac-x86/crypto/test/trampoline-x86.S',
+    ],
+    'crypto_mac_x86_64': [
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/chacha/chacha-x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/aesni-x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/ghash-x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/md5-x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/p256-x86_64-asm.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/rdrand-x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/rsaz-avx2.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/sha1-x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/sha256-x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/sha512-x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/vpaes-x86_64.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/x86_64-mont.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/x86_64-mont5.S',
+        'third_party/boringssl-with-bazel/mac-x86_64/crypto/test/trampoline-x86_64.S',
+    ],
+    'crypto_win_x86': [
+        'third_party/boringssl-with-bazel/win-x86/crypto/chacha/chacha-x86.asm',
+        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/aesni-x86.asm',
+        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/bn-586.asm',
+        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/co-586.asm',
+        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/ghash-ssse3-x86.asm',
+        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/ghash-x86.asm',
+        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/md5-586.asm',
+        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/sha1-586.asm',
+        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/sha256-586.asm',
+        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/sha512-586.asm',
+        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/vpaes-x86.asm',
+        'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/x86-mont.asm',
+        'third_party/boringssl-with-bazel/win-x86/crypto/test/trampoline-x86.asm',
+    ],
     'crypto_win_x86_64': [
         'third_party/boringssl-with-bazel/win-x86_64/crypto/chacha/chacha-x86_64.asm',
         'third_party/boringssl-with-bazel/win-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.asm',
@@ -1073,31 +1194,4 @@ ASM_SOURCE_FILES = {
         'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/x86_64-mont5.asm',
         'third_party/boringssl-with-bazel/win-x86_64/crypto/test/trampoline-x86_64.asm',
     ],
-    'crypto_linux_aarch64': [
-        'third_party/boringssl-with-bazel/linux-aarch64/crypto/chacha/chacha-armv8.S',
-        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S',
-        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/armv8-mont.S',
-        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S',
-        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S',
-        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/sha1-armv8.S',
-        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/sha256-armv8.S',
-        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/sha512-armv8.S',
-        'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/vpaes-armv8.S',
-        'third_party/boringssl-with-bazel/linux-aarch64/crypto/test/trampoline-armv8.S',
-    ],
-    'crypto_linux_arm': [
-        'third_party/boringssl-with-bazel/linux-arm/crypto/chacha/chacha-armv4.S',
-        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/aesv8-armx32.S',
-        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/armv4-mont.S',
-        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/bsaes-armv7.S',
-        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/ghash-armv4.S',
-        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/ghashv8-armx32.S',
-        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/sha1-armv4-large.S',
-        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/sha256-armv4.S',
-        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/sha512-armv4.S',
-        'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/vpaes-armv7.S',
-        'third_party/boringssl-with-bazel/linux-arm/crypto/test/trampoline-armv4.S',
-        'third_party/boringssl-with-bazel/src/crypto/curve25519/asm/x25519-asm-arm.S',
-        'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm_asm.S',
-    ],
 }
index 9237f14..f0f9260 100644 (file)
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc_version.py.template`!!!
 
-VERSION = '1.33.2'
+VERSION = '1.34.0'
index 52cb1a9..5d6c098 100644 (file)
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_channelz/grpc_version.py.template`!!!
 
-VERSION = '1.33.2'
+VERSION = '1.34.0'
index f676be1..da98bb1 100644 (file)
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_health_checking/grpc_version.py.template`!!!
 
-VERSION = '1.33.2'
+VERSION = '1.34.0'
index 6765111..9e1d451 100644 (file)
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_reflection/grpc_version.py.template`!!!
 
-VERSION = '1.33.2'
+VERSION = '1.34.0'
index 2b6ec9c..e8b4daa 100644 (file)
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_status/grpc_version.py.template`!!!
 
-VERSION = '1.33.2'
+VERSION = '1.34.0'
index c042934..8a91836 100644 (file)
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_testing/grpc_version.py.template`!!!
 
-VERSION = '1.33.2'
+VERSION = '1.34.0'
index 219b336..6291be5 100644 (file)
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_tests/grpc_version.py.template`!!!
 
-VERSION = '1.33.2'
+VERSION = '1.34.0'
index 39da039..92546fc 100644 (file)
@@ -80,7 +80,7 @@ class CaptureFile(object):
       value (str): What to write to the original file.
     """
         if six.PY3 and not isinstance(value, six.binary_type):
-            value = bytes(value, 'ascii')
+            value = value.encode('ascii')
         if self._saved_fd is None:
             os.write(self._redirect_fd, value)
         else:
index e2eff25..7ff4751 100644 (file)
@@ -16,6 +16,7 @@
 import six
 import subprocess
 import sys
+import tempfile
 import threading
 import unittest
 from grpc._cython import cygrpc
@@ -69,15 +70,23 @@ class ForkInteropTest(unittest.TestCase):
             while True:
                 time.sleep(1)
         """
+        streams = tuple(tempfile.TemporaryFile() for _ in range(2))
         self._server_process = subprocess.Popen(
             [sys.executable, '-c', start_server_script],
-            stdout=subprocess.PIPE,
-            stderr=subprocess.PIPE)
+            stdout=streams[0],
+            stderr=streams[1])
         timer = threading.Timer(_SUBPROCESS_TIMEOUT_S,
                                 self._server_process.kill)
         try:
             timer.start()
-            self._port = int(self._server_process.stdout.readline())
+            while True:
+                streams[0].seek(0)
+                s = streams[0].readline()
+                if not s:
+                    continue
+                else:
+                    self._port = int(s)
+                    break
         except ValueError:
             raise Exception('Failed to get port from server')
         finally:
@@ -125,26 +134,22 @@ class ForkInteropTest(unittest.TestCase):
 
     def _verifyTestCase(self, test_case):
         script = _CLIENT_FORK_SCRIPT_TEMPLATE % (test_case.name, self._port)
+        streams = tuple(tempfile.TemporaryFile() for _ in range(2))
         process = subprocess.Popen([sys.executable, '-c', script],
-                                   stdout=subprocess.PIPE,
-                                   stderr=subprocess.PIPE)
+                                   stdout=streams[0],
+                                   stderr=streams[1])
         timer = threading.Timer(_SUBPROCESS_TIMEOUT_S, process.kill)
-        try:
-            timer.start()
-            try:
-                out, err = process.communicate(timeout=_SUBPROCESS_TIMEOUT_S)
-            except TypeError:
-                # The timeout parameter was added in Python 3.3.
-                out, err = process.communicate()
-        except subprocess.TimeoutExpired:
-            process.kill()
-            raise RuntimeError('Process failed to terminate')
-        finally:
-            timer.cancel()
+        timer.start()
+        process.wait()
+        timer.cancel()
+        outputs = []
+        for stream in streams:
+            stream.seek(0)
+            outputs.append(stream.read())
         self.assertEqual(
             0, process.returncode,
-            'process failed with exit code %d (stdout: %s, stderr: %s)' %
-            (process.returncode, out, err))
+            'process failed with exit code %d (stdout: "%s", stderr: "%s")' %
+            (process.returncode, outputs[0], outputs[1]))
 
 
 if __name__ == '__main__':
index 2123c69..3ccebcf 100644 (file)
@@ -142,7 +142,8 @@ class _ChildProcess(object):
                              self._process.exitcode)
         try:
             exception = self._exceptions.get(block=False)
-            raise ValueError('Child process failed: %s' % exception)
+            raise ValueError('Child process failed: "%s": "%s"' %
+                             (repr(exception), exception))
         except queue.Empty:
             pass
 
index 17835e7..29cd35e 100644 (file)
@@ -34,6 +34,8 @@ class GenericStub(object):
     def __init__(self, channel):
         self.UnaryCall = channel.unary_unary(
             '/grpc.testing.BenchmarkService/UnaryCall')
+        self.StreamingFromServer = channel.unary_stream(
+            '/grpc.testing.BenchmarkService/StreamingFromServer')
         self.StreamingCall = channel.stream_stream(
             '/grpc.testing.BenchmarkService/StreamingCall')
 
@@ -200,3 +202,43 @@ class StreamingSyncBenchmarkClient(BenchmarkClient):
             stream.stop()
         self._pool.shutdown(wait=True)
         self._stub = None
+
+
+class ServerStreamingSyncBenchmarkClient(BenchmarkClient):
+
+    def __init__(self, server, config, hist):
+        super(ServerStreamingSyncBenchmarkClient,
+              self).__init__(server, config, hist)
+        if config.outstanding_rpcs_per_channel == 1:
+            self._pool = None
+        else:
+            self._pool = futures.ThreadPoolExecutor(
+                max_workers=config.outstanding_rpcs_per_channel)
+        self._rpcs = []
+        self._sender = None
+
+    def send_request(self):
+        if self._pool is None:
+            self._sender = threading.Thread(
+                target=self._one_stream_streaming_rpc, daemon=True)
+            self._sender.start()
+        else:
+            self._pool.submit(self._one_stream_streaming_rpc)
+
+    def _one_stream_streaming_rpc(self):
+        response_stream = self._stub.StreamingFromServer(
+            self._request, _TIMEOUT)
+        self._rpcs.append(response_stream)
+        start_time = time.time()
+        for _ in response_stream:
+            self._handle_response(self, time.time() - start_time)
+            start_time = time.time()
+
+    def stop(self):
+        for call in self._rpcs:
+            call.cancel()
+        if self._sender is not None:
+            self._sender.join()
+        if self._pool is not None:
+            self._pool.shutdown(wait=False)
+        self._stub = None
index c5d299f..a031744 100644 (file)
@@ -67,12 +67,15 @@ class OpenLoopClientRunner(ClientRunner):
 
 class ClosedLoopClientRunner(ClientRunner):
 
-    def __init__(self, client, request_count):
+    def __init__(self, client, request_count, no_ping_pong):
         super(ClosedLoopClientRunner, self).__init__(client)
         self._is_running = False
         self._request_count = request_count
-        # Send a new request on each response for closed loop
-        self._client.add_response_callback(self._send_request)
+        # For server-streaming RPC, don't spawn new RPC after each responses.
+        # This yield at most ~17% for single RPC scenarios.
+        if not no_ping_pong:
+            # Send a new request on each response for closed loop
+            self._client.add_response_callback(self._send_request)
 
     def start(self):
         self._is_running = True
@@ -85,6 +88,6 @@ class ClosedLoopClientRunner(ClientRunner):
         self._client.stop()
         self._client = None
 
-    def _send_request(self, client, response_time):
+    def _send_request(self, client, unused_response_time):
         if self._is_running:
             client.send_request()
index a7e6928..de8eefb 100644 (file)
@@ -14,6 +14,7 @@
 """The entry point for the qps worker."""
 
 import argparse
+import logging
 import time
 
 import grpc
@@ -23,24 +24,33 @@ from tests.qps import worker_server
 from tests.unit import test_common
 
 
-def run_worker_server(port):
+def run_worker_server(driver_port, server_port):
     server = test_common.test_server()
-    servicer = worker_server.WorkerServer()
+    servicer = worker_server.WorkerServer(server_port)
     worker_service_pb2_grpc.add_WorkerServiceServicer_to_server(
         servicer, server)
-    server.add_insecure_port('[::]:{}'.format(port))
+    server.add_insecure_port('[::]:{}'.format(driver_port))
     server.start()
     servicer.wait_for_quit()
     server.stop(0)
 
 
 if __name__ == '__main__':
+    logging.basicConfig(level=logging.DEBUG)
     parser = argparse.ArgumentParser(
         description='gRPC Python performance testing worker')
-    parser.add_argument('--driver_port',
-                        type=int,
-                        dest='port',
-                        help='The port the worker should listen on')
+    parser.add_argument(
+        '--driver_port',
+        type=int,
+        dest='driver_port',
+        help='The port for the worker to expose for driver communication')
+    parser.add_argument(
+        '--server_port',
+        type=int,
+        default=None,
+        dest='server_port',
+        help='The port for the server if not specified by server config message'
+    )
     args = parser.parse_args()
 
-    run_worker_server(args.port)
+    run_worker_server(args.driver_port, args.server_port)
index 65b081e..327b8e3 100644 (file)
@@ -35,8 +35,9 @@ from tests.unit import test_common
 class WorkerServer(worker_service_pb2_grpc.WorkerServiceServicer):
     """Python Worker Server implementation."""
 
-    def __init__(self):
+    def __init__(self, server_port=None):
         self._quit_event = threading.Event()
+        self._server_port = server_port
 
     def RunServer(self, request_iterator, context):
         config = next(request_iterator).setup  #pylint: disable=stop-iteration-return
@@ -91,13 +92,18 @@ class WorkerServer(worker_service_pb2_grpc.WorkerServiceServicer):
             raise Exception('Unsupported server type {}'.format(
                 config.server_type))
 
+        if self._server_port is not None and config.port == 0:
+            server_port = self._server_port
+        else:
+            server_port = config.port
+
         if config.HasField('security_params'):  # Use SSL
             server_creds = grpc.ssl_server_credentials(
                 ((resources.private_key(), resources.certificate_chain()),))
-            port = server.add_secure_port('[::]:{}'.format(config.port),
+            port = server.add_secure_port('[::]:{}'.format(server_port),
                                           server_creds)
         else:
-            port = server.add_insecure_port('[::]:{}'.format(config.port))
+            port = server.add_insecure_port('[::]:{}'.format(server_port))
 
         return (server, port)
 
@@ -142,6 +148,7 @@ class WorkerServer(worker_service_pb2_grpc.WorkerServiceServicer):
         return control_pb2.ClientStatus(stats=stats)
 
     def _create_client_runner(self, server, config, qps_data):
+        no_ping_pong = False
         if config.client_type == control_pb2.SYNC_CLIENT:
             if config.rpc_type == control_pb2.UNARY:
                 client = benchmark_client.UnarySyncBenchmarkClient(
@@ -149,6 +156,10 @@ class WorkerServer(worker_service_pb2_grpc.WorkerServiceServicer):
             elif config.rpc_type == control_pb2.STREAMING:
                 client = benchmark_client.StreamingSyncBenchmarkClient(
                     server, config, qps_data)
+            elif config.rpc_type == control_pb2.STREAMING_FROM_SERVER:
+                no_ping_pong = True
+                client = benchmark_client.ServerStreamingSyncBenchmarkClient(
+                    server, config, qps_data)
         elif config.client_type == control_pb2.ASYNC_CLIENT:
             if config.rpc_type == control_pb2.UNARY:
                 client = benchmark_client.UnaryAsyncBenchmarkClient(
@@ -163,7 +174,7 @@ class WorkerServer(worker_service_pb2_grpc.WorkerServiceServicer):
         load_factor = float(config.client_channels)
         if config.load_params.WhichOneof('load') == 'closed_loop':
             runner = client_runner.ClosedLoopClientRunner(
-                client, config.outstanding_rpcs_per_channel)
+                client, config.outstanding_rpcs_per_channel, no_ping_pong)
         else:  # Open loop Poisson
             alpha = config.load_params.poisson.offered_load / load_factor
 
index 909ced2..9969729 100644 (file)
@@ -125,6 +125,7 @@ py2and3_test(
     srcs = ["_dynamic_stubs_test.py"],
     data = [
         "data/foo/bar.proto",
+        "data/foo/bar_with_wkt.proto",
     ],
     imports = ["../../"],
     main = "_dynamic_stubs_test.py",
index 6a4387c..4645f0b 100644 (file)
@@ -21,6 +21,8 @@ import os
 import sys
 import unittest
 
+_DATA_DIR = os.path.join("tests", "unit", "data")
+
 
 @contextlib.contextmanager
 def _grpc_tools_unimportable():
@@ -53,6 +55,18 @@ def _collect_errors(fn):
     return _wrapped
 
 
+def _python3_check(fn):
+
+    @functools.wraps(fn)
+    def _wrapped():
+        if sys.version_info[0] == 3:
+            fn()
+        else:
+            _assert_unimplemented("Python 3")
+
+    return _wrapped
+
+
 def _run_in_subprocess(test_case):
     sys.path.insert(
         0, os.path.join(os.path.realpath(os.path.dirname(__file__)), ".."))
@@ -80,24 +94,30 @@ def _assert_unimplemented(msg_substr):
 
 
 @_collect_errors
+@_python3_check
 def _test_sunny_day():
-    if sys.version_info[0] == 3:
-        import grpc
-        protos, services = grpc.protos_and_services(
-            os.path.join("tests", "unit", "data", "foo", "bar.proto"))
-        assert protos.BarMessage is not None
-        assert services.BarStub is not None
-    else:
-        _assert_unimplemented("Python 3")
+    import grpc
+    protos, services = grpc.protos_and_services(
+        os.path.join(_DATA_DIR, "foo", "bar.proto"))
+    assert protos.BarMessage is not None
+    assert services.BarStub is not None
 
 
 @_collect_errors
+@_python3_check
+def _test_well_known_types():
+    import grpc
+    protos, services = grpc.protos_and_services(
+        os.path.join(_DATA_DIR, "foo", "bar_with_wkt.proto"))
+    assert protos.BarMessage is not None
+    assert services.BarStub is not None
+
+
+@_collect_errors
+@_python3_check
 def _test_grpc_tools_unimportable():
     with _grpc_tools_unimportable():
-        if sys.version_info[0] == 3:
-            _assert_unimplemented("grpcio-tools")
-        else:
-            _assert_unimplemented("Python 3")
+        _assert_unimplemented("grpcio-tools")
 
 
 # NOTE(rbellevi): multiprocessing.Process fails to pickle function objects
@@ -109,6 +129,9 @@ class DynamicStubTest(unittest.TestCase):
     def test_sunny_day(self):
         _run_in_subprocess(_test_sunny_day)
 
+    def test_well_known_types(self):
+        _run_in_subprocess(_test_well_known_types)
+
     def test_grpc_tools_unimportable(self):
         _run_in_subprocess(_test_grpc_tools_unimportable)
 
diff --git a/src/python/grpcio_tests/tests/unit/data/foo/bar_with_wkt.proto b/src/python/grpcio_tests/tests/unit/data/foo/bar_with_wkt.proto
new file mode 100644 (file)
index 0000000..2fd1f43
--- /dev/null
@@ -0,0 +1,28 @@
+// Copyright 2020 The gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package tests.unit.data.foo.bar;
+
+import "google/protobuf/any.proto";
+
+message BarMessage {
+  string a = 1;
+  google.protobuf.Any b = 2;
+};
+
+service Bar {
+  rpc GetBar(BarMessage) returns (BarMessage);
+};
index 51a046c..1f925ba 100644 (file)
@@ -33,6 +33,8 @@ class GenericStub(object):
     def __init__(self, channel: aio.Channel):
         self.UnaryCall = channel.unary_unary(
             '/grpc.testing.BenchmarkService/UnaryCall')
+        self.StreamingFromServer = channel.unary_stream(
+            '/grpc.testing.BenchmarkService/StreamingFromServer')
         self.StreamingCall = channel.stream_stream(
             '/grpc.testing.BenchmarkService/StreamingCall')
 
@@ -153,3 +155,32 @@ class StreamingAsyncBenchmarkClient(BenchmarkClient):
         self._running = False
         await self._stopped.wait()
         await super().stop()
+
+
+class ServerStreamingAsyncBenchmarkClient(BenchmarkClient):
+
+    def __init__(self, address: str, config: control_pb2.ClientConfig,
+                 hist: histogram.Histogram):
+        super().__init__(address, config, hist)
+        self._running = None
+        self._stopped = asyncio.Event()
+
+    async def _one_server_streaming_call(self):
+        call = self._stub.StreamingFromServer(self._request)
+        while self._running:
+            start_time = time.time()
+            await call.read()
+            self._record_query_time(time.time() - start_time)
+
+    async def run(self):
+        await super().run()
+        self._running = True
+        senders = (
+            self._one_server_streaming_call() for _ in range(self._concurrency))
+        await asyncio.gather(*senders)
+        self._stopped.set()
+
+    async def stop(self):
+        self._running = False
+        await self._stopped.wait()
+        await super().stop()
index 4f80095..4c2e9d6 100644 (file)
@@ -133,6 +133,8 @@ def _create_client(server: str, config: control_pb2.ClientConfig,
             client_type = benchmark_client.UnaryAsyncBenchmarkClient
         elif config.rpc_type == control_pb2.STREAMING:
             client_type = benchmark_client.StreamingAsyncBenchmarkClient
+        elif config.rpc_type == control_pb2.STREAMING_FROM_SERVER:
+            client_type = benchmark_client.ServerStreamingAsyncBenchmarkClient
         else:
             raise NotImplementedError(
                 f'Unsupported rpc_type [{config.rpc_type}]')
index bdb1f7b..cd66a13 100755 (executable)
@@ -14,7 +14,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import print_function
 import os
 import sys
 import glob
index 76b1468..2d99936 100644 (file)
@@ -22,7 +22,7 @@ grpc_root = File.expand_path(File.join(File.dirname(__FILE__), '../../../..'))
 
 grpc_config = ENV['GRPC_CONFIG'] || 'opt'
 
-ENV['MACOSX_DEPLOYMENT_TARGET'] = '10.7'
+ENV['MACOSX_DEPLOYMENT_TARGET'] = '10.10'
 
 if ENV['AR'].nil? || ENV['AR'].size == 0
     ENV['AR'] = RbConfig::CONFIG['AR']
index 78d5740..9024a8e 100644 (file)
@@ -158,18 +158,22 @@ grpc_alts_credentials_create_type grpc_alts_credentials_create_import;
 grpc_alts_server_credentials_create_type grpc_alts_server_credentials_create_import;
 grpc_local_credentials_create_type grpc_local_credentials_create_import;
 grpc_local_server_credentials_create_type grpc_local_server_credentials_create_import;
+grpc_tls_identity_pairs_create_type grpc_tls_identity_pairs_create_import;
+grpc_tls_identity_pairs_add_pair_type grpc_tls_identity_pairs_add_pair_import;
+grpc_tls_identity_pairs_destroy_type grpc_tls_identity_pairs_destroy_import;
+grpc_tls_certificate_provider_static_data_create_type grpc_tls_certificate_provider_static_data_create_import;
+grpc_tls_certificate_provider_release_type grpc_tls_certificate_provider_release_import;
 grpc_tls_credentials_options_create_type grpc_tls_credentials_options_create_import;
 grpc_tls_credentials_options_set_cert_request_type_type grpc_tls_credentials_options_set_cert_request_type_import;
 grpc_tls_credentials_options_set_server_verification_option_type grpc_tls_credentials_options_set_server_verification_option_import;
-grpc_tls_credentials_options_set_key_materials_config_type grpc_tls_credentials_options_set_key_materials_config_import;
-grpc_tls_credentials_options_set_credential_reload_config_type grpc_tls_credentials_options_set_credential_reload_config_import;
+grpc_tls_credentials_options_set_certificate_provider_type grpc_tls_credentials_options_set_certificate_provider_import;
+grpc_tls_credentials_options_watch_root_certs_type grpc_tls_credentials_options_watch_root_certs_import;
+grpc_tls_credentials_options_set_root_cert_name_type grpc_tls_credentials_options_set_root_cert_name_import;
+grpc_tls_credentials_options_watch_identity_key_cert_pairs_type grpc_tls_credentials_options_watch_identity_key_cert_pairs_import;
+grpc_tls_credentials_options_set_identity_cert_name_type grpc_tls_credentials_options_set_identity_cert_name_import;
 grpc_tls_credentials_options_set_server_authorization_check_config_type grpc_tls_credentials_options_set_server_authorization_check_config_import;
-grpc_tls_key_materials_config_create_type grpc_tls_key_materials_config_create_import;
-grpc_tls_key_materials_config_set_key_materials_type grpc_tls_key_materials_config_set_key_materials_import;
-grpc_tls_key_materials_config_set_version_type grpc_tls_key_materials_config_set_version_import;
-grpc_tls_key_materials_config_get_version_type grpc_tls_key_materials_config_get_version_import;
-grpc_tls_credential_reload_config_create_type grpc_tls_credential_reload_config_create_import;
 grpc_tls_server_authorization_check_config_create_type grpc_tls_server_authorization_check_config_create_import;
+grpc_tls_server_authorization_check_config_release_type grpc_tls_server_authorization_check_config_release_import;
 grpc_xds_credentials_create_type grpc_xds_credentials_create_import;
 grpc_raw_byte_buffer_create_type grpc_raw_byte_buffer_create_import;
 grpc_raw_compressed_byte_buffer_create_type grpc_raw_compressed_byte_buffer_create_import;
@@ -432,18 +436,22 @@ void grpc_rb_load_imports(HMODULE library) {
   grpc_alts_server_credentials_create_import = (grpc_alts_server_credentials_create_type) GetProcAddress(library, "grpc_alts_server_credentials_create");
   grpc_local_credentials_create_import = (grpc_local_credentials_create_type) GetProcAddress(library, "grpc_local_credentials_create");
   grpc_local_server_credentials_create_import = (grpc_local_server_credentials_create_type) GetProcAddress(library, "grpc_local_server_credentials_create");
+  grpc_tls_identity_pairs_create_import = (grpc_tls_identity_pairs_create_type) GetProcAddress(library, "grpc_tls_identity_pairs_create");
+  grpc_tls_identity_pairs_add_pair_import = (grpc_tls_identity_pairs_add_pair_type) GetProcAddress(library, "grpc_tls_identity_pairs_add_pair");
+  grpc_tls_identity_pairs_destroy_import = (grpc_tls_identity_pairs_destroy_type) GetProcAddress(library, "grpc_tls_identity_pairs_destroy");
+  grpc_tls_certificate_provider_static_data_create_import = (grpc_tls_certificate_provider_static_data_create_type) GetProcAddress(library, "grpc_tls_certificate_provider_static_data_create");
+  grpc_tls_certificate_provider_release_import = (grpc_tls_certificate_provider_release_type) GetProcAddress(library, "grpc_tls_certificate_provider_release");
   grpc_tls_credentials_options_create_import = (grpc_tls_credentials_options_create_type) GetProcAddress(library, "grpc_tls_credentials_options_create");
   grpc_tls_credentials_options_set_cert_request_type_import = (grpc_tls_credentials_options_set_cert_request_type_type) GetProcAddress(library, "grpc_tls_credentials_options_set_cert_request_type");
   grpc_tls_credentials_options_set_server_verification_option_import = (grpc_tls_credentials_options_set_server_verification_option_type) GetProcAddress(library, "grpc_tls_credentials_options_set_server_verification_option");
-  grpc_tls_credentials_options_set_key_materials_config_import = (grpc_tls_credentials_options_set_key_materials_config_type) GetProcAddress(library, "grpc_tls_credentials_options_set_key_materials_config");
-  grpc_tls_credentials_options_set_credential_reload_config_import = (grpc_tls_credentials_options_set_credential_reload_config_type) GetProcAddress(library, "grpc_tls_credentials_options_set_credential_reload_config");
+  grpc_tls_credentials_options_set_certificate_provider_import = (grpc_tls_credentials_options_set_certificate_provider_type) GetProcAddress(library, "grpc_tls_credentials_options_set_certificate_provider");
+  grpc_tls_credentials_options_watch_root_certs_import = (grpc_tls_credentials_options_watch_root_certs_type) GetProcAddress(library, "grpc_tls_credentials_options_watch_root_certs");
+  grpc_tls_credentials_options_set_root_cert_name_import = (grpc_tls_credentials_options_set_root_cert_name_type) GetProcAddress(library, "grpc_tls_credentials_options_set_root_cert_name");
+  grpc_tls_credentials_options_watch_identity_key_cert_pairs_import = (grpc_tls_credentials_options_watch_identity_key_cert_pairs_type) GetProcAddress(library, "grpc_tls_credentials_options_watch_identity_key_cert_pairs");
+  grpc_tls_credentials_options_set_identity_cert_name_import = (grpc_tls_credentials_options_set_identity_cert_name_type) GetProcAddress(library, "grpc_tls_credentials_options_set_identity_cert_name");
   grpc_tls_credentials_options_set_server_authorization_check_config_import = (grpc_tls_credentials_options_set_server_authorization_check_config_type) GetProcAddress(library, "grpc_tls_credentials_options_set_server_authorization_check_config");
-  grpc_tls_key_materials_config_create_import = (grpc_tls_key_materials_config_create_type) GetProcAddress(library, "grpc_tls_key_materials_config_create");
-  grpc_tls_key_materials_config_set_key_materials_import = (grpc_tls_key_materials_config_set_key_materials_type) GetProcAddress(library, "grpc_tls_key_materials_config_set_key_materials");
-  grpc_tls_key_materials_config_set_version_import = (grpc_tls_key_materials_config_set_version_type) GetProcAddress(library, "grpc_tls_key_materials_config_set_version");
-  grpc_tls_key_materials_config_get_version_import = (grpc_tls_key_materials_config_get_version_type) GetProcAddress(library, "grpc_tls_key_materials_config_get_version");
-  grpc_tls_credential_reload_config_create_import = (grpc_tls_credential_reload_config_create_type) GetProcAddress(library, "grpc_tls_credential_reload_config_create");
   grpc_tls_server_authorization_check_config_create_import = (grpc_tls_server_authorization_check_config_create_type) GetProcAddress(library, "grpc_tls_server_authorization_check_config_create");
+  grpc_tls_server_authorization_check_config_release_import = (grpc_tls_server_authorization_check_config_release_type) GetProcAddress(library, "grpc_tls_server_authorization_check_config_release");
   grpc_xds_credentials_create_import = (grpc_xds_credentials_create_type) GetProcAddress(library, "grpc_xds_credentials_create");
   grpc_raw_byte_buffer_create_import = (grpc_raw_byte_buffer_create_type) GetProcAddress(library, "grpc_raw_byte_buffer_create");
   grpc_raw_compressed_byte_buffer_create_import = (grpc_raw_compressed_byte_buffer_create_type) GetProcAddress(library, "grpc_raw_compressed_byte_buffer_create");
index 91f0606..1079e42 100644 (file)
@@ -449,42 +449,54 @@ extern grpc_local_credentials_create_type grpc_local_credentials_create_import;
 typedef grpc_server_credentials*(*grpc_local_server_credentials_create_type)(grpc_local_connect_type type);
 extern grpc_local_server_credentials_create_type grpc_local_server_credentials_create_import;
 #define grpc_local_server_credentials_create grpc_local_server_credentials_create_import
+typedef grpc_tls_identity_pairs*(*grpc_tls_identity_pairs_create_type)();
+extern grpc_tls_identity_pairs_create_type grpc_tls_identity_pairs_create_import;
+#define grpc_tls_identity_pairs_create grpc_tls_identity_pairs_create_import
+typedef void(*grpc_tls_identity_pairs_add_pair_type)(grpc_tls_identity_pairs* pairs, const char* private_key, const char* cert_chain);
+extern grpc_tls_identity_pairs_add_pair_type grpc_tls_identity_pairs_add_pair_import;
+#define grpc_tls_identity_pairs_add_pair grpc_tls_identity_pairs_add_pair_import
+typedef void(*grpc_tls_identity_pairs_destroy_type)(grpc_tls_identity_pairs* pairs);
+extern grpc_tls_identity_pairs_destroy_type grpc_tls_identity_pairs_destroy_import;
+#define grpc_tls_identity_pairs_destroy grpc_tls_identity_pairs_destroy_import
+typedef grpc_tls_certificate_provider*(*grpc_tls_certificate_provider_static_data_create_type)(const char* root_certificate, grpc_tls_identity_pairs* pem_key_cert_pairs);
+extern grpc_tls_certificate_provider_static_data_create_type grpc_tls_certificate_provider_static_data_create_import;
+#define grpc_tls_certificate_provider_static_data_create grpc_tls_certificate_provider_static_data_create_import
+typedef void(*grpc_tls_certificate_provider_release_type)(grpc_tls_certificate_provider* provider);
+extern grpc_tls_certificate_provider_release_type grpc_tls_certificate_provider_release_import;
+#define grpc_tls_certificate_provider_release grpc_tls_certificate_provider_release_import
 typedef grpc_tls_credentials_options*(*grpc_tls_credentials_options_create_type)(void);
 extern grpc_tls_credentials_options_create_type grpc_tls_credentials_options_create_import;
 #define grpc_tls_credentials_options_create grpc_tls_credentials_options_create_import
-typedef int(*grpc_tls_credentials_options_set_cert_request_type_type)(grpc_tls_credentials_options* options, grpc_ssl_client_certificate_request_type type);
+typedef void(*grpc_tls_credentials_options_set_cert_request_type_type)(grpc_tls_credentials_options* options, grpc_ssl_client_certificate_request_type type);
 extern grpc_tls_credentials_options_set_cert_request_type_type grpc_tls_credentials_options_set_cert_request_type_import;
 #define grpc_tls_credentials_options_set_cert_request_type grpc_tls_credentials_options_set_cert_request_type_import
-typedef int(*grpc_tls_credentials_options_set_server_verification_option_type)(grpc_tls_credentials_options* options, grpc_tls_server_verification_option server_verification_option);
+typedef void(*grpc_tls_credentials_options_set_server_verification_option_type)(grpc_tls_credentials_options* options, grpc_tls_server_verification_option server_verification_option);
 extern grpc_tls_credentials_options_set_server_verification_option_type grpc_tls_credentials_options_set_server_verification_option_import;
 #define grpc_tls_credentials_options_set_server_verification_option grpc_tls_credentials_options_set_server_verification_option_import
-typedef int(*grpc_tls_credentials_options_set_key_materials_config_type)(grpc_tls_credentials_options* options, grpc_tls_key_materials_config* config);
-extern grpc_tls_credentials_options_set_key_materials_config_type grpc_tls_credentials_options_set_key_materials_config_import;
-#define grpc_tls_credentials_options_set_key_materials_config grpc_tls_credentials_options_set_key_materials_config_import
-typedef int(*grpc_tls_credentials_options_set_credential_reload_config_type)(grpc_tls_credentials_options* options, grpc_tls_credential_reload_config* config);
-extern grpc_tls_credentials_options_set_credential_reload_config_type grpc_tls_credentials_options_set_credential_reload_config_import;
-#define grpc_tls_credentials_options_set_credential_reload_config grpc_tls_credentials_options_set_credential_reload_config_import
-typedef int(*grpc_tls_credentials_options_set_server_authorization_check_config_type)(grpc_tls_credentials_options* options, grpc_tls_server_authorization_check_config* config);
+typedef void(*grpc_tls_credentials_options_set_certificate_provider_type)(grpc_tls_credentials_options* options, grpc_tls_certificate_provider* provider);
+extern grpc_tls_credentials_options_set_certificate_provider_type grpc_tls_credentials_options_set_certificate_provider_import;
+#define grpc_tls_credentials_options_set_certificate_provider grpc_tls_credentials_options_set_certificate_provider_import
+typedef void(*grpc_tls_credentials_options_watch_root_certs_type)(grpc_tls_credentials_options* options);
+extern grpc_tls_credentials_options_watch_root_certs_type grpc_tls_credentials_options_watch_root_certs_import;
+#define grpc_tls_credentials_options_watch_root_certs grpc_tls_credentials_options_watch_root_certs_import
+typedef void(*grpc_tls_credentials_options_set_root_cert_name_type)(grpc_tls_credentials_options* options, const char* root_cert_name);
+extern grpc_tls_credentials_options_set_root_cert_name_type grpc_tls_credentials_options_set_root_cert_name_import;
+#define grpc_tls_credentials_options_set_root_cert_name grpc_tls_credentials_options_set_root_cert_name_import
+typedef void(*grpc_tls_credentials_options_watch_identity_key_cert_pairs_type)(grpc_tls_credentials_options* options);
+extern grpc_tls_credentials_options_watch_identity_key_cert_pairs_type grpc_tls_credentials_options_watch_identity_key_cert_pairs_import;
+#define grpc_tls_credentials_options_watch_identity_key_cert_pairs grpc_tls_credentials_options_watch_identity_key_cert_pairs_import
+typedef void(*grpc_tls_credentials_options_set_identity_cert_name_type)(grpc_tls_credentials_options* options, const char* identity_cert_name);
+extern grpc_tls_credentials_options_set_identity_cert_name_type grpc_tls_credentials_options_set_identity_cert_name_import;
+#define grpc_tls_credentials_options_set_identity_cert_name grpc_tls_credentials_options_set_identity_cert_name_import
+typedef void(*grpc_tls_credentials_options_set_server_authorization_check_config_type)(grpc_tls_credentials_options* options, grpc_tls_server_authorization_check_config* config);
 extern grpc_tls_credentials_options_set_server_authorization_check_config_type grpc_tls_credentials_options_set_server_authorization_check_config_import;
 #define grpc_tls_credentials_options_set_server_authorization_check_config grpc_tls_credentials_options_set_server_authorization_check_config_import
-typedef grpc_tls_key_materials_config*(*grpc_tls_key_materials_config_create_type)(void);
-extern grpc_tls_key_materials_config_create_type grpc_tls_key_materials_config_create_import;
-#define grpc_tls_key_materials_config_create grpc_tls_key_materials_config_create_import
-typedef int(*grpc_tls_key_materials_config_set_key_materials_type)(grpc_tls_key_materials_config* config, const char* pem_root_certs, const grpc_ssl_pem_key_cert_pair** pem_key_cert_pairs, size_t num_key_cert_pairs);
-extern grpc_tls_key_materials_config_set_key_materials_type grpc_tls_key_materials_config_set_key_materials_import;
-#define grpc_tls_key_materials_config_set_key_materials grpc_tls_key_materials_config_set_key_materials_import
-typedef int(*grpc_tls_key_materials_config_set_version_type)(grpc_tls_key_materials_config* config, int version);
-extern grpc_tls_key_materials_config_set_version_type grpc_tls_key_materials_config_set_version_import;
-#define grpc_tls_key_materials_config_set_version grpc_tls_key_materials_config_set_version_import
-typedef int(*grpc_tls_key_materials_config_get_version_type)(grpc_tls_key_materials_config* config);
-extern grpc_tls_key_materials_config_get_version_type grpc_tls_key_materials_config_get_version_import;
-#define grpc_tls_key_materials_config_get_version grpc_tls_key_materials_config_get_version_import
-typedef grpc_tls_credential_reload_config*(*grpc_tls_credential_reload_config_create_type)(const void* config_user_data, int (*schedule)(void* config_user_data, grpc_tls_credential_reload_arg* arg), void (*cancel)(void* config_user_data, grpc_tls_credential_reload_arg* arg), void (*destruct)(void* config_user_data));
-extern grpc_tls_credential_reload_config_create_type grpc_tls_credential_reload_config_create_import;
-#define grpc_tls_credential_reload_config_create grpc_tls_credential_reload_config_create_import
 typedef grpc_tls_server_authorization_check_config*(*grpc_tls_server_authorization_check_config_create_type)(const void* config_user_data, int (*schedule)(void* config_user_data, grpc_tls_server_authorization_check_arg* arg), void (*cancel)(void* config_user_data, grpc_tls_server_authorization_check_arg* arg), void (*destruct)(void* config_user_data));
 extern grpc_tls_server_authorization_check_config_create_type grpc_tls_server_authorization_check_config_create_import;
 #define grpc_tls_server_authorization_check_config_create grpc_tls_server_authorization_check_config_create_import
+typedef void(*grpc_tls_server_authorization_check_config_release_type)(grpc_tls_server_authorization_check_config* config);
+extern grpc_tls_server_authorization_check_config_release_type grpc_tls_server_authorization_check_config_release_import;
+#define grpc_tls_server_authorization_check_config_release grpc_tls_server_authorization_check_config_release_import
 typedef grpc_channel_credentials*(*grpc_xds_credentials_create_type)(grpc_channel_credentials* fallback_credentials);
 extern grpc_xds_credentials_create_type grpc_xds_credentials_create_import;
 #define grpc_xds_credentials_create grpc_xds_credentials_create_import
index 1de7f63..319b760 100644 (file)
@@ -14,5 +14,5 @@
 
 # GRPC contains the General RPC module.
 module GRPC
-  VERSION = '1.33.2'
+  VERSION = '1.34.0'
 end
index c81535b..7e52e6e 100644 (file)
@@ -14,6 +14,6 @@
 
 module GRPC
   module Tools
-    VERSION = '1.33.2'
+    VERSION = '1.34.0'
   end
 end
index 2816bd4..3bbc44c 100755 (executable)
@@ -16,7 +16,6 @@
 
 # TODO: This should ideally be in upb submodule to avoid hardcoding this here.
 
-from __future__ import print_function
 import re
 import os
 import sys
@@ -36,6 +35,23 @@ try:
             "third_party/upb/upb/port.c",
             "third_party/upb/upb/table.c",
             "third_party/upb/upb/upb.c",
+            "third_party/upb/upb/def.c",
+            "third_party/upb/upb/reflection.c",
+            "third_party/upb/upb/text_encode.c",
+            "src/core/ext/upb-generated/google/protobuf/any.upb.c",
+            "src/core/ext/upb-generated/google/protobuf/descriptor.upb.c",
+            "src/core/ext/upb-generated/google/protobuf/duration.upb.c",
+            "src/core/ext/upb-generated/google/protobuf/empty.upb.c",
+            "src/core/ext/upb-generated/google/protobuf/struct.upb.c",
+            "src/core/ext/upb-generated/google/protobuf/timestamp.upb.c",
+            "src/core/ext/upb-generated/google/protobuf/wrappers.upb.c",
+            "src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c",
+            "src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c",
+            "src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c",
+            "src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c",
+            "src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c",
+            "src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c",
+            "src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c",
         ],
         'headers': [
             "third_party/upb/upb/decode.h",
@@ -46,6 +62,24 @@ try:
             "third_party/upb/upb/table.int.h",
             "third_party/upb/upb/upb.h",
             "third_party/upb/upb/upb.hpp",
+            "third_party/upb/upb/def.h",
+            "third_party/upb/upb/def.hpp",
+            "third_party/upb/upb/reflection.h",
+            "third_party/upb/upb/text_encode.h",
+            "src/core/ext/upb-generated/google/protobuf/any.upb.h",
+            "src/core/ext/upb-generated/google/protobuf/descriptor.upb.h",
+            "src/core/ext/upb-generated/google/protobuf/duration.upb.h",
+            "src/core/ext/upb-generated/google/protobuf/empty.upb.h",
+            "src/core/ext/upb-generated/google/protobuf/struct.upb.h",
+            "src/core/ext/upb-generated/google/protobuf/timestamp.upb.h",
+            "src/core/ext/upb-generated/google/protobuf/wrappers.upb.h",
+            "src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h",
+            "src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h",
+            "src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h",
+            "src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h",
+            "src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h",
+            "src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h",
+            "src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h",
         ],
         'secure': False,
     }]
index a27d8c0..c58ff8a 100755 (executable)
@@ -58,4 +58,4 @@ try:
 except:
     pass
 
-print yaml.dump(out)
+print(yaml.dump(out))
index f7db0fd..022f52b 100644 (file)
@@ -71,8 +71,6 @@
         deps.append(get_absl_dep(d))
       else:
         deps.append(d)
-    if (target_dict.build == 'test' or target_dict.build == 'private') and target_dict.language == 'c++':
-      deps.append("${_gRPC_GFLAGS_LIBRARIES}")
     return deps
 
   def get_platforms_condition_begin(platforms):
   set_property(CACHE gRPC_PROTOBUF_PACKAGE_TYPE PROPERTY STRINGS "CONFIG" "MODULE")
 
   if(gRPC_BUILD_TESTS)
-    set(gRPC_GFLAGS_PROVIDER "module" CACHE STRING "Provider of gflags library")
-    set_property(CACHE gRPC_GFLAGS_PROVIDER PROPERTY STRINGS "module" "package")
-
     set(gRPC_BENCHMARK_PROVIDER "module" CACHE STRING "Provider of benchmark library")
     set_property(CACHE gRPC_BENCHMARK_PROVIDER PROPERTY STRINGS "module" "package")
   else()
-    set(gRPC_GFLAGS_PROVIDER "none")
     set(gRPC_BENCHMARK_PROVIDER "none")
   endif()
 
   if(gRPC_BACKWARDS_COMPATIBILITY_MODE)
     add_definitions(-DGPR_BACKWARDS_COMPATIBILITY_MODE)
     if(_gRPC_PLATFORM_MAC)
-      # some C++11 constructs not supported before OS X 10.9
-      set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9)
+      # some C++11 constructs not supported before OS X 10.10
+      set(CMAKE_OSX_DEPLOYMENT_TARGET 10.10)
     endif()
   endif()
 
   include(cmake/address_sorting.cmake)
   include(cmake/benchmark.cmake)
   include(cmake/cares.cmake)
-  include(cmake/gflags.cmake)
   include(cmake/protobuf.cmake)
   include(cmake/re2.cmake)
   include(cmake/ssl.cmake)
index b9999a6..50f5d42 100644 (file)
 
   # Configurations (as defined under "configs" section in build_handwritten.yaml)
 
-  % for name, args in configs.iteritems():
+  % for name, args in configs.items():
   VALID_CONFIG_${name} = 1
   %  if args.get('compile_the_world', False):
   REQUIRE_CUSTOM_LIBRARIES_${name} = 1
   LIB${lib.name.upper()}_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIB${lib.name.upper()}_SRC))))
 
   % if lib.get('defaults', None):
-  %  for name, value in defaults.get(lib.defaults).iteritems():
+  %  for name, value in defaults.get(lib.defaults).items():
   $(LIB${lib.name.upper()}_OBJS): ${name} += ${value}
   %  endfor
   % endif
   % endif
 
   % if tgt.get('defaults', None):
-  %  for name, value in defaults.get(tgt.defaults).iteritems():
+  %  for name, value in defaults.get(tgt.defaults).items():
   $(${tgt.name.upper()}_OBJS): ${name} += ${value}
   %  endfor
   % endif
index a9cc6cc..e778ab0 100644 (file)
@@ -8,7 +8,7 @@
     "homepage": "https://grpc.io",
     "license": "Apache-2.0",
     "require": {
-      "php": ">=5.5.0"
+      "php": ">=7.0.0"
     },
     "require-dev": {
       "google/auth": "^v1.3.0"
index f113d29..4b5e04e 100644 (file)
@@ -30,6 +30,7 @@
       "/I"+configure_module_dirname+" "+
       "/I"+configure_module_dirname+"\\include "+
       "/I"+configure_module_dirname+"\\src\\core\\ext\\upb-generated "+
+      "/I"+configure_module_dirname+"\\src\\core\\ext\\upbdefs-generated "+
       "/I"+configure_module_dirname+"\\src\\php\\ext\\grpc "+
       "/I"+configure_module_dirname+"\\third_party\\abseil-cpp "+
       "/I"+configure_module_dirname+"\\third_party\\address_sorting\\include "+
index b94e557..8d917f5 100644 (file)
       :tag => "v#{version}",
     }
 
-    s.ios.deployment_target = '7.0'
-    s.osx.deployment_target = '10.9'
+    s.ios.deployment_target = '9.0'
+    s.osx.deployment_target = '10.10'
     s.tvos.deployment_target = '10.0'
 
     s.requires_arc = false
       ss.header_mappings_dir = '.'
       ss.dependency "#{s.name}/Interface", version
       ss.dependency 'gRPC-Core', version
-      abseil_version = '1.20200225.0'
+      abseil_version = '1.20200923.2'
       % for abseil_spec in grpcpp_abseil_specs:
       ss.dependency '${abseil_spec}', abseil_version
       % endfor
index 7278c9e..56a082e 100644 (file)
     # which was released in Cocoapods v1.2.0.
     s.cocoapods_version = '>= 1.2.0'
 
-    s.ios.deployment_target = '7.0'
-    s.osx.deployment_target = '10.9'
+    s.ios.deployment_target = '9.0'
+    s.osx.deployment_target = '10.10'
     s.tvos.deployment_target = '10.0'
     s.watchos.deployment_target = '4.0'
 
     s.requires_arc = false
 
     name = 'grpc'
-    abseil_version = '1.20200225.0'
+    abseil_version = '1.20200923.2'
 
     # When creating a dynamic framework, name it grpc.framework instead of gRPC-Core.framework.
     # This lets users write their includes like `#include <grpc/grpc.h>` as opposed to `#include
       ss.header_mappings_dir = '.'
       ss.libraries = 'z'
       ss.dependency "#{s.name}/Interface", version
-      ss.dependency 'BoringSSL-GRPC', '0.0.13'
+      ss.dependency 'BoringSSL-GRPC', '0.0.14'
       % for abseil_spec in grpc_abseil_specs:
       ss.dependency '${abseil_spec}', abseil_version
       % endfor
index e94f149..ee7eb99 100644 (file)
@@ -35,8 +35,8 @@
       :tag => "v#{version}",
     }
 
-    s.ios.deployment_target = '7.0'
-    s.osx.deployment_target = '10.9'
+    s.ios.deployment_target = '9.0'
+    s.osx.deployment_target = '10.10'
     s.tvos.deployment_target = '10.0'
     s.watchos.deployment_target = '4.0'
 
index 772265d..ac51486 100644 (file)
@@ -35,8 +35,8 @@
       :tag => "v#{version}",
     }
 
-    s.ios.deployment_target = '7.0'
-    s.osx.deployment_target = '10.9'
+    s.ios.deployment_target = '9.0'
+    s.osx.deployment_target = '10.10'
     s.tvos.deployment_target = '10.0'
     s.watchos.deployment_target = '4.0'
 
index 29dd724..068dd3d 100644 (file)
@@ -46,8 +46,8 @@
       'CLANG_WARN_STRICT_PROTOTYPES' => 'NO',
     }
 
-    s.ios.deployment_target = '7.0'
-    s.osx.deployment_target = '10.9'
+    s.ios.deployment_target = '9.0'
+    s.osx.deployment_target = '10.10'
     s.tvos.deployment_target = '10.0'
     s.watchos.deployment_target = '4.0'
 
@@ -72,8 +72,8 @@
                         "src/objective-c/GRPCClient/GRPCTypes.m"
       ss.dependency "gRPC-RxLibrary/Interface", version
 
-      ss.ios.deployment_target = '7.0'
-      ss.osx.deployment_target = '10.9'
+      ss.ios.deployment_target = '9.0'
+      ss.osx.deployment_target = '10.10'
       ss.tvos.deployment_target = '10.0'
       ss.watchos.deployment_target = '4.0'
     end
 
       ss.dependency "#{s.name}/Interface-Legacy", version
 
-      ss.ios.deployment_target = '7.0'
-      ss.osx.deployment_target = '10.9'
+      ss.ios.deployment_target = '9.0'
+      ss.osx.deployment_target = '10.10'
       ss.tvos.deployment_target = '10.0'
       ss.watchos.deployment_target = '4.0'
     end
       ss.dependency 'gRPC-Core', version
       ss.dependency 'gRPC-RxLibrary', version
 
-      ss.ios.deployment_target = '7.0'
-      ss.osx.deployment_target = '10.9'
+      ss.ios.deployment_target = '9.0'
+      ss.osx.deployment_target = '10.10'
       ss.tvos.deployment_target = '10.0'
       ss.watchos.deployment_target = '4.0'
     end
       ss.dependency 'gRPC-Core/Cronet-Implementation', version
       ss.dependency 'CronetFramework'
 
-      ss.ios.deployment_target = '8.0'
+      ss.ios.deployment_target = '9.0'
     end
 
     # CFStream is now default. Leaving this subspec only for compatibility purpose.
     s.subspec 'CFStream' do |ss|
       ss.dependency "#{s.name}/GRPCCore", version
 
-      ss.ios.deployment_target = '7.0'
-      ss.osx.deployment_target = '10.9'
+      ss.ios.deployment_target = '9.0'
+      ss.osx.deployment_target = '10.10'
       ss.tvos.deployment_target = '10.0'
       ss.watchos.deployment_target = '4.0'
     end
       ss.source_files = 'src/objective-c/GRPCClient/internal_testing/*.{h,m}'
       ss.header_mappings_dir = 'src/objective-c/GRPCClient'
 
-      ss.ios.deployment_target = '7.0'
-      ss.osx.deployment_target = '10.9'
+      ss.ios.deployment_target = '9.0'
+      ss.osx.deployment_target = '10.10'
       ss.tvos.deployment_target = '10.0'
       ss.watchos.deployment_target = '4.0'
     end
index a722dfc..49ce883 100644 (file)
@@ -36,7 +36,7 @@
     },
     'target_defaults': {
       'configurations': {
-        % for name, args in configs.iteritems():
+        % for name, args in configs.items():
         %  if name in ['dbg', 'opt']:
         '${{'dbg':'Debug', 'opt': 'Release'}[name]}': {
           % for arg, prop in [('CPPFLAGS', 'cflags'), ('DEFINES', 'defines')]:
index 3273c79..de65792 100644 (file)
@@ -52,7 +52,7 @@
    <dependencies>
     <required>
      <php>
-      <min>5.5.0</min>
+      <min>7.0.0</min>
      </php>
      <pearinstaller>
       <min>1.4.0</min>
index 4e69138..4feba10 100644 (file)
               % endfor
           }
 
+          public NativeMethods(DllImportsFromSharedLib_x86 unusedInstance)
+          {
+              % for method in get_native_methods():
+              this.${method['name']} = DllImportsFromSharedLib_x86.${method['name']};
+              % endfor
+          }
+
+          public NativeMethods(DllImportsFromSharedLib_x64 unusedInstance)
+          {
+              % for method in get_native_methods():
+              this.${method['name']} = DllImportsFromSharedLib_x64.${method['name']};
+              % endfor
+          }
+
+          public NativeMethods(DllImportsFromSharedLib_x86_dll unusedInstance)
+          {
+              % for method in get_native_methods():
+              this.${method['name']} = DllImportsFromSharedLib_x86_dll.${method['name']};
+              % endfor
+          }
+
+          public NativeMethods(DllImportsFromSharedLib_x64_dll unusedInstance)
+          {
+              % for method in get_native_methods():
+              this.${method['name']} = DllImportsFromSharedLib_x64_dll.${method['name']};
+              % endfor
+          }
+
           /// <summary>
           /// Delegate types for all published native methods. Declared under inner class to prevent scope pollution.
           /// </summary>
           }
           
           /// <summary>
-          /// grpc_csharp_ext used a shared library (e.g on Unity Standalone and Android).
+          /// grpc_csharp_ext used as a shared library (e.g on Unity Standalone and Android).
           /// </summary>
           internal class DllImportsFromSharedLib
           {
               public static extern ${method['returntype']} ${method['name']}(${method['params']});
               % endfor
           }
+
+          /// <summary>
+          /// grpc_csharp_ext used as a shared library (with x86 suffix)
+          /// </summary>
+          internal class DllImportsFromSharedLib_x86
+          {
+              private const string ImportName = "grpc_csharp_ext.x86";
+              % for method in get_native_methods():
+              
+              [DllImport(ImportName)]
+              public static extern ${method['returntype']} ${method['name']}(${method['params']});
+              % endfor
+          }
+
+          /// <summary>
+          /// grpc_csharp_ext used as a shared library (with x64 suffix)
+          /// </summary>
+          internal class DllImportsFromSharedLib_x64
+          {
+              private const string ImportName = "grpc_csharp_ext.x64";
+              % for method in get_native_methods():
+              
+              [DllImport(ImportName)]
+              public static extern ${method['returntype']} ${method['name']}(${method['params']});
+              % endfor
+          }
+
+          /// <summary>
+          /// grpc_csharp_ext used as a shared library (with x86.dll suffix)
+          /// </summary>
+          internal class DllImportsFromSharedLib_x86_dll
+          {
+              private const string ImportName = "grpc_csharp_ext.x86.dll";
+              % for method in get_native_methods():
+              
+              [DllImport(ImportName)]
+              public static extern ${method['returntype']} ${method['name']}(${method['params']});
+              % endfor
+          }
+
+          /// <summary>
+          /// grpc_csharp_ext used as a shared library (with x64.dll suffix)
+          /// </summary>
+          internal class DllImportsFromSharedLib_x64_dll
+          {
+              private const string ImportName = "grpc_csharp_ext.x64.dll";
+              % for method in get_native_methods():
+              
+              [DllImport(ImportName)]
+              public static extern ${method['returntype']} ${method['name']}(${method['params']});
+              % endfor
+          }
       }
   }
diff --git a/templates/src/csharp/build_unitypackage.bat.template b/templates/src/csharp/build_unitypackage.bat.template
deleted file mode 100755 (executable)
index 497858e..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-%YAML 1.2
---- |
-  @rem Copyright 2018 The gRPC Authors
-  @rem
-  @rem Licensed under the Apache License, Version 2.0 (the "License");
-  @rem you may not use this file except in compliance with the License.
-  @rem You may obtain a copy of the License at
-  @rem
-  @rem     http://www.apache.org/licenses/LICENSE-2.0
-  @rem
-  @rem Unless required by applicable law or agreed to in writing, software
-  @rem distributed under the License is distributed on an "AS IS" BASIS,
-  @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  @rem See the License for the specific language governing permissions and
-  @rem limitations under the License.
-  
-  @rem Current package versions
-  set VERSION=${settings.csharp_version}
-  
-  @rem Adjust the location of nuget.exe
-  set NUGET=nuget
-  set DOTNET=dotnet
-  
-  mkdir ..\..\artifacts
-  
-  @rem Collect the artifacts built by the previous build step
-  mkdir nativelibs
-  powershell -Command "cp -r ..\..\input_artifacts\csharp_ext_* nativelibs"
-  
-  @rem Collect protoc artifacts built by the previous build step
-  mkdir protoc_plugins
-  powershell -Command "cp -r ..\..\input_artifacts\protoc_* protoc_plugins"
-  
-  %%DOTNET% restore Grpc.sln || goto :error
-  
-  @rem To be able to build, we also need to put grpc_csharp_ext to its normal location
-  xcopy /Y /I nativelibs\csharp_ext_windows_x64\grpc_csharp_ext.dll ..\..\cmake\build\x64\Release${"\\"}
-  
-  %%DOTNET% build --configuration Release Grpc.Core || goto :error
-  @rem build HealthCheck to get hold of Google.Protobuf.dll assembly
-  %%DOTNET% build --configuration Release Grpc.HealthCheck || goto :error
-  
-  @rem copy Grpc assemblies to the unity package skeleton
-  @rem TODO(jtattermusch): Add Grpc.Auth assembly and its dependencies
-  copy /Y Grpc.Core.Api\bin\Release\net45\Grpc.Core.Api.dll unitypackage\unitypackage_skeleton\Plugins\Grpc.Core.Api\lib\net45\Grpc.Core.Api.dll || goto :error
-  copy /Y Grpc.Core.Api\bin\Release\net45\Grpc.Core.Api.pdb unitypackage\unitypackage_skeleton\Plugins\Grpc.Core.Api\lib\net45\Grpc.Core.Api.pdb || goto :error
-  copy /Y Grpc.Core.Api\bin\Release\net45\Grpc.Core.Api.xml unitypackage\unitypackage_skeleton\Plugins\Grpc.Core.Api\lib\net45\Grpc.Core.Api.xml || goto :error
-  copy /Y Grpc.Core\bin\Release\net45\Grpc.Core.dll unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\lib\net45\Grpc.Core.dll || goto :error
-  copy /Y Grpc.Core\bin\Release\net45\Grpc.Core.pdb unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\lib\net45\Grpc.Core.pdb || goto :error
-  copy /Y Grpc.Core\bin\Release\net45\Grpc.Core.xml unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\lib\net45\Grpc.Core.xml || goto :error
-
-  @rem copy desktop native libraries to the unity package skeleton
-  copy /Y nativelibs\csharp_ext_linux_x86\libgrpc_csharp_ext.so unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\linux\x86\libgrpc_csharp_ext.so || goto :error
-  copy /Y nativelibs\csharp_ext_linux_x64\libgrpc_csharp_ext.so unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\linux\x64\libgrpc_csharp_ext.so || goto :error
-  copy /Y nativelibs\csharp_ext_macos_x86\libgrpc_csharp_ext.dylib unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\osx\x86\grpc_csharp_ext.bundle || goto :error
-  copy /Y nativelibs\csharp_ext_macos_x64\libgrpc_csharp_ext.dylib unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\osx\x64\grpc_csharp_ext.bundle || goto :error
-  copy /Y nativelibs\csharp_ext_windows_x86\grpc_csharp_ext.dll unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\win\x86\grpc_csharp_ext.dll || goto :error
-  copy /Y nativelibs\csharp_ext_windows_x64\grpc_csharp_ext.dll unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\win\x64\grpc_csharp_ext.dll || goto :error
-
-  @rem add Android and iOS native libraries
-  copy /Y nativelibs\csharp_ext_linux_android_armeabi-v7a\libgrpc_csharp_ext.so unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\android\armeabi-v7a\libgrpc_csharp_ext.so || goto :error
-  copy /Y nativelibs\csharp_ext_linux_android_arm64-v8a\libgrpc_csharp_ext.so unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\android\arm64-v8a\libgrpc_csharp_ext.so || goto :error
-  copy /Y nativelibs\csharp_ext_linux_android_x86\libgrpc_csharp_ext.so unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\android\x86\libgrpc_csharp_ext.so || goto :error
-  copy /Y nativelibs\csharp_ext_macos_ios\libgrpc_csharp_ext.a unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\ios\libgrpc_csharp_ext.a || goto :error
-  copy /Y nativelibs\csharp_ext_macos_ios\libgrpc.a unitypackage\unitypackage_skeleton\Plugins\Grpc.Core\runtimes\ios\libgrpc.a || goto :error
-
-  @rem add gRPC dependencies
-  @rem TODO(jtattermusch): also include XMLdoc
-  copy /Y Grpc.Core\bin\Release\net45\System.Runtime.CompilerServices.Unsafe.dll unitypackage\unitypackage_skeleton\Plugins\System.Runtime.CompilerServices.Unsafe\lib\net45\System.Runtime.CompilerServices.Unsafe.dll || goto :error
-  copy /Y Grpc.Core\bin\Release\net45\System.Buffers.dll unitypackage\unitypackage_skeleton\Plugins\System.Buffers\lib\net45\System.Buffers.dll || goto :error
-  copy /Y Grpc.Core\bin\Release\net45\System.Memory.dll unitypackage\unitypackage_skeleton\Plugins\System.Memory\lib\net45\System.Memory.dll || goto :error
-
-  @rem add Google.Protobuf
-  @rem TODO(jtattermusch): also include XMLdoc
-  copy /Y Grpc.HealthCheck\bin\Release\net45\Google.Protobuf.dll unitypackage\unitypackage_skeleton\Plugins\Google.Protobuf\lib\net45\Google.Protobuf.dll || goto :error
-  
-  @rem create a zipfile that will act as a Unity package
-  cd unitypackage\unitypackage_skeleton
-  zip -r ..\..\grpc_unity_package.zip Plugins
-  cd ..\..
-  copy /Y grpc_unity_package.zip ..\..\artifacts\grpc_unity_package.%VERSION%.zip || goto :error
-  
-  goto :EOF
-  
-  :error
-  echo Failed!
-  exit /b %errorlevel%
index 88dab8d..626e3c8 100644 (file)
     # Restrict the protoc version to the one supported by this plugin.
     s.dependency '!ProtoCompiler', '3.13.0'
     # For the Protobuf dependency not to complain:
-    s.ios.deployment_target = '7.0'
-    s.osx.deployment_target = '10.9'
+    s.ios.deployment_target = '9.0'
+    s.osx.deployment_target = '10.10'
     s.tvos.deployment_target = '10.0'
     s.watchos.deployment_target = '2.0'
 
index e66faf5..fec8994 100644 (file)
     # Restrict the protoc version to the one supported by this plugin.
     s.dependency '!ProtoCompiler', '3.13.0'
     # For the Protobuf dependency not to complain:
-    s.ios.deployment_target = '7.0'
-    s.osx.deployment_target = '10.9'
+    s.ios.deployment_target = '9.0'
+    s.osx.deployment_target = '10.10'
     s.tvos.deployment_target = '10.0'
 
     # watchOS is disabled due to #20258.
index 11a9c66..4855d9d 100644 (file)
@@ -69,7 +69,7 @@
 
   Pod::Spec.new do |s|
     s.name     = 'BoringSSL-GRPC'
-    version = '0.0.13'
+    version = '0.0.14'
     s.version  = version
     s.summary  = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.'
     # Adapted from the homepage:
       :commit => "${boringssl_commit}",
     }
 
-    s.ios.deployment_target = '7.0'
-    s.osx.deployment_target = '10.7'
+    s.ios.deployment_target = '9.0'
+    s.osx.deployment_target = '10.10'
     s.tvos.deployment_target = '10.0'
     s.watchos.deployment_target = '4.0'
 
       # the correct location in BoringSSL.
       base64 -D <<EOF | gunzip > src/include/openssl/boringssl_prefix_symbols.h
         % for line in compress_boringssl_prefix_header():
-        ${line}
+        ${line.decode('utf-8')}
         % endfor
       EOF
 
index 9a1c578..e1c3646 100644 (file)
@@ -6,7 +6,7 @@
     "license": "Apache-2.0",
     "version": "${settings.php_version.php_composer()}",
     "require": {
-      "php": ">=5.5.0",
+      "php": ">=7.0.0",
       "google/protobuf": "^v3.3.0"
     },
     "require-dev": {
index 5387119..8d5e17f 100644 (file)
@@ -1,3 +1,3 @@
-RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && ${'\\'}
-  mv phpunit-5.7.27.phar /usr/local/bin/phpunit && ${'\\'}
+RUN wget https://phar.phpunit.de/phpunit-8.5.8.phar && ${'\\'}
+  mv phpunit-8.5.8.phar /usr/local/bin/phpunit && ${'\\'}
   chmod +x /usr/local/bin/phpunit
index f7aebd1..7e7d286 100644 (file)
@@ -14,7 +14,7 @@
   # See the License for the specific language governing permissions and
   # limitations under the License.
 
-  FROM php:7.4.5-buster
+  FROM php:7.4.11-buster
 
   RUN apt-get -qq update && apt-get -qq install -y ${'\\'}
     autoconf automake git libtool pkg-config ${'\\'}
diff --git a/templates/src/php/docker/php8/Dockerfile.template b/templates/src/php/docker/php8/Dockerfile.template
new file mode 100644 (file)
index 0000000..eb00edb
--- /dev/null
@@ -0,0 +1,36 @@
+%YAML 1.2
+--- |
+  # Copyright 2020 gRPC authors.
+  #
+  # Licensed under the Apache License, Version 2.0 (the "License");
+  # you may not use this file except in compliance with the License.
+  # You may obtain a copy of the License at
+  #
+  #     http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing, software
+  # distributed under the License is distributed on an "AS IS" BASIS,
+  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  # See the License for the specific language governing permissions and
+  # limitations under the License.
+
+  FROM php:8.0.0RC3-cli-buster
+
+  RUN apt-get -qq update && apt-get -qq install -y ${'\\'}
+    autoconf automake git libtool pkg-config ${'\\'}
+    valgrind wget zlib1g-dev
+
+  ARG MAKEFLAGS=-j8
+
+
+  WORKDIR /tmp
+
+  # install pear
+  RUN apt-get install expect -y && ${'\\'}
+    curl -LO http://pear.php.net/go-pear.phar && ${'\\'}
+    expect -c 'spawn php ./go-pear.phar; expect "or Enter to continue:"; send "\n"; expect "Currently used php.ini"; send "\n"; expect eof' && ${'\\'}
+    rm go-pear.phar
+
+  <%include file="../pecl_ext_build_src.include" />
+
+  CMD php -d extension=grpc.so -r '$a = new \Grpc\Channel("dummy", []); echo get_class($a)."\n";'
index 153e7f8..619dea9 100644 (file)
@@ -33,7 +33,7 @@
   ]
 
   ASM_SOURCE_FILES = {
-  % for asm, asm_src in asm_srcs.iteritems():
+  % for asm, asm_src in asm_srcs.items():
       '${asm}': [
     % for src in asm_src:
           '${src}',
index 3719ded..e0023dd 100644 (file)
@@ -1,4 +1,4 @@
 %YAML 1.2
 --- |
   <%namespace file="end2end_defs.include" import="*"/>\
-  ${end2end_selector(k for k, v in core_end2end_tests.iteritems() if not v)}
+  ${end2end_selector(k for k, v in core_end2end_tests.items() if not v)}
index bf5ff92..a6bfeeb 100755 (executable)
 # Builds Go interop server and client in a base image.
 set -e
 
+# Turn on support for Go modules.
+export GO111MODULE=on
+
 # Clone just the grpc-go source code without any dependencies.
 # We are cloning from a local git repo that contains the right revision
 # to test instead of using "go get" to download from Github directly.
 git clone --recursive /var/local/jenkins/grpc-go src/google.golang.org/grpc
 
-# Get all gRPC Go dependencies
-(cd src/google.golang.org/grpc && make deps && make testdeps)
-
 # copy service account keys if available
 cp -r /var/local/jenkins/service_account $HOME || true
 
index d34837d..9216235 100644 (file)
 
   FROM debian:10
 
-  RUN apt-get update && apt-get install -y clang-format
+  # Add buster-backports for more recent clang packages
+  RUN echo "deb http://deb.debian.org/debian buster-backports main" | tee /etc/apt/sources.list.d/buster-backports.list
+
+  # Install clang-format
+  RUN apt-get update && apt-get install -y clang-format-8
+  ENV CLANG_FORMAT=clang-format-8
+
   ADD clang_format_all_the_things.sh /
   
   # When running locally, we'll be impersonating the current user, so we need
index e56f76d..b3a3636 100644 (file)
   
   <%include file="../python_debian10.include"/>
   
-  # Install clang-tidy 6.0
-  # This is because clang-tidy 7.0 started treating compiler errors as tidy errors
-  # and there are a couple of files which are not properly compiled via tidy so it
-  # should be using 6.0 version until all compilation errors are addressed.
-  RUN apt-get update && apt-get install -y clang-tidy-6.0
-  ENV CLANG_TIDY=clang-tidy-6.0
+  # Add buster-backports for more recent clang packages
+  RUN echo "deb http://deb.debian.org/debian buster-backports main" | tee /etc/apt/sources.list.d/buster-backports.list
+
+  # Install clang-tidy 7
+  RUN apt-get update && apt-get install -y clang-tidy-8 jq
+  ENV CLANG_TIDY=clang-tidy-8
 
   ADD clang_tidy_all_the_things.sh /
   
diff --git a/templates/tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile.template b/templates/tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile.template
deleted file mode 100644 (file)
index 7836341..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-%YAML 1.2
---- |
-  # Copyright 2017 gRPC authors.
-  #
-  # Licensed under the Apache License, Version 2.0 (the "License");
-  # you may not use this file except in compliance with the License.
-  # You may obtain a copy of the License at
-  #
-  #     http://www.apache.org/licenses/LICENSE-2.0
-  #
-  # Unless required by applicable law or agreed to in writing, software
-  # distributed under the License is distributed on an "AS IS" BASIS,
-  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  # See the License for the specific language governing permissions and
-  # limitations under the License.
-
-  FROM google/dart:2.7
-
-  # Define the default command.
-  CMD ["bash"]
diff --git a/templates/tools/dockerfile/interoptest/grpc_interop_go1.7/Dockerfile.template b/templates/tools/dockerfile/interoptest/grpc_interop_go1.7/Dockerfile.template
deleted file mode 100644 (file)
index ac7bf30..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-%YAML 1.2
---- |
-  # Copyright 2017 gRPC authors.
-  #
-  # Licensed under the Apache License, Version 2.0 (the "License");
-  # you may not use this file except in compliance with the License.
-  # You may obtain a copy of the License at
-  #
-  #     http://www.apache.org/licenses/LICENSE-2.0
-  #
-  # Unless required by applicable law or agreed to in writing, software
-  # distributed under the License is distributed on an "AS IS" BASIS,
-  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  # See the License for the specific language governing permissions and
-  # limitations under the License.
-  
-  FROM golang:1.7
-  
-  <%include file="../../go_path.include"/>
-  <%include file="../../python_deps.include"/>
-  # Define the default command.
-  CMD ["bash"]
-  
diff --git a/templates/tools/dockerfile/interoptest/grpc_interop_go1.7/build_interop.sh.template b/templates/tools/dockerfile/interoptest/grpc_interop_go1.7/build_interop.sh.template
deleted file mode 100644 (file)
index a08798b..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-%YAML 1.2
---- |
-  <%include file="../../go_build_interop.sh.include"/>  
diff --git a/templates/tools/dockerfile/interoptest/grpc_interop_go1.8/build_interop.sh.template b/templates/tools/dockerfile/interoptest/grpc_interop_go1.8/build_interop.sh.template
deleted file mode 100644 (file)
index a08798b..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-%YAML 1.2
---- |
-  <%include file="../../go_build_interop.sh.include"/>  
index cdacfdd..537a6a1 100644 (file)
@@ -12,4 +12,4 @@ RUN apt-get update && apt-get install -y ${'\\'}
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
index e1b1d20..ffa4169 100644 (file)
   # Install Python packages from PyPI
   RUN pip install --upgrade pip==19.3.1
   RUN pip install virtualenv
-  RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.0.post1 six==1.10.0 twisted==17.5.0
+  RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.0.post1 six==1.15.0 twisted==17.5.0
   
   # Google Cloud platform API libraries
   RUN pip install --upgrade google-api-python-client
   
-  # Install gflags
-  RUN git clone https://github.com/gflags/gflags.git && cd gflags && git checkout v2.2.0
-  RUN cd gflags && cmake . && make && make install
-  RUN ln -s /usr/local/include/gflags /usr/include/gflags
-  
   <%include file="../../run_tests_addons.include"/>
   
   # Define the default command.
index 453505d..17c6d04 100644 (file)
   RUN python2 -m pip install simplejson mako virtualenv==16.7.9 lxml
   RUN python3 -m pip install simplejson mako virtualenv==16.7.9 lxml
 
-  # Install clang & clang-format
-  RUN apt-get install -y clang clang-format
+  # Add buster-backports for more recent clang packages
+  RUN echo "deb http://deb.debian.org/debian buster-backports main" | tee /etc/apt/sources.list.d/buster-backports.list
 
-  # Install clang-tidy 6.0
-  # This is because clang-tidy 7.0 started treating compiler errors as tidy errors
-  # and there are a couple of files which are not properly compiled via tidy so it
-  # should be using 6.0 version until all compilation errors are addressed.
-  RUN apt-get install -y clang-tidy-6.0
-  ENV CLANG_TIDY=clang-tidy-6.0
+  # Install clang, clang-format, and clang-tidy
+  RUN apt-get update && apt-get install -y clang clang-format-8 clang-tidy-8 jq
+  ENV CLANG_FORMAT=clang-format-8
+  ENV CLANG_TIDY=clang-tidy-8
 
 
   <%include file="../../bazel.include"/>
index 5c82dfb..e26522e 100644 (file)
@@ -3,7 +3,7 @@
   <%
   import json
   out_configs = []
-  for name, args in configs.iteritems():
+  for name, args in configs.items():
     config_args={}
     config_args['config'] = name
     if args.get('valgrind', None) is not None:
index 9ef027f..e273f20 100644 (file)
@@ -153,7 +153,7 @@ int main(int argc, char** argv) {
   for (i = 3; i <= 4; i++) {
     grpc_init();
     run_test(args[2], i);
-    grpc_shutdown_blocking();
+    grpc_shutdown();
   }
 
   gpr_subprocess_interrupt(svr);
index a81930c..3c2e9ed 100644 (file)
@@ -58,17 +58,3 @@ grpc_cc_test(
         "//test/core/util:grpc_test_util",
     ],
 )
-
-grpc_cc_test(
-    name = "xds_bootstrap_test",
-    srcs = ["xds_bootstrap_test.cc"],
-    external_deps = [
-        "gtest",
-    ],
-    language = "C++",
-    deps = [
-        "//:gpr",
-        "//:grpc",
-        "//test/core/util:grpc_test_util",
-    ],
-)
index 1443856..f679847 100644 (file)
@@ -32,13 +32,13 @@ class FakeCertificateProviderFactory1 : public CertificateProviderFactory {
  public:
   const char* name() const override { return "fake1"; }
 
-  std::unique_ptr<Config> CreateCertificateProviderConfig(
+  RefCountedPtr<Config> CreateCertificateProviderConfig(
       const Json& config_json, grpc_error** error) override {
     return nullptr;
   }
 
   RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
-      std::unique_ptr<Config> config) override {
+      RefCountedPtr<Config> config) override {
     return nullptr;
   }
 };
@@ -47,13 +47,13 @@ class FakeCertificateProviderFactory2 : public CertificateProviderFactory {
  public:
   const char* name() const override { return "fake2"; }
 
-  std::unique_ptr<Config> CreateCertificateProviderConfig(
+  RefCountedPtr<Config> CreateCertificateProviderConfig(
       const Json& config_json, grpc_error** error) override {
     return nullptr;
   }
 
   RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
-      std::unique_ptr<Config> config) override {
+      RefCountedPtr<Config> config) override {
     return nullptr;
   }
 };
index 2f965df..ac351fe 100644 (file)
@@ -19,7 +19,7 @@ grpc_package(name = "test/core/client_channel_resolvers")
 licenses(["notice"])  # Apache v2
 
 grpc_cc_test(
-    name = "dns_resolver_connectivity_using_ares_resolver_test",
+    name = "dns_resolver_connectivity_using_ares_test",
     srcs = ["dns_resolver_connectivity_test.cc"],
     args = [
         "--resolver=ares",
@@ -33,7 +33,7 @@ grpc_cc_test(
 )
 
 grpc_cc_test(
-    name = "dns_resolver_connectivity_using_native_resolver_test",
+    name = "dns_resolver_connectivity_using_native_test",
     srcs = ["dns_resolver_connectivity_test.cc"],
     args = [
         "--resolver=native",
index 6b67aa1..d052137 100644 (file)
@@ -95,7 +95,7 @@ static grpc_core::OrphanablePtr<grpc_core::Resolver> create_resolver(
     std::unique_ptr<grpc_core::Resolver::ResultHandler> result_handler) {
   grpc_core::ResolverFactory* factory =
       grpc_core::ResolverRegistry::LookupResolverFactory("dns");
-  grpc_uri* uri = grpc_uri_parse(name, 0);
+  grpc_uri* uri = grpc_uri_parse(name, false);
   GPR_ASSERT(uri);
   grpc_core::ResolverArgs args;
   args.uri = uri;
index 9f3f31c..2d5e37c 100644 (file)
@@ -280,7 +280,7 @@ static void start_test_under_work_serializer(void* arg) {
   res_cb_arg->result_handler = new ResultHandler();
   grpc_core::ResolverFactory* factory =
       grpc_core::ResolverRegistry::LookupResolverFactory("dns");
-  grpc_uri* uri = grpc_uri_parse(res_cb_arg->uri_str, 0);
+  grpc_uri* uri = grpc_uri_parse(res_cb_arg->uri_str, false);
   gpr_log(GPR_DEBUG, "test: '%s' should be valid for '%s'", res_cb_arg->uri_str,
           factory->scheme());
   GPR_ASSERT(uri != nullptr);
@@ -332,7 +332,7 @@ int main(int argc, char** argv) {
 
   test_cooldown();
 
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   GPR_ASSERT(g_all_callbacks_invoked);
   return 0;
 }
index 107ba1f..3b91dc1 100644 (file)
@@ -40,7 +40,7 @@ static void test_succeeds(grpc_core::ResolverFactory* factory,
   gpr_log(GPR_DEBUG, "test: '%s' should be valid for '%s'", string,
           factory->scheme());
   grpc_core::ExecCtx exec_ctx;
-  grpc_uri* uri = grpc_uri_parse(string, 0);
+  grpc_uri* uri = grpc_uri_parse(string, false);
   GPR_ASSERT(uri);
   grpc_core::ResolverArgs args;
   args.uri = uri;
@@ -57,7 +57,7 @@ static void test_fails(grpc_core::ResolverFactory* factory,
   gpr_log(GPR_DEBUG, "test: '%s' should be invalid for '%s'", string,
           factory->scheme());
   grpc_core::ExecCtx exec_ctx;
-  grpc_uri* uri = grpc_uri_parse(string, 0);
+  grpc_uri* uri = grpc_uri_parse(string, false);
   GPR_ASSERT(uri);
   grpc_core::ResolverArgs args;
   args.uri = uri;
index ef6a7c7..ff56963 100644 (file)
@@ -42,7 +42,7 @@ static void test_succeeds(grpc_core::ResolverFactory* factory,
   gpr_log(GPR_DEBUG, "test: '%s' should be valid for '%s'", string,
           factory->scheme());
   grpc_core::ExecCtx exec_ctx;
-  grpc_uri* uri = grpc_uri_parse(string, 0);
+  grpc_uri* uri = grpc_uri_parse(string, false);
   GPR_ASSERT(uri);
   grpc_core::ResolverArgs args;
   args.uri = uri;
@@ -63,7 +63,7 @@ static void test_fails(grpc_core::ResolverFactory* factory,
   gpr_log(GPR_DEBUG, "test: '%s' should be invalid for '%s'", string,
           factory->scheme());
   grpc_core::ExecCtx exec_ctx;
-  grpc_uri* uri = grpc_uri_parse(string, 0);
+  grpc_uri* uri = grpc_uri_parse(string, false);
   GPR_ASSERT(uri);
   grpc_core::ResolverArgs args;
   args.uri = uri;
@@ -101,6 +101,16 @@ int main(int argc, char** argv) {
   test_fails(ipv6, "ipv6:[::]:123456");
   test_fails(ipv6, "ipv6:www.google.com");
 
+#ifdef GRPC_HAVE_UNIX_SOCKET
+  grpc_core::ResolverFactory* uds =
+      grpc_core::ResolverRegistry::LookupResolverFactory("unix");
+  grpc_core::ResolverFactory* uds_abstract =
+      grpc_core::ResolverRegistry::LookupResolverFactory("unix-abstract");
+
+  test_succeeds(uds, "unix:///tmp/sockaddr_resolver_test");
+  test_succeeds(uds_abstract, "unix-abstract:sockaddr_resolver_test");
+#endif  // GRPC_HAVE_UNIX_SOCKET
+
   grpc_shutdown();
 
   return 0;
index 2c3ed35..97749cf 100644 (file)
  *
  */
 
-#include <regex>
-
 #include "absl/strings/str_cat.h"
 
+#include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
 #include <grpc/grpc.h>
@@ -143,13 +142,6 @@ class ErrorParser : public ServiceConfigParser::Parser {
   static const char* GlobalError() { return "ErrorParser : globalError"; }
 };
 
-void VerifyRegexMatch(grpc_error* error, const std::regex& regex) {
-  std::smatch match;
-  std::string error_str = grpc_error_string(error);
-  EXPECT_TRUE(std::regex_search(error_str, match, regex)) << error_str;
-  GRPC_ERROR_UNREF(error);
-}
-
 class ServiceConfigTest : public ::testing::Test {
  protected:
   void SetUp() override {
@@ -168,8 +160,9 @@ TEST_F(ServiceConfigTest, ErrorCheck1) {
   const char* test_json = "";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(std::string("JSON parse error"));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex("JSON parse error"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ServiceConfigTest, BasicTest1) {
@@ -204,12 +197,13 @@ TEST_F(ServiceConfigTest, ErrorDuplicateMethodConfigNames) {
       "]}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      std::string("Service config parsing error.*referenced_errors"
-                  ".*Method Params.*referenced_errors"
-                  ".*methodConfig.*referenced_errors"
-                  ".*multiple method configs with same name"));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(
+      grpc_error_string(error),
+      ::testing::ContainsRegex("Service config parsing error.*referenced_errors"
+                               ".*Method Params.*referenced_errors"
+                               ".*methodConfig.*referenced_errors"
+                               ".*multiple method configs with same name"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ServiceConfigTest, ErrorDuplicateMethodConfigNamesWithNullMethod) {
@@ -220,12 +214,13 @@ TEST_F(ServiceConfigTest, ErrorDuplicateMethodConfigNamesWithNullMethod) {
       "]}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      std::string("Service config parsing error.*referenced_errors"
-                  ".*Method Params.*referenced_errors"
-                  ".*methodConfig.*referenced_errors"
-                  ".*multiple method configs with same name"));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(
+      grpc_error_string(error),
+      ::testing::ContainsRegex("Service config parsing error.*referenced_errors"
+                               ".*Method Params.*referenced_errors"
+                               ".*methodConfig.*referenced_errors"
+                               ".*multiple method configs with same name"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ServiceConfigTest, ErrorDuplicateMethodConfigNamesWithEmptyMethod) {
@@ -236,12 +231,13 @@ TEST_F(ServiceConfigTest, ErrorDuplicateMethodConfigNamesWithEmptyMethod) {
       "]}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      std::string("Service config parsing error.*referenced_errors"
-                  ".*Method Params.*referenced_errors"
-                  ".*methodConfig.*referenced_errors"
-                  ".*multiple method configs with same name"));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(
+      grpc_error_string(error),
+      ::testing::ContainsRegex("Service config parsing error.*referenced_errors"
+                               ".*Method Params.*referenced_errors"
+                               ".*methodConfig.*referenced_errors"
+                               ".*multiple method configs with same name"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ServiceConfigTest, ErrorDuplicateDefaultMethodConfigs) {
@@ -252,12 +248,13 @@ TEST_F(ServiceConfigTest, ErrorDuplicateDefaultMethodConfigs) {
       "]}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      std::string("Service config parsing error.*referenced_errors"
-                  ".*Method Params.*referenced_errors"
-                  ".*methodConfig.*referenced_errors"
-                  ".*multiple default method configs"));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(
+      grpc_error_string(error),
+      ::testing::ContainsRegex("Service config parsing error.*referenced_errors"
+                               ".*Method Params.*referenced_errors"
+                               ".*methodConfig.*referenced_errors"
+                               ".*multiple default method configs"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ServiceConfigTest, ErrorDuplicateDefaultMethodConfigsWithNullService) {
@@ -268,12 +265,13 @@ TEST_F(ServiceConfigTest, ErrorDuplicateDefaultMethodConfigsWithNullService) {
       "]}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      std::string("Service config parsing error.*referenced_errors"
-                  ".*Method Params.*referenced_errors"
-                  ".*methodConfig.*referenced_errors"
-                  ".*multiple default method configs"));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(
+      grpc_error_string(error),
+      ::testing::ContainsRegex("Service config parsing error.*referenced_errors"
+                               ".*Method Params.*referenced_errors"
+                               ".*methodConfig.*referenced_errors"
+                               ".*multiple default method configs"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ServiceConfigTest, ErrorDuplicateDefaultMethodConfigsWithEmptyService) {
@@ -284,12 +282,13 @@ TEST_F(ServiceConfigTest, ErrorDuplicateDefaultMethodConfigsWithEmptyService) {
       "]}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      std::string("Service config parsing error.*referenced_errors"
-                  ".*Method Params.*referenced_errors"
-                  ".*methodConfig.*referenced_errors"
-                  ".*multiple default method configs"));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(
+      grpc_error_string(error),
+      ::testing::ContainsRegex("Service config parsing error.*referenced_errors"
+                               ".*Method Params.*referenced_errors"
+                               ".*methodConfig.*referenced_errors"
+                               ".*multiple default method configs"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ServiceConfigTest, ValidMethodConfig) {
@@ -338,22 +337,24 @@ TEST_F(ServiceConfigTest, Parser1ErrorInvalidType) {
   const char* test_json = "{\"global_param\":\"5\"}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      absl::StrCat("Service config parsing error.*referenced_errors.*"
-                   "Global Params.*referenced_errors.*",
-                   TestParser1::InvalidTypeErrorMessage()));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(absl::StrCat(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Global Params.*referenced_errors.*",
+                  TestParser1::InvalidTypeErrorMessage())));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ServiceConfigTest, Parser1ErrorInvalidValue) {
   const char* test_json = "{\"global_param\":-5}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      absl::StrCat("Service config parsing error.*referenced_errors.*"
-                   "Global Params.*referenced_errors.*",
-                   TestParser1::InvalidValueErrorMessage()));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(absl::StrCat(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Global Params.*referenced_errors.*",
+                  TestParser1::InvalidValueErrorMessage())));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ServiceConfigTest, Parser2BasicTest) {
@@ -393,12 +394,13 @@ TEST_F(ServiceConfigTest, Parser2ErrorInvalidType) {
       "\"method_param\":\"5\"}]}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      absl::StrCat("Service config parsing error.*referenced_errors\":\\[.*"
-                   "Method Params.*referenced_errors.*methodConfig.*"
-                   "referenced_errors.*",
-                   TestParser2::InvalidTypeErrorMessage()));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(absl::StrCat(
+                  "Service config parsing error.*referenced_errors\":\\[.*"
+                  "Method Params.*referenced_errors.*methodConfig.*"
+                  "referenced_errors.*",
+                  TestParser2::InvalidTypeErrorMessage())));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ServiceConfigTest, Parser2ErrorInvalidValue) {
@@ -407,12 +409,13 @@ TEST_F(ServiceConfigTest, Parser2ErrorInvalidValue) {
       "\"method_param\":-5}]}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      absl::StrCat("Service config parsing error.*referenced_errors\":\\[.*"
-                   "Method Params.*referenced_errors.*methodConfig.*"
-                   "referenced_errors.*",
-                   TestParser2::InvalidValueErrorMessage()));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(absl::StrCat(
+                  "Service config parsing error.*referenced_errors\":\\[.*"
+                  "Method Params.*referenced_errors.*methodConfig.*"
+                  "referenced_errors.*",
+                  TestParser2::InvalidValueErrorMessage())));
+  GRPC_ERROR_UNREF(error);
 }
 
 // Test parsing with ErrorParsers which always add errors
@@ -434,24 +437,29 @@ TEST_F(ErroredParsersScopingTest, GlobalParams) {
   const char* test_json = "{}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(absl::StrCat(
-      "Service config parsing error.*referenced_errors\":\\[.*"
-      "Global Params.*referenced_errors.*",
-      ErrorParser::GlobalError(), ".*", ErrorParser::GlobalError()));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(
+      grpc_error_string(error),
+      ::testing::ContainsRegex(absl::StrCat(
+          "Service config parsing error.*referenced_errors\":\\[.*"
+          "Global Params.*referenced_errors.*",
+          ErrorParser::GlobalError(), ".*", ErrorParser::GlobalError())));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ErroredParsersScopingTest, MethodParams) {
   const char* test_json = "{\"methodConfig\": [{}]}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(absl::StrCat(
-      "Service config parsing error.*referenced_errors\":\\[.*"
-      "Global Params.*referenced_errors.*",
-      ErrorParser::GlobalError(), ".*", ErrorParser::GlobalError(),
-      ".*Method Params.*referenced_errors.*methodConfig.*referenced_errors.*",
-      ErrorParser::MethodError(), ".*", ErrorParser::MethodError()));
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(
+      grpc_error_string(error),
+      ::testing::ContainsRegex(absl::StrCat(
+          "Service config parsing error.*referenced_errors\":\\[.*"
+          "Global Params.*referenced_errors.*",
+          ErrorParser::GlobalError(), ".*", ErrorParser::GlobalError(),
+          ".*Method Params.*referenced_errors.*methodConfig.*"
+          "referenced_errors.*",
+          ErrorParser::MethodError(), ".*", ErrorParser::MethodError())));
+  GRPC_ERROR_UNREF(error);
 }
 
 class ClientChannelParserTest : public ::testing::Test {
@@ -527,13 +535,14 @@ TEST_F(ClientChannelParserTest, UnknownLoadBalancingConfig) {
   const char* test_json = "{\"loadBalancingConfig\": [{\"unknown\":{}}]}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Global Params.*referenced_errors.*"
-      "Client channel global parser.*referenced_errors.*"
-      "field:loadBalancingConfig.*referenced_errors.*"
-      "No known policies in list: unknown");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Global Params.*referenced_errors.*"
+                  "Client channel global parser.*referenced_errors.*"
+                  "field:loadBalancingConfig.*referenced_errors.*"
+                  "No known policies in list: unknown"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, InvalidGrpclbLoadBalancingConfig) {
@@ -544,15 +553,16 @@ TEST_F(ClientChannelParserTest, InvalidGrpclbLoadBalancingConfig) {
       "]}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Global Params.*referenced_errors.*"
-      "Client channel global parser.*referenced_errors.*"
-      "field:loadBalancingConfig.*referenced_errors.*"
-      "GrpcLb Parser.*referenced_errors.*"
-      "field:childPolicy.*referenced_errors.*"
-      "type should be array");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Global Params.*referenced_errors.*"
+                  "Client channel global parser.*referenced_errors.*"
+                  "field:loadBalancingConfig.*referenced_errors.*"
+                  "GrpcLb Parser.*referenced_errors.*"
+                  "field:childPolicy.*referenced_errors.*"
+                  "type should be array"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, ValidLoadBalancingPolicy) {
@@ -581,25 +591,27 @@ TEST_F(ClientChannelParserTest, UnknownLoadBalancingPolicy) {
   const char* test_json = "{\"loadBalancingPolicy\":\"unknown\"}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Global Params.*referenced_errors.*"
-      "Client channel global parser.*referenced_errors.*"
-      "field:loadBalancingPolicy error:Unknown lb policy");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Global Params.*referenced_errors.*"
+                  "Client channel global parser.*referenced_errors.*"
+                  "field:loadBalancingPolicy error:Unknown lb policy"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, LoadBalancingPolicyXdsNotAllowed) {
   const char* test_json = "{\"loadBalancingPolicy\":\"eds_experimental\"}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Global Params.*referenced_errors.*"
-      "Client channel global parser.*referenced_errors.*"
-      "field:loadBalancingPolicy error:eds_experimental requires "
-      "a config. Please use loadBalancingConfig instead.");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Global Params.*referenced_errors.*"
+                  "Client channel global parser.*referenced_errors.*"
+                  "field:loadBalancingPolicy error:eds_experimental requires "
+                  "a config. Please use loadBalancingConfig instead."));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, ValidRetryThrottling) {
@@ -630,13 +642,14 @@ TEST_F(ClientChannelParserTest, RetryThrottlingMissingFields) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Global Params.*referenced_errors.*"
-      "Client channel global parser.*referenced_errors.*"
-      "field:retryThrottling field:maxTokens error:Not found.*"
-      "field:retryThrottling field:tokenRatio error:Not found");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Global Params.*referenced_errors.*"
+                  "Client channel global parser.*referenced_errors.*"
+                  "field:retryThrottling field:maxTokens error:Not found.*"
+                  "field:retryThrottling field:tokenRatio error:Not found"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, InvalidRetryThrottlingNegativeMaxTokens) {
@@ -649,13 +662,14 @@ TEST_F(ClientChannelParserTest, InvalidRetryThrottlingNegativeMaxTokens) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Global Params.*referenced_errors.*"
-      "Client channel global parser.*referenced_errors.*"
-      "field:retryThrottling field:maxTokens error:should "
-      "be greater than zero");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Global Params.*referenced_errors.*"
+                  "Client channel global parser.*referenced_errors.*"
+                  "field:retryThrottling field:maxTokens error:should "
+                  "be greater than zero"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, InvalidRetryThrottlingInvalidTokenRatio) {
@@ -668,13 +682,14 @@ TEST_F(ClientChannelParserTest, InvalidRetryThrottlingInvalidTokenRatio) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Global Params.*referenced_errors.*"
-      "Client channel global parser.*referenced_errors.*"
-      "field:retryThrottling field:tokenRatio "
-      "error:Failed parsing");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Global Params.*referenced_errors.*"
+                  "Client channel global parser.*referenced_errors.*"
+                  "field:retryThrottling field:tokenRatio "
+                  "error:Failed parsing"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, ValidTimeout) {
@@ -712,13 +727,15 @@ TEST_F(ClientChannelParserTest, InvalidTimeout) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Method Params.*referenced_errors.*"
-      "methodConfig.*referenced_errors.*"
-      "Client channel parser.*referenced_errors.*"
-      "field:timeout error:Failed parsing");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Method Params.*referenced_errors.*"
+                  "methodConfig.*referenced_errors.*"
+                  "Client channel parser.*referenced_errors.*"
+                  "field:timeout error:type should be STRING of the form given "
+                  "by google.proto.Duration"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, ValidWaitForReady) {
@@ -762,13 +779,14 @@ TEST_F(ClientChannelParserTest, InvalidWaitForReady) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Method Params.*referenced_errors.*"
-      "methodConfig.*referenced_errors.*"
-      "Client channel parser.*referenced_errors.*"
-      "field:waitForReady error:Type should be true/false");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Method Params.*referenced_errors.*"
+                  "methodConfig.*referenced_errors.*"
+                  "Client channel parser.*referenced_errors.*"
+                  "field:waitForReady error:Type should be true/false"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, ValidRetryPolicy) {
@@ -823,14 +841,15 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyMaxAttempts) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Method Params.*referenced_errors.*"
-      "methodConfig.*referenced_errors.*"
-      "Client channel parser.*referenced_errors.*"
-      "retryPolicy.*referenced_errors.*"
-      "field:maxAttempts error:should be at least 2");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Method Params.*referenced_errors.*"
+                  "methodConfig.*referenced_errors.*"
+                  "Client channel parser.*referenced_errors.*"
+                  "retryPolicy.*referenced_errors.*"
+                  "field:maxAttempts error:should be at least 2"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, InvalidRetryPolicyInitialBackoff) {
@@ -851,14 +870,16 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyInitialBackoff) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Method Params.*referenced_errors.*"
-      "methodConfig.*referenced_errors.*"
-      "Client channel parser.*referenced_errors.*"
-      "retryPolicy.*referenced_errors.*"
-      "field:initialBackoff error:Failed to parse");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Method Params.*referenced_errors.*"
+                  "methodConfig.*referenced_errors.*"
+                  "Client channel parser.*referenced_errors.*"
+                  "retryPolicy.*referenced_errors.*"
+                  "field:initialBackoff error:type should be STRING of the "
+                  "form given by google.proto.Duration"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, InvalidRetryPolicyMaxBackoff) {
@@ -879,14 +900,16 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyMaxBackoff) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Method Params.*referenced_errors.*"
-      "methodConfig.*referenced_errors.*"
-      "Client channel parser.*referenced_errors.*"
-      "retryPolicy.*referenced_errors.*"
-      "field:maxBackoff error:failed to parse");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Method Params.*referenced_errors.*"
+                  "methodConfig.*referenced_errors.*"
+                  "Client channel parser.*referenced_errors.*"
+                  "retryPolicy.*referenced_errors.*"
+                  "field:maxBackoff error:type should be STRING of the form "
+                  "given by google.proto.Duration"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, InvalidRetryPolicyBackoffMultiplier) {
@@ -907,14 +930,15 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyBackoffMultiplier) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Method Params.*referenced_errors.*"
-      "methodConfig.*referenced_errors.*"
-      "Client channel parser.*referenced_errors.*"
-      "retryPolicy.*referenced_errors.*"
-      "field:backoffMultiplier error:should be of type number");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Method Params.*referenced_errors.*"
+                  "methodConfig.*referenced_errors.*"
+                  "Client channel parser.*referenced_errors.*"
+                  "retryPolicy.*referenced_errors.*"
+                  "field:backoffMultiplier error:should be of type number"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, InvalidRetryPolicyRetryableStatusCodes) {
@@ -935,14 +959,15 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyRetryableStatusCodes) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Method Params.*referenced_errors.*"
-      "methodConfig.*referenced_errors.*"
-      "Client channel parser.*referenced_errors.*"
-      "retryPolicy.*referenced_errors.*"
-      "field:retryableStatusCodes error:should be non-empty");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Method Params.*referenced_errors.*"
+                  "methodConfig.*referenced_errors.*"
+                  "Client channel parser.*referenced_errors.*"
+                  "retryPolicy.*referenced_errors.*"
+                  "field:retryableStatusCodes error:should be non-empty"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(ClientChannelParserTest, ValidHealthCheck) {
@@ -975,10 +1000,11 @@ TEST_F(ClientChannelParserTest, InvalidHealthCheckMultipleEntries) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "JSON parsing failed.*referenced_errors.*"
-      "duplicate key \"healthCheckConfig\" at index 104");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "JSON parsing failed.*referenced_errors.*"
+                  "duplicate key \"healthCheckConfig\" at index 104"));
+  GRPC_ERROR_UNREF(error);
 }
 
 class MessageSizeParserTest : public ::testing::Test {
@@ -1028,13 +1054,14 @@ TEST_F(MessageSizeParserTest, InvalidMaxRequestMessageBytes) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Method Params.*referenced_errors.*"
-      "methodConfig.*referenced_errors.*"
-      "Message size parser.*referenced_errors.*"
-      "field:maxRequestMessageBytes error:should be non-negative");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Method Params.*referenced_errors.*"
+                  "methodConfig.*referenced_errors.*"
+                  "Message size parser.*referenced_errors.*"
+                  "field:maxRequestMessageBytes error:should be non-negative"));
+  GRPC_ERROR_UNREF(error);
 }
 
 TEST_F(MessageSizeParserTest, InvalidMaxResponseMessageBytes) {
@@ -1049,28 +1076,21 @@ TEST_F(MessageSizeParserTest, InvalidMaxResponseMessageBytes) {
       "}";
   grpc_error* error = GRPC_ERROR_NONE;
   auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
-  std::regex regex(
-      "Service config parsing error.*referenced_errors.*"
-      "Method Params.*referenced_errors.*"
-      "methodConfig.*referenced_errors.*"
-      "Message size parser.*referenced_errors.*"
-      "field:maxResponseMessageBytes error:should be of type "
-      "number");
-  VerifyRegexMatch(error, regex);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "Service config parsing error.*referenced_errors.*"
+                  "Method Params.*referenced_errors.*"
+                  "methodConfig.*referenced_errors.*"
+                  "Message size parser.*referenced_errors.*"
+                  "field:maxResponseMessageBytes error:should be of type "
+                  "number"));
+  GRPC_ERROR_UNREF(error);
 }
 
 }  // namespace testing
 }  // namespace grpc_core
 
 int main(int argc, char** argv) {
-// Regexes don't work in old libstdc++ versions, so just skip testing in those
-// cases
-#if defined(__GLIBCXX__) && (__GLIBCXX__ <= 20150623)
-  gpr_log(GPR_ERROR,
-          "Skipping service_config_test since std::regex is not supported on "
-          "this system.");
-  return 0;
-#endif
   ::testing::InitGoogleTest(&argc, argv);
   grpc::testing::TestEnvironment env(argc, argv);
   grpc_init();
diff --git a/test/core/client_channel/xds_bootstrap_test.cc b/test/core/client_channel/xds_bootstrap_test.cc
deleted file mode 100644 (file)
index 40a5f75..0000000
+++ /dev/null
@@ -1,301 +0,0 @@
-//
-// Copyright 2019 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#include <regex>
-
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#include <grpc/grpc.h>
-#include <grpc/slice.h>
-
-#include "src/core/ext/xds/xds_bootstrap.h"
-#include "test/core/util/test_config.h"
-
-namespace grpc_core {
-namespace testing {
-
-void VerifyRegexMatch(grpc_error* error, const std::regex& e) {
-  std::smatch match;
-  std::string s(grpc_error_string(error));
-  EXPECT_TRUE(std::regex_search(s, match, e));
-  GRPC_ERROR_UNREF(error);
-}
-
-TEST(XdsBootstrapTest, Basic) {
-  const char* json_str =
-      "{"
-      "  \"xds_servers\": ["
-      "    {"
-      "      \"server_uri\": \"fake:///lb\","
-      "      \"channel_creds\": ["
-      "        {"
-      "          \"type\": \"fake\","
-      "          \"ignore\": 0"
-      "        }"
-      "      ],"
-      "      \"ignore\": 0"
-      "    },"
-      "    {"
-      "      \"server_uri\": \"ignored\","
-      "      \"channel_creds\": ["
-      "        {"
-      "          \"type\": \"ignored\","
-      "          \"ignore\": 0"
-      "        }"
-      "      ],"
-      "      \"ignore\": 0"
-      "    }"
-      "  ],"
-      "  \"node\": {"
-      "    \"id\": \"foo\","
-      "    \"cluster\": \"bar\","
-      "    \"locality\": {"
-      "      \"region\": \"milky_way\","
-      "      \"zone\": \"sol_system\","
-      "      \"subzone\": \"earth\","
-      "      \"ignore\": {}"
-      "    },"
-      "    \"metadata\": {"
-      "      \"foo\": 1,"
-      "      \"bar\": 2"
-      "    },"
-      "    \"ignore\": \"whee\""
-      "  },"
-      "  \"ignore\": {}"
-      "}";
-  grpc_error* error = GRPC_ERROR_NONE;
-  Json json = Json::Parse(json_str, &error);
-  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
-  grpc_core::XdsBootstrap bootstrap(std::move(json), &error);
-  EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
-  EXPECT_EQ(bootstrap.server().server_uri, "fake:///lb");
-  ASSERT_EQ(bootstrap.server().channel_creds.size(), 1UL);
-  EXPECT_EQ(bootstrap.server().channel_creds[0].type, "fake");
-  EXPECT_EQ(bootstrap.server().channel_creds[0].config.type(),
-            Json::Type::JSON_NULL);
-  ASSERT_NE(bootstrap.node(), nullptr);
-  EXPECT_EQ(bootstrap.node()->id, "foo");
-  EXPECT_EQ(bootstrap.node()->cluster, "bar");
-  EXPECT_EQ(bootstrap.node()->locality_region, "milky_way");
-  EXPECT_EQ(bootstrap.node()->locality_zone, "sol_system");
-  EXPECT_EQ(bootstrap.node()->locality_subzone, "earth");
-  ASSERT_EQ(bootstrap.node()->metadata.type(), Json::Type::OBJECT);
-  EXPECT_THAT(bootstrap.node()->metadata.object_value(),
-              ::testing::ElementsAre(
-                  ::testing::Pair(
-                      ::testing::Eq("bar"),
-                      ::testing::AllOf(
-                          ::testing::Property(&Json::type, Json::Type::NUMBER),
-                          ::testing::Property(&Json::string_value, "2"))),
-                  ::testing::Pair(
-                      ::testing::Eq("foo"),
-                      ::testing::AllOf(
-                          ::testing::Property(&Json::type, Json::Type::NUMBER),
-                          ::testing::Property(&Json::string_value, "1")))));
-}
-
-TEST(XdsBootstrapTest, ValidWithoutChannelCredsAndNode) {
-  const char* json_str =
-      "{"
-      "  \"xds_servers\": ["
-      "    {"
-      "      \"server_uri\": \"fake:///lb\""
-      "    }"
-      "  ]"
-      "}";
-  grpc_error* error = GRPC_ERROR_NONE;
-  Json json = Json::Parse(json_str, &error);
-  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
-  grpc_core::XdsBootstrap bootstrap(std::move(json), &error);
-  EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
-  EXPECT_EQ(bootstrap.server().server_uri, "fake:///lb");
-  EXPECT_EQ(bootstrap.server().channel_creds.size(), 0UL);
-  EXPECT_EQ(bootstrap.node(), nullptr);
-}
-
-TEST(XdsBootstrapTest, MissingXdsServers) {
-  grpc_error* error = GRPC_ERROR_NONE;
-  Json json = Json::Parse("{}", &error);
-  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
-  grpc_core::XdsBootstrap bootstrap(std::move(json), &error);
-  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
-  ASSERT_TRUE(error != GRPC_ERROR_NONE);
-  std::regex e(std::string("\"xds_servers\" field not present"));
-  VerifyRegexMatch(error, e);
-}
-
-TEST(XdsBootstrapTest, TopFieldsWrongTypes) {
-  const char* json_str =
-      "{"
-      "  \"xds_servers\":1,"
-      "  \"node\":1"
-      "}";
-  grpc_error* error = GRPC_ERROR_NONE;
-  Json json = Json::Parse(json_str, &error);
-  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
-  grpc_core::XdsBootstrap bootstrap(std::move(json), &error);
-  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
-  ASSERT_TRUE(error != GRPC_ERROR_NONE);
-  std::regex e(
-      std::string("\"xds_servers\" field is not an array(.*)"
-                  "\"node\" field is not an object"));
-  VerifyRegexMatch(error, e);
-}
-
-TEST(XdsBootstrapTest, XdsServerMissingServerUri) {
-  const char* json_str =
-      "{"
-      "  \"xds_servers\":[{}]"
-      "}";
-  grpc_error* error = GRPC_ERROR_NONE;
-  Json json = Json::Parse(json_str, &error);
-  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
-  grpc_core::XdsBootstrap bootstrap(std::move(json), &error);
-  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
-  ASSERT_TRUE(error != GRPC_ERROR_NONE);
-  std::regex e(
-      std::string("errors parsing \"xds_servers\" array(.*)"
-                  "errors parsing index 0(.*)"
-                  "\"server_uri\" field not present"));
-  VerifyRegexMatch(error, e);
-}
-
-TEST(XdsBootstrapTest, XdsServerUriAndCredsWrongTypes) {
-  const char* json_str =
-      "{"
-      "  \"xds_servers\":["
-      "    {"
-      "      \"server_uri\":1,"
-      "      \"channel_creds\":1"
-      "    }"
-      "  ]"
-      "}";
-  grpc_error* error = GRPC_ERROR_NONE;
-  Json json = Json::Parse(json_str, &error);
-  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
-  grpc_core::XdsBootstrap bootstrap(std::move(json), &error);
-  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
-  ASSERT_TRUE(error != GRPC_ERROR_NONE);
-  std::regex e(
-      std::string("errors parsing \"xds_servers\" array(.*)"
-                  "errors parsing index 0(.*)"
-                  "\"server_uri\" field is not a string(.*)"
-                  "\"channel_creds\" field is not an array"));
-  VerifyRegexMatch(error, e);
-}
-
-TEST(XdsBootstrapTest, ChannelCredsFieldsWrongTypes) {
-  const char* json_str =
-      "{"
-      "  \"xds_servers\":["
-      "    {"
-      "      \"server_uri\":\"foo\","
-      "      \"channel_creds\":["
-      "        {"
-      "          \"type\":0,"
-      "          \"config\":1"
-      "        }"
-      "      ]"
-      "    }"
-      "  ]"
-      "}";
-  grpc_error* error = GRPC_ERROR_NONE;
-  Json json = Json::Parse(json_str, &error);
-  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
-  grpc_core::XdsBootstrap bootstrap(std::move(json), &error);
-  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
-  ASSERT_TRUE(error != GRPC_ERROR_NONE);
-  std::regex e(
-      std::string("errors parsing \"xds_servers\" array(.*)"
-                  "errors parsing index 0(.*)"
-                  "errors parsing \"channel_creds\" array(.*)"
-                  "errors parsing index 0(.*)"
-                  "\"type\" field is not a string(.*)"
-                  "\"config\" field is not an object"));
-  VerifyRegexMatch(error, e);
-}
-
-TEST(XdsBootstrapTest, NodeFieldsWrongTypes) {
-  const char* json_str =
-      "{"
-      "  \"node\":{"
-      "    \"id\":0,"
-      "    \"cluster\":0,"
-      "    \"locality\":0,"
-      "    \"metadata\":0"
-      "  }"
-      "}";
-  grpc_error* error = GRPC_ERROR_NONE;
-  Json json = Json::Parse(json_str, &error);
-  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
-  grpc_core::XdsBootstrap bootstrap(std::move(json), &error);
-  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
-  ASSERT_TRUE(error != GRPC_ERROR_NONE);
-  std::regex e(
-      std::string("errors parsing \"node\" object(.*)"
-                  "\"id\" field is not a string(.*)"
-                  "\"cluster\" field is not a string(.*)"
-                  "\"locality\" field is not an object(.*)"
-                  "\"metadata\" field is not an object"));
-  VerifyRegexMatch(error, e);
-}
-
-TEST(XdsBootstrapTest, LocalityFieldsWrongType) {
-  const char* json_str =
-      "{"
-      "  \"node\":{"
-      "    \"locality\":{"
-      "      \"region\":0,"
-      "      \"zone\":0,"
-      "      \"subzone\":0"
-      "    }"
-      "  }"
-      "}";
-  grpc_error* error = GRPC_ERROR_NONE;
-  Json json = Json::Parse(json_str, &error);
-  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
-  grpc_core::XdsBootstrap bootstrap(std::move(json), &error);
-  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
-  ASSERT_TRUE(error != GRPC_ERROR_NONE);
-  std::regex e(
-      std::string("errors parsing \"node\" object(.*)"
-                  "errors parsing \"locality\" object(.*)"
-                  "\"region\" field is not a string(.*)"
-                  "\"zone\" field is not a string(.*)"
-                  "\"subzone\" field is not a string"));
-  VerifyRegexMatch(error, e);
-}
-
-}  // namespace testing
-}  // namespace grpc_core
-
-int main(int argc, char** argv) {
-// Regexes don't work in old libstdc++ versions, so just skip testing in those
-// cases
-#if defined(__GLIBCXX__) && (__GLIBCXX__ <= 20150623)
-  gpr_log(GPR_ERROR,
-          "Skipping xds_bootstrap_test since std::regex is not supported on "
-          "this system.");
-  return 0;
-#endif
-  ::testing::InitGoogleTest(&argc, argv);
-  grpc::testing::TestEnvironment env(argc, argv);
-  grpc_init();
-  int ret = RUN_ALL_TESTS();
-  grpc_shutdown();
-  return ret;
-}
index aa844b7..ebc947a 100644 (file)
@@ -51,6 +51,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
 
   grpc_slice_buffer_destroy(&input_buffer);
   grpc_slice_buffer_destroy(&output_buffer);
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   return 0;
 }
index 3f31669..3f78caa 100644 (file)
@@ -51,6 +51,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
 
   grpc_slice_buffer_destroy(&input_buffer);
   grpc_slice_buffer_destroy(&output_buffer);
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   return 0;
 }
index c831608..0f123a1 100644 (file)
@@ -47,6 +47,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   grpc_stream_compression_context_destroy(context);
   grpc_slice_buffer_destroy(&input_buffer);
   grpc_slice_buffer_destroy(&output_buffer);
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   return 0;
 }
index 78c8efd..14695cb 100644 (file)
@@ -48,6 +48,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   grpc_stream_compression_context_destroy(context);
   grpc_slice_buffer_destroy(&input_buffer);
   grpc_slice_buffer_destroy(&output_buffer);
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   return 0;
 }
index bbbebe9..7df6f0e 100644 (file)
@@ -119,8 +119,8 @@ static void run_test(bool wait_for_ready, bool use_service_config) {
   grpc_completion_queue_shutdown(cq);
   while (grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
                                     nullptr)
-             .type != GRPC_QUEUE_SHUTDOWN)
-    ;
+             .type != GRPC_QUEUE_SHUTDOWN) {
+  }
   grpc_completion_queue_destroy(cq);
   grpc_call_unref(call);
   grpc_channel_destroy(chan);
index 0364fe1..63b0dda 100644 (file)
@@ -127,7 +127,7 @@ void test_connect(const char* server_host, const char* client_host, int port,
   if (client_host[0] == 'i') {
     /* for ipv4:/ipv6: addresses, concatenate the port to each of the parts */
     std::vector<absl::string_view> uri_parts =
-        absl::StrSplit(client_host, ",", absl::SkipEmpty());
+        absl::StrSplit(client_host, ',', absl::SkipEmpty());
     std::vector<std::string> hosts_with_port;
     hosts_with_port.reserve(uri_parts.size());
     for (const absl::string_view& uri_part : uri_parts) {
index 8c71999..4689cee 100644 (file)
@@ -50,10 +50,14 @@ struct fullstack_secure_fixture_data {
     for (size_t ind = 0; ind < thd_list.size(); ind++) {
       thd_list[ind].Join();
     }
+    grpc_tls_certificate_provider_release(client_provider);
+    grpc_tls_certificate_provider_release(server_provider);
   }
   std::string localaddr;
   grpc_tls_version tls_version;
   ThreadList thd_list;
+  grpc_tls_certificate_provider* client_provider = nullptr;
+  grpc_tls_certificate_provider* server_provider = nullptr;
 };
 
 static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack(
@@ -65,9 +69,35 @@ static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack(
   memset(&f, 0, sizeof(f));
   ffd->localaddr = grpc_core::JoinHostPort("localhost", port);
   ffd->tls_version = tls_version;
+  grpc_slice root_slice, cert_slice, key_slice;
+  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
+                               grpc_load_file(CA_CERT_PATH, 1, &root_slice)));
+  std::string root_cert =
+      std::string(grpc_core::StringViewFromSlice(root_slice));
+  GPR_ASSERT(GRPC_LOG_IF_ERROR(
+      "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice)));
+  std::string identity_cert =
+      std::string(grpc_core::StringViewFromSlice(cert_slice));
+  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
+                               grpc_load_file(SERVER_KEY_PATH, 1, &key_slice)));
+  std::string private_key =
+      std::string(grpc_core::StringViewFromSlice(key_slice));
+  grpc_tls_identity_pairs* client_pairs = grpc_tls_identity_pairs_create();
+  grpc_tls_identity_pairs_add_pair(client_pairs, private_key.c_str(),
+                                   identity_cert.c_str());
+  ffd->client_provider = grpc_tls_certificate_provider_static_data_create(
+      root_cert.c_str(), client_pairs);
+  grpc_tls_identity_pairs* server_pairs = grpc_tls_identity_pairs_create();
+  grpc_tls_identity_pairs_add_pair(server_pairs, private_key.c_str(),
+                                   identity_cert.c_str());
+  ffd->server_provider = grpc_tls_certificate_provider_static_data_create(
+      root_cert.c_str(), server_pairs);
   f.fixture_data = ffd;
   f.cq = grpc_completion_queue_create_for_next(nullptr);
   f.shutdown_cq = grpc_completion_queue_create_for_pluck(nullptr);
+  grpc_slice_unref(root_slice);
+  grpc_slice_unref(cert_slice);
+  grpc_slice_unref(key_slice);
   return f;
 }
 
@@ -151,82 +181,6 @@ static int server_authz_check_async(
   return 1;
 }
 
-// Synchronous implementation of schedule field in
-// grpc_tls_credential_reload_config instance that is a part of client-side
-// grpc_tls_credentials_options instance.
-static int client_cred_reload_sync(void* /*config_user_data*/,
-                                   grpc_tls_credential_reload_arg* arg) {
-  if (!arg->key_materials_config->pem_key_cert_pair_list().empty()) {
-    arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-    return 0;
-  }
-  grpc_slice ca_slice, cert_slice, key_slice;
-  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
-                               grpc_load_file(CA_CERT_PATH, 1, &ca_slice)));
-  GPR_ASSERT(GRPC_LOG_IF_ERROR(
-      "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice)));
-  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
-                               grpc_load_file(SERVER_KEY_PATH, 1, &key_slice)));
-  const char* ca_cert =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(ca_slice);
-  const char* server_cert =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(cert_slice);
-  const char* server_key =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(key_slice);
-  grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert};
-  if (arg->key_materials_config->pem_key_cert_pair_list().empty()) {
-    const auto* pem_key_cert_pair_ptr = &pem_key_cert_pair;
-    grpc_tls_key_materials_config_set_key_materials(
-        arg->key_materials_config, ca_cert, &pem_key_cert_pair_ptr, 1);
-  }
-  // new credential has been reloaded.
-  arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW;
-  grpc_slice_unref(cert_slice);
-  grpc_slice_unref(key_slice);
-  grpc_slice_unref(ca_slice);
-  return 0;
-}
-
-// Synchronous implementation of schedule field in
-// grpc_tls_credential_reload_config instance that is a part of server-side
-// grpc_tls_credentials_options instance.
-static int server_cred_reload_sync(void* /*config_user_data*/,
-                                   grpc_tls_credential_reload_arg* arg) {
-  if (!arg->key_materials_config->pem_key_cert_pair_list().empty()) {
-    arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-    return 0;
-  }
-  grpc_slice ca_slice, cert_slice, key_slice;
-  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
-                               grpc_load_file(CA_CERT_PATH, 1, &ca_slice)));
-  GPR_ASSERT(GRPC_LOG_IF_ERROR(
-      "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice)));
-  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
-                               grpc_load_file(SERVER_KEY_PATH, 1, &key_slice)));
-  const char* ca_cert =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(ca_slice);
-  const char* server_cert =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(cert_slice);
-  const char* server_key =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(key_slice);
-  grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert};
-  GPR_ASSERT(arg != nullptr);
-  GPR_ASSERT(arg->key_materials_config != nullptr);
-  GPR_ASSERT(arg->key_materials_config->pem_key_cert_pair_list().data() !=
-             nullptr);
-  if (arg->key_materials_config->pem_key_cert_pair_list().empty()) {
-    const auto* pem_key_cert_pair_ptr = &pem_key_cert_pair;
-    grpc_tls_key_materials_config_set_key_materials(
-        arg->key_materials_config, ca_cert, &pem_key_cert_pair_ptr, 1);
-  }
-  // new credential has been reloaded.
-  arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW;
-  grpc_slice_unref(cert_slice);
-  grpc_slice_unref(key_slice);
-  grpc_slice_unref(ca_slice);
-  return 0;
-}
-
 // Create a TLS channel credential.
 static grpc_channel_credentials* create_tls_channel_credentials(
     fullstack_secure_fixture_data* ffd) {
@@ -234,12 +188,11 @@ static grpc_channel_credentials* create_tls_channel_credentials(
   options->set_server_verification_option(GRPC_TLS_SERVER_VERIFICATION);
   options->set_min_tls_version(ffd->tls_version);
   options->set_max_tls_version(ffd->tls_version);
-  /* Set credential reload config. */
-  grpc_tls_credential_reload_config* reload_config =
-      grpc_tls_credential_reload_config_create(nullptr, client_cred_reload_sync,
-                                               nullptr, nullptr);
-  grpc_tls_credentials_options_set_credential_reload_config(options,
-                                                            reload_config);
+  // Set credential provider.
+  grpc_tls_credentials_options_set_certificate_provider(options,
+                                                        ffd->client_provider);
+  grpc_tls_credentials_options_watch_root_certs(options);
+  grpc_tls_credentials_options_watch_identity_key_cert_pairs(options);
   /* Set server authorization check config. */
   grpc_tls_server_authorization_check_config* check_config =
       grpc_tls_server_authorization_check_config_create(
@@ -248,6 +201,7 @@ static grpc_channel_credentials* create_tls_channel_credentials(
       options, check_config);
   /* Create TLS channel credentials. */
   grpc_channel_credentials* creds = grpc_tls_credentials_create(options);
+  grpc_tls_server_authorization_check_config_release(check_config);
   return creds;
 }
 
@@ -257,12 +211,11 @@ static grpc_server_credentials* create_tls_server_credentials(
   grpc_tls_credentials_options* options = grpc_tls_credentials_options_create();
   options->set_min_tls_version(ffd->tls_version);
   options->set_max_tls_version(ffd->tls_version);
-  /* Set credential reload config. */
-  grpc_tls_credential_reload_config* reload_config =
-      grpc_tls_credential_reload_config_create(nullptr, server_cred_reload_sync,
-                                               nullptr, nullptr);
-  grpc_tls_credentials_options_set_credential_reload_config(options,
-                                                            reload_config);
+  // Set credential provider.
+  grpc_tls_credentials_options_set_certificate_provider(options,
+                                                        ffd->server_provider);
+  grpc_tls_credentials_options_watch_root_certs(options);
+  grpc_tls_credentials_options_watch_identity_key_cert_pairs(options);
   /* Set client certificate request type. */
   grpc_tls_credentials_options_set_cert_request_type(
       options, GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);
index 928c1f0..2e68579 100644 (file)
@@ -46,11 +46,10 @@ struct fullstack_fixture_data {
 
 static int unique = 1;
 
-static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
-    grpc_channel_args* /*client_args*/, grpc_channel_args* /*server_args*/) {
+static grpc_end2end_test_fixture chttp2_create_fixture_fullstack_base(
+    std::string addr) {
   fullstack_fixture_data* ffd = new fullstack_fixture_data;
-  ffd->localaddr = absl::StrFormat("unix:/tmp/grpc_fullstack_test.%d.%d",
-                                   getpid(), unique++);
+  ffd->localaddr = std::move(addr);
 
   grpc_end2end_test_fixture f;
   memset(&f, 0, sizeof(f));
@@ -61,6 +60,21 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
   return f;
 }
 
+static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
+    grpc_channel_args* /*client_args*/, grpc_channel_args* /*server_args*/) {
+  const std::string localaddr = absl::StrFormat(
+      "unix:/tmp/grpc_fullstack_test.%d.%d", getpid(), unique++);
+  return chttp2_create_fixture_fullstack_base(localaddr);
+}
+
+static grpc_end2end_test_fixture
+chttp2_create_fixture_fullstack_abstract_namespace(
+    grpc_channel_args* /*client_args*/, grpc_channel_args* /*server_args*/) {
+  const std::string localaddr = absl::StrFormat(
+      "unix-abstract:grpc_fullstack_test.%d.%d", getpid(), unique++);
+  return chttp2_create_fixture_fullstack_base(localaddr);
+}
+
 void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f,
                                   grpc_channel_args* client_args) {
   fullstack_fixture_data* ffd =
@@ -97,6 +111,15 @@ static grpc_end2end_test_config configs[] = {
          FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
      nullptr, chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
      chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
+#ifndef GPR_APPLE  // Apple doesn't support an abstract socket
+    {"chttp2/fullstack_uds_abstract_namespace",
+     FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+         FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
+     nullptr, chttp2_create_fixture_fullstack_abstract_namespace,
+     chttp2_init_client_fullstack, chttp2_init_server_fullstack,
+     chttp2_tear_down_fullstack},
+#endif
 };
 
 int main(int argc, char** argv) {
index 73679dd..d7431f5 100644 (file)
@@ -63,7 +63,7 @@ void grpc_end2end_local_chttp2_init_client_fullstack(
  */
 static bool fail_server_auth_check(grpc_channel_args* server_args) {
   size_t i;
-  if (server_args == nullptr) return 0;
+  if (server_args == nullptr) return false;
   for (i = 0; i < server_args->num_args; i++) {
     if (strcmp(server_args->args[i].key, FAIL_AUTH_CHECK_SERVER_ARG_NAME) ==
         0) {
index 6584103..8901ca6 100644 (file)
@@ -116,7 +116,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
         mock_endpoint, grpc_slice_from_copied_buffer((const char*)data, size));
 
     grpc_event ev;
-    while (1) {
+    while (true) {
       grpc_core::ExecCtx::Get()->Flush();
       ev = grpc_completion_queue_next(cq, gpr_inf_past(GPR_CLOCK_REALTIME),
                                       nullptr);
@@ -156,6 +156,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
       grpc_byte_buffer_destroy(response_payload_recv);
     }
   }
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   return 0;
 }
index e811175..377a1a9 100644 (file)
@@ -74,7 +74,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
     requested_calls++;
 
     grpc_event ev;
-    while (1) {
+    while (true) {
       grpc_core::ExecCtx::Get()->Flush();
       ev = grpc_completion_queue_next(cq, gpr_inf_past(GPR_CLOCK_REALTIME),
                                       nullptr);
index 3cb3168..fb21f65 100755 (executable)
@@ -33,7 +33,10 @@ def struct(**kwargs):
 # generate_tests.bzl is now the source of truth for end2end tests.
 # The .bzl file is basically a python file and we can "execute" it
 # to get access to the variables it defines.
-execfile('test/core/end2end/generate_tests.bzl')
+exec(
+    compile(
+        open('test/core/end2end/generate_tests.bzl', "rb").read(),
+        'test/core/end2end/generate_tests.bzl', 'exec'))
 
 
 def main():
index 75725a6..7c2e961 100644 (file)
@@ -136,8 +136,8 @@ static void cleanup_test() {
   grpc_completion_queue_shutdown(g_state.cq);
   while (grpc_completion_queue_next(g_state.cq,
                                     gpr_inf_future(GPR_CLOCK_REALTIME), nullptr)
-             .type != GRPC_QUEUE_SHUTDOWN)
-    ;
+             .type != GRPC_QUEUE_SHUTDOWN) {
+  }
   grpc_completion_queue_destroy(g_state.cq);
 }
 
index c289e71..f5cf823 100644 (file)
@@ -97,8 +97,8 @@ void run_test(bool wait_for_ready) {
   grpc_completion_queue_shutdown(cq);
   while (grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
                                     nullptr)
-             .type != GRPC_QUEUE_SHUTDOWN)
-    ;
+             .type != GRPC_QUEUE_SHUTDOWN) {
+  }
   grpc_completion_queue_destroy(cq);
   grpc_call_unref(call);
   grpc_channel_destroy(chan);
index a7d9782..12aff71 100644 (file)
@@ -25,6 +25,7 @@
 #include <grpc/support/sync.h>
 #include <grpc/support/time.h>
 
+#include "src/core/lib/channel/channel_args.h"
 #include "src/core/lib/gpr/useful.h"
 #include "src/core/lib/surface/channel.h"
 #include "test/core/end2end/cq_verifier.h"
@@ -67,28 +68,20 @@ static void end_test(grpc_end2end_test_fixture* f) {
 static void test_bad_ping(grpc_end2end_test_config config) {
   grpc_end2end_test_fixture f = config.create_fixture(nullptr, nullptr);
   cq_verifier* cqv = cq_verifier_create(f.cq);
-  grpc_arg client_a[3];
-  client_a[0].type = GRPC_ARG_INTEGER;
-  client_a[0].key =
-      const_cast<char*>(GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS);
-  client_a[0].value.integer = 10;
-  client_a[1].type = GRPC_ARG_INTEGER;
-  client_a[1].key = const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA);
-  client_a[1].value.integer = 0;
-  client_a[2].type = GRPC_ARG_INTEGER;
-  client_a[2].key = const_cast<char*>(GRPC_ARG_HTTP2_BDP_PROBE);
-  client_a[2].value.integer = 0;
-  grpc_arg server_a[3];
-  server_a[0].type = GRPC_ARG_INTEGER;
-  server_a[0].key =
-      const_cast<char*>(GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS);
-  server_a[0].value.integer = 300000 /* 5 minutes */;
-  server_a[1].type = GRPC_ARG_INTEGER;
-  server_a[1].key = const_cast<char*>(GRPC_ARG_HTTP2_MAX_PING_STRIKES);
-  server_a[1].value.integer = MAX_PING_STRIKES;
-  server_a[2].type = GRPC_ARG_INTEGER;
-  server_a[2].key = const_cast<char*>(GRPC_ARG_HTTP2_BDP_PROBE);
-  server_a[2].value.integer = 0;
+  grpc_arg client_a[] = {
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA), 0),
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_HTTP2_BDP_PROBE), 0)};
+  grpc_arg server_a[] = {
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(
+              GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS),
+          300000 /* 5 minutes */),
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_HTTP2_MAX_PING_STRIKES), MAX_PING_STRIKES),
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_HTTP2_BDP_PROBE), 0)};
   grpc_channel_args client_args = {GPR_ARRAY_SIZE(client_a), client_a};
   grpc_channel_args server_args = {GPR_ARRAY_SIZE(server_a), server_a};
 
@@ -224,30 +217,23 @@ static void test_bad_ping(grpc_end2end_test_config config) {
 static void test_pings_without_data(grpc_end2end_test_config config) {
   grpc_end2end_test_fixture f = config.create_fixture(nullptr, nullptr);
   cq_verifier* cqv = cq_verifier_create(f.cq);
-  grpc_arg client_a[3];
-  client_a[0].type = GRPC_ARG_INTEGER;
-  client_a[0].key =
-      const_cast<char*>(GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS);
-  client_a[0].value.integer = 10;
   // Only allow MAX_PING_STRIKES pings without data (DATA/HEADERS/WINDOW_UPDATE)
   // so that the transport will throttle the excess pings.
-  client_a[1].type = GRPC_ARG_INTEGER;
-  client_a[1].key = const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA);
-  client_a[1].value.integer = MAX_PING_STRIKES;
-  client_a[2].type = GRPC_ARG_INTEGER;
-  client_a[2].key = const_cast<char*>(GRPC_ARG_HTTP2_BDP_PROBE);
-  client_a[2].value.integer = 0;
-  grpc_arg server_a[3];
-  server_a[0].type = GRPC_ARG_INTEGER;
-  server_a[0].key =
-      const_cast<char*>(GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS);
-  server_a[0].value.integer = 300000 /* 5 minutes */;
-  server_a[1].type = GRPC_ARG_INTEGER;
-  server_a[1].key = const_cast<char*>(GRPC_ARG_HTTP2_MAX_PING_STRIKES);
-  server_a[1].value.integer = MAX_PING_STRIKES;
-  server_a[2].type = GRPC_ARG_INTEGER;
-  server_a[2].key = const_cast<char*>(GRPC_ARG_HTTP2_BDP_PROBE);
-  server_a[2].value.integer = 0;
+  grpc_arg client_a[] = {
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA),
+          MAX_PING_STRIKES),
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_HTTP2_BDP_PROBE), 0)};
+  grpc_arg server_a[] = {
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(
+              GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS),
+          300000 /* 5 minutes */),
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_HTTP2_MAX_PING_STRIKES), MAX_PING_STRIKES),
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_HTTP2_BDP_PROBE), 0)};
   grpc_channel_args client_args = {GPR_ARRAY_SIZE(client_a), client_a};
   grpc_channel_args server_args = {GPR_ARRAY_SIZE(server_a), server_a};
 
index a2aa580..1e75b2b 100644 (file)
@@ -19,6 +19,8 @@
 #ifndef GRPC_TEST_CORE_END2END_TESTS_CANCEL_TEST_HELPERS_H
 #define GRPC_TEST_CORE_END2END_TESTS_CANCEL_TEST_HELPERS_H
 
+#include <grpc/grpc.h>
+
 typedef struct {
   const char* name;
   grpc_call_error (*initiate_cancel)(grpc_call* call, void* reserved);
index 645e272..0a97962 100644 (file)
@@ -22,6 +22,7 @@
 #include <grpc/support/sync.h>
 #include <grpc/support/time.h>
 
+#include "src/core/lib/channel/channel_args.h"
 #include "src/core/lib/gpr/useful.h"
 #include "src/core/lib/surface/channel.h"
 #include "test/core/end2end/cq_verifier.h"
@@ -37,25 +38,18 @@ static void test_ping(grpc_end2end_test_config config,
   grpc_connectivity_state state = GRPC_CHANNEL_IDLE;
   int i;
 
-  grpc_arg client_a[3];
-  client_a[0].type = GRPC_ARG_INTEGER;
-  client_a[0].key =
-      const_cast<char*>(GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS);
-  client_a[0].value.integer = 10;
-  client_a[1].type = GRPC_ARG_INTEGER;
-  client_a[1].key = const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA);
-  client_a[1].value.integer = 0;
-  client_a[2].type = GRPC_ARG_INTEGER;
-  client_a[2].key = const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS);
-  client_a[2].value.integer = 1;
-  grpc_arg server_a[2];
-  server_a[0].type = GRPC_ARG_INTEGER;
-  server_a[0].key =
-      const_cast<char*>(GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS);
-  server_a[0].value.integer = 0;
-  server_a[1].type = GRPC_ARG_INTEGER;
-  server_a[1].key = const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS);
-  server_a[1].value.integer = 1;
+  grpc_arg client_a[] = {
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA), 0),
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS), 1)};
+  grpc_arg server_a[] = {
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(
+              GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS),
+          0),
+      grpc_channel_arg_integer_create(
+          const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS), 1)};
   grpc_channel_args client_args = {GPR_ARRAY_SIZE(client_a), client_a};
   grpc_channel_args server_args = {GPR_ARRAY_SIZE(server_a), server_a};
 
index cdd72e9..0db133b 100644 (file)
@@ -20,6 +20,24 @@ licenses(["notice"])  # Apache v2
 grpc_package(name = "test/core/gprpp")
 
 grpc_cc_test(
+    name = "examine_stack_test",
+    srcs = ["examine_stack_test.cc"],
+    external_deps = [
+        "absl/debugging:stacktrace",
+        "absl/debugging:symbolize",
+        "gtest",
+    ],
+    language = "C++",
+    # TODO(https://github.com/grpc/grpc/issues/24627): Disable this on Windows
+    tags = ["no_windows"],
+    uses_polling = False,
+    deps = [
+        "//:gpr",
+        "//test/core/util:grpc_test_util",
+    ],
+)
+
+grpc_cc_test(
     name = "fork_test",
     srcs = ["fork_test.cc"],
     language = "C++",
@@ -159,3 +177,18 @@ grpc_cc_test(
         "//test/core/util:grpc_test_util",
     ],
 )
+
+grpc_cc_test(
+    name = "stat_test",
+    srcs = ["stat_test.cc"],
+    external_deps = [
+        "gtest",
+    ],
+    language = "C++",
+    uses_polling = False,
+    deps = [
+        "//:gpr",
+        "//:grpc",
+        "//test/core/util:grpc_test_util",
+    ],
+)
index ac3e5d9..53fe088 100644 (file)
@@ -30,7 +30,7 @@ namespace {
 class Foo : public DualRefCounted<Foo> {
  public:
   Foo() = default;
-  ~Foo() { GPR_ASSERT(shutting_down_); }
+  ~Foo() override { GPR_ASSERT(shutting_down_); }
 
   void Orphan() override { shutting_down_ = true; }
 
@@ -72,14 +72,10 @@ TEST(DualRefCounted, RefIfNonZero) {
   foo->WeakUnref();
 }
 
-// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that
-// things build properly in both debug and non-debug cases.
-DebugOnlyTraceFlag foo_tracer(true, "foo");
-
 class FooWithTracing : public DualRefCounted<FooWithTracing> {
  public:
-  FooWithTracing() : DualRefCounted(&foo_tracer) {}
-  ~FooWithTracing() { GPR_ASSERT(shutting_down_); }
+  FooWithTracing() : DualRefCounted("FooWithTracing") {}
+  ~FooWithTracing() override { GPR_ASSERT(shutting_down_); }
 
   void Orphan() override { shutting_down_ = true; }
 
diff --git a/test/core/gprpp/examine_stack_test.cc b/test/core/gprpp/examine_stack_test.cc
new file mode 100644 (file)
index 0000000..eec6a2f
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ *
+ * Copyright 2020 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "src/core/lib/gprpp/examine_stack.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include <gtest/gtest.h>
+
+#include "absl/debugging/stacktrace.h"
+#include "absl/debugging/symbolize.h"
+
+#include <grpc/support/log.h>
+
+namespace {
+
+std::string SimpleCurrentStackTraceProvider() { return "stacktrace"; }
+
+std::string AbseilCurrentStackTraceProvider() {
+  std::string result = "Stack trace:\n";
+  constexpr int kNumStackFrames = 10;
+  void* stack[kNumStackFrames];
+  int frame_sizes[kNumStackFrames];
+  int depth = absl::GetStackFrames(stack, frame_sizes, kNumStackFrames, 1);
+  for (int i = 0; i < depth; i++) {
+    char tmp[1024];
+    const char* symbol = "(unknown)";
+    if (absl::Symbolize(stack[i], tmp, sizeof(tmp))) {
+      symbol = tmp;
+    }
+    result += symbol;
+    result += +"\n";
+  }
+  return result;
+}
+
+}  // namespace
+
+TEST(ExamineStackTest, NullStackProvider) {
+  grpc_core::SetCurrentStackTraceProvider(nullptr);
+  EXPECT_EQ(grpc_core::GetCurrentStackTraceProvider(), nullptr);
+  EXPECT_EQ(grpc_core::GetCurrentStackTrace(), absl::nullopt);
+}
+
+TEST(ExamineStackTest, SimpleStackProvider) {
+  grpc_core::SetCurrentStackTraceProvider(&SimpleCurrentStackTraceProvider);
+  EXPECT_NE(grpc_core::GetCurrentStackTraceProvider(), nullptr);
+  EXPECT_EQ(grpc_core::GetCurrentStackTrace(), "stacktrace");
+}
+
+TEST(ExamineStackTest, AbseilStackProvider) {
+  grpc_core::SetCurrentStackTraceProvider(&AbseilCurrentStackTraceProvider);
+  EXPECT_NE(grpc_core::GetCurrentStackTraceProvider(), nullptr);
+  const absl::optional<std::string> stack_trace =
+      grpc_core::GetCurrentStackTrace();
+  EXPECT_NE(stack_trace, absl::nullopt);
+  gpr_log(GPR_INFO, "stack_trace=%s", stack_trace->c_str());
+#if !defined(NDEBUG) && !defined(GPR_MUSL_LIBC_COMPAT)
+  EXPECT_TRUE(stack_trace->find("GetCurrentStackTrace") != -1);
+#endif
+}
+
+int main(int argc, char** argv) {
+  absl::InitializeSymbolizer(argv[0]);
+  ::testing::InitGoogleTest(&argc, argv);
+  int ret = RUN_ALL_TESTS();
+  return ret;
+}
index 5f41920..828f2f8 100644 (file)
@@ -39,7 +39,7 @@ class A {
 class B : public A {
  public:
   B() {}
-  ~B() {}
+  ~B() override {}
   const char* foo() override { return "B_foo"; }
   char get_junk() { return junk[0]; }
 
@@ -50,8 +50,8 @@ class B : public A {
 class C : public B {
  public:
   C() {}
-  ~C() {}
-  virtual const char* bar() { return "C_bar"; }
+  ~C() override {}
+  const char* bar() override { return "C_bar"; }
   char get_more_junk() { return more_junk[0]; }
 
  private:
@@ -60,7 +60,7 @@ class C : public B {
 
 class D : public A {
  public:
-  virtual const char* bar() { return "D_bar"; }
+  const char* bar() override { return "D_bar"; }
 };
 
 static void basic_test() {
index 341b753..9fd4af4 100644 (file)
@@ -79,15 +79,10 @@ TEST(OrphanablePtr, InternallyRefCounted) {
   bar->FinishWork();
 }
 
-// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that
-// things build properly in both debug and non-debug cases.
-DebugOnlyTraceFlag baz_tracer(true, "baz");
-
 class Baz : public InternallyRefCounted<Baz> {
  public:
   Baz() : Baz(0) {}
-  explicit Baz(int value)
-      : InternallyRefCounted<Baz>(&baz_tracer), value_(value) {}
+  explicit Baz(int value) : InternallyRefCounted<Baz>("Baz"), value_(value) {}
   void Orphan() override { Unref(); }
   int value() const { return value_; }
 
index 3907b21..bf20297 100644 (file)
@@ -58,14 +58,16 @@ TEST(RefCountedPtr, ExplicitConstructor) { RefCountedPtr<Foo> foo(new Foo()); }
 TEST(RefCountedPtr, MoveConstructor) {
   RefCountedPtr<Foo> foo(new Foo());
   RefCountedPtr<Foo> foo2(std::move(foo));
-  EXPECT_EQ(nullptr, foo.get());  // NOLINT
+  // NOLINTNEXTLINE(bugprone-use-after-move)
+  EXPECT_EQ(nullptr, foo.get());
   EXPECT_NE(nullptr, foo2.get());
 }
 
 TEST(RefCountedPtr, MoveAssignment) {
   RefCountedPtr<Foo> foo(new Foo());
   RefCountedPtr<Foo> foo2 = std::move(foo);
-  EXPECT_EQ(nullptr, foo.get());  // NOLINT
+  // NOLINTNEXTLINE(bugprone-use-after-move)
+  EXPECT_EQ(nullptr, foo.get());
   EXPECT_NE(nullptr, foo2.get());
 }
 
@@ -100,6 +102,7 @@ TEST(RefCountedPtr, EnclosedScope) {
   RefCountedPtr<Foo> foo(new Foo());
   {
     RefCountedPtr<Foo> foo2(std::move(foo));
+    // NOLINTNEXTLINE(bugprone-use-after-move)
     EXPECT_EQ(nullptr, foo.get());
     EXPECT_NE(nullptr, foo2.get());
   }
@@ -180,11 +183,9 @@ TEST(MakeRefCounted, Args) {
   EXPECT_EQ(3, foo->value());
 }
 
-TraceFlag foo_tracer(true, "foo");
-
 class FooWithTracing : public RefCounted<FooWithTracing> {
  public:
-  FooWithTracing() : RefCounted(&foo_tracer) {}
+  FooWithTracing() : RefCounted("FooWithTracing") {}
 };
 
 TEST(RefCountedPtr, RefCountedWithTracing) {
@@ -265,7 +266,7 @@ class Bar : public DualRefCounted<Bar> {
 
   explicit Bar(int value) : value_(value) {}
 
-  ~Bar() { GPR_ASSERT(shutting_down_); }
+  ~Bar() override { GPR_ASSERT(shutting_down_); }
 
   void Orphan() override { shutting_down_ = true; }
 
@@ -339,6 +340,7 @@ TEST(WeakRefCountedPtr, EnclosedScope) {
   WeakRefCountedPtr<Bar> bar = bar_strong->WeakRef();
   {
     WeakRefCountedPtr<Bar> bar2(std::move(bar));
+    // NOLINTNEXTLINE(bugprone-use-after-move)
     EXPECT_EQ(nullptr, bar.get());
     EXPECT_NE(nullptr, bar2.get());
   }
@@ -416,13 +418,11 @@ TEST(WeakRefCountedPtr, Swap) {
   EXPECT_EQ(bar_strong.get(), bar3.get());
 }
 
-TraceFlag bar_tracer(true, "bar");
-
 class BarWithTracing : public DualRefCounted<BarWithTracing> {
  public:
-  BarWithTracing() : DualRefCounted(&bar_tracer) {}
+  BarWithTracing() : DualRefCounted("BarWithTracing") {}
 
-  ~BarWithTracing() { GPR_ASSERT(shutting_down_); }
+  ~BarWithTracing() override { GPR_ASSERT(shutting_down_); }
 
   void Orphan() override { shutting_down_ = true; }
 
@@ -442,7 +442,7 @@ class WeakBaseClass : public DualRefCounted<WeakBaseClass> {
  public:
   WeakBaseClass() {}
 
-  ~WeakBaseClass() { GPR_ASSERT(shutting_down_); }
+  ~WeakBaseClass() override { GPR_ASSERT(shutting_down_); }
 
   void Orphan() override { shutting_down_ = true; }
 
index c978f02..fefe90b 100644 (file)
@@ -126,13 +126,9 @@ TEST(RefCountedNonPolymorphic, ExtraRef) {
   foo->Unref();
 }
 
-// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that
-// things build properly in both debug and non-debug cases.
-DebugOnlyTraceFlag foo_tracer(true, "foo");
-
 class FooWithTracing : public RefCounted<FooWithTracing> {
  public:
-  FooWithTracing() : RefCounted(&foo_tracer) {}
+  FooWithTracing() : RefCounted("Foo") {}
 };
 
 TEST(RefCountedWithTracing, Basic) {
@@ -150,7 +146,7 @@ TEST(RefCountedWithTracing, Basic) {
 class FooNonPolymorphicWithTracing
     : public RefCounted<FooNonPolymorphicWithTracing, NonPolymorphicRefCount> {
  public:
-  FooNonPolymorphicWithTracing() : RefCounted(&foo_tracer) {}
+  FooNonPolymorphicWithTracing() : RefCounted("FooNonPolymorphicWithTracing") {}
 };
 
 TEST(RefCountedNonPolymorphicWithTracing, Basic) {
diff --git a/test/core/gprpp/stat_test.cc b/test/core/gprpp/stat_test.cc
new file mode 100644 (file)
index 0000000..a807717
--- /dev/null
@@ -0,0 +1,74 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <stdio.h>
+#include <string.h>
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include <grpc/grpc.h>
+#include <grpc/slice.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+
+#include "src/core/lib/gpr/string.h"
+#include "src/core/lib/gpr/tmpfile.h"
+#include "src/core/lib/gprpp/stat.h"
+#include "src/core/lib/iomgr/load_file.h"
+#include "test/core/util/test_config.h"
+
+namespace grpc_core {
+namespace testing {
+namespace {
+
+TEST(STAT, GetTimestampOnTmpFile) {
+  // Create a temporary empty file.
+  FILE* tmp = nullptr;
+  char* tmp_name;
+  tmp = gpr_tmpfile("prefix", &tmp_name);
+  ASSERT_NE(tmp_name, nullptr);
+  ASSERT_NE(tmp, nullptr);
+  fclose(tmp);
+  // Check the last modified date is correctly set.
+  time_t timestamp = 0;
+  absl::Status status =
+      grpc_core::GetFileModificationTime(tmp_name, &timestamp);
+  EXPECT_EQ(status.code(), absl::StatusCode::kOk);
+  EXPECT_GT(timestamp, 0);
+  // Clean up.
+  remove(tmp_name);
+  gpr_free(tmp_name);
+}
+
+TEST(STAT, GetTimestampOnFailure) {
+  time_t timestamp = 0;
+  absl::Status status =
+      grpc_core::GetFileModificationTime("/DOES_NOT_EXIST", &timestamp);
+  EXPECT_EQ(status.code(), absl::StatusCode::kInternal);
+  // Check the last modified date is not set.
+  EXPECT_EQ(timestamp, 0);
+}
+
+}  // namespace
+}  // namespace testing
+}  // namespace grpc_core
+
+int main(int argc, char** argv) {
+  grpc::testing::TestEnvironment env(argc, argv);
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
index 8a72620..af78fcd 100644 (file)
@@ -204,8 +204,8 @@ static void server_thread(void* arg) {
 
   // Wait until the client drops its connection.
   char buf;
-  while (SSL_read(ssl, &buf, sizeof(buf)) > 0)
-    ;
+  while (SSL_read(ssl, &buf, sizeof(buf)) > 0) {
+  }
 
   SSL_free(ssl);
   close(client);
index 6aae1ad..c146850 100644 (file)
@@ -53,7 +53,7 @@ namespace grpc_core {
 
 class ReadAheadHandshaker : public Handshaker {
  public:
-  virtual ~ReadAheadHandshaker() {}
+  ~ReadAheadHandshaker() override {}
   const char* name() const override { return "read_ahead"; }
   void Shutdown(grpc_error* /*why*/) override {}
   void DoHandshake(grpc_tcp_server_acceptor* /*acceptor*/,
@@ -84,6 +84,6 @@ int main(int /*argc*/, char* /*argv*/[]) {
       absl::make_unique<ReadAheadHandshakerFactory>());
   const char* full_alpn_list[] = {"grpc-exp", "h2"};
   GPR_ASSERT(server_ssl_test(full_alpn_list, 2, "grpc-exp"));
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   return 0;
 }
index 83259cc..e0b29ab 100644 (file)
@@ -132,7 +132,7 @@ static void session_read_cb(void* arg, /*session */
   ssize_t read_total = 0;
 
   if (error != GRPC_ERROR_NONE) {
-    session_shutdown_cb(arg, 1);
+    session_shutdown_cb(arg, true);
     return;
   }
 
@@ -147,7 +147,7 @@ static void session_read_cb(void* arg, /*session */
      It is possible to read nothing due to spurious edge event or data has
      been drained, In such a case, read() returns -1 and set errno to EAGAIN. */
   if (read_once == 0) {
-    session_shutdown_cb(arg, 1);
+    session_shutdown_cb(arg, true);
   } else if (read_once == -1) {
     if (errno == EAGAIN) {
       /* An edge triggered event is cached in the kernel until next poll.
index 58f067c..6af22b4 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = iphoneos;
                                VALIDATE_PRODUCT = YES;
index e6ec66d..69e9bf4 100644 (file)
@@ -1,5 +1,5 @@
 source 'https://github.com/CocoaPods/Specs.git'
-platform :ios, '8.0'
+platform :ios, '9.0'
 
 install! 'cocoapods', :deterministic_uuids => false
 
@@ -8,7 +8,7 @@ GRPC_LOCAL_SRC = '../../../../..'
 
 # Install the dependencies in the main target plus all test targets.
 target 'CFStreamTests' do
-  pod 'gRPC-Core/CFStream-Implementation', :path => GRPC_LOCAL_SRC
+  pod 'gRPC-Core', :path => GRPC_LOCAL_SRC
   pod 'BoringSSL-GRPC', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c", :inhibit_warnings => true
 end
 
index d23f26f..a008dc5 100755 (executable)
@@ -37,3 +37,15 @@ rm -f Podfile.lock
 echo "TIME:  $(date)"
 pod install
 
+# ios-test-cfstream-tests flakes sometimes because of missing files in gRPC-Core,
+# add some log to help find out the root cause.
+# TODO(yulinliang): Delete it after solving the issue.
+if [ -d "./Pods/Headers/Public/gRPC-Core/grpc/impl/codegen" ]
+then 
+    echo "grpc/impl/codegen/ has been imported."
+    number_of_files=$(find Pods/Headers/Public/gRPC-Core/grpc/impl/codegen -name "*.h" | wc -l)
+    echo "The number of files in Pods/Headers/Public/gRPC-Core/grpc/impl/codegen/ is $number_of_files"
+else
+    echo "Error: grpc/impl/codegen/ hasn't been imported."
+fi
+
index 9c3d221..93beb66 100644 (file)
@@ -93,7 +93,7 @@ class ConsumerThread {
     int count = 0;
 
     WorkItem* item;
-    while ((item = static_cast<WorkItem*>(queue_->Get())) != nullptr) {
+    while ((item = static_cast<WorkItem*>(queue_->Get(nullptr))) != nullptr) {
       count++;
       GPR_ASSERT(!item->done);
       item->done = true;
@@ -113,7 +113,7 @@ static void test_FIFO(void) {
   }
   GPR_ASSERT(large_queue.count() == TEST_NUM_ITEMS);
   for (int i = 0; i < TEST_NUM_ITEMS; ++i) {
-    WorkItem* item = static_cast<WorkItem*>(large_queue.Get());
+    WorkItem* item = static_cast<WorkItem*>(large_queue.Get(nullptr));
     GPR_ASSERT(i == item->index);
     delete item;
   }
@@ -130,12 +130,12 @@ static void test_space_efficiency(void) {
   // Queue should not have been expanded at this time.
   GPR_ASSERT(queue.num_nodes() == queue.init_num_nodes());
   for (int i = 0; i < queue.init_num_nodes(); ++i) {
-    WorkItem* item = static_cast<WorkItem*>(queue.Get());
+    WorkItem* item = static_cast<WorkItem*>(queue.Get(nullptr));
     queue.Put(item);
   }
   GPR_ASSERT(queue.num_nodes() == queue.init_num_nodes());
   for (int i = 0; i < queue.init_num_nodes(); ++i) {
-    WorkItem* item = static_cast<WorkItem*>(queue.Get());
+    WorkItem* item = static_cast<WorkItem*>(queue.Get(nullptr));
     delete item;
   }
   // Queue never shrinks even it is empty.
@@ -149,7 +149,7 @@ static void test_space_efficiency(void) {
   // Queue should have been expanded once.
   GPR_ASSERT(queue.num_nodes() == queue.init_num_nodes() * 2);
   for (int i = 0; i < queue.init_num_nodes(); ++i) {
-    WorkItem* item = static_cast<WorkItem*>(queue.Get());
+    WorkItem* item = static_cast<WorkItem*>(queue.Get(nullptr));
     delete item;
   }
   GPR_ASSERT(queue.count() == queue.init_num_nodes());
@@ -162,7 +162,7 @@ static void test_space_efficiency(void) {
   // Queue should have been expanded twice.
   GPR_ASSERT(queue.num_nodes() == queue.init_num_nodes() * 4);
   for (int i = 0; i < queue.init_num_nodes() * 2 + 1; ++i) {
-    WorkItem* item = static_cast<WorkItem*>(queue.Get());
+    WorkItem* item = static_cast<WorkItem*>(queue.Get(nullptr));
     delete item;
   }
   GPR_ASSERT(queue.count() == 0);
index f0ad08b..1f9db4b 100644 (file)
 
 static void test_grpc_parse_unix(const char* uri_text, const char* pathname) {
   grpc_core::ExecCtx exec_ctx;
-  grpc_uri* uri = grpc_uri_parse(uri_text, 0);
+  grpc_uri* uri = grpc_uri_parse(uri_text, false);
   grpc_resolved_address addr;
 
-  GPR_ASSERT(1 == grpc_parse_unix(uri, &addr));
+  GPR_ASSERT(1 == grpc_parse_uri(uri, &addr));
   struct sockaddr_un* addr_un =
       reinterpret_cast<struct sockaddr_un*>(addr.addr);
   GPR_ASSERT(AF_UNIX == addr_un->sun_family);
@@ -48,16 +48,34 @@ static void test_grpc_parse_unix(const char* uri_text, const char* pathname) {
   grpc_uri_destroy(uri);
 }
 
+static void test_grpc_parse_unix_abstract(const char* uri_text,
+                                          const char* pathname) {
+  grpc_core::ExecCtx exec_ctx;
+  grpc_uri* uri = grpc_uri_parse(uri_text, false);
+  grpc_resolved_address addr;
+
+  GPR_ASSERT(1 == grpc_parse_uri(uri, &addr));
+  struct sockaddr_un* addr_un =
+      reinterpret_cast<struct sockaddr_un*>(addr.addr);
+  GPR_ASSERT(AF_UNIX == addr_un->sun_family);
+  GPR_ASSERT('\0' == addr_un->sun_path[0]);
+  GPR_ASSERT(0 == strncmp(addr_un->sun_path + 1, pathname, strlen(pathname)));
+
+  grpc_uri_destroy(uri);
+}
+
 #else /* GRPC_HAVE_UNIX_SOCKET */
 
 static void test_grpc_parse_unix(const char* uri_text, const char* pathname) {}
+static void test_grpc_parse_unix_abstract(const char* uri_text,
+                                          const char* pathname) {}
 
 #endif /* GRPC_HAVE_UNIX_SOCKET */
 
 static void test_grpc_parse_ipv4(const char* uri_text, const char* host,
                                  unsigned short port) {
   grpc_core::ExecCtx exec_ctx;
-  grpc_uri* uri = grpc_uri_parse(uri_text, 0);
+  grpc_uri* uri = grpc_uri_parse(uri_text, false);
   grpc_resolved_address addr;
   char ntop_buf[GRPC_INET_ADDRSTRLEN];
 
@@ -75,7 +93,7 @@ static void test_grpc_parse_ipv4(const char* uri_text, const char* host,
 static void test_grpc_parse_ipv6(const char* uri_text, const char* host,
                                  unsigned short port, uint32_t scope_id) {
   grpc_core::ExecCtx exec_ctx;
-  grpc_uri* uri = grpc_uri_parse(uri_text, 0);
+  grpc_uri* uri = grpc_uri_parse(uri_text, false);
   grpc_resolved_address addr;
   char ntop_buf[GRPC_INET6_ADDRSTRLEN];
 
@@ -94,7 +112,7 @@ static void test_grpc_parse_ipv6(const char* uri_text, const char* host,
 /* Test parsing invalid ipv6 addresses (valid uri_text but invalid ipv6 addr) */
 static void test_grpc_parse_ipv6_invalid(const char* uri_text) {
   grpc_core::ExecCtx exec_ctx;
-  grpc_uri* uri = grpc_uri_parse(uri_text, 0);
+  grpc_uri* uri = grpc_uri_parse(uri_text, false);
   grpc_resolved_address addr;
   GPR_ASSERT(!grpc_parse_ipv6(uri, &addr));
   grpc_uri_destroy(uri);
@@ -105,6 +123,7 @@ int main(int argc, char** argv) {
   grpc_init();
 
   test_grpc_parse_unix("unix:/path/name", "/path/name");
+  test_grpc_parse_unix_abstract("unix-abstract:foobar", "foobar");
   test_grpc_parse_ipv4("ipv4:192.0.2.1:12345", "192.0.2.1", 12345);
   test_grpc_parse_ipv6("ipv6:[2001:db8::1]:12345", "2001:db8::1", 12345, 0);
   test_grpc_parse_ipv6("ipv6:[2001:db8::1%252]:12345", "2001:db8::1", 12345, 2);
index aa499d9..3b3c3be 100644 (file)
@@ -41,7 +41,7 @@ static void test_grpc_parse_ipv6_parity_with_getaddrinfo(
     const char* target, const struct sockaddr_in6 result_from_getaddrinfo) {
   // Get the sockaddr that gRPC's ipv6 resolver resolves this too.
   grpc_core::ExecCtx exec_ctx;
-  grpc_uri* uri = grpc_uri_parse(target, 0);
+  grpc_uri* uri = grpc_uri_parse(target, false);
   grpc_resolved_address addr;
   GPR_ASSERT(1 == grpc_parse_ipv6(uri, &addr));
   grpc_sockaddr_in6* result_from_grpc_parser =
@@ -61,7 +61,7 @@ static void test_grpc_parse_ipv6_parity_with_getaddrinfo(
 }
 
 struct sockaddr_in6 resolve_with_gettaddrinfo(const char* uri_text) {
-  grpc_uri* uri = grpc_uri_parse(uri_text, 0);
+  grpc_uri* uri = grpc_uri_parse(uri_text, false);
   std::string host;
   std::string port;
   grpc_core::SplitHostPort(uri->path, &host, &port);
index ead3679..3e6d346 100644 (file)
@@ -138,40 +138,6 @@ static void must_fail(void* argsp, grpc_error* err) {
   gpr_mu_unlock(args->mu);
 }
 
-static void test_unix_socket(void) {
-  grpc_core::ExecCtx exec_ctx;
-  args_struct args;
-  args_init(&args);
-  poll_pollset_until_request_done(&args);
-  grpc_resolve_address(
-      "unix:/path/name", nullptr, args.pollset_set,
-      GRPC_CLOSURE_CREATE(must_succeed, &args, grpc_schedule_on_exec_ctx),
-      &args.addrs);
-  args_finish(&args);
-}
-
-static void test_unix_socket_path_name_too_long(void) {
-  grpc_core::ExecCtx exec_ctx;
-  args_struct args;
-  args_init(&args);
-  const char prefix[] = "unix:/path/name";
-  size_t path_name_length =
-      GPR_ARRAY_SIZE(((struct sockaddr_un*)nullptr)->sun_path) + 6;
-  char* path_name =
-      static_cast<char*>(gpr_malloc(sizeof(char) * path_name_length));
-  memset(path_name, 'a', path_name_length);
-  memcpy(path_name, prefix, strlen(prefix) - 1);
-  path_name[path_name_length - 1] = '\0';
-
-  poll_pollset_until_request_done(&args);
-  grpc_resolve_address(
-      path_name, nullptr, args.pollset_set,
-      GRPC_CLOSURE_CREATE(must_fail, &args, grpc_schedule_on_exec_ctx),
-      &args.addrs);
-  gpr_free(path_name);
-  args_finish(&args);
-}
-
 static void resolve_address_must_succeed(const char* target) {
   grpc_core::ExecCtx exec_ctx;
   args_struct args;
@@ -250,10 +216,6 @@ int main(int argc, char** argv) {
     // unconditionally use the native DNS resolver).
     grpc_core::UniquePtr<char> resolver =
         GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver);
-    if (gpr_stricmp(resolver.get(), "native") == 0) {
-      test_unix_socket();
-      test_unix_socket_path_name_too_long();
-    }
   }
   gpr_cmdline_destroy(cl);
 
index a593a41..85dd39e 100644 (file)
@@ -77,8 +77,8 @@ struct TestCall {
     grpc_completion_queue_shutdown(cq);
     while (grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
                                       nullptr)
-               .type != GRPC_QUEUE_SHUTDOWN)
-      ;
+               .type != GRPC_QUEUE_SHUTDOWN) {
+    }
     grpc_completion_queue_destroy(cq);
   }
 
@@ -236,8 +236,8 @@ class TestServer {
     grpc_completion_queue_shutdown(cq_);
     while (grpc_completion_queue_next(cq_, gpr_inf_future(GPR_CLOCK_REALTIME),
                                       nullptr)
-               .type != GRPC_QUEUE_SHUTDOWN)
-      ;
+               .type != GRPC_QUEUE_SHUTDOWN) {
+    }
     grpc_completion_queue_destroy(cq_);
   }
 
index 194a70c..fa8ef54 100644 (file)
@@ -24,6 +24,8 @@
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/core/lib/gpr/useful.h"
 #include "src/core/lib/gprpp/thd.h"
 #include "src/core/lib/iomgr/work_serializer.h"
@@ -94,7 +96,7 @@ TEST(WorkSerializerTest, ExecuteMany) {
   {
     std::vector<std::unique_ptr<TestThread>> threads;
     for (size_t i = 0; i < 100; ++i) {
-      threads.push_back(std::unique_ptr<TestThread>(new TestThread(&lock)));
+      threads.push_back(absl::make_unique<TestThread>(&lock));
     }
   }
 }
index 2987738..e576028 100644 (file)
@@ -96,6 +96,19 @@ grpc_cc_test(
 )
 
 grpc_cc_test(
+    name = "aws_request_signer_test",
+    srcs = ["aws_request_signer_test.cc"],
+    external_deps = ["gtest"],
+    language = "C++",
+    deps = [
+        "//:gpr",
+        "//:grpc",
+        "//:grpc_secure",
+        "//test/core/util:grpc_test_util",
+    ],
+)
+
+grpc_cc_test(
     name = "evaluate_args_test",
     srcs = ["evaluate_args_test.cc"],
     external_deps = ["gtest"],
@@ -279,6 +292,10 @@ grpc_cc_test(
     srcs = ["tls_security_connector_test.cc"],
     data = [
         "//src/core/tsi/test_creds:ca.pem",
+        "//src/core/tsi/test_creds:multi-domain.key",
+        "//src/core/tsi/test_creds:multi-domain.pem",
+        "//src/core/tsi/test_creds:server0.key",
+        "//src/core/tsi/test_creds:server0.pem",
         "//src/core/tsi/test_creds:server1.key",
         "//src/core/tsi/test_creds:server1.pem",
     ],
@@ -326,3 +343,17 @@ grpc_cc_test(
         "//test/core/util:grpc_test_util",
     ],
 )
+
+grpc_cc_test(
+    name = "insecure_security_connector_test",
+    srcs = ["insecure_security_connector_test.cc"],
+    external_deps = [
+        "gtest",
+    ],
+    deps = [
+        "//:gpr",
+        "//:grpc",
+        "//:grpc_secure",
+        "//test/core/util:grpc_test_util",
+    ],
+)
diff --git a/test/core/security/aws_request_signer_test.cc b/test/core/security/aws_request_signer_test.cc
new file mode 100644 (file)
index 0000000..e384183
--- /dev/null
@@ -0,0 +1,283 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "src/core/lib/security/credentials/external/aws_request_signer.h"
+
+#include <gmock/gmock.h>
+#include <grpc/grpc_security.h>
+
+#include "test/core/util/test_config.h"
+
+namespace testing {
+
+namespace {
+// Test cases of Aws endpoints that the aws-sourced credentials will depend
+// on.
+const char* kAmzTestAccessKeyId = "ASIARD4OQDT6A77FR3CL";
+const char* kAmzTestSecretAccessKey =
+    "Y8AfSaucF37G4PpvfguKZ3/l7Id4uocLXxX0+VTx";
+const char* kAmzTestToken =
+    "IQoJb3JpZ2luX2VjEIz//////////wEaCXVzLWVhc3QtMiJGMEQCIH7MHX/Oy/"
+    "OB8OlLQa9GrqU1B914+iMikqWQW7vPCKlgAiA/"
+    "Lsv8Jcafn14owfxXn95FURZNKaaphj0ykpmS+Ki+"
+    "CSq0AwhlEAAaDDA3NzA3MTM5MTk5NiIMx9sAeP1ovlMTMKLjKpEDwuJQg41/"
+    "QUKx0laTZYjPlQvjwSqS3OB9P1KAXPWSLkliVMMqaHqelvMF/WO/"
+    "glv3KwuTfQsavRNs3v5pcSEm4SPO3l7mCs7KrQUHwGP0neZhIKxEXy+Ls//1C/"
+    "Bqt53NL+LSbaGv6RPHaX82laz2qElphg95aVLdYgIFY6JWV5fzyjgnhz0DQmy62/"
+    "Vi8pNcM2/"
+    "VnxeCQ8CC8dRDSt52ry2v+nc77vstuI9xV5k8mPtnaPoJDRANh0bjwY5Sdwkbp+"
+    "mGRUJBAQRlNgHUJusefXQgVKBCiyJY4w3Csd8Bgj9IyDV+"
+    "Azuy1jQqfFZWgP68LSz5bURyIjlWDQunO82stZ0BgplKKAa/"
+    "KJHBPCp8Qi6i99uy7qh76FQAqgVTsnDuU6fGpHDcsDSGoCls2HgZjZFPeOj8mmRhFk1Xqvkb"
+    "juz8V1cJk54d3gIJvQt8gD2D6yJQZecnuGWd5K2e2HohvCc8Fc9kBl1300nUJPV+k4tr/"
+    "A5R/0QfEKOZL1/"
+    "k5lf1g9CREnrM8LVkGxCgdYMxLQow1uTL+QU67AHRRSp5PhhGX4Rek+"
+    "01vdYSnJCMaPhSEgcLqDlQkhk6MPsyT91QMXcWmyO+cAZwUPwnRamFepuP4K8k2KVXs/"
+    "LIJHLELwAZ0ekyaS7CptgOqS7uaSTFG3U+vzFZLEnGvWQ7y9IPNQZ+"
+    "Dffgh4p3vF4J68y9049sI6Sr5d5wbKkcbm8hdCDHZcv4lnqohquPirLiFQ3q7B17V9krMPu3"
+    "mz1cg4Ekgcrn/"
+    "E09NTsxAqD8NcZ7C7ECom9r+"
+    "X3zkDOxaajW6hu3Az8hGlyylDaMiFfRbBJpTIlxp7jfa7CxikNgNtEKLH9iCzvuSg2vhA==";
+const char* kAmzTestDate = "20200811T065522Z";
+
+// Test cases derived from the Aws signature v4 test suite.
+// https://github.com/boto/botocore/tree/master/tests/unit/auth/aws4_testsuite
+const char* kBotoTestAccessKeyId = "AKIDEXAMPLE";
+const char* kBotoTestSecretAccessKey =
+    "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY";
+const char* kBotoTestToken = "";
+const char* kBotoTestDate = "Mon, 09 Sep 2011 23:36:00 GMT";
+}  // namespace
+
+// AWS official example from the developer doc.
+// https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html
+TEST(GrpcAwsRequestSignerTest, AWSOfficialExample) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer(
+      "AKIDEXAMPLE", "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", "", "GET",
+      "https://iam.amazonaws.com/?Action=ListUsers&Version=2010-05-08",
+      "us-east-1", "",
+      {{"content-type", "application/x-www-form-urlencoded; charset=utf-8"},
+       {"x-amz-date", "20150830T123600Z"}},
+      &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE);
+  EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
+            "AWS4-HMAC-SHA256 "
+            "Credential=AKIDEXAMPLE/20150830/us-east-1/iam/aws4_request, "
+            "SignedHeaders=content-type;host;x-amz-date, "
+            "Signature="
+            "5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7");
+}
+
+TEST(GrpcAwsRequestSignerTest, GetDescribeRegions) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer(
+      kAmzTestAccessKeyId, kAmzTestSecretAccessKey, kAmzTestToken, "GET",
+      "https://"
+      "ec2.us-east-2.amazonaws.com?Action=DescribeRegions&Version=2013-10-15",
+      "us-east-2", "", {{"x-amz-date", kAmzTestDate}}, &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE);
+  EXPECT_EQ(
+      signer.GetSignedRequestHeaders()["Authorization"],
+      "AWS4-HMAC-SHA256 "
+      "Credential=ASIARD4OQDT6A77FR3CL/20200811/us-east-2/ec2/aws4_request, "
+      "SignedHeaders=host;x-amz-date;x-amz-security-token, "
+      "Signature="
+      "631ea80cddfaa545fdadb120dc92c9f18166e38a5c47b50fab9fce476e022855");
+}
+
+TEST(GrpcAwsRequestSignerTest, PostGetCallerIdentity) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer(
+      kAmzTestAccessKeyId, kAmzTestSecretAccessKey, kAmzTestToken, "POST",
+      "https://"
+      "sts.us-east-2.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15",
+      "us-east-2", "", {{"x-amz-date", kAmzTestDate}}, &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE);
+  EXPECT_EQ(
+      signer.GetSignedRequestHeaders()["Authorization"],
+      "AWS4-HMAC-SHA256 "
+      "Credential=ASIARD4OQDT6A77FR3CL/20200811/us-east-2/sts/aws4_request, "
+      "SignedHeaders=host;x-amz-date;x-amz-security-token, "
+      "Signature="
+      "73452984e4a880ffdc5c392355733ec3f5ba310d5e0609a89244440cadfe7a7a");
+}
+
+TEST(GrpcAwsRequestSignerTest, PostGetCallerIdentityNoToken) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer(
+      kAmzTestAccessKeyId, kAmzTestSecretAccessKey, "", "POST",
+      "https://"
+      "sts.us-east-2.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15",
+      "us-east-2", "", {{"x-amz-date", kAmzTestDate}}, &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE);
+  EXPECT_EQ(
+      signer.GetSignedRequestHeaders()["Authorization"],
+      "AWS4-HMAC-SHA256 "
+      "Credential=ASIARD4OQDT6A77FR3CL/20200811/us-east-2/sts/aws4_request, "
+      "SignedHeaders=host;x-amz-date, "
+      "Signature="
+      "d095ba304919cd0d5570ba8a3787884ee78b860f268ed040ba23831d55536d56");
+}
+
+TEST(GrpcAwsRequestSignerTest, GetHost) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer(kBotoTestAccessKeyId,
+                                     kBotoTestSecretAccessKey, kBotoTestToken,
+                                     "GET", "https://host.foo.com", "us-east-1",
+                                     "", {{"date", kBotoTestDate}}, &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE);
+  EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
+            "AWS4-HMAC-SHA256 "
+            "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
+            "SignedHeaders=date;host, "
+            "Signature="
+            "b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470");
+}
+
+TEST(GrpcAwsRequestSignerTest, GetHostDuplicateQueryParam) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer(
+      kBotoTestAccessKeyId, kBotoTestSecretAccessKey, kBotoTestToken, "GET",
+      "https://host.foo.com/?foo=Zoo&foo=aha", "us-east-1", "",
+      {{"date", kBotoTestDate}}, &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE);
+  EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
+            "AWS4-HMAC-SHA256 "
+            "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
+            "SignedHeaders=date;host, "
+            "Signature="
+            "be7148d34ebccdc6423b19085378aa0bee970bdc61d144bd1a8c48c33079ab09");
+}
+
+TEST(GrpcAwsRequestSignerTest, PostWithUpperCaseHeaderKey) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer(
+      kBotoTestAccessKeyId, kBotoTestSecretAccessKey, kBotoTestToken, "POST",
+      "https://host.foo.com/", "us-east-1", "",
+      {{"date", kBotoTestDate}, {"ZOO", "zoobar"}}, &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE);
+  EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
+            "AWS4-HMAC-SHA256 "
+            "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
+            "SignedHeaders=date;host;zoo, "
+            "Signature="
+            "b7a95a52518abbca0964a999a880429ab734f35ebbf1235bd79a5de87756dc4a");
+}
+
+TEST(GrpcAwsRequestSignerTest, PostWithUpperCaseHeaderValue) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer(
+      kBotoTestAccessKeyId, kBotoTestSecretAccessKey, kBotoTestToken, "POST",
+      "https://host.foo.com/", "us-east-1", "",
+      {{"date", kBotoTestDate}, {"zoo", "ZOOBAR"}}, &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE);
+  EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
+            "AWS4-HMAC-SHA256 "
+            "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
+            "SignedHeaders=date;host;zoo, "
+            "Signature="
+            "273313af9d0c265c531e11db70bbd653f3ba074c1009239e8559d3987039cad7");
+}
+
+TEST(GrpcAwsRequestSignerTest, SignPostWithHeader) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer(
+      kBotoTestAccessKeyId, kBotoTestSecretAccessKey, kBotoTestToken, "POST",
+      "https://host.foo.com/", "us-east-1", "",
+      {{"date", kBotoTestDate}, {"p", "phfft"}}, &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE);
+  EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
+            "AWS4-HMAC-SHA256 "
+            "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
+            "SignedHeaders=date;host;p, "
+            "Signature="
+            "debf546796015d6f6ded8626f5ce98597c33b47b9164cf6b17b4642036fcb592");
+}
+
+TEST(GrpcAwsRequestSignerTest, PostWithBodyNoCustomHeaders) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer(
+      kBotoTestAccessKeyId, kBotoTestSecretAccessKey, kBotoTestToken, "POST",
+      "https://host.foo.com/", "us-east-1", "foo=bar",
+      {{"date", kBotoTestDate},
+       {"Content-Type", "application/x-www-form-urlencoded"}},
+      &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE);
+  EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
+            "AWS4-HMAC-SHA256 "
+            "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
+            "SignedHeaders=content-type;date;host, "
+            "Signature="
+            "5a15b22cf462f047318703b92e6f4f38884e4a7ab7b1d6426ca46a8bd1c26cbc");
+}
+
+TEST(GrpcAwsRequestSignerTest, SignPostWithQueryString) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer(
+      kBotoTestAccessKeyId, kBotoTestSecretAccessKey, kBotoTestToken, "POST",
+      "https://host.foo.com/?foo=bar", "us-east-1", "",
+      {{"date", kBotoTestDate}}, &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE);
+  EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
+            "AWS4-HMAC-SHA256 "
+            "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
+            "SignedHeaders=date;host, "
+            "Signature="
+            "b6e3b79003ce0743a491606ba1035a804593b0efb1e20a11cba83f8c25a57a92");
+}
+
+TEST(GrpcAwsRequestSignerTest, InvalidUrl) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer("access_key_id", "secret_access_key",
+                                     "token", "POST", "invalid_url",
+                                     "us-east-1", "", {}, &error);
+  grpc_slice expected_error_description =
+      grpc_slice_from_static_string("Invalid Aws request url.");
+  grpc_slice actual_error_description;
+  GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION,
+                                &actual_error_description));
+  EXPECT_TRUE(grpc_slice_cmp(expected_error_description,
+                             actual_error_description) == 0);
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST(GrpcAwsRequestSignerTest, DuplicateRequestDate) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::AwsRequestSigner signer(
+      "access_key_id", "secret_access_key", "token", "POST", "invalid_url",
+      "us-east-1", "", {{"date", kBotoTestDate}, {"x-amz-date", kAmzTestDate}},
+      &error);
+  grpc_slice expected_error_description = grpc_slice_from_static_string(
+      "Only one of {date, x-amz-date} can be specified, not both.");
+  grpc_slice actual_error_description;
+  GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION,
+                                &actual_error_description));
+  EXPECT_TRUE(grpc_slice_cmp(expected_error_description,
+                             actual_error_description) == 0);
+  GRPC_ERROR_UNREF(error);
+}
+
+}  // namespace testing
+
+int main(int argc, char** argv) {
+  grpc::testing::TestEnvironment env(argc, argv);
+  ::testing::InitGoogleTest(&argc, argv);
+  grpc_init();
+  int ret = RUN_ALL_TESTS();
+  grpc_shutdown();
+  return ret;
+}
index 22f6cdb..bd3b964 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_format.h"
+#include "absl/strings/str_replace.h"
 
 #include <grpc/grpc_security.h>
 #include <grpc/slice.h>
@@ -43,6 +44,9 @@
 #include "src/core/lib/http/httpcli.h"
 #include "src/core/lib/iomgr/error.h"
 #include "src/core/lib/security/credentials/composite/composite_credentials.h"
+#include "src/core/lib/security/credentials/external/external_account_credentials.h"
+#include "src/core/lib/security/credentials/external/file_external_account_credentials.h"
+#include "src/core/lib/security/credentials/external/url_external_account_credentials.h"
 #include "src/core/lib/security/credentials/fake/fake_credentials.h"
 #include "src/core/lib/security/credentials/google_default/google_default_credentials.h"
 #include "src/core/lib/security/credentials/jwt/jwt_credentials.h"
@@ -135,6 +139,41 @@ static const char test_sts_endpoint_url[] =
 
 static const char test_method[] = "ThisIsNotAMethod";
 
+static const char valid_external_account_creds_token_exchange_response[] =
+    "{\"access_token\":\"token_exchange_access_token\","
+    " \"expires_in\":3599,"
+    " \"token_type\":\"Bearer\"}";
+
+static const char
+    valid_external_account_creds_service_account_impersonation_response[] =
+        "{\"accessToken\":\"service_account_impersonation_access_token\","
+        " \"expireTime\":\"2050-01-01T00:00:00Z\"}";
+
+static const char
+    valid_url_external_account_creds_options_credential_source_format_text[] =
+        "{\"url\":\"https://foo.com:5555/generate_subject_token_format_text\","
+        "\"headers\":{\"Metadata-Flavor\":\"Google\"}}";
+
+static const char
+    valid_url_external_account_creds_retrieve_subject_token_response_format_text
+        [] = "test_subject_token";
+
+static const char
+    valid_url_external_account_creds_options_credential_source_format_json[] =
+        "{\"url\":\"https://foo.com:5555/generate_subject_token_format_json\","
+        "\"headers\":{\"Metadata-Flavor\":\"Google\"},"
+        "\"format\":{\"type\":\"json\",\"subject_token_field_name\":\"access_"
+        "token\"}}";
+
+static const char
+    valid_url_external_account_creds_retrieve_subject_token_response_format_json
+        [] = "{\"access_token\":\"test_subject_token\"}";
+
+static const char
+    invalid_url_external_account_creds_options_credential_source[] =
+        "{\"url\":\"invalid_credential_source_url\","
+        "\"headers\":{\"Metadata-Flavor\":\"Google\"}}";
+
 /*  -- Global state flags. -- */
 
 static bool g_test_is_on_gce = false;
@@ -482,7 +521,7 @@ static void test_oauth2_google_iam_composite_creds(void) {
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method,
                                             nullptr, nullptr};
   grpc_call_credentials* oauth2_creds = grpc_md_only_test_credentials_create(
-      "authorization", test_oauth2_bearer_token, 0);
+      "authorization", test_oauth2_bearer_token, false);
 
   /* Check security level of fake credentials. */
   GPR_ASSERT(oauth2_creds->min_security_level() == GRPC_SECURITY_NONE);
@@ -1568,19 +1607,19 @@ struct fake_call_creds : public grpc_call_credentials {
     grpc_slice_unref(value);
   }
 
-  ~fake_call_creds() { GRPC_MDELEM_UNREF(dummy_md_); }
+  ~fake_call_creds() override { GRPC_MDELEM_UNREF(dummy_md_); }
 
   bool get_request_metadata(grpc_polling_entity* pollent,
                             grpc_auth_metadata_context context,
                             grpc_credentials_mdelem_array* md_array,
                             grpc_closure* on_request_metadata,
-                            grpc_error** error) {
+                            grpc_error** error) override {
     grpc_credentials_mdelem_array_add(md_array, dummy_md_);
     return true;
   }
 
   void cancel_get_request_metadata(grpc_credentials_mdelem_array* md_array,
-                                   grpc_error* error) {}
+                                   grpc_error* error) override {}
 
  private:
   grpc_mdelem dummy_md_;
@@ -1881,6 +1920,601 @@ static void test_auth_metadata_context(void) {
   }
 }
 
+static void validate_external_account_creds_token_exchage_request(
+    const grpc_httpcli_request* request, const char* body, size_t body_size,
+    bool expect_actor_token) {
+  // Check that the body is constructed properly.
+  GPR_ASSERT(body != nullptr);
+  GPR_ASSERT(body_size != 0);
+  GPR_ASSERT(request->handshaker == &grpc_httpcli_ssl);
+  std::string get_url_equivalent =
+      absl::StrFormat("%s?%s", "https://foo.com:5555/token", body);
+  grpc_uri* uri = grpc_uri_parse(get_url_equivalent.c_str(), false);
+  GPR_ASSERT(strcmp(grpc_uri_get_query_arg(uri, "audience"), "audience") == 0);
+  GPR_ASSERT(strcmp(grpc_uri_get_query_arg(uri, "grant_type"),
+                    "urn:ietf:params:oauth:grant-type:token-exchange") == 0);
+  GPR_ASSERT(strcmp(grpc_uri_get_query_arg(uri, "requested_token_type"),
+                    "urn:ietf:params:oauth:token-type:access_token") == 0);
+  GPR_ASSERT(strcmp(grpc_uri_get_query_arg(uri, "subject_token"),
+                    "test_subject_token") == 0);
+  GPR_ASSERT(strcmp(grpc_uri_get_query_arg(uri, "subject_token_type"),
+                    "subject_token_type") == 0);
+  GPR_ASSERT(strcmp(grpc_uri_get_query_arg(uri, "scope"),
+                    "https://www.googleapis.com/auth/cloud-platform") == 0);
+  grpc_uri_destroy(uri);
+
+  // Check the rest of the request.
+  GPR_ASSERT(strcmp(request->host, "foo.com:5555") == 0);
+  GPR_ASSERT(strcmp(request->http.path, "/token") == 0);
+  GPR_ASSERT(request->http.hdr_count == 2);
+  GPR_ASSERT(strcmp(request->http.hdrs[0].key, "Content-Type") == 0);
+  GPR_ASSERT(strcmp(request->http.hdrs[0].value,
+                    "application/x-www-form-urlencoded") == 0);
+  GPR_ASSERT(strcmp(request->http.hdrs[1].key, "Authorization") == 0);
+  GPR_ASSERT(strcmp(request->http.hdrs[1].value,
+                    "Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ=") == 0);
+}
+
+static void
+validate_external_account_creds_service_account_impersonation_request(
+    const grpc_httpcli_request* request, const char* body, size_t body_size,
+    bool expect_actor_token) {
+  // Check that the body is constructed properly.
+  GPR_ASSERT(body != nullptr);
+  GPR_ASSERT(body_size != 0);
+  GPR_ASSERT(request->handshaker == &grpc_httpcli_ssl);
+  GPR_ASSERT(strcmp(body, "scope=scope_1 scope_2") == 0);
+
+  // Check the rest of the request.
+  GPR_ASSERT(strcmp(request->host, "foo.com:5555") == 0);
+  GPR_ASSERT(strcmp(request->http.path, "/service_account_impersonation") == 0);
+  GPR_ASSERT(request->http.hdr_count == 2);
+  GPR_ASSERT(strcmp(request->http.hdrs[0].key, "Content-Type") == 0);
+  GPR_ASSERT(strcmp(request->http.hdrs[0].value,
+                    "application/x-www-form-urlencoded") == 0);
+  GPR_ASSERT(strcmp(request->http.hdrs[1].key, "Authorization") == 0);
+  GPR_ASSERT(strcmp(request->http.hdrs[1].value,
+                    "Bearer token_exchange_access_token") == 0);
+}
+
+static int external_account_creds_httpcli_post_success(
+    const grpc_httpcli_request* request, const char* body, size_t body_size,
+    grpc_millis /*deadline*/, grpc_closure* on_done,
+    grpc_httpcli_response* response) {
+  if (strcmp(request->http.path, "/token") == 0) {
+    validate_external_account_creds_token_exchage_request(request, body,
+                                                          body_size, true);
+    *response = http_response(
+        200, valid_external_account_creds_token_exchange_response);
+  } else if (strcmp(request->http.path, "/service_account_impersonation") ==
+             0) {
+    validate_external_account_creds_service_account_impersonation_request(
+        request, body, body_size, true);
+    *response = http_response(
+        200,
+        valid_external_account_creds_service_account_impersonation_response);
+  }
+  grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_done, GRPC_ERROR_NONE);
+  return 1;
+}
+
+static int
+external_account_creds_httpcli_post_failure_token_exchange_response_missing_access_token(
+    const grpc_httpcli_request* request, const char* body, size_t body_size,
+    grpc_millis /*deadline*/, grpc_closure* on_done,
+    grpc_httpcli_response* response) {
+  if (strcmp(request->http.path, "/token") == 0) {
+    *response = http_response(200,
+                              "{\"not_access_token\":\"not_access_token\","
+                              "\"expires_in\":3599,"
+                              " \"token_type\":\"Bearer\"}");
+  } else if (strcmp(request->http.path, "/service_account_impersonation") ==
+             0) {
+    *response = http_response(
+        200,
+        valid_external_account_creds_service_account_impersonation_response);
+  }
+  grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_done, GRPC_ERROR_NONE);
+  return 1;
+}
+
+static int url_external_account_creds_httpcli_get_success(
+    const grpc_httpcli_request* request, grpc_millis /*deadline*/,
+    grpc_closure* on_done, grpc_httpcli_response* response) {
+  if (strcmp(request->http.path, "/generate_subject_token_format_text") == 0) {
+    *response = http_response(
+        200,
+        valid_url_external_account_creds_retrieve_subject_token_response_format_text);
+  } else if (strcmp(request->http.path,
+                    "/generate_subject_token_format_json") == 0) {
+    *response = http_response(
+        200,
+        valid_url_external_account_creds_retrieve_subject_token_response_format_json);
+  }
+  grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_done, GRPC_ERROR_NONE);
+  return 1;
+}
+
+// The subclass of ExternalAccountCredentials for testing.
+// ExternalAccountCredentials is an abstract class so we can't directly test
+// against it.
+class TestExternalAccountCredentials final
+    : public grpc_core::ExternalAccountCredentials {
+ public:
+  TestExternalAccountCredentials(ExternalAccountCredentialsOptions options,
+                                 std::vector<std::string> scopes)
+      : ExternalAccountCredentials(std::move(options), std::move(scopes)) {}
+
+ protected:
+  void RetrieveSubjectToken(
+      HTTPRequestContext* ctx, const ExternalAccountCredentialsOptions& options,
+      std::function<void(std::string, grpc_error*)> cb) override {
+    cb("test_subject_token", GRPC_ERROR_NONE);
+  }
+};
+
+static void test_external_account_creds_success(void) {
+  expected_md emd[] = {{"authorization", "Bearer token_exchange_access_token"}};
+  grpc_core::ExecCtx exec_ctx;
+  grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method,
+                                            nullptr, nullptr};
+  grpc_core::Json credential_source("");
+  TestExternalAccountCredentials::ExternalAccountCredentialsOptions options = {
+      "external_account",                 // type;
+      "audience",                         // audience;
+      "subject_token_type",               // subject_token_type;
+      "",                                 // service_account_impersonation_url;
+      "https://foo.com:5555/token",       // token_url;
+      "https://foo.com:5555/token_info",  // token_info_url;
+      credential_source,                  // credential_source;
+      "quota_project_id",                 // quota_project_id;
+      "client_id",                        // client_id;
+      "client_secret",                    // client_secret;
+  };
+  TestExternalAccountCredentials creds(options, {});
+  /* Check security level. */
+  GPR_ASSERT(creds.min_security_level() == GRPC_PRIVACY_AND_INTEGRITY);
+  /* First request: http put should be called. */
+  request_metadata_state* state =
+      make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
+  grpc_httpcli_set_override(httpcli_get_should_not_be_called,
+                            external_account_creds_httpcli_post_success);
+  run_request_metadata_test(&creds, auth_md_ctx, state);
+  grpc_core::ExecCtx::Get()->Flush();
+  /* Second request: the cached token should be served directly. */
+  state =
+      make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
+  grpc_httpcli_set_override(httpcli_get_should_not_be_called,
+                            httpcli_post_should_not_be_called);
+  run_request_metadata_test(&creds, auth_md_ctx, state);
+  grpc_core::ExecCtx::Get()->Flush();
+  grpc_httpcli_set_override(nullptr, nullptr);
+}
+
+static void
+test_external_account_creds_success_with_service_account_impersonation(void) {
+  expected_md emd[] = {
+      {"authorization", "Bearer service_account_impersonation_access_token"}};
+  grpc_core::ExecCtx exec_ctx;
+  grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method,
+                                            nullptr, nullptr};
+  grpc_core::Json credential_source("");
+  TestExternalAccountCredentials::ExternalAccountCredentialsOptions options = {
+      "external_account",    // type;
+      "audience",            // audience;
+      "subject_token_type",  // subject_token_type;
+      "https://foo.com:5555/service_account_impersonation",  // service_account_impersonation_url;
+      "https://foo.com:5555/token",                          // token_url;
+      "https://foo.com:5555/token_info",                     // token_info_url;
+      credential_source,   // credential_source;
+      "quota_project_id",  // quota_project_id;
+      "client_id",         // client_id;
+      "client_secret",     // client_secret;
+  };
+  TestExternalAccountCredentials creds(options, {"scope_1", "scope_2"});
+  /* Check security level. */
+  GPR_ASSERT(creds.min_security_level() == GRPC_PRIVACY_AND_INTEGRITY);
+  /* First request: http put should be called. */
+  request_metadata_state* state =
+      make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
+  grpc_httpcli_set_override(httpcli_get_should_not_be_called,
+                            external_account_creds_httpcli_post_success);
+  run_request_metadata_test(&creds, auth_md_ctx, state);
+  grpc_core::ExecCtx::Get()->Flush();
+  grpc_httpcli_set_override(nullptr, nullptr);
+}
+
+static void test_external_account_creds_failure_invalid_token_url(void) {
+  grpc_core::ExecCtx exec_ctx;
+  grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method,
+                                            nullptr, nullptr};
+  grpc_core::Json credential_source("");
+  TestExternalAccountCredentials::ExternalAccountCredentialsOptions options = {
+      "external_account",    // type;
+      "audience",            // audience;
+      "subject_token_type",  // subject_token_type;
+      "https://foo.com:5555/service_account_impersonation",  // service_account_impersonation_url;
+      "invalid_token_url",                                   // token_url;
+      "https://foo.com:5555/token_info",                     // token_info_url;
+      credential_source,   // credential_source;
+      "quota_project_id",  // quota_project_id;
+      "client_id",         // client_id;
+      "client_secret",     // client_secret;
+  };
+  TestExternalAccountCredentials creds(options, {});
+  grpc_httpcli_set_override(httpcli_get_should_not_be_called,
+                            httpcli_post_should_not_be_called);
+  grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+      "Invalid token url: invalid_token_url.");
+  grpc_error* expected_error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
+      "Error occurred when fetching oauth2 token.", &error, 1);
+  request_metadata_state* state =
+      make_request_metadata_state(expected_error, nullptr, 0);
+  run_request_metadata_test(&creds, auth_md_ctx, state);
+  GRPC_ERROR_UNREF(error);
+  grpc_core::ExecCtx::Get()->Flush();
+  grpc_httpcli_set_override(nullptr, nullptr);
+}
+
+static void
+test_external_account_creds_failure_invalid_service_account_impersonation_url(
+    void) {
+  grpc_core::ExecCtx exec_ctx;
+  grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method,
+                                            nullptr, nullptr};
+  grpc_core::Json credential_source("");
+  TestExternalAccountCredentials::ExternalAccountCredentialsOptions options = {
+      "external_account",                           // type;
+      "audience",                                   // audience;
+      "subject_token_type",                         // subject_token_type;
+      "invalid_service_account_impersonation_url",  // service_account_impersonation_url;
+      "https://foo.com:5555/token",                 // token_url;
+      "https://foo.com:5555/token_info",            // token_info_url;
+      credential_source,                            // credential_source;
+      "quota_project_id",                           // quota_project_id;
+      "client_id",                                  // client_id;
+      "client_secret",                              // client_secret;
+  };
+  TestExternalAccountCredentials creds(options, {});
+  grpc_httpcli_set_override(httpcli_get_should_not_be_called,
+                            external_account_creds_httpcli_post_success);
+  grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+      "Invalid service account impersonation url: "
+      "invalid_service_account_impersonation_url.");
+  grpc_error* expected_error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
+      "Error occurred when fetching oauth2 token.", &error, 1);
+  request_metadata_state* state =
+      make_request_metadata_state(expected_error, nullptr, 0);
+  run_request_metadata_test(&creds, auth_md_ctx, state);
+  GRPC_ERROR_UNREF(error);
+  grpc_core::ExecCtx::Get()->Flush();
+  grpc_httpcli_set_override(nullptr, nullptr);
+}
+
+static void
+test_external_account_creds_failure_token_exchange_response_missing_access_token(
+    void) {
+  grpc_core::ExecCtx exec_ctx;
+  grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method,
+                                            nullptr, nullptr};
+  grpc_core::Json credential_source("");
+  TestExternalAccountCredentials::ExternalAccountCredentialsOptions options = {
+      "external_account",    // type;
+      "audience",            // audience;
+      "subject_token_type",  // subject_token_type;
+      "https://foo.com:5555/service_account_impersonation",  // service_account_impersonation_url;
+      "https://foo.com:5555/token",                          // token_url;
+      "https://foo.com:5555/token_info",                     // token_info_url;
+      credential_source,   // credential_source;
+      "quota_project_id",  // quota_project_id;
+      "client_id",         // client_id;
+      "client_secret",     // client_secret;
+  };
+  TestExternalAccountCredentials creds(options, {});
+  grpc_httpcli_set_override(
+      httpcli_get_should_not_be_called,
+      external_account_creds_httpcli_post_failure_token_exchange_response_missing_access_token);
+  grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+      "Missing or invalid access_token in "
+      "{\"not_access_token\":\"not_access_token\",\"expires_in\":3599,\"token_"
+      "type\":\"Bearer\"}.");
+  grpc_error* expected_error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
+      "Error occurred when fetching oauth2 token.", &error, 1);
+  request_metadata_state* state =
+      make_request_metadata_state(expected_error, nullptr, 0);
+  run_request_metadata_test(&creds, auth_md_ctx, state);
+  GRPC_ERROR_UNREF(error);
+  grpc_core::ExecCtx::Get()->Flush();
+  grpc_httpcli_set_override(nullptr, nullptr);
+}
+
+static void test_url_external_account_creds_success_format_text(void) {
+  expected_md emd[] = {{"authorization", "Bearer token_exchange_access_token"}};
+  grpc_core::ExecCtx exec_ctx;
+  grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method,
+                                            nullptr, nullptr};
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::Json credential_source = grpc_core::Json::Parse(
+      valid_url_external_account_creds_options_credential_source_format_text,
+      &error);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  grpc_core::ExternalAccountCredentials::ExternalAccountCredentialsOptions
+      options = {
+          "external_account",            // type;
+          "audience",                    // audience;
+          "subject_token_type",          // subject_token_type;
+          "",                            // service_account_impersonation_url;
+          "https://foo.com:5555/token",  // token_url;
+          "https://foo.com:5555/token_info",  // token_info_url;
+          credential_source,                  // credential_source;
+          "quota_project_id",                 // quota_project_id;
+          "client_id",                        // client_id;
+          "client_secret",                    // client_secret;
+      };
+  auto creds =
+      grpc_core::UrlExternalAccountCredentials::Create(options, {}, &error);
+  GPR_ASSERT(creds != nullptr);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  GPR_ASSERT(creds->min_security_level() == GRPC_PRIVACY_AND_INTEGRITY);
+  request_metadata_state* state =
+      make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
+  grpc_httpcli_set_override(url_external_account_creds_httpcli_get_success,
+                            external_account_creds_httpcli_post_success);
+  run_request_metadata_test(creds.get(), auth_md_ctx, state);
+  grpc_core::ExecCtx::Get()->Flush();
+  grpc_httpcli_set_override(nullptr, nullptr);
+}
+
+static void test_url_external_account_creds_success_format_json(void) {
+  expected_md emd[] = {{"authorization", "Bearer token_exchange_access_token"}};
+  grpc_core::ExecCtx exec_ctx;
+  grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method,
+                                            nullptr, nullptr};
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::Json credential_source = grpc_core::Json::Parse(
+      valid_url_external_account_creds_options_credential_source_format_json,
+      &error);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  grpc_core::ExternalAccountCredentials::ExternalAccountCredentialsOptions
+      options = {
+          "external_account",            // type;
+          "audience",                    // audience;
+          "subject_token_type",          // subject_token_type;
+          "",                            // service_account_impersonation_url;
+          "https://foo.com:5555/token",  // token_url;
+          "https://foo.com:5555/token_info",  // token_info_url;
+          credential_source,                  // credential_source;
+          "quota_project_id",                 // quota_project_id;
+          "client_id",                        // client_id;
+          "client_secret",                    // client_secret;
+      };
+  auto creds =
+      grpc_core::UrlExternalAccountCredentials::Create(options, {}, &error);
+  GPR_ASSERT(creds != nullptr);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  GPR_ASSERT(creds->min_security_level() == GRPC_PRIVACY_AND_INTEGRITY);
+  request_metadata_state* state =
+      make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
+  grpc_httpcli_set_override(url_external_account_creds_httpcli_get_success,
+                            external_account_creds_httpcli_post_success);
+  run_request_metadata_test(creds.get(), auth_md_ctx, state);
+  grpc_core::ExecCtx::Get()->Flush();
+  grpc_httpcli_set_override(nullptr, nullptr);
+}
+
+static void
+test_url_external_account_creds_failure_invalid_credential_source_url(void) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::Json credential_source = grpc_core::Json::Parse(
+      invalid_url_external_account_creds_options_credential_source, &error);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  grpc_core::ExternalAccountCredentials::ExternalAccountCredentialsOptions
+      options = {
+          "external_account",            // type;
+          "audience",                    // audience;
+          "subject_token_type",          // subject_token_type;
+          "",                            // service_account_impersonation_url;
+          "https://foo.com:5555/token",  // token_url;
+          "https://foo.com:5555/token_info",  // token_info_url;
+          credential_source,                  // credential_source;
+          "quota_project_id",                 // quota_project_id;
+          "client_id",                        // client_id;
+          "client_secret",                    // client_secret;
+      };
+  auto creds =
+      grpc_core::UrlExternalAccountCredentials::Create(options, {}, &error);
+  GPR_ASSERT(creds == nullptr);
+  grpc_slice expected_error_slice =
+      grpc_slice_from_static_string("Invalid credential source url.");
+  grpc_slice actual_error_slice;
+  GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION,
+                                &actual_error_slice));
+  GPR_ASSERT(grpc_slice_cmp(expected_error_slice, actual_error_slice) == 0);
+  GRPC_ERROR_UNREF(error);
+}
+
+static void test_file_external_account_creds_success_format_text(void) {
+  expected_md emd[] = {{"authorization", "Bearer token_exchange_access_token"}};
+  grpc_core::ExecCtx exec_ctx;
+  grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method,
+                                            nullptr, nullptr};
+  grpc_error* error = GRPC_ERROR_NONE;
+  char* subject_token_path = write_tmp_jwt_file("test_subject_token");
+  grpc_core::Json credential_source = grpc_core::Json::Parse(
+      absl::StrFormat(
+          "{\"file\":\"%s\"}",
+          absl::StrReplaceAll(subject_token_path, {{"\\", "\\\\"}})),
+      &error);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  grpc_core::ExternalAccountCredentials::ExternalAccountCredentialsOptions
+      options = {
+          "external_account",            // type;
+          "audience",                    // audience;
+          "subject_token_type",          // subject_token_type;
+          "",                            // service_account_impersonation_url;
+          "https://foo.com:5555/token",  // token_url;
+          "https://foo.com:5555/token_info",  // token_info_url;
+          credential_source,                  // credential_source;
+          "quota_project_id",                 // quota_project_id;
+          "client_id",                        // client_id;
+          "client_secret",                    // client_secret;
+      };
+  auto creds =
+      grpc_core::FileExternalAccountCredentials::Create(options, {}, &error);
+  GPR_ASSERT(creds != nullptr);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  GPR_ASSERT(creds->min_security_level() == GRPC_PRIVACY_AND_INTEGRITY);
+  request_metadata_state* state =
+      make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
+  grpc_httpcli_set_override(httpcli_get_should_not_be_called,
+                            external_account_creds_httpcli_post_success);
+  run_request_metadata_test(creds.get(), auth_md_ctx, state);
+  grpc_core::ExecCtx::Get()->Flush();
+  grpc_httpcli_set_override(nullptr, nullptr);
+  GRPC_ERROR_UNREF(error);
+  gpr_free(subject_token_path);
+}
+
+static void test_file_external_account_creds_success_format_json(void) {
+  expected_md emd[] = {{"authorization", "Bearer token_exchange_access_token"}};
+  grpc_core::ExecCtx exec_ctx;
+  grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method,
+                                            nullptr, nullptr};
+  grpc_error* error = GRPC_ERROR_NONE;
+  char* subject_token_path =
+      write_tmp_jwt_file("{\"access_token\":\"test_subject_token\"}");
+  grpc_core::Json credential_source = grpc_core::Json::Parse(
+      absl::StrFormat(
+          "{\n"
+          "\"file\":\"%s\",\n"
+          "\"format\":\n"
+          "{\n"
+          "\"type\":\"json\",\n"
+          "\"subject_token_field_name\":\"access_token\"\n"
+          "}\n"
+          "}",
+          absl::StrReplaceAll(subject_token_path, {{"\\", "\\\\"}})),
+      &error);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  grpc_core::ExternalAccountCredentials::ExternalAccountCredentialsOptions
+      options = {
+          "external_account",            // type;
+          "audience",                    // audience;
+          "subject_token_type",          // subject_token_type;
+          "",                            // service_account_impersonation_url;
+          "https://foo.com:5555/token",  // token_url;
+          "https://foo.com:5555/token_info",  // token_info_url;
+          credential_source,                  // credential_source;
+          "quota_project_id",                 // quota_project_id;
+          "client_id",                        // client_id;
+          "client_secret",                    // client_secret;
+      };
+  auto creds =
+      grpc_core::FileExternalAccountCredentials::Create(options, {}, &error);
+  GPR_ASSERT(creds != nullptr);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  GPR_ASSERT(creds->min_security_level() == GRPC_PRIVACY_AND_INTEGRITY);
+  request_metadata_state* state =
+      make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
+  grpc_httpcli_set_override(httpcli_get_should_not_be_called,
+                            external_account_creds_httpcli_post_success);
+  run_request_metadata_test(creds.get(), auth_md_ctx, state);
+  grpc_core::ExecCtx::Get()->Flush();
+  grpc_httpcli_set_override(nullptr, nullptr);
+  GRPC_ERROR_UNREF(error);
+  gpr_free(subject_token_path);
+}
+
+static void test_file_external_account_creds_failure_file_not_found(void) {
+  grpc_core::ExecCtx exec_ctx;
+  grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method,
+                                            nullptr, nullptr};
+  grpc_error* error = GRPC_ERROR_NONE;
+  grpc_core::Json credential_source =
+      grpc_core::Json::Parse("{\"file\":\"non_exisiting_file\"}", &error);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  grpc_core::ExternalAccountCredentials::ExternalAccountCredentialsOptions
+      options = {
+          "external_account",            // type;
+          "audience",                    // audience;
+          "subject_token_type",          // subject_token_type;
+          "",                            // service_account_impersonation_url;
+          "https://foo.com:5555/token",  // token_url;
+          "https://foo.com:5555/token_info",  // token_info_url;
+          credential_source,                  // credential_source;
+          "quota_project_id",                 // quota_project_id;
+          "client_id",                        // client_id;
+          "client_secret",                    // client_secret;
+      };
+  auto creds =
+      grpc_core::FileExternalAccountCredentials::Create(options, {}, &error);
+  GPR_ASSERT(creds != nullptr);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  grpc_httpcli_set_override(httpcli_get_should_not_be_called,
+                            httpcli_post_should_not_be_called);
+  error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to load file");
+  grpc_error* expected_error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
+      "Error occurred when fetching oauth2 token.", &error, 1);
+  request_metadata_state* state =
+      make_request_metadata_state(expected_error, nullptr, 0);
+  run_request_metadata_test(creds.get(), auth_md_ctx, state);
+  grpc_core::ExecCtx::Get()->Flush();
+  grpc_httpcli_set_override(nullptr, nullptr);
+  GRPC_ERROR_UNREF(error);
+}
+
+static void test_file_external_account_creds_failure_invalid_json_content(
+    void) {
+  grpc_core::ExecCtx exec_ctx;
+  grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method,
+                                            nullptr, nullptr};
+  grpc_error* error = GRPC_ERROR_NONE;
+  char* subject_token_path = write_tmp_jwt_file("not_a_valid_json_file");
+  grpc_core::Json credential_source = grpc_core::Json::Parse(
+      absl::StrFormat(
+          "{\n"
+          "\"file\":\"%s\",\n"
+          "\"format\":\n"
+          "{\n"
+          "\"type\":\"json\",\n"
+          "\"subject_token_field_name\":\"access_token\"\n"
+          "}\n"
+          "}",
+          absl::StrReplaceAll(subject_token_path, {{"\\", "\\\\"}})),
+      &error);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  grpc_core::ExternalAccountCredentials::ExternalAccountCredentialsOptions
+      options = {
+          "external_account",            // type;
+          "audience",                    // audience;
+          "subject_token_type",          // subject_token_type;
+          "",                            // service_account_impersonation_url;
+          "https://foo.com:5555/token",  // token_url;
+          "https://foo.com:5555/token_info",  // token_info_url;
+          credential_source,                  // credential_source;
+          "quota_project_id",                 // quota_project_id;
+          "client_id",                        // client_id;
+          "client_secret",                    // client_secret;
+      };
+  auto creds =
+      grpc_core::FileExternalAccountCredentials::Create(options, {}, &error);
+  GPR_ASSERT(creds != nullptr);
+  GPR_ASSERT(error == GRPC_ERROR_NONE);
+  grpc_httpcli_set_override(httpcli_get_should_not_be_called,
+                            httpcli_post_should_not_be_called);
+  error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+      "The content of the file is not a valid json object.");
+  grpc_error* expected_error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
+      "Error occurred when fetching oauth2 token.", &error, 1);
+  request_metadata_state* state =
+      make_request_metadata_state(expected_error, nullptr, 0);
+  run_request_metadata_test(creds.get(), auth_md_ctx, state);
+  grpc_core::ExecCtx::Get()->Flush();
+  grpc_httpcli_set_override(nullptr, nullptr);
+  GRPC_ERROR_UNREF(error);
+  gpr_free(subject_token_path);
+}
+
 int main(int argc, char** argv) {
   grpc::testing::TestEnvironment env(argc, argv);
   grpc_init();
@@ -1925,6 +2559,18 @@ int main(int argc, char** argv) {
   test_get_well_known_google_credentials_file_path();
   test_channel_creds_duplicate_without_call_creds();
   test_auth_metadata_context();
+  test_external_account_creds_success();
+  test_external_account_creds_success_with_service_account_impersonation();
+  test_external_account_creds_failure_invalid_token_url();
+  test_external_account_creds_failure_invalid_service_account_impersonation_url();
+  test_external_account_creds_failure_token_exchange_response_missing_access_token();
+  test_url_external_account_creds_success_format_text();
+  test_url_external_account_creds_success_format_json();
+  test_url_external_account_creds_failure_invalid_credential_source_url();
+  test_file_external_account_creds_success_format_text();
+  test_file_external_account_creds_success_format_json();
+  test_file_external_account_creds_failure_file_not_found();
+  test_file_external_account_creds_failure_invalid_json_content();
   grpc_shutdown();
   return 0;
 }
index 83456ea..61be71c 100644 (file)
@@ -53,8 +53,8 @@ class GrpcTlsCertificateDistributorTest : public ::testing::Test {
   // Forward declaration.
   class TlsCertificatesTestWatcher;
 
-  static grpc_tls_certificate_distributor::PemKeyCertPairList MakeCertKeyPairs(
-      const char* private_key, const char* certs) {
+  static grpc_core::PemKeyCertPairList MakeCertKeyPairs(const char* private_key,
+                                                        const char* certs) {
     if (strcmp(private_key, "") == 0 && strcmp(certs, "") == 0) {
       return {};
     }
@@ -63,7 +63,7 @@ class GrpcTlsCertificateDistributorTest : public ::testing::Test {
             gpr_malloc(sizeof(grpc_ssl_pem_key_cert_pair)));
     ssl_pair->private_key = gpr_strdup(private_key);
     ssl_pair->cert_chain = gpr_strdup(certs);
-    grpc_tls_certificate_distributor::PemKeyCertPairList pem_key_cert_pairs;
+    grpc_core::PemKeyCertPairList pem_key_cert_pairs;
     pem_key_cert_pairs.emplace_back(ssl_pair);
     return pem_key_cert_pairs;
   }
@@ -74,10 +74,8 @@ class GrpcTlsCertificateDistributorTest : public ::testing::Test {
   // if the status updates are correct.
   struct CredentialInfo {
     std::string root_certs;
-    grpc_tls_certificate_distributor::PemKeyCertPairList key_cert_pairs;
-    CredentialInfo(
-        std::string root,
-        grpc_tls_certificate_distributor::PemKeyCertPairList key_cert)
+    grpc_core::PemKeyCertPairList key_cert_pairs;
+    CredentialInfo(std::string root, grpc_core::PemKeyCertPairList key_cert)
         : root_certs(std::move(root)), key_cert_pairs(std::move(key_cert)) {}
     bool operator==(const CredentialInfo& other) const {
       return root_certs == other.root_certs &&
@@ -126,17 +124,16 @@ class GrpcTlsCertificateDistributorTest : public ::testing::Test {
     }
 
     // dtor sets state->watcher to nullptr.
-    ~TlsCertificatesTestWatcher() { state_->watcher = nullptr; }
+    ~TlsCertificatesTestWatcher() override { state_->watcher = nullptr; }
 
     void OnCertificatesChanged(
         absl::optional<absl::string_view> root_certs,
-        absl::optional<grpc_tls_certificate_distributor::PemKeyCertPairList>
-            key_cert_pairs) override {
+        absl::optional<grpc_core::PemKeyCertPairList> key_cert_pairs) override {
       std::string updated_root;
       if (root_certs.has_value()) {
         updated_root = std::string(*root_certs);
       }
-      grpc_tls_certificate_distributor::PemKeyCertPairList updated_identity;
+      grpc_core::PemKeyCertPairList updated_identity;
       if (key_cert_pairs.has_value()) {
         updated_identity = std::move(*key_cert_pairs);
       }
index 630add3..dee1d47 100644 (file)
 
 namespace testing {
 
-static void SetKeyMaterials(grpc_tls_key_materials_config* config) {
-  grpc_slice ca_slice, cert_slice, key_slice;
-  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
-                               grpc_load_file(CA_CERT_PATH, 1, &ca_slice)));
-  GPR_ASSERT(GRPC_LOG_IF_ERROR(
-      "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice)));
-  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
-                               grpc_load_file(SERVER_KEY_PATH, 1, &key_slice)));
-  const char* ca_cert =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(ca_slice);
-  const char* server_cert =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(cert_slice);
-  const char* server_key =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(key_slice);
-  grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert};
-  const auto* pem_key_cert_pair_ptr = &pem_key_cert_pair;
-  grpc_tls_key_materials_config_set_key_materials(config, ca_cert,
-                                                  &pem_key_cert_pair_ptr, 1);
-  grpc_slice_unref(cert_slice);
-  grpc_slice_unref(key_slice);
-  grpc_slice_unref(ca_slice);
-}
-
-TEST(GrpcTlsCredentialsOptionsTest, SetKeyMaterials) {
-  grpc_tls_key_materials_config* config =
-      grpc_tls_key_materials_config_create();
-  SetKeyMaterials(config);
-  grpc_slice ca_slice, cert_slice, key_slice;
-  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
-                               grpc_load_file(CA_CERT_PATH, 1, &ca_slice)));
-  GPR_ASSERT(GRPC_LOG_IF_ERROR(
-      "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice)));
-  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
-                               grpc_load_file(SERVER_KEY_PATH, 1, &key_slice)));
-  const char* ca_cert =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(ca_slice);
-  const char* server_cert =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(cert_slice);
-  const char* server_key =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(key_slice);
-  EXPECT_STREQ(config->pem_root_certs(), ca_cert);
-  EXPECT_EQ(config->pem_key_cert_pair_list().size(), 1);
-  EXPECT_STREQ(config->pem_key_cert_pair_list()[0].private_key(), server_key);
-  EXPECT_STREQ(config->pem_key_cert_pair_list()[0].cert_chain(), server_cert);
-  grpc_slice_unref(cert_slice);
-  grpc_slice_unref(key_slice);
-  grpc_slice_unref(ca_slice);
-  delete config;
-}
-
 TEST(GrpcTlsCredentialsOptionsTest, ErrorDetails) {
   grpc_tls_error_details error_details;
   EXPECT_STREQ(error_details.error_details().c_str(), "");
diff --git a/test/core/security/insecure_security_connector_test.cc b/test/core/security/insecure_security_connector_test.cc
new file mode 100644 (file)
index 0000000..faa1b28
--- /dev/null
@@ -0,0 +1,59 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include <grpc/grpc_security.h>
+
+#include "src/core/lib/security/security_connector/insecure/insecure_security_connector.h"
+#include "src/core/lib/security/security_connector/ssl_utils.h"
+#include "src/core/tsi/transport_security.h"
+#include "test/core/util/test_config.h"
+
+namespace grpc_core {
+namespace testing {
+namespace {
+
+TEST(InsecureSecurityConnector, MakeAuthContextTest) {
+  auto auth_context = InsecureChannelSecurityConnector::MakeAuthContext();
+  // Verify that peer identity is set
+  auto it = grpc_auth_context_peer_identity(auth_context.get());
+  const grpc_auth_property* prop = grpc_auth_property_iterator_next(&it);
+  ASSERT_NE(prop, nullptr);
+  EXPECT_STREQ(prop->name, GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME);
+  EXPECT_STREQ(prop->value, kInsecureTransportSecurityType);
+  // Verify that security level is set to none
+  it = grpc_auth_context_find_properties_by_name(
+      auth_context.get(), GRPC_TRANSPORT_SECURITY_LEVEL_PROPERTY_NAME);
+  prop = grpc_auth_property_iterator_next(&it);
+  ASSERT_NE(prop, nullptr);
+  EXPECT_EQ(grpc_tsi_security_level_string_to_enum(prop->value),
+            GRPC_SECURITY_NONE);
+}
+
+}  // namespace
+}  // namespace testing
+}  // namespace grpc_core
+
+int main(int argc, char** argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+  grpc::testing::TestEnvironment env(argc, argv);
+  const auto result = RUN_ALL_TESTS();
+  return result;
+}
index 538e439..bb5ca72 100644 (file)
@@ -122,6 +122,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
     grpc_core::ExecCtx::Get()->Flush();
   }
 
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   return 0;
 }
index 694b6b6..63ec2a4 100644 (file)
 #include <string.h>
 
 #include "src/core/lib/iomgr/load_file.h"
+#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h"
+#include "src/core/lib/security/credentials/tls/tls_credentials.h"
 #include "src/core/tsi/transport_security.h"
 #include "test/core/util/test_config.h"
 
 #define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem"
-#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem"
-#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key"
-
-namespace {
-
-enum CredReloadResult { FAIL, SUCCESS, UNCHANGED, ASYNC };
-
-void SetKeyMaterials(grpc_tls_key_materials_config* config) {
-  grpc_slice ca_slice, cert_slice, key_slice;
-  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
-                               grpc_load_file(CA_CERT_PATH, 1, &ca_slice)));
-  GPR_ASSERT(GRPC_LOG_IF_ERROR(
-      "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice)));
-  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
-                               grpc_load_file(SERVER_KEY_PATH, 1, &key_slice)));
-  const char* ca_cert =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(ca_slice);
-  const char* server_cert =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(cert_slice);
-  const char* server_key =
-      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(key_slice);
-  grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert};
-  const auto* pem_key_cert_pair_ptr = &pem_key_cert_pair;
-  grpc_tls_key_materials_config_set_key_materials(config, ca_cert,
-                                                  &pem_key_cert_pair_ptr, 1);
-  grpc_slice_unref(cert_slice);
-  grpc_slice_unref(key_slice);
-  grpc_slice_unref(ca_slice);
-}
-
-int CredReloadSuccess(void* /*config_user_data*/,
-                      grpc_tls_credential_reload_arg* arg) {
-  SetKeyMaterials(arg->key_materials_config);
-  arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW;
-  return 0;
-}
-
-int CredReloadFail(void* /*config_user_data*/,
-                   grpc_tls_credential_reload_arg* arg) {
-  arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL;
-  return 0;
-}
-
-int CredReloadUnchanged(void* /*config_user_data*/,
-                        grpc_tls_credential_reload_arg* arg) {
-  arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-  return 0;
-}
-
-int CredReloadAsync(void* /*config_user_data*/,
-                    grpc_tls_credential_reload_arg* /*arg*/) {
-  return 1;
-}
-
-}  // namespace
+#define CLIENT_CERT_PATH "src/core/tsi/test_creds/multi-domain.pem"
+#define SERVER_CERT_PATH_0 "src/core/tsi/test_creds/server0.pem"
+#define SERVER_KEY_PATH_0 "src/core/tsi/test_creds/server0.key"
+#define SERVER_CERT_PATH_1 "src/core/tsi/test_creds/server1.pem"
+#define SERVER_KEY_PATH_1 "src/core/tsi/test_creds/server1.key"
 
 namespace grpc {
 namespace testing {
 
+constexpr const char* kRootCertName = "root_cert_name";
+constexpr const char* kIdentityCertName = "identity_cert_name";
+constexpr const char* kErrorMessage = "error_message";
+constexpr const char* kTargetName = "some_target";
+
 class TlsSecurityConnectorTest : public ::testing::Test {
  protected:
   TlsSecurityConnectorTest() {}
   void SetUp() override {
-    options_ = grpc_tls_credentials_options_create()->Ref();
-    config_ = grpc_tls_key_materials_config_create()->Ref();
-  }
-  void TearDown() override { config_->Unref(); }
-  // Set credential reload config in options.
-  void SetOptions(CredReloadResult type) {
-    grpc_tls_credential_reload_config* reload_config = nullptr;
-    switch (type) {
-      case SUCCESS:
-        reload_config = grpc_tls_credential_reload_config_create(
-            nullptr, CredReloadSuccess, nullptr, nullptr);
-        break;
-      case FAIL:
-        reload_config = grpc_tls_credential_reload_config_create(
-            nullptr, CredReloadFail, nullptr, nullptr);
-        break;
-      case UNCHANGED:
-        reload_config = grpc_tls_credential_reload_config_create(
-            nullptr, CredReloadUnchanged, nullptr, nullptr);
-        break;
-      case ASYNC:
-        reload_config = grpc_tls_credential_reload_config_create(
-            nullptr, CredReloadAsync, nullptr, nullptr);
-        break;
-      default:
-        break;
-    }
-    grpc_tls_credentials_options_set_credential_reload_config(options_.get(),
-                                                              reload_config);
+    grpc_slice ca_slice_1, ca_slice_0, cert_slice_1, key_slice_1, cert_slice_0,
+        key_slice_0;
+    GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
+                                 grpc_load_file(CA_CERT_PATH, 1, &ca_slice_1)));
+    GPR_ASSERT(GRPC_LOG_IF_ERROR(
+        "load_file", grpc_load_file(CLIENT_CERT_PATH, 1, &ca_slice_0)));
+    GPR_ASSERT(GRPC_LOG_IF_ERROR(
+        "load_file", grpc_load_file(SERVER_CERT_PATH_1, 1, &cert_slice_1)));
+    GPR_ASSERT(GRPC_LOG_IF_ERROR(
+        "load_file", grpc_load_file(SERVER_KEY_PATH_1, 1, &key_slice_1)));
+    GPR_ASSERT(GRPC_LOG_IF_ERROR(
+        "load_file", grpc_load_file(SERVER_CERT_PATH_0, 1, &cert_slice_0)));
+    GPR_ASSERT(GRPC_LOG_IF_ERROR(
+        "load_file", grpc_load_file(SERVER_KEY_PATH_0, 1, &key_slice_0)));
+    root_cert_1_ = std::string(grpc_core::StringViewFromSlice(ca_slice_1));
+    root_cert_0_ = std::string(grpc_core::StringViewFromSlice(ca_slice_0));
+    std::string identity_key_1 =
+        std::string(grpc_core::StringViewFromSlice(key_slice_1));
+    std::string identity_key_0 =
+        std::string(grpc_core::StringViewFromSlice(key_slice_0));
+    std::string identity_cert_1 =
+        std::string(grpc_core::StringViewFromSlice(cert_slice_1));
+    std::string identity_cert_0 =
+        std::string(grpc_core::StringViewFromSlice(cert_slice_0));
+    grpc_ssl_pem_key_cert_pair* ssl_pair_1 =
+        static_cast<grpc_ssl_pem_key_cert_pair*>(
+            gpr_malloc(sizeof(grpc_ssl_pem_key_cert_pair)));
+    ssl_pair_1->private_key = gpr_strdup(identity_key_1.c_str());
+    ssl_pair_1->cert_chain = gpr_strdup(identity_cert_1.c_str());
+    identity_pairs_1_.emplace_back(ssl_pair_1);
+    grpc_ssl_pem_key_cert_pair* ssl_pair_0 =
+        static_cast<grpc_ssl_pem_key_cert_pair*>(
+            gpr_malloc(sizeof(grpc_ssl_pem_key_cert_pair)));
+    ssl_pair_0->private_key = gpr_strdup(identity_key_0.c_str());
+    ssl_pair_0->cert_chain = gpr_strdup(identity_cert_0.c_str());
+    identity_pairs_0_.emplace_back(ssl_pair_0);
+    grpc_slice_unref(ca_slice_1);
+    grpc_slice_unref(ca_slice_0);
+    grpc_slice_unref(cert_slice_1);
+    grpc_slice_unref(key_slice_1);
+    grpc_slice_unref(cert_slice_0);
+    grpc_slice_unref(key_slice_0);
   }
-  // Set key materials config.
-  void SetKeyMaterialsConfig() { SetKeyMaterials(config_.get()); }
-  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options_;
-  grpc_core::RefCountedPtr<grpc_tls_key_materials_config> config_;
-};
 
-TEST_F(TlsSecurityConnectorTest, NoKeysAndConfig) {
-  grpc_ssl_certificate_config_reload_status reload_status;
-  grpc_status_code status =
-      TlsFetchKeyMaterials(config_, *options_, true, &reload_status);
-  EXPECT_EQ(status, GRPC_STATUS_FAILED_PRECONDITION);
-  options_->Unref();
-}
+  void TearDown() override {}
 
-TEST_F(TlsSecurityConnectorTest, NoKeysAndConfigAsAClient) {
-  grpc_ssl_certificate_config_reload_status reload_status;
-  grpc_status_code status =
-      TlsFetchKeyMaterials(config_, *options_, false, &reload_status);
-  EXPECT_EQ(status, GRPC_STATUS_OK);
-  options_->Unref();
-}
-
-TEST_F(TlsSecurityConnectorTest, NoKeySuccessReload) {
-  grpc_ssl_certificate_config_reload_status reload_status;
-  SetOptions(SUCCESS);
-  grpc_status_code status =
-      TlsFetchKeyMaterials(config_, *options_, true, &reload_status);
-  EXPECT_EQ(status, GRPC_STATUS_OK);
-  EXPECT_EQ(reload_status, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
-  options_->Unref();
-}
-
-TEST_F(TlsSecurityConnectorTest, NoKeyFailReload) {
-  grpc_ssl_certificate_config_reload_status reload_status;
-  SetOptions(FAIL);
-  grpc_status_code status =
-      TlsFetchKeyMaterials(config_, *options_, true, &reload_status);
-  EXPECT_EQ(status, GRPC_STATUS_INTERNAL);
-  EXPECT_EQ(reload_status, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL);
-  options_->Unref();
-}
-
-TEST_F(TlsSecurityConnectorTest, NoKeyAsyncReload) {
-  grpc_ssl_certificate_config_reload_status reload_status =
-      GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-  SetOptions(ASYNC);
-  grpc_status_code status =
-      TlsFetchKeyMaterials(config_, *options_, true, &reload_status);
-  EXPECT_EQ(status, GRPC_STATUS_UNIMPLEMENTED);
-  EXPECT_EQ(reload_status, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED);
-  options_->Unref();
-}
-
-TEST_F(TlsSecurityConnectorTest, NoKeyUnchangedReload) {
-  grpc_ssl_certificate_config_reload_status reload_status =
-      GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-  SetOptions(UNCHANGED);
-  grpc_status_code status =
-      TlsFetchKeyMaterials(config_, *options_, true, &reload_status);
-  EXPECT_EQ(status, GRPC_STATUS_OK);
-  EXPECT_EQ(reload_status, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED);
-  options_->Unref();
-}
+  std::string root_cert_1_;
+  std::string root_cert_0_;
+  grpc_core::PemKeyCertPairList identity_pairs_1_;
+  grpc_core::PemKeyCertPairList identity_pairs_0_;
+};
 
-TEST_F(TlsSecurityConnectorTest, WithKeyNoReload) {
-  grpc_ssl_certificate_config_reload_status reload_status =
-      GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-  SetKeyMaterialsConfig();
-  grpc_status_code status =
-      TlsFetchKeyMaterials(config_, *options_, true, &reload_status);
-  EXPECT_EQ(status, GRPC_STATUS_OK);
-  options_->Unref();
-}
+class TlsTestCertificateProvider : public ::grpc_tls_certificate_provider {
+ public:
+  explicit TlsTestCertificateProvider(
+      grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor)
+      : distributor_(std::move(distributor)) {}
+  ~TlsTestCertificateProvider() override {}
+  grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor()
+      const override {
+    return distributor_;
+  }
 
-TEST_F(TlsSecurityConnectorTest, WithKeySuccessReload) {
-  grpc_ssl_certificate_config_reload_status reload_status;
-  SetOptions(SUCCESS);
-  SetKeyMaterialsConfig();
-  grpc_status_code status =
-      TlsFetchKeyMaterials(config_, *options_, true, &reload_status);
-  EXPECT_EQ(status, GRPC_STATUS_OK);
-  EXPECT_EQ(reload_status, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
-  options_->Unref();
-}
+ private:
+  grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor_;
+};
 
-TEST_F(TlsSecurityConnectorTest, WithKeyFailReload) {
-  grpc_ssl_certificate_config_reload_status reload_status;
-  SetOptions(FAIL);
-  SetKeyMaterialsConfig();
-  grpc_status_code status =
-      TlsFetchKeyMaterials(config_, *options_, true, &reload_status);
-  EXPECT_EQ(status, GRPC_STATUS_OK);
-  EXPECT_EQ(reload_status, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL);
-  options_->Unref();
+// Tests for ChannelSecurityConnector.
+TEST_F(TlsSecurityConnectorTest,
+       RootAndIdentityCertsObtainedWhenCreateChannelSecurityConnector) {
+  grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor =
+      grpc_core::MakeRefCounted<grpc_tls_certificate_distributor>();
+  distributor->SetKeyMaterials(kRootCertName, root_cert_0_, absl::nullopt);
+  distributor->SetKeyMaterials(kIdentityCertName, absl::nullopt,
+                               identity_pairs_0_);
+  grpc_core::RefCountedPtr<::grpc_tls_certificate_provider> provider =
+      grpc_core::MakeRefCounted<TlsTestCertificateProvider>(distributor);
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options =
+      grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+  options->set_certificate_provider(provider);
+  options->set_watch_root_cert(true);
+  options->set_watch_identity_pair(true);
+  options->set_root_cert_name(kRootCertName);
+  options->set_identity_cert_name(kIdentityCertName);
+  grpc_core::RefCountedPtr<TlsCredentials> credential =
+      grpc_core::MakeRefCounted<TlsCredentials>(options);
+  grpc_channel_args* new_args = nullptr;
+  grpc_core::RefCountedPtr<grpc_channel_security_connector> connector =
+      credential->create_security_connector(nullptr, kTargetName, nullptr,
+                                            &new_args);
+  EXPECT_NE(connector, nullptr);
+  grpc_core::TlsChannelSecurityConnector* tls_connector =
+      static_cast<grpc_core::TlsChannelSecurityConnector*>(connector.get());
+  EXPECT_NE(tls_connector->ClientHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_connector->RootCertsForTesting(), root_cert_0_);
+  EXPECT_EQ(tls_connector->KeyCertPairListForTesting(), identity_pairs_0_);
+  distributor->SetKeyMaterials(kRootCertName, root_cert_1_, absl::nullopt);
+  distributor->SetKeyMaterials(kIdentityCertName, absl::nullopt,
+                               identity_pairs_1_);
+  EXPECT_NE(tls_connector->ClientHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_connector->RootCertsForTesting(), root_cert_1_);
+  EXPECT_EQ(tls_connector->KeyCertPairListForTesting(), identity_pairs_1_);
+  grpc_channel_args_destroy(new_args);
 }
 
-TEST_F(TlsSecurityConnectorTest, WithKeyAsyncReload) {
-  grpc_ssl_certificate_config_reload_status reload_status =
-      GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-  SetOptions(ASYNC);
-  SetKeyMaterialsConfig();
-  grpc_status_code status =
-      TlsFetchKeyMaterials(config_, *options_, true, &reload_status);
-  EXPECT_EQ(status, GRPC_STATUS_OK);
-  EXPECT_EQ(reload_status, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED);
-  options_->Unref();
+// Note that on client side, we don't have tests watching identity certs only,
+// because in TLS, the trust certs should always be presented. If we don't
+// provide, it will try to load certs from some default system locations, and
+// will hence fail on some systems.
+TEST_F(TlsSecurityConnectorTest,
+       RootCertsObtainedWhenCreateChannelSecurityConnector) {
+  grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor =
+      grpc_core::MakeRefCounted<grpc_tls_certificate_distributor>();
+  distributor->SetKeyMaterials(kRootCertName, root_cert_0_, absl::nullopt);
+  distributor->SetKeyMaterials(kIdentityCertName, absl::nullopt,
+                               identity_pairs_0_);
+  grpc_core::RefCountedPtr<::grpc_tls_certificate_provider> provider =
+      grpc_core::MakeRefCounted<TlsTestCertificateProvider>(distributor);
+  // Create options only watching for root certificates.
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> root_options =
+      grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+  root_options->set_certificate_provider(provider);
+  root_options->set_watch_root_cert(true);
+  root_options->set_root_cert_name(kRootCertName);
+  grpc_core::RefCountedPtr<TlsCredentials> root_credential =
+      grpc_core::MakeRefCounted<TlsCredentials>(root_options);
+  grpc_channel_args* root_new_args = nullptr;
+  grpc_core::RefCountedPtr<grpc_channel_security_connector> root_connector =
+      root_credential->create_security_connector(nullptr, "some_target",
+                                                 nullptr, &root_new_args);
+  EXPECT_NE(root_connector, nullptr);
+  grpc_core::TlsChannelSecurityConnector* tls_root_connector =
+      static_cast<grpc_core::TlsChannelSecurityConnector*>(
+          root_connector.get());
+  EXPECT_NE(tls_root_connector->ClientHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_root_connector->RootCertsForTesting(), root_cert_0_);
+  distributor->SetKeyMaterials(kRootCertName, root_cert_1_, absl::nullopt);
+  EXPECT_NE(tls_root_connector->ClientHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_root_connector->RootCertsForTesting(), root_cert_1_);
+  grpc_channel_args_destroy(root_new_args);
 }
 
-TEST_F(TlsSecurityConnectorTest, WithKeyUnchangedReload) {
-  grpc_ssl_certificate_config_reload_status reload_status =
-      GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-  SetOptions(UNCHANGED);
-  SetKeyMaterialsConfig();
-  grpc_status_code status =
-      TlsFetchKeyMaterials(config_, *options_, true, &reload_status);
-  EXPECT_EQ(status, GRPC_STATUS_OK);
-  EXPECT_EQ(reload_status, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED);
-  options_->Unref();
+TEST_F(TlsSecurityConnectorTest,
+       CertPartiallyObtainedWhenCreateChannelSecurityConnector) {
+  grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor =
+      grpc_core::MakeRefCounted<grpc_tls_certificate_distributor>();
+  distributor->SetKeyMaterials(kRootCertName, root_cert_0_, absl::nullopt);
+  grpc_core::RefCountedPtr<::grpc_tls_certificate_provider> provider =
+      grpc_core::MakeRefCounted<TlsTestCertificateProvider>(distributor);
+  // Registered the options watching both certs, but only root certs are
+  // available at distributor right now.
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options =
+      grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+  options->set_certificate_provider(provider);
+  options->set_watch_root_cert(true);
+  options->set_watch_identity_pair(true);
+  options->set_root_cert_name(kRootCertName);
+  options->set_identity_cert_name(kIdentityCertName);
+  grpc_core::RefCountedPtr<TlsCredentials> credential =
+      grpc_core::MakeRefCounted<TlsCredentials>(options);
+  grpc_channel_args* new_args = nullptr;
+  grpc_core::RefCountedPtr<grpc_channel_security_connector> connector =
+      credential->create_security_connector(nullptr, kTargetName, nullptr,
+                                            &new_args);
+  EXPECT_NE(connector, nullptr);
+  grpc_core::TlsChannelSecurityConnector* tls_connector =
+      static_cast<grpc_core::TlsChannelSecurityConnector*>(connector.get());
+  // The client_handshaker_factory_ shouldn't be updated.
+  EXPECT_EQ(tls_connector->ClientHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_connector->RootCertsForTesting(), root_cert_0_);
+  // After updating the root certs, the client_handshaker_factory_ should be
+  // updated.
+  distributor->SetKeyMaterials(kIdentityCertName, absl::nullopt,
+                               identity_pairs_0_);
+  EXPECT_NE(tls_connector->ClientHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_connector->RootCertsForTesting(), root_cert_0_);
+  EXPECT_EQ(tls_connector->KeyCertPairListForTesting(), identity_pairs_0_);
+  grpc_channel_args_destroy(new_args);
 }
 
-TEST_F(TlsSecurityConnectorTest, CreateChannelSecurityConnectorSuccess) {
-  SetOptions(SUCCESS);
-  auto cred = std::unique_ptr<grpc_channel_credentials>(
-      grpc_tls_credentials_create(options_.get()));
-  const char* target_name = "some_target";
+TEST_F(TlsSecurityConnectorTest,
+       DistributorHasErrorForChannelSecurityConnector) {
+  grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor =
+      grpc_core::MakeRefCounted<grpc_tls_certificate_distributor>();
+  distributor->SetKeyMaterials(kRootCertName, root_cert_0_, absl::nullopt);
+  distributor->SetKeyMaterials(kIdentityCertName, absl::nullopt,
+                               identity_pairs_0_);
+  grpc_core::RefCountedPtr<::grpc_tls_certificate_provider> provider =
+      grpc_core::MakeRefCounted<TlsTestCertificateProvider>(distributor);
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options =
+      grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+  options->set_certificate_provider(provider);
+  options->set_watch_root_cert(true);
+  options->set_watch_identity_pair(true);
+  options->set_root_cert_name(kRootCertName);
+  options->set_identity_cert_name(kIdentityCertName);
+  grpc_core::RefCountedPtr<TlsCredentials> credential =
+      grpc_core::MakeRefCounted<TlsCredentials>(options);
   grpc_channel_args* new_args = nullptr;
-  auto connector =
-      cred->create_security_connector(nullptr, target_name, nullptr, &new_args);
+  grpc_core::RefCountedPtr<grpc_channel_security_connector> connector =
+      credential->create_security_connector(nullptr, kTargetName, nullptr,
+                                            &new_args);
   EXPECT_NE(connector, nullptr);
+  grpc_core::TlsChannelSecurityConnector* tls_connector =
+      static_cast<grpc_core::TlsChannelSecurityConnector*>(connector.get());
+  EXPECT_NE(tls_connector->ClientHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_connector->RootCertsForTesting(), root_cert_0_);
+  EXPECT_EQ(tls_connector->KeyCertPairListForTesting(), identity_pairs_0_);
+  // Calling SetErrorForCert on distributor shouldn't invalidate the previous
+  // valid credentials.
+  distributor->SetErrorForCert(
+      kRootCertName, GRPC_ERROR_CREATE_FROM_STATIC_STRING(kErrorMessage),
+      absl::nullopt);
+  distributor->SetErrorForCert(
+      kIdentityCertName, absl::nullopt,
+      GRPC_ERROR_CREATE_FROM_STATIC_STRING(kErrorMessage));
+  EXPECT_NE(tls_connector->ClientHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_connector->RootCertsForTesting(), root_cert_0_);
+  EXPECT_EQ(tls_connector->KeyCertPairListForTesting(), identity_pairs_0_);
   grpc_channel_args_destroy(new_args);
 }
 
 TEST_F(TlsSecurityConnectorTest,
        CreateChannelSecurityConnectorFailNoTargetName) {
-  SetOptions(SUCCESS);
-  auto cred = std::unique_ptr<grpc_channel_credentials>(
-      grpc_tls_credentials_create(options_.get()));
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options =
+      grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+  grpc_core::RefCountedPtr<TlsCredentials> credential =
+      grpc_core::MakeRefCounted<TlsCredentials>(options);
   grpc_channel_args* new_args = nullptr;
+  grpc_core::RefCountedPtr<grpc_channel_security_connector> connector =
+      credential->create_security_connector(nullptr, nullptr, nullptr,
+                                            &new_args);
+  EXPECT_EQ(connector, nullptr);
+}
+
+TEST_F(TlsSecurityConnectorTest,
+       CreateChannelSecurityConnectorFailNoCredentials) {
   auto connector =
-      cred->create_security_connector(nullptr, nullptr, nullptr, &new_args);
+      grpc_core::TlsChannelSecurityConnector::CreateTlsChannelSecurityConnector(
+          nullptr, grpc_core::MakeRefCounted<grpc_tls_credentials_options>(),
+          nullptr, kTargetName, nullptr, nullptr);
   EXPECT_EQ(connector, nullptr);
 }
 
-TEST_F(TlsSecurityConnectorTest, CreateChannelSecurityConnectorFailInit) {
-  SetOptions(FAIL);
-  auto cred = std::unique_ptr<grpc_channel_credentials>(
-      grpc_tls_credentials_create(options_.get()));
-  grpc_channel_args* new_args = nullptr;
+TEST_F(TlsSecurityConnectorTest, CreateChannelSecurityConnectorFailNoOptions) {
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options =
+      grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+  grpc_core::RefCountedPtr<TlsCredentials> credential =
+      grpc_core::MakeRefCounted<TlsCredentials>(options);
   auto connector =
-      cred->create_security_connector(nullptr, nullptr, nullptr, &new_args);
+      grpc_core::TlsChannelSecurityConnector::CreateTlsChannelSecurityConnector(
+          credential, nullptr, nullptr, kTargetName, nullptr, nullptr);
   EXPECT_EQ(connector, nullptr);
 }
 
@@ -284,11 +313,10 @@ TEST_F(TlsSecurityConnectorTest, TlsCheckHostNameSuccess) {
   GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
                  TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY, target_name,
                  &peer.properties[0]) == TSI_OK);
-  grpc_error* error = grpc_core::TlsCheckHostName(target_name, &peer);
+  grpc_error* error = grpc_core::internal::TlsCheckHostName(target_name, &peer);
   tsi_peer_destruct(&peer);
   EXPECT_EQ(error, GRPC_ERROR_NONE);
   GRPC_ERROR_UNREF(error);
-  options_->Unref();
 }
 
 TEST_F(TlsSecurityConnectorTest, TlsCheckHostNameFail) {
@@ -299,26 +327,176 @@ TEST_F(TlsSecurityConnectorTest, TlsCheckHostNameFail) {
   GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
                  TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY, another_name,
                  &peer.properties[0]) == TSI_OK);
-  grpc_error* error = grpc_core::TlsCheckHostName(target_name, &peer);
+  grpc_error* error = grpc_core::internal::TlsCheckHostName(target_name, &peer);
   tsi_peer_destruct(&peer);
   EXPECT_NE(error, GRPC_ERROR_NONE);
   GRPC_ERROR_UNREF(error);
-  options_->Unref();
 }
 
-TEST_F(TlsSecurityConnectorTest, CreateServerSecurityConnectorSuccess) {
-  SetOptions(SUCCESS);
-  auto cred = std::unique_ptr<grpc_server_credentials>(
-      grpc_tls_server_credentials_create(options_.get()));
-  auto connector = cred->create_security_connector();
+// Tests for ServerSecurityConnector.
+TEST_F(TlsSecurityConnectorTest,
+       RootAndIdentityCertsObtainedWhenCreateServerSecurityConnector) {
+  grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor =
+      grpc_core::MakeRefCounted<grpc_tls_certificate_distributor>();
+  distributor->SetKeyMaterials(kRootCertName, root_cert_0_, absl::nullopt);
+  distributor->SetKeyMaterials(kIdentityCertName, absl::nullopt,
+                               identity_pairs_0_);
+  grpc_core::RefCountedPtr<::grpc_tls_certificate_provider> provider =
+      grpc_core::MakeRefCounted<TlsTestCertificateProvider>(distributor);
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options =
+      grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+  options->set_certificate_provider(provider);
+  options->set_watch_root_cert(true);
+  options->set_watch_identity_pair(true);
+  options->set_root_cert_name(kRootCertName);
+  options->set_identity_cert_name(kIdentityCertName);
+  grpc_core::RefCountedPtr<TlsServerCredentials> credential =
+      grpc_core::MakeRefCounted<TlsServerCredentials>(options);
+  grpc_core::RefCountedPtr<grpc_server_security_connector> connector =
+      credential->create_security_connector();
+  EXPECT_NE(connector, nullptr);
+  grpc_core::TlsServerSecurityConnector* tls_connector =
+      static_cast<grpc_core::TlsServerSecurityConnector*>(connector.get());
+  EXPECT_NE(tls_connector->ServerHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_connector->RootCertsForTesting(), root_cert_0_);
+  EXPECT_EQ(tls_connector->KeyCertPairListForTesting(), identity_pairs_0_);
+  distributor->SetKeyMaterials(kRootCertName, root_cert_1_, absl::nullopt);
+  distributor->SetKeyMaterials(kIdentityCertName, absl::nullopt,
+                               identity_pairs_1_);
+  EXPECT_NE(tls_connector->ServerHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_connector->RootCertsForTesting(), root_cert_1_);
+  EXPECT_EQ(tls_connector->KeyCertPairListForTesting(), identity_pairs_1_);
+}
+
+// Note that on server side, we don't have tests watching root certs only,
+// because in TLS, the identity certs should always be presented. If we don't
+// provide, it will try to load certs from some default system locations, and
+// will hence fail on some systems.
+TEST_F(TlsSecurityConnectorTest,
+       IdentityCertsObtainedWhenCreateServerSecurityConnector) {
+  grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor =
+      grpc_core::MakeRefCounted<grpc_tls_certificate_distributor>();
+  distributor->SetKeyMaterials(kRootCertName, root_cert_0_, absl::nullopt);
+  distributor->SetKeyMaterials(kIdentityCertName, absl::nullopt,
+                               identity_pairs_0_);
+  grpc_core::RefCountedPtr<::grpc_tls_certificate_provider> provider =
+      grpc_core::MakeRefCounted<TlsTestCertificateProvider>(distributor);
+  // Create options only watching for identity certificates.
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> identity_options =
+      grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+  identity_options->set_certificate_provider(provider);
+  identity_options->set_watch_identity_pair(true);
+  identity_options->set_identity_cert_name(kIdentityCertName);
+  grpc_core::RefCountedPtr<TlsServerCredentials> identity_credential =
+      grpc_core::MakeRefCounted<TlsServerCredentials>(identity_options);
+  grpc_core::RefCountedPtr<grpc_server_security_connector> identity_connector =
+      identity_credential->create_security_connector();
+  EXPECT_NE(identity_connector, nullptr);
+  grpc_core::TlsServerSecurityConnector* tls_identity_connector =
+      static_cast<grpc_core::TlsServerSecurityConnector*>(
+          identity_connector.get());
+  EXPECT_NE(tls_identity_connector->ServerHandshakerFactoryForTesting(),
+            nullptr);
+  EXPECT_EQ(tls_identity_connector->KeyCertPairListForTesting(),
+            identity_pairs_0_);
+  distributor->SetKeyMaterials(kIdentityCertName, absl::nullopt,
+                               identity_pairs_1_);
+  EXPECT_NE(tls_identity_connector->ServerHandshakerFactoryForTesting(),
+            nullptr);
+  EXPECT_EQ(tls_identity_connector->KeyCertPairListForTesting(),
+            identity_pairs_1_);
+}
+
+TEST_F(TlsSecurityConnectorTest,
+       CertPartiallyObtainedWhenCreateServerSecurityConnector) {
+  grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor =
+      grpc_core::MakeRefCounted<grpc_tls_certificate_distributor>();
+  distributor->SetKeyMaterials(kIdentityCertName, absl::nullopt,
+                               identity_pairs_0_);
+  grpc_core::RefCountedPtr<::grpc_tls_certificate_provider> provider =
+      grpc_core::MakeRefCounted<TlsTestCertificateProvider>(distributor);
+  // Registered the options watching both certs, but only root certs are
+  // available at distributor right now.
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options =
+      grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+  options->set_certificate_provider(provider);
+  options->set_watch_root_cert(true);
+  options->set_watch_identity_pair(true);
+  options->set_root_cert_name(kRootCertName);
+  options->set_identity_cert_name(kIdentityCertName);
+  grpc_core::RefCountedPtr<TlsServerCredentials> credential =
+      grpc_core::MakeRefCounted<TlsServerCredentials>(options);
+  grpc_core::RefCountedPtr<grpc_server_security_connector> connector =
+      credential->create_security_connector();
+  EXPECT_NE(connector, nullptr);
+  grpc_core::TlsServerSecurityConnector* tls_connector =
+      static_cast<grpc_core::TlsServerSecurityConnector*>(connector.get());
+  // The server_handshaker_factory_ shouldn't be updated.
+  EXPECT_EQ(tls_connector->ServerHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_connector->KeyCertPairListForTesting(), identity_pairs_0_);
+  // After updating the root certs, the server_handshaker_factory_ should be
+  // updated.
+  distributor->SetKeyMaterials(kRootCertName, root_cert_0_, absl::nullopt);
+  EXPECT_NE(tls_connector->ServerHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_connector->RootCertsForTesting(), root_cert_0_);
+  EXPECT_EQ(tls_connector->KeyCertPairListForTesting(), identity_pairs_0_);
+}
+
+TEST_F(TlsSecurityConnectorTest,
+       DistributorHasErrorForServerSecurityConnector) {
+  grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor =
+      grpc_core::MakeRefCounted<grpc_tls_certificate_distributor>();
+  distributor->SetKeyMaterials(kRootCertName, root_cert_0_, absl::nullopt);
+  distributor->SetKeyMaterials(kIdentityCertName, absl::nullopt,
+                               identity_pairs_0_);
+  grpc_core::RefCountedPtr<::grpc_tls_certificate_provider> provider =
+      grpc_core::MakeRefCounted<TlsTestCertificateProvider>(distributor);
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options =
+      grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+  options->set_certificate_provider(provider);
+  options->set_watch_root_cert(true);
+  options->set_watch_identity_pair(true);
+  options->set_root_cert_name(kRootCertName);
+  options->set_identity_cert_name(kIdentityCertName);
+  grpc_core::RefCountedPtr<TlsServerCredentials> credential =
+      grpc_core::MakeRefCounted<TlsServerCredentials>(options);
+  grpc_core::RefCountedPtr<grpc_server_security_connector> connector =
+      credential->create_security_connector();
   EXPECT_NE(connector, nullptr);
+  grpc_core::TlsServerSecurityConnector* tls_connector =
+      static_cast<grpc_core::TlsServerSecurityConnector*>(connector.get());
+  EXPECT_NE(tls_connector->ServerHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_connector->RootCertsForTesting(), root_cert_0_);
+  EXPECT_EQ(tls_connector->KeyCertPairListForTesting(), identity_pairs_0_);
+  // Calling SetErrorForCert on distributor shouldn't invalidate the previous
+  // valid credentials.
+  distributor->SetErrorForCert(
+      kRootCertName, GRPC_ERROR_CREATE_FROM_STATIC_STRING(kErrorMessage),
+      absl::nullopt);
+  distributor->SetErrorForCert(
+      kIdentityCertName, absl::nullopt,
+      GRPC_ERROR_CREATE_FROM_STATIC_STRING(kErrorMessage));
+  EXPECT_NE(tls_connector->ServerHandshakerFactoryForTesting(), nullptr);
+  EXPECT_EQ(tls_connector->RootCertsForTesting(), root_cert_0_);
+  EXPECT_EQ(tls_connector->KeyCertPairListForTesting(), identity_pairs_0_);
+}
+
+TEST_F(TlsSecurityConnectorTest,
+       CreateServerSecurityConnectorFailNoCredentials) {
+  auto connector =
+      grpc_core::TlsServerSecurityConnector::CreateTlsServerSecurityConnector(
+          nullptr, grpc_core::MakeRefCounted<grpc_tls_credentials_options>());
+  EXPECT_EQ(connector, nullptr);
 }
 
-TEST_F(TlsSecurityConnectorTest, CreateServerSecurityConnectorFailInit) {
-  SetOptions(FAIL);
-  auto cred = std::unique_ptr<grpc_server_credentials>(
-      grpc_tls_server_credentials_create(options_.get()));
-  auto connector = cred->create_security_connector();
+TEST_F(TlsSecurityConnectorTest, CreateServerSecurityConnectorFailNoOptions) {
+  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options =
+      grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+  grpc_core::RefCountedPtr<TlsServerCredentials> credential =
+      grpc_core::MakeRefCounted<TlsServerCredentials>(options);
+  auto connector =
+      grpc_core::TlsServerSecurityConnector::CreateTlsServerSecurityConnector(
+          credential, nullptr);
   EXPECT_EQ(connector, nullptr);
 }
 
index 2b480af..bf951b4 100644 (file)
@@ -101,8 +101,9 @@ int main(int argc, char** argv) {
     grpc_pollset_worker* worker = nullptr;
     if (!GRPC_LOG_IF_ERROR(
             "pollset_work",
-            grpc_pollset_work(sync.pollset, &worker, GRPC_MILLIS_INF_FUTURE)))
+            grpc_pollset_work(sync.pollset, &worker, GRPC_MILLIS_INF_FUTURE))) {
       sync.is_done = true;
+    }
     gpr_mu_unlock(sync.mu);
     grpc_core::ExecCtx::Get()->Flush();
     gpr_mu_lock(sync.mu);
index 3bcd86a..cb3439a 100644 (file)
@@ -33,6 +33,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   grpc_slice res = grpc_base64_decode_with_len(
       reinterpret_cast<const char*>(data + 1), size - 1, url_safe);
   grpc_slice_unref(res);
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   return 0;
 }
index 7e62ed1..06d7347 100644 (file)
@@ -43,6 +43,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   }
   grpc_slice_unref(grpc_permissive_percent_decode_slice(input));
   grpc_slice_unref(input);
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   return 0;
 }
index 1023978..e988ad0 100644 (file)
@@ -46,7 +46,7 @@ static void test(const uint8_t* data, size_t size, const uint8_t* dict) {
   grpc_slice_unref(output);
   grpc_slice_unref(decoded_output);
   grpc_slice_unref(permissive_decoded_output);
-  grpc_shutdown_blocking();
+  grpc_shutdown();
 }
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
index 11d3fdc..4b821be 100644 (file)
@@ -202,18 +202,22 @@ int main(int argc, char **argv) {
   printf("%lx", (unsigned long) grpc_alts_server_credentials_create);
   printf("%lx", (unsigned long) grpc_local_credentials_create);
   printf("%lx", (unsigned long) grpc_local_server_credentials_create);
+  printf("%lx", (unsigned long) grpc_tls_identity_pairs_create);
+  printf("%lx", (unsigned long) grpc_tls_identity_pairs_add_pair);
+  printf("%lx", (unsigned long) grpc_tls_identity_pairs_destroy);
+  printf("%lx", (unsigned long) grpc_tls_certificate_provider_static_data_create);
+  printf("%lx", (unsigned long) grpc_tls_certificate_provider_release);
   printf("%lx", (unsigned long) grpc_tls_credentials_options_create);
   printf("%lx", (unsigned long) grpc_tls_credentials_options_set_cert_request_type);
   printf("%lx", (unsigned long) grpc_tls_credentials_options_set_server_verification_option);
-  printf("%lx", (unsigned long) grpc_tls_credentials_options_set_key_materials_config);
-  printf("%lx", (unsigned long) grpc_tls_credentials_options_set_credential_reload_config);
+  printf("%lx", (unsigned long) grpc_tls_credentials_options_set_certificate_provider);
+  printf("%lx", (unsigned long) grpc_tls_credentials_options_watch_root_certs);
+  printf("%lx", (unsigned long) grpc_tls_credentials_options_set_root_cert_name);
+  printf("%lx", (unsigned long) grpc_tls_credentials_options_watch_identity_key_cert_pairs);
+  printf("%lx", (unsigned long) grpc_tls_credentials_options_set_identity_cert_name);
   printf("%lx", (unsigned long) grpc_tls_credentials_options_set_server_authorization_check_config);
-  printf("%lx", (unsigned long) grpc_tls_key_materials_config_create);
-  printf("%lx", (unsigned long) grpc_tls_key_materials_config_set_key_materials);
-  printf("%lx", (unsigned long) grpc_tls_key_materials_config_set_version);
-  printf("%lx", (unsigned long) grpc_tls_key_materials_config_get_version);
-  printf("%lx", (unsigned long) grpc_tls_credential_reload_config_create);
   printf("%lx", (unsigned long) grpc_tls_server_authorization_check_config_create);
+  printf("%lx", (unsigned long) grpc_tls_server_authorization_check_config_release);
   printf("%lx", (unsigned long) grpc_xds_credentials_create);
   printf("%lx", (unsigned long) grpc_raw_byte_buffer_create);
   printf("%lx", (unsigned long) grpc_raw_compressed_byte_buffer_create);
index 401821f..01d9a85 100644 (file)
@@ -131,12 +131,12 @@ static void run_test(const test_fixture* fixture, bool share_subchannel) {
 
   while (grpc_completion_queue_next(server_cq,
                                     gpr_inf_future(GPR_CLOCK_REALTIME), nullptr)
-             .type != GRPC_QUEUE_SHUTDOWN)
-    ;
+             .type != GRPC_QUEUE_SHUTDOWN) {
+  }
   while (grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
                                     nullptr)
-             .type != GRPC_QUEUE_SHUTDOWN)
-    ;
+             .type != GRPC_QUEUE_SHUTDOWN) {
+  }
 
   for (size_t i = 0; i < NUM_CONNECTIONS; i++) {
     grpc_channel_destroy(channels[i]);
index ccae3bd..47b6ba2 100644 (file)
@@ -163,8 +163,8 @@ class TestServer {
     grpc_completion_queue_shutdown(cq_);
     while (grpc_completion_queue_next(cq_, gpr_inf_future(GPR_CLOCK_REALTIME),
                                       nullptr)
-               .type != GRPC_QUEUE_SHUTDOWN)
-      ;
+               .type != GRPC_QUEUE_SHUTDOWN) {
+    }
     grpc_completion_queue_destroy(cq_);
     return num_calls_handled_;
   }
@@ -256,8 +256,8 @@ class TestServer {
       // including settings frames with window size increases
       while (grpc_completion_queue_next(
                  call_cq, gpr_inf_future(GPR_CLOCK_REALTIME), nullptr)
-                 .type != GRPC_QUEUE_SHUTDOWN)
-        ;
+                 .type != GRPC_QUEUE_SHUTDOWN) {
+      }
     });
     grpc_call_cancel(call, nullptr);
     grpc_call_unref(call);
@@ -320,8 +320,8 @@ TEST(Pollers, TestDontCrashWhenTryingToReproIssueFixedBy23984) {
       grpc_completion_queue_shutdown(cq);
       while (grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
                                         nullptr)
-                 .type != GRPC_QUEUE_SHUTDOWN)
-        ;
+                 .type != GRPC_QUEUE_SHUTDOWN) {
+      }
       grpc_completion_queue_destroy(cq);
     }));
   }
index af11dea..8164231 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <gtest/gtest.h>
 
+#include "absl/memory/memory.h"
 #include "absl/strings/str_cat.h"
 
 #include <grpc/grpc.h>
@@ -61,7 +62,8 @@ class ServerThread {
     cq_ = grpc_completion_queue_create_for_next(nullptr);
     grpc_server_register_completion_queue(server_, cq_, nullptr);
     grpc_server_start(server_);
-    thread_.reset(new std::thread(std::bind(&ServerThread::Serve, this)));
+    thread_ =
+        absl::make_unique<std::thread>(std::bind(&ServerThread::Serve, this));
   }
 
   void Shutdown() {
index 0af868b..2356bb5 100644 (file)
@@ -171,8 +171,8 @@ TEST(TooManyPings, TestLotsOfServerCancelledRpcsDoesntGiveTooManyPings) {
   grpc_completion_queue_shutdown(cq);
   while (grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
                                     nullptr)
-             .type != GRPC_QUEUE_SHUTDOWN)
-    ;
+             .type != GRPC_QUEUE_SHUTDOWN) {
+  }
   grpc_server_destroy(server);
   grpc_completion_queue_destroy(cq);
 }
@@ -252,8 +252,8 @@ void ServerShutdownAndDestroy(grpc_server* server, grpc_completion_queue* cq) {
   grpc_server_shutdown_and_notify(server, cq, (void*)(1000));
   while (grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
                                     nullptr)
-             .tag != (void*)(1000))
-    ;
+             .tag != (void*)(1000)) {
+  }
   grpc_server_destroy(server);
 }
 
@@ -317,10 +317,6 @@ TEST_F(KeepaliveThrottlingTest, KeepaliveThrottlingMultipleChannels) {
       grpc_channel_arg_integer_create(
           const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA), 0),
       grpc_channel_arg_integer_create(
-          const_cast<char*>(
-              GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS),
-          0),
-      grpc_channel_arg_integer_create(
           const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS), 1 * 1000),
       grpc_channel_arg_integer_create(
           const_cast<char*>(GRPC_ARG_HTTP2_BDP_PROBE), 0)};
@@ -357,8 +353,8 @@ TEST_F(KeepaliveThrottlingTest, KeepaliveThrottlingMultipleChannels) {
   grpc_completion_queue_shutdown(cq);
   while (grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
                                     nullptr)
-             .type != GRPC_QUEUE_SHUTDOWN)
-    ;
+             .type != GRPC_QUEUE_SHUTDOWN) {
+  }
   grpc_completion_queue_destroy(cq);
 }
 
@@ -400,10 +396,6 @@ TEST_F(KeepaliveThrottlingTest, NewSubchannelsUseUpdatedKeepaliveTime) {
       grpc_channel_arg_integer_create(
           const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA), 0),
       grpc_channel_arg_integer_create(
-          const_cast<char*>(
-              GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS),
-          0),
-      grpc_channel_arg_integer_create(
           const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS), 0),
       grpc_channel_arg_integer_create(
           const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS), 1 * 1000),
@@ -451,8 +443,8 @@ TEST_F(KeepaliveThrottlingTest, NewSubchannelsUseUpdatedKeepaliveTime) {
   grpc_completion_queue_shutdown(cq);
   while (grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
                                     nullptr)
-             .type != GRPC_QUEUE_SHUTDOWN)
-    ;
+             .type != GRPC_QUEUE_SHUTDOWN) {
+  }
   grpc_completion_queue_destroy(cq);
 }
 
@@ -473,10 +465,6 @@ TEST_F(KeepaliveThrottlingTest,
       grpc_channel_arg_integer_create(
           const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA), 0),
       grpc_channel_arg_integer_create(
-          const_cast<char*>(
-              GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS),
-          0),
-      grpc_channel_arg_integer_create(
           const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS), 0),
       grpc_channel_arg_integer_create(
           const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS), 1 * 1000),
@@ -522,8 +510,8 @@ TEST_F(KeepaliveThrottlingTest,
   grpc_completion_queue_shutdown(cq);
   while (grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
                                     nullptr)
-             .type != GRPC_QUEUE_SHUTDOWN)
-    ;
+             .type != GRPC_QUEUE_SHUTDOWN) {
+  }
   grpc_completion_queue_destroy(cq);
 }
 
@@ -687,10 +675,6 @@ TEST(TooManyPings, BdpPingNotSentWithoutReceiveSideActivity) {
       grpc_channel_arg_integer_create(
           const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA), 0),
       grpc_channel_arg_integer_create(
-          const_cast<char*>(
-              GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS),
-          0),
-      grpc_channel_arg_integer_create(
           const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS), 1)};
   grpc_channel_args client_channel_args = {GPR_ARRAY_SIZE(client_args),
                                            client_args};
@@ -733,8 +717,8 @@ TEST(TooManyPings, BdpPingNotSentWithoutReceiveSideActivity) {
   grpc_completion_queue_shutdown(cq);
   while (grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
                                     nullptr)
-             .type != GRPC_QUEUE_SHUTDOWN)
-    ;
+             .type != GRPC_QUEUE_SHUTDOWN) {
+  }
   grpc_completion_queue_destroy(cq);
 }
 
index 9caff9d..21ea011 100644 (file)
@@ -49,7 +49,7 @@ class Watcher : public ConnectivityStateWatcherInterface {
         status_(status),
         destroyed_(destroyed) {}
 
-  ~Watcher() {
+  ~Watcher() override {
     if (destroyed_ != nullptr) *destroyed_ = true;
   }
 
index d5216cf..44f57c4 100644 (file)
@@ -53,6 +53,9 @@ grpc_cc_binary(
     name = "fake_handshaker_server",
     testonly = True,
     srcs = ["fake_handshaker_server_main.cc"],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     language = "C++",
     deps = [
         "fake_handshaker_lib",
index 48e16e6..9e444e3 100644 (file)
  * limitations under the License.
  *
  */
-#include "test/core/tsi/alts/fake_handshaker/fake_handshaker_server.h"
-
-#include <sstream>
-
-#include <gflags/gflags.h>
 #include <grpc/support/log.h>
 #include <grpcpp/impl/codegen/service_type.h>
 #include <grpcpp/server_builder.h>
 
+#include <sstream>
+
+#include "absl/flags/flag.h"
+#include "test/core/tsi/alts/fake_handshaker/fake_handshaker_server.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/util/test_config.h"
 
-DEFINE_int32(handshaker_port, 55056,
-             "TCP port on which the fake handshaker server listens to.");
+ABSL_FLAG(int32_t, handshaker_port, 55056,
+          "TCP port on which the fake handshaker server listens to.");
 
 static void RunFakeHandshakerServer(const std::string& server_address) {
   std::unique_ptr<grpc::Service> service =
@@ -47,9 +46,9 @@ int main(int argc, char** argv) {
   grpc::testing::TestEnvironment env(argc, argv);
   grpc::testing::InitTest(&argc, &argv, true);
 
-  GPR_ASSERT(FLAGS_handshaker_port != 0);
+  GPR_ASSERT(absl::GetFlag(FLAGS_handshaker_port) != 0);
   std::ostringstream server_address;
-  server_address << "[::1]:" << FLAGS_handshaker_port;
+  server_address << "[::1]:" << absl::GetFlag(FLAGS_handshaker_port);
 
   RunFakeHandshakerServer(server_address.str());
   return 0;
index a0dcb13..0f8e625 100644 (file)
@@ -87,7 +87,10 @@ grpc_cc_test(
     language = "C++",
     # TODO(apolcyn): make the fake TCP server used in this
     # test portable to Windows.
-    tags = ["no_windows"],
+    tags = [
+        "no_mac",  # TODO(https://github.com/grpc/grpc/issues/24747): Disable temporarily
+        "no_windows",
+    ],
     deps = [
         "//:alts_util",
         "//:grpc",
index 380876f..09e1557 100644 (file)
@@ -31,6 +31,7 @@
 #include <set>
 #include <thread>
 
+#include "absl/memory/memory.h"
 #include "absl/strings/str_cat.h"
 
 #include <grpc/grpc.h>
@@ -158,8 +159,7 @@ class TestServer {
     grpc_server_start(server_);
     gpr_log(GPR_DEBUG, "Start TestServer %p. listen on %s", this,
             server_addr_.c_str());
-    server_thd_ =
-        std::unique_ptr<std::thread>(new std::thread(PollUntilShutdown, this));
+    server_thd_ = absl::make_unique<std::thread>(PollUntilShutdown, this);
   }
 
   ~TestServer() {
@@ -212,7 +212,7 @@ class ConnectLoopRunner {
         loops_(loops),
         expected_connectivity_states_(expected_connectivity_states),
         reconnect_backoff_ms_(reconnect_backoff_ms) {
-    thd_ = std::unique_ptr<std::thread>(new std::thread(ConnectLoop, this));
+    thd_ = absl::make_unique<std::thread>(ConnectLoop, this);
   }
 
   ~ConnectLoopRunner() { thd_->join(); }
@@ -310,12 +310,11 @@ TEST(AltsConcurrentConnectivityTest, TestConcurrentClientServerHandshakes) {
     gpr_log(GPR_DEBUG,
             "start performing concurrent expected-to-succeed connects");
     for (size_t i = 0; i < num_concurrent_connects; i++) {
-      connect_loop_runners.push_back(
-          std::unique_ptr<ConnectLoopRunner>(new ConnectLoopRunner(
-              test_server.address(), fake_handshake_server.address(),
-              15 /* per connect deadline seconds */, 5 /* loops */,
-              GRPC_CHANNEL_READY /* expected connectivity states */,
-              0 /* reconnect_backoff_ms unset */)));
+      connect_loop_runners.push_back(absl::make_unique<ConnectLoopRunner>(
+          test_server.address(), fake_handshake_server.address(),
+          15 /* per connect deadline seconds */, 5 /* loops */,
+          GRPC_CHANNEL_READY /* expected connectivity states */,
+          0 /* reconnect_backoff_ms unset */));
     }
     connect_loop_runners.clear();
     gpr_log(GPR_DEBUG,
@@ -381,8 +380,7 @@ class FakeTcpServer {
       abort();
     }
     gpr_event_init(&stop_ev_);
-    run_server_loop_thd_ =
-        std::unique_ptr<std::thread>(new std::thread(RunServerLoop, this));
+    run_server_loop_thd_ = absl::make_unique<std::thread>(RunServerLoop, this);
   }
 
   ~FakeTcpServer() {
@@ -558,12 +556,11 @@ TEST(AltsConcurrentConnectivityTest,
     size_t num_concurrent_connects = 100;
     gpr_log(GPR_DEBUG, "start performing concurrent expected-to-fail connects");
     for (size_t i = 0; i < num_concurrent_connects; i++) {
-      connect_loop_runners.push_back(
-          std::unique_ptr<ConnectLoopRunner>(new ConnectLoopRunner(
-              fake_backend_server.address(), fake_handshake_server.address(),
-              10 /* per connect deadline seconds */, 3 /* loops */,
-              GRPC_CHANNEL_TRANSIENT_FAILURE /* expected connectivity states */,
-              0 /* reconnect_backoff_ms unset */)));
+      connect_loop_runners.push_back(absl::make_unique<ConnectLoopRunner>(
+          fake_backend_server.address(), fake_handshake_server.address(),
+          10 /* per connect deadline seconds */, 3 /* loops */,
+          GRPC_CHANNEL_TRANSIENT_FAILURE /* expected connectivity states */,
+          0 /* reconnect_backoff_ms unset */));
     }
     connect_loop_runners.clear();
     gpr_log(GPR_DEBUG, "done performing concurrent expected-to-fail connects");
@@ -596,12 +593,11 @@ TEST(AltsConcurrentConnectivityTest,
     size_t num_concurrent_connects = 100;
     gpr_log(GPR_DEBUG, "start performing concurrent expected-to-fail connects");
     for (size_t i = 0; i < num_concurrent_connects; i++) {
-      connect_loop_runners.push_back(
-          std::unique_ptr<ConnectLoopRunner>(new ConnectLoopRunner(
-              fake_backend_server.address(), fake_handshake_server.address(),
-              20 /* per connect deadline seconds */, 2 /* loops */,
-              GRPC_CHANNEL_TRANSIENT_FAILURE /* expected connectivity states */,
-              0 /* reconnect_backoff_ms unset */)));
+      connect_loop_runners.push_back(absl::make_unique<ConnectLoopRunner>(
+          fake_backend_server.address(), fake_handshake_server.address(),
+          20 /* per connect deadline seconds */, 2 /* loops */,
+          GRPC_CHANNEL_TRANSIENT_FAILURE /* expected connectivity states */,
+          0 /* reconnect_backoff_ms unset */));
     }
     connect_loop_runners.clear();
     gpr_log(GPR_DEBUG, "done performing concurrent expected-to-fail connects");
@@ -635,12 +631,11 @@ TEST(AltsConcurrentConnectivityTest,
     size_t num_concurrent_connects = 100;
     gpr_log(GPR_DEBUG, "start performing concurrent expected-to-fail connects");
     for (size_t i = 0; i < num_concurrent_connects; i++) {
-      connect_loop_runners.push_back(
-          std::unique_ptr<ConnectLoopRunner>(new ConnectLoopRunner(
-              fake_backend_server.address(), fake_handshake_server.address(),
-              10 /* per connect deadline seconds */, 2 /* loops */,
-              GRPC_CHANNEL_TRANSIENT_FAILURE /* expected connectivity states */,
-              100 /* reconnect_backoff_ms */)));
+      connect_loop_runners.push_back(absl::make_unique<ConnectLoopRunner>(
+          fake_backend_server.address(), fake_handshake_server.address(),
+          10 /* per connect deadline seconds */, 2 /* loops */,
+          GRPC_CHANNEL_TRANSIENT_FAILURE /* expected connectivity states */,
+          100 /* reconnect_backoff_ms */));
     }
     connect_loop_runners.clear();
     gpr_log(GPR_DEBUG, "done performing concurrent expected-to-fail connects");
index c4da3ec..c14e6bf 100644 (file)
@@ -33,7 +33,7 @@
 #define ALTS_HANDSHAKER_CLIENT_TEST_TARGET_NAME "bigtable.google.api.com"
 #define ALTS_HANDSHAKER_CLIENT_TEST_TARGET_SERVICE_ACCOUNT1 "A@google.com"
 #define ALTS_HANDSHAKER_CLIENT_TEST_TARGET_SERVICE_ACCOUNT2 "B@google.com"
-#define ALTS_HANDSHAKER_CLIENT_TEST_MAX_FRAME_SIZE 64 * 1024
+#define ALTS_HANDSHAKER_CLIENT_TEST_MAX_FRAME_SIZE (64 * 1024)
 
 const size_t kHandshakerClientOpNum = 4;
 const size_t kMaxRpcVersionMajor = 3;
index 2c30543..54435b7 100644 (file)
@@ -52,7 +52,7 @@
 #define ALTS_TSI_HANDSHAKER_TEST_APPLICATION_PROTOCOL \
   "test application protocol"
 #define ALTS_TSI_HANDSHAKER_TEST_RECORD_PROTOCOL "test record protocol"
-#define ALTS_TSI_HANDSHAKER_TEST_MAX_FRAME_SIZE 256 * 1024
+#define ALTS_TSI_HANDSHAKER_TEST_MAX_FRAME_SIZE (256 * 1024)
 #define ALTS_TSI_HANDSHAKER_TEST_PEER_ATTRIBUTES_KEY "peer"
 #define ALTS_TSI_HANDSHAKER_TEST_PEER_ATTRIBUTES_VALUE "attributes"
 
@@ -66,7 +66,6 @@ using grpc_core::internal::alts_handshaker_client_ref_for_testing;
 using grpc_core::internal::alts_handshaker_client_set_cb_for_testing;
 using grpc_core::internal::alts_handshaker_client_set_fields_for_testing;
 using grpc_core::internal::alts_handshaker_client_set_recv_bytes_for_testing;
-using grpc_core::internal::alts_handshaker_client_set_vtable_for_testing;
 using grpc_core::internal::alts_tsi_handshaker_get_client_for_testing;
 using grpc_core::internal::alts_tsi_handshaker_get_is_client_for_testing;
 using grpc_core::internal::alts_tsi_handshaker_set_client_vtable_for_testing;
index a88e2ac..9124a31 100644 (file)
@@ -39,7 +39,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   {
     grpc_core::ExecCtx exec_ctx;
     grpc_uri* x;
-    if ((x = grpc_uri_parse(s, 1))) {
+    if ((x = grpc_uri_parse(s, true))) {
       grpc_uri_destroy(x);
     }
 
index 713ec32..9659160 100644 (file)
@@ -30,7 +30,7 @@ static void test_succeeds(const char* uri_text, const char* scheme,
                           const char* authority, const char* path,
                           const char* query, const char* fragment) {
   grpc_core::ExecCtx exec_ctx;
-  grpc_uri* uri = grpc_uri_parse(uri_text, 0);
+  grpc_uri* uri = grpc_uri_parse(uri_text, false);
   GPR_ASSERT(uri);
   GPR_ASSERT(0 == strcmp(scheme, uri->scheme));
   GPR_ASSERT(0 == strcmp(authority, uri->authority));
@@ -50,7 +50,7 @@ static void test_query_parts() {
   {
     grpc_core::ExecCtx exec_ctx;
     const char* uri_text = "http://foo/path?a&b=B&c=&#frag";
-    grpc_uri* uri = grpc_uri_parse(uri_text, 0);
+    grpc_uri* uri = grpc_uri_parse(uri_text, false);
     GPR_ASSERT(uri);
 
     GPR_ASSERT(0 == strcmp("http", uri->scheme));
@@ -84,7 +84,7 @@ static void test_query_parts() {
     /* test the current behavior of multiple query part values */
     grpc_core::ExecCtx exec_ctx;
     const char* uri_text = "http://auth/path?foo=bar=baz&foobar==";
-    grpc_uri* uri = grpc_uri_parse(uri_text, 0);
+    grpc_uri* uri = grpc_uri_parse(uri_text, false);
     GPR_ASSERT(uri);
 
     GPR_ASSERT(0 == strcmp("http", uri->scheme));
@@ -102,7 +102,7 @@ static void test_query_parts() {
     /* empty query */
     grpc_core::ExecCtx exec_ctx;
     const char* uri_text = "http://foo/path";
-    grpc_uri* uri = grpc_uri_parse(uri_text, 0);
+    grpc_uri* uri = grpc_uri_parse(uri_text, false);
     GPR_ASSERT(uri);
 
     GPR_ASSERT(0 == strcmp("http", uri->scheme));
index ce16ccb..feaeeab 100644 (file)
@@ -39,7 +39,6 @@ grpc_cc_library(
     srcs = [
         "cmdline.cc",
         "eval_args_mock_endpoint.cc",
-        "examine_stack.cc",
         "fuzzer_util.cc",
         "grpc_profiler.cc",
         "histogram.cc",
@@ -51,6 +50,7 @@ grpc_cc_library(
         "port_isolated_runtime_environment.cc",
         "port_server_client.cc",
         "reconnect_server.cc",
+        "resolve_localhost_ip46.cc",
         "slice_splitter.cc",
         "subprocess_posix.cc",
         "subprocess_windows.cc",
@@ -62,7 +62,6 @@ grpc_cc_library(
     hdrs = [
         "cmdline.h",
         "eval_args_mock_endpoint.h",
-        "examine_stack.h",
         "fuzzer_util.h",
         "grpc_profiler.h",
         "histogram.h",
@@ -73,6 +72,7 @@ grpc_cc_library(
         "port.h",
         "port_server_client.h",
         "reconnect_server.h",
+        "resolve_localhost_ip46.h",
         "slice_splitter.h",
         "subprocess.h",
         "test_config.h",
@@ -87,13 +87,14 @@ grpc_cc_library(
     ],
     external_deps = [
         "absl/debugging:failure_signal_handler",
-        "absl/debugging:stacktrace",
         "absl/debugging:symbolize",
     ],
     language = "C++",
     deps = [
         ":grpc_debugger_macros",
+        ":stack_tracer",
         "//:gpr",
+        "//:grpc_base_c",
         "//:grpc_common",
     ],
 )
@@ -136,8 +137,8 @@ grpc_cc_library(
     testonly = 1,
     srcs = ["fuzzer_corpus_test.cc"],
     external_deps = [
+        "absl/flags:flag",
         "gtest",
-        "gflags",
     ],
     tags = ["no_windows"],
     deps = [
@@ -169,6 +170,43 @@ sh_library(
 )
 
 grpc_cc_library(
+    name = "stack_tracer",
+    srcs = [
+        "stack_tracer.cc",
+    ],
+    hdrs = [
+        "stack_tracer.h",
+    ],
+    external_deps = [
+        "absl/debugging:stacktrace",
+        "absl/debugging:symbolize",
+    ],
+    language = "C++",
+    deps = [
+        "//:grpc_common",
+    ],
+)
+
+grpc_cc_test(
+    name = "stack_tracer_test",
+    srcs = [
+        "stack_tracer_test.cc",
+    ],
+    external_deps = [
+        "absl/debugging:symbolize",
+        "gtest",
+    ],
+    language = "C++",
+    # TODO(https://github.com/grpc/grpc/issues/24627): Disable this on Windows
+    tags = ["no_windows"],
+    uses_polling = False,
+    deps = [
+        ":grpc_test_util",
+        ":stack_tracer",
+    ],
+)
+
+grpc_cc_library(
     name = "test_lb_policies",
     testonly = 1,
     srcs = ["test_lb_policies.cc"],
index 233a2d5..ca5201e 100644 (file)
  *
  */
 
-#include <stdbool.h>
-
 #include <dirent.h>
-#include <gflags/gflags.h>
+#include <grpc/grpc.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <gtest/gtest.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <sys/types.h>
 
-#include <grpc/grpc.h>
-
+#include "absl/flags/flag.h"
 #include "src/core/lib/gpr/env.h"
 #include "src/core/lib/iomgr/load_file.h"
 #include "test/core/util/test_config.h"
@@ -37,15 +35,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
 extern bool squelch;
 extern bool leak_check;
 
-// In some distros, gflags is in the namespace google, and in some others,
-// in gflags. This hack is enabling us to find both.
-namespace google {}
-namespace gflags {}
-using namespace google;
-using namespace gflags;
-
-DEFINE_string(file, "", "Use this file as test data");
-DEFINE_string(directory, "", "Use this directory as test data");
+ABSL_FLAG(std::string, file, "", "Use this file as test data");
+ABSL_FLAG(std::string, directory, "", "Use this directory as test data");
 
 class FuzzerCorpusTest : public ::testing::TestWithParam<std::string> {};
 
@@ -65,7 +56,7 @@ TEST_P(FuzzerCorpusTest, RunOneExample) {
   void* data = gpr_malloc(length);
   memcpy(data, GPR_SLICE_START_PTR(buffer), length);
   grpc_slice_unref(buffer);
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   LLVMFuzzerTestOneInput(static_cast<uint8_t*>(data), length);
   gpr_free(data);
 }
@@ -73,18 +64,21 @@ TEST_P(FuzzerCorpusTest, RunOneExample) {
 class ExampleGenerator
     : public ::testing::internal::ParamGeneratorInterface<std::string> {
  public:
-  virtual ::testing::internal::ParamIteratorInterface<std::string>* Begin()
-      const;
-  virtual ::testing::internal::ParamIteratorInterface<std::string>* End() const;
+  ::testing::internal::ParamIteratorInterface<std::string>* Begin()
+      const override;
+  ::testing::internal::ParamIteratorInterface<std::string>* End()
+      const override;
 
  private:
   void Materialize() const {
     if (examples_.empty()) {
-      if (!FLAGS_file.empty()) examples_.push_back(FLAGS_file);
-      if (!FLAGS_directory.empty()) {
+      if (!absl::GetFlag(FLAGS_file).empty()) {
+        examples_.push_back(absl::GetFlag(FLAGS_file));
+      }
+      if (!absl::GetFlag(FLAGS_directory).empty()) {
         char* test_srcdir = gpr_getenv("TEST_SRCDIR");
         gpr_log(GPR_DEBUG, "test_srcdir=\"%s\"", test_srcdir);
-        std::string directory = FLAGS_directory;
+        std::string directory = absl::GetFlag(FLAGS_directory);
         if (test_srcdir != nullptr) {
           directory =
               test_srcdir + std::string("/com_github_grpc_grpc/") + directory;
@@ -124,13 +118,13 @@ class ExampleIterator
                   std::vector<std::string>::const_iterator begin)
       : base_(base_), begin_(begin), current_(begin) {}
 
-  virtual const ExampleGenerator* BaseGenerator() const { return &base_; }
+  const ExampleGenerator* BaseGenerator() const override { return &base_; }
 
-  virtual void Advance() { current_++; }
-  virtual ExampleIterator* Clone() const { return new ExampleIterator(*this); }
-  virtual const std::string* Current() const { return &*current_; }
+  void Advance() override { current_++; }
+  ExampleIterator* Clone() const override { return new ExampleIterator(*this); }
+  const std::string* Current() const override { return &*current_; }
 
-  virtual bool Equals(const ParamIteratorInterface<std::string>& other) const {
+  bool Equals(const ParamIteratorInterface<std::string>& other) const override {
     return &base_ == other.BaseGenerator() &&
            current_ == dynamic_cast<const ExampleIterator*>(&other)->current_;
   }
index 59e8276..e8a8fc5 100644 (file)
@@ -209,7 +209,7 @@ void grpc_passthru_endpoint_create(grpc_endpoint** client,
   passthru_endpoint* m =
       static_cast<passthru_endpoint*>(gpr_malloc(sizeof(*m)));
   m->halves = 2;
-  m->shutdown = 0;
+  m->shutdown = false;
   if (stats == nullptr) {
     m->stats = grpc_passthru_endpoint_stats_create();
   } else {
index 5a34b60..eae4fbf 100644 (file)
@@ -73,7 +73,7 @@ static void free_chosen_ports(void) {
   for (i = 0; i < num_chosen_ports; i++) {
     grpc_free_port_using_server(chosen_ports[i]);
   }
-  grpc_shutdown_blocking();
+  grpc_shutdown();
   gpr_free(chosen_ports);
 }
 
diff --git a/test/core/util/resolve_localhost_ip46.cc b/test/core/util/resolve_localhost_ip46.cc
new file mode 100644 (file)
index 0000000..b465b75
--- /dev/null
@@ -0,0 +1,58 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#include "test/core/util/resolve_localhost_ip46.h"
+
+#include <grpc/support/log.h>
+
+#include "src/core/lib/iomgr/port.h"
+#include "src/core/lib/iomgr/resolve_address.h"
+#include "src/core/lib/iomgr/sockaddr.h"
+
+namespace grpc_core {
+namespace {
+
+bool localhost_to_ipv4 = false;
+bool localhost_to_ipv6 = false;
+gpr_once g_resolve_localhost_ipv46 = GPR_ONCE_INIT;
+
+void InitResolveLocalhost() {
+  grpc_resolved_addresses* addresses;
+  grpc_error* err =
+      grpc_blocking_resolve_address("localhost", "https", &addresses);
+  GPR_ASSERT(err == GRPC_ERROR_NONE);
+  for (size_t i = 0; i < addresses->naddrs; i++) {
+    grpc_sockaddr* addr =
+        reinterpret_cast<grpc_sockaddr*>(addresses->addrs[i].addr);
+    if (addr->sa_family == GRPC_AF_INET) {
+      localhost_to_ipv4 = true;
+    } else if (addr->sa_family == GRPC_AF_INET6) {
+      localhost_to_ipv6 = true;
+    }
+  }
+  grpc_resolved_addresses_destroy(addresses);
+}
+}  // namespace
+
+void LocalhostResolves(bool* ipv4, bool* ipv6) {
+  gpr_once_init(&g_resolve_localhost_ipv46, InitResolveLocalhost);
+  *ipv4 = localhost_to_ipv4;
+  *ipv6 = localhost_to_ipv6;
+}
+
+}  // namespace grpc_core
diff --git a/test/core/util/resolve_localhost_ip46.h b/test/core/util/resolve_localhost_ip46.h
new file mode 100644 (file)
index 0000000..d8f7883
--- /dev/null
@@ -0,0 +1,29 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#ifndef GRPC_TEST_CORE_UTIL_RESOLVE_LOCALHOST_IP46_H_
+#define GRPC_TEST_CORE_UTIL_RESOLVE_LOCALHOST_IP46_H_
+
+namespace grpc_core {
+
+// Test whether localhost resolves to ipv4 and/or ipv6
+void LocalhostResolves(bool* ipv4, bool* ipv6);
+
+}  // namespace grpc_core
+
+#endif  // GRPC_TEST_CORE_UTIL_RESOLVE_LOCALHOST_IP46_H_
similarity index 91%
rename from test/core/util/examine_stack.cc
rename to test/core/util/stack_tracer.cc
index 9321aca..228e5bb 100644 (file)
@@ -18,7 +18,7 @@
 
 #include <grpc/support/port_platform.h>
 
-#include "test/core/util/examine_stack.h"
+#include "test/core/util/stack_tracer.h"
 
 #include <cstdio>
 #include <string>
@@ -26,6 +26,8 @@
 #include "absl/debugging/stacktrace.h"
 #include "absl/debugging/symbolize.h"
 
+#include "src/core/lib/gprpp/examine_stack.h"
+
 namespace {
 
 static constexpr int kPrintfPointerFieldWidth = 2 + 2 * sizeof(void*);
@@ -87,8 +89,9 @@ static void DebugWriteToString(const char* data, void* str) {
 }  // namespace
 
 namespace grpc_core {
+namespace testing {
 
-std::string CurrentStackTrace() {
+std::string GetCurrentStackTrace() {
   std::string result = "Stack trace:\n";
   constexpr int kNumStackFrames = 32;
   void* stack[kNumStackFrames];
@@ -99,4 +102,10 @@ std::string CurrentStackTrace() {
   return result;
 }
 
+void InitializeStackTracer(const char* argv0) {
+  absl::InitializeSymbolizer(argv0);
+  grpc_core::SetCurrentStackTraceProvider(&GetCurrentStackTrace);
+}
+
+}  // namespace testing
 }  // namespace grpc_core
similarity index 54%
rename from test/core/util/examine_stack.h
rename to test/core/util/stack_tracer.h
index bed5169..6b3b92e 100644 (file)
 #include <string>
 
 namespace grpc_core {
+namespace testing {
 
-// Return the current stack trace as a string (on multiple lines, beginning with
-// "Stack trace:\n")
-std::string CurrentStackTrace();
+// Returns the current stack trace as a string. To have symbolized stack-traces,
+// InitializeStackTracer needs to be called beforehand.
+//
+// Example of stack-trace is
+// Stack trace:
+//    @           0x405b0f        192  StackTracerTest_Basic_Test::TestBody()
+//    @     0x7fbace6baf75        288  testing::internal::RunAllTests()
+//    @     0x7fbace6baa93        144  testing::UnitTest::Run()
+//    @           0x405d4d         64  main
+//
+std::string GetCurrentStackTrace();
 
+// Initializes a stack tracer so that GetCurrentStackTrace can work.
+// This inits debug symbols and sets this as a gRPC stack-trace provider.
+void InitializeStackTracer(const char* argv0);
+
+}  // namespace testing
 }  // namespace grpc_core
 
 #endif /* GRPC_TEST_CORE_UTIL_EXAMINE_STACK_H */
diff --git a/test/core/util/stack_tracer_test.cc b/test/core/util/stack_tracer_test.cc
new file mode 100644 (file)
index 0000000..237d4c3
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ *
+ * Copyright 2020 the gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "test/core/util/stack_tracer.h"
+
+#include <gtest/gtest.h>
+#include <string>
+
+#include "absl/debugging/symbolize.h"
+
+#include <grpc/support/log.h>
+
+#include "test/core/util/test_config.h"
+
+TEST(StackTracerTest, Basic) {
+  std::string stack_trace = grpc_core::testing::GetCurrentStackTrace();
+  gpr_log(GPR_INFO, "stack_trace=%s", stack_trace.c_str());
+#if !defined(NDEBUG) && !defined(GPR_MUSL_LIBC_COMPAT)
+  EXPECT_TRUE(stack_trace.find("Basic") != -1);
+#endif
+}
+
+int main(int argc, char** argv) {
+  grpc::testing::TestEnvironment env(argc, argv);
+  testing::InitGoogleTest(&argc, argv);
+  int ret = RUN_ALL_TESTS();
+  return ret;
+}
index ccc30bf..d44e07b 100644 (file)
@@ -32,7 +32,9 @@
 
 #include "src/core/lib/gpr/string.h"
 #include "src/core/lib/gpr/useful.h"
+#include "src/core/lib/gprpp/examine_stack.h"
 #include "src/core/lib/surface/init.h"
+#include "test/core/util/stack_tracer.h"
 
 #include "absl/debugging/failure_signal_handler.h"
 #include "absl/debugging/symbolize.h"
@@ -50,226 +52,6 @@ static unsigned seed(void) { return static_cast<unsigned>(getpid()); }
 static unsigned seed(void) { return (unsigned)_getpid(); }
 #endif
 
-#if GPR_WINDOWS_CRASH_HANDLER
-#include <windows.h>
-
-#include <tchar.h>
-
-// disable warning 4091 - dbghelp.h is broken for msvc2015
-#pragma warning(disable : 4091)
-#define DBGHELP_TRANSLATE_TCHAR
-#include <dbghelp.h>
-
-#ifdef _MSC_VER
-#pragma comment(lib, "dbghelp.lib")
-#endif
-
-static void print_stack_from_context(HANDLE thread, CONTEXT c) {
-  STACKFRAME s;  // in/out stackframe
-  memset(&s, 0, sizeof(s));
-  DWORD imageType;
-#ifdef _M_IX86
-  // normally, call ImageNtHeader() and use machine info from PE header
-  imageType = IMAGE_FILE_MACHINE_I386;
-  s.AddrPC.Offset = c.Eip;
-  s.AddrPC.Mode = AddrModeFlat;
-  s.AddrFrame.Offset = c.Ebp;
-  s.AddrFrame.Mode = AddrModeFlat;
-  s.AddrStack.Offset = c.Esp;
-  s.AddrStack.Mode = AddrModeFlat;
-#elif _M_X64
-  imageType = IMAGE_FILE_MACHINE_AMD64;
-  s.AddrPC.Offset = c.Rip;
-  s.AddrPC.Mode = AddrModeFlat;
-  s.AddrFrame.Offset = c.Rbp;
-  s.AddrFrame.Mode = AddrModeFlat;
-  s.AddrStack.Offset = c.Rsp;
-  s.AddrStack.Mode = AddrModeFlat;
-#elif _M_IA64
-  imageType = IMAGE_FILE_MACHINE_IA64;
-  s.AddrPC.Offset = c.StIIP;
-  s.AddrPC.Mode = AddrModeFlat;
-  s.AddrFrame.Offset = c.IntSp;
-  s.AddrFrame.Mode = AddrModeFlat;
-  s.AddrBStore.Offset = c.RsBSP;
-  s.AddrBStore.Mode = AddrModeFlat;
-  s.AddrStack.Offset = c.IntSp;
-  s.AddrStack.Mode = AddrModeFlat;
-#else
-#error "Platform not supported!"
-#endif
-
-  HANDLE process = GetCurrentProcess();
-
-  SYMBOL_INFOW* symbol =
-      (SYMBOL_INFOW*)calloc(sizeof(SYMBOL_INFOW) + 256 * sizeof(wchar_t), 1);
-  symbol->MaxNameLen = 255;
-  symbol->SizeOfStruct = sizeof(SYMBOL_INFOW);
-
-  const unsigned short MAX_CALLERS_SHOWN =
-      8192;  // avoid flooding the stderr if stacktrace is way too long
-  for (int frame = 0; frame < MAX_CALLERS_SHOWN &&
-                      StackWalk(imageType, process, thread, &s, &c, 0,
-                                SymFunctionTableAccess, SymGetModuleBase, 0);
-       frame++) {
-    PWSTR symbol_name = L"<<no symbol>>";
-    DWORD64 symbol_address = 0;
-    if (SymFromAddrW(process, (DWORD64)(s.AddrPC.Offset), 0, symbol)) {
-      symbol_name = symbol->Name;
-      symbol_address = (DWORD64)symbol->Address;
-    }
-
-    PWSTR file_name = L"<<no line info>>";
-    int line_number = 0;
-    IMAGEHLP_LINE64 line;
-    line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
-    DWORD displacement = 0;
-    if (SymGetLineFromAddrW64(process, (DWORD64)(s.AddrPC.Offset),
-                              &displacement, &line)) {
-      file_name = line.FileName;
-      line_number = (int)line.LineNumber;
-    }
-
-    fwprintf(stderr, L"*** %d: %016I64X %ls - %016I64X (%ls:%d)\n", frame,
-             (DWORD64)(s.AddrPC.Offset), symbol_name, symbol_address, file_name,
-             line_number);
-    fflush(stderr);
-  }
-
-  free(symbol);
-}
-
-static void print_current_stack() {
-  CONTEXT context;
-  RtlCaptureContext(&context);
-  print_stack_from_context(GetCurrentThread(), context);
-}
-
-static LONG crash_handler(struct _EXCEPTION_POINTERS* ex_info) {
-  fprintf(stderr, "Exception handler called, dumping information\n");
-  bool try_to_print_stack = true;
-  PEXCEPTION_RECORD exrec = ex_info->ExceptionRecord;
-  while (exrec) {
-    DWORD code = exrec->ExceptionCode;
-    DWORD flgs = exrec->ExceptionFlags;
-    PVOID addr = exrec->ExceptionAddress;
-    if (code == EXCEPTION_STACK_OVERFLOW) try_to_print_stack = false;
-    fprintf(stderr, "code: %x - flags: %d - address: %p\n", code, flgs, addr);
-    exrec = exrec->ExceptionRecord;
-  }
-  if (try_to_print_stack) {
-    print_stack_from_context(GetCurrentThread(), *ex_info->ContextRecord);
-  }
-  if (IsDebuggerPresent()) {
-    __debugbreak();
-  } else {
-    _exit(1);
-  }
-  return EXCEPTION_EXECUTE_HANDLER;
-}
-
-static void abort_handler(int sig) {
-  fprintf(stderr, "Abort handler called.\n");
-  print_current_stack();
-  if (IsDebuggerPresent()) {
-    __debugbreak();
-  } else {
-    _exit(1);
-  }
-}
-
-static void install_crash_handler() {
-  if (!SymInitialize(GetCurrentProcess(), NULL, TRUE)) {
-    fprintf(stderr, "SymInitialize failed: %d\n", GetLastError());
-  }
-  SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)crash_handler);
-  _set_abort_behavior(0, _WRITE_ABORT_MSG);
-  _set_abort_behavior(0, _CALL_REPORTFAULT);
-  signal(SIGABRT, abort_handler);
-}
-#elif GPR_POSIX_CRASH_HANDLER
-#include <errno.h>
-#include <execinfo.h>
-#include <stdio.h>
-#include <string.h>
-
-#define SIGNAL_NAMES_LENGTH 32
-
-static const char* const signal_names[] = {
-    nullptr,   "SIGHUP",  "SIGINT",    "SIGQUIT", "SIGILL",    "SIGTRAP",
-    "SIGABRT", "SIGBUS",  "SIGFPE",    "SIGKILL", "SIGUSR1",   "SIGSEGV",
-    "SIGUSR2", "SIGPIPE", "SIGALRM",   "SIGTERM", "SIGSTKFLT", "SIGCHLD",
-    "SIGCONT", "SIGSTOP", "SIGTSTP",   "SIGTTIN", "SIGTTOU",   "SIGURG",
-    "SIGXCPU", "SIGXFSZ", "SIGVTALRM", "SIGPROF", "SIGWINCH",  "SIGIO",
-    "SIGPWR",  "SIGSYS"};
-
-static char g_alt_stack[GPR_MAX(MINSIGSTKSZ, 65536)];
-
-#define MAX_FRAMES 32
-
-/* signal safe output */
-static void output_string(const char* string) {
-  size_t len = strlen(string);
-  ssize_t r;
-
-  do {
-    r = write(STDERR_FILENO, string, len);
-  } while (r == -1 && errno == EINTR);
-}
-
-static void output_num(long num) {
-  char buf[GPR_LTOA_MIN_BUFSIZE];
-  gpr_ltoa(num, buf);
-  output_string(buf);
-}
-
-static void crash_handler(int signum, siginfo_t* /*info*/, void* /*data*/) {
-  void* addrlist[MAX_FRAMES + 1];
-  int addrlen;
-
-  output_string("\n\n\n*******************************\nCaught signal ");
-  if (signum > 0 && signum < SIGNAL_NAMES_LENGTH) {
-    output_string(signal_names[signum]);
-  } else {
-    output_num(signum);
-  }
-  output_string("\n");
-
-  addrlen = backtrace(addrlist, GPR_ARRAY_SIZE(addrlist));
-
-  if (addrlen == 0) {
-    output_string("  no backtrace\n");
-  } else {
-    backtrace_symbols_fd(addrlist, addrlen, STDERR_FILENO);
-  }
-
-  /* try to get a core dump for SIGTERM */
-  if (signum == SIGTERM) signum = SIGQUIT;
-  raise(signum);
-}
-
-static void install_crash_handler() {
-  stack_t ss;
-  struct sigaction sa;
-
-  memset(&ss, 0, sizeof(ss));
-  memset(&sa, 0, sizeof(sa));
-  ss.ss_size = sizeof(g_alt_stack);
-  ss.ss_sp = g_alt_stack;
-  GPR_ASSERT(sigaltstack(&ss, nullptr) == 0);
-  sa.sa_flags = static_cast<int>(SA_SIGINFO | SA_ONSTACK | SA_RESETHAND);
-  sa.sa_sigaction = crash_handler;
-  GPR_ASSERT(sigaction(SIGILL, &sa, nullptr) == 0);
-  GPR_ASSERT(sigaction(SIGABRT, &sa, nullptr) == 0);
-  GPR_ASSERT(sigaction(SIGBUS, &sa, nullptr) == 0);
-  GPR_ASSERT(sigaction(SIGSEGV, &sa, nullptr) == 0);
-  GPR_ASSERT(sigaction(SIGTERM, &sa, nullptr) == 0);
-  GPR_ASSERT(sigaction(SIGQUIT, &sa, nullptr) == 0);
-}
-#else
-static void install_crash_handler() {}
-#endif
-
 bool BuiltUnderValgrind() {
 #ifdef RUNNING_ON_VALGRIND
   return true;
@@ -372,16 +154,9 @@ gpr_timespec grpc_timeout_milliseconds_to_deadline(int64_t time_ms) {
 }
 
 void grpc_test_init(int argc, char** argv) {
-#if GPR_WINDOWS
-  // Windows cannot use absl::InitializeSymbolizer until it fixes mysterious
-  // SymInitialize failure using Bazel RBE on Windows
-  // https://github.com/grpc/grpc/issues/24178
-  install_crash_handler();
-#else
-  absl::InitializeSymbolizer(argv[0]);
+  grpc_core::testing::InitializeStackTracer(argv[0]);
   absl::FailureSignalHandlerOptions options;
   absl::InstallFailureSignalHandler(options);
-#endif
   gpr_log(GPR_DEBUG,
           "test slowdown factor: sanitizer=%" PRId64 ", fixture=%" PRId64
           ", poller=%" PRId64 ", total=%" PRId64,
index b6804fd..32645ae 100644 (file)
@@ -103,7 +103,7 @@ class TestPickArgsLb : public ForwardingLoadBalancingPolicy {
       : ForwardingLoadBalancingPolicy(
             absl::make_unique<Helper>(RefCountedPtr<TestPickArgsLb>(this), cb),
             std::move(args),
-            /*delegate_lb_policy_name=*/"pick_first",
+            /*delegate_policy_name=*/"pick_first",
             /*initial_refcount=*/2) {}
 
   ~TestPickArgsLb() override = default;
@@ -208,7 +208,7 @@ class InterceptRecvTrailingMetadataLoadBalancingPolicy
                     this),
                 std::move(cb)),
             std::move(args),
-            /*delegate_lb_policy_name=*/"pick_first",
+            /*delegate_policy_name=*/"pick_first",
             /*initial_refcount=*/2) {}
 
   ~InterceptRecvTrailingMetadataLoadBalancingPolicy() override = default;
@@ -347,7 +347,7 @@ class AddressTestLoadBalancingPolicy : public ForwardingLoadBalancingPolicy {
                 RefCountedPtr<AddressTestLoadBalancingPolicy>(this),
                 std::move(cb)),
             std::move(args),
-            /*delegate_lb_policy_name=*/"pick_first",
+            /*delegate_policy_name=*/"pick_first",
             /*initial_refcount=*/2) {}
 
   ~AddressTestLoadBalancingPolicy() override = default;
index 34a132d..dc5a455 100644 (file)
@@ -24,7 +24,7 @@ namespace grpc_core {
 namespace testing {
 
 void grpc_tracer_enable_flag(grpc_core::TraceFlag* flag) {
-  flag->set_enabled(1);
+  flag->set_enabled(true);
 }
 
 }  // namespace testing
index 1aad047..ceca797 100644 (file)
 
 load("//bazel:grpc_build_system.bzl", "grpc_cc_test", "grpc_package")
 
-grpc_package(name = "test/core/client_channel")
+grpc_package(name = "test/core/xds")
 
 licenses(["notice"])
 
 grpc_cc_test(
+    name = "xds_bootstrap_test",
+    srcs = ["xds_bootstrap_test.cc"],
+    external_deps = [
+        "gtest",
+    ],
+    language = "C++",
+    deps = [
+        "//:gpr",
+        "//:grpc",
+        "//test/core/util:grpc_test_util",
+    ],
+)
+
+grpc_cc_test(
+    name = "certificate_provider_store_test",
+    srcs = ["certificate_provider_store_test.cc"],
+    external_deps = ["gtest"],
+    language = "C++",
+    deps = [
+        "//:gpr",
+        "//:grpc",
+        "//test/core/util:grpc_test_util",
+    ],
+)
+
+grpc_cc_test(
+    name = "file_watcher_certificate_provider_factory_test",
+    srcs = ["file_watcher_certificate_provider_factory_test.cc"],
+    external_deps = ["gtest"],
+    language = "C++",
+    deps = [
+        "//:gpr",
+        "//:grpc",
+        "//test/core/util:grpc_test_util",
+    ],
+)
+
+grpc_cc_test(
     name = "google_mesh_ca_certificate_provider_factory_test",
     srcs = ["google_mesh_ca_certificate_provider_factory_test.cc"],
     external_deps = ["gtest"],
@@ -29,3 +67,15 @@ grpc_cc_test(
         "//test/core/util:grpc_test_util",
     ],
 )
+
+grpc_cc_test(
+    name = "xds_certificate_provider_test",
+    srcs = ["xds_certificate_provider_test.cc"],
+    external_deps = ["gtest"],
+    language = "C++",
+    deps = [
+        "//:gpr",
+        "//:grpc",
+        "//test/core/util:grpc_test_util",
+    ],
+)
diff --git a/test/core/xds/certificate_provider_store_test.cc b/test/core/xds/certificate_provider_store_test.cc
new file mode 100644 (file)
index 0000000..4e31e91
--- /dev/null
@@ -0,0 +1,168 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#include <thread>
+
+#include <gmock/gmock.h>
+
+#include "src/core/ext/xds/certificate_provider_registry.h"
+#include "src/core/ext/xds/certificate_provider_store.h"
+
+#include "test/core/util/test_config.h"
+
+namespace grpc_core {
+namespace testing {
+namespace {
+
+class CertificateProviderStoreTest : public ::testing::Test {
+ public:
+  CertificateProviderStoreTest() { grpc_init(); }
+
+  ~CertificateProviderStoreTest() override { grpc_shutdown_blocking(); }
+};
+
+class FakeCertificateProvider : public grpc_tls_certificate_provider {
+ public:
+  RefCountedPtr<grpc_tls_certificate_distributor> distributor() const override {
+    // never called
+    GPR_ASSERT(0);
+    return nullptr;
+  }
+};
+
+class FakeCertificateProviderFactory1 : public CertificateProviderFactory {
+ public:
+  class Config : public CertificateProviderFactory::Config {
+   public:
+    const char* name() const override { return "fake1"; }
+
+    std::string ToString() const override { return "{}"; }
+  };
+
+  const char* name() const override { return "fake1"; }
+
+  RefCountedPtr<CertificateProviderFactory::Config>
+  CreateCertificateProviderConfig(const Json& config_json,
+                                  grpc_error** error) override {
+    return MakeRefCounted<Config>();
+  }
+
+  RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
+      RefCountedPtr<CertificateProviderFactory::Config> config) override {
+    return MakeRefCounted<FakeCertificateProvider>();
+  }
+};
+
+class FakeCertificateProviderFactory2 : public CertificateProviderFactory {
+ public:
+  class Config : public CertificateProviderFactory::Config {
+   public:
+    const char* name() const override { return "fake2"; }
+
+    std::string ToString() const override { return "{}"; }
+  };
+
+  const char* name() const override { return "fake2"; }
+
+  RefCountedPtr<CertificateProviderFactory::Config>
+  CreateCertificateProviderConfig(const Json& config_json,
+                                  grpc_error** error) override {
+    return MakeRefCounted<Config>();
+  }
+
+  RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
+      RefCountedPtr<CertificateProviderFactory::Config> config) override {
+    return MakeRefCounted<FakeCertificateProvider>();
+  }
+};
+
+TEST_F(CertificateProviderStoreTest, Basic) {
+  // Set up factories. (Register only one of the factories.)
+  auto* fake_factory_1 = new FakeCertificateProviderFactory1;
+  CertificateProviderRegistry::RegisterCertificateProviderFactory(
+      std::unique_ptr<CertificateProviderFactory>(fake_factory_1));
+  auto fake_factory_2 = absl::make_unique<FakeCertificateProviderFactory2>();
+  // Set up store
+  CertificateProviderStore::PluginDefinitionMap map = {
+      {"fake_plugin_1",
+       {"fake1", fake_factory_1->CreateCertificateProviderConfig(Json::Object(),
+                                                                 nullptr)}},
+      {"fake_plugin_2",
+       {"fake2", fake_factory_2->CreateCertificateProviderConfig(Json::Object(),
+                                                                 nullptr)}},
+      {"fake_plugin_3",
+       {"fake1", fake_factory_1->CreateCertificateProviderConfig(Json::Object(),
+                                                                 nullptr)}},
+  };
+  CertificateProviderStore store(std::move(map));
+  // Test for creating certificate providers with known plugin configuration.
+  auto cert_provider_1 = store.CreateOrGetCertificateProvider("fake_plugin_1");
+  ASSERT_NE(cert_provider_1, nullptr);
+  auto cert_provider_3 = store.CreateOrGetCertificateProvider("fake_plugin_3");
+  ASSERT_NE(cert_provider_3, nullptr);
+  // Test for creating certificate provider with known plugin configuration but
+  // unregistered factory.
+  ASSERT_EQ(store.CreateOrGetCertificateProvider("fake_plugin_2"), nullptr);
+  // Test for creating certificate provider with unknown plugin configuration.
+  ASSERT_EQ(store.CreateOrGetCertificateProvider("unknown"), nullptr);
+  // Test for getting previously created certificate providers.
+  ASSERT_EQ(store.CreateOrGetCertificateProvider("fake_plugin_1"),
+            cert_provider_1);
+  ASSERT_EQ(store.CreateOrGetCertificateProvider("fake_plugin_3"),
+            cert_provider_3);
+  // Release previously created certificate providers so that the store outlasts
+  // the certificate providers.
+  cert_provider_1.reset();
+  cert_provider_3.reset();
+}
+
+TEST_F(CertificateProviderStoreTest, Multithreaded) {
+  auto* fake_factory_1 = new FakeCertificateProviderFactory1;
+  CertificateProviderRegistry::RegisterCertificateProviderFactory(
+      std::unique_ptr<CertificateProviderFactory>(fake_factory_1));
+  CertificateProviderStore::PluginDefinitionMap map = {
+      {"fake_plugin_1",
+       {"fake1", fake_factory_1->CreateCertificateProviderConfig(Json::Object(),
+                                                                 nullptr)}}};
+  CertificateProviderStore store(std::move(map));
+  // Test concurrent `CreateOrGetCertificateProvider()` with the same key.
+  std::vector<std::thread> threads;
+  threads.reserve(1000);
+  for (auto i = 0; i < 1000; i++) {
+    threads.emplace_back([&store]() {
+      for (auto i = 0; i < 10; ++i) {
+        ASSERT_NE(store.CreateOrGetCertificateProvider("fake_plugin_1"),
+                  nullptr);
+      }
+    });
+  }
+  for (auto& thread : threads) {
+    thread.join();
+  }
+}
+
+}  // namespace
+}  // namespace testing
+}  // namespace grpc_core
+
+int main(int argc, char** argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+  grpc::testing::TestEnvironment env(argc, argv);
+  auto result = RUN_ALL_TESTS();
+  return result;
+}
diff --git a/test/core/xds/file_watcher_certificate_provider_factory_test.cc b/test/core/xds/file_watcher_certificate_provider_factory_test.cc
new file mode 100644 (file)
index 0000000..0ecb012
--- /dev/null
@@ -0,0 +1,202 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#include "src/core/ext/xds/file_watcher_certificate_provider_factory.h"
+
+#include "absl/strings/str_format.h"
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include <grpc/grpc.h>
+
+#include "test/core/util/test_config.h"
+
+namespace grpc_core {
+namespace testing {
+namespace {
+
+const char* kIdentityCertFile = "/path/to/identity_cert_file";
+const char* kPrivateKeyFile = "/path/to/private_key_file";
+const char* kRootCertFile = "/path/to/root_cert_file";
+const int kRefreshInterval = 400;
+
+TEST(FileWatcherConfigTest, Basic) {
+  std::string json_str = absl::StrFormat(
+      "{"
+      "  \"certificate_file\": \"%s\","
+      "  \"private_key_file\": \"%s\","
+      "  \"ca_certificate_file\": \"%s\","
+      "  \"refresh_interval\": \"%ds\""
+      "}",
+      kIdentityCertFile, kPrivateKeyFile, kRootCertFile, kRefreshInterval);
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  auto config =
+      FileWatcherCertificateProviderFactory::Config::Parse(json, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  EXPECT_EQ(config->identity_cert_file(), kIdentityCertFile);
+  EXPECT_EQ(config->private_key_file(), kPrivateKeyFile);
+  EXPECT_EQ(config->root_cert_file(), kRootCertFile);
+  EXPECT_EQ(config->refresh_interval_ms(), kRefreshInterval * 1000);
+}
+
+TEST(FileWatcherConfigTest, DefaultRefreshInterval) {
+  std::string json_str = absl::StrFormat(
+      "{"
+      "  \"certificate_file\": \"%s\","
+      "  \"private_key_file\": \"%s\","
+      "  \"ca_certificate_file\": \"%s\""
+      "}",
+      kIdentityCertFile, kPrivateKeyFile, kRootCertFile);
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  auto config =
+      FileWatcherCertificateProviderFactory::Config::Parse(json, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  EXPECT_EQ(config->identity_cert_file(), kIdentityCertFile);
+  EXPECT_EQ(config->private_key_file(), kPrivateKeyFile);
+  EXPECT_EQ(config->root_cert_file(), kRootCertFile);
+  EXPECT_EQ(config->refresh_interval_ms(), 600 * 1000);
+}
+
+TEST(FileWatcherConfigTest, OnlyRootCertificatesFileProvided) {
+  std::string json_str = absl::StrFormat(
+      "{"
+      "  \"ca_certificate_file\": \"%s\""
+      "}",
+      kRootCertFile);
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  auto config =
+      FileWatcherCertificateProviderFactory::Config::Parse(json, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  EXPECT_TRUE(config->identity_cert_file().empty());
+  EXPECT_TRUE(config->private_key_file().empty());
+  EXPECT_EQ(config->root_cert_file(), kRootCertFile);
+  EXPECT_EQ(config->refresh_interval_ms(), 600 * 1000);
+}
+
+TEST(FileWatcherConfigTest, OnlyIdenityCertificatesAndPrivateKeyProvided) {
+  std::string json_str = absl::StrFormat(
+      "{"
+      "  \"certificate_file\": \"%s\","
+      "  \"private_key_file\": \"%s\""
+      "}",
+      kIdentityCertFile, kPrivateKeyFile);
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  auto config =
+      FileWatcherCertificateProviderFactory::Config::Parse(json, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  EXPECT_EQ(config->identity_cert_file(), kIdentityCertFile);
+  EXPECT_EQ(config->private_key_file(), kPrivateKeyFile);
+  EXPECT_TRUE(config->root_cert_file().empty());
+  EXPECT_EQ(config->refresh_interval_ms(), 600 * 1000);
+}
+
+TEST(FileWatcherConfigTest, WrongTypes) {
+  const char* json_str =
+      "{"
+      "  \"certificate_file\": 123,"
+      "  \"private_key_file\": 123,"
+      "  \"ca_certificate_file\": 123,"
+      "  \"refresh_interval\": 123"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  auto config =
+      FileWatcherCertificateProviderFactory::Config::Parse(json, &error);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "field:certificate_file error:type should be STRING.*"
+                  "field:private_key_file error:type should be STRING.*"
+                  "field:ca_certificate_file error:type should be STRING.*"
+                  "field:refresh_interval error:type should be STRING of the "
+                  "form given by "
+                  "google.proto.Duration.*"));
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST(FileWatcherConfigTest, IdentityCertProvidedButPrivateKeyMissing) {
+  std::string json_str = absl::StrFormat(
+      "{"
+      "  \"certificate_file\": \"%s\""
+      "}",
+      kIdentityCertFile);
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  auto config =
+      FileWatcherCertificateProviderFactory::Config::Parse(json, &error);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "fields \"certificate_file\" and \"private_key_file\" must "
+                  "be both set or both unset."));
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST(FileWatcherConfigTest, PrivateKeyProvidedButIdentityCertMissing) {
+  std::string json_str = absl::StrFormat(
+      "{"
+      "  \"private_key_file\": \"%s\""
+      "}",
+      kPrivateKeyFile);
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  auto config =
+      FileWatcherCertificateProviderFactory::Config::Parse(json, &error);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "fields \"certificate_file\" and \"private_key_file\" must "
+                  "be both set or both unset."));
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST(FileWatcherConfigTest, EmptyJsonObject) {
+  std::string json_str = absl::StrFormat("{}");
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  auto config =
+      FileWatcherCertificateProviderFactory::Config::Parse(json, &error);
+  EXPECT_THAT(
+      grpc_error_string(error),
+      ::testing::ContainsRegex("At least one of \"certificate_file\" and "
+                               "\"ca_certificate_file\" must be specified."));
+  GRPC_ERROR_UNREF(error);
+}
+
+}  // namespace
+}  // namespace testing
+}  // namespace grpc_core
+
+int main(int argc, char** argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+  grpc::testing::TestEnvironment env(argc, argv);
+  grpc_init();
+  auto result = RUN_ALL_TESTS();
+  grpc_shutdown();
+  return result;
+}
diff --git a/test/core/xds/xds_bootstrap_test.cc b/test/core/xds/xds_bootstrap_test.cc
new file mode 100644 (file)
index 0000000..7a7545d
--- /dev/null
@@ -0,0 +1,644 @@
+//
+// Copyright 2019 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <regex>
+
+#include "absl/strings/numbers.h"
+#include "absl/strings/str_format.h"
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include <grpc/grpc.h>
+#include <grpc/slice.h>
+
+#include "src/core/ext/xds/certificate_provider_registry.h"
+#include "src/core/ext/xds/xds_bootstrap.h"
+#include "src/core/lib/gpr/env.h"
+#include "src/core/lib/gpr/tmpfile.h"
+#include "test/core/util/test_config.h"
+
+namespace grpc_core {
+namespace testing {
+
+class TestType {
+ public:
+  TestType(bool parse_xds_certificate_providers)
+      : parse_xds_certificate_providers_(parse_xds_certificate_providers) {}
+
+  bool parse_xds_certificate_providers() const {
+    return parse_xds_certificate_providers_;
+  }
+
+  std::string AsString() const {
+    return parse_xds_certificate_providers_
+               ? "WithCertificateProvidersParsing"
+               : "WithoutCertificateProvidersParsing";
+  }
+
+ private:
+  const bool parse_xds_certificate_providers_;
+};
+
+class XdsBootstrapTest : public ::testing::TestWithParam<TestType> {
+ public:
+  XdsBootstrapTest() {
+    if (GetParam().parse_xds_certificate_providers()) {
+      gpr_setenv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT", "true");
+    } else {
+      gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT");
+    }
+    grpc_init();
+  }
+
+  ~XdsBootstrapTest() override { grpc_shutdown_blocking(); }
+};
+
+TEST_P(XdsBootstrapTest, Basic) {
+  const char* json_str =
+      "{"
+      "  \"xds_servers\": ["
+      "    {"
+      "      \"server_uri\": \"fake:///lb\","
+      "      \"channel_creds\": ["
+      "        {"
+      "          \"type\": \"fake\","
+      "          \"ignore\": 0"
+      "        }"
+      "      ],"
+      "      \"ignore\": 0"
+      "    },"
+      "    {"
+      "      \"server_uri\": \"ignored\","
+      "      \"channel_creds\": ["
+      "        {"
+      "          \"type\": \"ignored\","
+      "          \"ignore\": 0"
+      "        },"
+      "        {"
+      "          \"type\": \"fake\""
+      "        }"
+      "      ],"
+      "      \"ignore\": 0"
+      "    }"
+      "  ],"
+      "  \"node\": {"
+      "    \"id\": \"foo\","
+      "    \"cluster\": \"bar\","
+      "    \"locality\": {"
+      "      \"region\": \"milky_way\","
+      "      \"zone\": \"sol_system\","
+      "      \"subzone\": \"earth\","
+      "      \"ignore\": {}"
+      "    },"
+      "    \"metadata\": {"
+      "      \"foo\": 1,"
+      "      \"bar\": 2"
+      "    },"
+      "    \"ignore\": \"whee\""
+      "  },"
+      "  \"ignore\": {}"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  EXPECT_EQ(bootstrap.server().server_uri, "fake:///lb");
+  EXPECT_EQ(bootstrap.server().channel_creds_type, "fake");
+  EXPECT_EQ(bootstrap.server().channel_creds_config.type(),
+            Json::Type::JSON_NULL);
+  ASSERT_NE(bootstrap.node(), nullptr);
+  EXPECT_EQ(bootstrap.node()->id, "foo");
+  EXPECT_EQ(bootstrap.node()->cluster, "bar");
+  EXPECT_EQ(bootstrap.node()->locality_region, "milky_way");
+  EXPECT_EQ(bootstrap.node()->locality_zone, "sol_system");
+  EXPECT_EQ(bootstrap.node()->locality_subzone, "earth");
+  ASSERT_EQ(bootstrap.node()->metadata.type(), Json::Type::OBJECT);
+  EXPECT_THAT(bootstrap.node()->metadata.object_value(),
+              ::testing::ElementsAre(
+                  ::testing::Pair(
+                      ::testing::Eq("bar"),
+                      ::testing::AllOf(
+                          ::testing::Property(&Json::type, Json::Type::NUMBER),
+                          ::testing::Property(&Json::string_value, "2"))),
+                  ::testing::Pair(
+                      ::testing::Eq("foo"),
+                      ::testing::AllOf(
+                          ::testing::Property(&Json::type, Json::Type::NUMBER),
+                          ::testing::Property(&Json::string_value, "1")))));
+}
+
+TEST_P(XdsBootstrapTest, ValidWithoutNode) {
+  const char* json_str =
+      "{"
+      "  \"xds_servers\": ["
+      "    {"
+      "      \"server_uri\": \"fake:///lb\","
+      "      \"channel_creds\": [{\"type\": \"fake\"}]"
+      "    }"
+      "  ]"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  EXPECT_EQ(bootstrap.server().server_uri, "fake:///lb");
+  EXPECT_EQ(bootstrap.server().channel_creds_type, "fake");
+  EXPECT_EQ(bootstrap.node(), nullptr);
+}
+
+TEST_P(XdsBootstrapTest, InsecureCreds) {
+  const char* json_str =
+      "{"
+      "  \"xds_servers\": ["
+      "    {"
+      "      \"server_uri\": \"fake:///lb\","
+      "      \"channel_creds\": [{\"type\": \"insecure\"}]"
+      "    }"
+      "  ]"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  EXPECT_EQ(bootstrap.server().server_uri, "fake:///lb");
+  EXPECT_EQ(bootstrap.server().channel_creds_type, "insecure");
+  EXPECT_EQ(bootstrap.node(), nullptr);
+}
+
+TEST_P(XdsBootstrapTest, GoogleDefaultCreds) {
+  // Generate call creds file needed by GoogleDefaultCreds.
+  const char token_str[] =
+      "{ \"client_id\": \"32555999999.apps.googleusercontent.com\","
+      "  \"client_secret\": \"EmssLNjJy1332hD4KFsecret\","
+      "  \"refresh_token\": \"1/Blahblasj424jladJDSGNf-u4Sua3HDA2ngjd42\","
+      "  \"type\": \"authorized_user\"}";
+  char* creds_file_name;
+  FILE* creds_file = gpr_tmpfile("xds_bootstrap_test", &creds_file_name);
+  ASSERT_NE(creds_file_name, nullptr);
+  ASSERT_NE(creds_file, nullptr);
+  ASSERT_EQ(fwrite(token_str, 1, sizeof(token_str), creds_file),
+            sizeof(token_str));
+  fclose(creds_file);
+  gpr_setenv(GRPC_GOOGLE_CREDENTIALS_ENV_VAR, creds_file_name);
+  gpr_free(creds_file_name);
+  // Now run test.
+  const char* json_str =
+      "{"
+      "  \"xds_servers\": ["
+      "    {"
+      "      \"server_uri\": \"fake:///lb\","
+      "      \"channel_creds\": [{\"type\": \"google_default\"}]"
+      "    }"
+      "  ]"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  EXPECT_EQ(bootstrap.server().server_uri, "fake:///lb");
+  EXPECT_EQ(bootstrap.server().channel_creds_type, "google_default");
+  EXPECT_EQ(bootstrap.node(), nullptr);
+}
+
+TEST_P(XdsBootstrapTest, MissingChannelCreds) {
+  const char* json_str =
+      "{"
+      "  \"xds_servers\": ["
+      "    {"
+      "      \"server_uri\": \"fake:///lb\""
+      "    }"
+      "  ]"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex("\"channel_creds\" field not present"));
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST_P(XdsBootstrapTest, NoKnownChannelCreds) {
+  const char* json_str =
+      "{"
+      "  \"xds_servers\": ["
+      "    {"
+      "      \"server_uri\": \"fake:///lb\","
+      "      \"channel_creds\": [{\"type\": \"unknown\"}]"
+      "    }"
+      "  ]"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex(
+                  "no known creds type found in \"channel_creds\""));
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST_P(XdsBootstrapTest, MissingXdsServers) {
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse("{}", &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex("\"xds_servers\" field not present"));
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST_P(XdsBootstrapTest, TopFieldsWrongTypes) {
+  const char* json_str =
+      "{"
+      "  \"xds_servers\":1,"
+      "  \"node\":1,"
+      "  \"certificate_providers\":1"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex("\"xds_servers\" field is not an array.*"
+                                       "\"node\" field is not an object.*"));
+  if (GetParam().parse_xds_certificate_providers()) {
+    EXPECT_THAT(grpc_error_string(error),
+                ::testing::ContainsRegex(
+                    "\"certificate_providers\" field is not an object"));
+  }
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST_P(XdsBootstrapTest, XdsServerMissingServerUri) {
+  const char* json_str =
+      "{"
+      "  \"xds_servers\":[{}]"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex("errors parsing \"xds_servers\" array.*"
+                                       "errors parsing index 0.*"
+                                       "\"server_uri\" field not present"));
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST_P(XdsBootstrapTest, XdsServerUriAndCredsWrongTypes) {
+  const char* json_str =
+      "{"
+      "  \"xds_servers\":["
+      "    {"
+      "      \"server_uri\":1,"
+      "      \"channel_creds\":1"
+      "    }"
+      "  ]"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_THAT(
+      grpc_error_string(error),
+      ::testing::ContainsRegex("errors parsing \"xds_servers\" array.*"
+                               "errors parsing index 0.*"
+                               "\"server_uri\" field is not a string.*"
+                               "\"channel_creds\" field is not an array"));
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST_P(XdsBootstrapTest, ChannelCredsFieldsWrongTypes) {
+  const char* json_str =
+      "{"
+      "  \"xds_servers\":["
+      "    {"
+      "      \"server_uri\":\"foo\","
+      "      \"channel_creds\":["
+      "        {"
+      "          \"type\":0,"
+      "          \"config\":1"
+      "        }"
+      "      ]"
+      "    }"
+      "  ]"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_THAT(
+      grpc_error_string(error),
+      ::testing::ContainsRegex("errors parsing \"xds_servers\" array.*"
+                               "errors parsing index 0.*"
+                               "errors parsing \"channel_creds\" array.*"
+                               "errors parsing index 0.*"
+                               "\"type\" field is not a string.*"
+                               "\"config\" field is not an object"));
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST_P(XdsBootstrapTest, NodeFieldsWrongTypes) {
+  const char* json_str =
+      "{"
+      "  \"node\":{"
+      "    \"id\":0,"
+      "    \"cluster\":0,"
+      "    \"locality\":0,"
+      "    \"metadata\":0"
+      "  }"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex("errors parsing \"node\" object.*"
+                                       "\"id\" field is not a string.*"
+                                       "\"cluster\" field is not a string.*"
+                                       "\"locality\" field is not an object.*"
+                                       "\"metadata\" field is not an object"));
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST_P(XdsBootstrapTest, LocalityFieldsWrongType) {
+  const char* json_str =
+      "{"
+      "  \"node\":{"
+      "    \"locality\":{"
+      "      \"region\":0,"
+      "      \"zone\":0,"
+      "      \"subzone\":0"
+      "    }"
+      "  }"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  EXPECT_THAT(grpc_error_string(error),
+              ::testing::ContainsRegex("errors parsing \"node\" object.*"
+                                       "errors parsing \"locality\" object.*"
+                                       "\"region\" field is not a string.*"
+                                       "\"zone\" field is not a string.*"
+                                       "\"subzone\" field is not a string"));
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST_P(XdsBootstrapTest, CertificateProvidersElementWrongType) {
+  const char* json_str =
+      "{"
+      "  \"xds_servers\": ["
+      "    {"
+      "      \"server_uri\": \"fake:///lb\","
+      "      \"channel_creds\": [{\"type\": \"fake\"}]"
+      "    }"
+      "  ],"
+      "  \"certificate_providers\": {"
+      "    \"plugin\":1"
+      "  }"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  if (GetParam().parse_xds_certificate_providers()) {
+    EXPECT_THAT(grpc_error_string(error),
+                ::testing::ContainsRegex(
+                    "errors parsing \"certificate_providers\" object.*"
+                    "element \"plugin\" is not an object"));
+  } else {
+    EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  }
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST_P(XdsBootstrapTest, CertificateProvidersPluginNameWrongType) {
+  const char* json_str =
+      "{"
+      "  \"xds_servers\": ["
+      "    {"
+      "      \"server_uri\": \"fake:///lb\","
+      "      \"channel_creds\": [{\"type\": \"fake\"}]"
+      "    }"
+      "  ],"
+      "  \"certificate_providers\": {"
+      "    \"plugin\": {"
+      "      \"plugin_name\":1"
+      "    }"
+      "  }"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  if (GetParam().parse_xds_certificate_providers()) {
+    EXPECT_THAT(grpc_error_string(error),
+                ::testing::ContainsRegex(
+                    "errors parsing \"certificate_providers\" object.*"
+                    "errors parsing element \"plugin\".*"
+                    "\"plugin_name\" field is not a string"));
+  } else {
+    EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  }
+  GRPC_ERROR_UNREF(error);
+}
+
+class FakeCertificateProviderFactory : public CertificateProviderFactory {
+ public:
+  class Config : public CertificateProviderFactory::Config {
+   public:
+    explicit Config(int value) : value_(value) {}
+
+    int value() const { return value_; }
+
+    const char* name() const override { return "fake"; }
+
+    std::string ToString() const override {
+      return absl::StrFormat(
+          "{\n"
+          "  value=%d"
+          "}",
+          value_);
+    }
+
+   private:
+    int value_;
+  };
+
+  const char* name() const override { return "fake"; }
+
+  RefCountedPtr<CertificateProviderFactory::Config>
+  CreateCertificateProviderConfig(const Json& config_json,
+                                  grpc_error** error) override {
+    std::vector<grpc_error*> error_list;
+    EXPECT_EQ(config_json.type(), Json::Type::OBJECT);
+    auto it = config_json.object_value().find("value");
+    if (it == config_json.object_value().end()) {
+      return MakeRefCounted<FakeCertificateProviderFactory::Config>(0);
+    } else if (it->second.type() != Json::Type::NUMBER) {
+      *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+          "field:config field:value not of type number");
+    } else {
+      int value = 0;
+      EXPECT_TRUE(absl::SimpleAtoi(it->second.string_value(), &value));
+      return MakeRefCounted<FakeCertificateProviderFactory::Config>(value);
+    }
+    return nullptr;
+  }
+
+  RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
+      RefCountedPtr<CertificateProviderFactory::Config> config) override {
+    return nullptr;
+  }
+};
+
+TEST_P(XdsBootstrapTest, CertificateProvidersFakePluginParsingError) {
+  CertificateProviderRegistry::RegisterCertificateProviderFactory(
+      absl::make_unique<FakeCertificateProviderFactory>());
+  const char* json_str =
+      "{"
+      "  \"xds_servers\": ["
+      "    {"
+      "      \"server_uri\": \"fake:///lb\","
+      "      \"channel_creds\": [{\"type\": \"fake\"}]"
+      "    }"
+      "  ],"
+      "  \"certificate_providers\": {"
+      "    \"fake_plugin\": {"
+      "      \"plugin_name\": \"fake\","
+      "      \"config\": {"
+      "        \"value\": \"10\""
+      "      }"
+      "    }"
+      "  }"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  if (GetParam().parse_xds_certificate_providers()) {
+    EXPECT_THAT(grpc_error_string(error),
+                ::testing::ContainsRegex(
+                    "errors parsing \"certificate_providers\" object.*"
+                    "errors parsing element \"fake_plugin\".*"
+                    "field:config field:value not of type number"));
+  } else {
+    EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  }
+  GRPC_ERROR_UNREF(error);
+}
+
+TEST_P(XdsBootstrapTest, CertificateProvidersFakePluginParsingSuccess) {
+  CertificateProviderRegistry::RegisterCertificateProviderFactory(
+      absl::make_unique<FakeCertificateProviderFactory>());
+  const char* json_str =
+      "{"
+      "  \"xds_servers\": ["
+      "    {"
+      "      \"server_uri\": \"fake:///lb\","
+      "      \"channel_creds\": [{\"type\": \"fake\"}]"
+      "    }"
+      "  ],"
+      "  \"certificate_providers\": {"
+      "    \"fake_plugin\": {"
+      "      \"plugin_name\": \"fake\","
+      "      \"config\": {"
+      "        \"value\": 10"
+      "      }"
+      "    }"
+      "  }"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  ASSERT_TRUE(error == GRPC_ERROR_NONE) << grpc_error_string(error);
+  if (GetParam().parse_xds_certificate_providers()) {
+    const CertificateProviderStore::PluginDefinition& fake_plugin =
+        bootstrap.certificate_providers().at("fake_plugin");
+    ASSERT_EQ(fake_plugin.plugin_name, "fake");
+    ASSERT_STREQ(fake_plugin.config->name(), "fake");
+    ASSERT_EQ(
+        static_cast<RefCountedPtr<FakeCertificateProviderFactory::Config>>(
+            fake_plugin.config)
+            ->value(),
+        10);
+  } else {
+    EXPECT_TRUE(bootstrap.certificate_providers().empty());
+  }
+}
+
+TEST_P(XdsBootstrapTest, CertificateProvidersFakePluginEmptyConfig) {
+  CertificateProviderRegistry::RegisterCertificateProviderFactory(
+      absl::make_unique<FakeCertificateProviderFactory>());
+  const char* json_str =
+      "{"
+      "  \"xds_servers\": ["
+      "    {"
+      "      \"server_uri\": \"fake:///lb\","
+      "      \"channel_creds\": [{\"type\": \"fake\"}]"
+      "    }"
+      "  ],"
+      "  \"certificate_providers\": {"
+      "    \"fake_plugin\": {"
+      "      \"plugin_name\": \"fake\""
+      "    }"
+      "  }"
+      "}";
+  grpc_error* error = GRPC_ERROR_NONE;
+  Json json = Json::Parse(json_str, &error);
+  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
+  XdsBootstrap bootstrap(std::move(json), &error);
+  ASSERT_TRUE(error == GRPC_ERROR_NONE) << grpc_error_string(error);
+  if (GetParam().parse_xds_certificate_providers()) {
+    const CertificateProviderStore::PluginDefinition& fake_plugin =
+        bootstrap.certificate_providers().at("fake_plugin");
+    ASSERT_EQ(fake_plugin.plugin_name, "fake");
+    ASSERT_STREQ(fake_plugin.config->name(), "fake");
+    ASSERT_EQ(
+        static_cast<RefCountedPtr<FakeCertificateProviderFactory::Config>>(
+            fake_plugin.config)
+            ->value(),
+        0);
+  } else {
+    EXPECT_TRUE(bootstrap.certificate_providers().empty());
+  }
+}
+
+std::string TestTypeName(const ::testing::TestParamInfo<TestType>& info) {
+  return info.param.AsString();
+}
+
+INSTANTIATE_TEST_SUITE_P(XdsBootstrap, XdsBootstrapTest,
+                         ::testing::Values(TestType(false), TestType(true)),
+                         &TestTypeName);
+
+}  // namespace testing
+}  // namespace grpc_core
+
+int main(int argc, char** argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+  grpc::testing::TestEnvironment env(argc, argv);
+  int ret = RUN_ALL_TESTS();
+  return ret;
+}
diff --git a/test/core/xds/xds_certificate_provider_test.cc b/test/core/xds/xds_certificate_provider_test.cc
new file mode 100644 (file)
index 0000000..25dc7ae
--- /dev/null
@@ -0,0 +1,529 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include "src/core/ext/xds/xds_certificate_provider.h"
+#include "test/core/util/test_config.h"
+
+namespace grpc_core {
+namespace testing {
+namespace {
+
+constexpr const char* kRootCert1 = "root_cert_1_contents";
+constexpr const char* kRootCert2 = "root_cert_2_contents";
+constexpr const char* kIdentityCert1PrivateKey = "identity_private_key_1";
+constexpr const char* kIdentityCert1 = "identity_cert_1_contents";
+constexpr const char* kIdentityCert2PrivateKey = "identity_private_key_2";
+constexpr const char* kIdentityCert2 = "identity_cert_2_contents";
+constexpr const char* kRootErrorMessage = "root_error_message";
+constexpr const char* kIdentityErrorMessage = "identity_error_message";
+
+PemKeyCertPairList MakeKeyCertPairs(const char* private_key,
+                                    const char* certs) {
+  if (strcmp(private_key, "") == 0 && strcmp(certs, "") == 0) {
+    return {};
+  }
+  grpc_ssl_pem_key_cert_pair* ssl_pair =
+      static_cast<grpc_ssl_pem_key_cert_pair*>(
+          gpr_malloc(sizeof(grpc_ssl_pem_key_cert_pair)));
+  ssl_pair->private_key = gpr_strdup(private_key);
+  ssl_pair->cert_chain = gpr_strdup(certs);
+  return PemKeyCertPairList{PemKeyCertPair(ssl_pair)};
+}
+
+PemKeyCertPairList MakeKeyCertPairsType1() {
+  return MakeKeyCertPairs(kIdentityCert1PrivateKey, kIdentityCert1);
+}
+
+PemKeyCertPairList MakeKeyCertPairsType2() {
+  return MakeKeyCertPairs(kIdentityCert2PrivateKey, kIdentityCert2);
+}
+
+class TestCertificatesWatcher
+    : public grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface {
+ public:
+  ~TestCertificatesWatcher() override {
+    GRPC_ERROR_UNREF(root_cert_error_);
+    GRPC_ERROR_UNREF(identity_cert_error_);
+  }
+
+  void OnCertificatesChanged(
+      absl::optional<absl::string_view> root_certs,
+      absl::optional<PemKeyCertPairList> key_cert_pairs) override {
+    if (root_certs.has_value()) {
+      if (!root_certs_.has_value() ||
+          (root_certs_.has_value() &&
+           std::string(root_certs.value()) != root_certs_.value())) {
+        GRPC_ERROR_UNREF(root_cert_error_);
+        root_cert_error_ = GRPC_ERROR_NONE;
+      }
+      root_certs_.emplace(std::string(root_certs.value()));
+    }
+    if (key_cert_pairs.has_value()) {
+      if (key_cert_pairs != key_cert_pairs_) {
+        GRPC_ERROR_UNREF(identity_cert_error_);
+        identity_cert_error_ = GRPC_ERROR_NONE;
+        key_cert_pairs_ = key_cert_pairs;
+      }
+    }
+  }
+
+  void OnError(grpc_error* root_cert_error,
+               grpc_error* identity_cert_error) override {
+    GRPC_ERROR_UNREF(root_cert_error_);
+    root_cert_error_ = root_cert_error;
+    GRPC_ERROR_UNREF(identity_cert_error_);
+    identity_cert_error_ = identity_cert_error;
+  }
+
+  const absl::optional<std::string>& root_certs() const { return root_certs_; }
+
+  const absl::optional<PemKeyCertPairList>& key_cert_pairs() const {
+    return key_cert_pairs_;
+  }
+
+  grpc_error* root_cert_error() const { return root_cert_error_; }
+
+  grpc_error* identity_cert_error() const { return identity_cert_error_; }
+
+ private:
+  absl::optional<std::string> root_certs_;
+  absl::optional<PemKeyCertPairList> key_cert_pairs_;
+  grpc_error* root_cert_error_ = GRPC_ERROR_NONE;
+  grpc_error* identity_cert_error_ = GRPC_ERROR_NONE;
+};
+
+TEST(
+    XdsCertificateProviderTest,
+    RootCertDistributorDifferentFromIdentityCertDistributorDifferentCertNames) {
+  auto root_cert_distributor =
+      MakeRefCounted<grpc_tls_certificate_distributor>();
+  auto identity_cert_distributor =
+      MakeRefCounted<grpc_tls_certificate_distributor>();
+  XdsCertificateProvider provider("root", root_cert_distributor, "identity",
+                                  identity_cert_distributor);
+  auto* watcher = new TestCertificatesWatcher;
+  provider.distributor()->WatchTlsCertificates(
+      std::unique_ptr<TestCertificatesWatcher>(watcher), "", "");
+  EXPECT_EQ(watcher->root_certs(), absl::nullopt);
+  EXPECT_EQ(watcher->key_cert_pairs(), absl::nullopt);
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Update both root certs and identity certs
+  root_cert_distributor->SetKeyMaterials("root", kRootCert1, absl::nullopt);
+  identity_cert_distributor->SetKeyMaterials("identity", absl::nullopt,
+                                             MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Second update for just root certs
+  root_cert_distributor->SetKeyMaterials(
+      "root", kRootCert2,
+      MakeKeyCertPairsType2() /* does not have an effect */);
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Second update for identity certs
+  identity_cert_distributor->SetKeyMaterials(
+      "identity", kRootCert1 /* does not have an effect */,
+      MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Set error for both root and identity
+  root_cert_distributor->SetErrorForCert(
+      "root", GRPC_ERROR_CREATE_FROM_STATIC_STRING(kRootErrorMessage),
+      absl::nullopt);
+  identity_cert_distributor->SetErrorForCert(
+      "identity", absl::nullopt,
+      GRPC_ERROR_CREATE_FROM_STATIC_STRING(kIdentityErrorMessage));
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
+              ::testing::HasSubstr(kRootErrorMessage));
+  EXPECT_THAT(grpc_error_string(watcher->identity_cert_error()),
+              ::testing::HasSubstr(kIdentityErrorMessage));
+  // Send an update for root certs. Test that the root cert error is reset.
+  root_cert_distributor->SetKeyMaterials("root", kRootCert1, absl::nullopt);
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_THAT(grpc_error_string(watcher->identity_cert_error()),
+              ::testing::HasSubstr(kIdentityErrorMessage));
+  // Send an update for identity certs. Test that the identity cert error is
+  // reset.
+  identity_cert_distributor->SetKeyMaterials("identity", absl::nullopt,
+                                             MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+}
+
+TEST(XdsCertificateProviderTest,
+     RootCertDistributorDifferentFromIdentityCertDistributorSameCertNames) {
+  auto root_cert_distributor =
+      MakeRefCounted<grpc_tls_certificate_distributor>();
+  auto identity_cert_distributor =
+      MakeRefCounted<grpc_tls_certificate_distributor>();
+  XdsCertificateProvider provider("test", root_cert_distributor, "test",
+                                  identity_cert_distributor);
+  auto* watcher = new TestCertificatesWatcher;
+  provider.distributor()->WatchTlsCertificates(
+      std::unique_ptr<TestCertificatesWatcher>(watcher), "", "");
+  EXPECT_EQ(watcher->root_certs(), absl::nullopt);
+  EXPECT_EQ(watcher->key_cert_pairs(), absl::nullopt);
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Update both root certs and identity certs
+  root_cert_distributor->SetKeyMaterials("test", kRootCert1, absl::nullopt);
+  identity_cert_distributor->SetKeyMaterials("test", absl::nullopt,
+                                             MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Second update for just root certs
+  root_cert_distributor->SetKeyMaterials("test", kRootCert2, absl::nullopt);
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Second update for identity certs
+  identity_cert_distributor->SetKeyMaterials("test", absl::nullopt,
+                                             MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Set error for both root and identity
+  root_cert_distributor->SetErrorForCert(
+      "test", GRPC_ERROR_CREATE_FROM_STATIC_STRING(kRootErrorMessage),
+      absl::nullopt);
+  identity_cert_distributor->SetErrorForCert(
+      "test", absl::nullopt,
+      GRPC_ERROR_CREATE_FROM_STATIC_STRING(kIdentityErrorMessage));
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
+              ::testing::HasSubstr(kRootErrorMessage));
+  EXPECT_THAT(grpc_error_string(watcher->identity_cert_error()),
+              ::testing::HasSubstr(kIdentityErrorMessage));
+  // Send an update for root certs. Test that the root cert error is reset.
+  root_cert_distributor->SetKeyMaterials("test", kRootCert1, absl::nullopt);
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_THAT(grpc_error_string(watcher->identity_cert_error()),
+              ::testing::HasSubstr(kIdentityErrorMessage));
+  // Send an update for identity certs. Test that the identity cert error is
+  // reset.
+  identity_cert_distributor->SetKeyMaterials("test", absl::nullopt,
+                                             MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Test update on unwatched cert name
+  identity_cert_distributor->SetKeyMaterials("identity", kRootCert2,
+                                             MakeKeyCertPairsType2());
+  root_cert_distributor->SetKeyMaterials("root", kRootCert1,
+                                         MakeKeyCertPairsType1());
+}
+
+TEST(XdsCertificateProviderTest,
+     RootCertDistributorSameAsIdentityCertDistributorDifferentCertNames) {
+  auto distributor = MakeRefCounted<grpc_tls_certificate_distributor>();
+  XdsCertificateProvider provider("root", distributor, "identity", distributor);
+  auto* watcher = new TestCertificatesWatcher;
+  provider.distributor()->WatchTlsCertificates(
+      std::unique_ptr<TestCertificatesWatcher>(watcher), "", "");
+  EXPECT_EQ(watcher->root_certs(), absl::nullopt);
+  EXPECT_EQ(watcher->key_cert_pairs(), absl::nullopt);
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Update both root certs and identity certs
+  distributor->SetKeyMaterials("root", kRootCert1, MakeKeyCertPairsType2());
+  distributor->SetKeyMaterials("identity", kRootCert2, MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Second update for just root certs
+  distributor->SetKeyMaterials("root", kRootCert2, MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Second update for identity certs
+  distributor->SetKeyMaterials("identity", kRootCert1, MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Set error for root
+  distributor->SetErrorForCert(
+      "root", GRPC_ERROR_CREATE_FROM_STATIC_STRING(kRootErrorMessage),
+      GRPC_ERROR_CREATE_FROM_STATIC_STRING(kRootErrorMessage));
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
+              ::testing::HasSubstr(kRootErrorMessage));
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  distributor->SetErrorForCert(
+      "identity", GRPC_ERROR_CREATE_FROM_STATIC_STRING(kIdentityErrorMessage),
+      GRPC_ERROR_CREATE_FROM_STATIC_STRING(kIdentityErrorMessage));
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
+              ::testing::HasSubstr(kRootErrorMessage));
+  EXPECT_THAT(grpc_error_string(watcher->identity_cert_error()),
+              ::testing::HasSubstr(kIdentityErrorMessage));
+  // Send an update for root
+  distributor->SetKeyMaterials("root", kRootCert1, MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_THAT(grpc_error_string(watcher->identity_cert_error()),
+              ::testing::HasSubstr(kIdentityErrorMessage));
+  // Send an update for identity
+  distributor->SetKeyMaterials("identity", kRootCert2, MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+}
+
+TEST(XdsCertificateProviderTest,
+     RootCertDistributorSameAsIdentityCertDistributorSameCertNames) {
+  auto distributor = MakeRefCounted<grpc_tls_certificate_distributor>();
+  XdsCertificateProvider provider("", distributor, "", distributor);
+  auto* watcher = new TestCertificatesWatcher;
+  provider.distributor()->WatchTlsCertificates(
+      std::unique_ptr<TestCertificatesWatcher>(watcher), "", "");
+  EXPECT_EQ(watcher->root_certs(), absl::nullopt);
+  EXPECT_EQ(watcher->key_cert_pairs(), absl::nullopt);
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Update both root certs and identity certs
+  distributor->SetKeyMaterials("", kRootCert1, MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Second update for just root certs
+  distributor->SetKeyMaterials("", kRootCert2, absl::nullopt);
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Second update for identity certs
+  distributor->SetKeyMaterials("", absl::nullopt, MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Set error for root
+  distributor->SetErrorForCert(
+      "", GRPC_ERROR_CREATE_FROM_STATIC_STRING(kRootErrorMessage),
+      absl::nullopt);
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
+              ::testing::HasSubstr(kRootErrorMessage));
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Set error for identity
+  distributor->SetErrorForCert(
+      "", absl::nullopt,
+      GRPC_ERROR_CREATE_FROM_STATIC_STRING(kIdentityErrorMessage));
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
+              ::testing::HasSubstr(kRootErrorMessage));
+  EXPECT_THAT(grpc_error_string(watcher->identity_cert_error()),
+              ::testing::HasSubstr(kIdentityErrorMessage));
+  // Send an update for root
+  distributor->SetKeyMaterials("", kRootCert1, absl::nullopt);
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_THAT(grpc_error_string(watcher->identity_cert_error()),
+              ::testing::HasSubstr(kIdentityErrorMessage));
+  // Send an update for identity
+  distributor->SetKeyMaterials("", absl::nullopt, MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+}
+
+TEST(XdsCertificateProviderTest, SwapOutDistributorsMultipleTimes) {
+  auto distributor = MakeRefCounted<grpc_tls_certificate_distributor>();
+  distributor->SetKeyMaterials("", kRootCert1, MakeKeyCertPairsType1());
+  XdsCertificateProvider provider("", nullptr, "", nullptr);
+  auto* watcher = new TestCertificatesWatcher;
+  provider.distributor()->WatchTlsCertificates(
+      std::unique_ptr<TestCertificatesWatcher>(watcher), "", "");
+  // Initially there are no certificate providers.
+  EXPECT_EQ(watcher->root_certs(), absl::nullopt);
+  EXPECT_EQ(watcher->key_cert_pairs(), absl::nullopt);
+  EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
+              ::testing::HasSubstr(
+                  "No certificate provider available for root certificates"));
+  EXPECT_THAT(
+      grpc_error_string(watcher->identity_cert_error()),
+      ::testing::HasSubstr(
+          "No certificate provider available for identity certificates"));
+  // Update root cert distributor.
+  provider.UpdateRootCertNameAndDistributor("", distributor);
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), absl::nullopt);
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_THAT(
+      grpc_error_string(watcher->identity_cert_error()),
+      ::testing::HasSubstr(
+          "No certificate provider available for identity certificates"));
+  // Update identity cert distributor
+  provider.UpdateIdentityCertNameAndDistributor("", distributor);
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Update both root and identity certs
+  distributor->SetKeyMaterials("", kRootCert2, MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Set error for both root and identity
+  distributor->SetErrorForCert(
+      "", GRPC_ERROR_CREATE_FROM_STATIC_STRING(kRootErrorMessage),
+      GRPC_ERROR_CREATE_FROM_STATIC_STRING(kIdentityErrorMessage));
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
+              ::testing::HasSubstr(kRootErrorMessage));
+  EXPECT_THAT(grpc_error_string(watcher->identity_cert_error()),
+              ::testing::HasSubstr(kIdentityErrorMessage));
+  // Send an update again
+  distributor->SetKeyMaterials("", kRootCert1, MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Remove root cert provider
+  provider.UpdateRootCertNameAndDistributor("", nullptr);
+  distributor->SetKeyMaterials("", kRootCert2, MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);  // not updated
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
+              ::testing::HasSubstr(
+                  "No certificate provider available for root certificates"));
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Remove identity cert provider too
+  provider.UpdateIdentityCertNameAndDistributor("", nullptr);
+  distributor->SetKeyMaterials("", kRootCert1, MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());  // not updated
+  EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
+              ::testing::HasSubstr(
+                  "No certificate provider available for root certificates"));
+  EXPECT_THAT(
+      grpc_error_string(watcher->identity_cert_error()),
+      ::testing::HasSubstr(
+          "No certificate provider available for identity certificates"));
+  // Change certificate names being watched, without any certificate updates.
+  provider.UpdateRootCertNameAndDistributor("root", distributor);
+  provider.UpdateIdentityCertNameAndDistributor("identity", distributor);
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
+              ::testing::HasSubstr(
+                  "No certificate provider available for root certificates"));
+  EXPECT_THAT(
+      grpc_error_string(watcher->identity_cert_error()),
+      ::testing::HasSubstr(
+          "No certificate provider available for identity certificates"));
+  // Send out certificate updates.
+  distributor->SetKeyMaterials("root", kRootCert2, absl::nullopt);
+  distributor->SetKeyMaterials("identity", absl::nullopt,
+                               MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Swap in new certificate distributors with different certificate names and
+  // existing updates.
+  auto root_cert_distributor =
+      MakeRefCounted<grpc_tls_certificate_distributor>();
+  auto identity_cert_distributor =
+      MakeRefCounted<grpc_tls_certificate_distributor>();
+  provider.UpdateRootCertNameAndDistributor("root", root_cert_distributor);
+  provider.UpdateIdentityCertNameAndDistributor("identity",
+                                                identity_cert_distributor);
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Change certificate names without any certificate updates.
+  provider.UpdateRootCertNameAndDistributor("test", root_cert_distributor);
+  provider.UpdateIdentityCertNameAndDistributor("test",
+                                                identity_cert_distributor);
+  EXPECT_EQ(watcher->root_certs(), kRootCert2);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+  // Send out certificate updates.
+  root_cert_distributor->SetKeyMaterials("test", kRootCert1,
+                                         MakeKeyCertPairsType1());
+  identity_cert_distributor->SetKeyMaterials("test", kRootCert2,
+                                             MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_certs(), kRootCert1);
+  EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
+  EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
+  EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
+}
+
+TEST(XdsCertificateProviderTest, CertificateNameNotEmpty) {
+  XdsCertificateProvider provider("", nullptr, "", nullptr);
+  auto* watcher = new TestCertificatesWatcher;
+  provider.distributor()->WatchTlsCertificates(
+      std::unique_ptr<TestCertificatesWatcher>(watcher), "test", "test");
+  EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
+              ::testing::HasSubstr("Illegal certificate name: \'test\'"));
+  EXPECT_THAT(grpc_error_string(watcher->identity_cert_error()),
+              ::testing::HasSubstr("Illegal certificate name: \'test\'"));
+}
+
+}  // namespace
+}  // namespace testing
+}  // namespace grpc_core
+
+int main(int argc, char** argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+  grpc::testing::TestEnvironment env(argc, argv);
+  grpc_init();
+  auto result = RUN_ALL_TESTS();
+  grpc_shutdown();
+  return result;
+}
index 9d6d25b..0d9eaf0 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <gmock/gmock.h>
 #include <grpc/grpc.h>
+#include <grpc/grpc_security.h>
 #include <grpcpp/security/credentials.h>
 #include <grpcpp/security/server_credentials.h>
 #include <grpcpp/security/tls_credentials_options.h>
 
 #include "src/core/lib/gpr/env.h"
 #include "src/core/lib/gpr/tmpfile.h"
-#include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h"
 #include "src/cpp/client/secure_credentials.h"
 #include "src/cpp/common/tls_credentials_options_util.h"
 
 namespace {
 
-typedef class ::grpc::experimental::TlsKeyMaterialsConfig TlsKeyMaterialsConfig;
-typedef class ::grpc::experimental::TlsCredentialReloadArg
-    TlsCredentialReloadArg;
-typedef struct ::grpc::experimental::TlsCredentialReloadInterface
-    TlsCredentialReloadInterface;
-typedef class ::grpc::experimental::TlsServerAuthorizationCheckArg
-    TlsServerAuthorizationCheckArg;
-typedef struct ::grpc::experimental::TlsServerAuthorizationCheckInterface
-    TlsServerAuthorizationCheckInterface;
-
-static void tls_credential_reload_callback(
-    grpc_tls_credential_reload_arg* arg) {
-  GPR_ASSERT(arg != nullptr);
-  arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-}
+constexpr const char* kRootCertName = "root_cert_name";
+constexpr const char* kRootCertContents = "root_cert_contents";
+constexpr const char* kIdentityCertName = "identity_cert_name";
+constexpr const char* kIdentityCertPrivateKey = "identity_private_key";
+constexpr const char* kIdentityCertContents = "identity_cert_contents";
 
-class TestTlsCredentialReload : public TlsCredentialReloadInterface {
-  int Schedule(TlsCredentialReloadArg* arg) override {
-    GPR_ASSERT(arg != nullptr);
-    TlsKeyMaterialsConfig::PemKeyCertPair pair = {"private_key3",
-                                                  "cert_chain3"};
-    arg->set_pem_root_certs("new_pem_root_certs");
-    arg->add_pem_key_cert_pair(pair);
-    arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
-    return 0;
-  }
-
-  void Cancel(TlsCredentialReloadArg* arg) override {
-    GPR_ASSERT(arg != nullptr);
-    arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL);
-    arg->set_error_details("cancelled");
-  }
-};
+using ::grpc::experimental::StaticDataCertificateProvider;
+using ::grpc::experimental::TlsServerAuthorizationCheckArg;
+using ::grpc::experimental::TlsServerAuthorizationCheckConfig;
+using ::grpc::experimental::TlsServerAuthorizationCheckInterface;
 
 static void tls_server_authorization_check_callback(
     grpc_tls_server_authorization_check_arg* arg) {
@@ -104,21 +81,18 @@ class TestTlsServerAuthorizationCheck
 
 namespace grpc {
 namespace testing {
+namespace {
 
-class CredentialsTest : public ::testing::Test {
- protected:
-};
-
-TEST_F(CredentialsTest, InvalidGoogleRefreshToken) {
+TEST(CredentialsTest, InvalidGoogleRefreshToken) {
   std::shared_ptr<CallCredentials> bad1 = GoogleRefreshTokenCredentials("");
   EXPECT_EQ(static_cast<CallCredentials*>(nullptr), bad1.get());
 }
 
-TEST_F(CredentialsTest, DefaultCredentials) {
+TEST(CredentialsTest, DefaultCredentials) {
   auto creds = GoogleDefaultCredentials();
 }
 
-TEST_F(CredentialsTest, StsCredentialsOptionsCppToCore) {
+TEST(CredentialsTest, StsCredentialsOptionsCppToCore) {
   grpc::experimental::StsCredentialsOptions options;
   options.token_exchange_service_uri = "https://foo.com/exchange";
   options.resource = "resource";
@@ -143,7 +117,7 @@ TEST_F(CredentialsTest, StsCredentialsOptionsCppToCore) {
   EXPECT_EQ(options.actor_token_type, core_opts.actor_token_type);
 }
 
-TEST_F(CredentialsTest, StsCredentialsOptionsJson) {
+TEST(CredentialsTest, StsCredentialsOptionsJson) {
   const char valid_json[] = R"(
   {
     "token_exchange_service_uri": "https://foo/exchange",
@@ -231,7 +205,7 @@ TEST_F(CredentialsTest, StsCredentialsOptionsJson) {
               ::testing::HasSubstr("token_exchange_service_uri"));
 }
 
-TEST_F(CredentialsTest, StsCredentialsOptionsFromEnv) {
+TEST(CredentialsTest, StsCredentialsOptionsFromEnv) {
   // Unset env and check expected failure.
   gpr_unsetenv("STS_CREDENTIALS");
   grpc::experimental::StsCredentialsOptions options;
@@ -270,173 +244,7 @@ TEST_F(CredentialsTest, StsCredentialsOptionsFromEnv) {
   gpr_unsetenv("STS_CREDENTIALS");
 }
 
-typedef class ::grpc::experimental::TlsKeyMaterialsConfig TlsKeyMaterialsConfig;
-
-TEST_F(CredentialsTest, TlsKeyMaterialsConfigCppToC) {
-  std::shared_ptr<TlsKeyMaterialsConfig> config(new TlsKeyMaterialsConfig());
-  struct TlsKeyMaterialsConfig::PemKeyCertPair pair = {"private_key",
-                                                       "cert_chain"};
-  std::vector<TlsKeyMaterialsConfig::PemKeyCertPair> pair_list = {pair};
-  config->set_key_materials("pem_root_certs", pair_list);
-  grpc_tls_key_materials_config* c_config =
-      ConvertToCKeyMaterialsConfig(config);
-  EXPECT_STREQ("pem_root_certs", c_config->pem_root_certs());
-  EXPECT_EQ(1, static_cast<int>(c_config->pem_key_cert_pair_list().size()));
-  EXPECT_STREQ(pair.private_key.c_str(),
-               c_config->pem_key_cert_pair_list()[0].private_key());
-  EXPECT_STREQ(pair.cert_chain.c_str(),
-               c_config->pem_key_cert_pair_list()[0].cert_chain());
-  delete c_config;
-}
-
-TEST_F(CredentialsTest, TlsKeyMaterialsModifiers) {
-  std::shared_ptr<TlsKeyMaterialsConfig> config(new TlsKeyMaterialsConfig());
-  TlsKeyMaterialsConfig::PemKeyCertPair pair = {"private_key", "cert_chain"};
-  config->add_pem_key_cert_pair(pair);
-  config->set_pem_root_certs("pem_root_certs");
-  EXPECT_STREQ(config->pem_root_certs().c_str(), "pem_root_certs");
-  std::vector<TlsKeyMaterialsConfig::PemKeyCertPair> list =
-      config->pem_key_cert_pair_list();
-  EXPECT_EQ(static_cast<int>(list.size()), 1);
-  EXPECT_STREQ(list[0].private_key.c_str(), "private_key");
-  EXPECT_STREQ(list[0].cert_chain.c_str(), "cert_chain");
-}
-
-typedef class ::grpc::experimental::TlsCredentialReloadArg
-    TlsCredentialReloadArg;
-typedef class ::grpc::experimental::TlsCredentialReloadConfig
-    TlsCredentialReloadConfig;
-
-TEST_F(CredentialsTest, TlsCredentialReloadArgCallback) {
-  grpc_tls_credential_reload_arg* c_arg = new grpc_tls_credential_reload_arg;
-  c_arg->key_materials_config = grpc_tls_key_materials_config_create();
-  c_arg->cb = tls_credential_reload_callback;
-  c_arg->context = nullptr;
-  TlsCredentialReloadArg* arg = new TlsCredentialReloadArg(c_arg);
-  arg->set_pem_root_certs("pem_root_certs");
-  TlsKeyMaterialsConfig::PemKeyCertPair pair = {"private_key", "cert_chain"};
-  arg->add_pem_key_cert_pair(pair);
-  arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
-  arg->OnCredentialReloadDoneCallback();
-  EXPECT_EQ(arg->status(), GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED);
-  EXPECT_STREQ(c_arg->key_materials_config->pem_root_certs(), "pem_root_certs");
-  EXPECT_EQ(c_arg->key_materials_config->pem_key_cert_pair_list().size(), 1);
-  EXPECT_STREQ(
-      c_arg->key_materials_config->pem_key_cert_pair_list()[0].private_key(),
-      "private_key");
-  EXPECT_STREQ(
-      c_arg->key_materials_config->pem_key_cert_pair_list()[0].cert_chain(),
-      "cert_chain");
-
-  // Cleanup.
-  delete arg;
-  delete c_arg->key_materials_config;
-  delete c_arg;
-}
-
-TEST_F(CredentialsTest, TlsCredentialReloadConfigSchedule) {
-  std::shared_ptr<TestTlsCredentialReload> test_credential_reload(
-      new TestTlsCredentialReload());
-  std::shared_ptr<TlsCredentialReloadConfig> config(
-      new TlsCredentialReloadConfig(test_credential_reload));
-  grpc_tls_credential_reload_arg* c_arg = new grpc_tls_credential_reload_arg();
-  c_arg->error_details = new grpc_tls_error_details();
-  c_arg->context = nullptr;
-  TlsCredentialReloadArg* arg = new TlsCredentialReloadArg(c_arg);
-  struct TlsKeyMaterialsConfig::PemKeyCertPair pair1 = {"private_key1",
-                                                        "cert_chain1"};
-  struct TlsKeyMaterialsConfig::PemKeyCertPair pair2 = {"private_key2",
-                                                        "cert_chain2"};
-  std::vector<TlsKeyMaterialsConfig::PemKeyCertPair> pair_list = {pair1, pair2};
-  arg->set_key_materials("pem_root_certs", pair_list);
-  arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
-  arg->set_error_details("error_details");
-
-  int schedule_output = config->Schedule(arg);
-  EXPECT_EQ(schedule_output, 0);
-  EXPECT_STREQ(c_arg->key_materials_config->pem_root_certs(),
-               "new_pem_root_certs");
-  grpc_tls_key_materials_config::PemKeyCertPairList c_pair_list =
-      c_arg->key_materials_config->pem_key_cert_pair_list();
-  EXPECT_TRUE(!arg->is_pem_key_cert_pair_list_empty());
-  EXPECT_EQ(static_cast<int>(c_pair_list.size()), 3);
-  EXPECT_STREQ(c_pair_list[0].private_key(), "private_key1");
-  EXPECT_STREQ(c_pair_list[0].cert_chain(), "cert_chain1");
-  EXPECT_STREQ(c_pair_list[1].private_key(), "private_key2");
-  EXPECT_STREQ(c_pair_list[1].cert_chain(), "cert_chain2");
-  EXPECT_STREQ(c_pair_list[2].private_key(), "private_key3");
-  EXPECT_STREQ(c_pair_list[2].cert_chain(), "cert_chain3");
-  EXPECT_EQ(arg->status(), GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
-  EXPECT_STREQ(arg->error_details().c_str(), "error_details");
-
-  // Cleanup.
-  delete c_arg->key_materials_config;
-  if (c_arg->destroy_context != nullptr) {
-    c_arg->destroy_context(c_arg->context);
-  }
-  delete c_arg->error_details;
-  delete c_arg;
-  delete config->c_config();
-}
-
-TEST_F(CredentialsTest, TlsCredentialReloadConfigCppToC) {
-  std::shared_ptr<TestTlsCredentialReload> test_credential_reload(
-      new TestTlsCredentialReload());
-  TlsCredentialReloadConfig config(test_credential_reload);
-  grpc_tls_credential_reload_arg c_arg;
-  c_arg.error_details = new grpc_tls_error_details();
-  c_arg.context = nullptr;
-  c_arg.cb_user_data = static_cast<void*>(nullptr);
-  grpc_tls_key_materials_config c_key_materials;
-  std::string test_private_key = "private_key";
-  std::string test_cert_chain = "cert_chain";
-  grpc_ssl_pem_key_cert_pair* ssl_pair =
-      (grpc_ssl_pem_key_cert_pair*)gpr_malloc(
-          sizeof(grpc_ssl_pem_key_cert_pair));
-  ssl_pair->private_key = gpr_strdup(test_private_key.c_str());
-  ssl_pair->cert_chain = gpr_strdup(test_cert_chain.c_str());
-  ::grpc_core::PemKeyCertPair pem_key_cert_pair =
-      ::grpc_core::PemKeyCertPair(ssl_pair);
-  ::absl::InlinedVector<::grpc_core::PemKeyCertPair, 1> pem_key_cert_pair_list;
-  pem_key_cert_pair_list.push_back(pem_key_cert_pair);
-  std::string test_pem_root_certs = "pem_root_certs";
-  c_key_materials.set_key_materials(test_pem_root_certs.c_str(),
-                                    pem_key_cert_pair_list);
-  c_arg.key_materials_config = &c_key_materials;
-  c_arg.status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-  std::string test_error_details = "error_details";
-  c_arg.error_details->set_error_details(test_error_details.c_str());
-
-  grpc_tls_credential_reload_config* c_config = config.c_config();
-  c_arg.config = c_config;
-  int c_schedule_output = c_config->Schedule(&c_arg);
-  EXPECT_EQ(c_schedule_output, 0);
-  EXPECT_EQ(c_arg.cb_user_data, nullptr);
-  EXPECT_STREQ(c_arg.key_materials_config->pem_root_certs(),
-               "new_pem_root_certs");
-  ::absl::InlinedVector<::grpc_core::PemKeyCertPair, 1> pair_list =
-      c_arg.key_materials_config->pem_key_cert_pair_list();
-  EXPECT_EQ(static_cast<int>(pair_list.size()), 2);
-  EXPECT_STREQ(pair_list[0].private_key(), "private_key");
-  EXPECT_STREQ(pair_list[0].cert_chain(), "cert_chain");
-  EXPECT_STREQ(pair_list[1].private_key(), "private_key3");
-  EXPECT_STREQ(pair_list[1].cert_chain(), "cert_chain3");
-  EXPECT_EQ(c_arg.status, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
-  EXPECT_STREQ(c_arg.error_details->error_details().c_str(),
-               test_error_details.c_str());
-
-  // Cleanup.
-  c_arg.destroy_context(c_arg.context);
-  delete c_arg.error_details;
-  delete config.c_config();
-}
-
-typedef class ::grpc::experimental::TlsServerAuthorizationCheckArg
-    TlsServerAuthorizationCheckArg;
-typedef class ::grpc::experimental::TlsServerAuthorizationCheckConfig
-    TlsServerAuthorizationCheckConfig;
-
-TEST_F(CredentialsTest, TlsServerAuthorizationCheckArgCallback) {
+TEST(CredentialsTest, TlsServerAuthorizationCheckArgCallback) {
   grpc_tls_server_authorization_check_arg* c_arg =
       new grpc_tls_server_authorization_check_arg;
   c_arg->cb = tls_server_authorization_check_callback;
@@ -472,7 +280,7 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckArgCallback) {
   delete c_arg;
 }
 
-TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigSchedule) {
+TEST(CredentialsTest, TlsServerAuthorizationCheckConfigSchedule) {
   std::shared_ptr<TestTlsServerAuthorizationCheck>
       test_server_authorization_check(new TestTlsServerAuthorizationCheck());
   TlsServerAuthorizationCheckConfig config(test_server_authorization_check);
@@ -511,10 +319,9 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigSchedule) {
     c_arg->destroy_context(c_arg->context);
   }
   delete c_arg;
-  delete config.c_config();
 }
 
-TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigCppToC) {
+TEST(CredentialsTest, TlsServerAuthorizationCheckConfigCppToC) {
   std::shared_ptr<TestTlsServerAuthorizationCheck>
       test_server_authorization_check(new TestTlsServerAuthorizationCheck());
   TlsServerAuthorizationCheckConfig config(test_server_authorization_check);
@@ -545,174 +352,62 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigCppToC) {
   delete c_arg.error_details;
   gpr_free(const_cast<char*>(c_arg.target_name));
   gpr_free(const_cast<char*>(c_arg.peer_cert));
-  delete config.c_config();
-}
-
-typedef class ::grpc::experimental::TlsCredentialsOptions TlsCredentialsOptions;
-
-TEST_F(CredentialsTest, TlsCredentialsOptionsCppToC) {
-  std::shared_ptr<TlsKeyMaterialsConfig> key_materials_config(
-      new TlsKeyMaterialsConfig());
-  struct TlsKeyMaterialsConfig::PemKeyCertPair pair = {"private_key",
-                                                       "cert_chain"};
-  std::vector<TlsKeyMaterialsConfig::PemKeyCertPair> pair_list = {pair};
-  key_materials_config->set_key_materials("pem_root_certs", pair_list);
-
-  std::shared_ptr<TestTlsCredentialReload> test_credential_reload(
-      new TestTlsCredentialReload());
-  std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config(
-      new TlsCredentialReloadConfig(test_credential_reload));
-
-  std::shared_ptr<TestTlsServerAuthorizationCheck>
-      test_server_authorization_check(new TestTlsServerAuthorizationCheck());
-  std::shared_ptr<TlsServerAuthorizationCheckConfig>
-      server_authorization_check_config(new TlsServerAuthorizationCheckConfig(
-          test_server_authorization_check));
-
-  TlsCredentialsOptions options = TlsCredentialsOptions(
-      GRPC_TLS_SERVER_VERIFICATION, key_materials_config,
-      credential_reload_config, server_authorization_check_config);
-  grpc_tls_credentials_options* c_options = options.c_credentials_options();
-  EXPECT_EQ(c_options->cert_request_type(),
-            GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE);
-  EXPECT_EQ(c_options->server_verification_option(),
-            GRPC_TLS_SERVER_VERIFICATION);
-  grpc_tls_key_materials_config* c_key_materials_config =
-      c_options->key_materials_config();
-  grpc_tls_credential_reload_config* c_credential_reload_config =
-      c_options->credential_reload_config();
-  grpc_tls_credential_reload_arg c_credential_reload_arg;
-  c_credential_reload_arg.cb_user_data = nullptr;
-  c_credential_reload_arg.key_materials_config =
-      c_options->key_materials_config();
-  c_credential_reload_arg.status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
-  std::string test_error_details = "error_details";
-  c_credential_reload_arg.error_details = new grpc_tls_error_details();
-  c_credential_reload_arg.error_details->set_error_details(
-      test_error_details.c_str());
-  c_credential_reload_arg.context = nullptr;
-  grpc_tls_server_authorization_check_config*
-      c_server_authorization_check_config =
-          c_options->server_authorization_check_config();
-  grpc_tls_server_authorization_check_arg c_server_authorization_check_arg;
-  c_server_authorization_check_arg.cb = tls_server_authorization_check_callback;
-  c_server_authorization_check_arg.cb_user_data = nullptr;
-  c_server_authorization_check_arg.success = 0;
-  c_server_authorization_check_arg.target_name = "target_name";
-  c_server_authorization_check_arg.peer_cert = "peer_cert";
-  c_server_authorization_check_arg.status = GRPC_STATUS_UNAUTHENTICATED;
-  c_server_authorization_check_arg.error_details = new grpc_tls_error_details();
-  c_server_authorization_check_arg.error_details->set_error_details(
-      "error_details");
-  c_server_authorization_check_arg.context = nullptr;
-  EXPECT_STREQ(c_key_materials_config->pem_root_certs(), "pem_root_certs");
-  EXPECT_EQ(
-      static_cast<int>(c_key_materials_config->pem_key_cert_pair_list().size()),
-      1);
-  EXPECT_STREQ(
-      c_key_materials_config->pem_key_cert_pair_list()[0].private_key(),
-      "private_key");
-  EXPECT_STREQ(c_key_materials_config->pem_key_cert_pair_list()[0].cert_chain(),
-               "cert_chain");
-
-  GPR_ASSERT(c_credential_reload_config != nullptr);
-  int c_credential_reload_schedule_output =
-      c_credential_reload_config->Schedule(&c_credential_reload_arg);
-  EXPECT_EQ(c_credential_reload_schedule_output, 0);
-  EXPECT_EQ(c_credential_reload_arg.cb_user_data, nullptr);
-  EXPECT_STREQ(c_credential_reload_arg.key_materials_config->pem_root_certs(),
-               "new_pem_root_certs");
-  ::absl::InlinedVector<::grpc_core::PemKeyCertPair, 1> c_pair_list =
-      c_credential_reload_arg.key_materials_config->pem_key_cert_pair_list();
-  EXPECT_EQ(static_cast<int>(c_pair_list.size()), 2);
-  EXPECT_STREQ(c_pair_list[0].private_key(), "private_key");
-  EXPECT_STREQ(c_pair_list[0].cert_chain(), "cert_chain");
-  EXPECT_STREQ(c_pair_list[1].private_key(), "private_key3");
-  EXPECT_STREQ(c_pair_list[1].cert_chain(), "cert_chain3");
-  EXPECT_EQ(c_credential_reload_arg.status,
-            GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
-  EXPECT_STREQ(c_credential_reload_arg.error_details->error_details().c_str(),
-               test_error_details.c_str());
-
-  int c_server_authorization_check_schedule_output =
-      c_server_authorization_check_config->Schedule(
-          &c_server_authorization_check_arg);
-  EXPECT_EQ(c_server_authorization_check_schedule_output, 1);
-  EXPECT_STREQ(
-      static_cast<char*>(c_server_authorization_check_arg.cb_user_data),
-      "cb_user_data");
-  EXPECT_EQ(c_server_authorization_check_arg.success, 1);
-  EXPECT_STREQ(c_server_authorization_check_arg.target_name,
-               "sync_target_name");
-  EXPECT_STREQ(c_server_authorization_check_arg.peer_cert, "sync_peer_cert");
-  EXPECT_EQ(c_server_authorization_check_arg.status, GRPC_STATUS_OK);
-  EXPECT_STREQ(
-      c_server_authorization_check_arg.error_details->error_details().c_str(),
-      "sync_error_details");
-
-  // Cleanup.
-  c_credential_reload_arg.destroy_context(c_credential_reload_arg.context);
-  delete c_credential_reload_arg.error_details;
-  c_server_authorization_check_arg.destroy_context(
-      c_server_authorization_check_arg.context);
-  gpr_free(c_server_authorization_check_arg.cb_user_data);
-  gpr_free(const_cast<char*>(c_server_authorization_check_arg.target_name));
-  gpr_free(const_cast<char*>(c_server_authorization_check_arg.peer_cert));
-  delete c_server_authorization_check_arg.error_details;
-  delete c_options;
 }
 
-// This test demonstrates how the TLS credentials will be used.
-TEST_F(CredentialsTest, LoadTlsChannelCredentials) {
-  std::shared_ptr<TestTlsCredentialReload> test_credential_reload(
-      new TestTlsCredentialReload());
-  std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config(
-      new TlsCredentialReloadConfig(test_credential_reload));
-
-  std::shared_ptr<TestTlsServerAuthorizationCheck>
-      test_server_authorization_check(new TestTlsServerAuthorizationCheck());
-  std::shared_ptr<TlsServerAuthorizationCheckConfig>
-      server_authorization_check_config(new TlsServerAuthorizationCheckConfig(
-          test_server_authorization_check));
-
-  TlsCredentialsOptions options = TlsCredentialsOptions(
-      GRPC_TLS_SERVER_VERIFICATION, nullptr, credential_reload_config,
+TEST(
+    CredentialsTest,
+    TlsChannelCredentialsWithStaticDataCertificateProviderLoadingRootAndIdentity) {
+  experimental::IdentityKeyCertPair key_cert_pair;
+  key_cert_pair.private_key = kIdentityCertPrivateKey;
+  key_cert_pair.certificate_chain = kIdentityCertContents;
+  std::vector<experimental::IdentityKeyCertPair> identity_key_cert_pairs;
+  identity_key_cert_pairs.emplace_back(key_cert_pair);
+  auto certificate_provider = std::make_shared<StaticDataCertificateProvider>(
+      kRootCertContents, identity_key_cert_pairs);
+  auto test_server_authorization_check =
+      std::make_shared<TestTlsServerAuthorizationCheck>();
+  auto server_authorization_check_config =
+      std::make_shared<TlsServerAuthorizationCheckConfig>(
+          test_server_authorization_check);
+  grpc::experimental::TlsChannelCredentialsOptions options(
+      certificate_provider);
+  options.watch_root_certs();
+  options.set_root_cert_name(kRootCertName);
+  options.watch_identity_key_cert_pairs();
+  options.set_identity_cert_name(kIdentityCertName);
+  options.set_server_verification_option(GRPC_TLS_SERVER_VERIFICATION);
+  options.set_server_authorization_check_config(
       server_authorization_check_config);
-  std::shared_ptr<grpc::ChannelCredentials> channel_credentials =
-      grpc::experimental::TlsCredentials(options);
+  auto channel_credentials = grpc::experimental::TlsCredentials(options);
   GPR_ASSERT(channel_credentials.get() != nullptr);
 }
 
-TEST_F(CredentialsTest, TlsCredentialReloadConfigErrorMessages) {
-  std::shared_ptr<TlsCredentialReloadConfig> config(
-      new TlsCredentialReloadConfig(nullptr));
-  grpc_tls_credential_reload_arg* c_arg = new grpc_tls_credential_reload_arg;
-  c_arg->error_details = new grpc_tls_error_details();
-  c_arg->context = nullptr;
-  TlsCredentialReloadArg* arg = new TlsCredentialReloadArg(c_arg);
-  int schedule_output = config->Schedule(arg);
-
-  EXPECT_EQ(schedule_output, 1);
-  EXPECT_EQ(arg->status(), GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL);
-  EXPECT_STREQ(arg->error_details().c_str(),
-               "the interface of the credential reload config is nullptr");
-
-  arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED);
-  config->Cancel(arg);
-  EXPECT_EQ(arg->status(), GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL);
-  EXPECT_STREQ(arg->error_details().c_str(),
-               "the interface of the credential reload config is nullptr");
-
-  // Cleanup.
-  if (c_arg->destroy_context != nullptr) {
-    c_arg->destroy_context(c_arg->context);
-  }
-  delete c_arg->error_details;
-  delete c_arg;
-  delete config->c_config();
+// ChannelCredentials should always have root credential presented.
+// Otherwise the system root certificates will be loaded, which will cause
+// failure in some tests under MacOS/Windows.
+TEST(CredentialsTest,
+     TlsChannelCredentialsWithStaticDataCertificateProviderLoadingRootOnly) {
+  auto certificate_provider =
+      std::make_shared<StaticDataCertificateProvider>(kRootCertContents);
+  auto test_server_authorization_check =
+      std::make_shared<TestTlsServerAuthorizationCheck>();
+  auto server_authorization_check_config =
+      std::make_shared<TlsServerAuthorizationCheckConfig>(
+          test_server_authorization_check);
+  GPR_ASSERT(certificate_provider != nullptr);
+  GPR_ASSERT(certificate_provider->c_provider() != nullptr);
+  grpc::experimental::TlsChannelCredentialsOptions options(
+      certificate_provider);
+  options.watch_root_certs();
+  options.set_root_cert_name(kRootCertName);
+  options.set_server_verification_option(GRPC_TLS_SERVER_VERIFICATION);
+  options.set_server_authorization_check_config(
+      server_authorization_check_config);
+  auto channel_credentials = grpc::experimental::TlsCredentials(options);
+  GPR_ASSERT(channel_credentials.get() != nullptr);
 }
 
-TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigErrorMessages) {
+TEST(CredentialsTest, TlsServerAuthorizationCheckConfigErrorMessages) {
   std::shared_ptr<TlsServerAuthorizationCheckConfig> config(
       new TlsServerAuthorizationCheckConfig(nullptr));
   grpc_tls_server_authorization_check_arg* c_arg =
@@ -742,9 +437,9 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigErrorMessages) {
     c_arg->destroy_context(c_arg->context);
   }
   delete c_arg;
-  delete config->c_config();
 }
 
+}  // namespace
 }  // namespace testing
 }  // namespace grpc
 
index 01cf90c..6693fb7 100644 (file)
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
                                HEADER_SEARCH_PATHS = ../../../include;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.1;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
                                HEADER_SEARCH_PATHS = ../../../include;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.1;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = iphoneos;
                                USER_HEADER_SEARCH_PATHS = ../../..;
                                CODE_SIGN_STYLE = Automatic;
                                DEVELOPMENT_TEAM = EQHXZ8M8AV;
                                INFOPLIST_FILE = generic/Info.plist;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
                                PRODUCT_BUNDLE_IDENTIFIER = io.grpc.generic;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                CODE_SIGN_STYLE = Automatic;
                                DEVELOPMENT_TEAM = EQHXZ8M8AV;
                                INFOPLIST_FILE = generic/Info.plist;
-                               IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
                                PRODUCT_BUNDLE_IDENTIFIER = io.grpc.generic;
                                PRODUCT_NAME = "$(TARGET_NAME)";
index 7300a6e..6daf089 100644 (file)
@@ -1,5 +1,5 @@
 source 'https://github.com/CocoaPods/Specs.git'
-platform :ios, '8.0'
+platform :ios, '9.0'
 
 install! 'cocoapods', :deterministic_uuids => false
 
index 5ee231e..b7bad5f 100644 (file)
@@ -63,8 +63,8 @@ grpc_cc_binary(
     testonly = True,
     srcs = ["golden_file_test.cc"],
     external_deps = [
+        "absl/flags:flag",
         "gtest",
-        "gflags",
     ],
     deps = [
         "//:grpc++",
index f6492bb..bc87cc2 100644 (file)
  *
  */
 
+#include <gtest/gtest.h>
+
 #include <fstream>
 #include <sstream>
 
-#include <gflags/gflags.h>
-#include <gtest/gtest.h>
-
+#include "absl/flags/flag.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/util/test_config.h"
 
-// In some distros, gflags is in the namespace google, and in some others,
-// in gflags. This hack is enabling us to find both.
-namespace google {}
-namespace gflags {}
-using namespace google;
-using namespace gflags;
-
-DEFINE_string(
-    generated_file_path, "",
+ABSL_FLAG(
+    std::string, generated_file_path, "",
     "path to the directory containing generated files compiler_test.grpc.pb.h "
     "and compiler_test_mock.grpc.pb.h");
 
@@ -59,23 +52,26 @@ void run_test(const std::basic_string<char>& generated_file,
 }
 
 TEST(GoldenFileTest, TestGeneratedFile) {
-  run_test(FLAGS_generated_file_path + "compiler_test.grpc.pb.h",
+  run_test(absl::GetFlag(FLAGS_generated_file_path) + "compiler_test.grpc.pb.h",
            kGoldenFilePath);
 }
 
 TEST(GoldenMockFileTest, TestGeneratedMockFile) {
-  run_test(FLAGS_generated_file_path + "compiler_test_mock.grpc.pb.h",
-           kMockGoldenFilePath);
+  run_test(
+      absl::GetFlag(FLAGS_generated_file_path) + "compiler_test_mock.grpc.pb.h",
+      kMockGoldenFilePath);
 }
 
 int main(int argc, char** argv) {
   grpc::testing::TestEnvironment env(argc, argv);
   ::testing::InitGoogleTest(&argc, argv);
   grpc::testing::InitTest(&argc, &argv, true);
-  if (FLAGS_generated_file_path.empty()) {
-    FLAGS_generated_file_path = "gens/src/proto/grpc/testing/";
+  if (absl::GetFlag(FLAGS_generated_file_path).empty()) {
+    absl::SetFlag(&FLAGS_generated_file_path, "gens/src/proto/grpc/testing/");
+  }
+  if (absl::GetFlag(FLAGS_generated_file_path).back() != '/') {
+    absl::SetFlag(&FLAGS_generated_file_path,
+                  absl::GetFlag(FLAGS_generated_file_path).append("/"));
   }
-  if (FLAGS_generated_file_path.back() != '/')
-    FLAGS_generated_file_path.append("/");
   return RUN_ALL_TESTS();
 }
index 80462e7..cbf88df 100644 (file)
@@ -70,7 +70,7 @@ class TimeJumpTest : public ::testing::TestWithParam<std::string> {
     // Skip test if slowdown factor > 1
     if (grpc_test_slowdown_factor() == 1) {
       run_cmd("sudo sntp -sS pool.ntp.org");
-      grpc_shutdown_blocking();
+      grpc_shutdown();
     }
   }
 
index c78f75d..63c0757 100644 (file)
@@ -56,7 +56,7 @@ class TimerTest : public ::testing::Test {
     }
   }
 
-  void TearDown() override { grpc_shutdown_blocking(); }
+  void TearDown() override { grpc_shutdown(); }
 
   bool do_not_test_{false};
 };
index 1ad1ddd..d140a35 100644 (file)
@@ -139,7 +139,7 @@ grpc_cc_binary(
     testonly = True,
     srcs = ["client_crash_test_server.cc"],
     external_deps = [
-        "gflags",
+        "absl/flags:flag",
         "gtest",
     ],
     deps = [
@@ -544,7 +544,6 @@ grpc_cc_test(
     srcs = ["proto_server_reflection_test.cc"],
     external_deps = [
         "gtest",
-        "gflags",
     ],
     deps = [
         ":test_service_impl",
@@ -611,7 +610,7 @@ grpc_cc_binary(
     testonly = True,
     srcs = ["server_crash_test_client.cc"],
     external_deps = [
-        "gflags",
+        "absl/flags:flag",
         "gtest",
     ],
     deps = [
@@ -811,3 +810,21 @@ grpc_cc_test(
         "//test/cpp/util:test_util",
     ],
 )
+
+grpc_cc_test(
+    name = "xds_credentials_end2end_test",
+    srcs = ["xds_credentials_end2end_test.cc"],
+    external_deps = [
+        "gtest",
+    ],
+    deps = [
+        ":test_service_impl",
+        "//:gpr",
+        "//:grpc",
+        "//:grpc++",
+        "//src/proto/grpc/testing:echo_messages_proto",
+        "//src/proto/grpc/testing:echo_proto",
+        "//test/core/util:grpc_test_util",
+        "//test/cpp/util:test_util",
+    ],
+)
index dd7c3c0..4bb5c1c 100644 (file)
@@ -32,6 +32,8 @@
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/core/ext/filters/client_channel/backup_poller.h"
 #include "src/core/lib/gpr/tls.h"
 #include "src/core/lib/iomgr/port.h"
@@ -51,7 +53,6 @@
 
 using grpc::testing::EchoRequest;
 using grpc::testing::EchoResponse;
-using grpc::testing::kTlsCredentialsType;
 using std::chrono::system_clock;
 
 namespace grpc {
@@ -271,8 +272,8 @@ class AsyncEnd2endTest : public ::testing::TestWithParam<TestScenario> {
     void* ignored_tag;
     bool ignored_ok;
     cq_->Shutdown();
-    while (cq_->Next(&ignored_tag, &ignored_ok))
-      ;
+    while (cq_->Next(&ignored_tag, &ignored_ok)) {
+    }
     stub_.reset();
     grpc_recycle_unused_port(port_);
   }
@@ -282,7 +283,8 @@ class AsyncEnd2endTest : public ::testing::TestWithParam<TestScenario> {
     auto server_creds = GetCredentialsProvider()->GetServerCredentials(
         GetParam().credentials_type);
     builder.AddListeningPort(server_address_.str(), server_creds);
-    service_.reset(new grpc::testing::EchoTestService::AsyncService());
+    service_ =
+        absl::make_unique<grpc::testing::EchoTestService::AsyncService>();
     builder.RegisterService(service_.get());
     if (GetParam().health_check_service) {
       builder.RegisterService(&health_check_);
@@ -426,8 +428,8 @@ TEST_P(AsyncEnd2endTest, ReconnectChannel) {
   void* ignored_tag;
   bool ignored_ok;
   cq_->Shutdown();
-  while (cq_->Next(&ignored_tag, &ignored_ok))
-    ;
+  while (cq_->Next(&ignored_tag, &ignored_ok)) {
+  }
   BuildAndStartServer();
   // It needs more than GRPC_CLIENT_CHANNEL_BACKUP_POLL_INTERVAL_MS time to
   // reconnect the channel.
index 1fe0921..04f21ad 100644 (file)
 #include <grpcpp/channel.h>
 #include <grpcpp/client_context.h>
 #include <grpcpp/create_channel.h>
+#include <grpcpp/ext/channelz_service_plugin.h>
 #include <grpcpp/security/credentials.h>
 #include <grpcpp/security/server_credentials.h>
 #include <grpcpp/server.h>
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
 
-#include <grpcpp/ext/channelz_service_plugin.h>
+#include "absl/memory/memory.h"
+
 #include "src/core/lib/gpr/env.h"
 #include "src/proto/grpc/channelz/channelz.grpc.pb.h"
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
@@ -140,7 +142,7 @@ class ChannelzServerTest : public ::testing::Test {
           "localhost:" + to_string(backends_[i].port);
       backend_builder.AddListeningPort(backend_server_address,
                                        InsecureServerCredentials());
-      backends_[i].service.reset(new TestServiceImpl);
+      backends_[i].service = absl::make_unique<TestServiceImpl>();
       // ensure that the backend itself has channelz disabled.
       backend_builder.AddChannelArgument(GRPC_ARG_ENABLE_CHANNELZ, 0);
       backend_builder.RegisterService(backends_[i].service.get());
index 61a7d88..bc09353 100644 (file)
@@ -34,6 +34,7 @@
 #include <sstream>
 #include <thread>
 
+#include "absl/memory/memory.h"
 #include "src/core/lib/gpr/env.h"
 #include "src/core/lib/iomgr/iomgr.h"
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
@@ -122,8 +123,7 @@ class ClientCallbackEnd2endTest
       // Add 20 dummy server interceptors
       creators.reserve(20);
       for (auto i = 0; i < 20; i++) {
-        creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-            new DummyInterceptorFactory()));
+        creators.push_back(absl::make_unique<DummyInterceptorFactory>());
       }
       builder.experimental().SetInterceptorCreators(std::move(creators));
     }
@@ -163,7 +163,7 @@ class ClientCallbackEnd2endTest
         assert(false);
     }
     stub_ = grpc::testing::EchoTestService::NewStub(channel_);
-    generic_stub_.reset(new GenericStub(channel_));
+    generic_stub_ = absl::make_unique<GenericStub>(channel_);
     DummyInterceptor::Reset();
   }
 
@@ -282,7 +282,7 @@ class ClientCallbackEnd2endTest
             : reuses_remaining_(reuses), do_writes_done_(do_writes_done) {
           activate_ = [this, test, method_name, test_str] {
             if (reuses_remaining_ > 0) {
-              cli_ctx_.reset(new ClientContext);
+              cli_ctx_ = absl::make_unique<ClientContext>();
               reuses_remaining_--;
               test->generic_stub_->experimental().PrepareBidiStreamingCall(
                   cli_ctx_.get(), method_name, this);
index 2d5c1b4..5ac8f2e 100644 (file)
@@ -26,6 +26,8 @@
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/core/util/port.h"
@@ -36,7 +38,6 @@
 
 using grpc::testing::EchoRequest;
 using grpc::testing::EchoResponse;
-using std::chrono::system_clock;
 
 static std::string g_root;
 
@@ -54,7 +55,7 @@ class CrashTest : public ::testing::Test {
     std::ostringstream addr_stream;
     addr_stream << "localhost:" << port;
     auto addr = addr_stream.str();
-    server_.reset(new SubProcess({
+    server_ = absl::make_unique<SubProcess>(std::vector<std::string>({
         g_root + "/client_crash_test_server",
         "--address=" + addr,
     }));
index 2fc44dc..1adf98d 100644 (file)
  *
  */
 
-#include <gflags/gflags.h>
-#include <iostream>
-#include <memory>
-#include <string>
-
 #include <grpc/support/log.h>
 #include <grpcpp/server.h>
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
 
+#include <iostream>
+#include <memory>
+#include <string>
+
+#include "absl/flags/flag.h"
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/cpp/util/test_config.h"
 
-DEFINE_string(address, "", "Address to bind to");
+ABSL_FLAG(std::string, address, "", "Address to bind to");
 
 using grpc::testing::EchoRequest;
 using grpc::testing::EchoResponse;
 
-// In some distros, gflags is in the namespace google, and in some others,
-// in gflags. This hack is enabling us to find both.
-namespace google {}
-namespace gflags {}
-using namespace google;
-using namespace gflags;
-
 namespace grpc {
 namespace testing {
 
@@ -63,10 +56,12 @@ void RunServer() {
   ServiceImpl service;
 
   ServerBuilder builder;
-  builder.AddListeningPort(FLAGS_address, grpc::InsecureServerCredentials());
+  builder.AddListeningPort(absl::GetFlag(FLAGS_address),
+                           grpc::InsecureServerCredentials());
   builder.RegisterService(&service);
   std::unique_ptr<Server> server(builder.BuildAndStart());
-  std::cout << "Server listening on " << FLAGS_address << std::endl;
+  std::cout << "Server listening on " << absl::GetFlag(FLAGS_address)
+            << std::endl;
   server->Wait();
 }
 }  // namespace testing
index 58d9c2a..8bc81bf 100644 (file)
 #include <memory>
 #include <vector>
 
+#include "absl/memory/memory.h"
+
 #include <grpcpp/channel.h>
 #include <grpcpp/client_context.h>
 #include <grpcpp/create_channel.h>
+#include <grpcpp/create_channel_posix.h>
 #include <grpcpp/generic/generic_stub.h>
 #include <grpcpp/impl/codegen/proto_utils.h>
 #include <grpcpp/server.h>
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
+#include <grpcpp/server_posix.h>
 #include <grpcpp/support/client_interceptor.h>
 
+#include "src/core/lib/iomgr/port.h"
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/util/byte_buffer_proto_helper.h"
 #include "test/cpp/util/string_ref_helper.h"
 
+#ifdef GRPC_POSIX_SOCKET
+#include <fcntl.h>
+#include "src/core/lib/iomgr/socket_utils_posix.h"
+#endif /* GRPC_POSIX_SOCKET */
+
 #include <gtest/gtest.h>
 
 namespace grpc {
@@ -54,6 +64,11 @@ enum class RPCType {
   kAsyncCQBidiStreaming,
 };
 
+enum class ChannelType {
+  kHttpChannel,
+  kFdChannel,
+};
+
 /* Hijacks Echo RPC and fills in the expected values */
 class HijackingInterceptor : public experimental::Interceptor {
  public:
@@ -64,7 +79,7 @@ class HijackingInterceptor : public experimental::Interceptor {
     EXPECT_EQ(info->type(), experimental::ClientRpcInfo::Type::UNARY);
   }
 
-  virtual void Intercept(experimental::InterceptorBatchMethods* methods) {
+  void Intercept(experimental::InterceptorBatchMethods* methods) override {
     bool hijack = false;
     if (methods->QueryInterceptionHookPoint(
             experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA)) {
@@ -155,7 +170,7 @@ class HijackingInterceptor : public experimental::Interceptor {
 class HijackingInterceptorFactory
     : public experimental::ClientInterceptorFactoryInterface {
  public:
-  virtual experimental::Interceptor* CreateClientInterceptor(
+  experimental::Interceptor* CreateClientInterceptor(
       experimental::ClientRpcInfo* info) override {
     return new HijackingInterceptor(info);
   }
@@ -169,7 +184,7 @@ class HijackingInterceptorMakesAnotherCall : public experimental::Interceptor {
     EXPECT_EQ(strcmp("/grpc.testing.EchoTestService/Echo", info->method()), 0);
   }
 
-  virtual void Intercept(experimental::InterceptorBatchMethods* methods) {
+  void Intercept(experimental::InterceptorBatchMethods* methods) override {
     if (methods->QueryInterceptionHookPoint(
             experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA)) {
       auto* map = methods->GetSendInitialMetadata();
@@ -277,7 +292,7 @@ class HijackingInterceptorMakesAnotherCall : public experimental::Interceptor {
 class HijackingInterceptorMakesAnotherCallFactory
     : public experimental::ClientInterceptorFactoryInterface {
  public:
-  virtual experimental::Interceptor* CreateClientInterceptor(
+  experimental::Interceptor* CreateClientInterceptor(
       experimental::ClientRpcInfo* info) override {
     return new HijackingInterceptorMakesAnotherCall(info);
   }
@@ -289,7 +304,7 @@ class BidiStreamingRpcHijackingInterceptor : public experimental::Interceptor {
     info_ = info;
   }
 
-  virtual void Intercept(experimental::InterceptorBatchMethods* methods) {
+  void Intercept(experimental::InterceptorBatchMethods* methods) override {
     bool hijack = false;
     if (methods->QueryInterceptionHookPoint(
             experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA)) {
@@ -358,7 +373,7 @@ class ClientStreamingRpcHijackingInterceptor
   ClientStreamingRpcHijackingInterceptor(experimental::ClientRpcInfo* info) {
     info_ = info;
   }
-  virtual void Intercept(experimental::InterceptorBatchMethods* methods) {
+  void Intercept(experimental::InterceptorBatchMethods* methods) override {
     bool hijack = false;
     if (methods->QueryInterceptionHookPoint(
             experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA)) {
@@ -400,7 +415,7 @@ bool ClientStreamingRpcHijackingInterceptor::got_failed_send_ = false;
 class ClientStreamingRpcHijackingInterceptorFactory
     : public experimental::ClientInterceptorFactoryInterface {
  public:
-  virtual experimental::Interceptor* CreateClientInterceptor(
+  experimental::Interceptor* CreateClientInterceptor(
       experimental::ClientRpcInfo* info) override {
     return new ClientStreamingRpcHijackingInterceptor(info);
   }
@@ -414,7 +429,7 @@ class ServerStreamingRpcHijackingInterceptor
     got_failed_message_ = false;
   }
 
-  virtual void Intercept(experimental::InterceptorBatchMethods* methods) {
+  void Intercept(experimental::InterceptorBatchMethods* methods) override {
     bool hijack = false;
     if (methods->QueryInterceptionHookPoint(
             experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA)) {
@@ -498,7 +513,7 @@ bool ServerStreamingRpcHijackingInterceptor::got_failed_message_ = false;
 class ServerStreamingRpcHijackingInterceptorFactory
     : public experimental::ClientInterceptorFactoryInterface {
  public:
-  virtual experimental::Interceptor* CreateClientInterceptor(
+  experimental::Interceptor* CreateClientInterceptor(
       experimental::ClientRpcInfo* info) override {
     return new ServerStreamingRpcHijackingInterceptor(info);
   }
@@ -507,7 +522,7 @@ class ServerStreamingRpcHijackingInterceptorFactory
 class BidiStreamingRpcHijackingInterceptorFactory
     : public experimental::ClientInterceptorFactoryInterface {
  public:
-  virtual experimental::Interceptor* CreateClientInterceptor(
+  experimental::Interceptor* CreateClientInterceptor(
       experimental::ClientRpcInfo* info) override {
     return new BidiStreamingRpcHijackingInterceptor(info);
   }
@@ -528,7 +543,7 @@ class LoggingInterceptor : public experimental::Interceptor {
     post_recv_status_ = false;
   }
 
-  virtual void Intercept(experimental::InterceptorBatchMethods* methods) {
+  void Intercept(experimental::InterceptorBatchMethods* methods) override {
     if (methods->QueryInterceptionHookPoint(
             experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA)) {
       auto* map = methods->GetSendInitialMetadata();
@@ -677,7 +692,7 @@ bool LoggingInterceptor::post_recv_status_;
 class LoggingInterceptorFactory
     : public experimental::ClientInterceptorFactoryInterface {
  public:
-  virtual experimental::Interceptor* CreateClientInterceptor(
+  experimental::Interceptor* CreateClientInterceptor(
       experimental::ClientRpcInfo* info) override {
     return new LoggingInterceptor(info);
   }
@@ -685,22 +700,35 @@ class LoggingInterceptorFactory
 
 class TestScenario {
  public:
-  explicit TestScenario(const RPCType& type) : type_(type) {}
+  explicit TestScenario(const ChannelType& channel_type,
+                        const RPCType& rpc_type)
+      : channel_type_(channel_type), rpc_type_(rpc_type) {}
+
+  ChannelType channel_type() const { return channel_type_; }
 
-  RPCType type() const { return type_; }
+  RPCType rpc_type() const { return rpc_type_; }
 
  private:
-  RPCType type_;
+  const ChannelType channel_type_;
+  const RPCType rpc_type_;
 };
 
 std::vector<TestScenario> CreateTestScenarios() {
   std::vector<TestScenario> scenarios;
-  scenarios.emplace_back(RPCType::kSyncUnary);
-  scenarios.emplace_back(RPCType::kSyncClientStreaming);
-  scenarios.emplace_back(RPCType::kSyncServerStreaming);
-  scenarios.emplace_back(RPCType::kSyncBidiStreaming);
-  scenarios.emplace_back(RPCType::kAsyncCQUnary);
-  scenarios.emplace_back(RPCType::kAsyncCQServerStreaming);
+  std::vector<RPCType> rpc_types;
+  rpc_types.emplace_back(RPCType::kSyncUnary);
+  rpc_types.emplace_back(RPCType::kSyncClientStreaming);
+  rpc_types.emplace_back(RPCType::kSyncServerStreaming);
+  rpc_types.emplace_back(RPCType::kSyncBidiStreaming);
+  rpc_types.emplace_back(RPCType::kAsyncCQUnary);
+  rpc_types.emplace_back(RPCType::kAsyncCQServerStreaming);
+  for (const auto& rpc_type : rpc_types) {
+    scenarios.emplace_back(ChannelType::kHttpChannel, rpc_type);
+// TODO(yashykt): Maybe add support for non-posix sockets too
+#ifdef GRPC_POSIX_SOCKET
+    scenarios.emplace_back(ChannelType::kFdChannel, rpc_type);
+#endif /* GRPC_POSIX_SOCKET */
+  }
   return scenarios;
 }
 
@@ -708,19 +736,56 @@ class ParameterizedClientInterceptorsEnd2endTest
     : public ::testing::TestWithParam<TestScenario> {
  protected:
   ParameterizedClientInterceptorsEnd2endTest() {
-    int port = grpc_pick_unused_port_or_die();
-
     ServerBuilder builder;
-    server_address_ = "localhost:" + std::to_string(port);
-    builder.AddListeningPort(server_address_, InsecureServerCredentials());
     builder.RegisterService(&service_);
-    server_ = builder.BuildAndStart();
+    if (GetParam().channel_type() == ChannelType::kHttpChannel) {
+      int port = grpc_pick_unused_port_or_die();
+      server_address_ = "localhost:" + std::to_string(port);
+      builder.AddListeningPort(server_address_, InsecureServerCredentials());
+      server_ = builder.BuildAndStart();
+    }
+#ifdef GRPC_POSIX_SOCKET
+    else if (GetParam().channel_type() == ChannelType::kFdChannel) {
+      int flags;
+      GPR_ASSERT(socketpair(AF_UNIX, SOCK_STREAM, 0, sv_) == 0);
+      flags = fcntl(sv_[0], F_GETFL, 0);
+      GPR_ASSERT(fcntl(sv_[0], F_SETFL, flags | O_NONBLOCK) == 0);
+      flags = fcntl(sv_[1], F_GETFL, 0);
+      GPR_ASSERT(fcntl(sv_[1], F_SETFL, flags | O_NONBLOCK) == 0);
+      GPR_ASSERT(grpc_set_socket_no_sigpipe_if_possible(sv_[0]) ==
+                 GRPC_ERROR_NONE);
+      GPR_ASSERT(grpc_set_socket_no_sigpipe_if_possible(sv_[1]) ==
+                 GRPC_ERROR_NONE);
+      server_ = builder.BuildAndStart();
+      AddInsecureChannelFromFd(server_.get(), sv_[1]);
+    }
+#endif /* GRPC_POSIX_SOCKET */
+  }
+
+  ~ParameterizedClientInterceptorsEnd2endTest() override {
+    server_->Shutdown();
   }
 
-  ~ParameterizedClientInterceptorsEnd2endTest() { server_->Shutdown(); }
+  std::shared_ptr<grpc::Channel> CreateClientChannel(
+      std::vector<std::unique_ptr<
+          grpc::experimental::ClientInterceptorFactoryInterface>>
+          creators) {
+    if (GetParam().channel_type() == ChannelType::kHttpChannel) {
+      return experimental::CreateCustomChannelWithInterceptors(
+          server_address_, InsecureChannelCredentials(), ChannelArguments(),
+          std::move(creators));
+    }
+#ifdef GRPC_POSIX_SOCKET
+    else if (GetParam().channel_type() == ChannelType::kFdChannel) {
+      return experimental::CreateCustomInsecureChannelWithInterceptorsFromFd(
+          "", sv_[0], ChannelArguments(), std::move(creators));
+    }
+#endif /* GRPC_POSIX_SOCKET */
+    return nullptr;
+  }
 
   void SendRPC(const std::shared_ptr<Channel>& channel) {
-    switch (GetParam().type()) {
+    switch (GetParam().rpc_type()) {
       case RPCType::kSyncUnary:
         MakeCall(channel);
         break;
@@ -749,6 +814,7 @@ class ParameterizedClientInterceptorsEnd2endTest
   }
 
   std::string server_address_;
+  int sv_[2];
   EchoTestServiceStreamingImpl service_;
   std::unique_ptr<Server> server_;
 };
@@ -759,17 +825,14 @@ TEST_P(ParameterizedClientInterceptorsEnd2endTest,
   DummyInterceptor::Reset();
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       creators;
-  creators.push_back(std::unique_ptr<LoggingInterceptorFactory>(
-      new LoggingInterceptorFactory()));
+  creators.push_back(absl::make_unique<LoggingInterceptorFactory>());
   // Add 20 dummy interceptors
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
-  auto channel = experimental::CreateCustomChannelWithInterceptors(
-      server_address_, InsecureChannelCredentials(), args, std::move(creators));
+  auto channel = CreateClientChannel(std::move(creators));
   SendRPC(channel);
-  LoggingInterceptor::VerifyCall(GetParam().type());
+  LoggingInterceptor::VerifyCall(GetParam().rpc_type());
   // Make sure all 20 dummy interceptors were run
   EXPECT_EQ(DummyInterceptor::GetNumTimesRun(), 20);
 }
@@ -791,7 +854,7 @@ class ClientInterceptorsEnd2endTest
     server_ = builder.BuildAndStart();
   }
 
-  ~ClientInterceptorsEnd2endTest() { server_->Shutdown(); }
+  ~ClientInterceptorsEnd2endTest() override { server_->Shutdown(); }
 
   std::string server_address_;
   TestServiceImpl service_;
@@ -803,8 +866,7 @@ TEST_F(ClientInterceptorsEnd2endTest,
   ChannelArguments args;
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       creators;
-  creators.push_back(std::unique_ptr<HijackingInterceptorFactory>(
-      new HijackingInterceptorFactory()));
+  creators.push_back(absl::make_unique<HijackingInterceptorFactory>());
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, nullptr, args, std::move(creators));
   MakeCall(channel);
@@ -818,15 +880,12 @@ TEST_F(ClientInterceptorsEnd2endTest, ClientInterceptorHijackingTest) {
   // Add 20 dummy interceptors before hijacking interceptor
   creators.reserve(20);
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
-  creators.push_back(std::unique_ptr<HijackingInterceptorFactory>(
-      new HijackingInterceptorFactory()));
+  creators.push_back(absl::make_unique<HijackingInterceptorFactory>());
   // Add 20 dummy interceptors after hijacking interceptor
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, InsecureChannelCredentials(), args, std::move(creators));
@@ -839,10 +898,8 @@ TEST_F(ClientInterceptorsEnd2endTest, ClientInterceptorLogThenHijackTest) {
   ChannelArguments args;
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       creators;
-  creators.push_back(std::unique_ptr<LoggingInterceptorFactory>(
-      new LoggingInterceptorFactory()));
-  creators.push_back(std::unique_ptr<HijackingInterceptorFactory>(
-      new HijackingInterceptorFactory()));
+  creators.push_back(absl::make_unique<LoggingInterceptorFactory>());
+  creators.push_back(absl::make_unique<HijackingInterceptorFactory>());
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, InsecureChannelCredentials(), args, std::move(creators));
   MakeCall(channel);
@@ -858,16 +915,14 @@ TEST_F(ClientInterceptorsEnd2endTest,
   // Add 5 dummy interceptors before hijacking interceptor
   creators.reserve(5);
   for (auto i = 0; i < 5; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   creators.push_back(
       std::unique_ptr<experimental::ClientInterceptorFactoryInterface>(
           new HijackingInterceptorMakesAnotherCallFactory()));
   // Add 7 dummy interceptors after hijacking interceptor
   for (auto i = 0; i < 7; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   auto channel = server_->experimental().InProcessChannelWithInterceptors(
       args, std::move(creators));
@@ -890,7 +945,7 @@ class ClientInterceptorsCallbackEnd2endTest : public ::testing::Test {
     server_ = builder.BuildAndStart();
   }
 
-  ~ClientInterceptorsCallbackEnd2endTest() { server_->Shutdown(); }
+  ~ClientInterceptorsCallbackEnd2endTest() override { server_->Shutdown(); }
 
   std::string server_address_;
   TestServiceImpl service_;
@@ -903,12 +958,10 @@ TEST_F(ClientInterceptorsCallbackEnd2endTest,
   DummyInterceptor::Reset();
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       creators;
-  creators.push_back(std::unique_ptr<LoggingInterceptorFactory>(
-      new LoggingInterceptorFactory()));
+  creators.push_back(absl::make_unique<LoggingInterceptorFactory>());
   // Add 20 dummy interceptors
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   auto channel = server_->experimental().InProcessChannelWithInterceptors(
       args, std::move(creators));
@@ -924,14 +977,11 @@ TEST_F(ClientInterceptorsCallbackEnd2endTest,
   DummyInterceptor::Reset();
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       creators;
-  creators.push_back(std::unique_ptr<LoggingInterceptorFactory>(
-      new LoggingInterceptorFactory()));
+  creators.push_back(absl::make_unique<LoggingInterceptorFactory>());
   // Add 20 dummy interceptors and 20 null interceptors
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
-    creators.push_back(
-        std::unique_ptr<NullInterceptorFactory>(new NullInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
+    creators.push_back(absl::make_unique<NullInterceptorFactory>());
   }
   auto channel = server_->experimental().InProcessChannelWithInterceptors(
       args, std::move(creators));
@@ -953,7 +1003,7 @@ class ClientInterceptorsStreamingEnd2endTest : public ::testing::Test {
     server_ = builder.BuildAndStart();
   }
 
-  ~ClientInterceptorsStreamingEnd2endTest() { server_->Shutdown(); }
+  ~ClientInterceptorsStreamingEnd2endTest() override { server_->Shutdown(); }
 
   std::string server_address_;
   EchoTestServiceStreamingImpl service_;
@@ -965,12 +1015,10 @@ TEST_F(ClientInterceptorsStreamingEnd2endTest, ClientStreamingTest) {
   DummyInterceptor::Reset();
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       creators;
-  creators.push_back(std::unique_ptr<LoggingInterceptorFactory>(
-      new LoggingInterceptorFactory()));
+  creators.push_back(absl::make_unique<LoggingInterceptorFactory>());
   // Add 20 dummy interceptors
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, InsecureChannelCredentials(), args, std::move(creators));
@@ -985,12 +1033,10 @@ TEST_F(ClientInterceptorsStreamingEnd2endTest, ServerStreamingTest) {
   DummyInterceptor::Reset();
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       creators;
-  creators.push_back(std::unique_ptr<LoggingInterceptorFactory>(
-      new LoggingInterceptorFactory()));
+  creators.push_back(absl::make_unique<LoggingInterceptorFactory>());
   // Add 20 dummy interceptors
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, InsecureChannelCredentials(), args, std::move(creators));
@@ -1005,8 +1051,7 @@ TEST_F(ClientInterceptorsStreamingEnd2endTest, ClientStreamingHijackingTest) {
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       creators;
   creators.push_back(
-      std::unique_ptr<ClientStreamingRpcHijackingInterceptorFactory>(
-          new ClientStreamingRpcHijackingInterceptorFactory()));
+      absl::make_unique<ClientStreamingRpcHijackingInterceptorFactory>());
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, InsecureChannelCredentials(), args, std::move(creators));
 
@@ -1035,8 +1080,7 @@ TEST_F(ClientInterceptorsStreamingEnd2endTest, ServerStreamingHijackingTest) {
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       creators;
   creators.push_back(
-      std::unique_ptr<ServerStreamingRpcHijackingInterceptorFactory>(
-          new ServerStreamingRpcHijackingInterceptorFactory()));
+      absl::make_unique<ServerStreamingRpcHijackingInterceptorFactory>());
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, InsecureChannelCredentials(), args, std::move(creators));
   MakeServerStreamingCall(channel);
@@ -1050,8 +1094,7 @@ TEST_F(ClientInterceptorsStreamingEnd2endTest,
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       creators;
   creators.push_back(
-      std::unique_ptr<ServerStreamingRpcHijackingInterceptorFactory>(
-          new ServerStreamingRpcHijackingInterceptorFactory()));
+      absl::make_unique<ServerStreamingRpcHijackingInterceptorFactory>());
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, InsecureChannelCredentials(), args, std::move(creators));
   MakeAsyncCQServerStreamingCall(channel);
@@ -1064,8 +1107,7 @@ TEST_F(ClientInterceptorsStreamingEnd2endTest, BidiStreamingHijackingTest) {
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       creators;
   creators.push_back(
-      std::unique_ptr<BidiStreamingRpcHijackingInterceptorFactory>(
-          new BidiStreamingRpcHijackingInterceptorFactory()));
+      absl::make_unique<BidiStreamingRpcHijackingInterceptorFactory>());
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, InsecureChannelCredentials(), args, std::move(creators));
   MakeBidiStreamingCall(channel);
@@ -1076,12 +1118,10 @@ TEST_F(ClientInterceptorsStreamingEnd2endTest, BidiStreamingTest) {
   DummyInterceptor::Reset();
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       creators;
-  creators.push_back(std::unique_ptr<LoggingInterceptorFactory>(
-      new LoggingInterceptorFactory()));
+  creators.push_back(absl::make_unique<LoggingInterceptorFactory>());
   // Add 20 dummy interceptors
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, InsecureChannelCredentials(), args, std::move(creators));
@@ -1103,7 +1143,7 @@ class ClientGlobalInterceptorEnd2endTest : public ::testing::Test {
     server_ = builder.BuildAndStart();
   }
 
-  ~ClientGlobalInterceptorEnd2endTest() { server_->Shutdown(); }
+  ~ClientGlobalInterceptorEnd2endTest() override { server_->Shutdown(); }
 
   std::string server_address_;
   TestServiceImpl service_;
@@ -1123,8 +1163,7 @@ TEST_F(ClientGlobalInterceptorEnd2endTest, DummyGlobalInterceptor) {
   // Add 20 dummy interceptors
   creators.reserve(20);
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, InsecureChannelCredentials(), args, std::move(creators));
@@ -1147,8 +1186,7 @@ TEST_F(ClientGlobalInterceptorEnd2endTest, LoggingGlobalInterceptor) {
   // Add 20 dummy interceptors
   creators.reserve(20);
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, InsecureChannelCredentials(), args, std::move(creators));
@@ -1172,8 +1210,7 @@ TEST_F(ClientGlobalInterceptorEnd2endTest, HijackingGlobalInterceptor) {
   // Add 20 dummy interceptors
   creators.reserve(20);
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   auto channel = experimental::CreateCustomChannelWithInterceptors(
       server_address_, InsecureChannelCredentials(), args, std::move(creators));
index c6ca737..7776d8f 100644 (file)
@@ -24,6 +24,7 @@
 #include <string>
 #include <thread>
 
+#include "absl/memory/memory.h"
 #include "absl/strings/str_cat.h"
 
 #include <grpc/grpc.h>
@@ -58,6 +59,7 @@
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "src/proto/grpc/testing/xds/orca_load_report_for_test.pb.h"
 #include "test/core/util/port.h"
+#include "test/core/util/resolve_localhost_ip46.h"
 #include "test/core/util/test_config.h"
 #include "test/core/util/test_lb_policies.h"
 #include "test/cpp/end2end/test_service_impl.h"
@@ -67,7 +69,6 @@
 
 using grpc::testing::EchoRequest;
 using grpc::testing::EchoResponse;
-using std::chrono::system_clock;
 
 // defined in tcp_client.cc
 extern grpc_tcp_client_vtable* grpc_tcp_client_impl;
@@ -152,12 +153,14 @@ class MyTestServiceImpl : public TestServiceImpl {
 
 class FakeResolverResponseGeneratorWrapper {
  public:
-  FakeResolverResponseGeneratorWrapper()
-      : response_generator_(grpc_core::MakeRefCounted<
+  explicit FakeResolverResponseGeneratorWrapper(bool ipv6_only)
+      : ipv6_only_(ipv6_only),
+        response_generator_(grpc_core::MakeRefCounted<
                             grpc_core::FakeResolverResponseGenerator>()) {}
 
   FakeResolverResponseGeneratorWrapper(
       FakeResolverResponseGeneratorWrapper&& other) noexcept {
+    ipv6_only_ = other.ipv6_only_;
     response_generator_ = std::move(other.response_generator_);
   }
 
@@ -167,13 +170,15 @@ class FakeResolverResponseGeneratorWrapper {
       std::unique_ptr<grpc_core::ServerAddress::AttributeInterface> attribute =
           nullptr) {
     grpc_core::ExecCtx exec_ctx;
-    response_generator_->SetResponse(BuildFakeResults(
-        ports, service_config_json, attribute_key, std::move(attribute)));
+    response_generator_->SetResponse(
+        BuildFakeResults(ipv6_only_, ports, service_config_json, attribute_key,
+                         std::move(attribute)));
   }
 
   void SetNextResolutionUponError(const std::vector<int>& ports) {
     grpc_core::ExecCtx exec_ctx;
-    response_generator_->SetReresolutionResponse(BuildFakeResults(ports));
+    response_generator_->SetReresolutionResponse(
+        BuildFakeResults(ipv6_only_, ports));
   }
 
   void SetFailureOnReresolution() {
@@ -187,13 +192,15 @@ class FakeResolverResponseGeneratorWrapper {
 
  private:
   static grpc_core::Resolver::Result BuildFakeResults(
-      const std::vector<int>& ports, const char* service_config_json = nullptr,
+      bool ipv6_only, const std::vector<int>& ports,
+      const char* service_config_json = nullptr,
       const char* attribute_key = nullptr,
       std::unique_ptr<grpc_core::ServerAddress::AttributeInterface> attribute =
           nullptr) {
     grpc_core::Resolver::Result result;
     for (const int& port : ports) {
-      std::string lb_uri_str = absl::StrCat("ipv4:127.0.0.1:", port);
+      std::string lb_uri_str =
+          absl::StrCat(ipv6_only ? "ipv6:[::1]:" : "ipv4:127.0.0.1:", port);
       grpc_uri* lb_uri = grpc_uri_parse(lb_uri_str.c_str(), true);
       GPR_ASSERT(lb_uri != nullptr);
       grpc_resolved_address address;
@@ -216,6 +223,7 @@ class FakeResolverResponseGeneratorWrapper {
     return result;
   }
 
+  bool ipv6_only_ = false;
   grpc_core::RefCountedPtr<grpc_core::FakeResolverResponseGenerator>
       response_generator_;
 };
@@ -238,7 +246,14 @@ class ClientLbEnd2endTest : public ::testing::Test {
 #endif
   }
 
-  void SetUp() override { grpc_init(); }
+  void SetUp() override {
+    grpc_init();
+    bool localhost_resolves_to_ipv4 = false;
+    bool localhost_resolves_to_ipv6 = false;
+    grpc_core::LocalhostResolves(&localhost_resolves_to_ipv4,
+                                 &localhost_resolves_to_ipv6);
+    ipv6_only_ = !localhost_resolves_to_ipv4 && localhost_resolves_to_ipv6;
+  }
 
   void TearDown() override {
     for (size_t i = 0; i < servers_.size(); ++i) {
@@ -246,7 +261,7 @@ class ClientLbEnd2endTest : public ::testing::Test {
     }
     servers_.clear();
     creds_.reset();
-    grpc_shutdown_blocking();
+    grpc_shutdown();
   }
 
   void CreateServers(size_t num_servers,
@@ -278,7 +293,7 @@ class ClientLbEnd2endTest : public ::testing::Test {
   }
 
   FakeResolverResponseGeneratorWrapper BuildResolverResponseGenerator() {
-    return FakeResolverResponseGeneratorWrapper();
+    return FakeResolverResponseGeneratorWrapper(ipv6_only_);
   }
 
   std::unique_ptr<grpc::testing::EchoTestService::Stub> BuildStub(
@@ -290,7 +305,7 @@ class ClientLbEnd2endTest : public ::testing::Test {
       const std::string& lb_policy_name,
       const FakeResolverResponseGeneratorWrapper& response_generator,
       ChannelArguments args = ChannelArguments()) {
-    if (lb_policy_name.size() > 0) {
+    if (!lb_policy_name.empty()) {
       args.SetLoadBalancingPolicyName(lb_policy_name);
     }  // else, default to pick first
     args.SetPointer(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR,
@@ -359,8 +374,8 @@ class ClientLbEnd2endTest : public ::testing::Test {
       grpc::internal::Mutex mu;
       grpc::internal::MutexLock lock(&mu);
       grpc::internal::CondVar cond;
-      thread_.reset(new std::thread(
-          std::bind(&ServerData::Serve, this, server_host, &mu, &cond)));
+      thread_ = absl::make_unique<std::thread>(
+          std::bind(&ServerData::Serve, this, server_host, &mu, &cond));
       cond.WaitUntil(&mu, [this] { return server_ready_; });
       server_ready_ = false;
       gpr_log(GPR_INFO, "server startup complete");
@@ -412,7 +427,8 @@ class ClientLbEnd2endTest : public ::testing::Test {
   }
 
   bool WaitForChannelState(
-      Channel* channel, std::function<bool(grpc_connectivity_state)> predicate,
+      Channel* channel,
+      const std::function<bool(grpc_connectivity_state)>& predicate,
       bool try_to_connect = false, int timeout_seconds = 5) {
     const gpr_timespec deadline =
         grpc_timeout_seconds_to_deadline(timeout_seconds);
@@ -467,6 +483,7 @@ class ClientLbEnd2endTest : public ::testing::Test {
   std::vector<std::unique_ptr<ServerData>> servers_;
   const std::string kRequestMessage_;
   std::shared_ptr<ChannelCredentials> creds_;
+  bool ipv6_only_ = false;
 };
 
 TEST_F(ClientLbEnd2endTest, ChannelStateConnectingWhenResolving) {
@@ -1659,7 +1676,7 @@ class ClientLbPickArgsTest : public ClientLbEnd2endTest {
     grpc_core::RegisterTestPickArgsLoadBalancingPolicy(SavePickArgs);
   }
 
-  static void TearDownTestCase() { grpc_shutdown_blocking(); }
+  static void TearDownTestCase() { grpc_shutdown(); }
 
   const std::vector<grpc_core::PickArgsSeen>& args_seen_list() {
     grpc::internal::MutexLock lock(&mu_);
@@ -1725,7 +1742,7 @@ class ClientLbInterceptTrailingMetadataTest : public ClientLbEnd2endTest {
         ReportTrailerIntercepted);
   }
 
-  static void TearDownTestCase() { grpc_shutdown_blocking(); }
+  static void TearDownTestCase() { grpc_shutdown(); }
 
   int trailers_intercepted() {
     grpc::internal::MutexLock lock(&mu_);
@@ -1751,7 +1768,8 @@ class ClientLbInterceptTrailingMetadataTest : public ClientLbEnd2endTest {
     self->trailers_intercepted_++;
     self->trailing_metadata_ = args_seen.metadata;
     if (backend_metric_data != nullptr) {
-      self->load_report_.reset(new udpa::data::orca::v1::OrcaLoadReport);
+      self->load_report_ =
+          absl::make_unique<udpa::data::orca::v1::OrcaLoadReport>();
       self->load_report_->set_cpu_utilization(
           backend_metric_data->cpu_utilization);
       self->load_report_->set_mem_utilization(
@@ -1759,13 +1777,11 @@ class ClientLbInterceptTrailingMetadataTest : public ClientLbEnd2endTest {
       self->load_report_->set_rps(backend_metric_data->requests_per_second);
       for (const auto& p : backend_metric_data->request_cost) {
         std::string name = std::string(p.first);
-        (*self->load_report_->mutable_request_cost())[std::move(name)] =
-            p.second;
+        (*self->load_report_->mutable_request_cost())[name] = p.second;
       }
       for (const auto& p : backend_metric_data->utilization) {
         std::string name = std::string(p.first);
-        (*self->load_report_->mutable_utilization())[std::move(name)] =
-            p.second;
+        (*self->load_report_->mutable_utilization())[name] = p.second;
       }
     }
   }
@@ -1930,7 +1946,7 @@ class ClientLbAddressTest : public ClientLbEnd2endTest {
     grpc_core::RegisterAddressTestLoadBalancingPolicy(SaveAddress);
   }
 
-  static void TearDownTestCase() { grpc_shutdown_blocking(); }
+  static void TearDownTestCase() { grpc_shutdown(); }
 
   const std::vector<std::string>& addresses_seen() {
     grpc::internal::MutexLock lock(&mu_);
@@ -1969,8 +1985,9 @@ TEST_F(ClientLbAddressTest, Basic) {
   // Make sure that the attributes wind up on the subchannels.
   std::vector<std::string> expected;
   for (const int port : GetServersPorts()) {
-    expected.emplace_back(absl::StrCat(
-        "127.0.0.1:", port, " args={} attributes={", kAttributeKey, "=foo}"));
+    expected.emplace_back(
+        absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", port,
+                     " args={} attributes={", kAttributeKey, "=foo}"));
   }
   EXPECT_EQ(addresses_seen(), expected);
 }
index e3e975b..9b371e2 100644 (file)
@@ -64,7 +64,7 @@ class DelegatingChannelTest : public ::testing::Test {
     server_ = builder.BuildAndStart();
   }
 
-  ~DelegatingChannelTest() { server_->Shutdown(); }
+  ~DelegatingChannelTest() override { server_->Shutdown(); }
 
   std::string server_address_;
   TestServiceImpl service_;
index f157d20..e89971e 100644 (file)
@@ -37,7 +37,9 @@
 #include <mutex>
 #include <thread>
 
+#include "absl/memory/memory.h"
 #include "absl/strings/str_format.h"
+
 #include "src/core/ext/filters/client_channel/backup_poller.h"
 #include "src/core/lib/gpr/env.h"
 #include "src/core/lib/iomgr/iomgr.h"
@@ -348,7 +350,7 @@ class End2endTest : public ::testing::TestWithParam<TestScenario> {
   void StartServer(const std::shared_ptr<AuthMetadataProcessor>& processor) {
     int port = grpc_pick_unused_port_or_die();
     first_picked_port_ = port;
-    server_address_ << "127.0.0.1:" << port;
+    server_address_ << "localhost:" << port;
     // Setup server
     BuildAndStartServer(processor);
   }
@@ -376,8 +378,7 @@ class End2endTest : public ::testing::TestWithParam<TestScenario> {
       // Add 20 dummy server interceptors
       creators.reserve(20);
       for (auto i = 0; i < 20; i++) {
-        creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-            new DummyInterceptorFactory()));
+        creators.push_back(absl::make_unique<DummyInterceptorFactory>());
       }
       builder.experimental().SetInterceptorCreators(std::move(creators));
     }
@@ -447,7 +448,7 @@ class End2endTest : public ::testing::TestWithParam<TestScenario> {
           interceptor_creators = {}) {
     ResetChannel(std::move(interceptor_creators));
     if (GetParam().use_proxy) {
-      proxy_service_.reset(new Proxy(channel_));
+      proxy_service_ = absl::make_unique<Proxy>(channel_);
       int port = grpc_pick_unused_port_or_die();
       std::ostringstream proxyaddr;
       proxyaddr << "localhost:" << port;
@@ -1413,7 +1414,7 @@ TEST_P(End2endTest, ChannelStateTimeout) {
   }
   int port = grpc_pick_unused_port_or_die();
   std::ostringstream server_address;
-  server_address << "127.0.0.1:" << port;
+  server_address << "localhost:" << port;
   // Channel to non-existing server
   auto channel =
       grpc::CreateChannel(server_address.str(), InsecureChannelCredentials());
@@ -1858,7 +1859,7 @@ class CredentialsInterceptor : public experimental::Interceptor {
  public:
   CredentialsInterceptor(experimental::ClientRpcInfo* info) : info_(info) {}
 
-  void Intercept(experimental::InterceptorBatchMethods* methods) {
+  void Intercept(experimental::InterceptorBatchMethods* methods) override {
     if (methods->QueryInterceptionHookPoint(
             experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA)) {
       std::shared_ptr<CallCredentials> creds =
@@ -1875,7 +1876,7 @@ class CredentialsInterceptor : public experimental::Interceptor {
 class CredentialsInterceptorFactory
     : public experimental::ClientInterceptorFactoryInterface {
   CredentialsInterceptor* CreateClientInterceptor(
-      experimental::ClientRpcInfo* info) {
+      experimental::ClientRpcInfo* info) override {
     return new CredentialsInterceptor(info);
   }
 };
@@ -1887,8 +1888,8 @@ TEST_P(SecureEnd2endTest, CallCredentialsInterception) {
   }
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       interceptor_creators;
-  interceptor_creators.push_back(std::unique_ptr<CredentialsInterceptorFactory>(
-      new CredentialsInterceptorFactory()));
+  interceptor_creators.push_back(
+      absl::make_unique<CredentialsInterceptorFactory>());
   ResetStub(std::move(interceptor_creators));
   EchoRequest request;
   EchoResponse response;
@@ -1917,8 +1918,8 @@ TEST_P(SecureEnd2endTest, CallCredentialsInterceptionWithSetCredentials) {
   }
   std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
       interceptor_creators;
-  interceptor_creators.push_back(std::unique_ptr<CredentialsInterceptorFactory>(
-      new CredentialsInterceptorFactory()));
+  interceptor_creators.push_back(
+      absl::make_unique<CredentialsInterceptorFactory>());
   ResetStub(std::move(interceptor_creators));
   EchoRequest request;
   EchoResponse response;
@@ -2245,7 +2246,7 @@ class ResourceQuotaEnd2endTest : public End2endTest {
   ResourceQuotaEnd2endTest()
       : server_resource_quota_("server_resource_quota") {}
 
-  virtual void ConfigureServerBuilder(ServerBuilder* builder) override {
+  void ConfigureServerBuilder(ServerBuilder* builder) override {
     builder->SetResourceQuota(server_resource_quota_);
   }
 
index 062a47a..6287677 100644 (file)
@@ -34,6 +34,8 @@
 #include <grpcpp/support/config.h>
 #include <grpcpp/support/slice.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/cpp/common/channel_filter.h"
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/core/util/port.h"
@@ -44,7 +46,6 @@
 
 using grpc::testing::EchoRequest;
 using grpc::testing::EchoResponse;
-using std::chrono::system_clock;
 
 namespace grpc {
 namespace testing {
@@ -101,7 +102,7 @@ int GetCallCounterValue() {
 class ChannelDataImpl : public ChannelData {
  public:
   grpc_error* Init(grpc_channel_element* /*elem*/,
-                   grpc_channel_element_args* /*args*/) {
+                   grpc_channel_element_args* /*args*/) override {
     IncrementConnectionCounter();
     return GRPC_ERROR_NONE;
   }
@@ -151,16 +152,16 @@ class FilterEnd2endTest : public ::testing::Test {
     bool ignored_ok;
     cli_cq_.Shutdown();
     srv_cq_->Shutdown();
-    while (cli_cq_.Next(&ignored_tag, &ignored_ok))
-      ;
-    while (srv_cq_->Next(&ignored_tag, &ignored_ok))
-      ;
+    while (cli_cq_.Next(&ignored_tag, &ignored_ok)) {
+    }
+    while (srv_cq_->Next(&ignored_tag, &ignored_ok)) {
+    }
   }
 
   void ResetStub() {
     std::shared_ptr<Channel> channel = grpc::CreateChannel(
         server_address_.str(), InsecureChannelCredentials());
-    generic_stub_.reset(new GenericStub(channel));
+    generic_stub_ = absl::make_unique<GenericStub>(channel);
     ResetConnectionCounter();
     ResetCallCounter();
   }
index ec8a0b8..9b27aa8 100644 (file)
@@ -38,6 +38,8 @@
 #include <random>
 #include <thread>
 
+#include "absl/memory/memory.h"
+
 #include "src/core/lib/backoff/backoff.h"
 #include "src/core/lib/gpr/env.h"
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
@@ -180,7 +182,7 @@ class FlakyNetworkTest : public ::testing::TestWithParam<TestScenario> {
     // ip6-looopback, but ipv6 support is not enabled by default in docker.
     port_ = SERVER_PORT;
 
-    server_.reset(new ServerData(port_, GetParam().credentials_type));
+    server_ = absl::make_unique<ServerData>(port_, GetParam().credentials_type);
     server_->Start(server_host_);
   }
   void StopServer() { server_->Shutdown(); }
@@ -193,7 +195,7 @@ class FlakyNetworkTest : public ::testing::TestWithParam<TestScenario> {
   std::shared_ptr<Channel> BuildChannel(
       const std::string& lb_policy_name,
       ChannelArguments args = ChannelArguments()) {
-    if (lb_policy_name.size() > 0) {
+    if (!lb_policy_name.empty()) {
       args.SetLoadBalancingPolicyName(lb_policy_name);
     }  // else, default to pick first
     auto channel_creds = GetCredentialsProvider()->GetChannelCredentials(
@@ -206,7 +208,7 @@ class FlakyNetworkTest : public ::testing::TestWithParam<TestScenario> {
   bool SendRpc(
       const std::unique_ptr<grpc::testing::EchoTestService::Stub>& stub,
       int timeout_ms = 0, bool wait_for_ready = false) {
-    auto response = std::unique_ptr<EchoResponse>(new EchoResponse());
+    auto response = absl::make_unique<EchoResponse>();
     EchoRequest request;
     auto& msg = GetParam().message_content;
     request.set_message(msg);
@@ -257,8 +259,8 @@ class FlakyNetworkTest : public ::testing::TestWithParam<TestScenario> {
       std::mutex mu;
       std::unique_lock<std::mutex> lock(mu);
       std::condition_variable cond;
-      thread_.reset(new std::thread(
-          std::bind(&ServerData::Serve, this, server_host, &mu, &cond)));
+      thread_ = absl::make_unique<std::thread>(
+          std::bind(&ServerData::Serve, this, server_host, &mu, &cond));
       cond.wait(lock, [this] { return server_ready_; });
       server_ready_ = false;
       gpr_log(GPR_INFO, "server startup complete");
index 0d39691..32aacc4 100644 (file)
@@ -32,6 +32,8 @@
 #include <grpcpp/server_context.h>
 #include <grpcpp/support/slice.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
@@ -41,7 +43,6 @@
 
 using grpc::testing::EchoRequest;
 using grpc::testing::EchoResponse;
-using std::chrono::system_clock;
 
 namespace grpc {
 namespace testing {
@@ -85,10 +86,10 @@ class GenericEnd2endTest : public ::testing::Test {
       bool ignored_ok;
       cli_cq_.Shutdown();
       srv_cq_->Shutdown();
-      while (cli_cq_.Next(&ignored_tag, &ignored_ok))
-        ;
-      while (srv_cq_->Next(&ignored_tag, &ignored_ok))
-        ;
+      while (cli_cq_.Next(&ignored_tag, &ignored_ok)) {
+      }
+      while (srv_cq_->Next(&ignored_tag, &ignored_ok)) {
+      }
       shut_down_ = true;
     }
   }
@@ -98,7 +99,7 @@ class GenericEnd2endTest : public ::testing::Test {
     std::shared_ptr<Channel> channel = grpc::CreateChannel(
         server_address_.str(), InsecureChannelCredentials());
     stub_ = grpc::testing::EchoTestService::NewStub(channel);
-    generic_stub_.reset(new GenericStub(channel));
+    generic_stub_ = absl::make_unique<GenericStub>(channel);
   }
 
   void server_ok(int i) { verify_ok(srv_cq_.get(), i, true); }
@@ -285,8 +286,8 @@ TEST_F(GenericEnd2endTest, SequentialUnaryRpcs) {
         SerializeToByteBuffer(&send_request);
     std::thread request_call([this]() { server_ok(4); });
     std::unique_ptr<GenericClientAsyncResponseReader> call =
-        generic_stub_->PrepareUnaryCall(&cli_ctx, kMethodName,
-                                        *cli_send_buffer.get(), &cli_cq_);
+        generic_stub_->PrepareUnaryCall(&cli_ctx, kMethodName, *cli_send_buffer,
+                                        &cli_cq_);
     call->StartCall();
     ByteBuffer cli_recv_buffer;
     call->Finish(&cli_recv_buffer, &recv_status, tag(1));
index ac885f4..7858878 100644 (file)
@@ -53,6 +53,7 @@
 #include "src/cpp/server/secure_server_credentials.h"
 
 #include "test/core/util/port.h"
+#include "test/core/util/resolve_localhost_ip46.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/end2end/test_service_impl.h"
 
@@ -184,6 +185,12 @@ std::string Ip4ToPackedString(const char* ip_str) {
   return std::string(reinterpret_cast<const char*>(&ip4), sizeof(ip4));
 }
 
+std::string Ip6ToPackedString(const char* ip_str) {
+  struct in6_addr ip6;
+  GPR_ASSERT(inet_pton(AF_INET6, ip_str, &ip6) == 1);
+  return std::string(reinterpret_cast<const char*>(&ip6), sizeof(ip6));
+}
+
 struct ClientStats {
   size_t num_calls_started = 0;
   size_t num_calls_finished = 0;
@@ -321,28 +328,6 @@ class BalancerServiceImpl : public BalancerService {
     gpr_log(GPR_INFO, "LB[%p]: shut down", this);
   }
 
-  static LoadBalanceResponse BuildResponseForBackends(
-      const std::vector<int>& backend_ports,
-      const std::map<std::string, size_t>& drop_token_counts) {
-    LoadBalanceResponse response;
-    for (const auto& drop_token_count : drop_token_counts) {
-      for (size_t i = 0; i < drop_token_count.second; ++i) {
-        auto* server = response.mutable_server_list()->add_servers();
-        server->set_drop(true);
-        server->set_load_balance_token(drop_token_count.first);
-      }
-    }
-    for (const int& backend_port : backend_ports) {
-      auto* server = response.mutable_server_list()->add_servers();
-      server->set_ip_address(Ip4ToPackedString("127.0.0.1"));
-      server->set_port(backend_port);
-      static int token_count = 0;
-      server->set_load_balance_token(
-          absl::StrFormat("token%03d", ++token_count));
-    }
-    return response;
-  }
-
   ClientStats WaitForLoadReport() {
     grpc::internal::MutexLock lock(&mu_);
     grpc::internal::CondVar cv;
@@ -418,6 +403,11 @@ class GrpclbEnd2endTest : public ::testing::Test {
   static void TearDownTestCase() { grpc_shutdown(); }
 
   void SetUp() override {
+    bool localhost_resolves_to_ipv4 = false;
+    bool localhost_resolves_to_ipv6 = false;
+    grpc_core::LocalhostResolves(&localhost_resolves_to_ipv4,
+                                 &localhost_resolves_to_ipv6);
+    ipv6_only_ = !localhost_resolves_to_ipv4 && localhost_resolves_to_ipv6;
     response_generator_ =
         grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
     // Start the backends.
@@ -546,11 +536,12 @@ class GrpclbEnd2endTest : public ::testing::Test {
     std::string balancer_name;
   };
 
-  static grpc_core::ServerAddressList CreateLbAddressesFromAddressDataList(
+  grpc_core::ServerAddressList CreateLbAddressesFromAddressDataList(
       const std::vector<AddressData>& address_data) {
     grpc_core::ServerAddressList addresses;
     for (const auto& addr : address_data) {
-      std::string lb_uri_str = absl::StrCat("ipv4:127.0.0.1:", addr.port);
+      std::string lb_uri_str = absl::StrCat(
+          ipv6_only_ ? "ipv6:[::1]:" : "ipv4:127.0.0.1:", addr.port);
       grpc_uri* lb_uri = grpc_uri_parse(lb_uri_str.c_str(), true);
       GPR_ASSERT(lb_uri != nullptr);
       grpc_resolved_address address;
@@ -565,7 +556,7 @@ class GrpclbEnd2endTest : public ::testing::Test {
     return addresses;
   }
 
-  static grpc_core::Resolver::Result MakeResolverResult(
+  grpc_core::Resolver::Result MakeResolverResult(
       const std::vector<AddressData>& balancer_address_data,
       const std::vector<AddressData>& backend_address_data = {},
       const char* service_config_json = kDefaultServiceConfig) {
@@ -628,6 +619,29 @@ class GrpclbEnd2endTest : public ::testing::Test {
     balancers_[i]->service_.add_response(response, delay_ms);
   }
 
+  LoadBalanceResponse BuildResponseForBackends(
+      const std::vector<int>& backend_ports,
+      const std::map<std::string, size_t>& drop_token_counts) {
+    LoadBalanceResponse response;
+    for (const auto& drop_token_count : drop_token_counts) {
+      for (size_t i = 0; i < drop_token_count.second; ++i) {
+        auto* server = response.mutable_server_list()->add_servers();
+        server->set_drop(true);
+        server->set_load_balance_token(drop_token_count.first);
+      }
+    }
+    for (const int& backend_port : backend_ports) {
+      auto* server = response.mutable_server_list()->add_servers();
+      server->set_ip_address(ipv6_only_ ? Ip6ToPackedString("::1")
+                                        : Ip4ToPackedString("127.0.0.1"));
+      server->set_port(backend_port);
+      static int token_count = 0;
+      server->set_load_balance_token(
+          absl::StrFormat("token%03d", ++token_count));
+    }
+    return response;
+  }
+
   Status SendRpc(EchoResponse* response = nullptr, int timeout_ms = 1000,
                  bool wait_for_ready = false,
                  const Status& expected_status = Status::OK) {
@@ -726,6 +740,7 @@ class GrpclbEnd2endTest : public ::testing::Test {
   const size_t num_backends_;
   const size_t num_balancers_;
   const int client_load_reporting_interval_seconds_;
+  bool ipv6_only_ = false;
   std::shared_ptr<Channel> channel_;
   std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
   std::vector<std::unique_ptr<ServerThread<BackendServiceImpl>>> backends_;
@@ -745,8 +760,7 @@ TEST_F(SingleBalancerTest, Vanilla) {
   SetNextResolutionAllBalancers();
   const size_t kNumRpcsPerAddress = 100;
   ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
-      0);
+      0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
   // Make sure that trying to connect works without a call.
   channel_->GetState(true /* try_to_connect */);
   // We need to wait for all backends to come online.
@@ -771,8 +785,7 @@ TEST_F(SingleBalancerTest, Vanilla) {
 TEST_F(SingleBalancerTest, ReturnServerStatus) {
   SetNextResolutionAllBalancers();
   ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
-      0);
+      0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
   // We need to wait for all backends to come online.
   WaitForAllBackends();
   // Send a request that the backend will fail, and make sure we get
@@ -793,8 +806,7 @@ TEST_F(SingleBalancerTest, SelectGrpclbWithMigrationServiceConfig) {
       "  ]\n"
       "}");
   ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
-      0);
+      0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
   CheckRpcSendOk(1, 1000 /* timeout_ms */, true /* wait_for_ready */);
   balancers_[0]->service_.NotifyDoneWithServerlists();
   // The balancer got a single request.
@@ -841,8 +853,7 @@ TEST_F(SingleBalancerTest, UsePickFirstChildPolicy) {
       "  ]\n"
       "}");
   ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
-      0);
+      0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
   const size_t kNumRpcs = num_backends_ * 2;
   CheckRpcSendOk(kNumRpcs, 1000 /* timeout_ms */, true /* wait_for_ready */);
   balancers_[0]->service_.NotifyDoneWithServerlists();
@@ -872,8 +883,7 @@ TEST_F(SingleBalancerTest, SwapChildPolicy) {
       "  ]\n"
       "}");
   ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
-      0);
+      0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
   const size_t kNumRpcs = num_backends_ * 2;
   CheckRpcSendOk(kNumRpcs, 1000 /* timeout_ms */, true /* wait_for_ready */);
   // Check that all requests went to the first backend.  This verifies
@@ -908,8 +918,7 @@ TEST_F(SingleBalancerTest, SameBackendListedMultipleTimes) {
   ports.push_back(backends_[0]->port_);
   ports.push_back(backends_[0]->port_);
   const size_t kNumRpcsPerAddress = 10;
-  ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(ports, {}), 0);
+  ScheduleResponseForBalancer(0, BuildResponseForBackends(ports, {}), 0);
   // We need to wait for the backend to come online.
   WaitForBackend(0);
   // Send kNumRpcsPerAddress RPCs per server.
@@ -927,8 +936,7 @@ TEST_F(SingleBalancerTest, SecureNaming) {
   SetNextResolution({AddressData{balancers_[0]->port_, "lb"}});
   const size_t kNumRpcsPerAddress = 100;
   ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
-      0);
+      0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
   // Make sure that trying to connect works without a call.
   channel_->GetState(true /* try_to_connect */);
   // We need to wait for all backends to come online.
@@ -970,8 +978,7 @@ TEST_F(SingleBalancerTest, InitiallyEmptyServerlist) {
   ScheduleResponseForBalancer(0, LoadBalanceResponse(), 0);
   // Send non-empty serverlist only after kServerlistDelayMs
   ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
-      kServerlistDelayMs);
+      0, BuildResponseForBackends(GetBackendPorts(), {}), kServerlistDelayMs);
   const auto t0 = system_clock::now();
   // Client will block: LB will initially send empty serverlist.
   CheckRpcSendOk(1, kCallDeadlineMs, true /* wait_for_ready */);
@@ -997,8 +1004,7 @@ TEST_F(SingleBalancerTest, AllServersUnreachableFailFast) {
   for (size_t i = 0; i < kNumUnreachableServers; ++i) {
     ports.push_back(grpc_pick_unused_port_or_die());
   }
-  ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(ports, {}), 0);
+  ScheduleResponseForBalancer(0, BuildResponseForBackends(ports, {}), 0);
   const Status status = SendRpc();
   // The error shouldn't be DEADLINE_EXCEEDED.
   EXPECT_EQ(StatusCode::UNAVAILABLE, status.error_code());
@@ -1027,7 +1033,7 @@ TEST_F(SingleBalancerTest, Fallback) {
   // Send non-empty serverlist only after kServerlistDelayMs.
   ScheduleResponseForBalancer(
       0,
-      BalancerServiceImpl::BuildResponseForBackends(
+      BuildResponseForBackends(
           GetBackendPorts(kNumBackendsInResolution /* start_index */), {}),
       kServerlistDelayMs);
 
@@ -1096,7 +1102,7 @@ TEST_F(SingleBalancerTest, FallbackUpdate) {
   // Send non-empty serverlist only after kServerlistDelayMs.
   ScheduleResponseForBalancer(
       0,
-      BalancerServiceImpl::BuildResponseForBackends(
+      BuildResponseForBackends(
           GetBackendPorts(kNumBackendsInResolution +
                           kNumBackendsInResolutionUpdate /* start_index */),
           {}),
@@ -1201,10 +1207,9 @@ TEST_F(SingleBalancerTest,
     balancer_addresses.emplace_back(AddressData{balancers_[i]->port_, ""});
   }
   SetNextResolution(balancer_addresses, backend_addresses);
-  ScheduleResponseForBalancer(0,
-                              BalancerServiceImpl::BuildResponseForBackends(
-                                  GetBackendPorts(kNumFallbackBackends), {}),
-                              0);
+  ScheduleResponseForBalancer(
+      0, BuildResponseForBackends(GetBackendPorts(kNumFallbackBackends), {}),
+      0);
   // Try to connect.
   channel_->GetState(true /* try_to_connect */);
   WaitForAllBackends(1 /* num_requests_multiple_of */,
@@ -1234,10 +1239,9 @@ TEST_F(SingleBalancerTest,
   // Now start the balancer again.  This should cause us to exit
   // fallback mode.
   balancers_[0]->Start(server_host_);
-  ScheduleResponseForBalancer(0,
-                              BalancerServiceImpl::BuildResponseForBackends(
-                                  GetBackendPorts(kNumFallbackBackends), {}),
-                              0);
+  ScheduleResponseForBalancer(
+      0, BuildResponseForBackends(GetBackendPorts(kNumFallbackBackends), {}),
+      0);
   WaitForAllBackends(1 /* num_requests_multiple_of */,
                      kNumFallbackBackends /* start_index */);
 }
@@ -1256,10 +1260,9 @@ TEST_F(SingleBalancerTest,
     balancer_addresses.emplace_back(AddressData{balancers_[i]->port_, ""});
   }
   SetNextResolution(balancer_addresses, backend_addresses);
-  ScheduleResponseForBalancer(0,
-                              BalancerServiceImpl::BuildResponseForBackends(
-                                  GetBackendPorts(kNumFallbackBackends), {}),
-                              0);
+  ScheduleResponseForBalancer(
+      0, BuildResponseForBackends(GetBackendPorts(kNumFallbackBackends), {}),
+      0);
   // Try to connect.
   channel_->GetState(true /* try_to_connect */);
   WaitForAllBackends(1 /* num_requests_multiple_of */,
@@ -1287,10 +1290,9 @@ TEST_F(SingleBalancerTest,
   // Now start the balancer again.  This should cause us to exit
   // fallback mode.
   balancers_[0]->Start(server_host_);
-  ScheduleResponseForBalancer(0,
-                              BalancerServiceImpl::BuildResponseForBackends(
-                                  GetBackendPorts(kNumFallbackBackends), {}),
-                              0);
+  ScheduleResponseForBalancer(
+      0, BuildResponseForBackends(GetBackendPorts(kNumFallbackBackends), {}),
+      0);
   WaitForAllBackends(1 /* num_requests_multiple_of */,
                      kNumFallbackBackends /* start_index */);
 }
@@ -1358,7 +1360,7 @@ TEST_F(SingleBalancerTest, FallbackControlledByBalancer_AfterFirstServerlist) {
   // then sends the serverlist again.
   // The serverlist points to backend 1.
   LoadBalanceResponse serverlist_resp =
-      BalancerServiceImpl::BuildResponseForBackends({backends_[1]->port_}, {});
+      BuildResponseForBackends({backends_[1]->port_}, {});
   LoadBalanceResponse fallback_resp;
   fallback_resp.mutable_fallback_response();
   ScheduleResponseForBalancer(0, serverlist_resp, 0);
@@ -1375,8 +1377,7 @@ TEST_F(SingleBalancerTest, BackendsRestart) {
   SetNextResolutionAllBalancers();
   const size_t kNumRpcsPerAddress = 100;
   ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
-      0);
+      0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
   // Make sure that trying to connect works without a call.
   channel_->GetState(true /* try_to_connect */);
   // Send kNumRpcsPerAddress RPCs per server.
@@ -1406,8 +1407,7 @@ TEST_F(SingleBalancerTest, ServiceNameFromLbPolicyConfig) {
 
   SetNextResolutionAllBalancers(kServiceConfigWithTarget);
   ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
-      0);
+      0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
   // Make sure that trying to connect works without a call.
   channel_->GetState(true /* try_to_connect */);
   // We need to wait for all backends to come online.
@@ -1424,10 +1424,10 @@ TEST_F(UpdatesTest, UpdateBalancersButKeepUsingOriginalBalancer) {
   SetNextResolutionAllBalancers();
   const std::vector<int> first_backend{GetBackendPorts()[0]};
   const std::vector<int> second_backend{GetBackendPorts()[1]};
-  ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(first_backend, {}), 0);
-  ScheduleResponseForBalancer(
-      1, BalancerServiceImpl::BuildResponseForBackends(second_backend, {}), 0);
+  ScheduleResponseForBalancer(0, BuildResponseForBackends(first_backend, {}),
+                              0);
+  ScheduleResponseForBalancer(1, BuildResponseForBackends(second_backend, {}),
+                              0);
 
   // Wait until the first backend is ready.
   WaitForBackend(0);
@@ -1482,10 +1482,10 @@ TEST_F(UpdatesTest, UpdateBalancersRepeated) {
   const std::vector<int> first_backend{GetBackendPorts()[0]};
   const std::vector<int> second_backend{GetBackendPorts()[0]};
 
-  ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(first_backend, {}), 0);
-  ScheduleResponseForBalancer(
-      1, BalancerServiceImpl::BuildResponseForBackends(second_backend, {}), 0);
+  ScheduleResponseForBalancer(0, BuildResponseForBackends(first_backend, {}),
+                              0);
+  ScheduleResponseForBalancer(1, BuildResponseForBackends(second_backend, {}),
+                              0);
 
   // Wait until the first backend is ready.
   WaitForBackend(0);
@@ -1555,10 +1555,10 @@ TEST_F(UpdatesTest, UpdateBalancersDeadUpdate) {
   const std::vector<int> first_backend{GetBackendPorts()[0]};
   const std::vector<int> second_backend{GetBackendPorts()[1]};
 
-  ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(first_backend, {}), 0);
-  ScheduleResponseForBalancer(
-      1, BalancerServiceImpl::BuildResponseForBackends(second_backend, {}), 0);
+  ScheduleResponseForBalancer(0, BuildResponseForBackends(first_backend, {}),
+                              0);
+  ScheduleResponseForBalancer(1, BuildResponseForBackends(second_backend, {}),
+                              0);
 
   // Start servers and send 10 RPCs per server.
   gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
@@ -1688,10 +1688,10 @@ class UpdatesWithClientLoadReportingTest : public GrpclbEnd2endTest {
 TEST_F(UpdatesWithClientLoadReportingTest, ReresolveDeadBalancer) {
   const std::vector<int> first_backend{GetBackendPorts()[0]};
   const std::vector<int> second_backend{GetBackendPorts()[1]};
-  ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(first_backend, {}), 0);
-  ScheduleResponseForBalancer(
-      1, BalancerServiceImpl::BuildResponseForBackends(second_backend, {}), 0);
+  ScheduleResponseForBalancer(0, BuildResponseForBackends(first_backend, {}),
+                              0);
+  ScheduleResponseForBalancer(1, BuildResponseForBackends(second_backend, {}),
+                              0);
 
   // Ask channel to connect to trigger resolver creation.
   channel_->GetState(true);
@@ -1767,7 +1767,7 @@ TEST_F(SingleBalancerTest, Drop) {
   const int num_total_addresses = num_backends_ + num_of_drop_addresses;
   ScheduleResponseForBalancer(
       0,
-      BalancerServiceImpl::BuildResponseForBackends(
+      BuildResponseForBackends(
           GetBackendPorts(),
           {{"rate_limiting", num_of_drop_by_rate_limiting_addresses},
            {"load_balancing", num_of_drop_by_load_balancing_addresses}}),
@@ -1806,7 +1806,7 @@ TEST_F(SingleBalancerTest, DropAllFirst) {
   const int num_of_drop_by_load_balancing_addresses = 1;
   ScheduleResponseForBalancer(
       0,
-      BalancerServiceImpl::BuildResponseForBackends(
+      BuildResponseForBackends(
           {}, {{"rate_limiting", num_of_drop_by_rate_limiting_addresses},
                {"load_balancing", num_of_drop_by_load_balancing_addresses}}),
       0);
@@ -1818,13 +1818,12 @@ TEST_F(SingleBalancerTest, DropAllFirst) {
 TEST_F(SingleBalancerTest, DropAll) {
   SetNextResolutionAllBalancers();
   ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
-      0);
+      0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
   const int num_of_drop_by_rate_limiting_addresses = 1;
   const int num_of_drop_by_load_balancing_addresses = 1;
   ScheduleResponseForBalancer(
       0,
-      BalancerServiceImpl::BuildResponseForBackends(
+      BuildResponseForBackends(
           {}, {{"rate_limiting", num_of_drop_by_rate_limiting_addresses},
                {"load_balancing", num_of_drop_by_load_balancing_addresses}}),
       1000);
@@ -1850,8 +1849,7 @@ TEST_F(SingleBalancerWithClientLoadReportingTest, Vanilla) {
   SetNextResolutionAllBalancers();
   const size_t kNumRpcsPerAddress = 100;
   ScheduleResponseForBalancer(
-      0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
-      0);
+      0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
   // Wait until all backends are ready.
   int num_ok = 0;
   int num_failure = 0;
@@ -1892,8 +1890,7 @@ TEST_F(SingleBalancerWithClientLoadReportingTest, BalancerRestart) {
   // Balancer returns backends starting at index 1.
   ScheduleResponseForBalancer(
       0,
-      BalancerServiceImpl::BuildResponseForBackends(
-          GetBackendPorts(0, kNumBackendsFirstPass), {}),
+      BuildResponseForBackends(GetBackendPorts(0, kNumBackendsFirstPass), {}),
       0);
   // Wait until all backends returned by the balancer are ready.
   int num_ok = 0;
@@ -1922,10 +1919,9 @@ TEST_F(SingleBalancerWithClientLoadReportingTest, BalancerRestart) {
   }
   // Now restart the balancer, this time pointing to all backends.
   balancers_[0]->Start(server_host_);
-  ScheduleResponseForBalancer(0,
-                              BalancerServiceImpl::BuildResponseForBackends(
-                                  GetBackendPorts(kNumBackendsFirstPass), {}),
-                              0);
+  ScheduleResponseForBalancer(
+      0, BuildResponseForBackends(GetBackendPorts(kNumBackendsFirstPass), {}),
+      0);
   // Wait for queries to start going to one of the new backends.
   // This tells us that we're now using the new serverlist.
   do {
@@ -1955,7 +1951,7 @@ TEST_F(SingleBalancerWithClientLoadReportingTest, Drop) {
   const int num_total_addresses = num_backends_ + num_of_drop_addresses;
   ScheduleResponseForBalancer(
       0,
-      BalancerServiceImpl::BuildResponseForBackends(
+      BuildResponseForBackends(
           GetBackendPorts(),
           {{"rate_limiting", num_of_drop_by_rate_limiting_addresses},
            {"load_balancing", num_of_drop_by_load_balancing_addresses}}),
index 9656e71..8646b5a 100644 (file)
@@ -305,8 +305,8 @@ class HybridEnd2endTest : public ::testing::TestWithParam<bool> {
     bool ignored_ok;
     for (auto it = cqs_.begin(); it != cqs_.end(); ++it) {
       (*it)->Shutdown();
-      while ((*it)->Next(&ignored_tag, &ignored_ok))
-        ;
+      while ((*it)->Next(&ignored_tag, &ignored_ok)) {
+      }
     }
   }
 
index b8c92da..b977342 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "test/cpp/end2end/interceptors_util.h"
 
+#include "absl/memory/memory.h"
+
 namespace grpc {
 namespace testing {
 
@@ -203,8 +205,7 @@ CreateDummyClientInterceptors() {
   // Add 20 dummy interceptors before hijacking interceptor
   creators.reserve(20);
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   return creators;
 }
index 4eafcea..01009cd 100644 (file)
@@ -33,7 +33,7 @@ class DummyInterceptor : public experimental::Interceptor {
  public:
   DummyInterceptor() {}
 
-  virtual void Intercept(experimental::InterceptorBatchMethods* methods) {
+  void Intercept(experimental::InterceptorBatchMethods* methods) override {
     if (methods->QueryInterceptionHookPoint(
             experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA)) {
       num_times_run_++;
@@ -71,12 +71,12 @@ class DummyInterceptorFactory
     : public experimental::ClientInterceptorFactoryInterface,
       public experimental::ServerInterceptorFactoryInterface {
  public:
-  virtual experimental::Interceptor* CreateClientInterceptor(
+  experimental::Interceptor* CreateClientInterceptor(
       experimental::ClientRpcInfo* /*info*/) override {
     return new DummyInterceptor();
   }
 
-  virtual experimental::Interceptor* CreateServerInterceptor(
+  experimental::Interceptor* CreateServerInterceptor(
       experimental::ServerRpcInfo* /*info*/) override {
     return new DummyInterceptor();
   }
@@ -87,12 +87,12 @@ class NullInterceptorFactory
     : public experimental::ClientInterceptorFactoryInterface,
       public experimental::ServerInterceptorFactoryInterface {
  public:
-  virtual experimental::Interceptor* CreateClientInterceptor(
+  experimental::Interceptor* CreateClientInterceptor(
       experimental::ClientRpcInfo* /*info*/) override {
     return nullptr;
   }
 
-  virtual experimental::Interceptor* CreateServerInterceptor(
+  experimental::Interceptor* CreateServerInterceptor(
       experimental::ServerRpcInfo* /*info*/) override {
     return nullptr;
   }
index c150667..c2cd0c1 100644 (file)
@@ -69,7 +69,7 @@ class CallbackTestServiceImpl
       std::function<void(experimental::RpcAllocatorState* allocator_state,
                          const EchoRequest* req, EchoResponse* resp)>
           mutator) {
-    allocator_mutator_ = mutator;
+    allocator_mutator_ = std::move(mutator);
   }
 
   experimental::ServerUnaryReactor* Echo(
@@ -127,7 +127,7 @@ class MessageAllocatorEnd2endTestBase
     }
   }
 
-  ~MessageAllocatorEnd2endTestBase() = default;
+  ~MessageAllocatorEnd2endTestBase() override = default;
 
   void CreateServer(
       experimental::MessageAllocator<EchoRequest, EchoResponse>* allocator) {
index 8c68ee4..1c684ef 100644 (file)
@@ -48,11 +48,9 @@ using grpc::testing::EchoResponse;
 using grpc::testing::EchoTestService;
 using grpc::testing::MockClientReaderWriter;
 using std::vector;
-using std::chrono::system_clock;
 using ::testing::_;
 using ::testing::AtLeast;
 using ::testing::DoAll;
-using ::testing::Invoke;
 using ::testing::Return;
 using ::testing::SaveArg;
 using ::testing::SetArgPointee;
@@ -299,11 +297,11 @@ class TestServiceImpl : public EchoTestService::Service {
         buff += n;
         continue;
       }
-      if (buff == "") continue;
+      if (buff.empty()) continue;
       result.push_back(buff);
       buff = "";
     }
-    if (buff != "") result.push_back(buff);
+    if (!buff.empty()) result.push_back(buff);
 
     return result;
   }
index 4be070e..f3a13a2 100644 (file)
@@ -25,6 +25,8 @@
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/core/lib/gpr/tls.h"
 #include "src/core/lib/iomgr/port.h"
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
@@ -99,8 +101,8 @@ class NonblockingTest : public ::testing::Test {
     void* ignored_tag;
     bool ignored_ok;
     cq_->Shutdown();
-    while (LoopForTag(&ignored_tag, &ignored_ok))
-      ;
+    while (LoopForTag(&ignored_tag, &ignored_ok)) {
+    }
     stub_.reset();
     grpc_recycle_unused_port(port_);
   }
@@ -109,7 +111,8 @@ class NonblockingTest : public ::testing::Test {
     ServerBuilder builder;
     builder.AddListeningPort(server_address_.str(),
                              grpc::InsecureServerCredentials());
-    service_.reset(new grpc::testing::EchoTestService::AsyncService());
+    service_ =
+        absl::make_unique<grpc::testing::EchoTestService::AsyncService>();
     builder.RegisterService(service_.get());
     cq_ = builder.AddCompletionQueue();
     server_ = builder.BuildAndStart();
index 5153b5c..b3b68be 100644 (file)
@@ -27,6 +27,8 @@
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
@@ -57,8 +59,8 @@ class ProtoServerReflectionTest : public ::testing::Test {
     std::shared_ptr<Channel> channel =
         grpc::CreateChannel(target, InsecureChannelCredentials());
     stub_ = grpc::testing::EchoTestService::NewStub(channel);
-    desc_db_.reset(new ProtoReflectionDescriptorDatabase(channel));
-    desc_pool_.reset(new protobuf::DescriptorPool(desc_db_.get()));
+    desc_db_ = absl::make_unique<ProtoReflectionDescriptorDatabase>(channel);
+    desc_pool_ = absl::make_unique<protobuf::DescriptorPool>(desc_db_.get());
   }
 
   string to_string(const int number) {
@@ -133,7 +135,7 @@ TEST_F(ProtoServerReflectionTest, CheckResponseWithLocalDescriptorPool) {
   std::vector<std::string> services;
   desc_db_->GetServices(&services);
   // The service list has at least one service (reflection servcie).
-  EXPECT_TRUE(services.size() > 0);
+  EXPECT_TRUE(!services.empty());
 
   for (auto it = services.begin(); it != services.end(); ++it) {
     CompareService(*it);
index 184dc1e..31edffd 100644 (file)
@@ -110,8 +110,8 @@ class RawEnd2EndTest : public ::testing::Test {
     void* ignored_tag;
     bool ignored_ok;
     cq_->Shutdown();
-    while (cq_->Next(&ignored_tag, &ignored_ok))
-      ;
+    while (cq_->Next(&ignored_tag, &ignored_ok)) {
+    }
     stub_.reset();
     grpc_recycle_unused_port(port_);
   }
index 5583da8..8f36d0c 100644 (file)
@@ -31,6 +31,8 @@
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
@@ -138,7 +140,7 @@ class ServerBuilderPluginTest : public ::testing::TestWithParam<bool> {
 
   void SetUp() override {
     port_ = grpc_pick_unused_port_or_die();
-    builder_.reset(new ServerBuilder());
+    builder_ = absl::make_unique<ServerBuilder>();
   }
 
   void InsertPlugin() {
@@ -227,8 +229,8 @@ class ServerBuilderPluginTest : public ::testing::TestWithParam<bool> {
   void RunCQ() {
     void* tag;
     bool ok;
-    while (cq_->Next(&tag, &ok))
-      ;
+    while (cq_->Next(&tag, &ok)) {
+    }
   }
 };
 
index 22a0d44..b26ddaa 100644 (file)
@@ -26,6 +26,8 @@
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/core/util/port.h"
@@ -36,7 +38,6 @@
 
 using grpc::testing::EchoRequest;
 using grpc::testing::EchoResponse;
-using std::chrono::system_clock;
 
 static std::string g_root;
 
@@ -99,7 +100,8 @@ class CrashTest : public ::testing::Test {
     std::ostringstream addr_stream;
     addr_stream << "localhost:" << port;
     auto addr = addr_stream.str();
-    client_.reset(new SubProcess({g_root + "/server_crash_test_client",
+    client_ = absl::make_unique<SubProcess>(
+        std::vector<std::string>({g_root + "/server_crash_test_client",
                                   "--address=" + addr, "--mode=" + mode}));
     GPR_ASSERT(client_);
 
index b261560..57d04a1 100644 (file)
  *
  */
 
-#include <gflags/gflags.h>
-#include <iostream>
-#include <memory>
-#include <sstream>
-#include <string>
-
 #include <grpc/support/log.h>
 #include <grpcpp/channel.h>
 #include <grpcpp/client_context.h>
 #include <grpcpp/create_channel.h>
 
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+
+#include "absl/flags/flag.h"
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/cpp/util/test_config.h"
 
-DEFINE_string(address, "", "Address to connect to");
-DEFINE_string(mode, "", "Test mode to use");
+ABSL_FLAG(std::string, address, "", "Address to connect to");
+ABSL_FLAG(std::string, mode, "", "Test mode to use");
 
 using grpc::testing::EchoRequest;
 using grpc::testing::EchoResponse;
 
 int main(int argc, char** argv) {
   grpc::testing::InitTest(&argc, &argv, true);
-  auto stub = grpc::testing::EchoTestService::NewStub(
-      grpc::CreateChannel(FLAGS_address, grpc::InsecureChannelCredentials()));
+  auto stub = grpc::testing::EchoTestService::NewStub(grpc::CreateChannel(
+      absl::GetFlag(FLAGS_address), grpc::InsecureChannelCredentials()));
 
   EchoRequest request;
   EchoResponse response;
   grpc::ClientContext context;
   context.set_wait_for_ready(true);
 
-  if (FLAGS_mode == "bidi") {
+  if (absl::GetFlag(FLAGS_mode) == "bidi") {
     auto stream = stub->BidiStream(&context);
     for (int i = 0;; i++) {
       std::ostringstream msg;
@@ -56,7 +56,7 @@ int main(int argc, char** argv) {
       GPR_ASSERT(stream->Read(&response));
       GPR_ASSERT(response.message() == request.message());
     }
-  } else if (FLAGS_mode == "response") {
+  } else if (absl::GetFlag(FLAGS_mode) == "response") {
     EchoRequest request;
     request.set_message("Hello");
     auto stream = stub->ResponseStream(&context, request);
@@ -64,7 +64,8 @@ int main(int argc, char** argv) {
       GPR_ASSERT(stream->Read(&response));
     }
   } else {
-    gpr_log(GPR_ERROR, "invalid test mode '%s'", FLAGS_mode.c_str());
+    gpr_log(GPR_ERROR, "invalid test mode '%s'",
+            absl::GetFlag(FLAGS_mode).c_str());
     return 1;
   }
 
index 49bf45e..c8c5bbe 100644 (file)
@@ -115,7 +115,7 @@ class ServerEarlyReturnTest : public ::testing::Test {
   void SetUp() override {
     int port = grpc_pick_unused_port_or_die();
     picked_port_ = port;
-    server_address_ << "127.0.0.1:" << port;
+    server_address_ << "localhost:" << port;
     ServerBuilder builder;
     builder.AddListeningPort(server_address_.str(),
                              InsecureServerCredentials());
index 25e64f7..4c90514 100644 (file)
@@ -29,6 +29,9 @@
 #include <grpcpp/server_context.h>
 #include <grpcpp/support/server_interceptor.h>
 
+#include "absl/memory/memory.h"
+#include "absl/strings/match.h"
+
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
@@ -96,8 +99,8 @@ class LoggingInterceptor : public experimental::Interceptor {
       bool found = false;
       // Check that we received the metadata as an echo
       for (const auto& pair : *map) {
-        found = pair.first.find("testkey") == 0 &&
-                pair.second.find("testvalue") == 0;
+        found = absl::StartsWith(pair.first, "testkey") &&
+                absl::StartsWith(pair.second, "testvalue");
         if (found) break;
       }
       EXPECT_EQ(found, true);
@@ -138,7 +141,7 @@ class LoggingInterceptor : public experimental::Interceptor {
 class LoggingInterceptorFactory
     : public experimental::ServerInterceptorFactoryInterface {
  public:
-  virtual experimental::Interceptor* CreateServerInterceptor(
+  experimental::Interceptor* CreateServerInterceptor(
       experimental::ServerRpcInfo* info) override {
     return new LoggingInterceptor(info);
   }
@@ -168,7 +171,7 @@ class SyncSendMessageTester : public experimental::Interceptor {
 class SyncSendMessageTesterFactory
     : public experimental::ServerInterceptorFactoryInterface {
  public:
-  virtual experimental::Interceptor* CreateServerInterceptor(
+  experimental::Interceptor* CreateServerInterceptor(
       experimental::ServerRpcInfo* info) override {
     return new SyncSendMessageTester(info);
   }
@@ -203,7 +206,7 @@ class SyncSendMessageVerifier : public experimental::Interceptor {
 class SyncSendMessageVerifierFactory
     : public experimental::ServerInterceptorFactoryInterface {
  public:
-  virtual experimental::Interceptor* CreateServerInterceptor(
+  experimental::Interceptor* CreateServerInterceptor(
       experimental::ServerRpcInfo* info) override {
     return new SyncSendMessageVerifier(info);
   }
@@ -251,10 +254,8 @@ class ServerInterceptorsEnd2endSyncUnaryTest : public ::testing::Test {
             new LoggingInterceptorFactory()));
     // Add 20 dummy interceptor factories and null interceptor factories
     for (auto i = 0; i < 20; i++) {
-      creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-          new DummyInterceptorFactory()));
-      creators.push_back(std::unique_ptr<NullInterceptorFactory>(
-          new NullInterceptorFactory()));
+      creators.push_back(absl::make_unique<DummyInterceptorFactory>());
+      creators.push_back(absl::make_unique<NullInterceptorFactory>());
     }
     builder.experimental().SetInterceptorCreators(std::move(creators));
     server_ = builder.BuildAndStart();
@@ -297,8 +298,7 @@ class ServerInterceptorsEnd2endSyncStreamingTest : public ::testing::Test {
         std::unique_ptr<experimental::ServerInterceptorFactoryInterface>(
             new LoggingInterceptorFactory()));
     for (auto i = 0; i < 20; i++) {
-      creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-          new DummyInterceptorFactory()));
+      creators.push_back(absl::make_unique<DummyInterceptorFactory>());
     }
     builder.experimental().SetInterceptorCreators(std::move(creators));
     server_ = builder.BuildAndStart();
@@ -354,8 +354,7 @@ TEST_F(ServerInterceptorsAsyncEnd2endTest, UnaryTest) {
       std::unique_ptr<experimental::ServerInterceptorFactoryInterface>(
           new LoggingInterceptorFactory()));
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   builder.experimental().SetInterceptorCreators(std::move(creators));
   auto cq = builder.AddCompletionQueue();
@@ -408,8 +407,8 @@ TEST_F(ServerInterceptorsAsyncEnd2endTest, UnaryTest) {
   cq->Shutdown();
   void* ignored_tag;
   bool ignored_ok;
-  while (cq->Next(&ignored_tag, &ignored_ok))
-    ;
+  while (cq->Next(&ignored_tag, &ignored_ok)) {
+  }
   grpc_recycle_unused_port(port);
 }
 
@@ -427,8 +426,7 @@ TEST_F(ServerInterceptorsAsyncEnd2endTest, BidiStreamingTest) {
       std::unique_ptr<experimental::ServerInterceptorFactoryInterface>(
           new LoggingInterceptorFactory()));
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   builder.experimental().SetInterceptorCreators(std::move(creators));
   auto cq = builder.AddCompletionQueue();
@@ -491,8 +489,8 @@ TEST_F(ServerInterceptorsAsyncEnd2endTest, BidiStreamingTest) {
   cq->Shutdown();
   void* ignored_tag;
   bool ignored_ok;
-  while (cq->Next(&ignored_tag, &ignored_ok))
-    ;
+  while (cq->Next(&ignored_tag, &ignored_ok)) {
+  }
   grpc_recycle_unused_port(port);
 }
 
@@ -508,8 +506,7 @@ TEST_F(ServerInterceptorsAsyncEnd2endTest, GenericRPCTest) {
       creators;
   creators.reserve(20);
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   builder.experimental().SetInterceptorCreators(std::move(creators));
   auto srv_cq = builder.AddCompletionQueue();
@@ -597,10 +594,10 @@ TEST_F(ServerInterceptorsAsyncEnd2endTest, GenericRPCTest) {
   server->Shutdown();
   void* ignored_tag;
   bool ignored_ok;
-  while (cli_cq.Next(&ignored_tag, &ignored_ok))
-    ;
-  while (srv_cq->Next(&ignored_tag, &ignored_ok))
-    ;
+  while (cli_cq.Next(&ignored_tag, &ignored_ok)) {
+  }
+  while (srv_cq->Next(&ignored_tag, &ignored_ok)) {
+  }
   grpc_recycle_unused_port(port);
 }
 
@@ -614,8 +611,7 @@ TEST_F(ServerInterceptorsAsyncEnd2endTest, UnimplementedRpcTest) {
       creators;
   creators.reserve(20);
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   builder.experimental().SetInterceptorCreators(std::move(creators));
   auto cq = builder.AddCompletionQueue();
@@ -648,8 +644,8 @@ TEST_F(ServerInterceptorsAsyncEnd2endTest, UnimplementedRpcTest) {
   cq->Shutdown();
   void* ignored_tag;
   bool ignored_ok;
-  while (cq->Next(&ignored_tag, &ignored_ok))
-    ;
+  while (cq->Next(&ignored_tag, &ignored_ok)) {
+  }
   grpc_recycle_unused_port(port);
 }
 
@@ -668,8 +664,7 @@ TEST_F(ServerInterceptorsSyncUnimplementedEnd2endTest, UnimplementedRpcTest) {
       creators;
   creators.reserve(20);
   for (auto i = 0; i < 20; i++) {
-    creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
-        new DummyInterceptorFactory()));
+    creators.push_back(absl::make_unique<DummyInterceptorFactory>());
   }
   builder.experimental().SetInterceptorCreators(std::move(creators));
   auto server = builder.BuildAndStart();
index d9a6608..3855124 100644 (file)
@@ -24,6 +24,7 @@
 #include <string>
 #include <thread>
 
+#include "absl/memory/memory.h"
 #include "absl/strings/str_cat.h"
 
 #include <grpc/grpc.h>
@@ -56,6 +57,7 @@
 
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/core/util/port.h"
+#include "test/core/util/resolve_localhost_ip46.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/end2end/test_service_impl.h"
 
@@ -64,7 +66,6 @@
 
 using grpc::testing::EchoRequest;
 using grpc::testing::EchoResponse;
-using std::chrono::system_clock;
 
 namespace grpc {
 namespace testing {
@@ -131,6 +132,11 @@ class ServiceConfigEnd2endTest : public ::testing::Test {
     grpc_init();
     response_generator_ =
         grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
+    bool localhost_resolves_to_ipv4 = false;
+    bool localhost_resolves_to_ipv6 = false;
+    grpc_core::LocalhostResolves(&localhost_resolves_to_ipv4,
+                                 &localhost_resolves_to_ipv6);
+    ipv6_only_ = !localhost_resolves_to_ipv4 && localhost_resolves_to_ipv6;
   }
 
   void TearDown() override {
@@ -143,7 +149,7 @@ class ServiceConfigEnd2endTest : public ::testing::Test {
     stub_.reset();
     servers_.clear();
     creds_.reset();
-    grpc_shutdown_blocking();
+    grpc_shutdown();
   }
 
   void CreateServers(size_t num_servers,
@@ -169,7 +175,8 @@ class ServiceConfigEnd2endTest : public ::testing::Test {
   grpc_core::Resolver::Result BuildFakeResults(const std::vector<int>& ports) {
     grpc_core::Resolver::Result result;
     for (const int& port : ports) {
-      std::string lb_uri_str = absl::StrCat("ipv4:127.0.0.1:", port);
+      std::string lb_uri_str =
+          absl::StrCat(ipv6_only_ ? "ipv6:[::1]:" : "ipv4:127.0.0.1:", port);
       grpc_uri* lb_uri = grpc_uri_parse(lb_uri_str.c_str(), true);
       GPR_ASSERT(lb_uri != nullptr);
       grpc_resolved_address address;
@@ -311,8 +318,8 @@ class ServiceConfigEnd2endTest : public ::testing::Test {
       grpc::internal::Mutex mu;
       grpc::internal::MutexLock lock(&mu);
       grpc::internal::CondVar cond;
-      thread_.reset(new std::thread(
-          std::bind(&ServerData::Serve, this, server_host, &mu, &cond)));
+      thread_ = absl::make_unique<std::thread>(
+          std::bind(&ServerData::Serve, this, server_host, &mu, &cond));
       cond.WaitUntil(&mu, [this] { return server_ready_; });
       server_ready_ = false;
       gpr_log(GPR_INFO, "server startup complete");
@@ -422,6 +429,7 @@ class ServiceConfigEnd2endTest : public ::testing::Test {
     return "{\"version\": \"invalid_default\"";
   }
 
+  bool ipv6_only_ = false;
   const std::string server_host_;
   std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
   std::vector<std::unique_ptr<ServerData>> servers_;
index f225206..bfc0d1e 100644 (file)
@@ -42,7 +42,6 @@
 
 using grpc::testing::EchoRequest;
 using grpc::testing::EchoResponse;
-using std::chrono::system_clock;
 
 const char* kLargeString =
     "("
index 31432d9..c90c070 100644 (file)
@@ -36,8 +36,6 @@
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/cpp/util/string_ref_helper.h"
 
-using std::chrono::system_clock;
-
 namespace grpc {
 namespace testing {
 
index 01b46e1..eeb93ce 100644 (file)
@@ -42,7 +42,6 @@
 
 using grpc::testing::EchoRequest;
 using grpc::testing::EchoResponse;
-using std::chrono::system_clock;
 
 const int kNumThreads = 100;  // Number of threads
 const int kNumAsyncSendThreads = 2;
@@ -207,8 +206,8 @@ class CommonStressTestAsyncServer : public BaseClass {
 
     void* ignored_tag;
     bool ignored_ok;
-    while (cq_->Next(&ignored_tag, &ignored_ok))
-      ;
+    while (cq_->Next(&ignored_tag, &ignored_ok)) {
+    }
     this->TearDownEnd();
   }
 
@@ -342,8 +341,8 @@ class AsyncClientEnd2endTest : public ::testing::Test {
   void TearDown() override {
     void* ignored_tag;
     bool ignored_ok;
-    while (cq_.Next(&ignored_tag, &ignored_ok))
-      ;
+    while (cq_.Next(&ignored_tag, &ignored_ok)) {
+    }
     common_.TearDown();
   }
 
index 0669143..9f1bc15 100644 (file)
@@ -26,6 +26,8 @@
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/core/lib/iomgr/timer.h"
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
 #include "test/core/util/port.h"
@@ -133,7 +135,7 @@ class TimeChangeTest : public ::testing::Test {
     std::ostringstream addr_stream;
     addr_stream << "localhost:" << port;
     server_address_ = addr_stream.str();
-    server_.reset(new SubProcess({
+    server_ = absl::make_unique<SubProcess>(std::vector<std::string>({
         g_root + "/client_crash_test_server",
         "--address=" + server_address_,
     }));
@@ -148,14 +150,14 @@ class TimeChangeTest : public ::testing::Test {
 
   static void TearDownTestCase() { server_.reset(); }
 
-  void SetUp() {
+  void SetUp() override {
     channel_ =
         grpc::CreateChannel(server_address_, InsecureChannelCredentials());
     GPR_ASSERT(channel_);
     stub_ = grpc::testing::EchoTestService::NewStub(channel_);
   }
 
-  void TearDown() { reset_now_offset(); }
+  void TearDown() override { reset_now_offset(); }
 
   std::unique_ptr<grpc::testing::EchoTestService::Stub> CreateStub() {
     return grpc::testing::EchoTestService::NewStub(channel_);
diff --git a/test/cpp/end2end/xds_credentials_end2end_test.cc b/test/cpp/end2end/xds_credentials_end2end_test.cc
new file mode 100644 (file)
index 0000000..a5ea1bd
--- /dev/null
@@ -0,0 +1,86 @@
+//
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include <grpc/grpc.h>
+#include <grpcpp/server_builder.h>
+
+#include "test/core/util/port.h"
+#include "test/core/util/test_config.h"
+#include "test/cpp/end2end/test_service_impl.h"
+#include "test/cpp/util/test_credentials_provider.h"
+
+namespace grpc {
+namespace testing {
+namespace {
+
+class XdsCredentialsEnd2EndFallbackTest
+    : public ::testing::TestWithParam<const char*> {
+ protected:
+  XdsCredentialsEnd2EndFallbackTest() {
+    int port = grpc_pick_unused_port_or_die();
+    ServerBuilder builder;
+    server_address_ = "localhost:" + std::to_string(port);
+    builder.AddListeningPort(
+        server_address_,
+        GetCredentialsProvider()->GetServerCredentials(GetParam()));
+    builder.RegisterService(&service_);
+    server_ = builder.BuildAndStart();
+  }
+
+  std::string server_address_;
+  TestServiceImpl service_;
+  std::unique_ptr<Server> server_;
+};
+
+TEST_P(XdsCredentialsEnd2EndFallbackTest, NoXdsSchemeInTarget) {
+  // Target does not use 'xds:///' scheme and should result in using fallback
+  // credentials.
+  ChannelArguments args;
+  auto channel = grpc::CreateCustomChannel(
+      server_address_,
+      grpc::experimental::XdsCredentials(
+          GetCredentialsProvider()->GetChannelCredentials(GetParam(), &args)),
+      args);
+  auto stub = grpc::testing::EchoTestService::NewStub(channel);
+  ClientContext ctx;
+  EchoRequest req;
+  req.set_message("Hello");
+  EchoResponse resp;
+  Status s = stub->Echo(&ctx, req, &resp);
+  EXPECT_EQ(s.ok(), true);
+  EXPECT_EQ(resp.message(), "Hello");
+}
+
+INSTANTIATE_TEST_SUITE_P(XdsCredentialsEnd2EndFallback,
+                         XdsCredentialsEnd2EndFallbackTest,
+                         ::testing::ValuesIn(std::vector<const char*>(
+                             {kInsecureCredentialsType, kTlsCredentialsType})));
+
+}  // namespace
+}  // namespace testing
+}  // namespace grpc
+
+int main(int argc, char** argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+  grpc::testing::TestEnvironment env(argc, argv);
+  const auto result = RUN_ALL_TESTS();
+  return result;
+}
index 97be5d6..2af66f8 100644 (file)
@@ -29,6 +29,7 @@
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
+#include "absl/memory/memory.h"
 #include "absl/strings/str_cat.h"
 #include "absl/types/optional.h"
 
@@ -61,6 +62,7 @@
 #include "src/cpp/server/secure_server_credentials.h"
 
 #include "test/core/util/port.h"
+#include "test/core/util/resolve_localhost_ip46.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/end2end/test_service_impl.h"
 
@@ -430,6 +432,8 @@ class ClientStats {
   std::map<std::string, uint64_t> dropped_requests_;
 };
 
+// TODO(roth) move all of the code that deals with default resource contents out
+// of AdsServiceImpl and into XdsEnd2EndTest.
 class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
  public:
   struct ResponseState {
@@ -440,7 +444,7 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
 
   struct EdsResourceArgs {
     struct Locality {
-      Locality(const std::string& sub_zone, std::vector<int> ports,
+      Locality(std::string sub_zone, std::vector<int> ports,
                int lb_weight = kDefaultLocalityWeight,
                int priority = kDefaultLocalityPriority,
                std::vector<HealthStatus> health_statuses = {})
@@ -467,32 +471,9 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
         FractionalPercent::MILLION;
   };
 
-  explicit AdsServiceImpl(bool enable_load_reporting)
+  AdsServiceImpl()
       : v2_rpc_service_(this, /*is_v2=*/true),
-        v3_rpc_service_(this, /*is_v2=*/false) {
-    // Construct RDS response data.
-    default_route_config_.set_name(kDefaultRouteConfigurationName);
-    auto* virtual_host = default_route_config_.add_virtual_hosts();
-    virtual_host->add_domains("*");
-    auto* route = virtual_host->add_routes();
-    route->mutable_match()->set_prefix("");
-    route->mutable_route()->set_cluster(kDefaultClusterName);
-    SetRdsResource(default_route_config_);
-    // Construct LDS response data (with inlined RDS result).
-    default_listener_ = BuildListener(default_route_config_);
-    SetLdsResource(default_listener_);
-    // Construct CDS response data.
-    default_cluster_.set_name(kDefaultClusterName);
-    default_cluster_.set_type(Cluster::EDS);
-    auto* eds_config = default_cluster_.mutable_eds_cluster_config();
-    eds_config->mutable_eds_config()->mutable_ads();
-    eds_config->set_service_name(kDefaultEdsServiceName);
-    default_cluster_.set_lb_policy(Cluster::ROUND_ROBIN);
-    if (enable_load_reporting) {
-      default_cluster_.mutable_lrs_server()->mutable_self();
-    }
-    SetCdsResource(default_cluster_);
-  }
+        v3_rpc_service_(this, /*is_v2=*/false) {}
 
   bool seen_v2_client() const { return seen_v2_client_; }
   bool seen_v3_client() const { return seen_v3_client_; }
@@ -507,12 +488,6 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
     return &v3_rpc_service_;
   }
 
-  Listener default_listener() const { return default_listener_; }
-  RouteConfiguration default_route_config() const {
-    return default_route_config_;
-  }
-  Cluster default_cluster() const { return default_cluster_; }
-
   ResponseState lds_response_state() {
     grpc_core::MutexLock lock(&ads_mu_);
     return resource_type_response_state_[kLdsTypeUrl];
@@ -538,14 +513,24 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
     resource_types_to_ignore_.emplace(type_url);
   }
 
+  void SetResourceMinVersion(const std::string& type_url, int version) {
+    grpc_core::MutexLock lock(&ads_mu_);
+    resource_type_min_versions_[type_url] = version;
+  }
+
   void UnsetResource(const std::string& type_url, const std::string& name) {
     grpc_core::MutexLock lock(&ads_mu_);
-    ResourceState& state = resource_map_[type_url][name];
-    ++state.version;
-    state.resource.reset();
-    gpr_log(GPR_INFO, "ADS[%p]: Unsetting %s resource %s to version %u", this,
-            type_url.c_str(), name.c_str(), state.version);
-    for (SubscriptionState* subscription : state.subscriptions) {
+    ResourceTypeState& resource_type_state = resource_map_[type_url];
+    ++resource_type_state.resource_type_version;
+    ResourceState& resource_state = resource_type_state.resource_name_map[name];
+    resource_state.resource_type_version =
+        resource_type_state.resource_type_version;
+    resource_state.resource.reset();
+    gpr_log(GPR_INFO,
+            "ADS[%p]: Unsetting %s resource %s; resource_type_version now %u",
+            this, type_url.c_str(), name.c_str(),
+            resource_type_state.resource_type_version);
+    for (SubscriptionState* subscription : resource_state.subscriptions) {
       subscription->update_queue->emplace_back(type_url, name);
     }
   }
@@ -553,12 +538,17 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
   void SetResource(google::protobuf::Any resource, const std::string& type_url,
                    const std::string& name) {
     grpc_core::MutexLock lock(&ads_mu_);
-    ResourceState& state = resource_map_[type_url][name];
-    ++state.version;
-    state.resource = std::move(resource);
-    gpr_log(GPR_INFO, "ADS[%p]: Updating %s resource %s to version %u", this,
-            type_url.c_str(), name.c_str(), state.version);
-    for (SubscriptionState* subscription : state.subscriptions) {
+    ResourceTypeState& resource_type_state = resource_map_[type_url];
+    ++resource_type_state.resource_type_version;
+    ResourceState& resource_state = resource_type_state.resource_name_map[name];
+    resource_state.resource_type_version =
+        resource_type_state.resource_type_version;
+    resource_state.resource = std::move(resource);
+    gpr_log(GPR_INFO,
+            "ADS[%p]: Updating %s resource %s; resource_type_version now %u",
+            this, type_url.c_str(), name.c_str(),
+            resource_type_state.resource_type_version);
+    for (SubscriptionState* subscription : resource_state.subscriptions) {
       subscription->update_queue->emplace_back(type_url, name);
     }
   }
@@ -587,68 +577,6 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
     SetResource(std::move(resource), kEdsTypeUrl, assignment.cluster_name());
   }
 
-  void SetLdsToUseDynamicRds() {
-    auto listener = default_listener_;
-    HttpConnectionManager http_connection_manager;
-    auto* rds = http_connection_manager.mutable_rds();
-    rds->set_route_config_name(kDefaultRouteConfigurationName);
-    rds->mutable_config_source()->mutable_ads();
-    listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
-        http_connection_manager);
-    SetLdsResource(listener);
-  }
-
-  static Listener BuildListener(const RouteConfiguration& route_config) {
-    HttpConnectionManager http_connection_manager;
-    *(http_connection_manager.mutable_route_config()) = route_config;
-    Listener listener;
-    listener.set_name(kServerName);
-    listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
-        http_connection_manager);
-    return listener;
-  }
-
-  static ClusterLoadAssignment BuildEdsResource(
-      const EdsResourceArgs& args,
-      const char* eds_service_name = kDefaultEdsServiceName) {
-    ClusterLoadAssignment assignment;
-    assignment.set_cluster_name(eds_service_name);
-    for (const auto& locality : args.locality_list) {
-      auto* endpoints = assignment.add_endpoints();
-      endpoints->mutable_load_balancing_weight()->set_value(locality.lb_weight);
-      endpoints->set_priority(locality.priority);
-      endpoints->mutable_locality()->set_region(kDefaultLocalityRegion);
-      endpoints->mutable_locality()->set_zone(kDefaultLocalityZone);
-      endpoints->mutable_locality()->set_sub_zone(locality.sub_zone);
-      for (size_t i = 0; i < locality.ports.size(); ++i) {
-        const int& port = locality.ports[i];
-        auto* lb_endpoints = endpoints->add_lb_endpoints();
-        if (locality.health_statuses.size() > i &&
-            locality.health_statuses[i] != HealthStatus::UNKNOWN) {
-          lb_endpoints->set_health_status(locality.health_statuses[i]);
-        }
-        auto* endpoint = lb_endpoints->mutable_endpoint();
-        auto* address = endpoint->mutable_address();
-        auto* socket_address = address->mutable_socket_address();
-        socket_address->set_address("127.0.0.1");
-        socket_address->set_port_value(port);
-      }
-    }
-    if (!args.drop_categories.empty()) {
-      auto* policy = assignment.mutable_policy();
-      for (const auto& p : args.drop_categories) {
-        const std::string& name = p.first;
-        const uint32_t parts_per_million = p.second;
-        auto* drop_overload = policy->add_drop_overloads();
-        drop_overload->set_category(name);
-        auto* drop_percentage = drop_overload->mutable_drop_percentage();
-        drop_percentage->set_numerator(parts_per_million);
-        drop_percentage->set_denominator(args.drop_denominator);
-      }
-    }
-    return assignment;
-  }
-
   void Start() {
     grpc_core::MutexLock lock(&ads_mu_);
     ads_done_ = false;
@@ -688,8 +616,6 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
 
   // A struct representing a client's subscription to a particular resource.
   struct SubscriptionState {
-    // Version that the client currently knows about.
-    int current_version = 0;
     // The queue upon which to place updates when the resource is updated.
     UpdateQueue* update_queue;
   };
@@ -700,20 +626,32 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
   using SubscriptionMap =
       std::map<std::string /* type_url */, SubscriptionNameMap>;
 
-  // A struct representing the current state for a resource:
-  // - the version of the resource that is set by the SetResource() methods.
-  // - a list of subscriptions interested in this resource.
+  // Sent state for a given resource type.
+  struct SentState {
+    int nonce = 0;
+    int resource_type_version = 0;
+  };
+
+  // A struct representing the current state for an individual resource.
   struct ResourceState {
-    int version = 0;
+    // The resource itself, if present.
     absl::optional<google::protobuf::Any> resource;
+    // The resource type version that this resource was last updated in.
+    int resource_type_version = 0;
+    // A list of subscriptions to this resource.
     std::set<SubscriptionState*> subscriptions;
   };
 
-  // A struct representing the current state for all resources:
-  // LDS, CDS, EDS, and RDS for the class as a whole.
+  // The current state for all individual resources of a given type.
   using ResourceNameMap =
       std::map<std::string /* resource_name */, ResourceState>;
-  using ResourceMap = std::map<std::string /* type_url */, ResourceNameMap>;
+
+  struct ResourceTypeState {
+    int resource_type_version = 0;
+    ResourceNameMap resource_name_map;
+  };
+
+  using ResourceMap = std::map<std::string /* type_url */, ResourceTypeState>;
 
   template <class RpcApi, class DiscoveryRequest, class DiscoveryResponse>
   class RpcService : public RpcApi::Service {
@@ -732,201 +670,101 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
       } else {
         parent_->seen_v3_client_ = true;
       }
+      // Balancer shouldn't receive the call credentials metadata.
+      EXPECT_EQ(context->client_metadata().find(g_kCallCredsMdKey),
+                context->client_metadata().end());
+      // Take a reference of the AdsServiceImpl object, which will go
+      // out of scope when this request handler returns.  This ensures
+      // that the parent won't be destroyed until this stream is complete.
+      std::shared_ptr<AdsServiceImpl> ads_service_impl =
+          parent_->shared_from_this();
       // Resources (type/name pairs) that have changed since the client
       // subscribed to them.
       UpdateQueue update_queue;
       // Resources that the client will be subscribed to keyed by resource type
       // url.
       SubscriptionMap subscription_map;
-      [&]() {
+      // Sent state for each resource type.
+      std::map<std::string /*type_url*/, SentState> sent_state_map;
+      // Spawn a thread to read requests from the stream.
+      // Requests will be delivered to this thread in a queue.
+      std::deque<DiscoveryRequest> requests;
+      bool stream_closed = false;
+      std::thread reader(std::bind(&RpcService::BlockingRead, this, stream,
+                                   &requests, &stream_closed));
+      // Main loop to process requests and updates.
+      while (true) {
+        // Boolean to keep track if the loop received any work to do: a
+        // request or an update; regardless whether a response was actually
+        // sent out.
+        bool did_work = false;
+        // Look for new requests and and decide what to handle.
+        absl::optional<DiscoveryResponse> response;
         {
           grpc_core::MutexLock lock(&parent_->ads_mu_);
-          if (parent_->ads_done_) return;
-        }
-        // Balancer shouldn't receive the call credentials metadata.
-        EXPECT_EQ(context->client_metadata().find(g_kCallCredsMdKey),
-                  context->client_metadata().end());
-        // Current Version map keyed by resource type url.
-        std::map<std::string, int> resource_type_version;
-        // Creating blocking thread to read from stream.
-        std::deque<DiscoveryRequest> requests;
-        bool stream_closed = false;
-        // Take a reference of the AdsServiceImpl object, reference will go
-        // out of scope after the reader thread is joined.
-        std::shared_ptr<AdsServiceImpl> ads_service_impl =
-            parent_->shared_from_this();
-        std::thread reader(std::bind(&RpcService::BlockingRead, this, stream,
-                                     &requests, &stream_closed));
-        // Main loop to look for requests and updates.
-        while (true) {
-          // Look for new requests and and decide what to handle.
-          absl::optional<DiscoveryResponse> response;
-          // Boolean to keep track if the loop received any work to do: a
-          // request or an update; regardless whether a response was actually
-          // sent out.
-          bool did_work = false;
-          {
-            grpc_core::MutexLock lock(&parent_->ads_mu_);
-            if (stream_closed) break;
-            if (!requests.empty()) {
-              DiscoveryRequest request = std::move(requests.front());
-              requests.pop_front();
-              did_work = true;
-              gpr_log(GPR_INFO,
-                      "ADS[%p]: Received request for type %s with content %s",
-                      this, request.type_url().c_str(),
-                      request.DebugString().c_str());
-              const std::string v3_resource_type =
-                  TypeUrlToV3(request.type_url());
-              // As long as we are not in shutdown, identify ACK and NACK by
-              // looking for version information and comparing it to nonce (this
-              // server ensures they are always set to the same in a response.)
-              auto it =
-                  parent_->resource_type_response_state_.find(v3_resource_type);
-              if (it != parent_->resource_type_response_state_.end()) {
-                if (!request.response_nonce().empty()) {
-                  it->second.state =
-                      (!request.version_info().empty() &&
-                       request.version_info() == request.response_nonce())
-                          ? ResponseState::ACKED
-                          : ResponseState::NACKED;
-                }
-                if (request.has_error_detail()) {
-                  it->second.error_message = request.error_detail().message();
-                }
-              }
-              // As long as the test did not tell us to ignore this type of
-              // request, look at all the resource names.
-              if (parent_->resource_types_to_ignore_.find(v3_resource_type) ==
-                  parent_->resource_types_to_ignore_.end()) {
-                auto& subscription_name_map =
-                    subscription_map[v3_resource_type];
-                auto& resource_name_map =
-                    parent_->resource_map_[v3_resource_type];
-                std::set<std::string> resources_in_current_request;
-                std::set<std::string> resources_added_to_response;
-                for (const std::string& resource_name :
-                     request.resource_names()) {
-                  resources_in_current_request.emplace(resource_name);
-                  auto& subscription_state =
-                      subscription_name_map[resource_name];
-                  auto& resource_state = resource_name_map[resource_name];
-                  // Subscribe if needed.
-                  parent_->MaybeSubscribe(v3_resource_type, resource_name,
-                                          &subscription_state, &resource_state,
-                                          &update_queue);
-                  // Send update if needed.
-                  if (ClientNeedsResourceUpdate(resource_state,
-                                                &subscription_state)) {
-                    gpr_log(GPR_INFO,
-                            "ADS[%p]: Sending update for type=%s name=%s "
-                            "version=%d",
-                            this, request.type_url().c_str(),
-                            resource_name.c_str(), resource_state.version);
-                    resources_added_to_response.emplace(resource_name);
-                    if (!response.has_value()) response.emplace();
-                    if (resource_state.resource.has_value()) {
-                      auto* resource = response->add_resources();
-                      resource->CopyFrom(resource_state.resource.value());
-                      if (is_v2_) {
-                        resource->set_type_url(request.type_url());
-                      }
-                    }
-                  } else {
-                    gpr_log(GPR_INFO,
-                            "ADS[%p]: client does not need update for "
-                            "type=%s name=%s version=%d",
-                            this, request.type_url().c_str(),
-                            resource_name.c_str(), resource_state.version);
-                  }
-                }
-                // Process unsubscriptions for any resource no longer
-                // present in the request's resource list.
-                parent_->ProcessUnsubscriptions(
-                    v3_resource_type, resources_in_current_request,
-                    &subscription_name_map, &resource_name_map);
-                // Send response if needed.
-                if (!resources_added_to_response.empty()) {
-                  CompleteBuildingDiscoveryResponse(
-                      v3_resource_type, request.type_url(),
-                      ++resource_type_version[v3_resource_type],
-                      subscription_name_map, resources_added_to_response,
-                      &response.value());
-                }
-              }
-            }
-          }
-          if (response.has_value()) {
-            gpr_log(GPR_INFO, "ADS[%p]: Sending response: %s", this,
-                    response->DebugString().c_str());
-            stream->Write(response.value());
-          }
-          response.reset();
-          // Look for updates and decide what to handle.
-          {
-            grpc_core::MutexLock lock(&parent_->ads_mu_);
-            if (!update_queue.empty()) {
-              const std::string resource_type =
-                  std::move(update_queue.front().first);
-              const std::string resource_name =
-                  std::move(update_queue.front().second);
-              update_queue.pop_front();
-              const std::string v2_resource_type = TypeUrlToV2(resource_type);
-              did_work = true;
-              gpr_log(GPR_INFO, "ADS[%p]: Received update for type=%s name=%s",
-                      this, resource_type.c_str(), resource_name.c_str());
-              auto& subscription_name_map = subscription_map[resource_type];
-              auto& resource_name_map = parent_->resource_map_[resource_type];
-              auto it = subscription_name_map.find(resource_name);
-              if (it != subscription_name_map.end()) {
-                SubscriptionState& subscription_state = it->second;
-                ResourceState& resource_state =
-                    resource_name_map[resource_name];
-                if (ClientNeedsResourceUpdate(resource_state,
-                                              &subscription_state)) {
-                  gpr_log(
-                      GPR_INFO,
-                      "ADS[%p]: Sending update for type=%s name=%s version=%d",
-                      this, resource_type.c_str(), resource_name.c_str(),
-                      resource_state.version);
-                  response.emplace();
-                  if (resource_state.resource.has_value()) {
-                    auto* resource = response->add_resources();
-                    resource->CopyFrom(resource_state.resource.value());
-                    if (is_v2_) {
-                      resource->set_type_url(v2_resource_type);
-                    }
-                  }
-                  CompleteBuildingDiscoveryResponse(
-                      resource_type, v2_resource_type,
-                      ++resource_type_version[resource_type],
-                      subscription_name_map, {resource_name},
-                      &response.value());
-                }
-              }
-            }
+          // If the stream has been closed or our parent is being shut
+          // down, stop immediately.
+          if (stream_closed || parent_->ads_done_) break;
+          // Otherwise, see if there's a request to read from the queue.
+          if (!requests.empty()) {
+            DiscoveryRequest request = std::move(requests.front());
+            requests.pop_front();
+            did_work = true;
+            gpr_log(GPR_INFO,
+                    "ADS[%p]: Received request for type %s with content %s",
+                    this, request.type_url().c_str(),
+                    request.DebugString().c_str());
+            const std::string v3_resource_type =
+                TypeUrlToV3(request.type_url());
+            SentState& sent_state = sent_state_map[v3_resource_type];
+            // Process request.
+            ProcessRequest(request, v3_resource_type, &update_queue,
+                           &subscription_map, &sent_state, &response);
           }
-          if (response.has_value()) {
-            gpr_log(GPR_INFO, "ADS[%p]: Sending update response: %s", this,
-                    response->DebugString().c_str());
-            stream->Write(response.value());
+        }
+        if (response.has_value()) {
+          gpr_log(GPR_INFO, "ADS[%p]: Sending response: %s", this,
+                  response->DebugString().c_str());
+          stream->Write(response.value());
+        }
+        response.reset();
+        // Look for updates and decide what to handle.
+        {
+          grpc_core::MutexLock lock(&parent_->ads_mu_);
+          if (!update_queue.empty()) {
+            const std::string resource_type =
+                std::move(update_queue.front().first);
+            const std::string resource_name =
+                std::move(update_queue.front().second);
+            update_queue.pop_front();
+            did_work = true;
+            SentState& sent_state = sent_state_map[resource_type];
+            ProcessUpdate(resource_type, resource_name, &subscription_map,
+                          &sent_state, &response);
           }
-          // If we didn't find anything to do, delay before the next loop
-          // iteration; otherwise, check whether we should exit and then
-          // immediately continue.
-          gpr_timespec deadline =
-              grpc_timeout_milliseconds_to_deadline(did_work ? 0 : 10);
-          {
-            grpc_core::MutexLock lock(&parent_->ads_mu_);
-            if (!parent_->ads_cond_.WaitUntil(
-                    &parent_->ads_mu_, [this] { return parent_->ads_done_; },
-                    deadline)) {
-              break;
-            }
+        }
+        if (response.has_value()) {
+          gpr_log(GPR_INFO, "ADS[%p]: Sending update response: %s", this,
+                  response->DebugString().c_str());
+          stream->Write(response.value());
+        }
+        // If we didn't find anything to do, delay before the next loop
+        // iteration; otherwise, check whether we should exit and then
+        // immediately continue.
+        gpr_timespec deadline =
+            grpc_timeout_milliseconds_to_deadline(did_work ? 0 : 10);
+        {
+          grpc_core::MutexLock lock(&parent_->ads_mu_);
+          if (!parent_->ads_cond_.WaitUntil(
+                  &parent_->ads_mu_, [this] { return parent_->ads_done_; },
+                  deadline)) {
+            break;
           }
         }
-        reader.join();
-      }();
+      }
+      // Done with main loop.  Clean up before returning.
+      // Join reader thread.
+      reader.join();
       // Clean up any subscriptions that were still active when the call
       // finished.
       {
@@ -937,8 +775,9 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
           for (auto& q : subscription_name_map) {
             const std::string& resource_name = q.first;
             SubscriptionState& subscription_state = q.second;
-            ResourceState& resource_state =
-                parent_->resource_map_[type_url][resource_name];
+            ResourceNameMap& resource_name_map =
+                parent_->resource_map_[type_url].resource_name_map;
+            ResourceState& resource_state = resource_name_map[resource_name];
             resource_state.subscriptions.erase(&subscription_state);
           }
         }
@@ -949,20 +788,145 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
     }
 
    private:
-    static std::string TypeUrlToV2(const std::string& resource_type) {
-      if (resource_type == kLdsTypeUrl) return kLdsV2TypeUrl;
-      if (resource_type == kRdsTypeUrl) return kRdsV2TypeUrl;
-      if (resource_type == kCdsTypeUrl) return kCdsV2TypeUrl;
-      if (resource_type == kEdsTypeUrl) return kEdsV2TypeUrl;
-      return resource_type;
+    // Processes a response read from the client.
+    // Populates response if needed.
+    void ProcessRequest(const DiscoveryRequest& request,
+                        const std::string& v3_resource_type,
+                        UpdateQueue* update_queue,
+                        SubscriptionMap* subscription_map,
+                        SentState* sent_state,
+                        absl::optional<DiscoveryResponse>* response) {
+      // Determine client resource type version.
+      int client_resource_type_version = 0;
+      if (!request.version_info().empty()) {
+        GPR_ASSERT(absl::SimpleAtoi(request.version_info(),
+                                    &client_resource_type_version));
+      }
+      // Check the nonce sent by the client, if any.
+      // (This will be absent on the first request on a stream.)
+      if (request.response_nonce().empty()) {
+        EXPECT_GE(client_resource_type_version,
+                  parent_->resource_type_min_versions_[v3_resource_type])
+            << "resource_type: " << v3_resource_type;
+      } else {
+        int client_nonce;
+        GPR_ASSERT(absl::SimpleAtoi(request.response_nonce(), &client_nonce));
+        // Ignore requests with stale nonces.
+        if (client_nonce < sent_state->nonce) return;
+        // Check for ACK or NACK.
+        auto it = parent_->resource_type_response_state_.find(v3_resource_type);
+        if (it != parent_->resource_type_response_state_.end()) {
+          if (client_resource_type_version ==
+              sent_state->resource_type_version) {
+            it->second.state = ResponseState::ACKED;
+            it->second.error_message.clear();
+            gpr_log(GPR_INFO,
+                    "ADS[%p]: client ACKed resource_type=%s version=%s", this,
+                    request.type_url().c_str(), request.version_info().c_str());
+          } else {
+            it->second.state = ResponseState::NACKED;
+            EXPECT_EQ(request.error_detail().code(),
+                      GRPC_STATUS_INVALID_ARGUMENT);
+            it->second.error_message = request.error_detail().message();
+            gpr_log(GPR_INFO,
+                    "ADS[%p]: client NACKed resource_type=%s version=%s: %s",
+                    this, request.type_url().c_str(),
+                    request.version_info().c_str(),
+                    it->second.error_message.c_str());
+          }
+        }
+      }
+      // Ignore resource types as requested by tests.
+      if (parent_->resource_types_to_ignore_.find(v3_resource_type) !=
+          parent_->resource_types_to_ignore_.end()) {
+        return;
+      }
+      // Look at all the resource names in the request.
+      auto& subscription_name_map = (*subscription_map)[v3_resource_type];
+      auto& resource_type_state = parent_->resource_map_[v3_resource_type];
+      auto& resource_name_map = resource_type_state.resource_name_map;
+      std::set<std::string> resources_in_current_request;
+      std::set<std::string> resources_added_to_response;
+      for (const std::string& resource_name : request.resource_names()) {
+        resources_in_current_request.emplace(resource_name);
+        auto& subscription_state = subscription_name_map[resource_name];
+        auto& resource_state = resource_name_map[resource_name];
+        // Subscribe if needed.
+        // Send the resource in the response if either (a) this is
+        // a new subscription or (b) there is an updated version of
+        // this resource to send.
+        if (parent_->MaybeSubscribe(v3_resource_type, resource_name,
+                                    &subscription_state, &resource_state,
+                                    update_queue) ||
+            ClientNeedsResourceUpdate(resource_type_state, resource_state,
+                                      client_resource_type_version,
+                                      &subscription_state)) {
+          gpr_log(GPR_INFO, "ADS[%p]: Sending update for type=%s name=%s", this,
+                  request.type_url().c_str(), resource_name.c_str());
+          resources_added_to_response.emplace(resource_name);
+          if (!response->has_value()) response->emplace();
+          if (resource_state.resource.has_value()) {
+            auto* resource = (*response)->add_resources();
+            resource->CopyFrom(resource_state.resource.value());
+            if (is_v2_) {
+              resource->set_type_url(request.type_url());
+            }
+          }
+        } else {
+          gpr_log(GPR_INFO,
+                  "ADS[%p]: client does not need update for type=%s name=%s",
+                  this, request.type_url().c_str(), resource_name.c_str());
+        }
+      }
+      // Process unsubscriptions for any resource no longer
+      // present in the request's resource list.
+      parent_->ProcessUnsubscriptions(
+          v3_resource_type, resources_in_current_request,
+          &subscription_name_map, &resource_name_map);
+      // Construct response if needed.
+      if (!resources_added_to_response.empty()) {
+        CompleteBuildingDiscoveryResponse(
+            v3_resource_type, request.type_url(),
+            resource_type_state.resource_type_version, subscription_name_map,
+            resources_added_to_response, sent_state, &response->value());
+      }
     }
 
-    static std::string TypeUrlToV3(const std::string& resource_type) {
-      if (resource_type == kLdsV2TypeUrl) return kLdsTypeUrl;
-      if (resource_type == kRdsV2TypeUrl) return kRdsTypeUrl;
-      if (resource_type == kCdsV2TypeUrl) return kCdsTypeUrl;
-      if (resource_type == kEdsV2TypeUrl) return kEdsTypeUrl;
-      return resource_type;
+    // Processes a resource update from the test.
+    // Populates response if needed.
+    void ProcessUpdate(const std::string& resource_type,
+                       const std::string& resource_name,
+                       SubscriptionMap* subscription_map, SentState* sent_state,
+                       absl::optional<DiscoveryResponse>* response) {
+      const std::string v2_resource_type = TypeUrlToV2(resource_type);
+      gpr_log(GPR_INFO, "ADS[%p]: Received update for type=%s name=%s", this,
+              resource_type.c_str(), resource_name.c_str());
+      auto& subscription_name_map = (*subscription_map)[resource_type];
+      auto& resource_type_state = parent_->resource_map_[resource_type];
+      auto& resource_name_map = resource_type_state.resource_name_map;
+      auto it = subscription_name_map.find(resource_name);
+      if (it != subscription_name_map.end()) {
+        SubscriptionState& subscription_state = it->second;
+        ResourceState& resource_state = resource_name_map[resource_name];
+        if (ClientNeedsResourceUpdate(resource_type_state, resource_state,
+                                      sent_state->resource_type_version,
+                                      &subscription_state)) {
+          gpr_log(GPR_INFO, "ADS[%p]: Sending update for type=%s name=%s", this,
+                  resource_type.c_str(), resource_name.c_str());
+          response->emplace();
+          if (resource_state.resource.has_value()) {
+            auto* resource = (*response)->add_resources();
+            resource->CopyFrom(resource_state.resource.value());
+            if (is_v2_) {
+              resource->set_type_url(v2_resource_type);
+            }
+          }
+          CompleteBuildingDiscoveryResponse(
+              resource_type, v2_resource_type,
+              resource_type_state.resource_type_version, subscription_name_map,
+              {resource_name}, sent_state, &response->value());
+        }
+      }
     }
 
     // Starting a thread to do blocking read on the stream until cancel.
@@ -989,29 +953,21 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
       *stream_closed = true;
     }
 
-    static void CheckBuildVersion(
-        const ::envoy::api::v2::DiscoveryRequest& request) {
-      EXPECT_FALSE(request.node().build_version().empty());
-    }
-
-    static void CheckBuildVersion(
-        const ::envoy::service::discovery::v3::DiscoveryRequest& request) {}
-
     // Completing the building a DiscoveryResponse by adding common information
     // for all resources and by adding all subscribed resources for LDS and CDS.
     void CompleteBuildingDiscoveryResponse(
         const std::string& resource_type, const std::string& v2_resource_type,
         const int version, const SubscriptionNameMap& subscription_name_map,
         const std::set<std::string>& resources_added_to_response,
-        DiscoveryResponse* response) {
+        SentState* sent_state, DiscoveryResponse* response) {
       auto& response_state =
           parent_->resource_type_response_state_[resource_type];
       if (response_state.state == ResponseState::NOT_SENT) {
         response_state.state = ResponseState::SENT;
       }
       response->set_type_url(is_v2_ ? v2_resource_type : resource_type);
-      response->set_version_info(absl::StrCat(version));
-      response->set_nonce(absl::StrCat(version));
+      response->set_version_info(std::to_string(version));
+      response->set_nonce(std::to_string(++sent_state->nonce));
       if (resource_type == kLdsTypeUrl || resource_type == kCdsTypeUrl) {
         // For LDS and CDS we must send back all subscribed resources
         // (even the unchanged ones)
@@ -1019,8 +975,10 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
           const std::string& resource_name = p.first;
           if (resources_added_to_response.find(resource_name) ==
               resources_added_to_response.end()) {
+            ResourceNameMap& resource_name_map =
+                parent_->resource_map_[resource_type].resource_name_map;
             const ResourceState& resource_state =
-                parent_->resource_map_[resource_type][resource_name];
+                resource_name_map[resource_name];
             if (resource_state.resource.has_value()) {
               auto* resource = response->add_resources();
               resource->CopyFrom(resource_state.resource.value());
@@ -1031,39 +989,65 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
           }
         }
       }
+      sent_state->resource_type_version = version;
+    }
+
+    static std::string TypeUrlToV2(const std::string& resource_type) {
+      if (resource_type == kLdsTypeUrl) return kLdsV2TypeUrl;
+      if (resource_type == kRdsTypeUrl) return kRdsV2TypeUrl;
+      if (resource_type == kCdsTypeUrl) return kCdsV2TypeUrl;
+      if (resource_type == kEdsTypeUrl) return kEdsV2TypeUrl;
+      return resource_type;
+    }
+
+    static std::string TypeUrlToV3(const std::string& resource_type) {
+      if (resource_type == kLdsV2TypeUrl) return kLdsTypeUrl;
+      if (resource_type == kRdsV2TypeUrl) return kRdsTypeUrl;
+      if (resource_type == kCdsV2TypeUrl) return kCdsTypeUrl;
+      if (resource_type == kEdsV2TypeUrl) return kEdsTypeUrl;
+      return resource_type;
+    }
+
+    static void CheckBuildVersion(
+        const ::envoy::api::v2::DiscoveryRequest& request) {
+      EXPECT_FALSE(request.node().build_version().empty());
     }
 
+    static void CheckBuildVersion(
+        const ::envoy::service::discovery::v3::DiscoveryRequest& request) {}
+
     AdsServiceImpl* parent_;
     const bool is_v2_;
   };
 
   // Checks whether the client needs to receive a newer version of
-  // the resource.  If so, updates subscription_state->current_version and
-  // returns true.
-  static bool ClientNeedsResourceUpdate(const ResourceState& resource_state,
-                                        SubscriptionState* subscription_state) {
-    if (subscription_state->current_version < resource_state.version) {
-      subscription_state->current_version = resource_state.version;
-      return true;
-    }
-    return false;
+  // the resource.
+  static bool ClientNeedsResourceUpdate(
+      const ResourceTypeState& resource_type_state,
+      const ResourceState& resource_state, int client_resource_type_version,
+      SubscriptionState* subscription_state) {
+    return client_resource_type_version <
+               resource_type_state.resource_type_version &&
+           resource_state.resource_type_version <=
+               resource_type_state.resource_type_version;
   }
 
   // Subscribes to a resource if not already subscribed:
   // 1. Sets the update_queue field in subscription_state.
   // 2. Adds subscription_state to resource_state->subscriptions.
-  void MaybeSubscribe(const std::string& resource_type,
+  bool MaybeSubscribe(const std::string& resource_type,
                       const std::string& resource_name,
                       SubscriptionState* subscription_state,
                       ResourceState* resource_state,
                       UpdateQueue* update_queue) {
     // The update_queue will be null if we were not previously subscribed.
-    if (subscription_state->update_queue != nullptr) return;
+    if (subscription_state->update_queue != nullptr) return false;
     subscription_state->update_queue = update_queue;
     resource_state->subscriptions.emplace(subscription_state);
     gpr_log(GPR_INFO, "ADS[%p]: subscribe to resource type %s name %s state %p",
             this, resource_type.c_str(), resource_name.c_str(),
             &subscription_state);
+    return true;
   }
 
   // Removes subscriptions for resources no longer present in the
@@ -1123,12 +1107,10 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
   // Protect the members below.
   grpc_core::Mutex ads_mu_;
   bool ads_done_ = false;
-  Listener default_listener_;
-  RouteConfiguration default_route_config_;
-  Cluster default_cluster_;
   std::map<std::string /* type_url */, ResponseState>
       resource_type_response_state_;
   std::set<std::string /*resource_type*/> resource_types_to_ignore_;
+  std::map<std::string /*resource_type*/, int> resource_type_min_versions_;
   // An instance data member containing the current state of all resources.
   // Note that an entry will exist whenever either of the following is true:
   // - The resource exists (i.e., has been created by SetResource() and has not
@@ -1357,6 +1339,11 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
     gpr_setenv("GRPC_XDS_BOOTSTRAP",
                GetParam().use_v2() ? g_bootstrap_file_v2 : g_bootstrap_file_v3);
     g_port_saver->Reset();
+    bool localhost_resolves_to_ipv4 = false;
+    bool localhost_resolves_to_ipv6 = false;
+    grpc_core::LocalhostResolves(&localhost_resolves_to_ipv4,
+                                 &localhost_resolves_to_ipv6);
+    ipv6_only_ = !localhost_resolves_to_ipv4 && localhost_resolves_to_ipv6;
     response_generator_ =
         grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
     // Inject xDS channel response generator.
@@ -1381,6 +1368,26 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
     // ensures that each test can independently set the global channel
     // args for the xDS channel.
     grpc_core::internal::UnsetGlobalXdsClientForTest();
+    // Initialize default xDS resources.
+    // Construct LDS resource.
+    default_listener_.set_name(kServerName);
+    // Construct RDS resource.
+    default_route_config_.set_name(kDefaultRouteConfigurationName);
+    auto* virtual_host = default_route_config_.add_virtual_hosts();
+    virtual_host->add_domains("*");
+    auto* route = virtual_host->add_routes();
+    route->mutable_match()->set_prefix("");
+    route->mutable_route()->set_cluster(kDefaultClusterName);
+    // Construct CDS resource.
+    default_cluster_.set_name(kDefaultClusterName);
+    default_cluster_.set_type(Cluster::EDS);
+    auto* eds_config = default_cluster_.mutable_eds_cluster_config();
+    eds_config->mutable_eds_config()->mutable_ads();
+    eds_config->set_service_name(kDefaultEdsServiceName);
+    default_cluster_.set_lb_policy(Cluster::ROUND_ROBIN);
+    if (GetParam().enable_load_reporting()) {
+      default_cluster_.mutable_lrs_server()->mutable_self();
+    }
     // Start the backends.
     for (size_t i = 0; i < num_backends_; ++i) {
       backends_.emplace_back(new BackendServerThread);
@@ -1393,9 +1400,10 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
                                        ? client_load_reporting_interval_seconds_
                                        : 0));
       balancers_.back()->Start();
-      if (GetParam().enable_rds_testing()) {
-        balancers_[i]->ads_service()->SetLdsToUseDynamicRds();
-      }
+      // Initialize resources.
+      SetListenerAndRouteConfiguration(i, default_listener_,
+                                       default_route_config_);
+      balancers_.back()->ads_service()->SetCdsResource(default_cluster_);
     }
     ResetStub();
   }
@@ -1432,7 +1440,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
   }
 
   std::shared_ptr<Channel> CreateChannel(
-      int failover_timeout = 0, const char* server_name = kServerName) {
+      int failover_timeout = 0, const char* server_name = kServerName,
+      grpc_core::FakeResolverResponseGenerator* response_generator = nullptr) {
     ChannelArguments args;
     if (failover_timeout > 0) {
       args.SetInt(GRPC_ARG_PRIORITY_FAILOVER_TIMEOUT_MS, failover_timeout);
@@ -1440,8 +1449,11 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
     // If the parent channel is using the fake resolver, we inject the
     // response generator here.
     if (!GetParam().use_xds_resolver()) {
+      if (response_generator == nullptr) {
+        response_generator = response_generator_.get();
+      }
       args.SetPointer(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR,
-                      response_generator_.get());
+                      response_generator);
     }
     std::string uri = absl::StrCat(
         GetParam().use_xds_resolver() ? "xds" : "fake", ":///", server_name);
@@ -1508,7 +1520,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
 
     RpcOptions& set_metadata(
         std::vector<std::pair<std::string, std::string>> rpc_metadata) {
-      metadata = rpc_metadata;
+      metadata = std::move(rpc_metadata);
       return *this;
     }
   };
@@ -1542,16 +1554,19 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
     for (size_t i = start_index; i < stop_index; ++i) {
       switch (rpc_options.service) {
         case SERVICE_ECHO:
-          if (backends_[i]->backend_service()->request_count() == 0)
+          if (backends_[i]->backend_service()->request_count() == 0) {
             return false;
+          }
           break;
         case SERVICE_ECHO1:
-          if (backends_[i]->backend_service1()->request_count() == 0)
+          if (backends_[i]->backend_service1()->request_count() == 0) {
             return false;
+          }
           break;
         case SERVICE_ECHO2:
-          if (backends_[i]->backend_service2()->request_count() == 0)
+          if (backends_[i]->backend_service2()->request_count() == 0) {
             return false;
+          }
           break;
       }
     }
@@ -1615,7 +1630,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
       const std::vector<int>& ports) {
     grpc_core::ServerAddressList addresses;
     for (int port : ports) {
-      std::string lb_uri_str = absl::StrCat("ipv4:127.0.0.1:", port);
+      std::string lb_uri_str =
+          absl::StrCat(ipv6_only_ ? "ipv6:[::1]:" : "ipv4:127.0.0.1:", port);
       grpc_uri* lb_uri = grpc_uri_parse(lb_uri_str.c_str(), true);
       GPR_ASSERT(lb_uri != nullptr);
       grpc_resolved_address address;
@@ -1626,7 +1642,9 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
     return addresses;
   }
 
-  void SetNextResolution(const std::vector<int>& ports) {
+  void SetNextResolution(
+      const std::vector<int>& ports,
+      grpc_core::FakeResolverResponseGenerator* response_generator = nullptr) {
     if (GetParam().use_xds_resolver()) return;  // Not used with xds resolver.
     grpc_core::ExecCtx exec_ctx;
     grpc_core::Resolver::Result result;
@@ -1640,7 +1658,10 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
         grpc_core::ServiceConfig::Create(nullptr, service_config_json, &error);
     ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
     ASSERT_NE(result.service_config.get(), nullptr);
-    response_generator_->SetResponse(std::move(result));
+    if (response_generator == nullptr) {
+      response_generator = response_generator_.get();
+    }
+    response_generator->SetResponse(std::move(result));
   }
 
   void SetNextResolutionForLbChannelAllBalancers(
@@ -1742,12 +1763,85 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
     }
   }
 
-  void CheckRpcSendFailure(const size_t times = 1,
-                           const RpcOptions& rpc_options = RpcOptions()) {
+  void CheckRpcSendFailure(
+      const size_t times = 1, const RpcOptions& rpc_options = RpcOptions(),
+      const StatusCode expected_error_code = StatusCode::OK) {
     for (size_t i = 0; i < times; ++i) {
       const Status status = SendRpc(rpc_options);
       EXPECT_FALSE(status.ok());
+      if (expected_error_code != StatusCode::OK) {
+        EXPECT_EQ(expected_error_code, status.error_code());
+      }
+    }
+  }
+
+  static Listener BuildListener(const RouteConfiguration& route_config) {
+    HttpConnectionManager http_connection_manager;
+    *(http_connection_manager.mutable_route_config()) = route_config;
+    Listener listener;
+    listener.set_name(kServerName);
+    listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
+        http_connection_manager);
+    return listener;
+  }
+
+  ClusterLoadAssignment BuildEdsResource(
+      const AdsServiceImpl::EdsResourceArgs& args,
+      const char* eds_service_name = kDefaultEdsServiceName) {
+    ClusterLoadAssignment assignment;
+    assignment.set_cluster_name(eds_service_name);
+    for (const auto& locality : args.locality_list) {
+      auto* endpoints = assignment.add_endpoints();
+      endpoints->mutable_load_balancing_weight()->set_value(locality.lb_weight);
+      endpoints->set_priority(locality.priority);
+      endpoints->mutable_locality()->set_region(kDefaultLocalityRegion);
+      endpoints->mutable_locality()->set_zone(kDefaultLocalityZone);
+      endpoints->mutable_locality()->set_sub_zone(locality.sub_zone);
+      for (size_t i = 0; i < locality.ports.size(); ++i) {
+        const int& port = locality.ports[i];
+        auto* lb_endpoints = endpoints->add_lb_endpoints();
+        if (locality.health_statuses.size() > i &&
+            locality.health_statuses[i] != HealthStatus::UNKNOWN) {
+          lb_endpoints->set_health_status(locality.health_statuses[i]);
+        }
+        auto* endpoint = lb_endpoints->mutable_endpoint();
+        auto* address = endpoint->mutable_address();
+        auto* socket_address = address->mutable_socket_address();
+        socket_address->set_address(ipv6_only_ ? "::1" : "127.0.0.1");
+        socket_address->set_port_value(port);
+      }
+    }
+    if (!args.drop_categories.empty()) {
+      auto* policy = assignment.mutable_policy();
+      for (const auto& p : args.drop_categories) {
+        const std::string& name = p.first;
+        const uint32_t parts_per_million = p.second;
+        auto* drop_overload = policy->add_drop_overloads();
+        drop_overload->set_category(name);
+        auto* drop_percentage = drop_overload->mutable_drop_percentage();
+        drop_percentage->set_numerator(parts_per_million);
+        drop_percentage->set_denominator(args.drop_denominator);
+      }
+    }
+    return assignment;
+  }
+
+  void SetListenerAndRouteConfiguration(
+      int idx, Listener listener, const RouteConfiguration& route_config) {
+    auto* api_listener =
+        listener.mutable_api_listener()->mutable_api_listener();
+    HttpConnectionManager http_connection_manager;
+    api_listener->UnpackTo(&http_connection_manager);
+    if (GetParam().enable_rds_testing()) {
+      auto* rds = http_connection_manager.mutable_rds();
+      rds->set_route_config_name(kDefaultRouteConfigurationName);
+      rds->mutable_config_source()->mutable_ads();
+      balancers_[idx]->ads_service()->SetRdsResource(route_config);
+    } else {
+      *http_connection_manager.mutable_route_config() = route_config;
     }
+    api_listener->PackFrom(http_connection_manager);
+    balancers_[idx]->ads_service()->SetLdsResource(listener);
   }
 
   void SetRouteConfiguration(int idx, const RouteConfiguration& route_config) {
@@ -1755,7 +1849,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
       balancers_[idx]->ads_service()->SetRdsResource(route_config);
     } else {
       balancers_[idx]->ads_service()->SetLdsResource(
-          AdsServiceImpl::BuildListener(route_config));
+          BuildListener(route_config));
     }
   }
 
@@ -1794,8 +1888,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
       // by ServerThread::Serve from firing before the wait below is hit.
       grpc_core::MutexLock lock(&mu);
       grpc_core::CondVar cond;
-      thread_.reset(
-          new std::thread(std::bind(&ServerThread::Serve, this, &mu, &cond)));
+      thread_ = absl::make_unique<std::thread>(
+          std::bind(&ServerThread::Serve, this, &mu, &cond));
       cond.Wait(&mu);
       gpr_log(GPR_INFO, "%s server startup complete", Type());
     }
@@ -1887,7 +1981,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
   class BalancerServerThread : public ServerThread {
    public:
     explicit BalancerServerThread(int client_load_reporting_interval = 0)
-        : ads_service_(new AdsServiceImpl(client_load_reporting_interval > 0)),
+        : ads_service_(new AdsServiceImpl()),
           lrs_service_(new LrsServiceImpl(client_load_reporting_interval)) {}
 
     AdsServiceImpl* ads_service() { return ads_service_.get(); }
@@ -1917,22 +2011,49 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
     std::shared_ptr<LrsServiceImpl> lrs_service_;
   };
 
-  const size_t num_backends_;
-  const size_t num_balancers_;
-  const int client_load_reporting_interval_seconds_;
-  std::shared_ptr<Channel> channel_;
-  std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
-  std::unique_ptr<grpc::testing::EchoTest1Service::Stub> stub1_;
-  std::unique_ptr<grpc::testing::EchoTest2Service::Stub> stub2_;
-  std::vector<std::unique_ptr<BackendServerThread>> backends_;
-  std::vector<std::unique_ptr<BalancerServerThread>> balancers_;
-  grpc_core::RefCountedPtr<grpc_core::FakeResolverResponseGenerator>
-      response_generator_;
-  grpc_core::RefCountedPtr<grpc_core::FakeResolverResponseGenerator>
-      lb_channel_response_generator_;
-  int xds_resource_does_not_exist_timeout_ms_ = 0;
-  absl::InlinedVector<grpc_arg, 2> xds_channel_args_to_add_;
-  grpc_channel_args xds_channel_args_;
+  class LongRunningRpc {
+   public:
+    void StartRpc(grpc::testing::EchoTestService::Stub* stub) {
+      sender_thread_ = std::thread([this, stub]() {
+        EchoResponse response;
+        EchoRequest request;
+        request.mutable_param()->set_client_cancel_after_us(1 * 1000 * 1000);
+        request.set_message(kRequestMessage);
+        (void)stub->Echo(&context_, request, &response);
+      });
+    }
+
+    void CancelRpc() {
+      context_.TryCancel();
+      sender_thread_.join();
+    }
+
+   private:
+    std::thread sender_thread_;
+    ClientContext context_;
+  };
+
+  const size_t num_backends_;
+  const size_t num_balancers_;
+  const int client_load_reporting_interval_seconds_;
+  bool ipv6_only_ = false;
+  std::shared_ptr<Channel> channel_;
+  std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
+  std::unique_ptr<grpc::testing::EchoTest1Service::Stub> stub1_;
+  std::unique_ptr<grpc::testing::EchoTest2Service::Stub> stub2_;
+  std::vector<std::unique_ptr<BackendServerThread>> backends_;
+  std::vector<std::unique_ptr<BalancerServerThread>> balancers_;
+  grpc_core::RefCountedPtr<grpc_core::FakeResolverResponseGenerator>
+      response_generator_;
+  grpc_core::RefCountedPtr<grpc_core::FakeResolverResponseGenerator>
+      lb_channel_response_generator_;
+  int xds_resource_does_not_exist_timeout_ms_ = 0;
+  absl::InlinedVector<grpc_arg, 2> xds_channel_args_to_add_;
+  grpc_channel_args xds_channel_args_;
+
+  Listener default_listener_;
+  RouteConfiguration default_route_config_;
+  Cluster default_cluster_;
 };
 
 class BasicTest : public XdsEnd2endTest {
@@ -1950,7 +2071,7 @@ TEST_P(BasicTest, Vanilla) {
       {"locality0", GetBackendPorts()},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Make sure that trying to connect works without a call.
   channel_->GetState(true /* try_to_connect */);
   // We need to wait for all backends to come online.
@@ -1980,7 +2101,7 @@ TEST_P(BasicTest, IgnoresUnhealthyEndpoints) {
        {HealthStatus::DRAINING}},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Make sure that trying to connect works without a call.
   channel_->GetState(true /* try_to_connect */);
   // We need to wait for all backends to come online.
@@ -2006,7 +2127,7 @@ TEST_P(BasicTest, SameBackendListedMultipleTimes) {
   });
   const size_t kNumRpcsPerAddress = 10;
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // We need to wait for the backend to come online.
   WaitForBackend(0);
   // Send kNumRpcsPerAddress RPCs per server.
@@ -2031,15 +2152,14 @@ TEST_P(BasicTest, InitiallyEmptyServerlist) {
       empty_locality,
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Send non-empty serverlist only after kServerlistDelayMs.
   args = AdsServiceImpl::EdsResourceArgs({
       {"locality0", GetBackendPorts()},
   });
-  std::thread delayed_resource_setter(
-      std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0,
-                AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()),
-                kServerlistDelayMs));
+  std::thread delayed_resource_setter(std::bind(
+      &BasicTest::SetEdsResourceWithDelay, this, 0,
+      BuildEdsResource(args, DefaultEdsServiceName()), kServerlistDelayMs));
   const auto t0 = system_clock::now();
   // Client will block: LB will initially send empty serverlist.
   CheckRpcSendOk(
@@ -2069,7 +2189,7 @@ TEST_P(BasicTest, AllServersUnreachableFailFast) {
       {"locality0", ports},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   const Status status = SendRpc();
   // The error shouldn't be DEADLINE_EXCEEDED.
   EXPECT_EQ(StatusCode::UNAVAILABLE, status.error_code());
@@ -2084,7 +2204,7 @@ TEST_P(BasicTest, BackendsRestart) {
       {"locality0", GetBackendPorts()},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   WaitForAllBackends();
   // Stop backends.  RPCs should fail.
   ShutdownAllBackends();
@@ -2111,7 +2231,7 @@ TEST_P(BasicTest, IgnoresDuplicateUpdates) {
       {"locality0", GetBackendPorts()},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait for all backends to come online.
   WaitForAllBackends();
   // Send kNumRpcsPerAddress RPCs per server, but send an EDS update in
@@ -2121,7 +2241,7 @@ TEST_P(BasicTest, IgnoresDuplicateUpdates) {
   for (size_t i = 0; i < kNumRpcsPerAddress; ++i) {
     CheckRpcSendOk(2);
     balancers_[0]->ads_service()->SetEdsResource(
-        AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+        BuildEdsResource(args, DefaultEdsServiceName()));
     CheckRpcSendOk(2);
   }
   // Each backend should have gotten the right number of requests.
@@ -2133,6 +2253,34 @@ TEST_P(BasicTest, IgnoresDuplicateUpdates) {
 
 using XdsResolverOnlyTest = BasicTest;
 
+TEST_P(XdsResolverOnlyTest, ResourceTypeVersionPersistsAcrossStreamRestarts) {
+  SetNextResolution({});
+  SetNextResolutionForLbChannelAllBalancers();
+  AdsServiceImpl::EdsResourceArgs args({
+      {"locality0", GetBackendPorts(0, 1)},
+  });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+  // Wait for backends to come online.
+  WaitForAllBackends(0, 1);
+  // Stop balancer.
+  balancers_[0]->Shutdown();
+  // Tell balancer to require minimum version 1 for all resource types.
+  balancers_[0]->ads_service()->SetResourceMinVersion(kLdsTypeUrl, 1);
+  balancers_[0]->ads_service()->SetResourceMinVersion(kRdsTypeUrl, 1);
+  balancers_[0]->ads_service()->SetResourceMinVersion(kCdsTypeUrl, 1);
+  balancers_[0]->ads_service()->SetResourceMinVersion(kEdsTypeUrl, 1);
+  // Update backend, just so we can be sure that the client has
+  // reconnected to the balancer.
+  AdsServiceImpl::EdsResourceArgs args2({
+      {"locality0", GetBackendPorts(1, 2)},
+  });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args2));
+  // Restart balancer.
+  balancers_[0]->Start();
+  // Make sure client has reconnected.
+  WaitForAllBackends(1, 2);
+}
+
 // Tests switching over from one cluster to another.
 TEST_P(XdsResolverOnlyTest, ChangeClusters) {
   const char* kNewClusterName = "new_cluster_name";
@@ -2142,8 +2290,7 @@ TEST_P(XdsResolverOnlyTest, ChangeClusters) {
   AdsServiceImpl::EdsResourceArgs args({
       {"locality0", GetBackendPorts(0, 2)},
   });
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   // We need to wait for all backends to come online.
   WaitForAllBackends(0, 2);
   // Populate new EDS resource.
@@ -2151,23 +2298,20 @@ TEST_P(XdsResolverOnlyTest, ChangeClusters) {
       {"locality0", GetBackendPorts(2, 4)},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args2, kNewEdsServiceName));
+      BuildEdsResource(args2, kNewEdsServiceName));
   // Populate new CDS resource.
-  Cluster new_cluster = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster = default_cluster_;
   new_cluster.set_name(kNewClusterName);
   new_cluster.mutable_eds_cluster_config()->set_service_name(
       kNewEdsServiceName);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster);
   // Change RDS resource to point to new cluster.
-  RouteConfiguration new_route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration new_route_config = default_route_config_;
   new_route_config.mutable_virtual_hosts(0)
       ->mutable_routes(0)
       ->mutable_route()
       ->set_cluster(kNewClusterName);
-  Listener listener =
-      balancers_[0]->ads_service()->BuildListener(new_route_config);
-  balancers_[0]->ads_service()->SetLdsResource(listener);
+  SetListenerAndRouteConfiguration(0, default_listener_, new_route_config);
   // Wait for all new backends to be used.
   std::tuple<int, int, int> counts = WaitForAllBackends(2, 4);
   // Make sure no RPCs failed in the transition.
@@ -2181,8 +2325,7 @@ TEST_P(XdsResolverOnlyTest, ClusterRemoved) {
   AdsServiceImpl::EdsResourceArgs args({
       {"locality0", GetBackendPorts()},
   });
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   // We need to wait for all backends to come online.
   WaitForAllBackends();
   // Unset CDS resource.
@@ -2199,7 +2342,16 @@ TEST_P(XdsResolverOnlyTest, ClusterRemoved) {
 
 // Tests that we restart all xDS requests when we reestablish the ADS call.
 TEST_P(XdsResolverOnlyTest, RestartsRequestsUponReconnection) {
-  balancers_[0]->ads_service()->SetLdsToUseDynamicRds();
+  // Manually configure use of RDS.
+  auto listener = default_listener_;
+  HttpConnectionManager http_connection_manager;
+  auto* rds = http_connection_manager.mutable_rds();
+  rds->set_route_config_name(kDefaultRouteConfigurationName);
+  rds->mutable_config_source()->mutable_ads();
+  listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
+      http_connection_manager);
+  balancers_[0]->ads_service()->SetLdsResource(listener);
+  balancers_[0]->ads_service()->SetRdsResource(default_route_config_);
   const char* kNewClusterName = "new_cluster_name";
   const char* kNewEdsServiceName = "new_eds_service_name";
   SetNextResolution({});
@@ -2207,8 +2359,7 @@ TEST_P(XdsResolverOnlyTest, RestartsRequestsUponReconnection) {
   AdsServiceImpl::EdsResourceArgs args({
       {"locality0", GetBackendPorts(0, 2)},
   });
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   // We need to wait for all backends to come online.
   WaitForAllBackends(0, 2);
   // Now shut down and restart the balancer.  When the client
@@ -2223,16 +2374,15 @@ TEST_P(XdsResolverOnlyTest, RestartsRequestsUponReconnection) {
       {"locality0", GetBackendPorts(2, 4)},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args2, kNewEdsServiceName));
+      BuildEdsResource(args2, kNewEdsServiceName));
   // Populate new CDS resource.
-  Cluster new_cluster = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster = default_cluster_;
   new_cluster.set_name(kNewClusterName);
   new_cluster.mutable_eds_cluster_config()->set_service_name(
       kNewEdsServiceName);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster);
   // Change RDS resource to point to new cluster.
-  RouteConfiguration new_route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration new_route_config = default_route_config_;
   new_route_config.mutable_virtual_hosts(0)
       ->mutable_routes(0)
       ->mutable_route()
@@ -2245,51 +2395,23 @@ TEST_P(XdsResolverOnlyTest, RestartsRequestsUponReconnection) {
 }
 
 TEST_P(XdsResolverOnlyTest, DefaultRouteSpecifiesSlashPrefix) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   route_config.mutable_virtual_hosts(0)
       ->mutable_routes(0)
       ->mutable_match()
       ->set_prefix("/");
-  balancers_[0]->ads_service()->SetLdsResource(
-      AdsServiceImpl::BuildListener(route_config));
+  SetListenerAndRouteConfiguration(0, default_listener_, route_config);
   SetNextResolution({});
   SetNextResolutionForLbChannelAllBalancers();
   AdsServiceImpl::EdsResourceArgs args({
       {"locality0", GetBackendPorts()},
   });
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   // We need to wait for all backends to come online.
   WaitForAllBackends();
 }
 
 TEST_P(XdsResolverOnlyTest, CircuitBreaking) {
-  class TestRpc {
-   public:
-    TestRpc() {}
-
-    void StartRpc(grpc::testing::EchoTestService::Stub* stub) {
-      sender_thread_ = std::thread([this, stub]() {
-        EchoResponse response;
-        EchoRequest request;
-        request.mutable_param()->set_client_cancel_after_us(1 * 1000 * 1000);
-        request.set_message(kRequestMessage);
-        status_ = stub->Echo(&context_, request, &response);
-      });
-    }
-
-    void CancelRpc() {
-      context_.TryCancel();
-      sender_thread_.join();
-    }
-
-   private:
-    std::thread sender_thread_;
-    ClientContext context_;
-    Status status_;
-  };
-
   gpr_setenv("GRPC_XDS_EXPERIMENTAL_CIRCUIT_BREAKING", "true");
   constexpr size_t kMaxConcurrentRequests = 10;
   SetNextResolution({});
@@ -2298,17 +2420,16 @@ TEST_P(XdsResolverOnlyTest, CircuitBreaking) {
   AdsServiceImpl::EdsResourceArgs args({
       {"locality0", GetBackendPorts(0, 1)},
   });
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   // Update CDS resource to set max concurrent request.
   CircuitBreakers circuit_breaks;
-  Cluster cluster = balancers_[0]->ads_service()->default_cluster();
+  Cluster cluster = default_cluster_;
   auto* threshold = cluster.mutable_circuit_breakers()->add_thresholds();
   threshold->set_priority(RoutingPriority::DEFAULT);
   threshold->mutable_max_requests()->set_value(kMaxConcurrentRequests);
   balancers_[0]->ads_service()->SetCdsResource(cluster);
   // Send exactly max_concurrent_requests long RPCs.
-  TestRpc rpcs[kMaxConcurrentRequests];
+  LongRunningRpc rpcs[kMaxConcurrentRequests];
   for (size_t i = 0; i < kMaxConcurrentRequests; ++i) {
     rpcs[i].StartRpc(stub_.get());
   }
@@ -2336,32 +2457,63 @@ TEST_P(XdsResolverOnlyTest, CircuitBreaking) {
   gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_CIRCUIT_BREAKING");
 }
 
-TEST_P(XdsResolverOnlyTest, CircuitBreakingDisabled) {
-  class TestRpc {
-   public:
-    TestRpc() {}
-
-    void StartRpc(grpc::testing::EchoTestService::Stub* stub) {
-      sender_thread_ = std::thread([this, stub]() {
-        EchoResponse response;
-        EchoRequest request;
-        request.mutable_param()->set_client_cancel_after_us(1 * 1000 * 1000);
-        request.set_message(kRequestMessage);
-        status_ = stub->Echo(&context_, request, &response);
-      });
-    }
-
-    void CancelRpc() {
-      context_.TryCancel();
-      sender_thread_.join();
-    }
-
-   private:
-    std::thread sender_thread_;
-    ClientContext context_;
-    Status status_;
-  };
+TEST_P(XdsResolverOnlyTest, CircuitBreakingMultipleChannelsShareCallCounter) {
+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_CIRCUIT_BREAKING", "true");
+  constexpr size_t kMaxConcurrentRequests = 10;
+  // Populate new EDS resources.
+  AdsServiceImpl::EdsResourceArgs args({
+      {"locality0", GetBackendPorts(0, 1)},
+  });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+  // Update CDS resource to set max concurrent request.
+  CircuitBreakers circuit_breaks;
+  Cluster cluster = default_cluster_;
+  auto* threshold = cluster.mutable_circuit_breakers()->add_thresholds();
+  threshold->set_priority(RoutingPriority::DEFAULT);
+  threshold->mutable_max_requests()->set_value(kMaxConcurrentRequests);
+  balancers_[0]->ads_service()->SetCdsResource(cluster);
+  // Create second channel.
+  auto response_generator2 =
+      grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
+  auto channel2 = CreateChannel(
+      /*failover_timeout=*/0, /*server_name=*/kServerName,
+      response_generator2.get());
+  auto stub2 = grpc::testing::EchoTestService::NewStub(channel2);
+  // Set resolution results for both channels and for the xDS channel.
+  SetNextResolution({});
+  SetNextResolution({}, response_generator2.get());
+  SetNextResolutionForLbChannelAllBalancers();
+  // Send exactly max_concurrent_requests long RPCs, alternating between
+  // the two channels.
+  LongRunningRpc rpcs[kMaxConcurrentRequests];
+  for (size_t i = 0; i < kMaxConcurrentRequests; ++i) {
+    rpcs[i].StartRpc(i % 2 == 0 ? stub_.get() : stub2.get());
+  }
+  // Wait for all RPCs to be in flight.
+  while (backends_[0]->backend_service()->RpcsWaitingForClientCancel() <
+         kMaxConcurrentRequests) {
+    gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
+                                 gpr_time_from_micros(1 * 1000, GPR_TIMESPAN)));
+  }
+  // Sending a RPC now should fail, the error message should tell us
+  // we hit the max concurrent requests limit and got dropped.
+  Status status = SendRpc();
+  EXPECT_FALSE(status.ok());
+  EXPECT_EQ(status.error_message(), "Call dropped by load balancing policy");
+  // Cancel one RPC to allow another one through
+  rpcs[0].CancelRpc();
+  status = SendRpc();
+  EXPECT_TRUE(status.ok());
+  for (size_t i = 1; i < kMaxConcurrentRequests; ++i) {
+    rpcs[i].CancelRpc();
+  }
+  // Make sure RPCs go to the correct backend:
+  EXPECT_EQ(kMaxConcurrentRequests + 1,
+            backends_[0]->backend_service()->request_count());
+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_CIRCUIT_BREAKING");
+}
 
+TEST_P(XdsResolverOnlyTest, CircuitBreakingDisabled) {
   constexpr size_t kMaxConcurrentRequests = 10;
   SetNextResolution({});
   SetNextResolutionForLbChannelAllBalancers();
@@ -2369,17 +2521,16 @@ TEST_P(XdsResolverOnlyTest, CircuitBreakingDisabled) {
   AdsServiceImpl::EdsResourceArgs args({
       {"locality0", GetBackendPorts(0, 1)},
   });
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   // Update CDS resource to set max concurrent request.
   CircuitBreakers circuit_breaks;
-  Cluster cluster = balancers_[0]->ads_service()->default_cluster();
+  Cluster cluster = default_cluster_;
   auto* threshold = cluster.mutable_circuit_breakers()->add_thresholds();
   threshold->set_priority(RoutingPriority::DEFAULT);
   threshold->mutable_max_requests()->set_value(kMaxConcurrentRequests);
   balancers_[0]->ads_service()->SetCdsResource(cluster);
   // Send exactly max_concurrent_requests long RPCs.
-  TestRpc rpcs[kMaxConcurrentRequests];
+  LongRunningRpc rpcs[kMaxConcurrentRequests];
   for (size_t i = 0; i < kMaxConcurrentRequests; ++i) {
     rpcs[i].StartRpc(stub_.get());
   }
@@ -2402,16 +2553,15 @@ TEST_P(XdsResolverOnlyTest, CircuitBreakingDisabled) {
 
 TEST_P(XdsResolverOnlyTest, MultipleChannelsShareXdsClient) {
   const char* kNewServerName = "new-server.example.com";
-  Listener listener = balancers_[0]->ads_service()->default_listener();
+  Listener listener = default_listener_;
   listener.set_name(kNewServerName);
-  balancers_[0]->ads_service()->SetLdsResource(listener);
+  SetListenerAndRouteConfiguration(0, listener, default_route_config_);
   SetNextResolution({});
   SetNextResolutionForLbChannelAllBalancers();
   AdsServiceImpl::EdsResourceArgs args({
       {"locality0", GetBackendPorts()},
   });
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   WaitForAllBackends();
   // Create second channel and tell it to connect to kNewServerName.
   auto channel2 = CreateChannel(/*failover_timeout=*/0, kNewServerName);
@@ -2439,16 +2589,15 @@ TEST_P(XdsResolverLoadReportingOnlyTest, ChangeClusters) {
   AdsServiceImpl::EdsResourceArgs args({
       {"locality0", GetBackendPorts(0, 2)},
   });
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   // cluster kNewClusterName -> locality1 -> backends 2 and 3
   AdsServiceImpl::EdsResourceArgs args2({
       {"locality1", GetBackendPorts(2, 4)},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args2, kNewEdsServiceName));
+      BuildEdsResource(args2, kNewEdsServiceName));
   // CDS resource for kNewClusterName.
-  Cluster new_cluster = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster = default_cluster_;
   new_cluster.set_name(kNewClusterName);
   new_cluster.mutable_eds_cluster_config()->set_service_name(
       kNewEdsServiceName);
@@ -2485,15 +2634,12 @@ TEST_P(XdsResolverLoadReportingOnlyTest, ChangeClusters) {
           ::testing::Property(&ClientStats::total_dropped_requests,
                               num_drops))));
   // Change RDS resource to point to new cluster.
-  RouteConfiguration new_route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration new_route_config = default_route_config_;
   new_route_config.mutable_virtual_hosts(0)
       ->mutable_routes(0)
       ->mutable_route()
       ->set_cluster(kNewClusterName);
-  Listener listener =
-      balancers_[0]->ads_service()->BuildListener(new_route_config);
-  balancers_[0]->ads_service()->SetLdsResource(listener);
+  SetListenerAndRouteConfiguration(0, default_listener_, new_route_config);
   // Wait for all new backends to be used.
   std::tie(num_ok, num_failure, num_drops) = WaitForAllBackends(2, 4);
   // The load report received at the balancer should be correct.
@@ -2569,7 +2715,7 @@ TEST_P(SecureNamingTest, TargetNameIsExpected) {
       {"locality0", GetBackendPorts()},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   CheckRpcSendOk();
 }
 
@@ -2583,7 +2729,7 @@ TEST_P(SecureNamingTest, TargetNameIsUnexpected) {
       {"locality0", GetBackendPorts()},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Make sure that we blow up (via abort() from the security connector) when
   // the name from the balancer doesn't match expectations.
   ASSERT_DEATH_IF_SUPPORTED({ CheckRpcSendOk(); }, "");
@@ -2594,7 +2740,7 @@ using LdsTest = BasicTest;
 // Tests that LDS client should send a NACK if there is no API listener in the
 // Listener in the LDS response.
 TEST_P(LdsTest, NoApiListener) {
-  auto listener = balancers_[0]->ads_service()->default_listener();
+  auto listener = default_listener_;
   listener.clear_api_listener();
   balancers_[0]->ads_service()->SetLdsResource(listener);
   SetNextResolution({});
@@ -2609,7 +2755,7 @@ TEST_P(LdsTest, NoApiListener) {
 // Tests that LDS client should send a NACK if the route_specifier in the
 // http_connection_manager is neither inlined route_config nor RDS.
 TEST_P(LdsTest, WrongRouteSpecifier) {
-  auto listener = balancers_[0]->ads_service()->default_listener();
+  auto listener = default_listener_;
   HttpConnectionManager http_connection_manager;
   http_connection_manager.mutable_scoped_routes();
   listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
@@ -2628,7 +2774,7 @@ TEST_P(LdsTest, WrongRouteSpecifier) {
 // Tests that LDS client should send a NACK if the rds message in the
 // http_connection_manager is missing the config_source field.
 TEST_P(LdsTest, RdsMissingConfigSource) {
-  auto listener = balancers_[0]->ads_service()->default_listener();
+  auto listener = default_listener_;
   HttpConnectionManager http_connection_manager;
   http_connection_manager.mutable_rds()->set_route_config_name(
       kDefaultRouteConfigurationName);
@@ -2648,7 +2794,7 @@ TEST_P(LdsTest, RdsMissingConfigSource) {
 // Tests that LDS client should send a NACK if the rds message in the
 // http_connection_manager has a config_source field that does not specify ADS.
 TEST_P(LdsTest, RdsConfigSourceDoesNotSpecifyAds) {
-  auto listener = balancers_[0]->ads_service()->default_listener();
+  auto listener = default_listener_;
   HttpConnectionManager http_connection_manager;
   auto* rds = http_connection_manager.mutable_rds();
   rds->set_route_config_name(kDefaultRouteConfigurationName);
@@ -2690,8 +2836,7 @@ TEST_P(LdsRdsTest, ListenerRemoved) {
   AdsServiceImpl::EdsResourceArgs args({
       {"locality0", GetBackendPorts()},
   });
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   // We need to wait for all backends to come online.
   WaitForAllBackends();
   // Unset LDS resource.
@@ -2709,8 +2854,7 @@ TEST_P(LdsRdsTest, ListenerRemoved) {
 // Tests that LDS client ACKs but fails if matching domain can't be found in
 // the LDS response.
 TEST_P(LdsRdsTest, NoMatchedDomain) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   route_config.mutable_virtual_hosts(0)->clear_domains();
   route_config.mutable_virtual_hosts(0)->add_domains("unmatched_domain");
   SetRouteConfiguration(0, route_config);
@@ -2726,8 +2870,7 @@ TEST_P(LdsRdsTest, NoMatchedDomain) {
 // Tests that LDS client should choose the virtual host with matching domain if
 // multiple virtual hosts exist in the LDS response.
 TEST_P(LdsRdsTest, ChooseMatchedDomain) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   *(route_config.add_virtual_hosts()) = route_config.virtual_hosts(0);
   route_config.mutable_virtual_hosts(0)->clear_domains();
   route_config.mutable_virtual_hosts(0)->add_domains("unmatched_domain");
@@ -2742,8 +2885,7 @@ TEST_P(LdsRdsTest, ChooseMatchedDomain) {
 // Tests that LDS client should choose the last route in the virtual host if
 // multiple routes exist in the LDS response.
 TEST_P(LdsRdsTest, ChooseLastRoute) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   *(route_config.mutable_virtual_hosts(0)->add_routes()) =
       route_config.virtual_hosts(0).routes(0);
   route_config.mutable_virtual_hosts(0)
@@ -2758,27 +2900,9 @@ TEST_P(LdsRdsTest, ChooseLastRoute) {
             AdsServiceImpl::ResponseState::ACKED);
 }
 
-// Tests that LDS client should send a NACK if route match has a case_sensitive
-// set to false.
-TEST_P(LdsRdsTest, RouteMatchHasCaseSensitiveFalse) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
-  auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
-  route1->mutable_match()->mutable_case_sensitive()->set_value(false);
-  SetRouteConfiguration(0, route_config);
-  SetNextResolution({});
-  SetNextResolutionForLbChannelAllBalancers();
-  CheckRpcSendFailure();
-  const auto& response_state = RouteConfigurationResponseState(0);
-  EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
-  EXPECT_EQ(response_state.error_message,
-            "case_sensitive if set must be set to true.");
-}
-
 // Tests that LDS client should ignore route which has query_parameters.
 TEST_P(LdsRdsTest, RouteMatchHasQueryParameters) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   route1->mutable_match()->add_query_parameters();
@@ -2794,8 +2918,7 @@ TEST_P(LdsRdsTest, RouteMatchHasQueryParameters) {
 // Tests that LDS client should send a ACK if route match has a prefix
 // that is either empty or a single slash
 TEST_P(LdsRdsTest, RouteMatchHasValidPrefixEmptyOrSingleSlash) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("");
   auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes();
@@ -2812,8 +2935,7 @@ TEST_P(LdsRdsTest, RouteMatchHasValidPrefixEmptyOrSingleSlash) {
 // Tests that LDS client should ignore route which has a path
 // prefix string does not start with "/".
 TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoLeadingSlash) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("grpc.testing.EchoTest1Service/");
   SetRouteConfiguration(0, route_config);
@@ -2828,8 +2950,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoLeadingSlash) {
 // Tests that LDS client should ignore route which has a prefix
 // string with more than 2 slashes.
 TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixExtraContent) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/Echo1/");
   SetRouteConfiguration(0, route_config);
@@ -2844,8 +2965,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixExtraContent) {
 // Tests that LDS client should ignore route which has a prefix
 // string "//".
 TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixDoubleSlash) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("//");
   SetRouteConfiguration(0, route_config);
@@ -2860,8 +2980,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixDoubleSlash) {
 // Tests that LDS client should ignore route which has path
 // but it's empty.
 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEmptyPath) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_path("");
   SetRouteConfiguration(0, route_config);
@@ -2876,8 +2995,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEmptyPath) {
 // Tests that LDS client should ignore route which has path
 // string does not start with "/".
 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathNoLeadingSlash) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_path("grpc.testing.EchoTest1Service/Echo1");
   SetRouteConfiguration(0, route_config);
@@ -2892,8 +3010,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathNoLeadingSlash) {
 // Tests that LDS client should ignore route which has path
 // string that has too many slashes; for example, ends with "/".
 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathTooManySlashes) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/Echo1/");
   SetRouteConfiguration(0, route_config);
@@ -2908,8 +3025,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathTooManySlashes) {
 // Tests that LDS client should ignore route which has path
 // string that has only 1 slash: missing "/" between service and method.
 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathOnlyOneSlash) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service.Echo1");
   SetRouteConfiguration(0, route_config);
@@ -2924,8 +3040,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathOnlyOneSlash) {
 // Tests that LDS client should ignore route which has path
 // string that is missing service.
 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingService) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_path("//Echo1");
   SetRouteConfiguration(0, route_config);
@@ -2940,8 +3055,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingService) {
 // Tests that LDS client should ignore route which has path
 // string that is missing method.
 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMethod) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/");
   SetRouteConfiguration(0, route_config);
@@ -2956,8 +3070,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMethod) {
 // Test that LDS client should reject route which has invalid path regex.
 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathRegex) {
   const char* kNewCluster1Name = "new_cluster_1";
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->mutable_safe_regex()->set_regex("a[z-a]");
   route1->mutable_route()->set_cluster(kNewCluster1Name);
@@ -2974,8 +3087,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathRegex) {
 // Tests that LDS client should send a NACK if route has an action other than
 // RouteAction in the LDS response.
 TEST_P(LdsRdsTest, RouteHasNoRouteAction) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   route_config.mutable_virtual_hosts(0)->mutable_routes(0)->mutable_redirect();
   SetRouteConfiguration(0, route_config);
   SetNextResolution({});
@@ -2987,8 +3099,7 @@ TEST_P(LdsRdsTest, RouteHasNoRouteAction) {
 }
 
 TEST_P(LdsRdsTest, RouteActionClusterHasEmptyClusterName) {
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   route1->mutable_route()->set_cluster("");
@@ -3008,8 +3119,7 @@ TEST_P(LdsRdsTest, RouteActionClusterHasEmptyClusterName) {
 TEST_P(LdsRdsTest, RouteActionWeightedTargetHasIncorrectTotalWeightSet) {
   const size_t kWeight75 = 75;
   const char* kNewCluster1Name = "new_cluster_1";
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   auto* weighted_cluster1 =
@@ -3035,8 +3145,7 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetHasIncorrectTotalWeightSet) {
 
 TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasEmptyClusterName) {
   const size_t kWeight75 = 75;
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   auto* weighted_cluster1 =
@@ -3064,8 +3173,7 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasEmptyClusterName) {
 TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasNoWeight) {
   const size_t kWeight75 = 75;
   const char* kNewCluster1Name = "new_cluster_1";
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   auto* weighted_cluster1 =
@@ -3090,8 +3198,7 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasNoWeight) {
 
 TEST_P(LdsRdsTest, RouteHeaderMatchInvalidRegex) {
   const char* kNewCluster1Name = "new_cluster_1";
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   auto* header_matcher1 = route1->mutable_match()->add_headers();
@@ -3110,8 +3217,7 @@ TEST_P(LdsRdsTest, RouteHeaderMatchInvalidRegex) {
 
 TEST_P(LdsRdsTest, RouteHeaderMatchInvalidRange) {
   const char* kNewCluster1Name = "new_cluster_1";
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   auto* header_matcher1 = route1->mutable_match()->add_headers();
@@ -3130,87 +3236,284 @@ TEST_P(LdsRdsTest, RouteHeaderMatchInvalidRange) {
             "cannot be smaller than start.");
 }
 
-// Tests that LDS client should choose the default route (with no matching
-// specified) after unable to find a match with previous routes.
-TEST_P(LdsRdsTest, XdsRoutingPathMatching) {
+// Tests that LDS client should choose the default route (with no matching
+// specified) after unable to find a match with previous routes.
+TEST_P(LdsRdsTest, XdsRoutingPathMatching) {
+  const char* kNewCluster1Name = "new_cluster_1";
+  const char* kNewEdsService1Name = "new_eds_service_name_1";
+  const char* kNewCluster2Name = "new_cluster_2";
+  const char* kNewEdsService2Name = "new_eds_service_name_2";
+  const size_t kNumEcho1Rpcs = 10;
+  const size_t kNumEcho2Rpcs = 20;
+  const size_t kNumEchoRpcs = 30;
+  SetNextResolution({});
+  SetNextResolutionForLbChannelAllBalancers();
+  // Populate new EDS resources.
+  AdsServiceImpl::EdsResourceArgs args({
+      {"locality0", GetBackendPorts(0, 2)},
+  });
+  AdsServiceImpl::EdsResourceArgs args1({
+      {"locality0", GetBackendPorts(2, 3)},
+  });
+  AdsServiceImpl::EdsResourceArgs args2({
+      {"locality0", GetBackendPorts(3, 4)},
+  });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(
+      BuildEdsResource(args1, kNewEdsService1Name));
+  balancers_[0]->ads_service()->SetEdsResource(
+      BuildEdsResource(args2, kNewEdsService2Name));
+  // Populate new CDS resources.
+  Cluster new_cluster1 = default_cluster_;
+  new_cluster1.set_name(kNewCluster1Name);
+  new_cluster1.mutable_eds_cluster_config()->set_service_name(
+      kNewEdsService1Name);
+  balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
+  Cluster new_cluster2 = default_cluster_;
+  new_cluster2.set_name(kNewCluster2Name);
+  new_cluster2.mutable_eds_cluster_config()->set_service_name(
+      kNewEdsService2Name);
+  balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
+  // Populating Route Configurations for LDS.
+  RouteConfiguration new_route_config = default_route_config_;
+  auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
+  route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/Echo1");
+  route1->mutable_route()->set_cluster(kNewCluster1Name);
+  auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes();
+  route2->mutable_match()->set_path("/grpc.testing.EchoTest2Service/Echo2");
+  route2->mutable_route()->set_cluster(kNewCluster2Name);
+  auto* route3 = new_route_config.mutable_virtual_hosts(0)->add_routes();
+  route3->mutable_match()->set_path("/grpc.testing.EchoTest3Service/Echo3");
+  route3->mutable_route()->set_cluster(kDefaultClusterName);
+  auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes();
+  default_route->mutable_match()->set_prefix("");
+  default_route->mutable_route()->set_cluster(kDefaultClusterName);
+  SetRouteConfiguration(0, new_route_config);
+  WaitForAllBackends(0, 2);
+  CheckRpcSendOk(kNumEchoRpcs, RpcOptions().set_wait_for_ready(true));
+  CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions()
+                                    .set_rpc_service(SERVICE_ECHO1)
+                                    .set_rpc_method(METHOD_ECHO1)
+                                    .set_wait_for_ready(true));
+  CheckRpcSendOk(kNumEcho2Rpcs, RpcOptions()
+                                    .set_rpc_service(SERVICE_ECHO2)
+                                    .set_rpc_method(METHOD_ECHO2)
+                                    .set_wait_for_ready(true));
+  // Make sure RPCs all go to the correct backend.
+  for (size_t i = 0; i < 2; ++i) {
+    EXPECT_EQ(kNumEchoRpcs / 2,
+              backends_[i]->backend_service()->request_count());
+    EXPECT_EQ(0, backends_[i]->backend_service1()->request_count());
+    EXPECT_EQ(0, backends_[i]->backend_service2()->request_count());
+  }
+  EXPECT_EQ(0, backends_[2]->backend_service()->request_count());
+  EXPECT_EQ(kNumEcho1Rpcs, backends_[2]->backend_service1()->request_count());
+  EXPECT_EQ(0, backends_[2]->backend_service2()->request_count());
+  EXPECT_EQ(0, backends_[3]->backend_service()->request_count());
+  EXPECT_EQ(0, backends_[3]->backend_service1()->request_count());
+  EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count());
+}
+
+TEST_P(LdsRdsTest, XdsRoutingPathMatchingCaseInsensitive) {
+  const char* kNewCluster1Name = "new_cluster_1";
+  const char* kNewEdsService1Name = "new_eds_service_name_1";
+  const char* kNewCluster2Name = "new_cluster_2";
+  const char* kNewEdsService2Name = "new_eds_service_name_2";
+  const size_t kNumEcho1Rpcs = 10;
+  const size_t kNumEchoRpcs = 30;
+  SetNextResolution({});
+  SetNextResolutionForLbChannelAllBalancers();
+  // Populate new EDS resources.
+  AdsServiceImpl::EdsResourceArgs args({
+      {"locality0", GetBackendPorts(0, 1)},
+  });
+  AdsServiceImpl::EdsResourceArgs args1({
+      {"locality0", GetBackendPorts(1, 2)},
+  });
+  AdsServiceImpl::EdsResourceArgs args2({
+      {"locality0", GetBackendPorts(2, 3)},
+  });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(
+      BuildEdsResource(args1, kNewEdsService1Name));
+  balancers_[0]->ads_service()->SetEdsResource(
+      BuildEdsResource(args2, kNewEdsService2Name));
+  // Populate new CDS resources.
+  Cluster new_cluster1 = default_cluster_;
+  new_cluster1.set_name(kNewCluster1Name);
+  new_cluster1.mutable_eds_cluster_config()->set_service_name(
+      kNewEdsService1Name);
+  balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
+  Cluster new_cluster2 = default_cluster_;
+  new_cluster2.set_name(kNewCluster2Name);
+  new_cluster2.mutable_eds_cluster_config()->set_service_name(
+      kNewEdsService2Name);
+  balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
+  // Populating Route Configurations for LDS.
+  RouteConfiguration new_route_config = default_route_config_;
+  // First route will not match, since it's case-sensitive.
+  // Second route will match with same path.
+  auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
+  route1->mutable_match()->set_path("/GrPc.TeStInG.EcHoTeSt1SErViCe/EcHo1");
+  route1->mutable_route()->set_cluster(kNewCluster1Name);
+  auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes();
+  route2->mutable_match()->set_path("/GrPc.TeStInG.EcHoTeSt1SErViCe/EcHo1");
+  route2->mutable_match()->mutable_case_sensitive()->set_value(false);
+  route2->mutable_route()->set_cluster(kNewCluster2Name);
+  auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes();
+  default_route->mutable_match()->set_prefix("");
+  default_route->mutable_route()->set_cluster(kDefaultClusterName);
+  SetRouteConfiguration(0, new_route_config);
+  CheckRpcSendOk(kNumEchoRpcs, RpcOptions().set_wait_for_ready(true));
+  CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions()
+                                    .set_rpc_service(SERVICE_ECHO1)
+                                    .set_rpc_method(METHOD_ECHO1)
+                                    .set_wait_for_ready(true));
+  // Make sure RPCs all go to the correct backend.
+  EXPECT_EQ(kNumEchoRpcs, backends_[0]->backend_service()->request_count());
+  EXPECT_EQ(0, backends_[0]->backend_service1()->request_count());
+  EXPECT_EQ(0, backends_[1]->backend_service()->request_count());
+  EXPECT_EQ(0, backends_[1]->backend_service1()->request_count());
+  EXPECT_EQ(0, backends_[2]->backend_service()->request_count());
+  EXPECT_EQ(kNumEcho1Rpcs, backends_[2]->backend_service1()->request_count());
+}
+
+TEST_P(LdsRdsTest, XdsRoutingPrefixMatching) {
+  const char* kNewCluster1Name = "new_cluster_1";
+  const char* kNewEdsService1Name = "new_eds_service_name_1";
+  const char* kNewCluster2Name = "new_cluster_2";
+  const char* kNewEdsService2Name = "new_eds_service_name_2";
+  const size_t kNumEcho1Rpcs = 10;
+  const size_t kNumEcho2Rpcs = 20;
+  const size_t kNumEchoRpcs = 30;
+  SetNextResolution({});
+  SetNextResolutionForLbChannelAllBalancers();
+  // Populate new EDS resources.
+  AdsServiceImpl::EdsResourceArgs args({
+      {"locality0", GetBackendPorts(0, 2)},
+  });
+  AdsServiceImpl::EdsResourceArgs args1({
+      {"locality0", GetBackendPorts(2, 3)},
+  });
+  AdsServiceImpl::EdsResourceArgs args2({
+      {"locality0", GetBackendPorts(3, 4)},
+  });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(
+      BuildEdsResource(args1, kNewEdsService1Name));
+  balancers_[0]->ads_service()->SetEdsResource(
+      BuildEdsResource(args2, kNewEdsService2Name));
+  // Populate new CDS resources.
+  Cluster new_cluster1 = default_cluster_;
+  new_cluster1.set_name(kNewCluster1Name);
+  new_cluster1.mutable_eds_cluster_config()->set_service_name(
+      kNewEdsService1Name);
+  balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
+  Cluster new_cluster2 = default_cluster_;
+  new_cluster2.set_name(kNewCluster2Name);
+  new_cluster2.mutable_eds_cluster_config()->set_service_name(
+      kNewEdsService2Name);
+  balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
+  // Populating Route Configurations for LDS.
+  RouteConfiguration new_route_config = default_route_config_;
+  auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
+  route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
+  route1->mutable_route()->set_cluster(kNewCluster1Name);
+  auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes();
+  route2->mutable_match()->set_prefix("/grpc.testing.EchoTest2Service/");
+  route2->mutable_route()->set_cluster(kNewCluster2Name);
+  auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes();
+  default_route->mutable_match()->set_prefix("");
+  default_route->mutable_route()->set_cluster(kDefaultClusterName);
+  SetRouteConfiguration(0, new_route_config);
+  WaitForAllBackends(0, 2);
+  CheckRpcSendOk(kNumEchoRpcs, RpcOptions().set_wait_for_ready(true));
+  CheckRpcSendOk(
+      kNumEcho1Rpcs,
+      RpcOptions().set_rpc_service(SERVICE_ECHO1).set_wait_for_ready(true));
+  CheckRpcSendOk(
+      kNumEcho2Rpcs,
+      RpcOptions().set_rpc_service(SERVICE_ECHO2).set_wait_for_ready(true));
+  // Make sure RPCs all go to the correct backend.
+  for (size_t i = 0; i < 2; ++i) {
+    EXPECT_EQ(kNumEchoRpcs / 2,
+              backends_[i]->backend_service()->request_count());
+    EXPECT_EQ(0, backends_[i]->backend_service1()->request_count());
+    EXPECT_EQ(0, backends_[i]->backend_service2()->request_count());
+  }
+  EXPECT_EQ(0, backends_[2]->backend_service()->request_count());
+  EXPECT_EQ(kNumEcho1Rpcs, backends_[2]->backend_service1()->request_count());
+  EXPECT_EQ(0, backends_[2]->backend_service2()->request_count());
+  EXPECT_EQ(0, backends_[3]->backend_service()->request_count());
+  EXPECT_EQ(0, backends_[3]->backend_service1()->request_count());
+  EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count());
+}
+
+TEST_P(LdsRdsTest, XdsRoutingPrefixMatchingCaseInsensitive) {
   const char* kNewCluster1Name = "new_cluster_1";
   const char* kNewEdsService1Name = "new_eds_service_name_1";
   const char* kNewCluster2Name = "new_cluster_2";
   const char* kNewEdsService2Name = "new_eds_service_name_2";
   const size_t kNumEcho1Rpcs = 10;
-  const size_t kNumEcho2Rpcs = 20;
   const size_t kNumEchoRpcs = 30;
   SetNextResolution({});
   SetNextResolutionForLbChannelAllBalancers();
   // Populate new EDS resources.
   AdsServiceImpl::EdsResourceArgs args({
-      {"locality0", GetBackendPorts(0, 2)},
+      {"locality0", GetBackendPorts(0, 1)},
   });
   AdsServiceImpl::EdsResourceArgs args1({
-      {"locality0", GetBackendPorts(2, 3)},
+      {"locality0", GetBackendPorts(1, 2)},
   });
   AdsServiceImpl::EdsResourceArgs args2({
-      {"locality0", GetBackendPorts(3, 4)},
+      {"locality0", GetBackendPorts(2, 3)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+      BuildEdsResource(args1, kNewEdsService1Name));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsService1Name));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args2, kNewEdsService2Name));
+      BuildEdsResource(args2, kNewEdsService2Name));
   // Populate new CDS resources.
-  Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster1 = default_cluster_;
   new_cluster1.set_name(kNewCluster1Name);
   new_cluster1.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService1Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
-  Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster2 = default_cluster_;
   new_cluster2.set_name(kNewCluster2Name);
   new_cluster2.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService2Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
   // Populating Route Configurations for LDS.
-  RouteConfiguration new_route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration new_route_config = default_route_config_;
+  // First route will not match, since it's case-sensitive.
+  // Second route will match with same path.
   auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
-  route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/Echo1");
+  route1->mutable_match()->set_prefix("/GrPc.TeStInG.EcHoTeSt1SErViCe");
   route1->mutable_route()->set_cluster(kNewCluster1Name);
   auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes();
-  route2->mutable_match()->set_path("/grpc.testing.EchoTest2Service/Echo2");
+  route2->mutable_match()->set_prefix("/GrPc.TeStInG.EcHoTeSt1SErViCe");
+  route2->mutable_match()->mutable_case_sensitive()->set_value(false);
   route2->mutable_route()->set_cluster(kNewCluster2Name);
-  auto* route3 = new_route_config.mutable_virtual_hosts(0)->add_routes();
-  route3->mutable_match()->set_path("/grpc.testing.EchoTest3Service/Echo3");
-  route3->mutable_route()->set_cluster(kDefaultClusterName);
   auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes();
   default_route->mutable_match()->set_prefix("");
   default_route->mutable_route()->set_cluster(kDefaultClusterName);
   SetRouteConfiguration(0, new_route_config);
-  WaitForAllBackends(0, 2);
   CheckRpcSendOk(kNumEchoRpcs, RpcOptions().set_wait_for_ready(true));
   CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions()
                                     .set_rpc_service(SERVICE_ECHO1)
                                     .set_rpc_method(METHOD_ECHO1)
                                     .set_wait_for_ready(true));
-  CheckRpcSendOk(kNumEcho2Rpcs, RpcOptions()
-                                    .set_rpc_service(SERVICE_ECHO2)
-                                    .set_rpc_method(METHOD_ECHO2)
-                                    .set_wait_for_ready(true));
   // Make sure RPCs all go to the correct backend.
-  for (size_t i = 0; i < 2; ++i) {
-    EXPECT_EQ(kNumEchoRpcs / 2,
-              backends_[i]->backend_service()->request_count());
-    EXPECT_EQ(0, backends_[i]->backend_service1()->request_count());
-    EXPECT_EQ(0, backends_[i]->backend_service2()->request_count());
-  }
+  EXPECT_EQ(kNumEchoRpcs, backends_[0]->backend_service()->request_count());
+  EXPECT_EQ(0, backends_[0]->backend_service1()->request_count());
+  EXPECT_EQ(0, backends_[1]->backend_service()->request_count());
+  EXPECT_EQ(0, backends_[1]->backend_service1()->request_count());
   EXPECT_EQ(0, backends_[2]->backend_service()->request_count());
   EXPECT_EQ(kNumEcho1Rpcs, backends_[2]->backend_service1()->request_count());
-  EXPECT_EQ(0, backends_[2]->backend_service2()->request_count());
-  EXPECT_EQ(0, backends_[3]->backend_service()->request_count());
-  EXPECT_EQ(0, backends_[3]->backend_service1()->request_count());
-  EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count());
 }
 
-TEST_P(LdsRdsTest, XdsRoutingPrefixMatching) {
+TEST_P(LdsRdsTest, XdsRoutingPathRegexMatching) {
   const char* kNewCluster1Name = "new_cluster_1";
   const char* kNewEdsService1Name = "new_eds_service_name_1";
   const char* kNewCluster2Name = "new_cluster_2";
@@ -3230,31 +3533,31 @@ TEST_P(LdsRdsTest, XdsRoutingPrefixMatching) {
   AdsServiceImpl::EdsResourceArgs args2({
       {"locality0", GetBackendPorts(3, 4)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsService1Name));
+      BuildEdsResource(args1, kNewEdsService1Name));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args2, kNewEdsService2Name));
+      BuildEdsResource(args2, kNewEdsService2Name));
   // Populate new CDS resources.
-  Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster1 = default_cluster_;
   new_cluster1.set_name(kNewCluster1Name);
   new_cluster1.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService1Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
-  Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster2 = default_cluster_;
   new_cluster2.set_name(kNewCluster2Name);
   new_cluster2.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService2Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
   // Populating Route Configurations for LDS.
-  RouteConfiguration new_route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration new_route_config = default_route_config_;
   auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
-  route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
+  // Will match "/grpc.testing.EchoTest1Service/"
+  route1->mutable_match()->mutable_safe_regex()->set_regex(".*1.*");
   route1->mutable_route()->set_cluster(kNewCluster1Name);
   auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes();
-  route2->mutable_match()->set_prefix("/grpc.testing.EchoTest2Service/");
+  // Will match "/grpc.testing.EchoTest2Service/"
+  route2->mutable_match()->mutable_safe_regex()->set_regex(".*2.*");
   route2->mutable_route()->set_cluster(kNewCluster2Name);
   auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes();
   default_route->mutable_match()->set_prefix("");
@@ -3283,79 +3586,70 @@ TEST_P(LdsRdsTest, XdsRoutingPrefixMatching) {
   EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count());
 }
 
-TEST_P(LdsRdsTest, XdsRoutingPathRegexMatching) {
+TEST_P(LdsRdsTest, XdsRoutingPathRegexMatchingCaseInsensitive) {
   const char* kNewCluster1Name = "new_cluster_1";
   const char* kNewEdsService1Name = "new_eds_service_name_1";
   const char* kNewCluster2Name = "new_cluster_2";
   const char* kNewEdsService2Name = "new_eds_service_name_2";
   const size_t kNumEcho1Rpcs = 10;
-  const size_t kNumEcho2Rpcs = 20;
   const size_t kNumEchoRpcs = 30;
   SetNextResolution({});
   SetNextResolutionForLbChannelAllBalancers();
   // Populate new EDS resources.
   AdsServiceImpl::EdsResourceArgs args({
-      {"locality0", GetBackendPorts(0, 2)},
+      {"locality0", GetBackendPorts(0, 1)},
   });
   AdsServiceImpl::EdsResourceArgs args1({
-      {"locality0", GetBackendPorts(2, 3)},
+      {"locality0", GetBackendPorts(1, 2)},
   });
   AdsServiceImpl::EdsResourceArgs args2({
-      {"locality0", GetBackendPorts(3, 4)},
+      {"locality0", GetBackendPorts(2, 3)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+      BuildEdsResource(args1, kNewEdsService1Name));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsService1Name));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args2, kNewEdsService2Name));
+      BuildEdsResource(args2, kNewEdsService2Name));
   // Populate new CDS resources.
-  Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster1 = default_cluster_;
   new_cluster1.set_name(kNewCluster1Name);
   new_cluster1.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService1Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
-  Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster2 = default_cluster_;
   new_cluster2.set_name(kNewCluster2Name);
   new_cluster2.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService2Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
   // Populating Route Configurations for LDS.
-  RouteConfiguration new_route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration new_route_config = default_route_config_;
+  // First route will not match, since it's case-sensitive.
+  // Second route will match with same path.
   auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
-  // Will match "/grpc.testing.EchoTest1Service/"
-  route1->mutable_match()->mutable_safe_regex()->set_regex(".*1.*");
+  route1->mutable_match()->mutable_safe_regex()->set_regex(
+      ".*EcHoTeSt1SErViCe.*");
   route1->mutable_route()->set_cluster(kNewCluster1Name);
   auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes();
-  // Will match "/grpc.testing.EchoTest2Service/"
-  route2->mutable_match()->mutable_safe_regex()->set_regex(".*2.*");
+  route2->mutable_match()->mutable_safe_regex()->set_regex(
+      ".*EcHoTeSt1SErViCe.*");
+  route2->mutable_match()->mutable_case_sensitive()->set_value(false);
   route2->mutable_route()->set_cluster(kNewCluster2Name);
   auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes();
   default_route->mutable_match()->set_prefix("");
   default_route->mutable_route()->set_cluster(kDefaultClusterName);
   SetRouteConfiguration(0, new_route_config);
-  WaitForAllBackends(0, 2);
   CheckRpcSendOk(kNumEchoRpcs, RpcOptions().set_wait_for_ready(true));
-  CheckRpcSendOk(
-      kNumEcho1Rpcs,
-      RpcOptions().set_rpc_service(SERVICE_ECHO1).set_wait_for_ready(true));
-  CheckRpcSendOk(
-      kNumEcho2Rpcs,
-      RpcOptions().set_rpc_service(SERVICE_ECHO2).set_wait_for_ready(true));
+  CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions()
+                                    .set_rpc_service(SERVICE_ECHO1)
+                                    .set_rpc_method(METHOD_ECHO1)
+                                    .set_wait_for_ready(true));
   // Make sure RPCs all go to the correct backend.
-  for (size_t i = 0; i < 2; ++i) {
-    EXPECT_EQ(kNumEchoRpcs / 2,
-              backends_[i]->backend_service()->request_count());
-    EXPECT_EQ(0, backends_[i]->backend_service1()->request_count());
-    EXPECT_EQ(0, backends_[i]->backend_service2()->request_count());
-  }
+  EXPECT_EQ(kNumEchoRpcs, backends_[0]->backend_service()->request_count());
+  EXPECT_EQ(0, backends_[0]->backend_service1()->request_count());
+  EXPECT_EQ(0, backends_[1]->backend_service()->request_count());
+  EXPECT_EQ(0, backends_[1]->backend_service1()->request_count());
   EXPECT_EQ(0, backends_[2]->backend_service()->request_count());
   EXPECT_EQ(kNumEcho1Rpcs, backends_[2]->backend_service1()->request_count());
-  EXPECT_EQ(0, backends_[2]->backend_service2()->request_count());
-  EXPECT_EQ(0, backends_[3]->backend_service()->request_count());
-  EXPECT_EQ(0, backends_[3]->backend_service1()->request_count());
-  EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count());
 }
 
 TEST_P(LdsRdsTest, XdsRoutingWeightedCluster) {
@@ -3379,26 +3673,24 @@ TEST_P(LdsRdsTest, XdsRoutingWeightedCluster) {
   AdsServiceImpl::EdsResourceArgs args2({
       {"locality0", GetBackendPorts(2, 3)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+      BuildEdsResource(args1, kNewEdsService1Name));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsService1Name));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args2, kNewEdsService2Name));
+      BuildEdsResource(args2, kNewEdsService2Name));
   // Populate new CDS resources.
-  Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster1 = default_cluster_;
   new_cluster1.set_name(kNewCluster1Name);
   new_cluster1.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService1Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
-  Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster2 = default_cluster_;
   new_cluster2.set_name(kNewCluster2Name);
   new_cluster2.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService2Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
   // Populating Route Configurations for LDS.
-  RouteConfiguration new_route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration new_route_config = default_route_config_;
   auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   auto* weighted_cluster1 =
@@ -3468,26 +3760,24 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetDefaultRoute) {
   AdsServiceImpl::EdsResourceArgs args2({
       {"locality0", GetBackendPorts(2, 3)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsService1Name));
+      BuildEdsResource(args1, kNewEdsService1Name));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args2, kNewEdsService2Name));
+      BuildEdsResource(args2, kNewEdsService2Name));
   // Populate new CDS resources.
-  Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster1 = default_cluster_;
   new_cluster1.set_name(kNewCluster1Name);
   new_cluster1.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService1Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
-  Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster2 = default_cluster_;
   new_cluster2.set_name(kNewCluster2Name);
   new_cluster2.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService2Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
   // Populating Route Configurations for LDS.
-  RouteConfiguration new_route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration new_route_config = default_route_config_;
   auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("");
   auto* weighted_cluster1 =
@@ -3556,33 +3846,31 @@ TEST_P(LdsRdsTest, XdsRoutingWeightedClusterUpdateWeights) {
   AdsServiceImpl::EdsResourceArgs args3({
       {"locality0", GetBackendPorts(3, 4)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+      BuildEdsResource(args1, kNewEdsService1Name));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsService1Name));
+      BuildEdsResource(args2, kNewEdsService2Name));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args2, kNewEdsService2Name));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args3, kNewEdsService3Name));
+      BuildEdsResource(args3, kNewEdsService3Name));
   // Populate new CDS resources.
-  Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster1 = default_cluster_;
   new_cluster1.set_name(kNewCluster1Name);
   new_cluster1.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService1Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
-  Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster2 = default_cluster_;
   new_cluster2.set_name(kNewCluster2Name);
   new_cluster2.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService2Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
-  Cluster new_cluster3 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster3 = default_cluster_;
   new_cluster3.set_name(kNewCluster3Name);
   new_cluster3.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService3Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster3);
   // Populating Route Configurations.
-  RouteConfiguration new_route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration new_route_config = default_route_config_;
   auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   auto* weighted_cluster1 =
@@ -3694,33 +3982,31 @@ TEST_P(LdsRdsTest, XdsRoutingWeightedClusterUpdateClusters) {
   AdsServiceImpl::EdsResourceArgs args3({
       {"locality0", GetBackendPorts(3, 4)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsService1Name));
+      BuildEdsResource(args1, kNewEdsService1Name));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args2, kNewEdsService2Name));
+      BuildEdsResource(args2, kNewEdsService2Name));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args3, kNewEdsService3Name));
+      BuildEdsResource(args3, kNewEdsService3Name));
   // Populate new CDS resources.
-  Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster1 = default_cluster_;
   new_cluster1.set_name(kNewCluster1Name);
   new_cluster1.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService1Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
-  Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster2 = default_cluster_;
   new_cluster2.set_name(kNewCluster2Name);
   new_cluster2.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService2Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
-  Cluster new_cluster3 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster3 = default_cluster_;
   new_cluster3.set_name(kNewCluster3Name);
   new_cluster3.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService3Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster3);
   // Populating Route Configurations.
-  RouteConfiguration new_route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration new_route_config = default_route_config_;
   auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   auto* weighted_cluster1 =
@@ -3847,19 +4133,17 @@ TEST_P(LdsRdsTest, XdsRoutingClusterUpdateClusters) {
   AdsServiceImpl::EdsResourceArgs args1({
       {"locality0", GetBackendPorts(1, 2)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsServiceName));
+      BuildEdsResource(args1, kNewEdsServiceName));
   // Populate new CDS resources.
-  Cluster new_cluster = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster = default_cluster_;
   new_cluster.set_name(kNewClusterName);
   new_cluster.mutable_eds_cluster_config()->set_service_name(
       kNewEdsServiceName);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster);
   // Send Route Configuration.
-  RouteConfiguration new_route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration new_route_config = default_route_config_;
   SetRouteConfiguration(0, new_route_config);
   WaitForAllBackends(0, 1);
   CheckRpcSendOk(kNumEchoRpcs);
@@ -3888,12 +4172,11 @@ TEST_P(LdsRdsTest, XdsRoutingClusterUpdateClustersWithPickingDelays) {
   AdsServiceImpl::EdsResourceArgs args1({
       {"locality0", GetBackendPorts(1, 2)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsServiceName));
+      BuildEdsResource(args1, kNewEdsServiceName));
   // Populate new CDS resources.
-  Cluster new_cluster = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster = default_cluster_;
   new_cluster.set_name(kNewClusterName);
   new_cluster.mutable_eds_cluster_config()->set_service_name(
       kNewEdsServiceName);
@@ -3903,8 +4186,7 @@ TEST_P(LdsRdsTest, XdsRoutingClusterUpdateClustersWithPickingDelays) {
   ShutdownBackend(0);
   // Send a RouteConfiguration with a default route that points to
   // backend 0.
-  RouteConfiguration new_route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration new_route_config = default_route_config_;
   SetRouteConfiguration(0, new_route_config);
   // Send exactly one RPC with no deadline and with wait_for_ready=true.
   // This RPC will not complete until after backend 0 is started.
@@ -3932,6 +4214,388 @@ TEST_P(LdsRdsTest, XdsRoutingClusterUpdateClustersWithPickingDelays) {
   EXPECT_EQ(1, backends_[1]->backend_service()->request_count());
 }
 
+TEST_P(LdsRdsTest, XdsRoutingApplyXdsTimeout) {
+  // TODO(https://github.com/grpc/grpc/issues/24549): TSAN won't work here.
+  if (BuiltUnderAsan() || BuiltUnderTsan()) return;
+
+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT", "true");
+  const int64_t kTimeoutNano = 500000000;
+  const int64_t kTimeoutGrpcTimeoutHeaderMaxSecond = 1;
+  const int64_t kTimeoutMaxStreamDurationSecond = 2;
+  const int64_t kTimeoutHttpMaxStreamDurationSecond = 3;
+  const int64_t kTimeoutApplicationSecond = 4;
+  const char* kNewCluster1Name = "new_cluster_1";
+  const char* kNewEdsService1Name = "new_eds_service_name_1";
+  const char* kNewCluster2Name = "new_cluster_2";
+  const char* kNewEdsService2Name = "new_eds_service_name_2";
+  const char* kNewCluster3Name = "new_cluster_3";
+  const char* kNewEdsService3Name = "new_eds_service_name_3";
+  SetNextResolution({});
+  SetNextResolutionForLbChannelAllBalancers();
+  // Populate new EDS resources.
+  AdsServiceImpl::EdsResourceArgs args({
+      {"locality0", {g_port_saver->GetPort()}},
+  });
+  AdsServiceImpl::EdsResourceArgs args1({
+      {"locality0", {g_port_saver->GetPort()}},
+  });
+  AdsServiceImpl::EdsResourceArgs args2({
+      {"locality0", {g_port_saver->GetPort()}},
+  });
+  AdsServiceImpl::EdsResourceArgs args3({
+      {"locality0", {g_port_saver->GetPort()}},
+  });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(
+      BuildEdsResource(args1, kNewEdsService1Name));
+  balancers_[0]->ads_service()->SetEdsResource(
+      BuildEdsResource(args2, kNewEdsService2Name));
+  balancers_[0]->ads_service()->SetEdsResource(
+      BuildEdsResource(args3, kNewEdsService3Name));
+  // Populate new CDS resources.
+  Cluster new_cluster1 = default_cluster_;
+  new_cluster1.set_name(kNewCluster1Name);
+  new_cluster1.mutable_eds_cluster_config()->set_service_name(
+      kNewEdsService1Name);
+  balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
+  Cluster new_cluster2 = default_cluster_;
+  new_cluster2.set_name(kNewCluster2Name);
+  new_cluster2.mutable_eds_cluster_config()->set_service_name(
+      kNewEdsService2Name);
+  balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
+  Cluster new_cluster3 = default_cluster_;
+  new_cluster3.set_name(kNewCluster3Name);
+  new_cluster3.mutable_eds_cluster_config()->set_service_name(
+      kNewEdsService3Name);
+  balancers_[0]->ads_service()->SetCdsResource(new_cluster3);
+  // Construct listener.
+  auto listener = default_listener_;
+  HttpConnectionManager http_connection_manager;
+  // Set up HTTP max_stream_duration of 3.5 seconds
+  auto* duration =
+      http_connection_manager.mutable_common_http_protocol_options()
+          ->mutable_max_stream_duration();
+  duration->set_seconds(kTimeoutHttpMaxStreamDurationSecond);
+  duration->set_nanos(kTimeoutNano);
+  listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
+      http_connection_manager);
+  // Construct route config.
+  RouteConfiguration new_route_config = default_route_config_;
+  // route 1: Set max_stream_duration of 2.5 seconds, Set
+  // grpc_timeout_header_max of 1.5
+  auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
+  route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/Echo1");
+  route1->mutable_route()->set_cluster(kNewCluster1Name);
+  auto* max_stream_duration =
+      route1->mutable_route()->mutable_max_stream_duration();
+  duration = max_stream_duration->mutable_max_stream_duration();
+  duration->set_seconds(kTimeoutMaxStreamDurationSecond);
+  duration->set_nanos(kTimeoutNano);
+  duration = max_stream_duration->mutable_grpc_timeout_header_max();
+  duration->set_seconds(kTimeoutGrpcTimeoutHeaderMaxSecond);
+  duration->set_nanos(kTimeoutNano);
+  // route 2: Set max_stream_duration of 2.5 seconds
+  auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes();
+  route2->mutable_match()->set_path("/grpc.testing.EchoTest2Service/Echo2");
+  route2->mutable_route()->set_cluster(kNewCluster2Name);
+  max_stream_duration = route2->mutable_route()->mutable_max_stream_duration();
+  duration = max_stream_duration->mutable_max_stream_duration();
+  duration->set_seconds(kTimeoutMaxStreamDurationSecond);
+  duration->set_nanos(kTimeoutNano);
+  // route 3: No timeout values in route configuration
+  auto* route3 = new_route_config.mutable_virtual_hosts(0)->add_routes();
+  route3->mutable_match()->set_path("/grpc.testing.EchoTestService/Echo");
+  route3->mutable_route()->set_cluster(kNewCluster3Name);
+  // Set listener and route config.
+  SetListenerAndRouteConfiguration(0, std::move(listener), new_route_config);
+  // Test grpc_timeout_header_max of 1.5 seconds applied
+  auto t0 = system_clock::now();
+  CheckRpcSendFailure(1,
+                      RpcOptions()
+                          .set_rpc_service(SERVICE_ECHO1)
+                          .set_rpc_method(METHOD_ECHO1)
+                          .set_wait_for_ready(true)
+                          .set_timeout_ms(kTimeoutApplicationSecond * 1000),
+                      StatusCode::DEADLINE_EXCEEDED);
+  auto ellapsed_nano_seconds =
+      std::chrono::duration_cast<std::chrono::nanoseconds>(system_clock::now() -
+                                                           t0);
+  EXPECT_GT(ellapsed_nano_seconds.count(),
+            kTimeoutGrpcTimeoutHeaderMaxSecond * 1000000000 + kTimeoutNano);
+  EXPECT_LT(ellapsed_nano_seconds.count(),
+            kTimeoutMaxStreamDurationSecond * 1000000000);
+  // Test max_stream_duration of 2.5 seconds applied
+  t0 = system_clock::now();
+  CheckRpcSendFailure(1,
+                      RpcOptions()
+                          .set_rpc_service(SERVICE_ECHO2)
+                          .set_rpc_method(METHOD_ECHO2)
+                          .set_wait_for_ready(true)
+                          .set_timeout_ms(kTimeoutApplicationSecond * 1000),
+                      StatusCode::DEADLINE_EXCEEDED);
+  ellapsed_nano_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>(
+      system_clock::now() - t0);
+  EXPECT_GT(ellapsed_nano_seconds.count(),
+            kTimeoutMaxStreamDurationSecond * 1000000000 + kTimeoutNano);
+  EXPECT_LT(ellapsed_nano_seconds.count(),
+            kTimeoutHttpMaxStreamDurationSecond * 1000000000);
+  // Test http_stream_duration of 3.5 seconds applied
+  t0 = system_clock::now();
+  CheckRpcSendFailure(1,
+                      RpcOptions().set_wait_for_ready(true).set_timeout_ms(
+                          kTimeoutApplicationSecond * 1000),
+                      StatusCode::DEADLINE_EXCEEDED);
+  ellapsed_nano_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>(
+      system_clock::now() - t0);
+  EXPECT_GT(ellapsed_nano_seconds.count(),
+            kTimeoutHttpMaxStreamDurationSecond * 1000000000 + kTimeoutNano);
+  EXPECT_LT(ellapsed_nano_seconds.count(),
+            kTimeoutApplicationSecond * 1000000000);
+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT");
+}
+
+TEST_P(LdsRdsTest, XdsRoutingXdsTimeoutDisabled) {
+  const int64_t kTimeoutMillis = 500;
+  const int64_t kTimeoutNano = kTimeoutMillis * 1000000;
+  const int64_t kTimeoutGrpcTimeoutHeaderMaxSecond = 1;
+  const int64_t kTimeoutApplicationSecond = 4;
+  SetNextResolution({});
+  SetNextResolutionForLbChannelAllBalancers();
+  // Populate new EDS resources.
+  AdsServiceImpl::EdsResourceArgs args({
+      {"locality0", {g_port_saver->GetPort()}},
+  });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+  RouteConfiguration new_route_config = default_route_config_;
+  // route 1: Set grpc_timeout_header_max of 1.5
+  auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
+  auto* max_stream_duration =
+      route1->mutable_route()->mutable_max_stream_duration();
+  auto* duration = max_stream_duration->mutable_grpc_timeout_header_max();
+  duration->set_seconds(kTimeoutGrpcTimeoutHeaderMaxSecond);
+  duration->set_nanos(kTimeoutNano);
+  SetRouteConfiguration(0, new_route_config);
+  // Test grpc_timeout_header_max of 1.5 seconds is not applied
+  gpr_timespec t0 = gpr_now(GPR_CLOCK_MONOTONIC);
+  gpr_timespec est_timeout_time = gpr_time_add(
+      t0, gpr_time_from_millis(
+              kTimeoutGrpcTimeoutHeaderMaxSecond * 1000 + kTimeoutMillis,
+              GPR_TIMESPAN));
+  CheckRpcSendFailure(1,
+                      RpcOptions()
+                          .set_rpc_service(SERVICE_ECHO1)
+                          .set_rpc_method(METHOD_ECHO1)
+                          .set_wait_for_ready(true)
+                          .set_timeout_ms(kTimeoutApplicationSecond * 1000),
+                      StatusCode::DEADLINE_EXCEEDED);
+  gpr_timespec timeout_time = gpr_now(GPR_CLOCK_MONOTONIC);
+  EXPECT_GT(gpr_time_cmp(timeout_time, est_timeout_time), 0);
+}
+
+TEST_P(LdsRdsTest, XdsRoutingHttpTimeoutDisabled) {
+  const int64_t kTimeoutMillis = 500;
+  const int64_t kTimeoutNano = kTimeoutMillis * 1000000;
+  const int64_t kTimeoutHttpMaxStreamDurationSecond = 3;
+  const int64_t kTimeoutApplicationSecond = 4;
+  SetNextResolution({});
+  SetNextResolutionForLbChannelAllBalancers();
+  // Populate new EDS resources.
+  AdsServiceImpl::EdsResourceArgs args({
+      {"locality0", {g_port_saver->GetPort()}},
+  });
+  // Construct listener.
+  auto listener = default_listener_;
+  HttpConnectionManager http_connection_manager;
+  // Set up HTTP max_stream_duration of 3.5 seconds
+  auto* duration =
+      http_connection_manager.mutable_common_http_protocol_options()
+          ->mutable_max_stream_duration();
+  duration->set_seconds(kTimeoutHttpMaxStreamDurationSecond);
+  duration->set_nanos(kTimeoutNano);
+  listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
+      http_connection_manager);
+  SetListenerAndRouteConfiguration(0, std::move(listener),
+                                   default_route_config_);
+  // Test http_stream_duration of 3.5 seconds is not applied
+  auto t0 = gpr_now(GPR_CLOCK_MONOTONIC);
+  auto est_timeout_time = gpr_time_add(
+      t0, gpr_time_from_millis(
+              kTimeoutHttpMaxStreamDurationSecond * 1000 + kTimeoutMillis,
+              GPR_TIMESPAN));
+  CheckRpcSendFailure(1,
+                      RpcOptions().set_wait_for_ready(true).set_timeout_ms(
+                          kTimeoutApplicationSecond * 1000),
+                      StatusCode::DEADLINE_EXCEEDED);
+  auto timeout_time = gpr_now(GPR_CLOCK_MONOTONIC);
+  EXPECT_GT(gpr_time_cmp(timeout_time, est_timeout_time), 0);
+}
+
+TEST_P(LdsRdsTest, XdsRoutingApplyApplicationTimeoutWhenXdsTimeoutExplicit0) {
+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT", "true");
+  const int64_t kTimeoutNano = 500000000;
+  const int64_t kTimeoutMaxStreamDurationSecond = 2;
+  const int64_t kTimeoutHttpMaxStreamDurationSecond = 3;
+  const int64_t kTimeoutApplicationSecond = 4;
+  const char* kNewCluster1Name = "new_cluster_1";
+  const char* kNewEdsService1Name = "new_eds_service_name_1";
+  const char* kNewCluster2Name = "new_cluster_2";
+  const char* kNewEdsService2Name = "new_eds_service_name_2";
+  SetNextResolution({});
+  SetNextResolutionForLbChannelAllBalancers();
+  // Populate new EDS resources.
+  AdsServiceImpl::EdsResourceArgs args({
+      {"locality0", {g_port_saver->GetPort()}},
+  });
+  AdsServiceImpl::EdsResourceArgs args1({
+      {"locality0", {g_port_saver->GetPort()}},
+  });
+  AdsServiceImpl::EdsResourceArgs args2({
+      {"locality0", {g_port_saver->GetPort()}},
+  });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(
+      BuildEdsResource(args1, kNewEdsService1Name));
+  balancers_[0]->ads_service()->SetEdsResource(
+      BuildEdsResource(args2, kNewEdsService2Name));
+  // Populate new CDS resources.
+  Cluster new_cluster1 = default_cluster_;
+  new_cluster1.set_name(kNewCluster1Name);
+  new_cluster1.mutable_eds_cluster_config()->set_service_name(
+      kNewEdsService1Name);
+  balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
+  Cluster new_cluster2 = default_cluster_;
+  new_cluster2.set_name(kNewCluster2Name);
+  new_cluster2.mutable_eds_cluster_config()->set_service_name(
+      kNewEdsService2Name);
+  balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
+  // Construct listener.
+  auto listener = default_listener_;
+  HttpConnectionManager http_connection_manager;
+  // Set up HTTP max_stream_duration of 3.5 seconds
+  auto* duration =
+      http_connection_manager.mutable_common_http_protocol_options()
+          ->mutable_max_stream_duration();
+  duration->set_seconds(kTimeoutHttpMaxStreamDurationSecond);
+  duration->set_nanos(kTimeoutNano);
+  listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
+      http_connection_manager);
+  // Construct route config.
+  RouteConfiguration new_route_config = default_route_config_;
+  // route 1: Set max_stream_duration of 2.5 seconds, Set
+  // grpc_timeout_header_max of 0
+  auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
+  route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/Echo1");
+  route1->mutable_route()->set_cluster(kNewCluster1Name);
+  auto* max_stream_duration =
+      route1->mutable_route()->mutable_max_stream_duration();
+  duration = max_stream_duration->mutable_max_stream_duration();
+  duration->set_seconds(kTimeoutMaxStreamDurationSecond);
+  duration->set_nanos(kTimeoutNano);
+  duration = max_stream_duration->mutable_grpc_timeout_header_max();
+  duration->set_seconds(0);
+  duration->set_nanos(0);
+  // route 2: Set max_stream_duration to 0
+  auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes();
+  route2->mutable_match()->set_path("/grpc.testing.EchoTest2Service/Echo2");
+  route2->mutable_route()->set_cluster(kNewCluster2Name);
+  max_stream_duration = route2->mutable_route()->mutable_max_stream_duration();
+  duration = max_stream_duration->mutable_max_stream_duration();
+  duration->set_seconds(0);
+  duration->set_nanos(0);
+  // Set listener and route config.
+  SetListenerAndRouteConfiguration(0, std::move(listener), new_route_config);
+  // Test application timeout is applied for route 1
+  auto t0 = system_clock::now();
+  CheckRpcSendFailure(1,
+                      RpcOptions()
+                          .set_rpc_service(SERVICE_ECHO1)
+                          .set_rpc_method(METHOD_ECHO1)
+                          .set_wait_for_ready(true)
+                          .set_timeout_ms(kTimeoutApplicationSecond * 1000),
+                      StatusCode::DEADLINE_EXCEEDED);
+  auto ellapsed_nano_seconds =
+      std::chrono::duration_cast<std::chrono::nanoseconds>(system_clock::now() -
+                                                           t0);
+  EXPECT_GT(ellapsed_nano_seconds.count(),
+            kTimeoutApplicationSecond * 1000000000);
+  // Test application timeout is applied for route 2
+  t0 = system_clock::now();
+  CheckRpcSendFailure(1,
+                      RpcOptions()
+                          .set_rpc_service(SERVICE_ECHO2)
+                          .set_rpc_method(METHOD_ECHO2)
+                          .set_wait_for_ready(true)
+                          .set_timeout_ms(kTimeoutApplicationSecond * 1000),
+                      StatusCode::DEADLINE_EXCEEDED);
+  ellapsed_nano_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>(
+      system_clock::now() - t0);
+  EXPECT_GT(ellapsed_nano_seconds.count(),
+            kTimeoutApplicationSecond * 1000000000);
+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT");
+}
+
+TEST_P(LdsRdsTest, XdsRoutingApplyApplicationTimeoutWhenHttpTimeoutExplicit0) {
+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT", "true");
+  const int64_t kTimeoutApplicationSecond = 4;
+  SetNextResolution({});
+  SetNextResolutionForLbChannelAllBalancers();
+  // Populate new EDS resources.
+  AdsServiceImpl::EdsResourceArgs args({
+      {"locality0", {g_port_saver->GetPort()}},
+  });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+  HttpConnectionManager http_connection_manager;
+  // Set up HTTP max_stream_duration to be explicit 0
+  auto* duration =
+      http_connection_manager.mutable_common_http_protocol_options()
+          ->mutable_max_stream_duration();
+  duration->set_seconds(0);
+  duration->set_nanos(0);
+  auto listener = default_listener_;
+  listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
+      http_connection_manager);
+  // Set listener and route config.
+  SetListenerAndRouteConfiguration(0, std::move(listener),
+                                   default_route_config_);
+  // Test application timeout is applied for route 1
+  auto t0 = system_clock::now();
+  CheckRpcSendFailure(1,
+                      RpcOptions().set_wait_for_ready(true).set_timeout_ms(
+                          kTimeoutApplicationSecond * 1000),
+                      StatusCode::DEADLINE_EXCEEDED);
+  auto ellapsed_nano_seconds =
+      std::chrono::duration_cast<std::chrono::nanoseconds>(system_clock::now() -
+                                                           t0);
+  EXPECT_GT(ellapsed_nano_seconds.count(),
+            kTimeoutApplicationSecond * 1000000000);
+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT");
+}
+
+// Test to ensure application-specified deadline won't be affected when
+// the xDS config does not specify a timeout.
+TEST_P(LdsRdsTest, XdsRoutingWithOnlyApplicationTimeout) {
+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT", "true");
+  const int64_t kTimeoutApplicationSecond = 4;
+  SetNextResolution({});
+  SetNextResolutionForLbChannelAllBalancers();
+  // Populate new EDS resources.
+  AdsServiceImpl::EdsResourceArgs args({
+      {"locality0", {g_port_saver->GetPort()}},
+  });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+  auto t0 = system_clock::now();
+  CheckRpcSendFailure(1,
+                      RpcOptions().set_wait_for_ready(true).set_timeout_ms(
+                          kTimeoutApplicationSecond * 1000),
+                      StatusCode::DEADLINE_EXCEEDED);
+  auto ellapsed_nano_seconds =
+      std::chrono::duration_cast<std::chrono::nanoseconds>(system_clock::now() -
+                                                           t0);
+  EXPECT_GT(ellapsed_nano_seconds.count(),
+            kTimeoutApplicationSecond * 1000000000);
+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT");
+}
+
 TEST_P(LdsRdsTest, XdsRoutingHeadersMatching) {
   const char* kNewClusterName = "new_cluster";
   const char* kNewEdsServiceName = "new_eds_service_name";
@@ -3946,19 +4610,17 @@ TEST_P(LdsRdsTest, XdsRoutingHeadersMatching) {
   AdsServiceImpl::EdsResourceArgs args1({
       {"locality0", GetBackendPorts(1, 2)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsServiceName));
+      BuildEdsResource(args1, kNewEdsServiceName));
   // Populate new CDS resources.
-  Cluster new_cluster = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster = default_cluster_;
   new_cluster.set_name(kNewClusterName);
   new_cluster.mutable_eds_cluster_config()->set_service_name(
       kNewEdsServiceName);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster);
   // Populating Route Configurations for LDS.
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   auto* header_matcher1 = route1->mutable_match()->add_headers();
@@ -4025,19 +4687,17 @@ TEST_P(LdsRdsTest, XdsRoutingHeadersMatchingSpecialHeaderContentType) {
   AdsServiceImpl::EdsResourceArgs args1({
       {"locality0", GetBackendPorts(1, 2)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsServiceName));
+      BuildEdsResource(args1, kNewEdsServiceName));
   // Populate new CDS resources.
-  Cluster new_cluster = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster = default_cluster_;
   new_cluster.set_name(kNewClusterName);
   new_cluster.mutable_eds_cluster_config()->set_service_name(
       kNewEdsServiceName);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster);
   // Populating Route Configurations for LDS.
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("");
   auto* header_matcher1 = route1->mutable_match()->add_headers();
@@ -4079,26 +4739,24 @@ TEST_P(LdsRdsTest, XdsRoutingHeadersMatchingSpecialCasesToIgnore) {
   AdsServiceImpl::EdsResourceArgs args2({
       {"locality0", GetBackendPorts(2, 3)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+      BuildEdsResource(args1, kNewEdsService1Name));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsService1Name));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args2, kNewEdsService2Name));
+      BuildEdsResource(args2, kNewEdsService2Name));
   // Populate new CDS resources.
-  Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster1 = default_cluster_;
   new_cluster1.set_name(kNewCluster1Name);
   new_cluster1.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService1Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
-  Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster2 = default_cluster_;
   new_cluster2.set_name(kNewCluster2Name);
   new_cluster2.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService2Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
   // Populating Route Configurations for LDS.
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("");
   auto* header_matcher1 = route1->mutable_match()->add_headers();
@@ -4144,19 +4802,17 @@ TEST_P(LdsRdsTest, XdsRoutingRuntimeFractionMatching) {
   AdsServiceImpl::EdsResourceArgs args1({
       {"locality0", GetBackendPorts(1, 2)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsServiceName));
+      BuildEdsResource(args1, kNewEdsServiceName));
   // Populate new CDS resources.
-  Cluster new_cluster = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster = default_cluster_;
   new_cluster.set_name(kNewClusterName);
   new_cluster.mutable_eds_cluster_config()->set_service_name(
       kNewEdsServiceName);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster);
   // Populating Route Configurations for LDS.
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()
       ->mutable_runtime_fraction()
@@ -4210,33 +4866,31 @@ TEST_P(LdsRdsTest, XdsRoutingHeadersMatchingUnmatchCases) {
   AdsServiceImpl::EdsResourceArgs args3({
       {"locality0", GetBackendPorts(3, 4)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+      BuildEdsResource(args1, kNewEdsService1Name));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsService1Name));
+      BuildEdsResource(args2, kNewEdsService2Name));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args2, kNewEdsService2Name));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args3, kNewEdsService3Name));
+      BuildEdsResource(args3, kNewEdsService3Name));
   // Populate new CDS resources.
-  Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster1 = default_cluster_;
   new_cluster1.set_name(kNewCluster1Name);
   new_cluster1.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService1Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
-  Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster2 = default_cluster_;
   new_cluster2.set_name(kNewCluster2Name);
   new_cluster2.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService2Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
-  Cluster new_cluster3 = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster3 = default_cluster_;
   new_cluster3.set_name(kNewCluster3Name);
   new_cluster3.mutable_eds_cluster_config()->set_service_name(
       kNewEdsService3Name);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster3);
   // Populating Route Configurations for LDS.
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   auto* header_matcher1 = route1->mutable_match()->add_headers();
@@ -4299,19 +4953,17 @@ TEST_P(LdsRdsTest, XdsRoutingChangeRoutesWithoutChangingClusters) {
   AdsServiceImpl::EdsResourceArgs args1({
       {"locality0", GetBackendPorts(1, 2)},
   });
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args1, kNewEdsServiceName));
+      BuildEdsResource(args1, kNewEdsServiceName));
   // Populate new CDS resources.
-  Cluster new_cluster = balancers_[0]->ads_service()->default_cluster();
+  Cluster new_cluster = default_cluster_;
   new_cluster.set_name(kNewClusterName);
   new_cluster.mutable_eds_cluster_config()->set_service_name(
       kNewEdsServiceName);
   balancers_[0]->ads_service()->SetCdsResource(new_cluster);
   // Populating Route Configurations for LDS.
-  RouteConfiguration route_config =
-      balancers_[0]->ads_service()->default_route_config();
+  RouteConfiguration route_config = default_route_config_;
   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0);
   route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/");
   route1->mutable_route()->set_cluster(kNewClusterName);
@@ -4366,7 +5018,7 @@ TEST_P(CdsTest, Vanilla) {
 // Tests that CDS client should send a NACK if the cluster type in CDS response
 // is other than EDS.
 TEST_P(CdsTest, WrongClusterType) {
-  auto cluster = balancers_[0]->ads_service()->default_cluster();
+  auto cluster = default_cluster_;
   cluster.set_type(Cluster::STATIC);
   balancers_[0]->ads_service()->SetCdsResource(cluster);
   SetNextResolution({});
@@ -4381,7 +5033,7 @@ TEST_P(CdsTest, WrongClusterType) {
 // Tests that CDS client should send a NACK if the eds_config in CDS response is
 // other than ADS.
 TEST_P(CdsTest, WrongEdsConfig) {
-  auto cluster = balancers_[0]->ads_service()->default_cluster();
+  auto cluster = default_cluster_;
   cluster.mutable_eds_cluster_config()->mutable_eds_config()->mutable_self();
   balancers_[0]->ads_service()->SetCdsResource(cluster);
   SetNextResolution({});
@@ -4396,7 +5048,7 @@ TEST_P(CdsTest, WrongEdsConfig) {
 // Tests that CDS client should send a NACK if the lb_policy in CDS response is
 // other than ROUND_ROBIN.
 TEST_P(CdsTest, WrongLbPolicy) {
-  auto cluster = balancers_[0]->ads_service()->default_cluster();
+  auto cluster = default_cluster_;
   cluster.set_lb_policy(Cluster::LEAST_REQUEST);
   balancers_[0]->ads_service()->SetCdsResource(cluster);
   SetNextResolution({});
@@ -4411,7 +5063,7 @@ TEST_P(CdsTest, WrongLbPolicy) {
 // Tests that CDS client should send a NACK if the lrs_server in CDS response is
 // other than SELF.
 TEST_P(CdsTest, WrongLrsServer) {
-  auto cluster = balancers_[0]->ads_service()->default_cluster();
+  auto cluster = default_cluster_;
   cluster.mutable_lrs_server()->mutable_ads();
   balancers_[0]->ads_service()->SetCdsResource(cluster);
   SetNextResolution({});
@@ -4433,8 +5085,7 @@ TEST_P(EdsTest, NacksSparsePriorityList) {
   AdsServiceImpl::EdsResourceArgs args({
       {"locality0", GetBackendPorts(), kDefaultLocalityWeight, 1},
   });
-  balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args));
+  balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
   CheckRpcSendFailure();
   const auto& response_state =
       balancers_[0]->ads_service()->eds_response_state();
@@ -4453,8 +5104,8 @@ TEST_P(EdsTest, EdsServiceNameDefaultsToClusterName) {
       {"locality0", GetBackendPorts()},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, kDefaultClusterName));
-  Cluster cluster = balancers_[0]->ads_service()->default_cluster();
+      BuildEdsResource(args, kDefaultClusterName));
+  Cluster cluster = default_cluster_;
   cluster.mutable_eds_cluster_config()->clear_service_name();
   balancers_[0]->ads_service()->SetCdsResource(cluster);
   SetNextResolution({});
@@ -4521,7 +5172,7 @@ TEST_P(LocalityMapTest, WeightedRoundRobin) {
       {"locality1", GetBackendPorts(1, 2), kLocalityWeight1},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait for both backends to be ready.
   WaitForAllBackends(0, 2);
   // Send kNumRpcs RPCs.
@@ -4555,7 +5206,7 @@ TEST_P(LocalityMapTest, LocalityContainingNoEndpoints) {
       {"locality1", {}},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait for both backends to be ready.
   WaitForAllBackends();
   // Send kNumRpcs RPCs.
@@ -4576,7 +5227,7 @@ TEST_P(LocalityMapTest, NoLocalities) {
   SetNextResolution({});
   SetNextResolutionForLbChannelAllBalancers();
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource({}, DefaultEdsServiceName()));
+      BuildEdsResource({}, DefaultEdsServiceName()));
   Status status = SendRpc();
   EXPECT_FALSE(status.ok());
   EXPECT_EQ(status.error_code(), StatusCode::UNAVAILABLE);
@@ -4598,15 +5249,14 @@ TEST_P(LocalityMapTest, StressTest) {
     args.locality_list.emplace_back(std::move(locality));
   }
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // The second ADS response contains 1 locality, which contains backend 1.
   args = AdsServiceImpl::EdsResourceArgs({
       {"locality0", GetBackendPorts(1, 2)},
   });
   std::thread delayed_resource_setter(
       std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0,
-                AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()),
-                60 * 1000));
+                BuildEdsResource(args, DefaultEdsServiceName()), 60 * 1000));
   // Wait until backend 0 is ready, before which kNumLocalities localities are
   // received and handled by the xds policy.
   WaitForBackend(0, /*reset_counters=*/false);
@@ -4628,6 +5278,7 @@ TEST_P(LocalityMapTest, UpdateMap) {
   const double kTotalLocalityWeight0 =
       std::accumulate(kLocalityWeights0.begin(), kLocalityWeights0.end(), 0);
   std::vector<double> locality_weight_rate_0;
+  locality_weight_rate_0.reserve(kLocalityWeights0.size());
   for (int weight : kLocalityWeights0) {
     locality_weight_rate_0.push_back(weight / kTotalLocalityWeight0);
   }
@@ -4647,7 +5298,7 @@ TEST_P(LocalityMapTest, UpdateMap) {
       {"locality2", GetBackendPorts(2, 3), 4},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait for the first 3 backends to be ready.
   WaitForAllBackends(0, 3);
   gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
@@ -4678,7 +5329,7 @@ TEST_P(LocalityMapTest, UpdateMap) {
       {"locality3", GetBackendPorts(3, 4), 6},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Backend 3 hasn't received any request.
   EXPECT_EQ(0U, backends_[3]->backend_service()->request_count());
   // Wait until the locality update has been processed, as signaled by backend 3
@@ -4718,13 +5369,13 @@ TEST_P(LocalityMapTest, ReplaceAllLocalitiesInPriority) {
       {"locality0", GetBackendPorts(0, 1)},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   args = AdsServiceImpl::EdsResourceArgs({
       {"locality1", GetBackendPorts(1, 2)},
   });
-  std::thread delayed_resource_setter(std::bind(
-      &BasicTest::SetEdsResourceWithDelay, this, 0,
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()), 5000));
+  std::thread delayed_resource_setter(
+      std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0,
+                BuildEdsResource(args, DefaultEdsServiceName()), 5000));
   // Wait for the first backend to be ready.
   WaitForBackend(0);
   // Keep sending RPCs until we switch over to backend 1, which tells us
@@ -4753,7 +5404,7 @@ TEST_P(FailoverTest, ChooseHighestPriority) {
       {"locality3", GetBackendPorts(3, 4), kDefaultLocalityWeight, 0},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   WaitForBackend(3, false);
   for (size_t i = 0; i < 3; ++i) {
     EXPECT_EQ(0U, backends_[i]->backend_service()->request_count());
@@ -4771,7 +5422,7 @@ TEST_P(FailoverTest, DoesNotUsePriorityWithNoEndpoints) {
       {"locality3", {}, kDefaultLocalityWeight, 0},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   WaitForBackend(0, false);
   for (size_t i = 1; i < 3; ++i) {
     EXPECT_EQ(0U, backends_[i]->backend_service()->request_count());
@@ -4787,7 +5438,7 @@ TEST_P(FailoverTest, DoesNotUseLocalityWithNoEndpoints) {
       {"locality1", GetBackendPorts(), kDefaultLocalityWeight, 0},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait for all backends to be used.
   std::tuple<int, int, int> counts = WaitForAllBackends();
   // Make sure no RPCs failed in the transition.
@@ -4808,7 +5459,7 @@ TEST_P(FailoverTest, Failover) {
   ShutdownBackend(3);
   ShutdownBackend(0);
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   WaitForBackend(1, false);
   for (size_t i = 0; i < 4; ++i) {
     if (i == 1) continue;
@@ -4831,7 +5482,7 @@ TEST_P(FailoverTest, SwitchBackToHigherPriority) {
   ShutdownBackend(3);
   ShutdownBackend(0);
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   WaitForBackend(1, false);
   for (size_t i = 0; i < 4; ++i) {
     if (i == 1) continue;
@@ -4853,7 +5504,7 @@ TEST_P(FailoverTest, UpdateInitialUnavailable) {
       {"locality1", GetBackendPorts(1, 2), kDefaultLocalityWeight, 1},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   args = AdsServiceImpl::EdsResourceArgs({
       {"locality0", GetBackendPorts(0, 1), kDefaultLocalityWeight, 0},
       {"locality1", GetBackendPorts(1, 2), kDefaultLocalityWeight, 1},
@@ -4862,9 +5513,9 @@ TEST_P(FailoverTest, UpdateInitialUnavailable) {
   });
   ShutdownBackend(0);
   ShutdownBackend(1);
-  std::thread delayed_resource_setter(std::bind(
-      &BasicTest::SetEdsResourceWithDelay, this, 0,
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()), 1000));
+  std::thread delayed_resource_setter(
+      std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0,
+                BuildEdsResource(args, DefaultEdsServiceName()), 1000));
   gpr_timespec deadline = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
                                        gpr_time_from_millis(500, GPR_TIMESPAN));
   // Send 0.5 second worth of RPCs.
@@ -4892,16 +5543,16 @@ TEST_P(FailoverTest, UpdatePriority) {
       {"locality3", GetBackendPorts(3, 4), kDefaultLocalityWeight, 0},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   args = AdsServiceImpl::EdsResourceArgs({
       {"locality0", GetBackendPorts(0, 1), kDefaultLocalityWeight, 2},
       {"locality1", GetBackendPorts(1, 2), kDefaultLocalityWeight, 0},
       {"locality2", GetBackendPorts(2, 3), kDefaultLocalityWeight, 1},
       {"locality3", GetBackendPorts(3, 4), kDefaultLocalityWeight, 3},
   });
-  std::thread delayed_resource_setter(std::bind(
-      &BasicTest::SetEdsResourceWithDelay, this, 0,
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()), 1000));
+  std::thread delayed_resource_setter(
+      std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0,
+                BuildEdsResource(args, DefaultEdsServiceName()), 1000));
   WaitForBackend(3, false);
   for (size_t i = 0; i < 3; ++i) {
     EXPECT_EQ(0U, backends_[i]->backend_service()->request_count());
@@ -4925,7 +5576,7 @@ TEST_P(FailoverTest, MoveAllLocalitiesInCurrentPriorityToHigherPriority) {
       {"locality1", GetBackendPorts(1, 3), kDefaultLocalityWeight, 1},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Second update:
   // - Priority 0 contains both localities 0 and 1.
   // - Priority 1 is not present.
@@ -4935,9 +5586,9 @@ TEST_P(FailoverTest, MoveAllLocalitiesInCurrentPriorityToHigherPriority) {
       {"locality0", GetBackendPorts(0, 1), kDefaultLocalityWeight, 0},
       {"locality1", GetBackendPorts(1, 4), kDefaultLocalityWeight, 0},
   });
-  std::thread delayed_resource_setter(std::bind(
-      &BasicTest::SetEdsResourceWithDelay, this, 0,
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()), 1000));
+  std::thread delayed_resource_setter(
+      std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0,
+                BuildEdsResource(args, DefaultEdsServiceName()), 1000));
   // When we get the first update, all backends in priority 0 are down,
   // so we will create priority 1.  Backends 1 and 2 should have traffic,
   // but backend 3 should not.
@@ -4971,7 +5622,7 @@ TEST_P(DropTest, Vanilla) {
   args.drop_categories = {{kLbDropType, kDropPerMillionForLb},
                           {kThrottleDropType, kDropPerMillionForThrottle}};
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   WaitForAllBackends();
   // Send kNumRpcs RPCs and count the drops.
   size_t num_drops = 0;
@@ -5011,7 +5662,7 @@ TEST_P(DropTest, DropPerHundred) {
   args.drop_categories = {{kLbDropType, kDropPerHundredForLb}};
   args.drop_denominator = FractionalPercent::HUNDRED;
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   WaitForAllBackends();
   // Send kNumRpcs RPCs and count the drops.
   size_t num_drops = 0;
@@ -5050,7 +5701,7 @@ TEST_P(DropTest, DropPerTenThousand) {
   args.drop_categories = {{kLbDropType, kDropPerTenThousandForLb}};
   args.drop_denominator = FractionalPercent::TEN_THOUSAND;
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   WaitForAllBackends();
   // Send kNumRpcs RPCs and count the drops.
   size_t num_drops = 0;
@@ -5092,7 +5743,7 @@ TEST_P(DropTest, Update) {
   });
   args.drop_categories = {{kLbDropType, kDropPerMillionForLb}};
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   WaitForAllBackends();
   // Send kNumRpcs RPCs and count the drops.
   size_t num_drops = 0;
@@ -5123,7 +5774,7 @@ TEST_P(DropTest, Update) {
   args.drop_categories = {{kLbDropType, kDropPerMillionForLb},
                           {kThrottleDropType, kDropPerMillionForThrottle}};
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait until the drop rate increases to the middle of the two configs, which
   // implies that the update has been in effect.
   const double kDropRateThreshold =
@@ -5181,7 +5832,7 @@ TEST_P(DropTest, DropAll) {
   args.drop_categories = {{kLbDropType, kDropPerMillionForLb},
                           {kThrottleDropType, kDropPerMillionForThrottle}};
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Send kNumRpcs RPCs and all of them are dropped.
   for (size_t i = 0; i < kNumRpcs; ++i) {
     EchoResponse response;
@@ -5205,12 +5856,12 @@ TEST_P(BalancerUpdateTest, UpdateBalancersButKeepUsingOriginalBalancer) {
       {"locality0", {backends_[0]->port()}},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   args = AdsServiceImpl::EdsResourceArgs({
       {"locality0", {backends_[1]->port()}},
   });
   balancers_[1]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait until the first backend is ready.
   WaitForBackend(0);
   // Send 10 requests.
@@ -5268,12 +5919,12 @@ TEST_P(BalancerUpdateTest, Repeated) {
       {"locality0", {backends_[0]->port()}},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   args = AdsServiceImpl::EdsResourceArgs({
       {"locality0", {backends_[1]->port()}},
   });
   balancers_[1]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait until the first backend is ready.
   WaitForBackend(0);
   // Send 10 requests.
@@ -5338,12 +5989,12 @@ TEST_P(BalancerUpdateTest, DeadUpdate) {
       {"locality0", {backends_[0]->port()}},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   args = AdsServiceImpl::EdsResourceArgs({
       {"locality0", {backends_[1]->port()}},
   });
   balancers_[1]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Start servers and send 10 RPCs per server.
   gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
   CheckRpcSendOk(10);
@@ -5413,14 +6064,6 @@ TEST_P(BalancerUpdateTest, DeadUpdate) {
       << balancers_[2]->ads_service()->eds_response_state().error_message;
 }
 
-// The re-resolution tests are deferred because they rely on the fallback mode,
-// which hasn't been supported.
-
-// TODO(juanlishen): Add TEST_P(BalancerUpdateTest, ReresolveDeadBackend).
-
-// TODO(juanlishen): Add TEST_P(UpdatesWithClientLoadReportingTest,
-// ReresolveDeadBalancer)
-
 class ClientLoadReportingTest : public XdsEnd2endTest {
  public:
   ClientLoadReportingTest() : XdsEnd2endTest(4, 1, 3) {}
@@ -5441,7 +6084,7 @@ TEST_P(ClientLoadReportingTest, Vanilla) {
       {"locality0", GetBackendPorts()},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait until all backends are ready.
   int num_ok = 0;
   int num_failure = 0;
@@ -5488,7 +6131,7 @@ TEST_P(ClientLoadReportingTest, SendAllClusters) {
       {"locality0", GetBackendPorts()},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait until all backends are ready.
   int num_ok = 0;
   int num_failure = 0;
@@ -5533,7 +6176,7 @@ TEST_P(ClientLoadReportingTest, HonorsClustersRequestedByLrsServer) {
       {"locality0", GetBackendPorts()},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait until all backends are ready.
   int num_ok = 0;
   int num_failure = 0;
@@ -5570,7 +6213,7 @@ TEST_P(ClientLoadReportingTest, BalancerRestart) {
       {"locality0", GetBackendPorts(0, kNumBackendsFirstPass)},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait until all backends returned by the balancer are ready.
   int num_ok = 0;
   int num_failure = 0;
@@ -5608,7 +6251,7 @@ TEST_P(ClientLoadReportingTest, BalancerRestart) {
       {"locality0", GetBackendPorts(kNumBackendsFirstPass)},
   });
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   // Wait for queries to start going to one of the new backends.
   // This tells us that we're now using the new serverlist.
   std::tie(num_ok, num_failure, num_drops) =
@@ -5653,7 +6296,7 @@ TEST_P(ClientLoadReportingWithDropTest, Vanilla) {
   args.drop_categories = {{kLbDropType, kDropPerMillionForLb},
                           {kThrottleDropType, kDropPerMillionForThrottle}};
   balancers_[0]->ads_service()->SetEdsResource(
-      AdsServiceImpl::BuildEdsResource(args, DefaultEdsServiceName()));
+      BuildEdsResource(args, DefaultEdsServiceName()));
   int num_ok = 0;
   int num_failure = 0;
   int num_drops = 0;
index d007971..0155cb2 100644 (file)
@@ -45,7 +45,6 @@ using ::opencensus::stats::View;
 using ::opencensus::stats::ViewDescriptor;
 using ::opencensus::stats::testing::TestUtils;
 using ::opencensus::tags::TagKey;
-using ::opencensus::tags::TagMap;
 using ::opencensus::tags::WithTagMap;
 
 static const auto TEST_TAG_KEY = TagKey::Register("my_key");
@@ -70,7 +69,7 @@ class StatsPluginEnd2EndTest : public ::testing::Test {
  protected:
   static void SetUpTestCase() { RegisterOpenCensusPlugin(); }
 
-  void SetUp() {
+  void SetUp() override {
     // Set up a synchronous server on a different thread to avoid the asynch
     // interface.
     ::grpc::ServerBuilder builder;
@@ -82,14 +81,14 @@ class StatsPluginEnd2EndTest : public ::testing::Test {
     server_ = builder.BuildAndStart();
     ASSERT_NE(nullptr, server_);
     ASSERT_NE(0, port);
-    server_address_ = absl::StrCat("0.0.0.0:", port);
+    server_address_ = absl::StrCat("localhost:", port);
     server_thread_ = std::thread(&StatsPluginEnd2EndTest::RunServerLoop, this);
 
     stub_ = EchoTestService::NewStub(::grpc::CreateChannel(
         server_address_, ::grpc::InsecureChannelCredentials()));
   }
 
-  void TearDown() {
+  void TearDown() override {
     server_->Shutdown();
     server_thread_.join();
   }
index c54cc47..1f53c6a 100644 (file)
@@ -30,7 +30,7 @@ grpc_cc_library(
         "server_helper.h",
     ],
     external_deps = [
-        "gflags",
+        "absl/flags:flag",
     ],
     language = "C++",
     deps = [
@@ -43,6 +43,9 @@ grpc_cc_binary(
     srcs = [
         "grpclb_fallback_test.cc",
     ],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     language = "C++",
     tags = ["no_windows"],
     deps = [
@@ -60,6 +63,9 @@ grpc_cc_binary(
     srcs = [
         "interop_server_bootstrap.cc",
     ],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     language = "C++",
     deps = [
         ":interop_server_lib",
@@ -92,6 +98,9 @@ grpc_cc_library(
         "client_helper.h",
         "interop_client.h",
     ],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     language = "C++",
     deps = [
         "//src/proto/grpc/testing:empty_proto",
@@ -108,6 +117,9 @@ grpc_cc_library(
     srcs = [
         "client.cc",
     ],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     language = "C++",
     deps = [
         ":client_helper_lib",
@@ -127,7 +139,7 @@ grpc_cc_binary(
     name = "metrics_client",
     srcs = ["metrics_client.cc"],
     external_deps = [
-        "gflags",
+        "absl/flags:flag",
     ],
     language = "C++",
     deps = [
@@ -142,6 +154,9 @@ grpc_cc_binary(
     srcs = [
         "reconnect_interop_client.cc",
     ],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     deps = [
         ":client_helper_lib",
         "//:grpc++",
@@ -154,6 +169,9 @@ grpc_cc_binary(
     srcs = [
         "reconnect_interop_server.cc",
     ],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     language = "C++",
     deps = [
         ":interop_server_lib",
@@ -169,6 +187,9 @@ grpc_cc_binary(
         "stress_interop_client.h",
         "stress_test.cc",
     ],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     deps = [
         ":client_helper_lib",
         "//:grpc++",
@@ -185,7 +206,7 @@ grpc_cc_test(
         ":interop_server",
     ],
     external_deps = [
-        "gflags",
+        "absl/flags:flag",
     ],
     tags = ["no_windows"],
     deps = [
@@ -203,6 +224,9 @@ grpc_cc_binary(
     srcs = [
         "xds_interop_client.cc",
     ],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     deps = [
         "//:grpc++",
         "//src/proto/grpc/testing:empty_proto",
@@ -218,6 +242,9 @@ grpc_cc_binary(
     srcs = [
         "xds_interop_server.cc",
     ],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     deps = [
         "//:grpc++",
         "//src/proto/grpc/testing:empty_proto",
@@ -234,6 +261,9 @@ grpc_cc_binary(
         "http2_client.cc",
         "http2_client.h",
     ],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     deps = [
         "//:grpc++",
         "//src/proto/grpc/testing:empty_proto",
index 173e8da..a2f7903 100644 (file)
  *
  */
 
-#include <memory>
-#include <unordered_map>
-
-#include <gflags/gflags.h>
 #include <grpc/grpc.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <grpcpp/channel.h>
 #include <grpcpp/client_context.h>
 
+#include <memory>
+#include <unordered_map>
+
+#include "absl/flags/flag.h"
 #include "src/core/lib/gpr/string.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/interop/client_helper.h"
 #include "test/cpp/interop/interop_client.h"
 #include "test/cpp/util/test_config.h"
 
-DEFINE_bool(use_alts, false,
-            "Whether to use alts. Enable alts will disable tls.");
-DEFINE_bool(use_tls, false, "Whether to use tls.");
-DEFINE_string(custom_credentials_type, "", "User provided credentials type.");
-DEFINE_bool(use_test_ca, false, "False to use SSL roots for google");
-DEFINE_int32(server_port, 0, "Server port.");
-DEFINE_string(server_host, "localhost", "Server host to connect to");
-DEFINE_string(server_host_override, "",
-              "Override the server host which is sent in HTTP header");
-DEFINE_string(
-    test_case, "large_unary",
+ABSL_FLAG(bool, use_alts, false,
+          "Whether to use alts. Enable alts will disable tls.");
+ABSL_FLAG(bool, use_tls, false, "Whether to use tls.");
+ABSL_FLAG(std::string, custom_credentials_type, "",
+          "User provided credentials type.");
+ABSL_FLAG(bool, use_test_ca, false, "False to use SSL roots for google");
+ABSL_FLAG(int32_t, server_port, 0, "Server port.");
+ABSL_FLAG(std::string, server_host, "localhost", "Server host to connect to");
+ABSL_FLAG(std::string, server_host_override, "",
+          "Override the server host which is sent in HTTP header");
+ABSL_FLAG(
+    std::string, test_case, "large_unary",
     "Configure different test cases. Valid options are:\n\n"
     "all : all test cases;\n"
+
+    // TODO(veblush): Replace the help message with the following full message
+    // once Abseil fixes the flag-help compiler error on Windows. (b/171659833)
+    /*
     "cancel_after_begin : cancel stream after starting it;\n"
     "cancel_after_first_response: cancel on first response;\n"
     "channel_soak: sends 'soak_iterations' rpcs, rebuilds channel each time;\n"
@@ -74,40 +79,42 @@ DEFINE_string(
     "status_code_and_message: verify status code & message;\n"
     "timeout_on_sleeping_server: deadline exceeds on stream;\n"
     "unimplemented_method: client calls an unimplemented method;\n"
-    "unimplemented_service: client calls an unimplemented service;\n");
-DEFINE_string(default_service_account, "",
-              "Email of GCE default service account");
-DEFINE_string(service_account_key_file, "",
-              "Path to service account json key file.");
-DEFINE_string(oauth_scope, "", "Scope for OAuth tokens.");
-DEFINE_bool(do_not_abort_on_transient_failures, false,
-            "If set to 'true', abort() is not called in case of transient "
-            "failures (i.e failures that are temporary and will likely go away "
-            "on retrying; like a temporary connection failure) and an error "
-            "message is printed instead. Note that this flag just controls "
-            "whether abort() is called or not. It does not control whether the "
-            "test is retried in case of transient failures (and currently the "
-            "interop tests are not retried even if this flag is set to true)");
-DEFINE_int32(soak_iterations, 1000,
-             "The number of iterations to use for the two soak tests; rpc_soak "
-             "and channel_soak.");
-DEFINE_int32(soak_max_failures, 0,
-             "The number of iterations in soak tests that are allowed to fail "
-             "(either due to non-OK status code or exceeding the "
-             "per-iteration max acceptable latency).");
-DEFINE_int32(soak_per_iteration_max_acceptable_latency_ms, 0,
-             "The number of milliseconds a single iteration in the two soak "
-             "tests (rpc_soak and channel_soak) should take.");
-DEFINE_int32(soak_overall_timeout_seconds, 0,
-             "The overall number of seconds after which a soak test should "
-             "stop and fail, if the desired number of iterations have not yet "
-             "completed.");
-DEFINE_int32(iteration_interval, 10,
-             "The interval in seconds between rpcs. This is used by "
-             "long_connection test");
-DEFINE_string(additional_metadata, "",
-              "Additional metadata to send in each request, as a "
-              "semicolon-separated list of key:value pairs.");
+    "unimplemented_service: client calls an unimplemented service;\n"
+    */
+);
+ABSL_FLAG(std::string, default_service_account, "",
+          "Email of GCE default service account");
+ABSL_FLAG(std::string, service_account_key_file, "",
+          "Path to service account json key file.");
+ABSL_FLAG(std::string, oauth_scope, "", "Scope for OAuth tokens.");
+ABSL_FLAG(bool, do_not_abort_on_transient_failures, false,
+          "If set to 'true', abort() is not called in case of transient "
+          "failures (i.e failures that are temporary and will likely go away "
+          "on retrying; like a temporary connection failure) and an error "
+          "message is printed instead. Note that this flag just controls "
+          "whether abort() is called or not. It does not control whether the "
+          "test is retried in case of transient failures (and currently the "
+          "interop tests are not retried even if this flag is set to true)");
+ABSL_FLAG(int32_t, soak_iterations, 1000,
+          "The number of iterations to use for the two soak tests; rpc_soak "
+          "and channel_soak.");
+ABSL_FLAG(int32_t, soak_max_failures, 0,
+          "The number of iterations in soak tests that are allowed to fail "
+          "(either due to non-OK status code or exceeding the "
+          "per-iteration max acceptable latency).");
+ABSL_FLAG(int32_t, soak_per_iteration_max_acceptable_latency_ms, 0,
+          "The number of milliseconds a single iteration in the two soak "
+          "tests (rpc_soak and channel_soak) should take.");
+ABSL_FLAG(int32_t, soak_overall_timeout_seconds, 0,
+          "The overall number of seconds after which a soak test should "
+          "stop and fail, if the desired number of iterations have not yet "
+          "completed.");
+ABSL_FLAG(int32_t, iteration_interval, 10,
+          "The interval in seconds between rpcs. This is used by "
+          "long_connection test");
+ABSL_FLAG(std::string, additional_metadata, "",
+          "Additional metadata to send in each request, as a "
+          "semicolon-separated list of key:value pairs.");
 
 using grpc::testing::CreateChannelForTestCase;
 using grpc::testing::GetServiceAccountJsonKey;
@@ -174,18 +181,19 @@ bool ParseAdditionalMetadataFlag(
 int main(int argc, char** argv) {
   grpc::testing::TestEnvironment env(argc, argv);
   grpc::testing::InitTest(&argc, &argv, true);
-  gpr_log(GPR_INFO, "Testing these cases: %s", FLAGS_test_case.c_str());
+  gpr_log(GPR_INFO, "Testing these cases: %s",
+          absl::GetFlag(FLAGS_test_case).c_str());
   int ret = 0;
 
   grpc::testing::ChannelCreationFunc channel_creation_func;
-  std::string test_case = FLAGS_test_case;
-  if (FLAGS_additional_metadata == "") {
+  std::string test_case = absl::GetFlag(FLAGS_test_case);
+  if (absl::GetFlag(FLAGS_additional_metadata).empty()) {
     channel_creation_func = [test_case]() {
       return CreateChannelForTestCase(test_case);
     };
   } else {
     std::multimap<std::string, std::string> additional_metadata;
-    if (!ParseAdditionalMetadataFlag(FLAGS_additional_metadata,
+    if (!ParseAdditionalMetadataFlag(absl::GetFlag(FLAGS_additional_metadata),
                                      &additional_metadata)) {
       return 1;
     }
@@ -201,8 +209,9 @@ int main(int argc, char** argv) {
     };
   }
 
-  grpc::testing::InteropClient client(channel_creation_func, true,
-                                      FLAGS_do_not_abort_on_transient_failures);
+  grpc::testing::InteropClient client(
+      channel_creation_func, true,
+      absl::GetFlag(FLAGS_do_not_abort_on_transient_failures));
 
   std::unordered_map<std::string, std::function<bool()>> actions;
   actions["empty_unary"] =
@@ -238,24 +247,27 @@ int main(int argc, char** argv) {
       std::bind(&grpc::testing::InteropClient::DoEmptyStream, &client);
   actions["pick_first_unary"] =
       std::bind(&grpc::testing::InteropClient::DoPickFirstUnary, &client);
-  if (FLAGS_use_tls) {
+  if (absl::GetFlag(FLAGS_use_tls)) {
     actions["compute_engine_creds"] =
         std::bind(&grpc::testing::InteropClient::DoComputeEngineCreds, &client,
-                  FLAGS_default_service_account, FLAGS_oauth_scope);
+                  absl::GetFlag(FLAGS_default_service_account),
+                  absl::GetFlag(FLAGS_oauth_scope));
     actions["jwt_token_creds"] =
         std::bind(&grpc::testing::InteropClient::DoJwtTokenCreds, &client,
                   GetServiceAccountJsonKey());
     actions["oauth2_auth_token"] =
         std::bind(&grpc::testing::InteropClient::DoOauth2AuthToken, &client,
-                  FLAGS_default_service_account, FLAGS_oauth_scope);
+                  absl::GetFlag(FLAGS_default_service_account),
+                  absl::GetFlag(FLAGS_oauth_scope));
     actions["per_rpc_creds"] =
         std::bind(&grpc::testing::InteropClient::DoPerRpcCreds, &client,
                   GetServiceAccountJsonKey());
   }
-  if (FLAGS_custom_credentials_type == "google_default_credentials") {
+  if (absl::GetFlag(FLAGS_custom_credentials_type) ==
+      "google_default_credentials") {
     actions["google_default_credentials"] =
         std::bind(&grpc::testing::InteropClient::DoGoogleDefaultCredentials,
-                  &client, FLAGS_default_service_account);
+                  &client, absl::GetFlag(FLAGS_default_service_account));
   }
   actions["status_code_and_message"] =
       std::bind(&grpc::testing::InteropClient::DoStatusWithMessage, &client);
@@ -269,28 +281,31 @@ int main(int argc, char** argv) {
       std::bind(&grpc::testing::InteropClient::DoUnimplementedService, &client);
   actions["cacheable_unary"] =
       std::bind(&grpc::testing::InteropClient::DoCacheableUnary, &client);
-  actions["channel_soak"] =
-      std::bind(&grpc::testing::InteropClient::DoChannelSoakTest, &client,
-                FLAGS_soak_iterations, FLAGS_soak_max_failures,
-                FLAGS_soak_per_iteration_max_acceptable_latency_ms,
-                FLAGS_soak_overall_timeout_seconds);
-  actions["rpc_soak"] =
-      std::bind(&grpc::testing::InteropClient::DoRpcSoakTest, &client,
-                FLAGS_soak_iterations, FLAGS_soak_max_failures,
-                FLAGS_soak_per_iteration_max_acceptable_latency_ms,
-                FLAGS_soak_overall_timeout_seconds);
+  actions["channel_soak"] = std::bind(
+      &grpc::testing::InteropClient::DoChannelSoakTest, &client,
+      absl::GetFlag(FLAGS_soak_iterations),
+      absl::GetFlag(FLAGS_soak_max_failures),
+      absl::GetFlag(FLAGS_soak_per_iteration_max_acceptable_latency_ms),
+      absl::GetFlag(FLAGS_soak_overall_timeout_seconds));
+  actions["rpc_soak"] = std::bind(
+      &grpc::testing::InteropClient::DoRpcSoakTest, &client,
+      absl::GetFlag(FLAGS_soak_iterations),
+      absl::GetFlag(FLAGS_soak_max_failures),
+      absl::GetFlag(FLAGS_soak_per_iteration_max_acceptable_latency_ms),
+      absl::GetFlag(FLAGS_soak_overall_timeout_seconds));
   actions["long_lived_channel"] =
       std::bind(&grpc::testing::InteropClient::DoLongLivedChannelTest, &client,
-                FLAGS_soak_iterations, FLAGS_iteration_interval);
+                absl::GetFlag(FLAGS_soak_iterations),
+                absl::GetFlag(FLAGS_iteration_interval));
 
   UpdateActions(&actions);
 
-  if (FLAGS_test_case == "all") {
+  if (absl::GetFlag(FLAGS_test_case) == "all") {
     for (const auto& action : actions) {
       action.second();
     }
-  } else if (actions.find(FLAGS_test_case) != actions.end()) {
-    actions.find(FLAGS_test_case)->second();
+  } else if (actions.find(absl::GetFlag(FLAGS_test_case)) != actions.end()) {
+    actions.find(absl::GetFlag(FLAGS_test_case))->second();
   } else {
     std::string test_cases;
     for (const auto& action : actions) {
@@ -298,7 +313,7 @@ int main(int argc, char** argv) {
       test_cases += action.first;
     }
     gpr_log(GPR_ERROR, "Unsupported test case %s. Valid options are\n%s",
-            FLAGS_test_case.c_str(), test_cases.c_str());
+            absl::GetFlag(FLAGS_test_case).c_str(), test_cases.c_str());
     ret = 1;
   }
 
index f43e315..6bd483d 100644 (file)
 
 #include "test/cpp/interop/client_helper.h"
 
-#include <fstream>
-#include <memory>
-#include <sstream>
-
-#include <gflags/gflags.h>
 #include <grpc/grpc.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <grpcpp/create_channel.h>
 #include <grpcpp/security/credentials.h>
 
+#include <fstream>
+#include <memory>
+#include <sstream>
+
+#include "absl/flags/declare.h"
+#include "absl/flags/flag.h"
 #include "src/cpp/client/secure_credentials.h"
 #include "test/core/security/oauth2_utils.h"
 #include "test/cpp/util/create_test_channel.h"
 #include "test/cpp/util/test_credentials_provider.h"
 
-DECLARE_bool(use_alts);
-DECLARE_bool(use_tls);
-DECLARE_string(custom_credentials_type);
-DECLARE_bool(use_test_ca);
-DECLARE_int32(server_port);
-DECLARE_string(server_host);
-DECLARE_string(server_host_override);
-DECLARE_string(test_case);
-DECLARE_string(default_service_account);
-DECLARE_string(service_account_key_file);
-DECLARE_string(oauth_scope);
+ABSL_DECLARE_FLAG(bool, use_alts);
+ABSL_DECLARE_FLAG(bool, use_tls);
+ABSL_DECLARE_FLAG(std::string, custom_credentials_type);
+ABSL_DECLARE_FLAG(bool, use_test_ca);
+ABSL_DECLARE_FLAG(int32_t, server_port);
+ABSL_DECLARE_FLAG(std::string, server_host);
+ABSL_DECLARE_FLAG(std::string, server_host_override);
+ABSL_DECLARE_FLAG(std::string, test_case);
+ABSL_DECLARE_FLAG(std::string, default_service_account);
+ABSL_DECLARE_FLAG(std::string, service_account_key_file);
+ABSL_DECLARE_FLAG(std::string, oauth_scope);
 
 namespace grpc {
 namespace testing {
@@ -53,7 +54,7 @@ namespace testing {
 std::string GetServiceAccountJsonKey() {
   static std::string json_key;
   if (json_key.empty()) {
-    std::ifstream json_key_file(FLAGS_service_account_key_file);
+    std::ifstream json_key_file(absl::GetFlag(FLAGS_service_account_key_file));
     std::stringstream key_stream;
     key_stream << json_key_file.rdbuf();
     json_key = key_stream.str();
@@ -83,48 +84,58 @@ std::shared_ptr<Channel> CreateChannelForTestCase(
     std::vector<
         std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
         interceptor_creators) {
-  GPR_ASSERT(FLAGS_server_port);
+  GPR_ASSERT(absl::GetFlag(FLAGS_server_port));
   const int host_port_buf_size = 1024;
   char host_port[host_port_buf_size];
-  snprintf(host_port, host_port_buf_size, "%s:%d", FLAGS_server_host.c_str(),
-           FLAGS_server_port);
+  snprintf(host_port, host_port_buf_size, "%s:%d",
+           absl::GetFlag(FLAGS_server_host).c_str(),
+           absl::GetFlag(FLAGS_server_port));
 
   std::shared_ptr<CallCredentials> creds;
   if (test_case == "compute_engine_creds") {
-    creds = FLAGS_custom_credentials_type == "google_default_credentials"
+    creds = absl::GetFlag(FLAGS_custom_credentials_type) ==
+                    "google_default_credentials"
                 ? nullptr
                 : GoogleComputeEngineCredentials();
   } else if (test_case == "jwt_token_creds") {
     std::string json_key = GetServiceAccountJsonKey();
     std::chrono::seconds token_lifetime = std::chrono::hours(1);
-    creds = FLAGS_custom_credentials_type == "google_default_credentials"
+    creds = absl::GetFlag(FLAGS_custom_credentials_type) ==
+                    "google_default_credentials"
                 ? nullptr
                 : ServiceAccountJWTAccessCredentials(json_key,
                                                      token_lifetime.count());
   } else if (test_case == "oauth2_auth_token") {
-    creds = FLAGS_custom_credentials_type == "google_default_credentials"
+    creds = absl::GetFlag(FLAGS_custom_credentials_type) ==
+                    "google_default_credentials"
                 ? nullptr
                 : AccessTokenCredentials(GetOauth2AccessToken());
   } else if (test_case == "pick_first_unary") {
     ChannelArguments channel_args;
     // allow the LB policy to be configured with service config
     channel_args.SetInt(GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION, 0);
-    return CreateTestChannel(host_port, FLAGS_custom_credentials_type,
-                             FLAGS_server_host_override, !FLAGS_use_test_ca,
-                             creds, channel_args);
+    return CreateTestChannel(
+        host_port, absl::GetFlag(FLAGS_custom_credentials_type),
+        absl::GetFlag(FLAGS_server_host_override),
+        !absl::GetFlag(FLAGS_use_test_ca), creds, channel_args);
   }
-  if (FLAGS_custom_credentials_type.empty()) {
+  if (absl::GetFlag(FLAGS_custom_credentials_type).empty()) {
     transport_security security_type =
-        FLAGS_use_alts ? ALTS : (FLAGS_use_tls ? TLS : INSECURE);
-    return CreateTestChannel(host_port, FLAGS_server_host_override,
-                             security_type, !FLAGS_use_test_ca, creds,
-                             std::move(interceptor_creators));
+        absl::GetFlag(FLAGS_use_alts)
+            ? ALTS
+            : (absl::GetFlag(FLAGS_use_tls) ? TLS : INSECURE);
+    return CreateTestChannel(host_port,
+                             absl::GetFlag(FLAGS_server_host_override),
+                             security_type, !absl::GetFlag(FLAGS_use_test_ca),
+                             creds, std::move(interceptor_creators));
   } else {
     if (interceptor_creators.empty()) {
-      return CreateTestChannel(host_port, FLAGS_custom_credentials_type, creds);
+      return CreateTestChannel(
+          host_port, absl::GetFlag(FLAGS_custom_credentials_type), creds);
     } else {
-      return CreateTestChannel(host_port, FLAGS_custom_credentials_type, creds,
-                               std::move(interceptor_creators));
+      return CreateTestChannel(host_port,
+                               absl::GetFlag(FLAGS_custom_credentials_type),
+                               creds, std::move(interceptor_creators));
     }
   }
 }
index cb3e62a..28c358b 100644 (file)
  *
  */
 
-#include <grpc/support/port_platform.h>
-
-#include "src/core/lib/iomgr/port.h"
-
 #include <arpa/inet.h>
 #include <fcntl.h>
-#include <gflags/gflags.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/port_platform.h>
+#include <grpcpp/channel.h>
+#include <grpcpp/client_context.h>
+#include <grpcpp/grpcpp.h>
+#include <grpcpp/support/channel_arguments.h>
 #include <inttypes.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
 #include <sys/wait.h>
 #include <unistd.h>
+
 #include <chrono>
 #include <cstdlib>
 #include <memory>
 #include <string>
 #include <thread>
 
-#include <grpc/support/alloc.h>
-#include <grpc/support/log.h>
-#include <grpcpp/channel.h>
-#include <grpcpp/client_context.h>
-#include <grpcpp/grpcpp.h>
-#include <grpcpp/support/channel_arguments.h>
-
+#include "absl/flags/flag.h"
 #include "src/core/lib/gpr/string.h"
+#include "src/core/lib/iomgr/port.h"
 #include "src/core/lib/iomgr/socket_mutator.h"
 #include "src/proto/grpc/testing/empty.pb.h"
 #include "src/proto/grpc/testing/messages.pb.h"
 #include "src/proto/grpc/testing/test.grpc.pb.h"
 #include "src/proto/grpc/testing/test.pb.h"
-
 #include "test/cpp/util/test_config.h"
 #include "test/cpp/util/test_credentials_provider.h"
 
-DEFINE_string(custom_credentials_type, "", "User provided credentials type.");
-DEFINE_string(server_uri, "localhost:1000", "Server URI target");
-DEFINE_string(unroute_lb_and_backend_addrs_cmd, "exit 1",
-              "Shell command used to make LB and backend addresses unroutable");
-DEFINE_string(blackhole_lb_and_backend_addrs_cmd, "exit 1",
-              "Shell command used to make LB and backend addresses blackholed");
-DEFINE_string(
-    test_case, "",
+ABSL_FLAG(std::string, custom_credentials_type, "",
+          "User provided credentials type.");
+ABSL_FLAG(std::string, server_uri, "localhost:1000", "Server URI target");
+ABSL_FLAG(std::string, unroute_lb_and_backend_addrs_cmd, "exit 1",
+          "Shell command used to make LB and backend addresses unroutable");
+ABSL_FLAG(std::string, blackhole_lb_and_backend_addrs_cmd, "exit 1",
+          "Shell command used to make LB and backend addresses blackholed");
+ABSL_FLAG(
+    std::string, test_case, "",
     "Test case to run. Valid options are:\n\n"
     "fast_fallback_before_startup : fallback before establishing connection to "
     "LB;\n"
@@ -170,9 +168,9 @@ std::unique_ptr<TestService::Stub> CreateFallbackTestStub() {
   channel_args.SetInt(GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION, 0);
   std::shared_ptr<grpc::ChannelCredentials> channel_creds =
       grpc::testing::GetCredentialsProvider()->GetChannelCredentials(
-          FLAGS_custom_credentials_type, &channel_args);
-  return TestService::NewStub(
-      grpc::CreateCustomChannel(FLAGS_server_uri, channel_creds, channel_args));
+          absl::GetFlag(FLAGS_custom_credentials_type), &channel_args);
+  return TestService::NewStub(grpc::CreateCustomChannel(
+      absl::GetFlag(FLAGS_server_uri), channel_creds, channel_args));
 }
 
 void RunCommand(const std::string& command) {
@@ -209,11 +207,13 @@ void RunFallbackBeforeStartupTest(
 }
 
 void DoFastFallbackBeforeStartup() {
-  RunFallbackBeforeStartupTest(FLAGS_unroute_lb_and_backend_addrs_cmd, 9);
+  RunFallbackBeforeStartupTest(
+      absl::GetFlag(FLAGS_unroute_lb_and_backend_addrs_cmd), 9);
 }
 
 void DoSlowFallbackBeforeStartup() {
-  RunFallbackBeforeStartupTest(FLAGS_blackhole_lb_and_backend_addrs_cmd, 20);
+  RunFallbackBeforeStartupTest(
+      absl::GetFlag(FLAGS_blackhole_lb_and_backend_addrs_cmd), 20);
 }
 
 void RunFallbackAfterStartupTest(
@@ -252,31 +252,34 @@ void RunFallbackAfterStartupTest(
 }
 
 void DoFastFallbackAfterStartup() {
-  RunFallbackAfterStartupTest(FLAGS_unroute_lb_and_backend_addrs_cmd);
+  RunFallbackAfterStartupTest(
+      absl::GetFlag(FLAGS_unroute_lb_and_backend_addrs_cmd));
 }
 
 void DoSlowFallbackAfterStartup() {
-  RunFallbackAfterStartupTest(FLAGS_blackhole_lb_and_backend_addrs_cmd);
+  RunFallbackAfterStartupTest(
+      absl::GetFlag(FLAGS_blackhole_lb_and_backend_addrs_cmd));
 }
 }  // namespace
 
 int main(int argc, char** argv) {
   grpc::testing::InitTest(&argc, &argv, true);
-  gpr_log(GPR_INFO, "Testing: %s", FLAGS_test_case.c_str());
-  if (FLAGS_test_case == "fast_fallback_before_startup") {
+  gpr_log(GPR_INFO, "Testing: %s", absl::GetFlag(FLAGS_test_case).c_str());
+  if (absl::GetFlag(FLAGS_test_case) == "fast_fallback_before_startup") {
     DoFastFallbackBeforeStartup();
     gpr_log(GPR_INFO, "DoFastFallbackBeforeStartup done!");
-  } else if (FLAGS_test_case == "slow_fallback_before_startup") {
+  } else if (absl::GetFlag(FLAGS_test_case) == "slow_fallback_before_startup") {
     DoSlowFallbackBeforeStartup();
     gpr_log(GPR_INFO, "DoSlowFallbackBeforeStartup done!");
-  } else if (FLAGS_test_case == "fast_fallback_after_startup") {
+  } else if (absl::GetFlag(FLAGS_test_case) == "fast_fallback_after_startup") {
     DoFastFallbackAfterStartup();
     gpr_log(GPR_INFO, "DoFastFallbackAfterStartup done!");
-  } else if (FLAGS_test_case == "slow_fallback_after_startup") {
+  } else if (absl::GetFlag(FLAGS_test_case) == "slow_fallback_after_startup") {
     DoSlowFallbackAfterStartup();
     gpr_log(GPR_INFO, "DoSlowFallbackAfterStartup done!");
   } else {
-    gpr_log(GPR_ERROR, "Invalid test case: %s", FLAGS_test_case.c_str());
+    gpr_log(GPR_ERROR, "Invalid test case: %s",
+            absl::GetFlag(FLAGS_test_case).c_str());
     abort();
   }
 }
index dbe9f7f..5422fc8 100644 (file)
  *
  */
 
-#include <thread>
+#include "test/cpp/interop/http2_client.h"
 
-#include <gflags/gflags.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <grpcpp/channel.h>
 #include <grpcpp/client_context.h>
 
-#include "src/core/lib/transport/byte_stream.h"
-#include "src/proto/grpc/testing/messages.pb.h"
-#include "src/proto/grpc/testing/test.grpc.pb.h"
-#include "test/cpp/interop/http2_client.h"
+#include <thread>
 
+#include "absl/flags/flag.h"
 #include "src/core/lib/gpr/string.h"
 #include "src/core/lib/gpr/useful.h"
+#include "src/core/lib/transport/byte_stream.h"
+#include "src/proto/grpc/testing/messages.pb.h"
+#include "src/proto/grpc/testing/test.grpc.pb.h"
 #include "test/cpp/util/create_test_channel.h"
 #include "test/cpp/util/test_config.h"
 
@@ -43,7 +43,7 @@ const int kLargeResponseSize = 314159;
 }  // namespace
 
 Http2Client::ServiceStub::ServiceStub(const std::shared_ptr<Channel>& channel)
-    : channel_(std::move(channel)) {
+    : channel_(channel) {
   stub_ = TestService::NewStub(channel);
 }
 
@@ -51,7 +51,7 @@ TestService::Stub* Http2Client::ServiceStub::Get() { return stub_.get(); }
 
 Http2Client::Http2Client(const std::shared_ptr<Channel>& channel)
     : serviceStub_(channel),
-      channel_(std::move(channel)),
+      channel_(channel),
       defaultRequest_(BuildDefaultRequest()) {}
 
 bool Http2Client::AssertStatusCode(const Status& s, StatusCode expected_code) {
@@ -159,7 +159,7 @@ bool Http2Client::DoMaxStreams() {
              std::string(kLargeResponseSize, '\0'));
 
   std::vector<std::thread> test_threads;
-
+  test_threads.reserve(10);
   for (int i = 0; i < 10; i++) {
     test_threads.emplace_back(
         std::thread(&Http2Client::MaxStreamsWorker, this, channel_));
@@ -176,42 +176,43 @@ bool Http2Client::DoMaxStreams() {
 }  // namespace testing
 }  // namespace grpc
 
-DEFINE_int32(server_port, 0, "Server port.");
-DEFINE_string(server_host, "localhost", "Server host to connect to");
-DEFINE_string(test_case, "rst_after_header",
-              "Configure different test cases. Valid options are:\n\n"
-              "goaway\n"
-              "max_streams\n"
-              "ping\n"
-              "rst_after_data\n"
-              "rst_after_header\n"
-              "rst_during_data\n");
+ABSL_FLAG(int32_t, server_port, 0, "Server port.");
+ABSL_FLAG(std::string, server_host, "localhost", "Server host to connect to");
+ABSL_FLAG(std::string, test_case, "rst_after_header",
+          "Configure different test cases. Valid options are:\n\n"
+          "goaway\n"
+          "max_streams\n"
+          "ping\n"
+          "rst_after_data\n"
+          "rst_after_header\n"
+          "rst_during_data\n");
 
 int main(int argc, char** argv) {
   grpc::testing::InitTest(&argc, &argv, true);
-  GPR_ASSERT(FLAGS_server_port);
+  GPR_ASSERT(absl::GetFlag(FLAGS_server_port));
   const int host_port_buf_size = 1024;
   char host_port[host_port_buf_size];
-  snprintf(host_port, host_port_buf_size, "%s:%d", FLAGS_server_host.c_str(),
-           FLAGS_server_port);
+  snprintf(host_port, host_port_buf_size, "%s:%d",
+           absl::GetFlag(FLAGS_server_host).c_str(),
+           absl::GetFlag(FLAGS_server_port));
   std::shared_ptr<grpc::Channel> channel =
       grpc::CreateTestChannel(host_port, grpc::testing::INSECURE);
   GPR_ASSERT(channel->WaitForConnected(gpr_time_add(
       gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_seconds(300, GPR_TIMESPAN))));
   grpc::testing::Http2Client client(channel);
-  gpr_log(GPR_INFO, "Testing case: %s", FLAGS_test_case.c_str());
+  gpr_log(GPR_INFO, "Testing case: %s", absl::GetFlag(FLAGS_test_case).c_str());
   int ret = 0;
-  if (FLAGS_test_case == "rst_after_header") {
+  if (absl::GetFlag(FLAGS_test_case) == "rst_after_header") {
     client.DoRstAfterHeader();
-  } else if (FLAGS_test_case == "rst_after_data") {
+  } else if (absl::GetFlag(FLAGS_test_case) == "rst_after_data") {
     client.DoRstAfterData();
-  } else if (FLAGS_test_case == "rst_during_data") {
+  } else if (absl::GetFlag(FLAGS_test_case) == "rst_during_data") {
     client.DoRstDuringData();
-  } else if (FLAGS_test_case == "goaway") {
+  } else if (absl::GetFlag(FLAGS_test_case) == "goaway") {
     client.DoGoaway();
-  } else if (FLAGS_test_case == "ping") {
+  } else if (absl::GetFlag(FLAGS_test_case) == "ping") {
     client.DoPing();
-  } else if (FLAGS_test_case == "max_streams") {
+  } else if (absl::GetFlag(FLAGS_test_case) == "max_streams") {
     client.DoMaxStreams();
   } else {
     const char* testcases[] = {
@@ -221,7 +222,7 @@ int main(int argc, char** argv) {
         gpr_strjoin_sep(testcases, GPR_ARRAY_SIZE(testcases), "\n", nullptr);
 
     gpr_log(GPR_ERROR, "Unsupported test case %s. Valid options are\n%s",
-            FLAGS_test_case.c_str(), joined_testcases);
+            absl::GetFlag(FLAGS_test_case).c_str(), joined_testcases);
     gpr_free(joined_testcases);
     ret = 1;
   }
index cdc621c..749b6ae 100644 (file)
@@ -872,8 +872,8 @@ bool InteropClient::DoStatusWithMessage() {
   stream->Write(streaming_request);
   stream->WritesDone();
   StreamingOutputCallResponse streaming_response;
-  while (stream->Read(&streaming_response))
-    ;
+  while (stream->Read(&streaming_response)) {
+  }
   s = stream->Finish();
   if (!AssertStatusCode(s, grpc::StatusCode::UNKNOWN,
                         context.debug_error_string())) {
@@ -1006,7 +1006,6 @@ bool InteropClient::DoCustomMetadata() {
   const std::string kEchoTrailingBinMetadataKey(
       "x-grpc-test-echo-trailing-bin");
   const std::string kTrailingBinValue("\x0a\x0b\x0a\x0b\x0a\x0b");
-  ;
 
   {
     gpr_log(GPR_DEBUG, "Sending RPC with custom metadata");
index 153aec7..e6b718b 100644 (file)
  *
  */
 
-#include <fstream>
-#include <memory>
-#include <sstream>
-#include <thread>
-
-#include <gflags/gflags.h>
 #include <grpc/grpc.h>
 #include <grpc/support/log.h>
 #include <grpc/support/time.h>
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
 
+#include <fstream>
+#include <memory>
+#include <sstream>
+#include <thread>
+
+#include "absl/flags/flag.h"
 #include "src/core/lib/gpr/string.h"
 #include "src/proto/grpc/testing/empty.pb.h"
 #include "src/proto/grpc/testing/messages.pb.h"
 #include "test/cpp/interop/server_helper.h"
 #include "test/cpp/util/test_config.h"
 
-DEFINE_bool(use_alts, false,
-            "Whether to use alts. Enable alts will disable tls.");
-DEFINE_bool(use_tls, false, "Whether to use tls.");
-DEFINE_string(custom_credentials_type, "", "User provided credentials type.");
-DEFINE_int32(port, 0, "Server port.");
-DEFINE_int32(max_send_message_size, -1, "The maximum send message size.");
+ABSL_FLAG(bool, use_alts, false,
+          "Whether to use alts. Enable alts will disable tls.");
+ABSL_FLAG(bool, use_tls, false, "Whether to use tls.");
+ABSL_FLAG(std::string, custom_credentials_type, "",
+          "User provided credentials type.");
+ABSL_FLAG(int32_t, port, 0, "Server port.");
+ABSL_FLAG(int32_t, max_send_message_size, -1, "The maximum send message size.");
 
 using grpc::Server;
 using grpc::ServerBuilder;
@@ -51,7 +52,6 @@ using grpc::ServerCredentials;
 using grpc::ServerReader;
 using grpc::ServerReaderWriter;
 using grpc::ServerWriter;
-using grpc::SslServerCredentialsOptions;
 using grpc::Status;
 using grpc::WriteOptions;
 using grpc::testing::InteropServerContextInspector;
@@ -139,7 +139,7 @@ class TestServiceImpl : public TestService::Service {
  public:
   Status EmptyCall(ServerContext* context,
                    const grpc::testing::Empty* /*request*/,
-                   grpc::testing::Empty* /*response*/) {
+                   grpc::testing::Empty* /*response*/) override {
     MaybeEchoMetadata(context);
     return Status::OK;
   }
@@ -147,7 +147,7 @@ class TestServiceImpl : public TestService::Service {
   // Response contains current timestamp. We ignore everything in the request.
   Status CacheableUnaryCall(ServerContext* context,
                             const SimpleRequest* /*request*/,
-                            SimpleResponse* response) {
+                            SimpleResponse* response) override {
     gpr_timespec ts = gpr_now(GPR_CLOCK_PRECISE);
     std::string timestamp = std::to_string((long long unsigned)ts.tv_nsec);
     response->mutable_payload()->set_body(timestamp.c_str(), timestamp.size());
@@ -156,7 +156,7 @@ class TestServiceImpl : public TestService::Service {
   }
 
   Status UnaryCall(ServerContext* context, const SimpleRequest* request,
-                   SimpleResponse* response) {
+                   SimpleResponse* response) override {
     MaybeEchoMetadata(context);
     if (request->has_response_compressed()) {
       const bool compression_requested = request->response_compressed().value();
@@ -192,7 +192,7 @@ class TestServiceImpl : public TestService::Service {
 
   Status StreamingOutputCall(
       ServerContext* context, const StreamingOutputCallRequest* request,
-      ServerWriter<StreamingOutputCallResponse>* writer) {
+      ServerWriter<StreamingOutputCallResponse>* writer) override {
     StreamingOutputCallResponse response;
     bool write_success = true;
     for (int i = 0; write_success && i < request->response_parameters_size();
@@ -233,7 +233,7 @@ class TestServiceImpl : public TestService::Service {
 
   Status StreamingInputCall(ServerContext* context,
                             ServerReader<StreamingInputCallRequest>* reader,
-                            StreamingInputCallResponse* response) {
+                            StreamingInputCallResponse* response) override {
     StreamingInputCallRequest request;
     int aggregated_payload_size = 0;
     while (reader->Read(&request)) {
@@ -253,7 +253,7 @@ class TestServiceImpl : public TestService::Service {
   Status FullDuplexCall(
       ServerContext* context,
       ServerReaderWriter<StreamingOutputCallResponse,
-                         StreamingOutputCallRequest>* stream) {
+                         StreamingOutputCallRequest>* stream) override {
     MaybeEchoMetadata(context);
     StreamingOutputCallRequest request;
     StreamingOutputCallResponse response;
@@ -289,7 +289,7 @@ class TestServiceImpl : public TestService::Service {
   Status HalfDuplexCall(
       ServerContext* /*context*/,
       ServerReaderWriter<StreamingOutputCallResponse,
-                         StreamingOutputCallRequest>* stream) {
+                         StreamingOutputCallRequest>* stream) override {
     std::vector<StreamingOutputCallRequest> requests;
     StreamingOutputCallRequest request;
     while (stream->Read(&request)) {
@@ -318,14 +318,15 @@ class TestServiceImpl : public TestService::Service {
 
 void grpc::testing::interop::RunServer(
     const std::shared_ptr<ServerCredentials>& creds) {
-  RunServer(creds, FLAGS_port, nullptr, nullptr);
+  RunServer(creds, absl::GetFlag(FLAGS_port), nullptr, nullptr);
 }
 
 void grpc::testing::interop::RunServer(
     const std::shared_ptr<ServerCredentials>& creds,
     std::unique_ptr<std::vector<std::unique_ptr<ServerBuilderOption>>>
         server_options) {
-  RunServer(creds, FLAGS_port, nullptr, std::move(server_options));
+  RunServer(creds, absl::GetFlag(FLAGS_port), nullptr,
+            std::move(server_options));
 }
 
 void grpc::testing::interop::RunServer(
@@ -355,8 +356,8 @@ void grpc::testing::interop::RunServer(
       builder.SetOption(std::move((*server_options)[i]));
     }
   }
-  if (FLAGS_max_send_message_size >= 0) {
-    builder.SetMaxSendMessageSize(FLAGS_max_send_message_size);
+  if (absl::GetFlag(FLAGS_max_send_message_size) >= 0) {
+    builder.SetMaxSendMessageSize(absl::GetFlag(FLAGS_max_send_message_size));
   }
   std::unique_ptr<Server> server(builder.BuildAndStart());
   gpr_log(GPR_INFO, "Server listening on %s", server_address.str().c_str());
index b16a0da..8a92892 100644 (file)
@@ -17,6 +17,8 @@
  */
 
 #include <assert.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string>
 #include <vector>
 
+#include "absl/flags/flag.h"
 #include "absl/strings/str_cat.h"
-
-#include <gflags/gflags.h>
-#include <grpc/support/alloc.h>
-#include <grpc/support/log.h>
-#include "test/core/util/port.h"
-#include "test/cpp/util/test_config.h"
-
 #include "src/core/lib/gpr/string.h"
 #include "src/core/lib/iomgr/socket_utils_posix.h"
+#include "test/core/util/port.h"
+#include "test/cpp/util/test_config.h"
 
-DEFINE_string(extra_server_flags, "", "Extra flags to pass to server.");
+ABSL_FLAG(std::string, extra_server_flags, "",
+          "Extra flags to pass to server.");
 
 int test_client(const char* root, const char* host, int port) {
   int status;
@@ -91,8 +90,9 @@ int main(int argc, char** argv) {
     args.push_back(const_cast<char*>(command.c_str()));
     std::string port_arg = absl::StrCat("--port=", port);
     args.push_back(const_cast<char*>(port_arg.c_str()));
-    if (!FLAGS_extra_server_flags.empty()) {
-      args.push_back(const_cast<char*>(FLAGS_extra_server_flags.c_str()));
+    if (!absl::GetFlag(FLAGS_extra_server_flags).empty()) {
+      args.push_back(
+          const_cast<char*>(absl::GetFlag(FLAGS_extra_server_flags).c_str()));
     }
     args.push_back(nullptr);
     execv(args[0], args.data());
index f2fa1a8..736182c 100644 (file)
  *is % allowed in string
  */
 
-#include <memory>
-#include <string>
-
-#include <gflags/gflags.h>
 #include <grpc/support/log.h>
 #include <grpcpp/grpcpp.h>
 
+#include <memory>
+#include <string>
+
+#include "absl/flags/flag.h"
 #include "src/proto/grpc/testing/metrics.grpc.pb.h"
 #include "src/proto/grpc/testing/metrics.pb.h"
 #include "test/cpp/util/metrics_server.h"
 
 int kDeadlineSecs = 10;
 
-DEFINE_string(metrics_server_address, "localhost:8081",
-              "The metrics server addresses in the fomrat <hostname>:<port>");
-DEFINE_int32(deadline_secs, kDeadlineSecs,
-             "The deadline (in seconds) for RCP call");
-DEFINE_bool(total_only, false,
-            "If true, this prints only the total value of all gauges");
+ABSL_FLAG(std::string, metrics_server_address, "localhost:8081",
+          "The metrics server addresses in the fomrat <hostname>:<port>");
+// TODO(Capstan): Consider using absl::Duration
+ABSL_FLAG(int32_t, deadline_secs, kDeadlineSecs,
+          "The deadline (in seconds) for RCP call");
+ABSL_FLAG(bool, total_only, false,
+          "If true, this prints only the total value of all gauges");
 
 using grpc::testing::EmptyMessage;
 using grpc::testing::GaugeResponse;
 using grpc::testing::MetricsService;
-using grpc::testing::MetricsServiceImpl;
 
 // Do not log anything
 void BlackholeLogger(gpr_log_func_args* /*args*/) {}
@@ -93,11 +93,13 @@ int main(int argc, char** argv) {
   // from the grpc library appearing on stdout.
   gpr_set_log_function(BlackholeLogger);
 
-  std::shared_ptr<grpc::Channel> channel(grpc::CreateChannel(
-      FLAGS_metrics_server_address, grpc::InsecureChannelCredentials()));
+  std::shared_ptr<grpc::Channel> channel(
+      grpc::CreateChannel(absl::GetFlag(FLAGS_metrics_server_address),
+                          grpc::InsecureChannelCredentials()));
 
-  if (!PrintMetrics(MetricsService::NewStub(channel), FLAGS_total_only,
-                    FLAGS_deadline_secs)) {
+  if (!PrintMetrics(MetricsService::NewStub(channel),
+                    absl::GetFlag(FLAGS_total_only),
+                    absl::GetFlag(FLAGS_deadline_secs))) {
     return 1;
   }
 
index 8a071d4..f24b841 100644 (file)
  *
  */
 
-#include <memory>
-#include <sstream>
-
-#include <gflags/gflags.h>
 #include <grpc/grpc.h>
 #include <grpc/support/log.h>
 #include <grpcpp/channel.h>
 #include <grpcpp/client_context.h>
 #include <grpcpp/support/channel_arguments.h>
+
+#include <memory>
+#include <sstream>
+
+#include "absl/flags/flag.h"
 #include "src/proto/grpc/testing/empty.pb.h"
 #include "src/proto/grpc/testing/messages.pb.h"
 #include "src/proto/grpc/testing/test.grpc.pb.h"
 #include "test/cpp/util/create_test_channel.h"
 #include "test/cpp/util/test_config.h"
 
-DEFINE_int32(server_control_port, 0, "Server port for control rpcs.");
-DEFINE_int32(server_retry_port, 0, "Server port for testing reconnection.");
-DEFINE_string(server_host, "localhost", "Server host to connect to");
-DEFINE_int32(max_reconnect_backoff_ms, 0,
-             "Maximum backoff time, or 0 for default.");
+ABSL_FLAG(int32_t, server_control_port, 0, "Server port for control rpcs.");
+ABSL_FLAG(int32_t, server_retry_port, 0,
+          "Server port for testing reconnection.");
+ABSL_FLAG(std::string, server_host, "localhost", "Server host to connect to");
+// TODO(Capstan): Consider using absl::Duration
+ABSL_FLAG(int32_t, max_reconnect_backoff_ms, 0,
+          "Maximum backoff time, or 0 for default.");
 
 using grpc::CallCredentials;
 using grpc::Channel;
@@ -52,17 +55,19 @@ using grpc::testing::TLS;
 
 int main(int argc, char** argv) {
   grpc::testing::InitTest(&argc, &argv, true);
-  GPR_ASSERT(FLAGS_server_control_port);
-  GPR_ASSERT(FLAGS_server_retry_port);
+  GPR_ASSERT(absl::GetFlag(FLAGS_server_control_port));
+  GPR_ASSERT(absl::GetFlag(FLAGS_server_retry_port));
 
   std::ostringstream server_address;
-  server_address << FLAGS_server_host << ':' << FLAGS_server_control_port;
+  server_address << absl::GetFlag(FLAGS_server_host) << ':'
+                 << absl::GetFlag(FLAGS_server_control_port);
   std::unique_ptr<ReconnectService::Stub> control_stub(
       ReconnectService::NewStub(
           CreateTestChannel(server_address.str(), INSECURE)));
   ClientContext start_context;
   ReconnectParams reconnect_params;
-  reconnect_params.set_max_reconnect_backoff_ms(FLAGS_max_reconnect_backoff_ms);
+  reconnect_params.set_max_reconnect_backoff_ms(
+      absl::GetFlag(FLAGS_max_reconnect_backoff_ms));
   Empty empty_response;
   Status start_status =
       control_stub->Start(&start_context, reconnect_params, &empty_response);
@@ -70,11 +75,12 @@ int main(int argc, char** argv) {
 
   gpr_log(GPR_INFO, "Starting connections with retries.");
   server_address.str("");
-  server_address << FLAGS_server_host << ':' << FLAGS_server_retry_port;
+  server_address << absl::GetFlag(FLAGS_server_host) << ':'
+                 << absl::GetFlag(FLAGS_server_retry_port);
   ChannelArguments channel_args;
-  if (FLAGS_max_reconnect_backoff_ms > 0) {
+  if (absl::GetFlag(FLAGS_max_reconnect_backoff_ms) > 0) {
     channel_args.SetInt(GRPC_ARG_MAX_RECONNECT_BACKOFF_MS,
-                        FLAGS_max_reconnect_backoff_ms);
+                        absl::GetFlag(FLAGS_max_reconnect_backoff_ms));
   }
   std::shared_ptr<Channel> retry_channel =
       CreateTestChannel(server_address.str(), "foo.test.google.fr", TLS, false,
index 1e99d7c..8e7ef41 100644 (file)
 
 // Test description at doc/connection-backoff-interop-test-description.md
 
+#include <grpc/grpc.h>
+#include <grpc/support/log.h>
+#include <grpcpp/server.h>
+#include <grpcpp/server_builder.h>
+#include <grpcpp/server_context.h>
 #include <signal.h>
 
 #include <condition_variable>
 #include <mutex>
 #include <sstream>
 
-#include <gflags/gflags.h>
-#include <grpc/grpc.h>
-#include <grpc/support/log.h>
-#include <grpcpp/server.h>
-#include <grpcpp/server_builder.h>
-#include <grpcpp/server_context.h>
-
+#include "absl/flags/flag.h"
 #include "src/proto/grpc/testing/empty.pb.h"
 #include "src/proto/grpc/testing/messages.pb.h"
 #include "src/proto/grpc/testing/test.grpc.pb.h"
 #include "test/core/util/reconnect_server.h"
 #include "test/cpp/util/test_config.h"
 
-DEFINE_int32(control_port, 0, "Server port for controlling the server.");
-DEFINE_int32(retry_port, 0,
-             "Server port for raw tcp connections. All incoming "
-             "connections will be closed immediately.");
+ABSL_FLAG(int32_t, control_port, 0, "Server port for controlling the server.");
+ABSL_FLAG(int32_t, retry_port, 0,
+          "Server port for raw tcp connections. All incoming "
+          "connections will be closed immediately.");
 
 using grpc::Server;
 using grpc::ServerBuilder;
 using grpc::ServerContext;
-using grpc::ServerCredentials;
-using grpc::ServerReader;
-using grpc::ServerReaderWriter;
-using grpc::ServerWriter;
-using grpc::SslServerCredentialsOptions;
 using grpc::Status;
 using grpc::testing::Empty;
 using grpc::testing::ReconnectInfo;
@@ -69,7 +63,7 @@ class ReconnectServiceImpl : public ReconnectService::Service {
     reconnect_server_init(&tcp_server_);
   }
 
-  ~ReconnectServiceImpl() {
+  ~ReconnectServiceImpl() override {
     if (server_started_) {
       reconnect_server_destroy(&tcp_server_);
     }
@@ -78,7 +72,7 @@ class ReconnectServiceImpl : public ReconnectService::Service {
   void Poll(int seconds) { reconnect_server_poll(&tcp_server_, seconds); }
 
   Status Start(ServerContext* /*context*/, const ReconnectParams* request,
-               Empty* /*response*/) {
+               Empty* /*response*/) override {
     bool start_server = true;
     std::unique_lock<std::mutex> lock(mu_);
     while (serving_ && !shutdown_) {
@@ -106,7 +100,7 @@ class ReconnectServiceImpl : public ReconnectService::Service {
   }
 
   Status Stop(ServerContext* /*context*/, const Empty* /*request*/,
-              ReconnectInfo* response) {
+              ReconnectInfo* response) override {
     // extract timestamps and set response
     Verify(response);
     reconnect_server_clear_timestamps(&tcp_server_);
@@ -161,8 +155,8 @@ class ReconnectServiceImpl : public ReconnectService::Service {
 
 void RunServer() {
   std::ostringstream server_address;
-  server_address << "0.0.0.0:" << FLAGS_control_port;
-  ReconnectServiceImpl service(FLAGS_retry_port);
+  server_address << "0.0.0.0:" << absl::GetFlag(FLAGS_control_port);
+  ReconnectServiceImpl service(absl::GetFlag(FLAGS_retry_port));
 
   ServerBuilder builder;
   builder.RegisterService(&service);
@@ -182,8 +176,8 @@ int main(int argc, char** argv) {
   grpc::testing::InitTest(&argc, &argv, true);
   signal(SIGINT, sigint_handler);
 
-  GPR_ASSERT(FLAGS_control_port != 0);
-  GPR_ASSERT(FLAGS_retry_port != 0);
+  GPR_ASSERT(absl::GetFlag(FLAGS_control_port) != 0);
+  GPR_ASSERT(absl::GetFlag(FLAGS_retry_port) != 0);
   RunServer();
 
   return 0;
index d818dee..7da24a4 100644 (file)
 
 #include "test/cpp/interop/server_helper.h"
 
-#include <memory>
-
-#include <gflags/gflags.h>
 #include <grpcpp/security/server_credentials.h>
 
+#include <memory>
+
+#include "absl/flags/declare.h"
+#include "absl/flags/flag.h"
 #include "src/core/lib/surface/call_test_only.h"
 #include "src/core/lib/transport/byte_stream.h"
 #include "test/cpp/util/test_credentials_provider.h"
 
-DECLARE_bool(use_alts);
-DECLARE_bool(use_tls);
-DECLARE_string(custom_credentials_type);
+ABSL_DECLARE_FLAG(bool, use_alts);
+ABSL_DECLARE_FLAG(bool, use_tls);
+ABSL_DECLARE_FLAG(std::string, custom_credentials_type);
 
 namespace grpc {
 namespace testing {
 
 std::shared_ptr<ServerCredentials> CreateInteropServerCredentials() {
-  if (!FLAGS_custom_credentials_type.empty()) {
+  if (!absl::GetFlag(FLAGS_custom_credentials_type).empty()) {
     return GetCredentialsProvider()->GetServerCredentials(
-        FLAGS_custom_credentials_type);
-  } else if (FLAGS_use_alts) {
+        absl::GetFlag(FLAGS_custom_credentials_type));
+  } else if (absl::GetFlag(FLAGS_use_alts)) {
     return GetCredentialsProvider()->GetServerCredentials(kAltsCredentialsType);
-  } else if (FLAGS_use_tls) {
+  } else if (absl::GetFlag(FLAGS_use_tls)) {
     return GetCredentialsProvider()->GetServerCredentials(kTlsCredentialsType);
   } else {
     return GetCredentialsProvider()->GetServerCredentials(
index 071b0e2..cc7651e 100644 (file)
  *is % allowed in string
  */
 
+#include <grpc/support/log.h>
+#include <grpc/support/time.h>
+#include <grpcpp/create_channel.h>
+#include <grpcpp/grpcpp.h>
+
 #include <memory>
 #include <string>
 #include <thread>
 #include <utility>
 #include <vector>
 
-#include <gflags/gflags.h>
-#include <grpc/support/log.h>
-#include <grpc/support/time.h>
-#include <grpcpp/create_channel.h>
-#include <grpcpp/grpcpp.h>
-
+#include "absl/flags/flag.h"
 #include "src/proto/grpc/testing/metrics.grpc.pb.h"
 #include "src/proto/grpc/testing/metrics.pb.h"
 #include "test/cpp/interop/interop_client.h"
 
 extern void gpr_default_log(gpr_log_func_args* args);
 
-DEFINE_int32(metrics_port, 8081, "The metrics server port.");
+ABSL_FLAG(int32_t, metrics_port, 8081, "The metrics server port.");
 
-DEFINE_int32(sleep_duration_ms, 0,
-             "The duration (in millisec) between two"
-             " consecutive test calls (per server) issued by the server.");
+// TODO(Capstan): Consider using absl::Duration
+ABSL_FLAG(int32_t, sleep_duration_ms, 0,
+          "The duration (in millisec) between two"
+          " consecutive test calls (per server) issued by the server.");
 
-DEFINE_int32(test_duration_secs, -1,
-             "The length of time (in seconds) to run"
-             " the test. Enter -1 if the test should run continuously until"
-             " forcefully terminated.");
+// TODO(Capstan): Consider using absl::Duration
+ABSL_FLAG(int32_t, test_duration_secs, -1,
+          "The length of time (in seconds) to run"
+          " the test. Enter -1 if the test should run continuously until"
+          " forcefully terminated.");
 
-DEFINE_string(server_addresses, "localhost:8080",
-              "The list of server addresses. The format is: \n"
-              " \"<name_1>:<port_1>,<name_2>:<port_1>...<name_N>:<port_N>\"\n"
-              " Note: <name> can be servername or IP address.");
+ABSL_FLAG(std::string, server_addresses, "localhost:8080",
+          "The list of server addresses. The format is: \n"
+          " \"<name_1>:<port_1>,<name_2>:<port_1>...<name_N>:<port_N>\"\n"
+          " Note: <name> can be servername or IP address.");
 
-DEFINE_int32(num_channels_per_server, 1, "Number of channels for each server");
+ABSL_FLAG(int32_t, num_channels_per_server, 1,
+          "Number of channels for each server");
 
-DEFINE_int32(num_stubs_per_channel, 1,
-             "Number of stubs per each channels to server. This number also "
-             "indicates the max number of parallel RPC calls on each channel "
-             "at any given time.");
+ABSL_FLAG(int32_t, num_stubs_per_channel, 1,
+          "Number of stubs per each channels to server. This number also "
+          "indicates the max number of parallel RPC calls on each channel "
+          "at any given time.");
 
 // TODO(sreek): Add more test cases here in future
-DEFINE_string(test_cases, "",
-              "List of test cases to call along with the"
-              " relative weights in the following format:\n"
-              " \"<testcase_1:w_1>,<testcase_2:w_2>...<testcase_n:w_n>\"\n"
-              " The following testcases are currently supported:\n"
-              "   empty_unary\n"
-              "   large_unary\n"
-              "   large_compressed_unary\n"
-              "   client_streaming\n"
-              "   server_streaming\n"
-              "   server_compressed_streaming\n"
-              "   slow_consumer\n"
-              "   half_duplex\n"
-              "   ping_pong\n"
-              "   cancel_after_begin\n"
-              "   cancel_after_first_response\n"
-              "   timeout_on_sleeping_server\n"
-              "   empty_stream\n"
-              "   status_code_and_message\n"
-              "   custom_metadata\n"
-              " Example: \"empty_unary:20,large_unary:10,empty_stream:70\"\n"
-              " The above will execute 'empty_unary', 20% of the time,"
-              " 'large_unary', 10% of the time and 'empty_stream' the remaining"
-              " 70% of the time");
-
-DEFINE_int32(log_level, GPR_LOG_SEVERITY_INFO,
-             "Severity level of messages that should be logged. Any messages "
-             "greater than or equal to the level set here will be logged. "
-             "The choices are: 0 (GPR_LOG_SEVERITY_DEBUG), 1 "
-             "(GPR_LOG_SEVERITY_INFO) and 2 (GPR_LOG_SEVERITY_ERROR)");
-
-DEFINE_bool(do_not_abort_on_transient_failures, true,
-            "If set to 'true', abort() is not called in case of transient "
-            "failures like temporary connection failures.");
+ABSL_FLAG(std::string, test_cases, "",
+          "List of test cases to call along with the"
+          " relative weights in the following format:\n"
+          " \"<testcase_1:w_1>,<testcase_2:w_2>...<testcase_n:w_n>\"\n"
+          " The following testcases are currently supported:\n"
+          "   empty_unary\n"
+          "   large_unary\n"
+          "   large_compressed_unary\n"
+          "   client_streaming\n"
+          "   server_streaming\n"
+          "   server_compressed_streaming\n"
+          "   slow_consumer\n"
+          "   half_duplex\n"
+          "   ping_pong\n"
+          "   cancel_after_begin\n"
+          "   cancel_after_first_response\n"
+          "   timeout_on_sleeping_server\n"
+          "   empty_stream\n"
+          "   status_code_and_message\n"
+          "   custom_metadata\n"
+          " Example: \"empty_unary:20,large_unary:10,empty_stream:70\"\n"
+          " The above will execute 'empty_unary', 20% of the time,"
+          " 'large_unary', 10% of the time and 'empty_stream' the remaining"
+          " 70% of the time");
+
+ABSL_FLAG(int32_t, log_level, GPR_LOG_SEVERITY_INFO,
+          "Severity level of messages that should be logged. Any messages "
+          "greater than or equal to the level set here will be logged. "
+          "The choices are: 0 (GPR_LOG_SEVERITY_DEBUG), 1 "
+          "(GPR_LOG_SEVERITY_INFO) and 2 (GPR_LOG_SEVERITY_ERROR)");
+
+ABSL_FLAG(bool, do_not_abort_on_transient_failures, true,
+          "If set to 'true', abort() is not called in case of transient "
+          "failures like temporary connection failures.");
 
 // Options from client.cc (for compatibility with interop test).
 // TODO(sreek): Consolidate overlapping options
-DEFINE_bool(use_alts, false,
-            "Whether to use alts. Enable alts will disable tls.");
-DEFINE_bool(use_tls, false, "Whether to use tls.");
-DEFINE_bool(use_test_ca, false, "False to use SSL roots for google");
-DEFINE_string(server_host_override, "",
-              "Override the server host which is sent in HTTP header");
+ABSL_FLAG(bool, use_alts, false,
+          "Whether to use alts. Enable alts will disable tls.");
+ABSL_FLAG(bool, use_tls, false, "Whether to use tls.");
+ABSL_FLAG(bool, use_test_ca, false, "False to use SSL roots for google");
+ABSL_FLAG(std::string, server_host_override, "",
+          "Override the server host which is sent in HTTP header");
 
 using grpc::testing::ALTS;
 using grpc::testing::INSECURE;
 using grpc::testing::kTestCaseList;
-using grpc::testing::MetricsService;
 using grpc::testing::MetricsServiceImpl;
 using grpc::testing::StressTestInteropClient;
 using grpc::testing::TestCaseType;
@@ -194,16 +196,21 @@ bool ParseTestCasesString(const std::string& test_cases,
 // For debugging purposes
 void LogParameterInfo(const std::vector<std::string>& addresses,
                       const std::vector<std::pair<TestCaseType, int>>& tests) {
-  gpr_log(GPR_INFO, "server_addresses: %s", FLAGS_server_addresses.c_str());
-  gpr_log(GPR_INFO, "test_cases : %s", FLAGS_test_cases.c_str());
-  gpr_log(GPR_INFO, "sleep_duration_ms: %d", FLAGS_sleep_duration_ms);
-  gpr_log(GPR_INFO, "test_duration_secs: %d", FLAGS_test_duration_secs);
+  gpr_log(GPR_INFO, "server_addresses: %s",
+          absl::GetFlag(FLAGS_server_addresses).c_str());
+  gpr_log(GPR_INFO, "test_cases : %s", absl::GetFlag(FLAGS_test_cases).c_str());
+  gpr_log(GPR_INFO, "sleep_duration_ms: %d",
+          absl::GetFlag(FLAGS_sleep_duration_ms));
+  gpr_log(GPR_INFO, "test_duration_secs: %d",
+          absl::GetFlag(FLAGS_test_duration_secs));
   gpr_log(GPR_INFO, "num_channels_per_server: %d",
-          FLAGS_num_channels_per_server);
-  gpr_log(GPR_INFO, "num_stubs_per_channel: %d", FLAGS_num_stubs_per_channel);
-  gpr_log(GPR_INFO, "log_level: %d", FLAGS_log_level);
+          absl::GetFlag(FLAGS_num_channels_per_server));
+  gpr_log(GPR_INFO, "num_stubs_per_channel: %d",
+          absl::GetFlag(FLAGS_num_stubs_per_channel));
+  gpr_log(GPR_INFO, "log_level: %d", absl::GetFlag(FLAGS_log_level));
   gpr_log(GPR_INFO, "do_not_abort_on_transient_failures: %s",
-          FLAGS_do_not_abort_on_transient_failures ? "true" : "false");
+          absl::GetFlag(FLAGS_do_not_abort_on_transient_failures) ? "true"
+                                                                  : "false");
 
   int num = 0;
   for (auto it = addresses.begin(); it != addresses.end(); it++) {
@@ -222,8 +229,8 @@ void LogParameterInfo(const std::vector<std::string>& addresses,
 int main(int argc, char** argv) {
   grpc::testing::InitTest(&argc, &argv, true);
 
-  if (FLAGS_log_level > GPR_LOG_SEVERITY_ERROR ||
-      FLAGS_log_level < GPR_LOG_SEVERITY_DEBUG) {
+  if (absl::GetFlag(FLAGS_log_level) > GPR_LOG_SEVERITY_ERROR ||
+      absl::GetFlag(FLAGS_log_level) < GPR_LOG_SEVERITY_DEBUG) {
     gpr_log(GPR_ERROR, "log_level should be an integer between %d and %d",
             GPR_LOG_SEVERITY_DEBUG, GPR_LOG_SEVERITY_ERROR);
     return 1;
@@ -231,25 +238,26 @@ int main(int argc, char** argv) {
 
   // Change the default log function to TestLogFunction which respects the
   // log_level setting.
-  log_level = FLAGS_log_level;
+  log_level = absl::GetFlag(FLAGS_log_level);
   gpr_set_log_function(TestLogFunction);
 
   srand(time(nullptr));
 
   // Parse the server addresses
   std::vector<std::string> server_addresses;
-  ParseCommaDelimitedString(FLAGS_server_addresses, server_addresses);
+  ParseCommaDelimitedString(absl::GetFlag(FLAGS_server_addresses),
+                            server_addresses);
 
   // Parse test cases and weights
-  if (FLAGS_test_cases.length() == 0) {
+  if (absl::GetFlag(FLAGS_test_cases).length() == 0) {
     gpr_log(GPR_ERROR, "No test cases supplied");
     return 1;
   }
 
   std::vector<std::pair<TestCaseType, int>> tests;
-  if (!ParseTestCasesString(FLAGS_test_cases, tests)) {
+  if (!ParseTestCasesString(absl::GetFlag(FLAGS_test_cases), tests)) {
     gpr_log(GPR_ERROR, "Error in parsing test cases string %s ",
-            FLAGS_test_cases.c_str());
+            absl::GetFlag(FLAGS_test_cases).c_str());
     return 1;
   }
 
@@ -275,28 +283,33 @@ int main(int argc, char** argv) {
   int server_idx = -1;
   char buffer[256];
   transport_security security_type =
-      FLAGS_use_alts ? ALTS : (FLAGS_use_tls ? TLS : INSECURE);
+      absl::GetFlag(FLAGS_use_alts)
+          ? ALTS
+          : (absl::GetFlag(FLAGS_use_tls) ? TLS : INSECURE);
   for (auto it = server_addresses.begin(); it != server_addresses.end(); it++) {
     ++server_idx;
     // Create channel(s) for each server
-    for (int channel_idx = 0; channel_idx < FLAGS_num_channels_per_server;
+    for (int channel_idx = 0;
+         channel_idx < absl::GetFlag(FLAGS_num_channels_per_server);
          channel_idx++) {
       gpr_log(GPR_INFO, "Starting test with %s channel_idx=%d..", it->c_str(),
               channel_idx);
-      grpc::testing::ChannelCreationFunc channel_creation_func = std::bind(
-          static_cast<std::shared_ptr<grpc::Channel> (*)(
-              const std::string&, const std::string&,
-              grpc::testing::transport_security, bool)>(
-              grpc::CreateTestChannel),
-          *it, FLAGS_server_host_override, security_type, !FLAGS_use_test_ca);
+      grpc::testing::ChannelCreationFunc channel_creation_func =
+          std::bind(static_cast<std::shared_ptr<grpc::Channel> (*)(
+                        const std::string&, const std::string&,
+                        grpc::testing::transport_security, bool)>(
+                        grpc::CreateTestChannel),
+                    *it, absl::GetFlag(FLAGS_server_host_override),
+                    security_type, !absl::GetFlag(FLAGS_use_test_ca));
 
       // Create stub(s) for each channel
-      for (int stub_idx = 0; stub_idx < FLAGS_num_stubs_per_channel;
-           stub_idx++) {
+      for (int stub_idx = 0;
+           stub_idx < absl::GetFlag(FLAGS_num_stubs_per_channel); stub_idx++) {
         clients.emplace_back(new StressTestInteropClient(
             ++thread_idx, *it, channel_creation_func, test_selector,
-            FLAGS_test_duration_secs, FLAGS_sleep_duration_ms,
-            FLAGS_do_not_abort_on_transient_failures));
+            absl::GetFlag(FLAGS_test_duration_secs),
+            absl::GetFlag(FLAGS_sleep_duration_ms),
+            absl::GetFlag(FLAGS_do_not_abort_on_transient_failures)));
 
         bool is_already_created = false;
         // QpsGauge name
@@ -316,8 +329,9 @@ int main(int argc, char** argv) {
 
   // Start metrics server before waiting for the stress test threads
   std::unique_ptr<grpc::Server> metrics_server;
-  if (FLAGS_metrics_port > 0) {
-    metrics_server = metrics_service.StartServer(FLAGS_metrics_port);
+  if (absl::GetFlag(FLAGS_metrics_port) > 0) {
+    metrics_server =
+        metrics_service.StartServer(absl::GetFlag(FLAGS_metrics_port));
   }
 
   // Wait for the stress test threads to complete
index db36ff7..4013ce9 100644 (file)
  *
  */
 
+#include <grpcpp/grpcpp.h>
+#include <grpcpp/server.h>
+#include <grpcpp/server_builder.h>
+#include <grpcpp/server_context.h>
+
 #include <atomic>
 #include <chrono>
 #include <condition_variable>
 #include <thread>
 #include <vector>
 
+#include "absl/flags/flag.h"
 #include "absl/strings/str_split.h"
-
-#include <gflags/gflags.h>
-#include <grpcpp/grpcpp.h>
-#include <grpcpp/server.h>
-#include <grpcpp/server_builder.h>
-#include <grpcpp/server_context.h>
-
 #include "src/core/lib/gpr/env.h"
 #include "src/proto/grpc/testing/empty.pb.h"
 #include "src/proto/grpc/testing/messages.pb.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/util/test_config.h"
 
-DEFINE_bool(fail_on_failed_rpc, false,
-            "Fail client if any RPCs fail after first successful RPC.");
-DEFINE_int32(num_channels, 1, "Number of channels.");
-DEFINE_bool(print_response, false, "Write RPC response to stdout.");
-DEFINE_int32(qps, 1, "Qps per channel.");
-DEFINE_int32(rpc_timeout_sec, 30, "Per RPC timeout seconds.");
-DEFINE_string(server, "localhost:50051", "Address of server.");
-DEFINE_int32(stats_port, 50052,
-             "Port to expose peer distribution stats service.");
-DEFINE_string(rpc, "UnaryCall", "a comma separated list of rpc methods.");
-DEFINE_string(metadata, "", "metadata to send with the RPC.");
+ABSL_FLAG(bool, fail_on_failed_rpc, false,
+          "Fail client if any RPCs fail after first successful RPC.");
+ABSL_FLAG(int32_t, num_channels, 1, "Number of channels.");
+ABSL_FLAG(bool, print_response, false, "Write RPC response to stdout.");
+ABSL_FLAG(int32_t, qps, 1, "Qps per channel.");
+// TODO(Capstan): Consider using absl::Duration
+ABSL_FLAG(int32_t, rpc_timeout_sec, 30, "Per RPC timeout seconds.");
+ABSL_FLAG(std::string, server, "localhost:50051", "Address of server.");
+ABSL_FLAG(int32_t, stats_port, 50052,
+          "Port to expose peer distribution stats service.");
+ABSL_FLAG(std::string, rpc, "UnaryCall",
+          "a comma separated list of rpc methods.");
+ABSL_FLAG(std::string, metadata, "", "metadata to send with the RPC.");
 
 using grpc::Channel;
 using grpc::ClientAsyncResponseReader;
@@ -61,10 +62,6 @@ using grpc::CompletionQueue;
 using grpc::Server;
 using grpc::ServerBuilder;
 using grpc::ServerContext;
-using grpc::ServerCredentials;
-using grpc::ServerReader;
-using grpc::ServerReaderWriter;
-using grpc::ServerWriter;
 using grpc::Status;
 using grpc::testing::Empty;
 using grpc::testing::LoadBalancerStatsRequest;
@@ -160,7 +157,7 @@ class TestClient {
     }
     std::chrono::system_clock::time_point deadline =
         std::chrono::system_clock::now() +
-        std::chrono::seconds(FLAGS_rpc_timeout_sec);
+        std::chrono::seconds(absl::GetFlag(FLAGS_rpc_timeout_sec));
     AsyncClientCall* call = new AsyncClientCall;
     call->context.set_deadline(deadline);
     for (const auto& data : metadata) {
@@ -185,7 +182,7 @@ class TestClient {
     }
     std::chrono::system_clock::time_point deadline =
         std::chrono::system_clock::now() +
-        std::chrono::seconds(FLAGS_rpc_timeout_sec);
+        std::chrono::seconds(absl::GetFlag(FLAGS_rpc_timeout_sec));
     AsyncClientCall* call = new AsyncClientCall;
     call->context.set_deadline(deadline);
     for (const auto& data : metadata) {
@@ -223,15 +220,17 @@ class TestClient {
       }
 
       if (!call->status.ok()) {
-        if (FLAGS_print_response || FLAGS_fail_on_failed_rpc) {
+        if (absl::GetFlag(FLAGS_print_response) ||
+            absl::GetFlag(FLAGS_fail_on_failed_rpc)) {
           std::cout << "RPC failed: " << call->status.error_code() << ": "
                     << call->status.error_message() << std::endl;
         }
-        if (FLAGS_fail_on_failed_rpc && one_rpc_succeeded.load()) {
+        if (absl::GetFlag(FLAGS_fail_on_failed_rpc) &&
+            one_rpc_succeeded.load()) {
           abort();
         }
       } else {
-        if (FLAGS_print_response) {
+        if (absl::GetFlag(FLAGS_print_response)) {
           auto metadata_hostname =
               call->context.GetServerInitialMetadata().find("hostname");
           std::string hostname =
@@ -271,7 +270,7 @@ class LoadBalancerStatsServiceImpl : public LoadBalancerStatsService::Service {
  public:
   Status GetClientStats(ServerContext* context,
                         const LoadBalancerStatsRequest* request,
-                        LoadBalancerStatsResponse* response) {
+                        LoadBalancerStatsResponse* response) override {
     int start_id;
     int end_id;
     XdsStatsWatcher* watcher;
@@ -293,26 +292,25 @@ class LoadBalancerStatsServiceImpl : public LoadBalancerStatsService::Service {
 };
 
 void RunTestLoop(std::chrono::duration<double> duration_per_query) {
-  std::vector<absl::string_view> rpc_methods =
-      absl::StrSplit(FLAGS_rpc, ',', absl::SkipEmpty());
+  std::vector<std::string> rpc_methods =
+      absl::StrSplit(absl::GetFlag(FLAGS_rpc), ',', absl::SkipEmpty());
   // Store Metadata like
   // "EmptyCall:key1:value1,UnaryCall:key1:value1,UnaryCall:key2:value2" into a
   // map where the key is the RPC method and value is a vector of key:value
   // pairs. {EmptyCall, [{key1,value1}],
   //  UnaryCall, [{key1,value1}, {key2,value2}]}
-  std::vector<absl::string_view> rpc_metadata =
-      absl::StrSplit(FLAGS_metadata, ',', absl::SkipEmpty());
+  std::vector<std::string> rpc_metadata =
+      absl::StrSplit(absl::GetFlag(FLAGS_metadata), ',', absl::SkipEmpty());
   std::map<std::string, std::vector<std::pair<std::string, std::string>>>
       metadata_map;
   for (auto& data : rpc_metadata) {
-    std::vector<absl::string_view> metadata =
+    std::vector<std::string> metadata =
         absl::StrSplit(data, ':', absl::SkipEmpty());
     GPR_ASSERT(metadata.size() == 3);
-    metadata_map[std::string(metadata[0])].push_back(
-        {std::string(metadata[1]), std::string(metadata[2])});
+    metadata_map[metadata[0]].push_back({metadata[1], metadata[2]});
   }
-  TestClient client(
-      grpc::CreateChannel(FLAGS_server, grpc::InsecureChannelCredentials()));
+  TestClient client(grpc::CreateChannel(absl::GetFlag(FLAGS_server),
+                                        grpc::InsecureChannelCredentials()));
   std::chrono::time_point<std::chrono::system_clock> start =
       std::chrono::system_clock::now();
   std::chrono::duration<double> elapsed;
@@ -320,11 +318,11 @@ void RunTestLoop(std::chrono::duration<double> duration_per_query) {
   std::thread thread = std::thread(&TestClient::AsyncCompleteRpc, &client);
 
   while (true) {
-    for (const absl::string_view& rpc_method : rpc_methods) {
+    for (const std::string& rpc_method : rpc_methods) {
       elapsed = std::chrono::system_clock::now() - start;
       if (elapsed > duration_per_query) {
         start = std::chrono::system_clock::now();
-        auto metadata_iter = metadata_map.find(std::string(rpc_method));
+        auto metadata_iter = metadata_map.find(rpc_method);
         if (rpc_method == "EmptyCall") {
           client.AsyncEmptyCall(
               metadata_iter != metadata_map.end()
@@ -365,16 +363,17 @@ int main(int argc, char** argv) {
   grpc::testing::InitTest(&argc, &argv, true);
 
   std::chrono::duration<double> duration_per_query =
-      std::chrono::nanoseconds(std::chrono::seconds(1)) / FLAGS_qps;
+      std::chrono::nanoseconds(std::chrono::seconds(1)) /
+      absl::GetFlag(FLAGS_qps);
 
   std::vector<std::thread> test_threads;
 
-  test_threads.reserve(FLAGS_num_channels);
-  for (int i = 0; i < FLAGS_num_channels; i++) {
+  test_threads.reserve(absl::GetFlag(FLAGS_num_channels));
+  for (int i = 0; i < absl::GetFlag(FLAGS_num_channels); i++) {
     test_threads.emplace_back(std::thread(&RunTestLoop, duration_per_query));
   }
 
-  RunServer(FLAGS_stats_port);
+  RunServer(absl::GetFlag(FLAGS_stats_port));
 
   for (auto it = test_threads.begin(); it != test_threads.end(); it++) {
     it->join();
index 11a551e..fa8f3a7 100644 (file)
@@ -16,7 +16,6 @@
  *
  */
 
-#include <gflags/gflags.h>
 #include <grpc/grpc.h>
 #include <grpc/support/log.h>
 #include <grpc/support/time.h>
@@ -26,6 +25,7 @@
 
 #include <sstream>
 
+#include "absl/flags/flag.h"
 #include "src/core/lib/gpr/string.h"
 #include "src/core/lib/iomgr/gethostname.h"
 #include "src/core/lib/transport/byte_stream.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/util/test_config.h"
 
-DEFINE_int32(port, 50051, "Server port.");
-DEFINE_string(server_id, "cpp_server", "Server ID to include in responses.");
+ABSL_FLAG(int32_t, port, 50051, "Server port.");
+ABSL_FLAG(std::string, server_id, "cpp_server",
+          "Server ID to include in responses.");
 
 using grpc::Server;
 using grpc::ServerBuilder;
 using grpc::ServerContext;
-using grpc::ServerCredentials;
-using grpc::ServerReader;
-using grpc::ServerReaderWriter;
-using grpc::ServerWriter;
 using grpc::Status;
 using grpc::testing::Empty;
 using grpc::testing::SimpleRequest;
@@ -56,15 +53,15 @@ class TestServiceImpl : public TestService::Service {
   TestServiceImpl(const std::string& i) : hostname_(i) {}
 
   Status UnaryCall(ServerContext* context, const SimpleRequest* request,
-                   SimpleResponse* response) {
-    response->set_server_id(FLAGS_server_id);
+                   SimpleResponse* response) override {
+    response->set_server_id(absl::GetFlag(FLAGS_server_id));
     response->set_hostname(hostname_);
     context->AddInitialMetadata("hostname", hostname_);
     return Status::OK;
   }
 
   Status EmptyCall(ServerContext* context, const Empty* request,
-                   Empty* response) {
+                   Empty* response) override {
     context->AddInitialMetadata("hostname", hostname_);
     return Status::OK;
   }
@@ -97,12 +94,12 @@ int main(int argc, char** argv) {
     std::cout << "Failed to get hostname, terminating" << std::endl;
     return 1;
   }
-  if (FLAGS_port == 0) {
+  if (absl::GetFlag(FLAGS_port) == 0) {
     std::cout << "Invalid port, terminating" << std::endl;
     return 1;
   }
 
-  RunServer(FLAGS_port, hostname);
+  RunServer(absl::GetFlag(FLAGS_port), hostname);
 
   return 0;
 }
index 0806fa2..96762c8 100644 (file)
@@ -7,7 +7,7 @@ GRPC_LOCAL_SRC = '../../..'
 
 
 target 'CronetTests' do
-  platform :ios, '8.0'
+  platform :ios, '9.0'
   pod 'Protobuf', :path => "#{GRPC_LOCAL_SRC}/third_party/protobuf", :inhibit_warnings => true
 
   pod '!ProtoCompiler',            :path => "#{GRPC_LOCAL_SRC}/src/objective-c"
@@ -55,6 +55,14 @@ pre_install do |installer|
     'USE_HEADERMAP' => 'NO',
     'ALWAYS_SEARCH_USER_PATHS' => 'NO',
   }
+
+  # This is the RemoteTestCpp podspec object.
+  remote_test_cpp_spec = installer.pod_targets.find{|t| t.name.start_with?('RemoteTestCpp')}.root_spec
+
+  # ios-cpp-test-cronet failes by chance because the RemoteTestCpp target cannot find Protobuf-C++.
+  remote_test_cpp_spec.pod_target_xcconfig = {
+    'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(PODS_ROOT)/header/Public/Protobuf-C++"',
+  }
 end
 
 post_install do |installer|
index debe294..e113703 100644 (file)
@@ -7,8 +7,8 @@ Pod::Spec.new do |s|
   s.summary = "RemoteTest example"
   s.source = { :git => 'https://github.com/grpc/grpc.git' }
 
-  s.ios.deployment_target = '7.1'
-  s.osx.deployment_target = '10.9'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.10'
 
   # Run protoc with the C++ and gRPC plugins to generate protocol messages and gRPC clients.
   s.dependency "!ProtoCompiler-gRPCCppPlugin"
index 865fc66..ceed4a8 100644 (file)
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.3;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.3;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.3;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                SDKROOT = iphoneos;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
-                               IPHONEOS_DEPLOYMENT_TARGET = 8.3;
+                               IPHONEOS_DEPLOYMENT_TARGET = 9.0;
                                MTL_ENABLE_DEBUG_INFO = NO;
                                SDKROOT = iphoneos;
                                VALIDATE_PRODUCT = YES;
index ead0159..176cc08 100755 (executable)
@@ -38,3 +38,14 @@ rm -rf RemoteTestClientCpp/src
 echo "TIME:  $(date)"
 pod install
 
+# ios-cpp-test-cronet flakes sometimes because of missing files in Protobuf-C++,
+# add some log to help find out the root cause.
+# TODO(yulinliang): Delete it after solving the issue.
+if [ -d "./Pods/Headers/Public/Protobuf-C++/google/protobuf" ]
+then 
+    echo "Protobuf-C++/google/protobuf/ has been imported."
+    number_of_files=$(find Pods/Headers/Public/Protobuf-C++/google/protobuf -name "*.h" | wc -l)
+    echo "The number of header files in Pods/Headers/Public/Protobuf-C++/google/protobuf/ is $number_of_files"
+else
+    echo "Error: Protobuf-C++/google/protobuf/ hasn't been imported."
+fi
index 82f9952..f06c384 100644 (file)
@@ -217,6 +217,9 @@ grpc_cc_test(
     name = "bm_fullstack_trickle",
     size = "large",
     srcs = ["bm_fullstack_trickle.cc"],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     tags = [
         "manual",
         "no_windows",
index a43ed73..4b11416 100644 (file)
@@ -508,13 +508,13 @@ static void BM_IsolatedFilter(benchmark::State& state) {
 
   grpc_core::ExecCtx exec_ctx;
   size_t channel_size = grpc_channel_stack_size(
-      filters.size() == 0 ? nullptr : &filters[0], filters.size());
+      filters.empty() ? nullptr : &filters[0], filters.size());
   grpc_channel_stack* channel_stack =
       static_cast<grpc_channel_stack*>(gpr_zalloc(channel_size));
   GPR_ASSERT(GRPC_LOG_IF_ERROR(
       "channel_stack_init",
       grpc_channel_stack_init(1, FilterDestroy, channel_stack,
-                              filters.size() == 0 ? nullptr : &filters[0],
+                              filters.empty() ? nullptr : &filters[0],
                               filters.size(), &channel_args,
                               fixture.flags & REQUIRES_TRANSPORT
                                   ? &dummy_transport::dummy_transport
@@ -703,7 +703,7 @@ class IsolatedCallFixture : public TrackCounters {
     cq_ = grpc_completion_queue_create_for_next(nullptr);
   }
 
-  void Finish(benchmark::State& state) {
+  void Finish(benchmark::State& state) override {
     grpc_completion_queue_destroy(cq_);
     grpc_channel_destroy(channel_);
     TrackCounters::Finish(state);
index a27b77f..9fa42b5 100644 (file)
 /* Benchmark gRPC end2end in various configurations */
 
 #include <benchmark/benchmark.h>
-#include <gflags/gflags.h>
+
 #include <fstream>
 
+#include "absl/flags/flag.h"
+#include "absl/memory/memory.h"
 #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
 #include "src/core/ext/transport/chttp2/transport/internal.h"
 #include "src/core/lib/iomgr/timer_manager.h"
 #include "test/cpp/microbenchmarks/fullstack_fixtures.h"
 #include "test/cpp/util/test_config.h"
 
-DEFINE_bool(log, false, "Log state to CSV files");
-DEFINE_int32(
-    warmup_megabytes, 1,
-    "Number of megabytes to pump before collecting flow control stats");
-DEFINE_int32(
-    warmup_iterations, 100,
-    "Number of iterations to run before collecting flow control stats");
-DEFINE_int32(warmup_max_time_seconds, 10,
-             "Maximum number of seconds to run warmup loop");
+ABSL_FLAG(bool, log, false, "Log state to CSV files");
+ABSL_FLAG(int32_t, warmup_megabytes, 1,
+          "Number of megabytes to pump before collecting flow control stats");
+ABSL_FLAG(int32_t, warmup_iterations, 100,
+          "Number of iterations to run before collecting flow control stats");
+ABSL_FLAG(int32_t, warmup_max_time_seconds, 10,
+          "Maximum number of seconds to run warmup loop");
 
 namespace grpc {
 namespace testing {
@@ -85,11 +85,11 @@ class TrickledCHTTP2 : public EndpointPairFixture {
       : EndpointPairFixture(service, MakeEndpoints(kilobits_per_second, stats),
                             FixtureConfiguration()),
         stats_(stats) {
-    if (FLAGS_log) {
+    if (absl::GetFlag(FLAGS_log)) {
       std::ostringstream fn;
       fn << "trickle." << (streaming ? "streaming" : "unary") << "." << req_size
          << "." << resp_size << "." << kilobits_per_second << ".csv";
-      log_.reset(new std::ofstream(fn.str().c_str()));
+      log_ = absl::make_unique<std::ofstream>(fn.str().c_str());
       write_csv(log_.get(), "t", "iteration", "client_backlog",
                 "server_backlog", "client_t_stall", "client_s_stall",
                 "server_t_stall", "server_s_stall", "client_t_remote",
@@ -104,13 +104,13 @@ class TrickledCHTTP2 : public EndpointPairFixture {
     }
   }
 
-  virtual ~TrickledCHTTP2() {
+  ~TrickledCHTTP2() override {
     if (stats_ != nullptr) {
       grpc_passthru_endpoint_stats_destroy(stats_);
     }
   }
 
-  void AddToLabel(std::ostream& out, benchmark::State& state) {
+  void AddToLabel(std::ostream& out, benchmark::State& state) override {
     out << " writes/iter:"
         << ((double)stats_->num_writes / (double)state.iterations())
         << " cli_transport_stalls/iter:"
@@ -302,14 +302,15 @@ static void BM_PumpStreamServerToClient_Trickle(benchmark::State& state) {
       }
     };
     gpr_timespec warmup_start = gpr_now(GPR_CLOCK_MONOTONIC);
-    for (int i = 0;
-         i < GPR_MAX(FLAGS_warmup_iterations, FLAGS_warmup_megabytes * 1024 *
-                                                  1024 / (14 + state.range(0)));
+    for (int i = 0; i < GPR_MAX(absl::GetFlag(FLAGS_warmup_iterations),
+                                absl::GetFlag(FLAGS_warmup_megabytes) * 1024 *
+                                    1024 / (14 + state.range(0)));
          i++) {
       inner_loop(true);
       if (gpr_time_cmp(gpr_time_sub(gpr_now(GPR_CLOCK_MONOTONIC), warmup_start),
-                       gpr_time_from_seconds(FLAGS_warmup_max_time_seconds,
-                                             GPR_TIMESPAN)) > 0) {
+                       gpr_time_from_seconds(
+                           absl::GetFlag(FLAGS_warmup_max_time_seconds),
+                           GPR_TIMESPAN)) > 0) {
         break;
       }
     }
@@ -415,14 +416,15 @@ static void BM_PumpUnbalancedUnary_Trickle(benchmark::State& state) {
                         fixture->cq(), fixture->cq(), tag(slot));
   };
   gpr_timespec warmup_start = gpr_now(GPR_CLOCK_MONOTONIC);
-  for (int i = 0;
-       i < GPR_MAX(FLAGS_warmup_iterations, FLAGS_warmup_megabytes * 1024 *
-                                                1024 / (14 + state.range(0)));
+  for (int i = 0; i < GPR_MAX(absl::GetFlag(FLAGS_warmup_iterations),
+                              absl::GetFlag(FLAGS_warmup_megabytes) * 1024 *
+                                  1024 / (14 + state.range(0)));
        i++) {
     inner_loop(true);
-    if (gpr_time_cmp(gpr_time_sub(gpr_now(GPR_CLOCK_MONOTONIC), warmup_start),
-                     gpr_time_from_seconds(FLAGS_warmup_max_time_seconds,
-                                           GPR_TIMESPAN)) > 0) {
+    if (gpr_time_cmp(
+            gpr_time_sub(gpr_now(GPR_CLOCK_MONOTONIC), warmup_start),
+            gpr_time_from_seconds(absl::GetFlag(FLAGS_warmup_max_time_seconds),
+                                  GPR_TIMESPAN)) > 0) {
       break;
     }
   }
index 1eb9f52..3b0e0e2 100644 (file)
@@ -46,9 +46,9 @@ static void BM_InitCancelTimer(benchmark::State& state) {
   int i = 0;
   for (auto _ : state) {
     TimerClosure* timer_closure = &timer_closures[i++ % kTimerCount];
-    GRPC_CLOSURE_INIT(&timer_closure->closure,
-                      [](void* /*args*/, grpc_error* /*err*/) {}, nullptr,
-                      grpc_schedule_on_exec_ctx);
+    GRPC_CLOSURE_INIT(
+        &timer_closure->closure, [](void* /*args*/, grpc_error* /*err*/) {},
+        nullptr, grpc_schedule_on_exec_ctx);
     grpc_timer_init(&timer_closure->timer, GRPC_MILLIS_INF_FUTURE,
                     &timer_closure->closure);
     grpc_timer_cancel(&timer_closure->timer);
@@ -75,9 +75,9 @@ static void BM_TimerBatch(benchmark::State& state) {
   for (auto _ : state) {
     for (grpc_millis deadline = start; deadline != end; deadline += increment) {
       TimerClosure* timer_closure = &timer_closures[deadline % kTimerCount];
-      GRPC_CLOSURE_INIT(&timer_closure->closure,
-                        [](void* /*args*/, grpc_error* /*err*/) {}, nullptr,
-                        grpc_schedule_on_exec_ctx);
+      GRPC_CLOSURE_INIT(
+          &timer_closure->closure, [](void* /*args*/, grpc_error* /*err*/) {},
+          nullptr, grpc_schedule_on_exec_ctx);
 
       grpc_timer_init(&timer_closure->timer, deadline, &timer_closure->closure);
     }
index 97a69ec..1caa4f4 100644 (file)
@@ -36,10 +36,10 @@ namespace testing {
  * BENCHMARKING KERNELS
  */
 
-void SendCallbackUnaryPingPong(benchmark::State* state, ClientContext* cli_ctx,
-                               EchoRequest* request, EchoResponse* response,
-                               EchoTestService::Stub* stub_, bool* done,
-                               std::mutex* mu, std::condition_variable* cv) {
+inline void SendCallbackUnaryPingPong(
+    benchmark::State* state, ClientContext* cli_ctx, EchoRequest* request,
+    EchoResponse* response, EchoTestService::Stub* stub_, bool* done,
+    std::mutex* mu, std::condition_variable* cv) {
   int response_msgs_size = state->range(1);
   cli_ctx->AddMetadata(kServerMessageSize, std::to_string(response_msgs_size));
   stub_->experimental_async()->Echo(
index 73b4e41..9ba190b 100644 (file)
@@ -84,7 +84,7 @@ class FullstackFixture : public BaseFixture {
     }
   }
 
-  virtual ~FullstackFixture() {
+  ~FullstackFixture() override {
     server_->Shutdown();
     cq_->Shutdown();
     void* tag;
@@ -93,7 +93,7 @@ class FullstackFixture : public BaseFixture {
     }
   }
 
-  void AddToLabel(std::ostream& out, benchmark::State& state) {
+  void AddToLabel(std::ostream& out, benchmark::State& state) override {
     BaseFixture::AddToLabel(out, state);
     out << " polls/iter:"
         << static_cast<double>(grpc_get_cq_poll_num(this->cq()->cq())) /
@@ -115,7 +115,7 @@ class TCP : public FullstackFixture {
                             FixtureConfiguration())
       : FullstackFixture(service, fixture_configuration, MakeAddress(&port_)) {}
 
-  ~TCP() { grpc_recycle_unused_port(port_); }
+  ~TCP() override { grpc_recycle_unused_port(port_); }
 
  private:
   int port_;
@@ -134,7 +134,7 @@ class UDS : public FullstackFixture {
                             FixtureConfiguration())
       : FullstackFixture(service, fixture_configuration, MakeAddress(&port_)) {}
 
-  ~UDS() { grpc_recycle_unused_port(port_); }
+  ~UDS() override { grpc_recycle_unused_port(port_); }
 
  private:
   int port_;
@@ -154,7 +154,7 @@ class InProcess : public FullstackFixture {
             const FixtureConfiguration& fixture_configuration =
                 FixtureConfiguration())
       : FullstackFixture(service, fixture_configuration, "") {}
-  ~InProcess() {}
+  ~InProcess() override {}
 };
 
 class EndpointPairFixture : public BaseFixture {
@@ -209,7 +209,7 @@ class EndpointPairFixture : public BaseFixture {
     }
   }
 
-  virtual ~EndpointPairFixture() {
+  ~EndpointPairFixture() override {
     server_->Shutdown();
     cq_->Shutdown();
     void* tag;
@@ -218,7 +218,7 @@ class EndpointPairFixture : public BaseFixture {
     }
   }
 
-  void AddToLabel(std::ostream& out, benchmark::State& state) {
+  void AddToLabel(std::ostream& out, benchmark::State& state) override {
     BaseFixture::AddToLabel(out, state);
     out << " polls/iter:"
         << static_cast<double>(grpc_get_cq_poll_num(this->cq()->cq())) /
@@ -261,13 +261,13 @@ class InProcessCHTTP2WithExplicitStats : public EndpointPairFixture {
                             fixture_configuration),
         stats_(stats) {}
 
-  virtual ~InProcessCHTTP2WithExplicitStats() {
+  ~InProcessCHTTP2WithExplicitStats() override {
     if (stats_ != nullptr) {
       grpc_passthru_endpoint_stats_destroy(stats_);
     }
   }
 
-  void AddToLabel(std::ostream& out, benchmark::State& state) {
+  void AddToLabel(std::ostream& out, benchmark::State& state) override {
     EndpointPairFixture::AddToLabel(out, state);
     out << " writes/iter:"
         << static_cast<double>(gpr_atm_no_barrier_load(&stats_->num_writes)) /
index 38203bc..2f89014 100644 (file)
@@ -16,6 +16,8 @@
  *
  */
 
+#include <address_sorting/address_sorting.h>
+#include <gmock/gmock.h>
 #include <grpc/grpc.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <grpc/support/sync.h>
 #include <grpc/support/time.h>
 #include <string.h>
-
-#include <gflags/gflags.h>
-#include <gmock/gmock.h>
 #include <sys/types.h>
-#include <vector>
 
-#include <address_sorting/address_sorting.h>
-#include "test/cpp/util/subprocess.h"
-#include "test/cpp/util/test_config.h"
+#include <vector>
 
 #include "src/core/ext/filters/client_channel/client_channel.h"
 #include "src/core/ext/filters/client_channel/resolver.h"
@@ -49,6 +45,8 @@
 #include "src/core/lib/iomgr/sockaddr_utils.h"
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
+#include "test/cpp/util/subprocess.h"
+#include "test/cpp/util/test_config.h"
 
 #ifndef GPR_WINDOWS
 #include <arpa/inet.h>
@@ -191,7 +189,7 @@ void VerifyLbAddrOutputs(const grpc_core::ServerAddressList& addresses,
 class AddressSortingTest : public ::testing::Test {
  protected:
   void SetUp() override { grpc_init(); }
-  void TearDown() override { grpc_shutdown_blocking(); }
+  void TearDown() override { grpc_shutdown(); }
 };
 
 /* Tests for rule 1 */
@@ -826,7 +824,7 @@ int main(int argc, char** argv) {
       GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver);
   if (strlen(resolver.get()) == 0) {
     GPR_GLOBAL_CONFIG_SET(grpc_dns_resolver, "ares");
-  } else if (strcmp("ares", resolver.get())) {
+  } else if (strcmp("ares", resolver.get()) != 0) {
     gpr_log(GPR_INFO, "GRPC_DNS_RESOLVER != ares: %s.", resolver.get());
   }
   grpc::testing::TestEnvironment env(argc, argv);
index e4c307f..0163c2e 100644 (file)
  *
  */
 
-#include <stdio.h>
-#include <string.h>
-
-#include <string>
-
-#include "absl/strings/str_cat.h"
-#include "absl/strings/str_format.h"
-
-#include <gflags/gflags.h>
 #include <gmock/gmock.h>
-
 #include <grpc/byte_buffer.h>
 #include <grpc/grpc.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <grpc/support/time.h>
+#include <stdio.h>
+#include <string.h>
 
+#include <string>
+
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
 #include "src/core/ext/filters/client_channel/resolver.h"
 #include "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h"
 #include "src/core/ext/filters/client_channel/resolver_registry.h"
@@ -56,7 +52,7 @@
 #define BAD_SOCKET_RETURN_VAL INVALID_SOCKET
 #else
 #include "src/core/lib/iomgr/sockaddr_posix.h"
-#define BAD_SOCKET_RETURN_VAL -1
+#define BAD_SOCKET_RETURN_VAL (-1)
 #endif
 
 namespace {
index 1380d0a..e44ccc2 100644 (file)
@@ -30,7 +30,7 @@
 #define BAD_SOCKET_RETURN_VAL INVALID_SOCKET
 #else
 #include "src/core/lib/iomgr/sockaddr_posix.h"
-#define BAD_SOCKET_RETURN_VAL -1
+#define BAD_SOCKET_RETURN_VAL (-1)
 #endif
 
 namespace grpc {
index 812bf3b..c8dbee7 100755 (executable)
@@ -62,6 +62,9 @@ def generate_resolver_component_tests():
             srcs = [
                 "resolver_component_tests_runner_invoker.cc",
             ],
+            external_deps = [
+                "absl/flags:flag",
+            ],
             deps = [
                 "//test/cpp/util:test_util",
                 "//test/core/util:grpc_test_util",
index d084faf..77ca6e6 100644 (file)
  *
  */
 
-#include <grpc/support/port_platform.h>
-
-#include <string>
-#include <thread>
-#include <vector>
-
 #include <errno.h>
 #include <fcntl.h>
-#include <string.h>
-
-#include <gflags/gflags.h>
 #include <gmock/gmock.h>
-
-#include "absl/strings/str_cat.h"
-#include "absl/strings/str_format.h"
-
 #include <grpc/grpc.h>
 #include <grpc/impl/codegen/grpc_types.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
+#include <grpc/support/port_platform.h>
 #include <grpc/support/sync.h>
 #include <grpc/support/time.h>
+#include <string.h>
 
-#include "test/cpp/util/subprocess.h"
-#include "test/cpp/util/test_config.h"
+#include <string>
+#include <thread>
+#include <vector>
 
+#include "absl/flags/flag.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
 #include "src/core/ext/filters/client_channel/client_channel.h"
 #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
 #include "src/core/ext/filters/client_channel/resolver.h"
@@ -62,8 +56,9 @@
 #include "src/core/lib/iomgr/work_serializer.h"
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
-
 #include "test/cpp/naming/dns_test_util.h"
+#include "test/cpp/util/subprocess.h"
+#include "test/cpp/util/test_config.h"
 
 // TODO: pull in different headers when enabling this
 // test on windows. Also set BAD_SOCKET_RETURN_VAL
 #define BAD_SOCKET_RETURN_VAL INVALID_SOCKET
 #else
 #include "src/core/lib/iomgr/sockaddr_posix.h"
-#define BAD_SOCKET_RETURN_VAL -1
+#define BAD_SOCKET_RETURN_VAL (-1)
 #endif
 
-using grpc::SubProcess;
 using std::vector;
 using testing::UnorderedElementsAreArray;
 
-// Hack copied from "test/cpp/end2end/server_crash_test_client.cc"!
-// In some distros, gflags is in the namespace google, and in some others,
-// in gflags. This hack is enabling us to find both.
-namespace google {}
-namespace gflags {}
-using namespace google;
-using namespace gflags;
-
-DEFINE_string(target_name, "", "Target name to resolve.");
-DEFINE_string(do_ordered_address_comparison, "",
-              "Whether or not to compare resolved addresses to expected "
-              "addresses using an ordered comparison. This is useful for "
-              "testing certain behaviors that involve sorting of resolved "
-              "addresses. Note it would be better if this argument was a "
-              "bool flag, but it's a string for ease of invocation from "
-              "the generated python test runner.");
-DEFINE_string(expected_addrs, "",
-              "List of expected backend or balancer addresses in the form "
-              "'<ip0:port0>,<is_balancer0>;<ip1:port1>,<is_balancer1>;...'. "
-              "'is_balancer' should be bool, i.e. true or false.");
-DEFINE_string(expected_chosen_service_config, "",
-              "Expected service config json string that gets chosen (no "
-              "whitespace). Empty for none.");
-DEFINE_string(expected_service_config_error, "",
-              "Expected service config error. Empty for none.");
-DEFINE_string(
-    local_dns_server_address, "",
-    "Optional. This address is placed as the uri authority if present.");
-DEFINE_string(
-    enable_srv_queries, "",
+ABSL_FLAG(std::string, target_name, "", "Target name to resolve.");
+ABSL_FLAG(std::string, do_ordered_address_comparison, "",
+          "Whether or not to compare resolved addresses to expected "
+          "addresses using an ordered comparison. This is useful for "
+          "testing certain behaviors that involve sorting of resolved "
+          "addresses. Note it would be better if this argument was a "
+          "bool flag, but it's a string for ease of invocation from "
+          "the generated python test runner.");
+ABSL_FLAG(std::string, expected_addrs, "",
+          "List of expected backend or balancer addresses in the form "
+          "'<ip0:port0>,<is_balancer0>;<ip1:port1>,<is_balancer1>;...'. "
+          "'is_balancer' should be bool, i.e. true or false.");
+ABSL_FLAG(std::string, expected_chosen_service_config, "",
+          "Expected service config json string that gets chosen (no "
+          "whitespace). Empty for none.");
+ABSL_FLAG(std::string, expected_service_config_error, "",
+          "Expected service config error. Empty for none.");
+ABSL_FLAG(std::string, local_dns_server_address, "",
+          "Optional. This address is placed as the uri authority if present.");
+// TODO(Capstan): Is this worth making `bool` now with Abseil flags?
+ABSL_FLAG(
+    std::string, enable_srv_queries, "",
     "Whether or not to enable SRV queries for the ares resolver instance."
     "It would be better if this arg could be bool, but the way that we "
     "generate "
     "the python script runner doesn't allow us to pass a gflags bool to this "
     "binary.");
-DEFINE_string(
-    enable_txt_queries, "",
+// TODO(Capstan): Is this worth making `bool` now with Abseil flags?
+ABSL_FLAG(
+    std::string, enable_txt_queries, "",
     "Whether or not to enable TXT queries for the ares resolver instance."
     "It would be better if this arg could be bool, but the way that we "
     "generate "
     "the python script runner doesn't allow us to pass a gflags bool to this "
     "binary.");
-DEFINE_string(
-    inject_broken_nameserver_list, "",
+// TODO(Capstan): Is this worth making `bool` now with Abseil flags?
+ABSL_FLAG(
+    std::string, inject_broken_nameserver_list, "",
     "Whether or not to configure c-ares to use a broken nameserver list, in "
     "which "
     "the first nameserver in the list is non-responsive, but the second one "
@@ -135,9 +123,9 @@ DEFINE_string(
     "generate "
     "the python script runner doesn't allow us to pass a gflags bool to this "
     "binary.");
-DEFINE_string(expected_lb_policy, "",
-              "Expected lb policy name that appears in resolver result channel "
-              "arg. Empty for none.");
+ABSL_FLAG(std::string, expected_lb_policy, "",
+          "Expected lb policy name that appears in resolver result channel "
+          "arg. Empty for none.");
 
 namespace {
 
@@ -161,7 +149,7 @@ class GrpcLBAddress final {
 
 vector<GrpcLBAddress> ParseExpectedAddrs(std::string expected_addrs) {
   std::vector<GrpcLBAddress> out;
-  while (expected_addrs.size() != 0) {
+  while (!expected_addrs.empty()) {
     // get the next <ip>,<port> (v4 or v6)
     size_t next_comma = expected_addrs.find(',');
     if (next_comma == std::string::npos) {
@@ -185,7 +173,7 @@ vector<GrpcLBAddress> ParseExpectedAddrs(std::string expected_addrs) {
     expected_addrs =
         expected_addrs.substr(next_semicolon + 1, std::string::npos);
   }
-  if (out.size() == 0) {
+  if (out.empty()) {
     gpr_log(GPR_ERROR,
             "expected_addrs arg should be a semicolon-separated list of "
             "<ip-port>,<bool> pairs");
@@ -275,11 +263,11 @@ void PollPollsetUntilRequestDone(ArgsStruct* args) {
 void CheckServiceConfigResultLocked(const char* service_config_json,
                                     grpc_error* service_config_error,
                                     ArgsStruct* args) {
-  if (args->expected_service_config_string != "") {
+  if (!args->expected_service_config_string.empty()) {
     GPR_ASSERT(service_config_json != nullptr);
     EXPECT_EQ(service_config_json, args->expected_service_config_string);
   }
-  if (args->expected_service_config_error == "") {
+  if (args->expected_service_config_error.empty()) {
     EXPECT_EQ(service_config_error, GRPC_ERROR_NONE);
   } else {
     EXPECT_THAT(grpc_error_string(service_config_error),
@@ -292,7 +280,7 @@ void CheckLBPolicyResultLocked(const grpc_channel_args* channel_args,
                                ArgsStruct* args) {
   const grpc_arg* lb_policy_arg =
       grpc_channel_args_find(channel_args, GRPC_ARG_LB_POLICY_NAME);
-  if (args->expected_lb_policy != "") {
+  if (!args->expected_lb_policy.empty()) {
     GPR_ASSERT(lb_policy_arg != nullptr);
     GPR_ASSERT(lb_policy_arg->type == GRPC_ARG_STRING);
     EXPECT_EQ(lb_policy_arg->value.string, args->expected_lb_policy);
@@ -495,16 +483,16 @@ class CheckingResultHandler : public ResultHandler {
               found_lb_addrs.size(), args->expected_addrs.size());
       abort();
     }
-    if (FLAGS_do_ordered_address_comparison == "True") {
+    if (absl::GetFlag(FLAGS_do_ordered_address_comparison) == "True") {
       EXPECT_EQ(args->expected_addrs, found_lb_addrs);
-    } else if (FLAGS_do_ordered_address_comparison == "False") {
+    } else if (absl::GetFlag(FLAGS_do_ordered_address_comparison) == "False") {
       EXPECT_THAT(args->expected_addrs,
                   UnorderedElementsAreArray(found_lb_addrs));
     } else {
       gpr_log(GPR_ERROR,
               "Invalid for setting for --do_ordered_address_comparison. "
               "Have %s, want True or False",
-              FLAGS_do_ordered_address_comparison.c_str());
+              absl::GetFlag(FLAGS_do_ordered_address_comparison).c_str());
       GPR_ASSERT(0);
     }
     const char* service_config_json =
@@ -513,7 +501,7 @@ class CheckingResultHandler : public ResultHandler {
             : result.service_config->json_string().c_str();
     CheckServiceConfigResultLocked(
         service_config_json, GRPC_ERROR_REF(result.service_config_error), args);
-    if (args->expected_service_config_string == "") {
+    if (args->expected_service_config_string.empty()) {
       CheckLBPolicyResultLocked(result.args, args);
     }
   }
@@ -543,13 +531,14 @@ void InjectBrokenNameServerList(ares_channel channel) {
   memset(dns_server_addrs, 0, sizeof(dns_server_addrs));
   std::string unused_host;
   std::string local_dns_server_port;
-  GPR_ASSERT(grpc_core::SplitHostPort(FLAGS_local_dns_server_address.c_str(),
-                                      &unused_host, &local_dns_server_port));
+  GPR_ASSERT(grpc_core::SplitHostPort(
+      absl::GetFlag(FLAGS_local_dns_server_address).c_str(), &unused_host,
+      &local_dns_server_port));
   gpr_log(GPR_DEBUG,
           "Injecting broken nameserver list. Bad server address:|[::1]:%d|. "
           "Good server address:%s",
           g_fake_non_responsive_dns_server_port,
-          FLAGS_local_dns_server_address.c_str());
+          absl::GetFlag(FLAGS_local_dns_server_address).c_str());
   // Put the non-responsive DNS server at the front of c-ares's nameserver list.
   dns_server_addrs[0].family = AF_INET6;
   ((char*)&dns_server_addrs[0].addr.addr6)[15] = 0x1;
@@ -577,54 +566,58 @@ void RunResolvesRelevantRecordsTest(
   grpc_core::ExecCtx exec_ctx;
   ArgsStruct args;
   ArgsInit(&args);
-  args.expected_addrs = ParseExpectedAddrs(FLAGS_expected_addrs);
-  args.expected_service_config_string = FLAGS_expected_chosen_service_config;
-  args.expected_service_config_error = FLAGS_expected_service_config_error;
-  args.expected_lb_policy = FLAGS_expected_lb_policy;
+  args.expected_addrs = ParseExpectedAddrs(absl::GetFlag(FLAGS_expected_addrs));
+  args.expected_service_config_string =
+      absl::GetFlag(FLAGS_expected_chosen_service_config);
+  args.expected_service_config_error =
+      absl::GetFlag(FLAGS_expected_service_config_error);
+  args.expected_lb_policy = absl::GetFlag(FLAGS_expected_lb_policy);
   // maybe build the address with an authority
   std::string whole_uri;
   gpr_log(GPR_DEBUG,
           "resolver_component_test: --inject_broken_nameserver_list: %s",
-          FLAGS_inject_broken_nameserver_list.c_str());
+          absl::GetFlag(FLAGS_inject_broken_nameserver_list).c_str());
   std::unique_ptr<grpc::testing::FakeNonResponsiveDNSServer>
       fake_non_responsive_dns_server;
-  if (FLAGS_inject_broken_nameserver_list == "True") {
+  if (absl::GetFlag(FLAGS_inject_broken_nameserver_list) == "True") {
     g_fake_non_responsive_dns_server_port = grpc_pick_unused_port_or_die();
-    fake_non_responsive_dns_server.reset(
-        new grpc::testing::FakeNonResponsiveDNSServer(
-            g_fake_non_responsive_dns_server_port));
+    fake_non_responsive_dns_server =
+        absl::make_unique<grpc::testing::FakeNonResponsiveDNSServer>(
+
+            g_fake_non_responsive_dns_server_port);
     grpc_ares_test_only_inject_config = InjectBrokenNameServerList;
-    whole_uri = absl::StrCat("dns:///", FLAGS_target_name);
-  } else if (FLAGS_inject_broken_nameserver_list == "False") {
+    whole_uri = absl::StrCat("dns:///", absl::GetFlag(FLAGS_target_name));
+  } else if (absl::GetFlag(FLAGS_inject_broken_nameserver_list) == "False") {
     gpr_log(GPR_INFO, "Specifying authority in uris to: %s",
-            FLAGS_local_dns_server_address.c_str());
-    whole_uri = absl::StrFormat("dns://%s/%s", FLAGS_local_dns_server_address,
-                                FLAGS_target_name);
+            absl::GetFlag(FLAGS_local_dns_server_address).c_str());
+    whole_uri = absl::StrFormat("dns://%s/%s",
+                                absl::GetFlag(FLAGS_local_dns_server_address),
+                                absl::GetFlag(FLAGS_target_name));
   } else {
     gpr_log(GPR_DEBUG, "Invalid value for --inject_broken_nameserver_list.");
     abort();
   }
   gpr_log(GPR_DEBUG, "resolver_component_test: --enable_srv_queries: %s",
-          FLAGS_enable_srv_queries.c_str());
+          absl::GetFlag(FLAGS_enable_srv_queries).c_str());
   grpc_channel_args* resolver_args = nullptr;
   // By default, SRV queries are disabled, so tests that expect no SRV query
   // should avoid setting any channel arg. Test cases that do rely on the SRV
   // query must explicitly enable SRV though.
-  if (FLAGS_enable_srv_queries == "True") {
+  if (absl::GetFlag(FLAGS_enable_srv_queries) == "True") {
     grpc_arg srv_queries_arg = grpc_channel_arg_integer_create(
         const_cast<char*>(GRPC_ARG_DNS_ENABLE_SRV_QUERIES), true);
     resolver_args =
         grpc_channel_args_copy_and_add(nullptr, &srv_queries_arg, 1);
-  } else if (FLAGS_enable_srv_queries != "False") {
+  } else if (absl::GetFlag(FLAGS_enable_srv_queries) != "False") {
     gpr_log(GPR_DEBUG, "Invalid value for --enable_srv_queries.");
     abort();
   }
   gpr_log(GPR_DEBUG, "resolver_component_test: --enable_txt_queries: %s",
-          FLAGS_enable_txt_queries.c_str());
+          absl::GetFlag(FLAGS_enable_txt_queries).c_str());
   // By default, TXT queries are disabled, so tests that expect no TXT query
   // should avoid setting any channel arg. Test cases that do rely on the TXT
   // query must explicitly enable TXT though.
-  if (FLAGS_enable_txt_queries == "True") {
+  if (absl::GetFlag(FLAGS_enable_txt_queries) == "True") {
     // Unlike SRV queries, there isn't a channel arg specific to TXT records.
     // Rather, we use the resolver-agnostic "service config" resolution option,
     // for which c-ares has its own specific default value, which isn't
@@ -635,7 +628,7 @@ void RunResolvesRelevantRecordsTest(
         grpc_channel_args_copy_and_add(resolver_args, &txt_queries_arg, 1);
     grpc_channel_args_destroy(resolver_args);
     resolver_args = tmp_args;
-  } else if (FLAGS_enable_txt_queries != "False") {
+  } else if (absl::GetFlag(FLAGS_enable_txt_queries) != "False") {
     gpr_log(GPR_DEBUG, "Invalid value for --enable_txt_queries.");
     abort();
   }
@@ -678,7 +671,7 @@ int main(int argc, char** argv) {
   grpc::testing::TestEnvironment env(argc, argv);
   ::testing::InitGoogleTest(&argc, argv);
   grpc::testing::InitTest(&argc, &argv, true);
-  if (FLAGS_target_name == "") {
+  if (absl::GetFlag(FLAGS_target_name).empty()) {
     gpr_log(GPR_ERROR, "Missing target_name param.");
     abort();
   }
index 11f4a36..258a731 100644 (file)
 #include <string.h>
 #include <unistd.h>
 
-#include <gflags/gflags.h>
 #include <string>
 #include <thread>
 #include <vector>
 
+#include "absl/flags/flag.h"
+
 #ifdef __FreeBSD__
 #include <sys/wait.h>
 #endif
 #include "test/cpp/util/subprocess.h"
 #include "test/cpp/util/test_config.h"
 
-DEFINE_bool(
-    running_under_bazel, false,
+ABSL_FLAG(
+    bool, running_under_bazel, false,
     "True if this test is running under bazel. "
     "False indicates that this test is running under run_tests.py. "
     "Child process test binaries are located differently based on this flag. ");
 
-DEFINE_string(test_bin_name, "",
-              "Name, without the preceding path, of the test binary");
+ABSL_FLAG(std::string, test_bin_name, "",
+          "Name, without the preceding path, of the test binary");
 
-DEFINE_string(grpc_test_directory_relative_to_test_srcdir,
-              "/com_github_grpc_grpc",
-              "This flag only applies if runner_under_bazel is true. This "
-              "flag is ignored if runner_under_bazel is false. "
-              "Directory of the <repo-root>/test directory relative to bazel's "
-              "TEST_SRCDIR environment variable");
+ABSL_FLAG(std::string, grpc_test_directory_relative_to_test_srcdir,
+          "/com_github_grpc_grpc",
+          "This flag only applies if runner_under_bazel is true. This "
+          "flag is ignored if runner_under_bazel is false. "
+          "Directory of the <repo-root>/test directory relative to bazel's "
+          "TEST_SRCDIR environment variable");
 
 using grpc::SubProcess;
 
@@ -95,7 +96,6 @@ void RunSigHandlingThread(SubProcess* test_driver, gpr_mu* test_driver_mu,
           "Test timeout reached or received signal. Interrupting test driver "
           "child process.");
   test_driver->Interrupt();
-  return;
 }
 }  // namespace
 
@@ -164,22 +164,25 @@ int main(int argc, char** argv) {
   grpc::testing::TestEnvironment env(argc, argv);
   grpc::testing::InitTest(&argc, &argv, true);
   grpc_init();
-  GPR_ASSERT(FLAGS_test_bin_name != "");
+  GPR_ASSERT(!absl::GetFlag(FLAGS_test_bin_name).empty());
   std::string my_bin = argv[0];
-  if (FLAGS_running_under_bazel) {
-    GPR_ASSERT(FLAGS_grpc_test_directory_relative_to_test_srcdir != "");
+  if (absl::GetFlag(FLAGS_running_under_bazel)) {
+    GPR_ASSERT(!absl::GetFlag(FLAGS_grpc_test_directory_relative_to_test_srcdir)
+                    .empty());
     // Use bazel's TEST_SRCDIR environment variable to locate the "test data"
     // binaries.
     char* test_srcdir = gpr_getenv("TEST_SRCDIR");
     std::string const bin_dir =
-        test_srcdir + FLAGS_grpc_test_directory_relative_to_test_srcdir +
+        test_srcdir +
+        absl::GetFlag(FLAGS_grpc_test_directory_relative_to_test_srcdir) +
         std::string("/test/cpp/naming");
     // Invoke bazel's executeable links to the .sh and .py scripts (don't use
     // the .sh and .py suffixes) to make
     // sure that we're using bazel's test environment.
     grpc::testing::InvokeResolverComponentTestsRunner(
         bin_dir + "/resolver_component_tests_runner",
-        bin_dir + "/" + FLAGS_test_bin_name, bin_dir + "/utils/dns_server",
+        bin_dir + "/" + absl::GetFlag(FLAGS_test_bin_name),
+        bin_dir + "/utils/dns_server",
         bin_dir + "/resolver_test_record_groups.yaml",
         bin_dir + "/utils/dns_resolver", bin_dir + "/utils/tcp_connect");
     gpr_free(test_srcdir);
@@ -190,7 +193,7 @@ int main(int argc, char** argv) {
     // Invoke the .sh and .py scripts directly where they are in source code.
     grpc::testing::InvokeResolverComponentTestsRunner(
         "test/cpp/naming/resolver_component_tests_runner.py",
-        bin_dir + "/" + FLAGS_test_bin_name,
+        bin_dir + "/" + absl::GetFlag(FLAGS_test_bin_name),
         "test/cpp/naming/utils/dns_server.py",
         "test/cpp/naming/resolver_test_record_groups.yaml",
         "test/cpp/naming/utils/dns_resolver.py",
index e262078..d3273ee 100644 (file)
@@ -129,7 +129,7 @@ class InProcessCHTTP2 : public EndpointPairFixture {
   InProcessCHTTP2(Service* service, grpc_passthru_endpoint_stats* stats)
       : EndpointPairFixture(service, MakeEndpoints(stats)), stats_(stats) {}
 
-  virtual ~InProcessCHTTP2() {
+  ~InProcessCHTTP2() override {
     if (stats_ != nullptr) {
       grpc_passthru_endpoint_stats_destroy(stats_);
     }
index ff4ee98..6fdcfd0 100644 (file)
@@ -46,9 +46,6 @@ grpc_cc_library(
         "qps_worker.h",
         "server.h",
     ],
-    external_deps = [
-        "gflags",
-    ],
     deps = [
         ":histogram",
         ":interarrival",
@@ -100,7 +97,7 @@ grpc_cc_library(
         "benchmark_config.h",
     ],
     external_deps = [
-        "gflags",
+        "absl/flags:flag",
     ],
     deps = [
         ":driver_impl",
@@ -116,14 +113,17 @@ grpc_cc_library(
         "histogram.h",
         "stats.h",
     ],
-    deps = ["//test/core/util:grpc_test_util"],
+    deps = [
+        "//src/proto/grpc/testing:stats_proto",
+        "//test/core/util:grpc_test_util",
+    ],
 )
 
 grpc_cc_binary(
     name = "qps_json_driver",
     srcs = ["qps_json_driver.cc"],
     external_deps = [
-        "gflags",
+        "absl/flags:flag",
     ],
     deps = [
         ":benchmark_config",
@@ -203,6 +203,9 @@ grpc_cc_library(
 grpc_cc_binary(
     name = "qps_worker",
     srcs = ["worker.cc"],
+    external_deps = [
+        "absl/flags:flag",
+    ],
     deps = [
         ":qps_worker_impl",
         "//:grpc++",
index 5fd0f00..4ec07e9 100644 (file)
  */
 
 #include "test/cpp/qps/benchmark_config.h"
-#include <gflags/gflags.h>
+
 #include <grpc/support/log.h>
 #include <grpcpp/create_channel.h>
 #include <grpcpp/security/credentials.h>
 
+#include "absl/flags/flag.h"
 #include "test/cpp/util/test_credentials_provider.h"
 
-DEFINE_bool(enable_log_reporter, true,
-            "Enable reporting of benchmark results through GprLog");
+ABSL_FLAG(bool, enable_log_reporter, true,
+          "Enable reporting of benchmark results through GprLog");
 
-DEFINE_string(scenario_result_file, "",
-              "Write JSON benchmark report to the file specified.");
+ABSL_FLAG(std::string, scenario_result_file, "",
+          "Write JSON benchmark report to the file specified.");
 
-DEFINE_string(hashed_id, "", "Hash of the user id");
+ABSL_FLAG(std::string, hashed_id, "", "Hash of the user id");
 
-DEFINE_string(test_name, "", "Name of the test being executed");
+ABSL_FLAG(std::string, test_name, "", "Name of the test being executed");
 
-DEFINE_string(sys_info, "", "System information");
+ABSL_FLAG(std::string, sys_info, "", "System information");
 
-DEFINE_string(server_address, "localhost:50052",
-              "Address of the performance database server");
+ABSL_FLAG(std::string, server_address, "localhost:50052",
+          "Address of the performance database server");
 
-DEFINE_string(tag, "", "Optional tag for the test");
+ABSL_FLAG(std::string, tag, "", "Optional tag for the test");
 
-DEFINE_string(rpc_reporter_server_address, "",
-              "Server address for rpc reporter to send results to");
+ABSL_FLAG(std::string, rpc_reporter_server_address, "",
+          "Server address for rpc reporter to send results to");
 
-DEFINE_bool(enable_rpc_reporter, false, "Enable use of RPC reporter");
+ABSL_FLAG(bool, enable_rpc_reporter, false, "Enable use of RPC reporter");
 
-DEFINE_string(
-    rpc_reporter_credential_type, grpc::testing::kInsecureCredentialsType,
+ABSL_FLAG(
+    std::string, rpc_reporter_credential_type,
+    grpc::testing::kInsecureCredentialsType,
     "Credential type for communication to the QPS benchmark report server");
 
-// In some distros, gflags is in the namespace google, and in some others,
-// in gflags. This hack is enabling us to find both.
-namespace google {}
-namespace gflags {}
-using namespace google;
-using namespace gflags;
-
 namespace grpc {
 namespace testing {
 
 static std::shared_ptr<Reporter> InitBenchmarkReporters() {
   auto* composite_reporter = new CompositeReporter;
-  if (FLAGS_enable_log_reporter) {
+  if (absl::GetFlag(FLAGS_enable_log_reporter)) {
     composite_reporter->add(
         std::unique_ptr<Reporter>(new GprLogReporter("LogReporter")));
   }
-  if (FLAGS_scenario_result_file != "") {
-    composite_reporter->add(std::unique_ptr<Reporter>(
-        new JsonReporter("JsonReporter", FLAGS_scenario_result_file)));
+  if (!absl::GetFlag(FLAGS_scenario_result_file).empty()) {
+    composite_reporter->add(std::unique_ptr<Reporter>(new JsonReporter(
+        "JsonReporter", absl::GetFlag(FLAGS_scenario_result_file))));
   }
-  if (FLAGS_enable_rpc_reporter) {
+  if (absl::GetFlag(FLAGS_enable_rpc_reporter)) {
     ChannelArguments channel_args;
     std::shared_ptr<ChannelCredentials> channel_creds =
         testing::GetCredentialsProvider()->GetChannelCredentials(
-            FLAGS_rpc_reporter_credential_type, &channel_args);
-    GPR_ASSERT(!FLAGS_rpc_reporter_server_address.empty());
+            absl::GetFlag(FLAGS_rpc_reporter_credential_type), &channel_args);
+    GPR_ASSERT(!absl::GetFlag(FLAGS_rpc_reporter_server_address).empty());
     composite_reporter->add(std::unique_ptr<Reporter>(new RpcReporter(
-        "RpcReporter", grpc::CreateChannel(FLAGS_rpc_reporter_server_address,
-                                           channel_creds))));
+        "RpcReporter",
+        grpc::CreateChannel(absl::GetFlag(FLAGS_rpc_reporter_server_address),
+                            channel_creds))));
   }
 
   return std::shared_ptr<Reporter>(composite_reporter);
index ab6d72a..e5a8ef2 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <condition_variable>
 #include <mutex>
+#include <thread>
 #include <unordered_map>
 #include <vector>
 
@@ -33,6 +34,9 @@
 #include <grpcpp/support/channel_arguments.h>
 #include <grpcpp/support/slice.h>
 
+#include "absl/memory/memory.h"
+#include "absl/strings/match.h"
+
 #include "src/proto/grpc/testing/benchmark_service.grpc.pb.h"
 #include "src/proto/grpc/testing/payloads.pb.h"
 
@@ -359,8 +363,8 @@ class Client {
         // Closed-loop doesn't use random dist at all
         break;
       case LoadParams::kPoisson:
-        random_dist.reset(
-            new ExpDist(load.poisson().offered_load() / num_threads));
+        random_dist = absl::make_unique<ExpDist>(load.poisson().offered_load() /
+                                                 num_threads);
         break;
       default:
         GPR_ASSERT(false);
@@ -438,7 +442,7 @@ class ClientImpl : public Client {
     ClientRequestCreator<RequestType> create_req(&request_,
                                                  config.payload_config());
   }
-  virtual ~ClientImpl() {}
+  ~ClientImpl() override {}
   const RequestType* request() { return &request_; }
 
   void WaitForChannelsToConnect() {
@@ -520,7 +524,7 @@ class ClientImpl : public Client {
       }
 
       std::string inproc_pfx(INPROC_NAME_PREFIX);
-      if (target.find(inproc_pfx) != 0) {
+      if (!absl::StartsWith(target, inproc_pfx)) {
         channel_ = CreateTestChannel(
             target, type, config.security_params().server_host_override(),
             !config.security_params().use_test_ca(),
index c3d9ae6..28f73f7 100644 (file)
@@ -35,6 +35,8 @@
 #include <grpcpp/client_context.h>
 #include <grpcpp/generic/generic_stub.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/core/lib/surface/completion_queue.h"
 #include "src/proto/grpc/testing/benchmark_service.grpc.pb.h"
 #include "test/cpp/qps/client.h"
@@ -191,7 +193,7 @@ class AsyncClient : public ClientImpl<StubType, RequestType> {
       t = (t + 1) % cli_cqs_.size();
     }
   }
-  virtual ~AsyncClient() {
+  ~AsyncClient() override {
     for (auto cq = cli_cqs_.begin(); cq != cli_cqs_.end(); cq++) {
       void* got_tag;
       bool ok;
@@ -227,7 +229,7 @@ class AsyncClient : public ClientImpl<StubType, RequestType> {
     }
     return num_threads;
   }
-  void DestroyMultithreading() override final {
+  void DestroyMultithreading() final {
     for (auto ss = shutdown_state_.begin(); ss != shutdown_state_.end(); ++ss) {
       std::lock_guard<std::mutex> lock((*ss)->mutex);
       (*ss)->shutdown = true;
@@ -254,7 +256,7 @@ class AsyncClient : public ClientImpl<StubType, RequestType> {
     return ctx;
   }
 
-  void ThreadFunc(size_t thread_idx, Client::Thread* t) override final {
+  void ThreadFunc(size_t thread_idx, Client::Thread* t) final {
     void* got_tag;
     bool ok;
 
@@ -802,7 +804,7 @@ class ClientRpcContextGenericStreamingImpl : public ClientRpcContext {
           break;  // loop around, don't return
         case State::WAIT:
           next_state_ = State::READY_TO_WRITE;
-          alarm_.reset(new Alarm);
+          alarm_ = absl::make_unique<Alarm>();
           alarm_->Set(cq_, next_issue_(), ClientRpcContext::tag(this));
           return true;
         case State::READY_TO_WRITE:
@@ -899,7 +901,7 @@ class ClientRpcContextGenericStreamingImpl : public ClientRpcContext {
 
 static std::unique_ptr<grpc::GenericStub> GenericStubCreator(
     const std::shared_ptr<Channel>& ch) {
-  return std::unique_ptr<grpc::GenericStub>(new grpc::GenericStub(ch));
+  return absl::make_unique<grpc::GenericStub>(ch);
 }
 
 class GenericAsyncStreamingClient final
index 047f235..bc8fdb5 100644 (file)
@@ -32,6 +32,8 @@
 #include <grpcpp/channel.h>
 #include <grpcpp/client_context.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/proto/grpc/testing/benchmark_service.grpc.pb.h"
 #include "test/cpp/qps/client.h"
 #include "test/cpp/qps/usage_timer.h"
@@ -75,7 +77,7 @@ class CallbackClient
         config.client_channels() * config.outstanding_rpcs_per_channel();
   }
 
-  virtual ~CallbackClient() {}
+  ~CallbackClient() override {}
 
   /**
    * The main thread of the benchmark will be waiting on DestroyMultithreading.
@@ -151,7 +153,7 @@ class CallbackUnaryClient final : public CallbackClient {
     }
     StartThreads(num_threads_);
   }
-  ~CallbackUnaryClient() {}
+  ~CallbackUnaryClient() override {}
 
  protected:
   bool ThreadFuncImpl(Thread* t, size_t thread_idx) override {
@@ -162,7 +164,7 @@ class CallbackUnaryClient final : public CallbackClient {
     return true;
   }
 
-  void InitThreadFuncImpl(size_t /*thread_idx*/) override { return; }
+  void InitThreadFuncImpl(size_t /*thread_idx*/) override {}
 
  private:
   void ScheduleRpc(Thread* t, size_t vector_idx) {
@@ -171,7 +173,7 @@ class CallbackUnaryClient final : public CallbackClient {
       // Start an alarm callback to run the internal callback after
       // next_issue_time
       if (ctx_[vector_idx]->alarm_ == nullptr) {
-        ctx_[vector_idx]->alarm_.reset(new Alarm);
+        ctx_[vector_idx]->alarm_ = absl::make_unique<Alarm>();
       }
       ctx_[vector_idx]->alarm_->experimental().Set(
           next_issue_time, [this, t, vector_idx](bool /*ok*/) {
@@ -201,8 +203,8 @@ class CallbackUnaryClient final : public CallbackClient {
             NotifyMainThreadOfThreadCompletion();
           } else {
             // Reallocate ctx for next RPC
-            ctx_[vector_idx].reset(
-                new CallbackClientRpcContext(ctx_[vector_idx]->stub_));
+            ctx_[vector_idx] = absl::make_unique<CallbackClientRpcContext>(
+                ctx_[vector_idx]->stub_);
             // Schedule a new RPC
             ScheduleRpc(t, vector_idx);
           }
@@ -223,7 +225,7 @@ class CallbackStreamingClient : public CallbackClient {
     }
     StartThreads(num_threads_);
   }
-  ~CallbackStreamingClient() {}
+  ~CallbackStreamingClient() override {}
 
   void AddHistogramEntry(double start, bool ok, Thread* thread_ptr) {
     // Update Histogram with data from the callback run
@@ -244,7 +246,7 @@ class CallbackStreamingPingPongClient : public CallbackStreamingClient {
  public:
   CallbackStreamingPingPongClient(const ClientConfig& config)
       : CallbackStreamingClient(config) {}
-  ~CallbackStreamingPingPongClient() {}
+  ~CallbackStreamingPingPongClient() override {}
 };
 
 class CallbackStreamingPingPongReactor final
@@ -308,7 +310,7 @@ class CallbackStreamingPingPongReactor final
       client_->NotifyMainThreadOfThreadCompletion();
       return;
     }
-    ctx_.reset(new CallbackClientRpcContext(ctx_->stub_));
+    ctx_ = absl::make_unique<CallbackClientRpcContext>(ctx_->stub_);
     ScheduleRpc();
   }
 
@@ -318,7 +320,7 @@ class CallbackStreamingPingPongReactor final
       // Start an alarm callback to run the internal callback after
       // next_issue_time
       if (ctx_->alarm_ == nullptr) {
-        ctx_->alarm_.reset(new Alarm);
+        ctx_->alarm_ = absl::make_unique<Alarm>();
       }
       ctx_->alarm_->experimental().Set(next_issue_time,
                                        [this](bool /*ok*/) { StartNewRpc(); });
@@ -342,11 +344,12 @@ class CallbackStreamingPingPongClientImpl final
  public:
   CallbackStreamingPingPongClientImpl(const ClientConfig& config)
       : CallbackStreamingPingPongClient(config) {
-    for (size_t i = 0; i < total_outstanding_rpcs_; i++)
+    for (size_t i = 0; i < total_outstanding_rpcs_; i++) {
       reactor_.emplace_back(
           new CallbackStreamingPingPongReactor(this, std::move(ctx_[i])));
+    }
   }
-  ~CallbackStreamingPingPongClientImpl() {}
+  ~CallbackStreamingPingPongClientImpl() override {}
 
   bool ThreadFuncImpl(Client::Thread* t, size_t thread_idx) override {
     for (size_t vector_idx = thread_idx; vector_idx < total_outstanding_rpcs_;
index a0ec361..f042a03 100644 (file)
@@ -59,7 +59,7 @@ class SynchronousClient
     SetupLoadTest(config, num_threads_);
   }
 
-  virtual ~SynchronousClient() {}
+  ~SynchronousClient() override {}
 
   virtual bool InitThreadFuncImpl(size_t thread_idx) = 0;
   virtual bool ThreadFuncImpl(HistogramEntry* entry, size_t thread_idx) = 0;
@@ -115,7 +115,7 @@ class SynchronousUnaryClient final : public SynchronousClient {
       : SynchronousClient(config) {
     StartThreads(num_threads_);
   }
-  ~SynchronousUnaryClient() {}
+  ~SynchronousUnaryClient() override {}
 
   bool InitThreadFuncImpl(size_t /*thread_idx*/) override { return true; }
 
@@ -137,7 +137,7 @@ class SynchronousUnaryClient final : public SynchronousClient {
   }
 
  private:
-  void DestroyMultithreading() override final { EndThreads(); }
+  void DestroyMultithreading() final { EndThreads(); }
 };
 
 template <class StreamType>
@@ -153,7 +153,7 @@ class SynchronousStreamingClient : public SynchronousClient {
         messages_issued_(num_threads_) {
     StartThreads(num_threads_);
   }
-  virtual ~SynchronousStreamingClient() {
+  ~SynchronousStreamingClient() override {
     CleanupAllStreams([this](size_t thread_idx) {
       // Don't log any kind of error since we may have canceled this
       stream_[thread_idx]->Finish().IgnoreError();
@@ -208,7 +208,7 @@ class SynchronousStreamingClient : public SynchronousClient {
   }
 
  private:
-  void DestroyMultithreading() override final {
+  void DestroyMultithreading() final {
     CleanupAllStreams(
         [this](size_t thread_idx) { context_[thread_idx].TryCancel(); });
     EndThreads();
@@ -221,7 +221,7 @@ class SynchronousStreamingPingPongClient final
  public:
   SynchronousStreamingPingPongClient(const ClientConfig& config)
       : SynchronousStreamingClient(config) {}
-  ~SynchronousStreamingPingPongClient() {
+  ~SynchronousStreamingPingPongClient() override {
     CleanupAllStreams(
         [this](size_t thread_idx) { stream_[thread_idx]->WritesDone(); });
   }
@@ -278,7 +278,7 @@ class SynchronousStreamingFromClientClient final
  public:
   SynchronousStreamingFromClientClient(const ClientConfig& config)
       : SynchronousStreamingClient(config), last_issue_(num_threads_) {}
-  ~SynchronousStreamingFromClientClient() {
+  ~SynchronousStreamingFromClientClient() override {
     CleanupAllStreams(
         [this](size_t thread_idx) { stream_[thread_idx]->WritesDone(); });
   }
@@ -331,7 +331,7 @@ class SynchronousStreamingFromServerClient final
  public:
   SynchronousStreamingFromServerClient(const ClientConfig& config)
       : SynchronousStreamingClient(config), last_recv_(num_threads_) {}
-  ~SynchronousStreamingFromServerClient() {}
+  ~SynchronousStreamingFromServerClient() override {}
 
  private:
   std::vector<double> last_recv_;
@@ -377,7 +377,7 @@ class SynchronousStreamingBothWaysClient final
  public:
   SynchronousStreamingBothWaysClient(const ClientConfig& config)
       : SynchronousStreamingClient(config) {}
-  ~SynchronousStreamingBothWaysClient() {
+  ~SynchronousStreamingBothWaysClient() override {
     CleanupAllStreams(
         [this](size_t thread_idx) { stream_[thread_idx]->WritesDone(); });
   }
index 3fce130..757ad7c 100644 (file)
@@ -45,7 +45,6 @@
 
 using std::deque;
 using std::list;
-using std::thread;
 using std::unique_ptr;
 using std::vector;
 
@@ -77,7 +76,7 @@ static deque<string> get_workers(const string& env_name) {
       }
     }
   }
-  if (out.size() == 0) {
+  if (out.empty()) {
     gpr_log(GPR_ERROR,
             "Environment variable \"%s\" does not contain a list of QPS "
             "workers to use. Set it to a comma-separated list of "
@@ -410,7 +409,7 @@ std::unique_ptr<ScenarioResult> RunScenario(
       workers.push_back(addr);
     }
   }
-  GPR_ASSERT(workers.size() != 0);
+  GPR_ASSERT(!workers.empty());
 
   // if num_clients is set to <=0, do dynamic sizing: all workers
   // except for servers are clients
@@ -463,11 +462,7 @@ std::unique_ptr<ScenarioResult> RunScenario(
       gpr_log(GPR_ERROR, "Server %zu did not yield initial status", i);
       GPR_ASSERT(false);
     }
-    if (qps_server_target_override.length() > 0) {
-      // overriding the qps server target only works if there is 1 server
-      GPR_ASSERT(num_servers == 1);
-      client_config.add_server_targets(qps_server_target_override);
-    } else if (run_inproc) {
+    if (run_inproc) {
       std::string cli_target(INPROC_NAME_PREFIX);
       cli_target += std::to_string(i);
       client_config.add_server_targets(cli_target);
@@ -478,7 +473,12 @@ std::unique_ptr<ScenarioResult> RunScenario(
       client_config.add_server_targets(cli_target.c_str());
     }
   }
-
+  if (qps_server_target_override.length() > 0) {
+    // overriding the qps server target only makes since if there is <= 1
+    // servers
+    GPR_ASSERT(num_servers <= 1);
+    client_config.add_server_targets(qps_server_target_override);
+  }
   client_config.set_median_latency_collection_interval_millis(
       median_latency_collection_interval_millis);
 
@@ -655,7 +655,7 @@ bool RunQuit(
   // Get client, server lists
   bool result = true;
   auto workers = get_workers("QPS_WORKERS");
-  if (workers.size() == 0) {
+  if (workers.empty()) {
     return false;
   }
 
index 6275128..55c1984 100644 (file)
@@ -39,7 +39,9 @@ class Histogram {
     impl_ = grpc_histogram_create(default_resolution(), default_max_possible());
   }
 
-  Histogram(Histogram&& other) : impl_(other.impl_) { other.impl_ = nullptr; }
+  Histogram(Histogram&& other) noexcept : impl_(other.impl_) {
+    other.impl_ = nullptr;
+  }
 
   void Merge(const Histogram& h) { grpc_histogram_merge(impl_, h.impl_); }
   void Add(double value) { grpc_histogram_add(impl_, value); }
index 61a6d75..8a3a2f0 100644 (file)
@@ -91,8 +91,9 @@ class InterarrivalTimer {
 
   int64_t next(int thread_num) {
     auto ret = *(thread_posns_[thread_num]++);
-    if (thread_posns_[thread_num] == random_table_.end())
+    if (thread_posns_[thread_num] == random_table_.end()) {
       thread_posns_[thread_num] = random_table_.begin();
+    }
     return ret;
   }
 
index 3f461ec..15a6f34 100644 (file)
@@ -29,19 +29,25 @@ load("//bazel:grpc_build_system.bzl", "grpc_cc_test")
 load("//test/cpp/qps:qps_json_driver_scenarios.bzl", "QPS_JSON_DRIVER_SCENARIOS")
 load("//test/cpp/qps:json_run_localhost_scenarios.bzl", "JSON_RUN_LOCALHOST_SCENARIOS")
 
+def add_suffix(name):
+    # NOTE(https://github.com/grpc/grpc/issues/24178): Add the suffix to the name
+    # to avoid having the target name that 89 or 90 long.
+    m = len(name) - (89 - len("//test/cpp/qps:"))
+    if m == 0 or m == 1:
+        return name + "_" * (2 - m)
+    else:
+        return name
+
 def qps_json_driver_batch():
     for scenario in QPS_JSON_DRIVER_SCENARIOS:
         grpc_cc_test(
-            name = "qps_json_driver_test_%s" % scenario,
+            name = add_suffix("qps_json_driver_test_%s" % scenario),
             srcs = ["qps_json_driver.cc"],
             args = [
                 "--run_inproc",
                 "--scenarios_json",
                 QPS_JSON_DRIVER_SCENARIOS[scenario],
             ],
-            external_deps = [
-                "gflags",
-            ],
             deps = [
                 ":benchmark_config",
                 ":driver_impl",
@@ -58,7 +64,7 @@ def qps_json_driver_batch():
 def json_run_localhost_batch():
     for scenario in JSON_RUN_LOCALHOST_SCENARIOS:
         grpc_cc_test(
-            name = "json_run_localhost_%s" % scenario,
+            name = add_suffix("json_run_localhost_%s" % scenario),
             srcs = ["json_run_localhost.cc"],
             args = [
                 "--scenarios_json",
index fad7fdd..6dcb73d 100644 (file)
  *
  */
 
+#include <grpc/support/log.h>
+#include <grpcpp/impl/codegen/config_protobuf.h>
+
 #include <fstream>
 #include <iostream>
 #include <memory>
 #include <set>
 
-#include <grpcpp/impl/codegen/config_protobuf.h>
-
-#include <gflags/gflags.h>
-#include <grpc/support/log.h>
-
+#include "absl/flags/flag.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/qps/benchmark_config.h"
 #include "test/cpp/qps/driver.h"
 #include "test/cpp/util/test_config.h"
 #include "test/cpp/util/test_credentials_provider.h"
 
-DEFINE_string(scenarios_file, "",
-              "JSON file containing an array of Scenario objects");
-DEFINE_string(scenarios_json, "",
-              "JSON string containing an array of Scenario objects");
-DEFINE_bool(quit, false, "Quit the workers");
-DEFINE_string(search_param, "",
-              "The parameter, whose value is to be searched for to achieve "
-              "targeted cpu load. For now, we have 'offered_load'. Later, "
-              "'num_channels', 'num_outstanding_requests', etc. shall be "
-              "added.");
-DEFINE_double(
-    initial_search_value, 0.0,
+ABSL_FLAG(std::string, scenarios_file, "",
+          "JSON file containing an array of Scenario objects");
+ABSL_FLAG(std::string, scenarios_json, "",
+          "JSON string containing an array of Scenario objects");
+ABSL_FLAG(bool, quit, false, "Quit the workers");
+ABSL_FLAG(std::string, search_param, "",
+          "The parameter, whose value is to be searched for to achieve "
+          "targeted cpu load. For now, we have 'offered_load'. Later, "
+          "'num_channels', 'num_outstanding_requests', etc. shall be "
+          "added.");
+ABSL_FLAG(
+    double, initial_search_value, 0.0,
     "initial parameter value to start the search with (i.e. lower bound)");
-DEFINE_double(targeted_cpu_load, 70.0,
-              "Targeted cpu load (unit: %, range [0,100])");
-DEFINE_double(stride, 1,
-              "Defines each stride of the search. The larger the stride is, "
-              "the coarser the result will be, but will also be faster.");
-DEFINE_double(error_tolerance, 0.01,
-              "Defines threshold for stopping the search. When current search "
-              "range is narrower than the error_tolerance computed range, we "
-              "stop the search.");
-
-DEFINE_string(qps_server_target_override, "",
-              "Override QPS server target to configure in client configs."
-              "Only applicable if there is a single benchmark server.");
-
-DEFINE_string(json_file_out, "", "File to write the JSON output to.");
-
-DEFINE_string(credential_type, grpc::testing::kInsecureCredentialsType,
-              "Credential type for communication with workers");
-DEFINE_string(
-    per_worker_credential_types, "",
+ABSL_FLAG(double, targeted_cpu_load, 70.0,
+          "Targeted cpu load (unit: %, range [0,100])");
+ABSL_FLAG(double, stride, 1,
+          "Defines each stride of the search. The larger the stride is, "
+          "the coarser the result will be, but will also be faster.");
+ABSL_FLAG(double, error_tolerance, 0.01,
+          "Defines threshold for stopping the search. When current search "
+          "range is narrower than the error_tolerance computed range, we "
+          "stop the search.");
+
+ABSL_FLAG(std::string, qps_server_target_override, "",
+          "Override QPS server target to configure in client configs."
+          "Only applicable if there is a single benchmark server.");
+
+ABSL_FLAG(std::string, json_file_out, "", "File to write the JSON output to.");
+
+ABSL_FLAG(std::string, credential_type, grpc::testing::kInsecureCredentialsType,
+          "Credential type for communication with workers");
+ABSL_FLAG(
+    std::string, per_worker_credential_types, "",
     "A map of QPS worker addresses to credential types. When creating a "
     "channel to a QPS worker's driver port, the qps_json_driver first checks "
     "if the 'name:port' string is in the map, and it uses the corresponding "
@@ -76,9 +75,9 @@ DEFINE_string(
     "the credentials specified in --credential_type. The value of this flag "
     "is a semicolon-separated list of map entries, where each map entry is "
     "a comma-separated pair.");
-DEFINE_bool(run_inproc, false, "Perform an in-process transport test");
-DEFINE_int32(
-    median_latency_collection_interval_millis, 0,
+ABSL_FLAG(bool, run_inproc, false, "Perform an in-process transport test");
+ABSL_FLAG(
+    int32_t, median_latency_collection_interval_millis, 0,
     "Specifies the period between gathering latency medians in "
     "milliseconds. The medians will be logged out on the client at the "
     "end of the benchmark run. If 0, this periodic collection is disabled.");
@@ -90,7 +89,7 @@ static std::map<std::string, std::string>
 ConstructPerWorkerCredentialTypesMap() {
   // Parse a list of the form: "addr1,cred_type1;addr2,cred_type2;..." into
   // a map.
-  std::string remaining = FLAGS_per_worker_credential_types;
+  std::string remaining = absl::GetFlag(FLAGS_per_worker_credential_types);
   std::map<std::string, std::string> out;
   while (!remaining.empty()) {
     size_t next_semicolon = remaining.find(';');
@@ -125,14 +124,16 @@ static std::unique_ptr<ScenarioResult> RunAndReport(
     const std::map<std::string, std::string>& per_worker_credential_types,
     bool* success) {
   std::cerr << "RUNNING SCENARIO: " << scenario.name() << "\n";
-  auto result =
-      RunScenario(scenario.client_config(), scenario.num_clients(),
-                  scenario.server_config(), scenario.num_servers(),
-                  scenario.warmup_seconds(), scenario.benchmark_seconds(),
-                  !FLAGS_run_inproc ? scenario.spawn_local_worker_count() : -2,
-                  FLAGS_qps_server_target_override, FLAGS_credential_type,
-                  per_worker_credential_types, FLAGS_run_inproc,
-                  FLAGS_median_latency_collection_interval_millis);
+  auto result = RunScenario(
+      scenario.client_config(), scenario.num_clients(),
+      scenario.server_config(), scenario.num_servers(),
+      scenario.warmup_seconds(), scenario.benchmark_seconds(),
+      !absl::GetFlag(FLAGS_run_inproc) ? scenario.spawn_local_worker_count()
+                                       : -2,
+      absl::GetFlag(FLAGS_qps_server_target_override),
+      absl::GetFlag(FLAGS_credential_type), per_worker_credential_types,
+      absl::GetFlag(FLAGS_run_inproc),
+      absl::GetFlag(FLAGS_median_latency_collection_interval_millis));
 
   // Amend the result with scenario config. Eventually we should adjust
   // RunScenario contract so we don't need to touch the result here.
@@ -153,9 +154,9 @@ static std::unique_ptr<ScenarioResult> RunAndReport(
     *success = result->server_success(i);
   }
 
-  if (FLAGS_json_file_out != "") {
+  if (!absl::GetFlag(FLAGS_json_file_out).empty()) {
     std::ofstream json_outfile;
-    json_outfile.open(FLAGS_json_file_out);
+    json_outfile.open(absl::GetFlag(FLAGS_json_file_out));
     json_outfile << "{\"qps\": " << result->summary().qps() << "}\n";
     json_outfile.close();
   }
@@ -179,7 +180,7 @@ static double BinarySearch(
     Scenario* scenario, double targeted_cpu_load, double low, double high,
     const std::map<std::string, std::string>& per_worker_credential_types,
     bool* success) {
-  while (low <= high * (1 - FLAGS_error_tolerance)) {
+  while (low <= high * (1 - absl::GetFlag(FLAGS_error_tolerance))) {
     double mid = low + (high - low) / 2;
     double current_cpu_load =
         GetCpuLoad(scenario, mid, per_worker_credential_types, success);
@@ -189,9 +190,9 @@ static double BinarySearch(
       break;
     }
     if (targeted_cpu_load <= current_cpu_load) {
-      high = mid - FLAGS_stride;
+      high = mid - absl::GetFlag(FLAGS_stride);
     } else {
-      low = mid + FLAGS_stride;
+      low = mid + absl::GetFlag(FLAGS_stride);
     }
   }
 
@@ -229,10 +230,11 @@ static double SearchOfferedLoad(
 static bool QpsDriver() {
   std::string json;
 
-  bool scfile = (FLAGS_scenarios_file != "");
-  bool scjson = (FLAGS_scenarios_json != "");
-  if ((!scfile && !scjson && !FLAGS_quit) ||
-      (scfile && (scjson || FLAGS_quit)) || (scjson && FLAGS_quit)) {
+  bool scfile = (!absl::GetFlag(FLAGS_scenarios_file).empty());
+  bool scjson = (!absl::GetFlag(FLAGS_scenarios_json).empty());
+  if ((!scfile && !scjson && !absl::GetFlag(FLAGS_quit)) ||
+      (scfile && (scjson || absl::GetFlag(FLAGS_quit))) ||
+      (scjson && absl::GetFlag(FLAGS_quit))) {
     gpr_log(GPR_ERROR,
             "Exactly one of --scenarios_file, --scenarios_json, "
             "or --quit must be set");
@@ -242,7 +244,7 @@ static bool QpsDriver() {
   auto per_worker_credential_types = ConstructPerWorkerCredentialTypesMap();
   if (scfile) {
     // Read the json data from disk
-    FILE* json_file = fopen(FLAGS_scenarios_file.c_str(), "r");
+    FILE* json_file = fopen(absl::GetFlag(FLAGS_scenarios_file).c_str(), "r");
     GPR_ASSERT(json_file != nullptr);
     fseek(json_file, 0, SEEK_END);
     long len = ftell(json_file);
@@ -253,9 +255,10 @@ static bool QpsDriver() {
     json = std::string(data, data + len);
     delete[] data;
   } else if (scjson) {
-    json = FLAGS_scenarios_json.c_str();
-  } else if (FLAGS_quit) {
-    return RunQuit(FLAGS_credential_type, per_worker_credential_types);
+    json = absl::GetFlag(FLAGS_scenarios_json).c_str();
+  } else if (absl::GetFlag(FLAGS_quit)) {
+    return RunQuit(absl::GetFlag(FLAGS_credential_type),
+                   per_worker_credential_types);
   }
 
   // Parse into an array of scenarios
@@ -267,15 +270,16 @@ static bool QpsDriver() {
   GPR_ASSERT(scenarios.scenarios_size() > 0);
 
   for (int i = 0; i < scenarios.scenarios_size(); i++) {
-    if (FLAGS_search_param == "") {
+    if (absl::GetFlag(FLAGS_search_param).empty()) {
       const Scenario& scenario = scenarios.scenarios(i);
       RunAndReport(scenario, per_worker_credential_types, &success);
     } else {
-      if (FLAGS_search_param == "offered_load") {
+      if (absl::GetFlag(FLAGS_search_param) == "offered_load") {
         Scenario* scenario = scenarios.mutable_scenarios(i);
-        double targeted_offered_load = SearchOfferedLoad(
-            FLAGS_initial_search_value, FLAGS_targeted_cpu_load, scenario,
-            per_worker_credential_types, &success);
+        double targeted_offered_load =
+            SearchOfferedLoad(absl::GetFlag(FLAGS_initial_search_value),
+                              absl::GetFlag(FLAGS_targeted_cpu_load), scenario,
+                              per_worker_credential_types, &success);
         gpr_log(GPR_INFO, "targeted_offered_load %f", targeted_offered_load);
         GetCpuLoad(scenario, targeted_offered_load, per_worker_credential_types,
                    &success);
index 5fbc682..87cb452 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "qps_server_builder.h"
 
+#include "absl/memory/memory.h"
+
 using grpc::ServerBuilder;
 
 namespace grpc {
@@ -25,7 +27,7 @@ namespace testing {
 
 namespace {
 std::unique_ptr<ServerBuilder> DefaultCreateQpsServerBuilder() {
-  return std::unique_ptr<ServerBuilder>(new ServerBuilder());
+  return absl::make_unique<ServerBuilder>();
 }
 
 std::function<std::unique_ptr<ServerBuilder>()> g_create_qps_server_builder =
index 83c2afd..54a1b20 100644 (file)
@@ -34,6 +34,8 @@
 #include <grpcpp/server.h>
 #include <grpcpp/server_builder.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/core/lib/gprpp/host_port.h"
 #include "src/proto/grpc/testing/worker_service.grpc.pb.h"
 #include "test/core/util/grpc_profiler.h"
@@ -232,7 +234,7 @@ class WorkerServiceImpl final : public WorkerService::Service {
     if (!args.has_setup()) {
       return Status(StatusCode::INVALID_ARGUMENT, "Bad server creation args");
     }
-    if (server_port_ > 0) {
+    if (server_port_ > 0 && args.setup().port() == 0) {
       args.mutable_setup()->set_port(server_port_);
     }
     gpr_log(GPR_INFO, "RunServerBody: about to create server");
@@ -276,7 +278,7 @@ class WorkerServiceImpl final : public WorkerService::Service {
 
 QpsWorker::QpsWorker(int driver_port, int server_port,
                      const std::string& credential_type) {
-  impl_.reset(new WorkerServiceImpl(server_port, this));
+  impl_ = absl::make_unique<WorkerServiceImpl>(server_port, this);
   gpr_atm_rel_store(&done_, static_cast<gpr_atm>(0));
 
   std::unique_ptr<ServerBuilder> builder = CreateQpsServerBuilder();
index 51d410b..f2d34be 100644 (file)
@@ -162,7 +162,7 @@ class AsyncQpsServerTest final : public grpc::testing::Server {
       threads_.emplace_back(&AsyncQpsServerTest::ThreadFunc, this, i);
     }
   }
-  ~AsyncQpsServerTest() {
+  ~AsyncQpsServerTest() override {
     for (auto ss = shutdown_state_.begin(); ss != shutdown_state_.end(); ++ss) {
       std::lock_guard<std::mutex> lock((*ss)->mutex);
       (*ss)->shutdown = true;
@@ -180,8 +180,8 @@ class AsyncQpsServerTest final : public grpc::testing::Server {
     for (auto cq = srv_cqs_.begin(); cq != srv_cqs_.end(); ++cq) {
       bool ok;
       void* got_tag;
-      while ((*cq)->Next(&got_tag, &ok))
-        ;
+      while ((*cq)->Next(&got_tag, &ok)) {
+      }
     }
   }
 
index c88b60e..0a758a6 100644 (file)
  *
  */
 
+#include <grpc/grpc.h>
+#include <grpc/support/time.h>
 #include <signal.h>
 
 #include <chrono>
 #include <thread>
 #include <vector>
 
-#include <gflags/gflags.h>
-#include <grpc/grpc.h>
-#include <grpc/support/time.h>
-
+#include "absl/flags/flag.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/qps/qps_worker.h"
 #include "test/cpp/util/test_config.h"
 #include "test/cpp/util/test_credentials_provider.h"
 
-DEFINE_int32(driver_port, 0, "Port for communication with driver");
-DEFINE_int32(server_port, 0, "Port for operation as a server");
-DEFINE_string(credential_type, grpc::testing::kInsecureCredentialsType,
-              "Credential type for communication with driver");
+ABSL_FLAG(int32_t, driver_port, 0, "Port for communication with driver");
+ABSL_FLAG(int32_t, server_port, 0,
+          "Port for operation as a server, if not specified by the server "
+          "config message");
+ABSL_FLAG(std::string, credential_type, grpc::testing::kInsecureCredentialsType,
+          "Credential type for communication with driver");
 
 static bool got_sigint = false;
 
@@ -46,7 +47,9 @@ namespace testing {
 std::vector<grpc::testing::Server*>* g_inproc_servers = nullptr;
 
 static void RunServer() {
-  QpsWorker worker(FLAGS_driver_port, FLAGS_server_port, FLAGS_credential_type);
+  QpsWorker worker(absl::GetFlag(FLAGS_driver_port),
+                   absl::GetFlag(FLAGS_server_port),
+                   absl::GetFlag(FLAGS_credential_type));
 
   while (!got_sigint && !worker.Done()) {
     gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
index 5c9d99d..c2ccd8a 100644 (file)
@@ -59,3 +59,17 @@ grpc_cc_test(
         "//test/core/util:grpc_test_util_unsecure",
     ],
 )
+
+grpc_cc_test(
+    name = "credentials_test",
+    srcs = ["credentials_test.cc"],
+    external_deps = [
+        "gtest",
+    ],
+    deps = [
+        "//:gpr",
+        "//:grpc",
+        "//:grpc++",
+        "//test/core/util:grpc_test_util",
+    ],
+)
diff --git a/test/cpp/server/credentials_test.cc b/test/cpp/server/credentials_test.cc
new file mode 100644 (file)
index 0000000..8e7fc17
--- /dev/null
@@ -0,0 +1,98 @@
+//
+// Copyright 2020 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <gmock/gmock.h>
+#include <grpc/grpc.h>
+#include <grpc/grpc_security.h>
+#include <grpcpp/security/server_credentials.h>
+#include <grpcpp/security/tls_credentials_options.h>
+#include <gtest/gtest.h>
+
+#include <memory>
+
+#include "src/cpp/client/secure_credentials.h"
+#include "test/core/util/port.h"
+#include "test/core/util/test_config.h"
+
+namespace {
+
+constexpr const char* kRootCertName = "root_cert_name";
+constexpr const char* kRootCertContents = "root_cert_contents";
+constexpr const char* kIdentityCertName = "identity_cert_name";
+constexpr const char* kIdentityCertPrivateKey = "identity_private_key";
+constexpr const char* kIdentityCertContents = "identity_cert_contents";
+
+using ::grpc::experimental::StaticDataCertificateProvider;
+
+}  // namespace
+
+namespace grpc {
+namespace testing {
+namespace {
+
+TEST(
+    CredentialsTest,
+    TlsServerCredentialsWithStaticDataCertificateProviderLoadingRootAndIdentity) {
+  experimental::IdentityKeyCertPair key_cert_pair;
+  key_cert_pair.private_key = kIdentityCertPrivateKey;
+  key_cert_pair.certificate_chain = kIdentityCertContents;
+  std::vector<experimental::IdentityKeyCertPair> identity_key_cert_pairs;
+  identity_key_cert_pairs.emplace_back(key_cert_pair);
+  auto certificate_provider = std::make_shared<StaticDataCertificateProvider>(
+      kRootCertContents, identity_key_cert_pairs);
+  grpc::experimental::TlsServerCredentialsOptions options(certificate_provider);
+  options.watch_root_certs();
+  options.set_root_cert_name(kRootCertName);
+  options.watch_identity_key_cert_pairs();
+  options.set_identity_cert_name(kIdentityCertName);
+  options.set_cert_request_type(
+      GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);
+  auto server_credentials = grpc::experimental::TlsServerCredentials(options);
+  GPR_ASSERT(server_credentials.get() != nullptr);
+}
+
+// ServerCredentials should always have identity credential presented.
+// Otherwise gRPC stack will fail.
+TEST(CredentialsTest,
+     TlsServerCredentialsWithStaticDataCertificateProviderLoadingIdentityOnly) {
+  experimental::IdentityKeyCertPair key_cert_pair;
+  key_cert_pair.private_key = kIdentityCertPrivateKey;
+  key_cert_pair.certificate_chain = kIdentityCertContents;
+  std::vector<experimental::IdentityKeyCertPair> identity_key_cert_pairs;
+  // Adding two key_cert_pair(s) should still work.
+  identity_key_cert_pairs.emplace_back(key_cert_pair);
+  identity_key_cert_pairs.emplace_back(key_cert_pair);
+  auto certificate_provider =
+      std::make_shared<StaticDataCertificateProvider>(identity_key_cert_pairs);
+  grpc::experimental::TlsServerCredentialsOptions options(certificate_provider);
+  options.watch_identity_key_cert_pairs();
+  options.set_identity_cert_name(kIdentityCertName);
+  options.set_cert_request_type(
+      GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);
+  auto server_credentials = grpc::experimental::TlsServerCredentials(options);
+  GPR_ASSERT(server_credentials.get() != nullptr);
+}
+
+}  // namespace
+}  // namespace testing
+}  // namespace grpc
+
+int main(int argc, char** argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+  grpc::testing::TestEnvironment env(argc, argv);
+  int ret = RUN_ALL_TESTS();
+  return ret;
+}
index a859108..614a03b 100644 (file)
@@ -25,6 +25,8 @@
 #include <grpc/grpc.h>
 #include <gtest/gtest.h>
 
+#include "absl/memory/memory.h"
+
 #include "src/core/ext/filters/load_reporting/registered_opencensus_objects.h"
 #include "src/core/lib/iomgr/exec_ctx.h"
 #include "src/cpp/server/load_reporter/constants.h"
@@ -42,9 +44,6 @@ using ::grpc::lb::v1::LoadBalancingFeedback;
 using ::grpc::load_reporter::CensusViewProvider;
 using ::grpc::load_reporter::CpuStatsProvider;
 using ::grpc::load_reporter::LoadReporter;
-using ::opencensus::stats::View;
-using ::opencensus::stats::ViewData;
-using ::opencensus::stats::ViewDataImpl;
 using ::opencensus::stats::ViewDescriptor;
 using ::testing::DoubleNear;
 using ::testing::Return;
@@ -140,10 +139,10 @@ class LoadReporterTest : public ::testing::Test {
     EXPECT_CALL(*mock_cpu, GetCpuStats())
         .WillOnce(Return(initial_cpu_stats_))
         .RetiresOnSaturation();
-    load_reporter_ = std::unique_ptr<LoadReporter>(
-        new LoadReporter(kFeedbackSampleWindowSeconds,
-                         std::unique_ptr<CensusViewProvider>(mock_census),
-                         std::unique_ptr<CpuStatsProvider>(mock_cpu)));
+    load_reporter_ = absl::make_unique<LoadReporter>(
+        kFeedbackSampleWindowSeconds,
+        std::unique_ptr<CensusViewProvider>(mock_census),
+        std::unique_ptr<CpuStatsProvider>(mock_cpu));
   }
 };
 
index 03ecd2b..2b1ef7a 100644 (file)
@@ -25,7 +25,6 @@ grpc_cc_test(
     name = "thread_manager_test",
     srcs = ["thread_manager_test.cc"],
     external_deps = [
-        "gflags",
         "gtest",
     ],
     deps = [
index 882d2cd..31d6ad5 100644 (file)
@@ -22,7 +22,6 @@
 #include <memory>
 #include <thread>
 
-#include <gflags/gflags.h>
 #include <grpc/support/log.h>
 #include <grpc/support/port_platform.h>
 #include <grpcpp/grpcpp.h>
index 21bf853..6520a80 100644 (file)
@@ -30,7 +30,7 @@ grpc_cc_library(
         "test_config.h",
     ],
     external_deps = [
-        "gflags",
+        "absl/flags:parse",
     ],
     deps = [
         "//:gpr",
@@ -75,7 +75,7 @@ grpc_cc_library(
         "test_credentials_provider.h",
     ],
     external_deps = [
-        "gflags",
+        "absl/flags:flag",
         "protobuf",
     ],
     deps = [
@@ -133,7 +133,7 @@ grpc_cc_library(
         "service_describer.h",
     ],
     external_deps = [
-        "gflags",
+        "absl/flags:flag",
         "protobuf",
         "protobuf_clib",
     ],
@@ -153,7 +153,7 @@ grpc_cc_library(
         "grpc_tool.h",
     ],
     external_deps = [
-        "gflags",
+        "absl/flags:flag",
     ],
     deps = [
         ":grpc_cli_utils",
@@ -188,6 +188,7 @@ grpc_cc_test(
         "//src/proto/grpc/testing:simple_messages.proto",
     ],
     external_deps = [
+        "absl/flags:flag",
         "gtest",
     ],
     tags = [
@@ -300,7 +301,7 @@ grpc_cc_binary(
         "grpc_cli.cc",
     ],
     external_deps = [
-        "gflags",
+        "absl/flags:flag",
     ],
     deps = [
         ":grpc++_proto_reflection_desc_db",
@@ -315,7 +316,7 @@ grpc_cc_binary(
     name = "channelz_sampler",
     srcs = ["channelz_sampler.cc"],
     external_deps = [
-        "gflags",
+        "absl/flags:flag",
     ],
     language = "c++",
     tags = [
@@ -340,7 +341,6 @@ grpc_cc_test(
         ":channelz_sampler",
     ],
     external_deps = [
-        "gflags",
         "gtest",
     ],
     tags = [
index 3dabb6b..efccb86 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "test/cpp/util/byte_buffer_proto_helper.h"
 
+#include "absl/memory/memory.h"
+
 namespace grpc {
 namespace testing {
 
@@ -37,7 +39,7 @@ std::unique_ptr<ByteBuffer> SerializeToByteBuffer(
   std::string buf;
   message->SerializeToString(&buf);
   Slice slice(buf);
-  return std::unique_ptr<ByteBuffer>(new ByteBuffer(&slice, 1));
+  return absl::make_unique<ByteBuffer>(&slice, 1);
 }
 
 bool SerializeToByteBufferInPlace(grpc::protobuf::Message* message,
index 8a30c89..fc6afed 100644 (file)
@@ -25,9 +25,9 @@
 #include <queue>
 #include <string>
 
+#include "absl/flags/flag.h"
 #include "absl/strings/str_format.h"
 #include "absl/strings/str_join.h"
-#include "gflags/gflags.h"
 #include "google/protobuf/text_format.h"
 #include "grpc/grpc.h"
 #include "grpc/support/port_platform.h"
 #include "test/cpp/util/test_config.h"
 #include "test/cpp/util/test_credentials_provider.h"
 
-DEFINE_string(server_address, "", "channelz server address");
-DEFINE_string(custom_credentials_type, "", "custom credentials type");
-DEFINE_int64(sampling_times, 1, "number of sampling");
-DEFINE_int64(sampling_interval_seconds, 0, "sampling interval in seconds");
-DEFINE_string(output_json, "", "output filename in json format");
+ABSL_FLAG(std::string, server_address, "", "channelz server address");
+ABSL_FLAG(std::string, custom_credentials_type, "", "custom credentials type");
+ABSL_FLAG(int64_t, sampling_times, 1, "number of sampling");
+// TODO(Capstan): Consider using absl::Duration
+ABSL_FLAG(int64_t, sampling_interval_seconds, 0,
+          "sampling interval in seconds");
+ABSL_FLAG(std::string, output_json, "", "output filename in json format");
 
 namespace {
 using grpc::ClientContext;
@@ -60,10 +62,6 @@ using grpc::Status;
 using grpc::StatusCode;
 using grpc::channelz::v1::GetChannelRequest;
 using grpc::channelz::v1::GetChannelResponse;
-using grpc::channelz::v1::GetServerRequest;
-using grpc::channelz::v1::GetServerResponse;
-using grpc::channelz::v1::GetServerSocketsRequest;
-using grpc::channelz::v1::GetServerSocketsResponse;
 using grpc::channelz::v1::GetServersRequest;
 using grpc::channelz::v1::GetServersResponse;
 using grpc::channelz::v1::GetSocketRequest;
@@ -511,7 +509,8 @@ class ChannelzSampler final {
     std::string start, finish;
     gpr_timespec ago = gpr_time_sub(
         now_,
-        gpr_time_from_seconds(FLAGS_sampling_interval_seconds, GPR_TIMESPAN));
+        gpr_time_from_seconds(absl::GetFlag(FLAGS_sampling_interval_seconds),
+                              GPR_TIMESPAN));
     std::stringstream ss;
     const time_t time_now = now_.tv_sec;
     ss << std::put_time(std::localtime(&time_now), "%F %T");
@@ -562,15 +561,18 @@ class ChannelzSampler final {
 int main(int argc, char** argv) {
   grpc::testing::TestEnvironment env(argc, argv);
   grpc::testing::InitTest(&argc, &argv, true);
-  std::ofstream output_file(FLAGS_output_json);
-  for (int i = 0; i < FLAGS_sampling_times; ++i) {
+  std::ofstream output_file(absl::GetFlag(FLAGS_output_json));
+  for (int i = 0; i < absl::GetFlag(FLAGS_sampling_times); ++i) {
     ChannelzSampler channelz_sampler;
-    channelz_sampler.Setup(FLAGS_custom_credentials_type, FLAGS_server_address);
+    channelz_sampler.Setup(absl::GetFlag(FLAGS_custom_credentials_type),
+                           absl::GetFlag(FLAGS_server_address));
     std::cout << "Wait for sampling interval "
-              << FLAGS_sampling_interval_seconds << "s..." << std::endl;
+              << absl::GetFlag(FLAGS_sampling_interval_seconds) << "s..."
+              << std::endl;
     const gpr_timespec kDelay = gpr_time_add(
         gpr_now(GPR_CLOCK_MONOTONIC),
-        gpr_time_from_seconds(FLAGS_sampling_interval_seconds, GPR_TIMESPAN));
+        gpr_time_from_seconds(absl::GetFlag(FLAGS_sampling_interval_seconds),
+                              GPR_TIMESPAN));
     gpr_sleep_until(kDelay);
     std::cout << "##### " << i << "th sampling #####" << std::endl;
     channelz_sampler.RecordNow();
@@ -579,7 +581,7 @@ int main(int argc, char** argv) {
     channelz_sampler.GetTopChannelsRPC();
     channelz_sampler.TraverseTopChannels();
     channelz_sampler.DumpStdout();
-    if (!FLAGS_output_json.empty()) {
+    if (!absl::GetFlag(FLAGS_output_json).empty()) {
       output_file << channelz_sampler.DumpJson() << "\n" << std::flush;
     }
   }
index 5a2751b..efd01e7 100644 (file)
@@ -66,7 +66,7 @@ std::string output_json("output.json");
 class EchoServerImpl final : public grpc::testing::TestService::Service {
   Status EmptyCall(::grpc::ServerContext* context,
                    const grpc::testing::Empty* request,
-                   grpc::testing::Empty* response) {
+                   grpc::testing::Empty* response) override {
     return Status::OK;
   }
 };
index 7384612..183d3ed 100644 (file)
 
 #include "test/cpp/util/cli_credentials.h"
 
-#include <gflags/gflags.h>
 #include <grpc/slice.h>
 #include <grpc/support/log.h>
 #include <grpcpp/impl/codegen/slice.h>
 
+#include "absl/flags/flag.h"
 #include "src/core/lib/iomgr/load_file.h"
 
-DEFINE_bool(
-    enable_ssl, false,
-    "Whether to use ssl/tls. Deprecated. Use --channel_creds_type=ssl.");
-DEFINE_bool(use_auth, false,
-            "Whether to create default google credentials. Deprecated. Use "
-            "--channel_creds_type=gdc.");
-DEFINE_string(
-    access_token, "",
-    "The access token that will be sent to the server to authenticate RPCs. "
-    "Deprecated. Use --call_creds=access_token=<token>.");
-DEFINE_string(
-    ssl_target, "",
+ABSL_RETIRED_FLAG(bool, enable_ssl, false,
+                  "Replaced by --channel_creds_type=ssl.");
+ABSL_RETIRED_FLAG(bool, use_auth, false,
+                  "Replaced by --channel_creds_type=gdc.");
+ABSL_RETIRED_FLAG(std::string, access_token, "",
+                  "Replaced by --call_creds=access_token=<token>.");
+ABSL_FLAG(
+    std::string, ssl_target, "",
     "If not empty, treat the server host name as this for ssl/tls certificate "
     "validation.");
-DEFINE_string(
-    ssl_client_cert, "",
+ABSL_FLAG(
+    std::string, ssl_client_cert, "",
     "If not empty, load this PEM formatted client certificate file. Requires "
     "use of --ssl_client_key.");
-DEFINE_string(
-    ssl_client_key, "",
-    "If not empty, load this PEM formatted private key. Requires use of "
-    "--ssl_client_cert");
-DEFINE_string(
-    local_connect_type, "local_tcp",
+ABSL_FLAG(std::string, ssl_client_key, "",
+          "If not empty, load this PEM formatted private key. Requires use of "
+          "--ssl_client_cert");
+ABSL_FLAG(
+    std::string, local_connect_type, "local_tcp",
     "The type of local connections for which local channel credentials will "
     "be applied. Should be local_tcp or uds.");
-DEFINE_string(
-    channel_creds_type, "",
+ABSL_FLAG(
+    std::string, channel_creds_type, "",
     "The channel creds type: insecure, ssl, gdc (Google Default Credentials), "
     "alts, or local.");
-DEFINE_string(
-    call_creds, "",
+ABSL_FLAG(
+    std::string, call_creds, "",
     "Call credentials to use: none (default), or access_token=<token>. If "
     "provided, the call creds are composited on top of channel creds.");
 
@@ -84,128 +79,86 @@ std::string AccessToken(const std::string& auth) {
 }  // namespace
 
 std::string CliCredentials::GetDefaultChannelCredsType() const {
-  // Compatibility logic for --enable_ssl.
-  if (FLAGS_enable_ssl) {
-    fprintf(stderr,
-            "warning: --enable_ssl is deprecated. Use "
-            "--channel_creds_type=ssl.\n");
-    return "ssl";
-  }
-  // Compatibility logic for --use_auth.
-  if (FLAGS_access_token.empty() && FLAGS_use_auth) {
-    fprintf(stderr,
-            "warning: --use_auth is deprecated. Use "
-            "--channel_creds_type=gdc.\n");
-    return "gdc";
-  }
   return "insecure";
 }
 
-std::string CliCredentials::GetDefaultCallCreds() const {
-  if (!FLAGS_access_token.empty()) {
-    fprintf(stderr,
-            "warning: --access_token is deprecated. Use "
-            "--call_creds=access_token=<token>.\n");
-    return std::string("access_token=") + FLAGS_access_token;
-  }
-  return "none";
-}
+std::string CliCredentials::GetDefaultCallCreds() const { return "none"; }
 
 std::shared_ptr<grpc::ChannelCredentials>
 CliCredentials::GetChannelCredentials() const {
-  if (FLAGS_channel_creds_type.compare("insecure") == 0) {
+  if (absl::GetFlag(FLAGS_channel_creds_type) == "insecure") {
     return grpc::InsecureChannelCredentials();
-  } else if (FLAGS_channel_creds_type.compare("ssl") == 0) {
+  } else if (absl::GetFlag(FLAGS_channel_creds_type) == "ssl") {
     grpc::SslCredentialsOptions ssl_creds_options;
     // TODO(@Capstan): This won't affect Google Default Credentials using SSL.
-    if (!FLAGS_ssl_client_cert.empty()) {
+    if (!absl::GetFlag(FLAGS_ssl_client_cert).empty()) {
       grpc_slice cert_slice = grpc_empty_slice();
       GRPC_LOG_IF_ERROR(
           "load_file",
-          grpc_load_file(FLAGS_ssl_client_cert.c_str(), 1, &cert_slice));
+          grpc_load_file(absl::GetFlag(FLAGS_ssl_client_cert).c_str(), 1,
+                         &cert_slice));
       ssl_creds_options.pem_cert_chain =
           grpc::StringFromCopiedSlice(cert_slice);
       grpc_slice_unref(cert_slice);
     }
-    if (!FLAGS_ssl_client_key.empty()) {
+    if (!absl::GetFlag(FLAGS_ssl_client_key).empty()) {
       grpc_slice key_slice = grpc_empty_slice();
       GRPC_LOG_IF_ERROR(
           "load_file",
-          grpc_load_file(FLAGS_ssl_client_key.c_str(), 1, &key_slice));
+          grpc_load_file(absl::GetFlag(FLAGS_ssl_client_key).c_str(), 1,
+                         &key_slice));
       ssl_creds_options.pem_private_key =
           grpc::StringFromCopiedSlice(key_slice);
       grpc_slice_unref(key_slice);
     }
     return grpc::SslCredentials(ssl_creds_options);
-  } else if (FLAGS_channel_creds_type.compare("gdc") == 0) {
+  } else if (absl::GetFlag(FLAGS_channel_creds_type) == "gdc") {
     return grpc::GoogleDefaultCredentials();
-  } else if (FLAGS_channel_creds_type.compare("alts") == 0) {
+  } else if (absl::GetFlag(FLAGS_channel_creds_type) == "alts") {
     return grpc::experimental::AltsCredentials(
         grpc::experimental::AltsCredentialsOptions());
-  } else if (FLAGS_channel_creds_type.compare("local") == 0) {
-    if (FLAGS_local_connect_type.compare("local_tcp") == 0) {
+  } else if (absl::GetFlag(FLAGS_channel_creds_type) == "local") {
+    if (absl::GetFlag(FLAGS_local_connect_type) == "local_tcp") {
       return grpc::experimental::LocalCredentials(LOCAL_TCP);
-    } else if (FLAGS_local_connect_type.compare("uds") == 0) {
+    } else if (absl::GetFlag(FLAGS_local_connect_type) == "uds") {
       return grpc::experimental::LocalCredentials(UDS);
     } else {
       fprintf(stderr,
               "--local_connect_type=%s invalid; must be local_tcp or uds.\n",
-              FLAGS_local_connect_type.c_str());
+              absl::GetFlag(FLAGS_local_connect_type).c_str());
     }
   }
   fprintf(stderr,
           "--channel_creds_type=%s invalid; must be insecure, ssl, gdc, "
           "alts, or local.\n",
-          FLAGS_channel_creds_type.c_str());
+          absl::GetFlag(FLAGS_channel_creds_type).c_str());
   return std::shared_ptr<grpc::ChannelCredentials>();
 }
 
 std::shared_ptr<grpc::CallCredentials> CliCredentials::GetCallCredentials()
     const {
-  if (IsAccessToken(FLAGS_call_creds)) {
-    return grpc::AccessTokenCredentials(AccessToken(FLAGS_call_creds));
+  if (IsAccessToken(absl::GetFlag(FLAGS_call_creds))) {
+    return grpc::AccessTokenCredentials(
+        AccessToken(absl::GetFlag(FLAGS_call_creds)));
   }
-  if (FLAGS_call_creds.compare("none") == 0) {
+  if (absl::GetFlag(FLAGS_call_creds) == "none") {
     // Nothing to do; creds, if any, are baked into the channel.
     return std::shared_ptr<grpc::CallCredentials>();
   }
   fprintf(stderr,
           "--call_creds=%s invalid; must be none "
           "or access_token=<token>.\n",
-          FLAGS_call_creds.c_str());
+          absl::GetFlag(FLAGS_call_creds).c_str());
   return std::shared_ptr<grpc::CallCredentials>();
 }
 
 std::shared_ptr<grpc::ChannelCredentials> CliCredentials::GetCredentials()
     const {
-  if (FLAGS_call_creds.empty()) {
-    FLAGS_call_creds = GetDefaultCallCreds();
-  } else if (!FLAGS_access_token.empty() && !IsAccessToken(FLAGS_call_creds)) {
-    fprintf(stderr,
-            "warning: ignoring --access_token because --call_creds "
-            "already set to %s.\n",
-            FLAGS_call_creds.c_str());
-  }
-  if (FLAGS_channel_creds_type.empty()) {
-    FLAGS_channel_creds_type = GetDefaultChannelCredsType();
-  } else if (FLAGS_enable_ssl && FLAGS_channel_creds_type.compare("ssl") != 0) {
-    fprintf(stderr,
-            "warning: ignoring --enable_ssl because "
-            "--channel_creds_type already set to %s.\n",
-            FLAGS_channel_creds_type.c_str());
-  } else if (FLAGS_use_auth && FLAGS_channel_creds_type.compare("gdc") != 0) {
-    fprintf(stderr,
-            "warning: ignoring --use_auth because "
-            "--channel_creds_type already set to %s.\n",
-            FLAGS_channel_creds_type.c_str());
+  if (absl::GetFlag(FLAGS_call_creds).empty()) {
+    absl::SetFlag(&FLAGS_call_creds, GetDefaultCallCreds());
   }
-  // Legacy transport upgrade logic for insecure requests.
-  if (IsAccessToken(FLAGS_call_creds) &&
-      FLAGS_channel_creds_type.compare("insecure") == 0) {
-    fprintf(stderr,
-            "warning: --channel_creds_type=insecure upgraded to ssl because "
-            "an access token was provided.\n");
-    FLAGS_channel_creds_type = "ssl";
+  if (absl::GetFlag(FLAGS_channel_creds_type).empty()) {
+    absl::SetFlag(&FLAGS_channel_creds_type, GetDefaultChannelCredsType());
   }
   std::shared_ptr<grpc::ChannelCredentials> channel_creds =
       GetChannelCredentials();
@@ -217,15 +170,7 @@ std::shared_ptr<grpc::ChannelCredentials> CliCredentials::GetCredentials()
 }
 
 const std::string CliCredentials::GetCredentialUsage() const {
-  return "    --enable_ssl             ; Set whether to use ssl "
-         "(deprecated)\n"
-         "    --use_auth               ; Set whether to create default google"
-         " credentials\n"
-         "                             ; (deprecated)\n"
-         "    --access_token           ; Set the access token in metadata,"
-         " overrides --use_auth\n"
-         "                             ; (deprecated)\n"
-         "    --ssl_target             ; Set server host for ssl validation\n"
+  return "    --ssl_target             ; Set server host for ssl validation\n"
          "    --ssl_client_cert        ; Client cert for ssl\n"
          "    --ssl_client_key         ; Client private key for ssl\n"
          "    --local_connect_type     ; Set to local_tcp or uds\n"
@@ -236,9 +181,9 @@ const std::string CliCredentials::GetCredentialUsage() const {
 }
 
 const std::string CliCredentials::GetSslTargetNameOverride() const {
-  bool use_ssl = FLAGS_channel_creds_type.compare("ssl") == 0 ||
-                 FLAGS_channel_creds_type.compare("gdc") == 0;
-  return use_ssl ? FLAGS_ssl_target : "";
+  bool use_ssl = absl::GetFlag(FLAGS_channel_creds_type) == "ssl" ||
+                 absl::GetFlag(FLAGS_channel_creds_type) == "gdc";
+  return use_ssl ? absl::GetFlag(FLAGS_ssl_target) : "";
 }
 
 }  // namespace testing
index b255115..67b6bde 100644 (file)
 
 #include "test/cpp/util/create_test_channel.h"
 
-#include <gflags/gflags.h>
-
 #include <grpc/support/log.h>
 #include <grpcpp/create_channel.h>
 #include <grpcpp/security/credentials.h>
 
+#include "absl/flags/flag.h"
 #include "test/cpp/util/test_credentials_provider.h"
 
-DEFINE_string(
-    grpc_test_use_grpclb_with_child_policy, "",
-    "If non-empty, set a static service config on channels created by "
-    "grpc::CreateTestChannel, that configures the grpclb LB policy "
-    "with a child policy being the value of this flag (e.g. round_robin "
-    "or pick_first).");
+ABSL_FLAG(std::string, grpc_test_use_grpclb_with_child_policy, "",
+          "If non-empty, set a static service config on channels created by "
+          "grpc::CreateTestChannel, that configures the grpclb LB policy "
+          "with a child policy being the value of this flag (e.g. round_robin "
+          "or pick_first).");
 
 namespace grpc {
 
@@ -59,12 +57,13 @@ void AddProdSslType() {
 }
 
 void MaybeSetCustomChannelArgs(grpc::ChannelArguments* args) {
-  if (FLAGS_grpc_test_use_grpclb_with_child_policy.size() > 0) {
-    args->SetString("grpc.service_config",
-                    "{\"loadBalancingConfig\":[{\"grpclb\":{\"childPolicy\":[{"
-                    "\"" +
-                        FLAGS_grpc_test_use_grpclb_with_child_policy +
-                        "\":{}}]}}]}");
+  if (!absl::GetFlag(FLAGS_grpc_test_use_grpclb_with_child_policy).empty()) {
+    args->SetString(
+        "grpc.service_config",
+        "{\"loadBalancingConfig\":[{\"grpclb\":{\"childPolicy\":[{"
+        "\"" +
+            absl::GetFlag(FLAGS_grpc_test_use_grpclb_with_child_policy) +
+            "\":{}}]}}]}");
   }
 }
 
index 614a578..4541919 100644 (file)
@@ -22,7 +22,8 @@
 
   Example of talking to grpc interop server:
   grpc_cli call localhost:50051 UnaryCall "response_size:10" \
-      --protofiles=src/proto/grpc/testing/test.proto --enable_ssl=false
+      --protofiles=src/proto/grpc/testing/test.proto \
+      --channel_creds_type=insecure
 
   Options:
     1. --protofiles, use this flag to provide proto files if the server does
@@ -33,7 +34,8 @@
        provided.
     3. --metadata specifies metadata to be sent to the server, such as:
        --metadata="MyHeaderKey1:Value1:MyHeaderKey2:Value2"
-    4. --enable_ssl, whether to use tls.
+    4. --channel_creds_type, whether to use tls, insecure or platform-specific
+       options.
     5. --use_auth, if set to true, attach a GoogleDefaultCredentials to the call
     6. --infile, input filename (defaults to stdin)
     7. --outfile, output filename (defaults to stdout)
        address of the connection that each RPC is made on to stderr.
 */
 
+#include <grpcpp/support/config.h>
+
 #include <fstream>
 #include <functional>
 #include <iostream>
 
-#include <gflags/gflags.h>
-#include <grpcpp/support/config.h>
+#include "absl/flags/flag.h"
 #include "test/cpp/util/cli_credentials.h"
 #include "test/cpp/util/grpc_tool.h"
 #include "test/cpp/util/test_config.h"
 
-DEFINE_string(outfile, "", "Output file (default is stdout)");
+ABSL_FLAG(std::string, outfile, "", "Output file (default is stdout)");
 
 static bool SimplePrint(const std::string& outfile, const std::string& output) {
   if (outfile.empty()) {
@@ -86,5 +89,6 @@ int main(int argc, char** argv) {
 
   return grpc::testing::GrpcToolMainLib(
       argc, (const char**)argv, grpc::testing::CliCredentials(),
-      std::bind(SimplePrint, FLAGS_outfile, std::placeholders::_1));
+      std::bind(SimplePrint, absl::GetFlag(FLAGS_outfile),
+                std::placeholders::_1));
 }
index fceee0c..0ad20eb 100644 (file)
@@ -18,7 +18,6 @@
 
 #include "test/cpp/util/grpc_tool.h"
 
-#include <gflags/gflags.h>
 #include <grpc/grpc.h>
 #include <grpc/support/port_platform.h>
 #include <grpcpp/channel.h>
@@ -35,6 +34,8 @@
 #include <string>
 #include <thread>
 
+#include "absl/flags/flag.h"
+#include "absl/memory/memory.h"
 #include "test/cpp/util/cli_call.h"
 #include "test/cpp/util/proto_file_parser.h"
 #include "test/cpp/util/proto_reflection_descriptor_database.h"
 #include <unistd.h>
 #endif
 
+ABSL_FLAG(bool, l, false, "Use a long listing format");
+ABSL_FLAG(bool, remotedb, true,
+          "Use server types to parse and format messages");
+ABSL_FLAG(std::string, metadata, "",
+          "Metadata to send to server, in the form of key1:val1:key2:val2");
+ABSL_FLAG(std::string, proto_path, ".", "Path to look for the proto file.");
+ABSL_FLAG(std::string, protofiles, "", "Name of the proto file.");
+ABSL_FLAG(bool, binary_input, false, "Input in binary format");
+ABSL_FLAG(bool, binary_output, false, "Output in binary format");
+ABSL_FLAG(std::string, default_service_config, "",
+          "Default service config to use on the channel, if non-empty. Note "
+          "that this will be ignored if the name resolver returns a service "
+          "config.");
+ABSL_FLAG(bool, display_peer_address, false,
+          "Log the peer socket address of the connection that each RPC is made "
+          "on to stderr.");
+ABSL_FLAG(bool, json_input, false, "Input in json format");
+ABSL_FLAG(bool, json_output, false, "Output in json format");
+ABSL_FLAG(std::string, infile, "", "Input file (default is stdin)");
+ABSL_FLAG(bool, batch, false,
+          "Input contains multiple requests. Please do not use this to send "
+          "more than a few RPCs. gRPC CLI has very different performance "
+          "characteristics compared with normal RPC calls which make it "
+          "unsuitable for loadtesting or significant production traffic.");
+// TODO(Capstan): Consider using absl::Duration
+ABSL_FLAG(double, timeout, -1,
+          "Specify timeout in seconds, used to set the deadline for all "
+          "RPCs. The default value of -1 means no deadline has been set.");
+
 namespace grpc {
 namespace testing {
-
-DEFINE_bool(l, false, "Use a long listing format");
-DEFINE_bool(remotedb, true, "Use server types to parse and format messages");
-DEFINE_string(metadata, "",
-              "Metadata to send to server, in the form of key1:val1:key2:val2");
-DEFINE_string(proto_path, ".", "Path to look for the proto file.");
-DEFINE_string(protofiles, "", "Name of the proto file.");
-DEFINE_bool(binary_input, false, "Input in binary format");
-DEFINE_bool(binary_output, false, "Output in binary format");
-DEFINE_string(
-    default_service_config, "",
-    "Default service config to use on the channel, if non-empty. Note "
-    "that this will be ignored if the name resolver returns a service "
-    "config.");
-DEFINE_bool(
-    display_peer_address, false,
-    "Log the peer socket address of the connection that each RPC is made "
-    "on to stderr.");
-DEFINE_bool(json_input, false, "Input in json format");
-DEFINE_bool(json_output, false, "Output in json format");
-DEFINE_string(infile, "", "Input file (default is stdin)");
-DEFINE_bool(batch, false,
-            "Input contains multiple requests. Please do not use this to send "
-            "more than a few RPCs. gRPC CLI has very different performance "
-            "characteristics compared with normal RPC calls which make it "
-            "unsuitable for loadtesting or significant production traffic.");
-DEFINE_double(timeout, -1,
-              "Specify timeout in seconds, used to set the deadline for all "
-              "RPCs. The default value of -1 means no deadline has been set.");
-
 namespace {
 
 class GrpcTool {
@@ -86,26 +86,26 @@ class GrpcTool {
   virtual ~GrpcTool() {}
 
   bool Help(int argc, const char** argv, const CliCredentials& cred,
-            GrpcToolOutputCallback callback);
+            const GrpcToolOutputCallback& callback);
   bool CallMethod(int argc, const char** argv, const CliCredentials& cred,
-                  GrpcToolOutputCallback callback);
+                  const GrpcToolOutputCallback& callback);
   bool ListServices(int argc, const char** argv, const CliCredentials& cred,
-                    GrpcToolOutputCallback callback);
+                    const GrpcToolOutputCallback& callback);
   bool PrintType(int argc, const char** argv, const CliCredentials& cred,
-                 GrpcToolOutputCallback callback);
+                 const GrpcToolOutputCallback& callback);
   // TODO(zyc): implement the following methods
   // bool ListServices(int argc, const char** argv, GrpcToolOutputCallback
   // callback);
   // bool PrintTypeId(int argc, const char** argv, GrpcToolOutputCallback
   // callback);
   bool ParseMessage(int argc, const char** argv, const CliCredentials& cred,
-                    GrpcToolOutputCallback callback);
+                    const GrpcToolOutputCallback& callback);
   bool ToText(int argc, const char** argv, const CliCredentials& cred,
-              GrpcToolOutputCallback callback);
+              const GrpcToolOutputCallback& callback);
   bool ToJson(int argc, const char** argv, const CliCredentials& cred,
-              GrpcToolOutputCallback callback);
+              const GrpcToolOutputCallback& callback);
   bool ToBinary(int argc, const char** argv, const CliCredentials& cred,
-                GrpcToolOutputCallback callback);
+                const GrpcToolOutputCallback& callback);
 
   void SetPrintCommandMode(int exit_status) {
     print_command_usage_ = true;
@@ -136,7 +136,7 @@ size_t ArraySize(T& a) {
 
 void ParseMetadataFlag(
     std::multimap<std::string, std::string>* client_metadata) {
-  if (FLAGS_metadata.empty()) {
+  if (absl::GetFlag(FLAGS_metadata).empty()) {
     return;
   }
   std::vector<std::string> fields;
@@ -144,11 +144,11 @@ void ParseMetadataFlag(
   const char escape = '\\';
   size_t cur = -1;
   std::stringstream ss;
-  while (++cur < FLAGS_metadata.length()) {
-    switch (FLAGS_metadata.at(cur)) {
+  while (++cur < absl::GetFlag(FLAGS_metadata).length()) {
+    switch (absl::GetFlag(FLAGS_metadata).at(cur)) {
       case escape:
-        if (cur < FLAGS_metadata.length() - 1) {
-          char c = FLAGS_metadata.at(++cur);
+        if (cur < absl::GetFlag(FLAGS_metadata).length() - 1) {
+          char c = absl::GetFlag(FLAGS_metadata).at(++cur);
           if (c == delim || c == escape) {
             ss << c;
             continue;
@@ -162,7 +162,7 @@ void ParseMetadataFlag(
         ss.clear();
         break;
       default:
-        ss << FLAGS_metadata.at(cur);
+        ss << absl::GetFlag(FLAGS_metadata).at(cur);
     }
   }
   fields.push_back(ss.str());
@@ -193,8 +193,8 @@ void PrintMetadata(const T& m, const std::string& message) {
 }
 
 void ReadResponse(CliCall* call, const std::string& method_name,
-                  GrpcToolOutputCallback callback, ProtoFileParser* parser,
-                  gpr_mu* parser_mu, bool print_mode) {
+                  const GrpcToolOutputCallback& callback,
+                  ProtoFileParser* parser, gpr_mu* parser_mu, bool print_mode) {
   std::string serialized_response_proto;
   std::multimap<grpc::string_ref, grpc::string_ref> server_initial_metadata;
 
@@ -203,11 +203,11 @@ void ReadResponse(CliCall* call, const std::string& method_name,
            receive_initial_metadata ? &server_initial_metadata : nullptr);
        receive_initial_metadata = false) {
     fprintf(stderr, "got response.\n");
-    if (!FLAGS_binary_output) {
+    if (!absl::GetFlag(FLAGS_binary_output)) {
       gpr_mu_lock(parser_mu);
       serialized_response_proto = parser->GetFormattedStringFromMethod(
           method_name, serialized_response_proto, false /* is_request */,
-          FLAGS_json_output);
+          absl::GetFlag(FLAGS_json_output));
       if (parser->HasError() && print_mode) {
         fprintf(stderr, "Failed to parse response.\n");
       }
@@ -229,10 +229,13 @@ std::shared_ptr<grpc::Channel> CreateCliChannel(
   if (!cred.GetSslTargetNameOverride().empty()) {
     args.SetSslTargetNameOverride(cred.GetSslTargetNameOverride());
   }
-  if (!FLAGS_default_service_config.empty()) {
+  if (!absl::GetFlag(FLAGS_default_service_config).empty()) {
     args.SetString(GRPC_ARG_SERVICE_CONFIG,
-                   FLAGS_default_service_config.c_str());
+                   absl::GetFlag(FLAGS_default_service_config).c_str());
   }
+  // See |GRPC_ARG_MAX_METADATA_SIZE| in |grpc_types.h|.
+  // Set to large enough size (10M) that should work for most use cases.
+  args.SetInt(GRPC_ARG_MAX_METADATA_SIZE, 10 * 1024 * 1024);
   return ::grpc::CreateCustomChannel(server_address, cred.GetCredentials(),
                                      args);
 }
@@ -287,7 +290,7 @@ const Command* FindCommand(const std::string& name) {
 }  // namespace
 
 int GrpcToolMainLib(int argc, const char** argv, const CliCredentials& cred,
-                    GrpcToolOutputCallback callback) {
+                    const GrpcToolOutputCallback& callback) {
   if (argc < 2) {
     Usage("No command specified");
   }
@@ -324,7 +327,7 @@ void GrpcTool::CommandUsage(const std::string& usage) const {
 }
 
 bool GrpcTool::Help(int argc, const char** argv, const CliCredentials& cred,
-                    GrpcToolOutputCallback callback) {
+                    const GrpcToolOutputCallback& callback) {
   CommandUsage(
       "Print help\n"
       "  grpc_cli help [subcommand]\n");
@@ -344,7 +347,7 @@ bool GrpcTool::Help(int argc, const char** argv, const CliCredentials& cred,
 
 bool GrpcTool::ListServices(int argc, const char** argv,
                             const CliCredentials& cred,
-                            GrpcToolOutputCallback callback) {
+                            const GrpcToolOutputCallback& callback) {
   CommandUsage(
       "List services\n"
       "  grpc_cli ls <address> [<service>[/<method>]]\n"
@@ -372,7 +375,7 @@ bool GrpcTool::ListServices(int argc, const char** argv,
   if (argc < 2) {
     // List all services, if --l is passed, then include full description,
     // otherwise include a summarized list only.
-    if (FLAGS_l) {
+    if (absl::GetFlag(FLAGS_l)) {
       output = DescribeServiceList(service_list, desc_pool);
     } else {
       for (auto it = service_list.begin(); it != service_list.end(); it++) {
@@ -409,14 +412,16 @@ bool GrpcTool::ListServices(int argc, const char** argv,
         desc_pool.FindServiceByName(service_name);
     if (service != nullptr) {
       if (method_name.empty()) {
-        output = FLAGS_l ? DescribeService(service) : SummarizeService(service);
+        output = absl::GetFlag(FLAGS_l) ? DescribeService(service)
+                                        : SummarizeService(service);
       } else {
         method_name.insert(0, 1, '.');
         method_name.insert(0, service_name);
         const grpc::protobuf::MethodDescriptor* method =
             desc_pool.FindMethodByName(method_name);
         if (method != nullptr) {
-          output = FLAGS_l ? DescribeMethod(method) : SummarizeMethod(method);
+          output = absl::GetFlag(FLAGS_l) ? DescribeMethod(method)
+                                          : SummarizeMethod(method);
         } else {
           fprintf(stderr, "Method %s not found in service %s.\n",
                   method_name.c_str(), service_name.c_str());
@@ -431,7 +436,8 @@ bool GrpcTool::ListServices(int argc, const char** argv,
         const grpc::protobuf::MethodDescriptor* method =
             desc_pool.FindMethodByName(service_name);
         if (method != nullptr) {
-          output = FLAGS_l ? DescribeMethod(method) : SummarizeMethod(method);
+          output = absl::GetFlag(FLAGS_l) ? DescribeMethod(method)
+                                          : SummarizeMethod(method);
         } else {
           fprintf(stderr, "Service or method %s not found.\n",
                   service_name.c_str());
@@ -445,7 +451,7 @@ bool GrpcTool::ListServices(int argc, const char** argv,
 
 bool GrpcTool::PrintType(int /*argc*/, const char** argv,
                          const CliCredentials& cred,
-                         GrpcToolOutputCallback callback) {
+                         const GrpcToolOutputCallback& callback) {
   CommandUsage(
       "Print type\n"
       "  grpc_cli type <address> <type>\n"
@@ -473,7 +479,7 @@ bool GrpcTool::PrintType(int /*argc*/, const char** argv,
 
 bool GrpcTool::CallMethod(int argc, const char** argv,
                           const CliCredentials& cred,
-                          GrpcToolOutputCallback callback) {
+                          const GrpcToolOutputCallback& callback) {
   CommandUsage(
       "Call method\n"
       "  grpc_cli call <address> <service>[.<method>] <request>\n"
@@ -507,16 +513,17 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
   std::unique_ptr<ProtoFileParser> parser;
   std::string serialized_request_proto;
   CliArgs cli_args;
-  cli_args.timeout = FLAGS_timeout;
+  cli_args.timeout = absl::GetFlag(FLAGS_timeout);
   bool print_mode = false;
 
   std::shared_ptr<grpc::Channel> channel =
       CreateCliChannel(server_address, cred);
 
-  if (!FLAGS_binary_input || !FLAGS_binary_output) {
-    parser.reset(
-        new grpc::testing::ProtoFileParser(FLAGS_remotedb ? channel : nullptr,
-                                           FLAGS_proto_path, FLAGS_protofiles));
+  if (!absl::GetFlag(FLAGS_binary_input) ||
+      !absl::GetFlag(FLAGS_binary_output)) {
+    parser = absl::make_unique<grpc::testing::ProtoFileParser>(
+        absl::GetFlag(FLAGS_remotedb) ? channel : nullptr,
+        absl::GetFlag(FLAGS_proto_path), absl::GetFlag(FLAGS_protofiles));
     if (parser->HasError()) {
       fprintf(
           stderr,
@@ -525,7 +532,7 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
     }
   }
 
-  if (FLAGS_binary_input) {
+  if (absl::GetFlag(FLAGS_binary_input)) {
     formatted_method_name = method_name;
   } else {
     formatted_method_name = parser->GetFormattedMethodName(method_name);
@@ -543,7 +550,7 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
     std::istream* input_stream;
     std::ifstream input_file;
 
-    if (FLAGS_batch) {
+    if (absl::GetFlag(FLAGS_batch)) {
       fprintf(stderr, "Batch mode for streaming RPC is not supported.\n");
       return false;
     }
@@ -553,19 +560,20 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
     PrintMetadata(client_metadata, "Sending client initial metadata:");
 
     CliCall call(channel, formatted_method_name, client_metadata, cli_args);
-    if (FLAGS_display_peer_address) {
+    if (absl::GetFlag(FLAGS_display_peer_address)) {
       fprintf(stderr, "New call for method_name:%s has peer address:|%s|\n",
               formatted_method_name.c_str(), call.peer().c_str());
     }
 
-    if (FLAGS_infile.empty()) {
+    if (absl::GetFlag(FLAGS_infile).empty()) {
       if (isatty(fileno(stdin))) {
         print_mode = true;
         fprintf(stderr, "reading streaming request message from stdin...\n");
       }
       input_stream = &std::cin;
     } else {
-      input_file.open(FLAGS_infile, std::ios::in | std::ios::binary);
+      input_file.open(absl::GetFlag(FLAGS_infile),
+                      std::ios::in | std::ios::binary);
       input_stream = &input_file;
     }
 
@@ -579,14 +587,14 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
     while (!request_text.empty() ||
            (!input_stream->eof() && getline(*input_stream, line))) {
       if (!request_text.empty()) {
-        if (FLAGS_binary_input) {
+        if (absl::GetFlag(FLAGS_binary_input)) {
           serialized_request_proto = request_text;
           request_text.clear();
         } else {
           gpr_mu_lock(&parser_mu);
           serialized_request_proto = parser->GetSerializedProtoFromMethod(
               method_name, request_text, true /* is_request */,
-              FLAGS_json_input);
+              absl::GetFlag(FLAGS_json_input));
           request_text.clear();
           if (parser->HasError()) {
             if (print_mode) {
@@ -635,7 +643,7 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
     }
 
   } else {  // parser->IsStreaming(method_name, true /* is_request */)
-    if (FLAGS_batch) {
+    if (absl::GetFlag(FLAGS_batch)) {
       if (parser->IsStreaming(method_name, false /* is_request */)) {
         fprintf(stderr, "Batch mode for streaming RPC is not supported.\n");
         return false;
@@ -644,14 +652,15 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
       std::istream* input_stream;
       std::ifstream input_file;
 
-      if (FLAGS_infile.empty()) {
+      if (absl::GetFlag(FLAGS_infile).empty()) {
         if (isatty(fileno(stdin))) {
           print_mode = true;
           fprintf(stderr, "reading request messages from stdin...\n");
         }
         input_stream = &std::cin;
       } else {
-        input_file.open(FLAGS_infile, std::ios::in | std::ios::binary);
+        input_file.open(absl::GetFlag(FLAGS_infile),
+                        std::ios::in | std::ios::binary);
         input_stream = &input_file;
       }
 
@@ -666,13 +675,13 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
       while (!request_text.empty() ||
              (!input_stream->eof() && getline(*input_stream, line))) {
         if (!request_text.empty()) {
-          if (FLAGS_binary_input) {
+          if (absl::GetFlag(FLAGS_binary_input)) {
             serialized_request_proto = request_text;
             request_text.clear();
           } else {
             serialized_request_proto = parser->GetSerializedProtoFromMethod(
                 method_name, request_text, true /* is_request */,
-                FLAGS_json_input);
+                absl::GetFlag(FLAGS_json_input));
             request_text.clear();
             if (parser->HasError()) {
               if (print_mode) {
@@ -687,7 +696,7 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
               server_initial_metadata, server_trailing_metadata;
           CliCall call(channel, formatted_method_name, client_metadata,
                        cli_args);
-          if (FLAGS_display_peer_address) {
+          if (absl::GetFlag(FLAGS_display_peer_address)) {
             fprintf(stderr,
                     "New call for method_name:%s has peer address:|%s|\n",
                     formatted_method_name.c_str(), call.peer().c_str());
@@ -709,14 +718,14 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
                             "Received trailing metadata from server:");
             }
 
-            if (FLAGS_binary_output) {
+            if (absl::GetFlag(FLAGS_binary_output)) {
               if (!callback(serialized_response_proto)) {
                 break;
               }
             } else {
               std::string response_text = parser->GetFormattedStringFromMethod(
                   method_name, serialized_response_proto,
-                  false /* is_request */, FLAGS_json_output);
+                  false /* is_request */, absl::GetFlag(FLAGS_json_output));
 
               if (parser->HasError() && print_mode) {
                 fprintf(stderr, "Failed to parse response.\n");
@@ -752,29 +761,31 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
     }
 
     if (argc == 3) {
-      if (!FLAGS_infile.empty()) {
+      if (!absl::GetFlag(FLAGS_infile).empty()) {
         fprintf(stderr, "warning: request given in argv, ignoring --infile\n");
       }
     } else {
       std::stringstream input_stream;
-      if (FLAGS_infile.empty()) {
+      if (absl::GetFlag(FLAGS_infile).empty()) {
         if (isatty(fileno(stdin))) {
           fprintf(stderr, "reading request message from stdin...\n");
         }
         input_stream << std::cin.rdbuf();
       } else {
-        std::ifstream input_file(FLAGS_infile, std::ios::in | std::ios::binary);
+        std::ifstream input_file(absl::GetFlag(FLAGS_infile),
+                                 std::ios::in | std::ios::binary);
         input_stream << input_file.rdbuf();
         input_file.close();
       }
       request_text = input_stream.str();
     }
 
-    if (FLAGS_binary_input) {
+    if (absl::GetFlag(FLAGS_binary_input)) {
       serialized_request_proto = request_text;
     } else {
       serialized_request_proto = parser->GetSerializedProtoFromMethod(
-          method_name, request_text, true /* is_request */, FLAGS_json_input);
+          method_name, request_text, true /* is_request */,
+          absl::GetFlag(FLAGS_json_input));
       if (parser->HasError()) {
         fprintf(stderr, "Failed to parse request.\n");
         return false;
@@ -790,7 +801,7 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
     PrintMetadata(client_metadata, "Sending client initial metadata:");
 
     CliCall call(channel, formatted_method_name, client_metadata, cli_args);
-    if (FLAGS_display_peer_address) {
+    if (absl::GetFlag(FLAGS_display_peer_address)) {
       fprintf(stderr, "New call for method_name:%s has peer address:|%s|\n",
               formatted_method_name.c_str(), call.peer().c_str());
     }
@@ -801,10 +812,10 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
              &serialized_response_proto,
              receive_initial_metadata ? &server_initial_metadata : nullptr);
          receive_initial_metadata = false) {
-      if (!FLAGS_binary_output) {
+      if (!absl::GetFlag(FLAGS_binary_output)) {
         serialized_response_proto = parser->GetFormattedStringFromMethod(
             method_name, serialized_response_proto, false /* is_request */,
-            FLAGS_json_output);
+            absl::GetFlag(FLAGS_json_output));
         if (parser->HasError()) {
           fprintf(stderr, "Failed to parse response.\n");
           return false;
@@ -836,7 +847,7 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
 
 bool GrpcTool::ParseMessage(int argc, const char** argv,
                             const CliCredentials& cred,
-                            GrpcToolOutputCallback callback) {
+                            const GrpcToolOutputCallback& callback) {
   CommandUsage(
       "Parse message\n"
       "  grpc_cli parse <address> <type> [<message>]\n"
@@ -866,30 +877,32 @@ bool GrpcTool::ParseMessage(int argc, const char** argv,
 
   if (argc == 3) {
     message_text = argv[2];
-    if (!FLAGS_infile.empty()) {
+    if (!absl::GetFlag(FLAGS_infile).empty()) {
       fprintf(stderr, "warning: message given in argv, ignoring --infile.\n");
     }
   } else {
     std::stringstream input_stream;
-    if (FLAGS_infile.empty()) {
+    if (absl::GetFlag(FLAGS_infile).empty()) {
       if (isatty(fileno(stdin))) {
         fprintf(stderr, "reading request message from stdin...\n");
       }
       input_stream << std::cin.rdbuf();
     } else {
-      std::ifstream input_file(FLAGS_infile, std::ios::in | std::ios::binary);
+      std::ifstream input_file(absl::GetFlag(FLAGS_infile),
+                               std::ios::in | std::ios::binary);
       input_stream << input_file.rdbuf();
       input_file.close();
     }
     message_text = input_stream.str();
   }
 
-  if (!FLAGS_binary_input || !FLAGS_binary_output) {
+  if (!absl::GetFlag(FLAGS_binary_input) ||
+      !absl::GetFlag(FLAGS_binary_output)) {
     std::shared_ptr<grpc::Channel> channel =
         CreateCliChannel(server_address, cred);
-    parser.reset(
-        new grpc::testing::ProtoFileParser(FLAGS_remotedb ? channel : nullptr,
-                                           FLAGS_proto_path, FLAGS_protofiles));
+    parser = absl::make_unique<grpc::testing::ProtoFileParser>(
+        absl::GetFlag(FLAGS_remotedb) ? channel : nullptr,
+        absl::GetFlag(FLAGS_proto_path), absl::GetFlag(FLAGS_protofiles));
     if (parser->HasError()) {
       fprintf(
           stderr,
@@ -898,23 +911,23 @@ bool GrpcTool::ParseMessage(int argc, const char** argv,
     }
   }
 
-  if (FLAGS_binary_input) {
+  if (absl::GetFlag(FLAGS_binary_input)) {
     serialized_request_proto = message_text;
   } else {
     serialized_request_proto = parser->GetSerializedProtoFromMessageType(
-        type_name, message_text, FLAGS_json_input);
+        type_name, message_text, absl::GetFlag(FLAGS_json_input));
     if (parser->HasError()) {
       fprintf(stderr, "Failed to serialize the message.\n");
       return false;
     }
   }
 
-  if (FLAGS_binary_output) {
+  if (absl::GetFlag(FLAGS_binary_output)) {
     output_ss << serialized_request_proto;
   } else {
     std::string output_text;
     output_text = parser->GetFormattedStringFromMessageType(
-        type_name, serialized_request_proto, FLAGS_json_output);
+        type_name, serialized_request_proto, absl::GetFlag(FLAGS_json_output));
     if (parser->HasError()) {
       fprintf(stderr, "Failed to deserialize the message.\n");
       return false;
@@ -927,7 +940,7 @@ bool GrpcTool::ParseMessage(int argc, const char** argv,
 }
 
 bool GrpcTool::ToText(int argc, const char** argv, const CliCredentials& cred,
-                      GrpcToolOutputCallback callback) {
+                      const GrpcToolOutputCallback& callback) {
   CommandUsage(
       "Convert binary message to text\n"
       "  grpc_cli totext <protofiles> <type>\n"
@@ -937,15 +950,15 @@ bool GrpcTool::ToText(int argc, const char** argv, const CliCredentials& cred,
       "    --infile                 ; Input filename (defaults to stdin)\n"
       "    --outfile                ; Output filename (defaults to stdout)\n");
 
-  FLAGS_protofiles = argv[0];
-  FLAGS_remotedb = false;
-  FLAGS_binary_input = true;
-  FLAGS_binary_output = false;
+  absl::SetFlag(&FLAGS_protofiles, argv[0]);
+  absl::SetFlag(&FLAGS_remotedb, false);
+  absl::SetFlag(&FLAGS_binary_input, true);
+  absl::SetFlag(&FLAGS_binary_output, false);
   return ParseMessage(argc, argv, cred, callback);
 }
 
 bool GrpcTool::ToJson(int argc, const char** argv, const CliCredentials& cred,
-                      GrpcToolOutputCallback callback) {
+                      const GrpcToolOutputCallback& callback) {
   CommandUsage(
       "Convert binary message to json\n"
       "  grpc_cli tojson <protofiles> <type>\n"
@@ -955,16 +968,16 @@ bool GrpcTool::ToJson(int argc, const char** argv, const CliCredentials& cred,
       "    --infile                 ; Input filename (defaults to stdin)\n"
       "    --outfile                ; Output filename (defaults to stdout)\n");
 
-  FLAGS_protofiles = argv[0];
-  FLAGS_remotedb = false;
-  FLAGS_binary_input = true;
-  FLAGS_binary_output = false;
-  FLAGS_json_output = true;
+  absl::SetFlag(&FLAGS_protofiles, argv[0]);
+  absl::SetFlag(&FLAGS_remotedb, false);
+  absl::SetFlag(&FLAGS_binary_input, true);
+  absl::SetFlag(&FLAGS_binary_output, false);
+  absl::SetFlag(&FLAGS_json_output, true);
   return ParseMessage(argc, argv, cred, callback);
 }
 
 bool GrpcTool::ToBinary(int argc, const char** argv, const CliCredentials& cred,
-                        GrpcToolOutputCallback callback) {
+                        const GrpcToolOutputCallback& callback) {
   CommandUsage(
       "Convert text message to binary\n"
       "  grpc_cli tobinary <protofiles> <type> [<message>]\n"
@@ -974,10 +987,10 @@ bool GrpcTool::ToBinary(int argc, const char** argv, const CliCredentials& cred,
       "    --infile                 ; Input filename (defaults to stdin)\n"
       "    --outfile                ; Output filename (defaults to stdout)\n");
 
-  FLAGS_protofiles = argv[0];
-  FLAGS_remotedb = false;
-  FLAGS_binary_input = false;
-  FLAGS_binary_output = true;
+  absl::SetFlag(&FLAGS_protofiles, argv[0]);
+  absl::SetFlag(&FLAGS_remotedb, false);
+  absl::SetFlag(&FLAGS_binary_input, false);
+  absl::SetFlag(&FLAGS_binary_output, true);
   return ParseMessage(argc, argv, cred, callback);
 }
 
index e998807..124ace3 100644 (file)
@@ -31,7 +31,7 @@ namespace testing {
 typedef std::function<bool(const std::string&)> GrpcToolOutputCallback;
 
 int GrpcToolMainLib(int argc, const char** argv, const CliCredentials& cred,
-                    GrpcToolOutputCallback callback);
+                    const GrpcToolOutputCallback& callback);
 
 }  // namespace testing
 }  // namespace grpc
index c57afed..bf4eeaf 100644 (file)
@@ -18,7 +18,6 @@
 
 #include "test/cpp/util/grpc_tool.h"
 
-#include <gflags/gflags.h>
 #include <grpc/grpc.h>
 #include <grpc/support/alloc.h>
 #include <grpcpp/channel.h>
@@ -33,6 +32,8 @@
 #include <chrono>
 #include <sstream>
 
+#include "absl/flags/declare.h"
+#include "absl/flags/flag.h"
 #include "src/core/lib/gpr/env.h"
 #include "src/core/lib/iomgr/load_file.h"
 #include "src/proto/grpc/testing/echo.grpc.pb.h"
@@ -110,24 +111,22 @@ using grpc::testing::EchoResponse;
   " }\n"                                  \
   "}\n\n"
 
-DECLARE_string(channel_creds_type);
-DECLARE_string(ssl_target);
+ABSL_DECLARE_FLAG(std::string, channel_creds_type);
+ABSL_DECLARE_FLAG(std::string, ssl_target);
+ABSL_DECLARE_FLAG(bool, binary_input);
+ABSL_DECLARE_FLAG(bool, binary_output);
+ABSL_DECLARE_FLAG(bool, json_input);
+ABSL_DECLARE_FLAG(bool, json_output);
+ABSL_DECLARE_FLAG(bool, l);
+ABSL_DECLARE_FLAG(bool, batch);
+ABSL_DECLARE_FLAG(std::string, metadata);
+ABSL_DECLARE_FLAG(std::string, protofiles);
+ABSL_DECLARE_FLAG(std::string, proto_path);
+ABSL_DECLARE_FLAG(std::string, default_service_config);
+ABSL_DECLARE_FLAG(double, timeout);
 
 namespace grpc {
 namespace testing {
-
-DECLARE_bool(binary_input);
-DECLARE_bool(binary_output);
-DECLARE_bool(json_input);
-DECLARE_bool(json_output);
-DECLARE_bool(l);
-DECLARE_bool(batch);
-DECLARE_string(metadata);
-DECLARE_string(protofiles);
-DECLARE_string(proto_path);
-DECLARE_string(default_service_config);
-DECLARE_double(timeout);
-
 namespace {
 
 const int kServerDefaultResponseStreamsToSend = 3;
@@ -204,7 +203,8 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
 
     // Returning string instead of bool to avoid using embedded messages in
     // proto3
-    response->set_message(seconds.count() <= FLAGS_timeout ? "true" : "false");
+    response->set_message(
+        seconds.count() <= absl::GetFlag(FLAGS_timeout) ? "true" : "false");
     return Status::OK;
   }
 
@@ -372,7 +372,7 @@ TEST_F(GrpcToolTest, ListCommand) {
   const std::string server_address = SetUpServer();
   const char* argv[] = {"grpc_cli", "ls", server_address.c_str()};
 
-  FLAGS_l = false;
+  absl::SetFlag(&FLAGS_l, false);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
@@ -391,7 +391,7 @@ TEST_F(GrpcToolTest, ListOneService) {
   const char* argv[] = {"grpc_cli", "ls", server_address.c_str(),
                         "grpc.testing.EchoTestService"};
   // without -l flag
-  FLAGS_l = false;
+  absl::SetFlag(&FLAGS_l, false);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
@@ -402,7 +402,7 @@ TEST_F(GrpcToolTest, ListOneService) {
   // with -l flag
   output_stream.str(std::string());
   output_stream.clear();
-  FLAGS_l = true;
+  absl::SetFlag(&FLAGS_l, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
@@ -442,7 +442,7 @@ TEST_F(GrpcToolTest, ListOneMethod) {
   const char* argv[] = {"grpc_cli", "ls", server_address.c_str(),
                         "grpc.testing.EchoTestService.Echo"};
   // without -l flag
-  FLAGS_l = false;
+  absl::SetFlag(&FLAGS_l, false);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
@@ -452,7 +452,7 @@ TEST_F(GrpcToolTest, ListOneMethod) {
   // with -l flag
   output_stream.str(std::string());
   output_stream.clear();
-  FLAGS_l = true;
+  absl::SetFlag(&FLAGS_l, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
@@ -496,11 +496,12 @@ TEST_F(GrpcToolTest, CallCommand) {
   output_stream.str(std::string());
   output_stream.clear();
 
-  FLAGS_json_output = true;
+  // TODO(Capstan): Consider using absl::FlagSaver
+  absl::SetFlag(&FLAGS_json_output, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_json_output = false;
+  absl::SetFlag(&FLAGS_json_output, false);
 
   // Expected output:
   // {
@@ -520,7 +521,7 @@ TEST_F(GrpcToolTest, CallCommandJsonInput) {
   const char* argv[] = {"grpc_cli", "call", server_address.c_str(), "Echo",
                         "{ \"message\": \"Hello\"}"};
 
-  FLAGS_json_input = true;
+  absl::SetFlag(&FLAGS_json_input, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
@@ -532,12 +533,12 @@ TEST_F(GrpcToolTest, CallCommandJsonInput) {
   output_stream.str(std::string());
   output_stream.clear();
 
-  FLAGS_json_output = true;
+  absl::SetFlag(&FLAGS_json_output, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_json_output = false;
-  FLAGS_json_input = false;
+  absl::SetFlag(&FLAGS_json_output, false);
+  absl::SetFlag(&FLAGS_json_input, false);
 
   // Expected output:
   // {
@@ -562,11 +563,11 @@ TEST_F(GrpcToolTest, CallCommandBatch) {
   std::istringstream ss("message: 'Hello1'\n\n message: 'Hello2'\n\n");
   std::cin.rdbuf(ss.rdbuf());
 
-  FLAGS_batch = true;
+  absl::SetFlag(&FLAGS_batch, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_batch = false;
+  absl::SetFlag(&FLAGS_batch, false);
 
   // Expected output: "message: "Hello0"\nmessage: "Hello1"\nmessage:
   // "Hello2"\n"
@@ -580,13 +581,13 @@ TEST_F(GrpcToolTest, CallCommandBatch) {
   ss.seekg(0);
   std::cin.rdbuf(ss.rdbuf());
 
-  FLAGS_batch = true;
-  FLAGS_json_output = true;
+  absl::SetFlag(&FLAGS_batch, true);
+  absl::SetFlag(&FLAGS_json_output, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_json_output = false;
-  FLAGS_batch = false;
+  absl::SetFlag(&FLAGS_json_output, false);
+  absl::SetFlag(&FLAGS_batch, false);
 
   // Expected output:
   // {
@@ -623,12 +624,12 @@ TEST_F(GrpcToolTest, CallCommandBatchJsonInput) {
       "{\"message\": \"Hello1\"}\n\n{\"message\": \"Hello2\" }\n\n");
   std::cin.rdbuf(ss.rdbuf());
 
-  FLAGS_json_input = true;
-  FLAGS_batch = true;
+  absl::SetFlag(&FLAGS_json_input, true);
+  absl::SetFlag(&FLAGS_batch, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_batch = false;
+  absl::SetFlag(&FLAGS_batch, false);
 
   // Expected output: "message: "Hello0"\nmessage: "Hello1"\nmessage:
   // "Hello2"\n"
@@ -642,14 +643,14 @@ TEST_F(GrpcToolTest, CallCommandBatchJsonInput) {
   ss.seekg(0);
   std::cin.rdbuf(ss.rdbuf());
 
-  FLAGS_batch = true;
-  FLAGS_json_output = true;
+  absl::SetFlag(&FLAGS_batch, true);
+  absl::SetFlag(&FLAGS_json_output, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_json_output = false;
-  FLAGS_batch = false;
-  FLAGS_json_input = false;
+  absl::SetFlag(&FLAGS_json_output, false);
+  absl::SetFlag(&FLAGS_batch, false);
+  absl::SetFlag(&FLAGS_json_input, false);
 
   // Expected output:
   // {
@@ -685,11 +686,11 @@ TEST_F(GrpcToolTest, CallCommandBatchWithBadRequest) {
   std::istringstream ss("message: 1\n\n message: 'Hello2'\n\n");
   std::cin.rdbuf(ss.rdbuf());
 
-  FLAGS_batch = true;
+  absl::SetFlag(&FLAGS_batch, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_batch = false;
+  absl::SetFlag(&FLAGS_batch, false);
 
   // Expected output: "message: "Hello0"\nmessage: "Hello2"\n"
   EXPECT_TRUE(nullptr != strstr(output_stream.str().c_str(),
@@ -702,13 +703,13 @@ TEST_F(GrpcToolTest, CallCommandBatchWithBadRequest) {
   ss.seekg(0);
   std::cin.rdbuf(ss.rdbuf());
 
-  FLAGS_batch = true;
-  FLAGS_json_output = true;
+  absl::SetFlag(&FLAGS_batch, true);
+  absl::SetFlag(&FLAGS_json_output, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_json_output = false;
-  FLAGS_batch = false;
+  absl::SetFlag(&FLAGS_json_output, false);
+  absl::SetFlag(&FLAGS_batch, false);
 
   // Expected output:
   // {
@@ -741,13 +742,13 @@ TEST_F(GrpcToolTest, CallCommandBatchJsonInputWithBadRequest) {
       "{ \"message\": 1 }\n\n { \"message\": \"Hello2\" }\n\n");
   std::cin.rdbuf(ss.rdbuf());
 
-  FLAGS_batch = true;
-  FLAGS_json_input = true;
+  absl::SetFlag(&FLAGS_batch, true);
+  absl::SetFlag(&FLAGS_json_input, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_json_input = false;
-  FLAGS_batch = false;
+  absl::SetFlag(&FLAGS_json_input, false);
+  absl::SetFlag(&FLAGS_batch, false);
 
   // Expected output: "message: "Hello0"\nmessage: "Hello2"\n"
   EXPECT_TRUE(nullptr != strstr(output_stream.str().c_str(),
@@ -760,15 +761,15 @@ TEST_F(GrpcToolTest, CallCommandBatchJsonInputWithBadRequest) {
   ss.seekg(0);
   std::cin.rdbuf(ss.rdbuf());
 
-  FLAGS_batch = true;
-  FLAGS_json_input = true;
-  FLAGS_json_output = true;
+  absl::SetFlag(&FLAGS_batch, true);
+  absl::SetFlag(&FLAGS_json_input, true);
+  absl::SetFlag(&FLAGS_json_output, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_json_output = false;
-  FLAGS_json_input = false;
-  FLAGS_batch = false;
+  absl::SetFlag(&FLAGS_json_output, false);
+  absl::SetFlag(&FLAGS_json_input, false);
+  absl::SetFlag(&FLAGS_batch, false);
 
   // Expected output:
   // {
@@ -827,11 +828,11 @@ TEST_F(GrpcToolTest, CallCommandRequestStreamJsonInput) {
       "{ \"message\": \"Hello1\" }\n\n{ \"message\": \"Hello2\" }\n\n");
   std::cin.rdbuf(ss.rdbuf());
 
-  FLAGS_json_input = true;
+  absl::SetFlag(&FLAGS_json_input, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_json_input = false;
+  absl::SetFlag(&FLAGS_json_input, false);
 
   // Expected output: "message: \"Hello0Hello1Hello2\""
   EXPECT_TRUE(nullptr != strstr(output_stream.str().c_str(),
@@ -880,11 +881,11 @@ TEST_F(GrpcToolTest, CallCommandRequestStreamWithBadRequestJsonInput) {
       "{ \"bad_field\": \"Hello1\" }\n\n{ \"message\": \"Hello2\" }\n\n");
   std::cin.rdbuf(ss.rdbuf());
 
-  FLAGS_json_input = true;
+  absl::SetFlag(&FLAGS_json_input, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_json_input = false;
+  absl::SetFlag(&FLAGS_json_input, false);
 
   // Expected output: "message: \"Hello0Hello2\""
   EXPECT_TRUE(nullptr !=
@@ -902,7 +903,7 @@ TEST_F(GrpcToolTest, CallCommandWithTimeoutDeadlineSet) {
                         "CheckDeadlineSet"};
 
   // Set timeout to 5000.25 seconds
-  FLAGS_timeout = 5000.25;
+  absl::SetFlag(&FLAGS_timeout, 5000.25);
 
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
@@ -923,7 +924,7 @@ TEST_F(GrpcToolTest, CallCommandWithTimeoutDeadlineUpperBound) {
                         "CheckDeadlineUpperBound"};
 
   // Set timeout to 900 seconds
-  FLAGS_timeout = 900;
+  absl::SetFlag(&FLAGS_timeout, 900);
 
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
@@ -945,7 +946,7 @@ TEST_F(GrpcToolTest, CallCommandWithNegativeTimeoutValue) {
                         "CheckDeadlineSet"};
 
   // Set timeout to -5 (deadline not set)
-  FLAGS_timeout = -5;
+  absl::SetFlag(&FLAGS_timeout, -5);
 
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
@@ -967,7 +968,7 @@ TEST_F(GrpcToolTest, CallCommandWithDefaultTimeoutValue) {
                         "CheckDeadlineSet"};
 
   // Set timeout to -1 (default value, deadline not set)
-  FLAGS_timeout = -1;
+  absl::SetFlag(&FLAGS_timeout, -1);
 
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
@@ -1005,11 +1006,11 @@ TEST_F(GrpcToolTest, CallCommandResponseStream) {
   output_stream.str(std::string());
   output_stream.clear();
 
-  FLAGS_json_output = true;
+  absl::SetFlag(&FLAGS_json_output, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_json_output = false;
+  absl::SetFlag(&FLAGS_json_output, false);
 
   // Expected output: "{\n \"message\": \"Hello{n}\"\n}\n"
   for (int i = 0; i < kServerDefaultResponseStreamsToSend; i++) {
@@ -1085,8 +1086,8 @@ TEST_F(GrpcToolTest, ParseCommand) {
                         "grpc.testing.EchoResponse",
                         ECHO_RESPONSE_MESSAGE_TEXT_FORMAT};
 
-  FLAGS_binary_input = false;
-  FLAGS_binary_output = false;
+  absl::SetFlag(&FLAGS_binary_input, false);
+  absl::SetFlag(&FLAGS_binary_output, false);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
@@ -1098,11 +1099,11 @@ TEST_F(GrpcToolTest, ParseCommand) {
   output_stream.str(std::string());
   output_stream.clear();
 
-  FLAGS_json_output = true;
+  absl::SetFlag(&FLAGS_json_output, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_json_output = false;
+  absl::SetFlag(&FLAGS_json_output, false);
 
   // Expected output: ECHO_RESPONSE_MESSAGE_JSON_FORMAT
   EXPECT_TRUE(0 == strcmp(output_stream.str().c_str(),
@@ -1111,7 +1112,7 @@ TEST_F(GrpcToolTest, ParseCommand) {
   // Parse text message to binary message and then parse it back to text message
   output_stream.str(std::string());
   output_stream.clear();
-  FLAGS_binary_output = true;
+  absl::SetFlag(&FLAGS_binary_output, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
@@ -1119,8 +1120,8 @@ TEST_F(GrpcToolTest, ParseCommand) {
   output_stream.str(std::string());
   output_stream.clear();
   argv[4] = binary_data.c_str();
-  FLAGS_binary_input = true;
-  FLAGS_binary_output = false;
+  absl::SetFlag(&FLAGS_binary_input, true);
+  absl::SetFlag(&FLAGS_binary_output, false);
   EXPECT_TRUE(0 == GrpcToolMainLib(5, argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
@@ -1129,8 +1130,8 @@ TEST_F(GrpcToolTest, ParseCommand) {
   EXPECT_TRUE(0 == strcmp(output_stream.str().c_str(),
                           ECHO_RESPONSE_MESSAGE_TEXT_FORMAT));
 
-  FLAGS_binary_input = false;
-  FLAGS_binary_output = false;
+  absl::SetFlag(&FLAGS_binary_input, false);
+  absl::SetFlag(&FLAGS_binary_output, false);
   ShutdownServer();
 }
 
@@ -1145,7 +1146,7 @@ TEST_F(GrpcToolTest, ParseCommandJsonFormat) {
                         "grpc.testing.EchoResponse",
                         ECHO_RESPONSE_MESSAGE_JSON_FORMAT};
 
-  FLAGS_json_input = true;
+  absl::SetFlag(&FLAGS_json_input, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
@@ -1158,12 +1159,12 @@ TEST_F(GrpcToolTest, ParseCommandJsonFormat) {
   output_stream.str(std::string());
   output_stream.clear();
 
-  FLAGS_json_output = true;
+  absl::SetFlag(&FLAGS_json_output, true);
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_json_output = false;
-  FLAGS_json_input = false;
+  absl::SetFlag(&FLAGS_json_output, false);
+  absl::SetFlag(&FLAGS_json_input, false);
 
   // Expected output: ECHO_RESPONSE_MESSAGE_JSON_FORMAT
   EXPECT_TRUE(0 == strcmp(output_stream.str().c_str(),
@@ -1211,7 +1212,7 @@ TEST_F(GrpcToolTest, CallCommandWithMetadata) {
 
   {
     std::stringstream output_stream;
-    FLAGS_metadata = "key0:val0:key1:valq:key2:val2";
+    absl::SetFlag(&FLAGS_metadata, "key0:val0:key1:valq:key2:val2");
     EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv,
                                      TestCliCredentials(),
                                      std::bind(PrintStream, &output_stream,
@@ -1223,7 +1224,7 @@ TEST_F(GrpcToolTest, CallCommandWithMetadata) {
 
   {
     std::stringstream output_stream;
-    FLAGS_metadata = "key:val\\:val";
+    absl::SetFlag(&FLAGS_metadata, "key:val\\:val");
     EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv,
                                      TestCliCredentials(),
                                      std::bind(PrintStream, &output_stream,
@@ -1235,7 +1236,7 @@ TEST_F(GrpcToolTest, CallCommandWithMetadata) {
 
   {
     std::stringstream output_stream;
-    FLAGS_metadata = "key:val\\\\val";
+    absl::SetFlag(&FLAGS_metadata, "key:val\\\\val");
     EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv,
                                      TestCliCredentials(),
                                      std::bind(PrintStream, &output_stream,
@@ -1245,7 +1246,7 @@ TEST_F(GrpcToolTest, CallCommandWithMetadata) {
                 strstr(output_stream.str().c_str(), "message: \"Hello\""));
   }
 
-  FLAGS_metadata = "";
+  absl::SetFlag(&FLAGS_metadata, "");
   ShutdownServer();
 }
 
@@ -1254,15 +1255,16 @@ TEST_F(GrpcToolTest, CallCommandWithBadMetadata) {
   const char* argv[] = {"grpc_cli", "call", "localhost:10000",
                         "grpc.testing.EchoTestService.Echo",
                         "message: 'Hello'"};
-  FLAGS_protofiles = "src/proto/grpc/testing/echo.proto";
+  absl::SetFlag(&FLAGS_protofiles, "src/proto/grpc/testing/echo.proto");
   char* test_srcdir = gpr_getenv("TEST_SRCDIR");
   if (test_srcdir != nullptr) {
-    FLAGS_proto_path = test_srcdir + std::string("/com_github_grpc_grpc");
+    absl::SetFlag(&FLAGS_proto_path,
+                  test_srcdir + std::string("/com_github_grpc_grpc"));
   }
 
   {
     std::stringstream output_stream;
-    FLAGS_metadata = "key0:val0:key1";
+    absl::SetFlag(&FLAGS_metadata, "key0:val0:key1");
     // Exit with 1
     EXPECT_EXIT(
         GrpcToolMainLib(
@@ -1273,7 +1275,7 @@ TEST_F(GrpcToolTest, CallCommandWithBadMetadata) {
 
   {
     std::stringstream output_stream;
-    FLAGS_metadata = "key:val\\val";
+    absl::SetFlag(&FLAGS_metadata, "key:val\\val");
     // Exit with 1
     EXPECT_EXIT(
         GrpcToolMainLib(
@@ -1282,8 +1284,8 @@ TEST_F(GrpcToolTest, CallCommandWithBadMetadata) {
         ::testing::ExitedWithCode(1), ".*Failed to parse metadata flag.*");
   }
 
-  FLAGS_metadata = "";
-  FLAGS_protofiles = "";
+  absl::SetFlag(&FLAGS_metadata, "");
+  absl::SetFlag(&FLAGS_protofiles, "");
 
   gpr_free(test_srcdir);
 }
@@ -1295,9 +1297,9 @@ TEST_F(GrpcToolTest, ListCommand_OverrideSslHostName) {
   // --ssl_target=z.test.google.fr"
   std::stringstream output_stream;
   const char* argv[] = {"grpc_cli", "ls", server_address.c_str()};
-  FLAGS_l = false;
-  FLAGS_channel_creds_type = "ssl";
-  FLAGS_ssl_target = "z.test.google.fr";
+  absl::SetFlag(&FLAGS_l, false);
+  absl::SetFlag(&FLAGS_channel_creds_type, "ssl");
+  absl::SetFlag(&FLAGS_ssl_target, "z.test.google.fr");
   EXPECT_TRUE(
       0 == GrpcToolMainLib(
                ArraySize(argv), argv, TestCliCredentials(true),
@@ -1306,8 +1308,8 @@ TEST_F(GrpcToolTest, ListCommand_OverrideSslHostName) {
                           "grpc.testing.EchoTestService\n"
                           "grpc.reflection.v1alpha.ServerReflection\n"));
 
-  FLAGS_channel_creds_type = "";
-  FLAGS_ssl_target = "";
+  absl::SetFlag(&FLAGS_channel_creds_type, "");
+  absl::SetFlag(&FLAGS_ssl_target, "");
   ShutdownServer();
 }
 
@@ -1320,13 +1322,13 @@ TEST_F(GrpcToolTest, ConfiguringDefaultServiceConfig) {
   // Just check that the tool is still operational when --default_service_config
   // is configured. This particular service config is in reality redundant with
   // the channel's default configuration.
-  FLAGS_l = false;
-  FLAGS_default_service_config =
-      "{\"loadBalancingConfig\":[{\"pick_first\":{}}]}";
+  absl::SetFlag(&FLAGS_l, false);
+  absl::SetFlag(&FLAGS_default_service_config,
+                "{\"loadBalancingConfig\":[{\"pick_first\":{}}]}");
   EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
-  FLAGS_default_service_config = "";
+  absl::SetFlag(&FLAGS_default_service_config, "");
   EXPECT_TRUE(0 == strcmp(output_stream.str().c_str(),
                           "grpc.testing.EchoTestService\n"
                           "grpc.reflection.v1alpha.ServerReflection\n"));
index 89ec917..a4f9b05 100644 (file)
@@ -23,6 +23,8 @@
 #include <sstream>
 #include <unordered_set>
 
+#include "absl/memory/memory.h"
+
 #include <grpcpp/support/config.h>
 
 namespace grpc {
@@ -70,16 +72,17 @@ ProtoFileParser::ProtoFileParser(const std::shared_ptr<grpc::Channel>& channel,
       dynamic_factory_(new protobuf::DynamicMessageFactory()) {
   std::vector<std::string> service_list;
   if (channel) {
-    reflection_db_.reset(new grpc::ProtoReflectionDescriptorDatabase(channel));
+    reflection_db_ =
+        absl::make_unique<grpc::ProtoReflectionDescriptorDatabase>(channel);
     reflection_db_->GetServices(&service_list);
   }
 
   std::unordered_set<std::string> known_services;
   if (!protofiles.empty()) {
     source_tree_.MapPath("", proto_path);
-    error_printer_.reset(new ErrorPrinter(this));
-    importer_.reset(
-        new protobuf::compiler::Importer(&source_tree_, error_printer_.get()));
+    error_printer_ = absl::make_unique<ErrorPrinter>(this);
+    importer_ = absl::make_unique<protobuf::compiler::Importer>(
+        &source_tree_, error_printer_.get());
 
     std::string file_name;
     std::stringstream ss(protofiles);
@@ -95,7 +98,8 @@ ProtoFileParser::ProtoFileParser(const std::shared_ptr<grpc::Channel>& channel,
       }
     }
 
-    file_db_.reset(new protobuf::DescriptorPoolDatabase(*importer_->pool()));
+    file_db_ =
+        absl::make_unique<protobuf::DescriptorPoolDatabase>(*importer_->pool());
   }
 
   if (!reflection_db_ && !file_db_) {
@@ -108,11 +112,11 @@ ProtoFileParser::ProtoFileParser(const std::shared_ptr<grpc::Channel>& channel,
   } else if (!file_db_) {
     desc_db_ = std::move(reflection_db_);
   } else {
-    desc_db_.reset(new protobuf::MergedDescriptorDatabase(reflection_db_.get(),
-                                                          file_db_.get()));
+    desc_db_ = absl::make_unique<protobuf::MergedDescriptorDatabase>(
+        reflection_db_.get(), file_db_.get());
   }
 
-  desc_pool_.reset(new protobuf::DescriptorPool(desc_db_.get()));
+  desc_pool_ = absl::make_unique<protobuf::DescriptorPool>(desc_db_.get());
 
   for (auto it = service_list.begin(); it != service_list.end(); it++) {
     if (known_services.find(*it) == known_services.end()) {
@@ -298,14 +302,14 @@ std::string ProtoFileParser::GetFormattedStringFromMessageType(
   if (is_json_format) {
     grpc::protobuf::json::JsonPrintOptions jsonPrintOptions;
     jsonPrintOptions.add_whitespace = true;
-    if (!grpc::protobuf::json::MessageToJsonString(
-             *msg.get(), &formatted_string, jsonPrintOptions)
+    if (!grpc::protobuf::json::MessageToJsonString(*msg, &formatted_string,
+                                                   jsonPrintOptions)
              .ok()) {
       LogError("Failed to print proto message to json format");
       return "";
     }
   } else {
-    if (!protobuf::TextFormat::PrintToString(*msg.get(), &formatted_string)) {
+    if (!protobuf::TextFormat::PrintToString(*msg, &formatted_string)) {
       LogError("Failed to print proto message to text format");
       return "";
     }
index a1ceead..c6dc62f 100644 (file)
@@ -40,7 +40,7 @@ class ProtoReflectionDescriptorDatabase : public protobuf::DescriptorDatabase {
   explicit ProtoReflectionDescriptorDatabase(
       const std::shared_ptr<grpc::Channel>& channel);
 
-  virtual ~ProtoReflectionDescriptorDatabase();
+  ~ProtoReflectionDescriptorDatabase() override;
 
   // The following four methods implement DescriptorDatabase interfaces.
   //
index b191e5e..aa27a0e 100644 (file)
@@ -94,13 +94,14 @@ TEST_F(SliceTest, SliceNewWithUserData) {
   auto* t = new stest;
   t->x = new char[strlen(kContent) + 1];
   strcpy(t->x, kContent);
-  Slice spp(t->x, strlen(t->x),
-            [](void* p) {
-              auto* t = static_cast<stest*>(p);
-              delete[] t->x;
-              delete t;
-            },
-            t);
+  Slice spp(
+      t->x, strlen(t->x),
+      [](void* p) {
+        auto* t = static_cast<stest*>(p);
+        delete[] t->x;
+        delete t;
+      },
+      t);
   CheckSlice(spp, kContent);
 }
 
index e4b6886..d7d065c 100644 (file)
  *
  */
 
-#include <gflags/gflags.h>
-#include "test/cpp/util/test_config.h"
+#include <vector>
 
-// In some distros, gflags is in the namespace google, and in some others,
-// in gflags. This hack is enabling us to find both.
-namespace google {}
-namespace gflags {}
-using namespace google;
-using namespace gflags;
+#include "absl/flags/parse.h"
+#include "test/cpp/util/test_config.h"
 
 namespace grpc {
 namespace testing {
 
 void InitTest(int* argc, char*** argv, bool remove_flags) {
-  ParseCommandLineFlags(argc, argv, remove_flags);
+  std::vector<char*> reduced_argv = absl::ParseCommandLine(*argc, *argv);
+  if (remove_flags) {
+    *argc = reduced_argv.size();
+    for (int i = 0; i < *argc; i++) {
+      (*argv)[i] = reduced_argv.at(i);
+    }
+  }
 }
 
 }  // namespace testing
index 43da234..6ac7798 100644 (file)
 
 #include "test/cpp/util/test_credentials_provider.h"
 
+#include <grpc/support/log.h>
+#include <grpc/support/sync.h>
+#include <grpcpp/security/server_credentials.h>
+
 #include <cstdio>
 #include <fstream>
 #include <iostream>
-
 #include <mutex>
 #include <unordered_map>
 
-#include <gflags/gflags.h>
-#include <grpc/support/log.h>
-#include <grpc/support/sync.h>
-#include <grpcpp/security/server_credentials.h>
-
+#include "absl/flags/flag.h"
 #include "test/core/end2end/data/ssl_test_data.h"
 
-DEFINE_string(tls_cert_file, "", "The TLS cert file used when --use_tls=true");
-DEFINE_string(tls_key_file, "", "The TLS key file used when --use_tls=true");
+ABSL_FLAG(std::string, tls_cert_file, "",
+          "The TLS cert file used when --use_tls=true");
+ABSL_FLAG(std::string, tls_key_file, "",
+          "The TLS key file used when --use_tls=true");
 
 namespace grpc {
 namespace testing {
@@ -56,11 +57,11 @@ std::string ReadFile(const std::string& src_path) {
 class DefaultCredentialsProvider : public CredentialsProvider {
  public:
   DefaultCredentialsProvider() {
-    if (!FLAGS_tls_key_file.empty()) {
-      custom_server_key_ = ReadFile(FLAGS_tls_key_file);
+    if (!absl::GetFlag(FLAGS_tls_key_file).empty()) {
+      custom_server_key_ = ReadFile(absl::GetFlag(FLAGS_tls_key_file));
     }
-    if (!FLAGS_tls_cert_file.empty()) {
-      custom_server_cert_ = ReadFile(FLAGS_tls_cert_file);
+    if (!absl::GetFlag(FLAGS_tls_cert_file).empty()) {
+      custom_server_cert_ = ReadFile(absl::GetFlag(FLAGS_tls_cert_file));
     }
   }
   ~DefaultCredentialsProvider() override {}
index bcbfa14..a64bec7 100644 (file)
@@ -22,7 +22,6 @@
 
 #include "test/core/util/test_config.h"
 
-using std::chrono::duration_cast;
 using std::chrono::microseconds;
 using std::chrono::system_clock;
 
index 7ef1d2e..1729f2d 100755 (executable)
@@ -26,7 +26,6 @@ apt-get update && apt-get install -y libssl-dev
 rm -r third_party/benchmark/* || true
 rm -r third_party/bloaty/* || true
 rm -r third_party/boringssl-with-bazel/* || true
-rm -r third_party/gflags/* || true
 rm -r third_party/googletest/* || true
 
 # Build helloworld example using cmake superbuild
index 5b14fff..84a01bd 100644 (file)
@@ -2,7 +2,14 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFrameworks>net45;netcoreapp2.1</TargetFrameworks>
+
+    <!-- set TargetFrameworks, but allow skipping selected frameworks by setting env variables -->
+    <TargetFrameworks></TargetFrameworks>
+    <TargetFrameworks Condition="'$(SKIP_NET45_DISTRIBTEST)' == ''">$(TargetFrameworks);net45</TargetFrameworks>
+    <TargetFrameworks Condition="'$(SKIP_NETCOREAPP21_DISTRIBTEST)' == ''">$(TargetFrameworks);netcoreapp2.1</TargetFrameworks>
+    <TargetFrameworks Condition="'$(SKIP_NETCOREAPP31_DISTRIBTEST)' == ''">$(TargetFrameworks);netcoreapp3.1</TargetFrameworks>
+    <TargetFrameworks Condition="'$(SKIP_NET50_DISTRIBTEST)' == ''">$(TargetFrameworks);net5.0</TargetFrameworks>
+
     <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
     <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
     <GenerateAssemblyDescriptionAttribute>false</GenerateAssemblyDescriptionAttribute>
index e326e3a..69257ed 100755 (executable)
@@ -28,13 +28,13 @@ cd DistribTest
 dotnet restore DistribTestDotNet.csproj
 
 dotnet build DistribTestDotNet.csproj
-dotnet publish -f netcoreapp2.1 DistribTestDotNet.csproj
-dotnet publish -f net45 DistribTestDotNet.csproj
 
 ls -R bin
 
-if [ "${SKIP_MONO_DISTRIBTEST}" != "1" ]
+if [ "${SKIP_NET45_DISTRIBTEST}" != "1" ]
 then
+  dotnet publish -f net45 DistribTestDotNet.csproj
+
   # .NET 4.5 target after dotnet build
   mono bin/Debug/net45/publish/DistribTestDotNet.exe
 
@@ -42,8 +42,40 @@ then
   mono bin/Debug/net45/publish/DistribTestDotNet.exe
 fi
 
-# .NET Core target after dotnet build
-dotnet exec bin/Debug/netcoreapp2.1/DistribTestDotNet.dll
+if [ "${SKIP_NETCOREAPP21_DISTRIBTEST}" != "1" ]
+then
+  dotnet publish -f netcoreapp2.1 DistribTestDotNet.csproj
+
+  # .NET Core target after dotnet build
+  dotnet exec bin/Debug/netcoreapp2.1/DistribTestDotNet.dll
+
+  # .NET Core target after dotnet publish
+  dotnet exec bin/Debug/netcoreapp2.1/publish/DistribTestDotNet.dll
+fi
+
+if [ "${SKIP_NETCOREAPP31_DISTRIBTEST}" != "1" ]
+then
+  dotnet publish -f netcoreapp3.1 DistribTestDotNet.csproj
+
+  # .NET Core target after dotnet build
+  dotnet exec bin/Debug/netcoreapp3.1/DistribTestDotNet.dll
+
+  # .NET Core target after dotnet publish
+  dotnet exec bin/Debug/netcoreapp3.1/publish/DistribTestDotNet.dll
+fi
+
+if [ "${SKIP_NET50_DISTRIBTEST}" != "1" ]
+then
+  dotnet publish -f net5.0 DistribTestDotNet.csproj
+
+  dotnet publish -r linux-x64 -f net5.0 DistribTestDotNet.csproj -p:PublishSingleFile=true --self-contained true --output net5_singlefile_publish
+
+  # .NET Core target after dotnet build
+  dotnet exec bin/Debug/net5.0/DistribTestDotNet.dll
 
-# .NET Core target after dotnet publish
-dotnet exec bin/Debug/netcoreapp2.1/publish/DistribTestDotNet.dll
+  # .NET Core target after dotnet publish
+  dotnet exec bin/Debug/net5.0/publish/DistribTestDotNet.dll
+
+  # binary generated by the single file publish
+  ./net5_singlefile_publish/DistribTestDotNet
+fi
index c047f0c..616030b 100644 (file)
@@ -113,6 +113,7 @@ cc_library(
         "ares__get_hostent.c",
         "ares__read_line.c",
         "ares__timeval.c",
+        "ares_android.c",
         "ares_cancel.c",
         "ares_create_query.c",
         "ares_data.c",
@@ -162,6 +163,7 @@ cc_library(
     ],
     hdrs = [
         "ares.h",
+        "ares_android.h",
         "ares_build.h",
         "ares_config.h",
         "ares_data.h",
index 02795e4..8948e91 100644 (file)
@@ -40,11 +40,9 @@ build:asan_macos --copt=-fsanitize=address
 build:asan_macos --copt=-O0
 build:asan_macos --copt=-fno-omit-frame-pointer
 build:asan_macos --copt=-DGPR_NO_DIRECT_SYSCALLS
-build:asan_macos --copt=-DADDRESS_SANITIZER  # used by absl
 build:asan_macos --linkopt=-fsanitize=address
 build:asan_macos --action_env=ASAN_OPTIONS=detect_leaks=0
 
-
 build:msan --strip=never
 build:msan --copt=-fsanitize=memory
 build:msan --copt=-O0
@@ -52,7 +50,6 @@ build:msan --copt=-fsanitize-memory-track-origins
 build:msan --copt=-fsanitize-memory-use-after-dtor
 build:msan --copt=-fno-omit-frame-pointer
 build:msan --copt=-DGPR_NO_DIRECT_SYSCALLS
-build:msan --copt=-DMEMORY_SANITIZER  # used by absl
 build:msan --linkopt=-fsanitize=memory
 build:msan --action_env=MSAN_OPTIONS=poison_in_dtor=1
 
@@ -61,9 +58,10 @@ build:tsan --copt=-fsanitize=thread
 build:tsan --copt=-fno-omit-frame-pointer
 build:tsan --copt=-DGPR_NO_DIRECT_SYSCALLS
 build:tsan --copt=-DGRPC_TSAN
-# TODO(jtattermusch): ideally we would set --copt=-DTHREAD_SANITIZER (used by absl)
-# but it seems to do more harm than good and triggers #17175
 build:tsan --linkopt=-fsanitize=thread
+# This is needed to address false positive problem with abseil.
+# https://github.com/google/sanitizers/issues/953
+build:tsan --test_env=TSAN_OPTIONS=report_atomic_races=0
 build:tsan --action_env=TSAN_OPTIONS=suppressions=test/core/util/tsan_suppressions.txt:halt_on_error=1:second_deadlock_stack=1
 
 build:ubsan --strip=never
@@ -71,7 +69,6 @@ build:ubsan --copt=-fsanitize=undefined
 build:ubsan --copt=-fno-omit-frame-pointer
 build:ubsan --copt=-DGRPC_UBSAN
 build:ubsan --copt=-DNDEBUG
-build:ubsan --copt=-DUNDEFINED_BEHAVIOR_SANITIZER  # used by absl
 build:ubsan --copt=-fno-sanitize=function,vptr
 build:ubsan --linkopt=-fsanitize=undefined
 build:ubsan --action_env=UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1:suppressions=test/core/util/ubsan_suppressions.txt
@@ -103,3 +100,6 @@ build:mutrace --copt=-O3
 build:mutrace --copt=-fno-omit-frame-pointer
 build:mutrace --copt=-DNDEBUG
 build:mutrace --linkopt=-rdynamic
+
+# Compile database generation config
+build:compdb --build_tag_filters=-nocompdb
index 4be078f..cda6f71 100755 (executable)
@@ -32,7 +32,8 @@ _ELEM_KEYS = [
 
 
 def repr_ordered_dict(dumper, odict):
-    return dumper.represent_mapping(u'tag:yaml.org,2002:map', odict.items())
+    return dumper.represent_mapping('tag:yaml.org,2002:map',
+                                    list(odict.items()))
 
 
 yaml.add_representer(collections.OrderedDict, repr_ordered_dict)
index 228a8e2..63f8e2e 100755 (executable)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+# Script to extract build metadata from bazel BUILD.
+# To avoid having two sources of truth for the build metadata (build
+# targets, source files, header files etc.), this script analyzes the contents
+# of bazel BUILD files and generates a YAML file (currently called
+# build_autogenerated.yaml). The format and semantics of the generated YAML files
+# is chosen to match the format of a "build.yaml" file, which used
+# to be build the source of truth for gRPC build before bazel became
+# the primary build system.
+# A good basic overview of the "build.yaml" format is available here:
+# https://github.com/grpc/grpc/blob/master/templates/README.md. Note that
+# while useful as an overview, the doc does not act as formal spec
+# (formal spec does not exist in fact) and the doc can be incomplete,
+# inaccurate or slightly out of date.
+# TODO(jtattermusch): In the future we want to get rid of the legacy build.yaml
+# format entirely or simplify it to a point where it becomes self-explanatory
+# and doesn't need any detailed documentation.
+
 import subprocess
 import yaml
 import xml.etree.ElementTree as ET
@@ -32,6 +49,7 @@ def _bazel_query_xml_tree(query):
 
 
 def _rule_dict_from_xml_node(rule_xml_node):
+    """Converts XML node representing a rule (obtained from "bazel query --output xml") to a dictionary that contains all the metadata we will need."""
     result = {
         'class': rule_xml_node.attrib.get('class'),
         'name': rule_xml_node.attrib.get('name'),
@@ -63,6 +81,7 @@ def _rule_dict_from_xml_node(rule_xml_node):
 
 
 def _extract_rules_from_bazel_xml(xml_tree):
+    """Extract bazel rules from an XML tree node obtained from "bazel query --output xml" command."""
     result = {}
     for child in xml_tree:
         if child.tag == 'rule':
@@ -133,8 +152,13 @@ def _extract_deps(bazel_rule):
 
 
 def _create_target_from_bazel_rule(target_name, bazel_rules):
-    # extract the deps from bazel
+    """Create build.yaml-like target definition from bazel metadata"""
     bazel_rule = bazel_rules[_get_bazel_label(target_name)]
+
+    # Create a template for our target from the bazel rule. Initially we only
+    # populate some "private" fields with the original info we got from bazel
+    # and only later we will populate the public fields (once we do some extra
+    # postprocessing).
     result = {
         'name': target_name,
         '_PUBLIC_HEADERS_BAZEL': _extract_public_headers(bazel_rule),
@@ -152,7 +176,8 @@ def _sort_by_build_order(lib_names, lib_dict, deps_key_name, verbose=False):
 
     # all libs that are not in the dictionary are considered external.
     external_deps = list(
-        sorted(filter(lambda lib_name: lib_name not in lib_dict, lib_names)))
+        sorted([lib_name for lib_name in lib_names if lib_name not in lib_dict
+               ]))
     if verbose:
         print('topo_ordering ' + str(lib_names))
         print('    external_deps ' + str(external_deps))
@@ -183,12 +208,12 @@ def _sort_by_build_order(lib_names, lib_dict, deps_key_name, verbose=False):
 def _populate_transitive_deps(bazel_rules):
     """Add 'transitive_deps' field for each of the rules"""
     transitive_deps = {}
-    for rule_name in bazel_rules.iterkeys():
+    for rule_name in bazel_rules.keys():
         transitive_deps[rule_name] = set(bazel_rules[rule_name]['deps'])
 
     while True:
         deps_added = 0
-        for rule_name in bazel_rules.iterkeys():
+        for rule_name in bazel_rules.keys():
             old_deps = transitive_deps[rule_name]
             new_deps = set(old_deps)
             for dep_name in old_deps:
@@ -199,7 +224,7 @@ def _populate_transitive_deps(bazel_rules):
         if deps_added == 0:
             break
 
-    for rule_name, bazel_rule in bazel_rules.iteritems():
+    for rule_name, bazel_rule in bazel_rules.items():
         bazel_rule['transitive_deps'] = list(sorted(transitive_deps[rule_name]))
 
 
@@ -214,7 +239,7 @@ def _external_dep_name_from_bazel_dependency(bazel_dep):
     elif bazel_dep == '//external:benchmark':
         return 'benchmark'
     else:
-        # all the other external deps such as gflags, protobuf, cares, zlib
+        # all the other external deps such as protobuf, cares, zlib
         # don't need to be listed explicitly, they are handled automatically
         # by the build system (make, cmake)
         return None
@@ -312,22 +337,37 @@ def _expand_intermediate_deps(target_dict, public_dep_names, bazel_rules):
 
 
 def _generate_build_metadata(build_extra_metadata, bazel_rules):
-    lib_names = build_extra_metadata.keys()
+    """Generate build metadata in build.yaml-like format bazel build metadata and build.yaml-specific "extra metadata"."""
+    lib_names = list(build_extra_metadata.keys())
     result = {}
 
     for lib_name in lib_names:
         lib_dict = _create_target_from_bazel_rule(lib_name, bazel_rules)
 
+        # Figure out the final list of headers and sources for given target.
+        # While this is mostly based on bazel build metadata, build.yaml does
+        # not necessarily expose all the targets that are present in bazel build.
+        # These "intermediate dependencies" might get flattened.
+        # TODO(jtattermusch): This is done to avoid introducing too many intermediate
+        # libraries into the build.yaml-based builds (which might in cause issues
+        # building language-specific artifacts) and also because the libraries
+        # in build.yaml-based build are generally considered units of distributions
+        # (= public libraries that are visible to the user and are installable),
+        # while in bazel builds it is customary to define larger number of smaller
+        # "sublibraries". The need for elision (and expansion)
+        # of intermediate libraries can be re-evaluated in the future.
         _expand_intermediate_deps(lib_dict, lib_names, bazel_rules)
 
-        # populate extra properties from build metadata
+        # populate extra properties from the build.yaml-specific "extra metadata"
         lib_dict.update(build_extra_metadata.get(lib_name, {}))
 
         # store to results
         result[lib_name] = lib_dict
 
-    # rename some targets to something else
-    # this needs to be made after we're done with most of processing logic
+    # Rename targets marked with "_RENAME" extra metadata.
+    # This is mostly a cosmetic change to ensure that we end up with build.yaml target
+    # names we're used to from the past (and also to avoid too long target names).
+    # The rename step needs to be made after we're done with most of processing logic
     # otherwise the already-renamed libraries will have different names than expected
     for lib_name in lib_names:
         to_name = build_extra_metadata.get(lib_name, {}).get('_RENAME', None)
@@ -342,12 +382,13 @@ def _generate_build_metadata(build_extra_metadata, bazel_rules):
 
             # dep names need to be updated as well
             for lib_dict_to_update in result.values():
-                lib_dict_to_update['deps'] = list(
-                    map(lambda dep: to_name if dep == lib_name else dep,
-                        lib_dict_to_update['deps']))
+                lib_dict_to_update['deps'] = list([
+                    to_name if dep == lib_name else dep
+                    for dep in lib_dict_to_update['deps']
+                ])
 
     # make sure deps are listed in reverse topological order (e.g. "grpc gpr" and not "gpr grpc")
-    for lib_dict in result.itervalues():
+    for lib_dict in result.values():
         lib_dict['deps'] = list(
             reversed(_sort_by_build_order(lib_dict['deps'], result, 'deps')))
 
@@ -355,36 +396,35 @@ def _generate_build_metadata(build_extra_metadata, bazel_rules):
 
 
 def _convert_to_build_yaml_like(lib_dict):
-    lib_names = list(
-        filter(
-            lambda lib_name: lib_dict[lib_name].get('_TYPE', 'library') ==
-            'library', lib_dict.keys()))
-    target_names = list(
-        filter(
-            lambda lib_name: lib_dict[lib_name].get('_TYPE', 'library') ==
-            'target', lib_dict.keys()))
-    test_names = list(
-        filter(
-            lambda lib_name: lib_dict[lib_name].get('_TYPE', 'library') ==
-            'test', lib_dict.keys()))
+    lib_names = [
+        lib_name for lib_name in list(lib_dict.keys())
+        if lib_dict[lib_name].get('_TYPE', 'library') == 'library'
+    ]
+    target_names = [
+        lib_name for lib_name in list(lib_dict.keys())
+        if lib_dict[lib_name].get('_TYPE', 'library') == 'target'
+    ]
+    test_names = [
+        lib_name for lib_name in list(lib_dict.keys())
+        if lib_dict[lib_name].get('_TYPE', 'library') == 'test'
+    ]
 
     # list libraries and targets in predefined order
-    lib_list = list(map(lambda lib_name: lib_dict[lib_name], lib_names))
-    target_list = list(map(lambda lib_name: lib_dict[lib_name], target_names))
-    test_list = list(map(lambda lib_name: lib_dict[lib_name], test_names))
+    lib_list = [lib_dict[lib_name] for lib_name in lib_names]
+    target_list = [lib_dict[lib_name] for lib_name in target_names]
+    test_list = [lib_dict[lib_name] for lib_name in test_names]
 
     # get rid of temporary private fields prefixed with "_" and some other useless fields
     for lib in lib_list:
-        for field_to_remove in filter(lambda k: k.startswith('_'), lib.keys()):
+        for field_to_remove in [k for k in lib.keys() if k.startswith('_')]:
             lib.pop(field_to_remove, None)
     for target in target_list:
-        for field_to_remove in filter(lambda k: k.startswith('_'),
-                                      target.keys()):
+        for field_to_remove in [k for k in target.keys() if k.startswith('_')]:
             target.pop(field_to_remove, None)
         target.pop('public_headers',
                    None)  # public headers make no sense for targets
     for test in test_list:
-        for field_to_remove in filter(lambda k: k.startswith('_'), test.keys()):
+        for field_to_remove in [k for k in test.keys() if k.startswith('_')]:
             test.pop(field_to_remove, None)
         test.pop('public_headers',
                  None)  # public headers make no sense for tests
@@ -401,7 +441,7 @@ def _convert_to_build_yaml_like(lib_dict):
 def _extract_cc_tests(bazel_rules):
     """Gets list of cc_test tests from bazel rules"""
     result = []
-    for bazel_rule in bazel_rules.itervalues():
+    for bazel_rule in bazel_rules.values():
         if bazel_rule['class'] == 'cc_test':
             test_name = bazel_rule['name']
             if test_name.startswith('//'):
@@ -410,74 +450,74 @@ def _extract_cc_tests(bazel_rules):
     return list(sorted(result))
 
 
-def _filter_cc_tests(tests):
-    """Filters out tests that we don't want or we cannot build them reasonably"""
+def _exclude_unwanted_cc_tests(tests):
+    """Filters out bazel tests that we don't want to run with other build systems or we cannot build them reasonably"""
 
     # most qps tests are autogenerated, we are fine without them
-    tests = list(
-        filter(lambda test: not test.startswith('test/cpp/qps:'), tests))
+    tests = [test for test in tests if not test.startswith('test/cpp/qps:')]
 
     # we have trouble with census dependency outside of bazel
-    tests = list(
-        filter(lambda test: not test.startswith('test/cpp/ext/filters/census:'),
-               tests))
-    tests = list(
-        filter(
-            lambda test: not test.startswith(
-                'test/cpp/microbenchmarks:bm_opencensus_plugin'), tests))
+    tests = [
+        test for test in tests
+        if not test.startswith('test/cpp/ext/filters/census:')
+    ]
+    tests = [
+        test for test in tests
+        if not test.startswith('test/cpp/microbenchmarks:bm_opencensus_plugin')
+    ]
 
     # missing opencensus/stats/stats.h
-    tests = list(
-        filter(
-            lambda test: not test.startswith(
-                'test/cpp/end2end:server_load_reporting_end2end_test'), tests))
-    tests = list(
-        filter(
-            lambda test: not test.startswith(
-                'test/cpp/server/load_reporter:lb_load_reporter_test'), tests))
+    tests = [
+        test for test in tests if not test.startswith(
+            'test/cpp/end2end:server_load_reporting_end2end_test')
+    ]
+    tests = [
+        test for test in tests if not test.startswith(
+            'test/cpp/server/load_reporter:lb_load_reporter_test')
+    ]
 
     # The test uses --running_under_bazel cmdline argument
     # To avoid the trouble needing to adjust it, we just skip the test
-    tests = list(
-        filter(
-            lambda test: not test.startswith(
-                'test/cpp/naming:resolver_component_tests_runner_invoker'),
-            tests))
+    tests = [
+        test for test in tests if not test.startswith(
+            'test/cpp/naming:resolver_component_tests_runner_invoker')
+    ]
 
     # the test requires 'client_crash_test_server' to be built
-    tests = list(
-        filter(
-            lambda test: not test.startswith('test/cpp/end2end:time_change_test'
-                                            ), tests))
+    tests = [
+        test for test in tests
+        if not test.startswith('test/cpp/end2end:time_change_test')
+    ]
 
     # the test requires 'client_crash_test_server' to be built
-    tests = list(
-        filter(
-            lambda test: not test.startswith(
-                'test/cpp/end2end:client_crash_test'), tests))
+    tests = [
+        test for test in tests
+        if not test.startswith('test/cpp/end2end:client_crash_test')
+    ]
 
     # the test requires 'server_crash_test_client' to be built
-    tests = list(
-        filter(
-            lambda test: not test.startswith(
-                'test/cpp/end2end:server_crash_test'), tests))
+    tests = [
+        test for test in tests
+        if not test.startswith('test/cpp/end2end:server_crash_test')
+    ]
 
     # test never existed under build.yaml and it fails -> skip it
-    tests = list(
-        filter(
-            lambda test: not test.startswith(
-                'test/core/tsi:ssl_session_cache_test'), tests))
+    tests = [
+        test for test in tests
+        if not test.startswith('test/core/tsi:ssl_session_cache_test')
+    ]
 
     # the binary of this test does not get built with cmake
-    tests = list(
-        filter(
-            lambda test: not test.startswith(
-                'test/cpp/util:channelz_sampler_test'), tests))
+    tests = [
+        test for test in tests
+        if not test.startswith('test/cpp/util:channelz_sampler_test')
+    ]
 
     return tests
 
 
 def _generate_build_extra_metadata_for_tests(tests, bazel_rules):
+    """For given tests, generate the "extra metadata" that we need for our "build.yaml"-like output. The extra metadata is generated from the bazel rule metadata by using a bunch of heuristics."""
     test_metadata = {}
     for test in tests:
         test_dict = {'build': 'test', '_TYPE': 'target'}
@@ -554,14 +594,14 @@ def _generate_build_extra_metadata_for_tests(tests, bazel_rules):
 
     # detect duplicate test names
     tests_by_simple_name = {}
-    for test_name, test_dict in test_metadata.iteritems():
+    for test_name, test_dict in test_metadata.items():
         simple_test_name = test_dict['_RENAME']
         if not simple_test_name in tests_by_simple_name:
             tests_by_simple_name[simple_test_name] = []
         tests_by_simple_name[simple_test_name].append(test_name)
 
     # choose alternative names for tests with a name collision
-    for collision_list in tests_by_simple_name.itervalues():
+    for collision_list in tests_by_simple_name.values():
         if len(collision_list) > 1:
             for test_name in collision_list:
                 long_name = test_name.replace('/', '_').replace(':', '_')
@@ -573,6 +613,16 @@ def _generate_build_extra_metadata_for_tests(tests, bazel_rules):
     return test_metadata
 
 
+def _detect_and_print_issues(build_yaml_like):
+    """Try detecting some unusual situations and warn about them."""
+    for tgt in build_yaml_like['targets']:
+        if tgt['build'] == 'test':
+            for src in tgt['src']:
+                if src.startswith('src/') and not src.endswith('.proto'):
+                    print('source file from under "src/" tree used in test ' +
+                          tgt['name'] + ': ' + src)
+
+
 # extra metadata that will be used to construct build.yaml
 # there are mostly extra properties that we weren't able to obtain from the bazel build
 # _TYPE: whether this is library, target or test
@@ -943,31 +993,138 @@ _BAZEL_DEPS_QUERIES = [
     'deps("//src/proto/...")',
 ]
 
+# Step 1: run a bunch of "bazel query --output xml" queries to collect
+# the raw build metadata from the bazel build.
+# At the end of this step we will have a dictionary of bazel rules
+# that are interesting to us (libraries, binaries, etc.) along
+# with their most important metadata (sources, headers, dependencies)
+#
+# Example of a single bazel rule after being populated:
+# '//:grpc' : { 'class': 'cc_library',
+#               'hdrs': ['//:include/grpc/byte_buffer.h', ... ],
+#               'srcs': ['//:src/core/lib/surface/init.cc', ... ],
+#               'deps': ['//:grpc_common', ...],
+#               ... }
 bazel_rules = {}
 for query in _BAZEL_DEPS_QUERIES:
     bazel_rules.update(
         _extract_rules_from_bazel_xml(_bazel_query_xml_tree(query)))
 
+# Step 1a: Knowing the transitive closure of dependencies will make
+# the postprocessing simpler, so compute the info for all our rules.
+#
+# Example:
+# '//:grpc' : { ...,
+#               'transitive_deps': ['//:gpr_base', ...] }
 _populate_transitive_deps(bazel_rules)
 
-tests = _filter_cc_tests(_extract_cc_tests(bazel_rules))
-test_metadata = _generate_build_extra_metadata_for_tests(tests, bazel_rules)
-
-all_metadata = {}
-all_metadata.update(_BUILD_EXTRA_METADATA)
-all_metadata.update(test_metadata)
-
-all_targets_dict = _generate_build_metadata(all_metadata, bazel_rules)
+# Step 2: Extract the known bazel cc_test tests. While most tests
+# will be buildable with other build systems just fine, some of these tests
+# would be too difficult to build and run with other build systems,
+# so we simply exclude the ones we don't want.
+# Note that while making tests buildable with other build systems
+# than just bazel is extra effort, we still need to do that for these
+# reasons:
+# - If our cmake build doesn't have any tests at all, it's hard to make
+#   sure that what it built actually works (we need at least some "smoke tests").
+#   This is quite important because the build flags between bazel / non-bazel flag might differ
+#   (sometimes it's for interesting reasons that are not easy to overcome)
+#   which makes it even more important to have at least some tests for cmake/make
+# - Our portability suite actually runs cmake tests and migration of portability
+#   suite fully towards bazel might be intricate (e.g. it's unclear whether it's
+#   possible to get a good enough coverage of different compilers / distros etc.
+#   with bazel)
+# - some things that are considered "tests" in build.yaml-based builds are actually binaries
+#   we'd want to be able to build anyway (qps_json_worker, interop_client, interop_server, grpc_cli)
+#   so it's unclear how much make/cmake simplification we would gain by removing just some (but not all) test
+# TODO(jtattermusch): Investigate feasibility of running portability suite with bazel.
+tests = _exclude_unwanted_cc_tests(_extract_cc_tests(bazel_rules))
+
+# Step 3: Generate the "extra metadata" for all our build targets.
+# While the bazel rules give us most of the information we need,
+# the legacy "build.yaml" format requires some additional fields that
+# we cannot get just from bazel alone (we call that "extra metadata").
+# In this step, we basically analyze the build metadata we have from bazel
+# and use heuristics to determine (and sometimes guess) the right
+# extra metadata to use for each target.
+#
+# - For some targets (such as the public libraries, helper libraries
+#   and executables) determining the right extra metadata is hard to do
+#   automatically. For these targets, the extra metadata is supplied "manually"
+#   in form of the _BUILD_EXTRA_METADATA dictionary. That allows us to match
+#   the semantics of the legacy "build.yaml" as closely as possible.
+#
+# - For test binaries, it is possible to generate the "extra metadata" mostly
+#   automatically using a rule-based heuristic approach because most tests
+#   look and behave alike from the build's perspective.
+#
+# TODO(jtattermusch): Of course neither "_BUILD_EXTRA_METADATA" or
+# the heuristic approach used for tests are ideal and they cannot be made
+# to cover all possible situations (and are tailored to work with the way
+# the grpc build currently works), but the idea was to start with something
+# reasonably simple that matches the "build.yaml"-like semantics as closely
+# as possible (to avoid changing too many things at once) and gradually get
+# rid of the legacy "build.yaml"-specific fields one by one. Once that is done,
+# only very little "extra metadata" would be needed and/or it would be trivial
+# to generate it automatically.
+all_extra_metadata = {}
+all_extra_metadata.update(_BUILD_EXTRA_METADATA)
+all_extra_metadata.update(
+    _generate_build_extra_metadata_for_tests(tests, bazel_rules))
+
+# Step 4: Generate the final metadata for all the targets.
+# This is done by combining the bazel build metadata and the "extra metadata"
+# we obtained in the previous step.
+# In this step, we also perform some interesting massaging of the target metadata
+# to end up with a result that is as similar to the legacy build.yaml data
+# as possible.
+# - Some targets get renamed (to match the legacy build.yaml target names)
+# - Some intermediate libraries get elided ("expanded") to better match the set
+#   of targets provided by the legacy build.yaml build
+#
+# Originally the target renaming was introduced to address these concerns:
+# - avoid changing too many things at the same time and avoid people getting
+#   confused by some well know targets suddenly being missing
+# - Makefile/cmake and also language-specific generators rely on some build
+#   targets being called exactly the way they they are. Some of our testing
+#   scrips also invoke executables (e.g. "qps_json_driver") by their name.
+# - The autogenerated test name from bazel includes the package path
+#   (e.g. "test_cpp_TEST_NAME"). Without renaming, the target names would
+#   end up pretty ugly (e.g. test_cpp_qps_qps_json_driver).
+# TODO(jtattermusch): reevaluate the need for target renaming in the future.
+#
+# Example of a single generated target:
+# 'grpc' : { 'language': 'c',
+#            'public_headers': ['include/grpc/byte_buffer.h', ... ],
+#            'headers': ['src/core/ext/filters/client_channel/client_channel.h', ... ],
+#            'src': ['src/core/lib/surface/init.cc', ... ],
+#            'deps': ['gpr', 'address_sorting', ...],
+#            ... }
+all_targets_dict = _generate_build_metadata(all_extra_metadata, bazel_rules)
+
+# Step 5: convert the dictionary with all the targets to a dict that has
+# the desired "build.yaml"-like layout.
+# TODO(jtattermusch): We use the custom "build.yaml"-like layout because
+# currently all other build systems use that format as their source of truth.
+# In the future, we can get rid of this custom & legacy format entirely,
+# but we would need to update the generators for other build systems
+# at the same time.
+#
+# Layout of the result:
+# { 'libs': { TARGET_DICT_FOR_LIB_XYZ, ... },
+#   'targets': { TARGET_DICT_FOR_BIN_XYZ, ... },
+#   'tests': { TARGET_DICT_FOR_TEST_XYZ, ...} }
 build_yaml_like = _convert_to_build_yaml_like(all_targets_dict)
 
-# if a test uses source files from src/ directly, it's a little bit suspicious
-for tgt in build_yaml_like['targets']:
-    if tgt['build'] == 'test':
-        for src in tgt['src']:
-            if src.startswith('src/') and not src.endswith('.proto'):
-                print('source file from under "src/" tree used in test ' +
-                      tgt['name'] + ': ' + src)
+# detect and report some suspicious situations we've seen before
+_detect_and_print_issues(build_yaml_like)
 
+# Step 6: Store the build_autogenerated.yaml in a deterministic (=sorted)
+# and cleaned-up form.
+# A basic overview of the resulting "build.yaml"-like format is here:
+# https://github.com/grpc/grpc/blob/master/templates/README.md
+# TODO(jtattermusch): The "cleanup" function is taken from the legacy
+# build system (which used build.yaml) and can be eventually removed.
 build_yaml_string = build_cleaner.cleaned_build_yaml_dict_as_string(
     build_yaml_like)
 with open('build_autogenerated.yaml', 'w') as file:
index 84252dd..9ad9878 100755 (executable)
@@ -33,6 +33,6 @@ gen_build_files=""
 for gen_build_yaml in $gen_build_yaml_dirs
 do
   output_file=`mktemp /tmp/genXXXXXX`
-  python $gen_build_yaml/gen_build_yaml.py > $output_file
+  python3 $gen_build_yaml/gen_build_yaml.py > $output_file
   gen_build_files="$gen_build_files $output_file"
 done
index 88183f8..841abbd 100755 (executable)
@@ -89,11 +89,21 @@ for template in reversed(sorted(templates)):
         cmd.append(args.base + '/' + root + '/' + f)
         jobs.append(jobset.JobSpec(cmd, shortname=out, timeout_seconds=None))
 
-jobset.run(pre_jobs, maxjobs=args.jobs)
-jobset.run(jobs, maxjobs=args.jobs)
+err_cnt, _ = jobset.run(pre_jobs, maxjobs=args.jobs)
+if err_cnt != 0:
+    print('ERROR: {count} error(s) encountered during preprocessing.'.format(
+        count=err_cnt),
+          file=sys.stderr)
+    sys.exit(1)
+err_cnt, _ = jobset.run(jobs, maxjobs=args.jobs)
+if err_cnt != 0:
+    print('ERROR: {count} error(s) found while generating projects.'.format(
+        count=err_cnt),
+          file=sys.stderr)
+    sys.exit(1)
 
 if test is not None:
-    for s, g in test.iteritems():
+    for s, g in test.items():
         if os.path.isfile(g):
             assert 0 == os.system('diff %s %s' % (s, g)), s
             os.unlink(g)
index 872af70..81c1615 100755 (executable)
@@ -20,7 +20,7 @@ export TEST=${TEST:-false}
 
 echo "Generating build_autogenerated.yaml from bazel BUILD file"
 rm -f build_autogenerated.yaml
-python tools/buildgen/extract_metadata_from_bazel_xml.py
+python3 tools/buildgen/extract_metadata_from_bazel_xml.py
 
 cd `dirname $0`/../..
 mako_renderer=tools/buildgen/mako_renderer.py
@@ -35,6 +35,6 @@ TEST=true tools/buildgen/build_cleaner.py build_autogenerated.yaml
 # Instead of generating from a single build.yaml, we've split it into
 # - build_handwritten.yaml: manually written metadata
 # - build_autogenerated.yaml: generated from bazel BUILD file
-python tools/buildgen/generate_projects.py build_handwritten.yaml build_autogenerated.yaml $gen_build_files $*
+python3 tools/buildgen/generate_projects.py build_handwritten.yaml build_autogenerated.yaml $gen_build_files $*
 
 rm $gen_build_files
index 3c0cef4..f0202cd 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2.7
+#!/usr/bin/env python3
 # Copyright 2015 gRPC authors.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,7 +21,7 @@ Just a wrapper around the mako rendering library.
 import getopt
 import imp
 import os
-import cPickle as pickle
+import pickle
 import shutil
 import sys
 
@@ -36,16 +36,11 @@ import yaml
 def import_plugin(name):
     _, base_ex = os.path.split(name)
     base, _ = os.path.splitext(base_ex)
-
-    with open(name, 'r') as plugin_file:
-        plugin_code = plugin_file.read()
-    plugin_module = imp.new_module(base)
-    exec plugin_code in plugin_module.__dict__
-    return plugin_module
+    return imp.load_source(base, name)
 
 
 def out(msg):
-    print >> sys.stderr, msg
+    print(msg, file=sys.stderr)
 
 
 def showhelp():
@@ -103,7 +98,7 @@ def main(argv):
                 0,
                 os.path.abspath(
                     os.path.join(os.path.dirname(sys.argv[0]), 'plugins')))
-            with open(arg, 'r') as dict_file:
+            with open(arg, 'rb') as dict_file:
                 dictionary = pickle.load(dict_file)
             got_preprocessed_input = True
         elif opt == '-d':
@@ -125,7 +120,7 @@ def main(argv):
             dictionary[k] = bunch.to_bunch(v)
 
     if preprocessed_output:
-        with open(preprocessed_output, 'w') as dict_file:
+        with open(preprocessed_output, 'wb') as dict_file:
             pickle.dump(dictionary, dict_file)
 
     cleared_dir = False
@@ -134,7 +129,7 @@ def main(argv):
         with open(arg) as f:
             srcs = list(yaml.load_all(f.read()))
         for src in srcs:
-            if isinstance(src, basestring):
+            if isinstance(src, str):
                 assert len(srcs) == 1
                 template = Template(src,
                                     filename=arg,
index d6eea6c..b45e682 100755 (executable)
@@ -62,7 +62,7 @@ def mako_plugin(dictionary):
         for lst in FILEGROUP_LISTS:
             fg[lst] = fg.get(lst, [])
             fg['own_%s' % lst] = list(fg[lst])
-        for attr, val in FILEGROUP_DEFAULTS.iteritems():
+        for attr, val in FILEGROUP_DEFAULTS.items():
             if attr not in fg:
                 fg[attr] = val
 
@@ -113,7 +113,7 @@ def mako_plugin(dictionary):
         thing['used_by'] = []
     thing_deps = lambda t: t.get('uses', []) + t.get('filegroups', []) + t.get(
         'deps', [])
-    for thing in things.itervalues():
+    for thing in things.values():
         done = set()
         todo = thing_deps(thing)
         while todo:
@@ -125,7 +125,7 @@ def mako_plugin(dictionary):
             done.add(cur)
 
     # the above expansion can introduce duplicate filenames: contract them here
-    for fg in filegroups.itervalues():
+    for fg in filegroups.values():
         for lst in FILEGROUP_LISTS:
             fg[lst] = uniquify(fg.get(lst, []))
 
index f7ef492..6fbad5e 100755 (executable)
@@ -61,7 +61,7 @@ def mako_plugin(dictionary):
             name = target['name']
             guid = re.sub('(........)(....)(....)(....)(.*)',
                           r'{\1-\2-\3-\4-\5}',
-                          hashlib.md5(name).hexdigest())
+                          hashlib.md5(name.encode('utf-8')).hexdigest())
             target['vs_project_guid'] = guid.upper()
     # Exclude projects without a visual project guid, such as the tests.
     projects = [
index f7ecb97..87a592d 100755 (executable)
@@ -64,4 +64,5 @@ def mako_plugin(dictionary):
 
 
 if __name__ == '__main__':
-    print yaml.dump([api for api in list_c_apis(headers_under('include/grpc'))])
+    print(yaml.dump([api for api in list_c_apis(headers_under('include/grpc'))
+                    ]))
index 83348a5..21e1940 100755 (executable)
@@ -29,7 +29,7 @@ function find_without_newline() {
     if [[ ! -z $f ]]; then
       if [[ $(tail -c 1 "$f") != $NEWLINE ]]; then
         echo "Error: file '$f' is missing a trailing newline character."
-        if $2; then  # fix
+        if $1; then  # fix
           sed -i -e '$a\' $f
           echo 'Fixed!'
         fi
@@ -39,11 +39,12 @@ function find_without_newline() {
 }
 
 if [[ $# == 1 && $1 == '--fix' ]]; then
-  ERRORS=$(find_without_newline true)
+  FIX=true
 else
-  ERRORS=$(find_without_newline false)
+  FIX=false
 fi
 
+ERRORS=$(find_without_newline $FIX)
 if [[ "$ERRORS" != '' ]]; then
   echo "$ERRORS"
   if ! $FIX; then
index 9262b6b..dade592 100755 (executable)
@@ -21,6 +21,22 @@ set -ex
 cd $(dirname $0)/../..
 REPO_ROOT=$(pwd)
 
+# grep targets with manual tag, which is not included in a result of bazel build using ...
+# let's get a list of them using query command and pass it to gen_compilation_database.py
+export MANUAL_TARGETS=$(bazel query 'attr("tags", "manual", tests(//test/cpp/...))' | grep -v _on_ios)
+
+# generate a clang compilation database for all C/C++ sources in the repo.
+tools/distrib/gen_compilation_database.py \
+  --include_headers \
+  --ignore_system_headers \
+  --dedup_targets \
+  "//:*" \
+  "//src/core/..." \
+  "//src/compiler/..." \
+  "//test/core/..." \
+  "//test/cpp/..." \
+  $MANUAL_TARGETS
+
 if [ "$CLANG_TIDY_SKIP_DOCKER" == "" ]
 then
   # build clang-tidy docker image
@@ -29,7 +45,15 @@ then
   # run clang-tidy against the checked out codebase
   # when modifying the checked-out files, the current user will be impersonated
   # so that the updated files don't end up being owned by "root".
-  docker run -e TEST="$TEST" -e CHANGED_FILES="$CHANGED_FILES" -e CLANG_TIDY_ROOT="/local-code" --rm=true -v "${REPO_ROOT}":/local-code --user "$(id -u):$(id -g)" -t grpc_clang_tidy /clang_tidy_all_the_things.sh "$@"
+  docker run \
+    -e TEST="$TEST" \
+    -e CHANGED_FILES="$CHANGED_FILES" \
+    -e CLANG_TIDY_ROOT="/local-code" \
+    --rm=true \
+    -v "${REPO_ROOT}":/local-code \
+    -v "${HOME/.cache/bazel}":"${HOME/.cache/bazel}" \
+    --user "$(id -u):$(id -g)" \
+    -t grpc_clang_tidy /clang_tidy_all_the_things.sh "$@"
 else
   CLANG_TIDY_ROOT="${REPO_ROOT}" tools/dockerfile/grpc_clang_tidy/clang_tidy_all_the_things.sh "$@"
 fi
diff --git a/tools/distrib/gen_compilation_database.py b/tools/distrib/gen_compilation_database.py
new file mode 100755 (executable)
index 0000000..d8d2761
--- /dev/null
@@ -0,0 +1,135 @@
+#!/usr/bin/env python3
+
+# Copyright 2020 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This is based on the script on the Envoy project
+# https://github.com/envoyproxy/envoy/blob/master/tools/gen_compilation_database.py
+
+import argparse
+import glob
+import json
+import logging
+import os
+import re
+import shlex
+import subprocess
+from pathlib import Path
+
+RE_INCLUDE_SYSTEM = re.compile("\s*-I\s+/usr/[^ ]+")
+
+
+# This method is equivalent to https://github.com/grailbio/bazel-compilation-database/blob/master/generate.sh
+def generateCompilationDatabase(args):
+    # We need to download all remote outputs for generated source code.
+    # This option lives here to override those specified in bazelrc.
+    bazel_options = shlex.split(os.environ.get("BAZEL_BUILD_OPTIONS", "")) + [
+        "--config=compdb",
+        "--remote_download_outputs=all",
+    ]
+
+    subprocess.check_call(["bazel", "build"] + bazel_options + [
+        "--aspects=@bazel_compdb//:aspects.bzl%compilation_database_aspect",
+        "--output_groups=compdb_files,header_files"
+    ] + args.bazel_targets)
+
+    execroot = subprocess.check_output(["bazel", "info", "execution_root"] +
+                                       bazel_options).decode().strip()
+
+    compdb = []
+    for compdb_file in Path(execroot).glob("**/*.compile_commands.json"):
+        compdb.extend(
+            json.loads(
+                "[" +
+                compdb_file.read_text().replace("__EXEC_ROOT__", execroot) +
+                "]"))
+
+    if args.dedup_targets:
+        compdb_map = {target["file"]: target for target in compdb}
+        compdb = list(compdb_map.values())
+
+    return compdb
+
+
+def isHeader(filename):
+    for ext in (".h", ".hh", ".hpp", ".hxx"):
+        if filename.endswith(ext):
+            return True
+    return False
+
+
+def isCompileTarget(target, args):
+    filename = target["file"]
+    if not args.include_headers and isHeader(filename):
+        return False
+    if not args.include_genfiles:
+        if filename.startswith("bazel-out/"):
+            return False
+    if not args.include_external:
+        if filename.startswith("external/"):
+            return False
+    return True
+
+
+def modifyCompileCommand(target, args):
+    cc, options = target["command"].split(" ", 1)
+
+    # Workaround for bazel added C++11 options, those doesn't affect build itself but
+    # clang-tidy will misinterpret them.
+    options = options.replace("-std=c++0x ", "")
+    options = options.replace("-std=c++11 ", "")
+
+    if args.vscode:
+        # Visual Studio Code doesn't seem to like "-iquote". Replace it with
+        # old-style "-I".
+        options = options.replace("-iquote ", "-I ")
+
+    if args.ignore_system_headers:
+        # Remove all include options for /usr/* directories
+        options = RE_INCLUDE_SYSTEM.sub("", options)
+
+    if isHeader(target["file"]):
+        options += " -Wno-pragma-once-outside-header -Wno-unused-const-variable"
+        options += " -Wno-unused-function"
+        if not target["file"].startswith("external/"):
+            # *.h file is treated as C header by default while our headers files are all C++11.
+            options = "-x c++ -std=c++11 -fexceptions " + options
+
+    target["command"] = " ".join([cc, options])
+    return target
+
+
+def fixCompilationDatabase(args, db):
+    db = [
+        modifyCompileCommand(target, args)
+        for target in db
+        if isCompileTarget(target, args)
+    ]
+
+    with open("compile_commands.json", "w") as db_file:
+        json.dump(db, db_file, indent=2)
+
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(
+        description='Generate JSON compilation database')
+    parser.add_argument('--include_external', action='store_true')
+    parser.add_argument('--include_genfiles', action='store_true')
+    parser.add_argument('--include_headers', action='store_true')
+    parser.add_argument('--vscode', action='store_true')
+    parser.add_argument('--ignore_system_headers', action='store_true')
+    parser.add_argument('--dedup_targets', action='store_true')
+    parser.add_argument('bazel_targets', nargs='*', default=["//..."])
+    args = parser.parse_args()
+    fixCompilationDatabase(args, generateCompilationDatabase(args))
index dca1001..3390ab8 100644 (file)
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!!
 
-VERSION = '1.33.2'
+VERSION = '1.34.0'
index c0b3f66..e85ea46 100644 (file)
@@ -19,6 +19,7 @@ package(default_visibility = [
 ])
 
 load("//bazel:cython_library.bzl", "pyx_library")
+load("grpcio_tools.bzl", "internal_copied_filegroup")
 
 cc_library(
     name = "protoc_lib",
@@ -37,12 +38,20 @@ pyx_library(
     deps = [":protoc_lib"],
 )
 
+internal_copied_filegroup(
+    name = "well_known_protos",
+    srcs = ["@com_google_protobuf//:well_known_protos"],
+    dest = "grpc_tools/_proto/",
+    strip_prefix = "src/",
+)
+
 py_library(
     name = "grpc_tools",
     srcs = [
         "grpc_tools/__init__.py",
         "grpc_tools/protoc.py",
     ],
+    data = [":well_known_protos"],
     imports = ["."],
     srcs_version = "PY2AND3",
     deps = [
index d07daba..48f853a 100644 (file)
@@ -58,6 +58,8 @@ if sys.version_info >= (3, 5, 0):
                     ProtoFinder(_SERVICE_MODULE_SUFFIX,
                                 _protoc_compiler.get_services)
                 ])
+                sys.path.append(
+                    pkg_resources.resource_filename('grpc_tools', '_proto'))
                 _FINDERS_INSTALLED = True
 
     def _module_name_to_proto_file(suffix, module_name):
index cdf262d..ca32d96 100644 (file)
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!!
 
-VERSION = '1.33.2'
+VERSION = '1.34.0'
diff --git a/tools/distrib/python/grpcio_tools/grpcio_tools.bzl b/tools/distrib/python/grpcio_tools/grpcio_tools.bzl
new file mode 100644 (file)
index 0000000..603556c
--- /dev/null
@@ -0,0 +1,94 @@
+# Copyright 2020 The gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+def _generate_copied_files_impl(ctx):
+    srcs = ctx.attr.srcs[0]
+    strip_prefix = ctx.attr.strip_prefix
+    dest = ctx.attr.dest
+
+    outs = []
+    for f in srcs.files.to_list():
+        destination_path = f.path
+        if f.path.startswith("external"):
+            external_separator = f.path.find("/")
+            repository_separator = f.path.find("/", external_separator + 1)
+            destination_path = f.path[repository_separator + 1:]
+        if not destination_path.startswith(strip_prefix):
+            fail("File '{}' did not start with '{}'.".format(
+                destination_path,
+                strip_prefix,
+            ))
+        destination_path = dest + destination_path[len(strip_prefix):]
+        destination_dir = destination_path.rfind("/")
+        out_file = ctx.actions.declare_file(destination_path)
+        outs.append(out_file)
+        ctx.actions.run_shell(
+            inputs = [f],
+            outputs = [out_file],
+            command = "mkdir -p {0} && cp {1} {2}".format(
+                out_file.dirname,
+                f.path,
+                out_file.path,
+            ),
+        )
+
+    return [DefaultInfo(files = depset(direct = outs))]
+
+_generate_copied_files = rule(
+    attrs = {
+        "srcs": attr.label_list(
+            mandatory = True,
+            allow_empty = False,
+        ),
+        "strip_prefix": attr.string(
+            default = "",
+        ),
+        "dest": attr.string(
+            mandatory = True,
+        ),
+    },
+    implementation = _generate_copied_files_impl,
+)
+
+def internal_copied_filegroup(name, srcs, strip_prefix, dest):
+    """Copies a file group to the current package.
+
+    Useful for using an existing filegroup as a data dependency.
+
+    Args:
+      name: The name of the rule.
+      srcs: A single filegroup.
+      strip_prefix: An optional string to strip from the beginning
+        of the path of each file in the filegroup. Must end in a slash.
+      dest: The directory in which to put the files, relative to the
+        current package. Must end in a slash.
+    """
+    if len(srcs) != 1:
+        fail("srcs must be a single filegroup.")
+
+    if not dest.endswith("/"):
+        fail("dest must end with a '/' character.")
+
+    _symlink_target = name + "_symlink"
+    _generate_copied_files(
+        name = _symlink_target,
+        srcs = srcs,
+        strip_prefix = strip_prefix,
+        dest = dest,
+    )
+
+    native.filegroup(
+        name = name,
+        srcs = [":" + _symlink_target],
+    )
index f216eeb..164088b 100644 (file)
@@ -150,15 +150,15 @@ elif "linux" in sys.platform or "darwin" in sys.platform:
     DEFINE_MACROS += (('HAVE_PTHREAD', 1),)
 
 # By default, Python3 distutils enforces compatibility of
-# c plugins (.so files) with the OSX version Python3 was built with.
-# For Python3.4, this is OSX 10.6, but we need Thread Local Support (__thread)
-if 'darwin' in sys.platform and PY3:
+# c plugins (.so files) with the OSX version Python was built with.
+# We need OSX 10.10, the oldest which supports C++ thread_local.
+if 'darwin' in sys.platform:
     mac_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
     if mac_target and (pkg_resources.parse_version(mac_target) <
-                       pkg_resources.parse_version('10.9.0')):
-        os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.9'
+                       pkg_resources.parse_version('10.10.0')):
+        os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.10'
         os.environ['_PYTHON_HOST_PLATFORM'] = re.sub(
-            r'macosx-[0-9]+\.[0-9]+-(.+)', r'macosx-10.9-\1',
+            r'macosx-[0-9]+\.[0-9]+-(.+)', r'macosx-10.10-\1',
             util.get_platform())
 
 
@@ -232,6 +232,7 @@ setuptools.setup(
     install_requires=[
         'protobuf>=3.5.0.post1, < 4.0dev',
         'grpcio>={version}'.format(version=grpc_version.VERSION),
+        'setuptools',
     ],
     package_data=package_data(),
 )
index 6e54a75..9af6c8f 100755 (executable)
@@ -24,17 +24,6 @@ sys.path.append(
                  'python_utils'))
 import jobset
 
-extra_args = [
-    '-x',
-    'c++',
-    '-std=c++11',
-]
-with open('.clang_complete') as f:
-    for line in f:
-        line = line.strip()
-        if line.startswith('-I'):
-            extra_args.append(line)
-
 clang_tidy = os.environ.get('CLANG_TIDY', 'clang-tidy')
 
 argp = argparse.ArgumentParser(description='Run clang-tidy against core')
@@ -48,19 +37,28 @@ argp.add_argument('-j',
 argp.set_defaults(fix=False)
 args = argp.parse_args()
 
+# Explicitly passing the .clang-tidy config by reading it.
+# This is required because source files in the compilation database are
+# in a different source tree so clang-tidy cannot find the right config file
+# by seeking their parent directories.
+with open(".clang-tidy") as f:
+    config = f.read()
 cmdline = [
     clang_tidy,
-] + ['--extra-arg-before=%s' % arg for arg in extra_args]
+    '--config=' + config,
+]
 
 if args.fix:
     cmdline.append('--fix')
 
 jobs = []
 for filename in args.files:
-    jobs.append(jobset.JobSpec(
-        cmdline + [filename],
-        shortname=filename,
-    ))  #verbose_success=True))
+    jobs.append(
+        jobset.JobSpec(
+            cmdline + [filename],
+            shortname=filename,
+            timeout_seconds=15 * 60,
+        ))
 
 num_fails, res_set = jobset.run(jobs, maxjobs=args.jobs)
 sys.exit(num_fails)
index 3319bcd..a06f148 100755 (executable)
@@ -20,5 +20,5 @@ cd $(dirname $0)/../..
 tools/buildgen/generate_projects.sh
 tools/distrib/clang_format_code.sh
 tools/distrib/check_copyright.py
-tools/distrib/check_trailing_newlines.sh
+tools/distrib/check_trailing_newlines.sh --fix
 
index 2ee336d..44d911c 100644 (file)
@@ -25,4 +25,9 @@ RUN wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/
 RUN apk add glibc-2.30-r0.apk
 
 # installing mono on alpine is hard and we don't really need it
-ENV SKIP_MONO_DISTRIBTEST=1
+ENV SKIP_NET45_DISTRIBTEST=1
+# we have a separate distribtest for netcoreapp3.1
+ENV SKIP_NETCOREAPP31_DISTRIBTEST=1
+# we have a separate distribtest for net5.0
+ENV SKIP_NET50_DISTRIBTEST=1
+
diff --git a/tools/dockerfile/distribtest/csharp_dotnet31_x64/Dockerfile b/tools/dockerfile/distribtest/csharp_dotnet31_x64/Dockerfile
new file mode 100644 (file)
index 0000000..9e1a7a8
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright 2019 The gRPC Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# "3.1" tag uses debian buster
+FROM mcr.microsoft.com/dotnet/core/sdk:3.1
+
+RUN apt-get update && apt-get install -y unzip && apt-get clean
+
+# we only want to test dotnet core 3.1 runtime. This also allows us to keep
+# this docker image minimal by not installing the other runtimes.
+ENV SKIP_NET45_DISTRIBTEST=1
+ENV SKIP_NETCOREAPP21_DISTRIBTEST=1
+ENV SKIP_NET50_DISTRIBTEST=1
diff --git a/tools/dockerfile/distribtest/csharp_dotnet5_x64/Dockerfile b/tools/dockerfile/distribtest/csharp_dotnet5_x64/Dockerfile
new file mode 100644 (file)
index 0000000..60ce55b
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright 2019 The gRPC Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# "5.0" tag uses debian buster
+FROM mcr.microsoft.com/dotnet/sdk:5.0
+
+RUN apt-get update && apt-get install -y unzip && apt-get clean
+
+# we only want to test dotnet 5 runtime. This also allows us to keep
+# this docker image minimal by not installing the other runtimes.
+ENV SKIP_NET45_DISTRIBTEST=1
+ENV SKIP_NETCOREAPP21_DISTRIBTEST=1
+ENV SKIP_NETCOREAPP31_DISTRIBTEST=1
diff --git a/tools/dockerfile/distribtest/csharp_jessie_x86/Dockerfile b/tools/dockerfile/distribtest/csharp_jessie_x86/Dockerfile
deleted file mode 100644 (file)
index 96b318d..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2015 gRPC authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-FROM i386/debian:jessie
-
-RUN apt-get update && apt-get install -y apt-transport-https && apt-get clean
-
-RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
-RUN echo "deb https://download.mono-project.com/repo/debian stable-jessie main" | tee /etc/apt/sources.list.d/mono-official-stable.list
-
-RUN apt-get update && apt-get install -y \
-    mono-devel \
-    nuget \
-    && apt-get clean
-
-RUN apt-get update && apt-get install -y unzip && apt-get clean
-
-# Make sure the mono certificate store is up-to-date to prevent issues with nuget restore
-RUN apt-get update && apt-get install -y curl && apt-get clean
-RUN curl https://curl.haxx.se/ca/cacert.pem > ~/cacert.pem && cert-sync ~/cacert.pem && rm -f ~/cacert.pem
index 97779c5..fb9b14d 100644 (file)
@@ -39,3 +39,8 @@ RUN apt-get update && apt-get install -y unzip && apt-get clean
 # Make sure the mono certificate store is up-to-date to prevent issues with nuget restore
 RUN apt-get update && apt-get install -y curl && apt-get clean
 RUN curl https://curl.haxx.se/ca/cacert.pem > ~/cacert.pem && cert-sync ~/cacert.pem && rm -f ~/cacert.pem
+
+# we have a separate distribtest for netcoreapp3.1
+ENV SKIP_NETCOREAPP31_DISTRIBTEST=1
+# we have a separate distribtest for net5.0
+ENV SKIP_NET50_DISTRIBTEST=1
index e0d8c45..4755a3b 100644 (file)
@@ -39,3 +39,8 @@ RUN apt-get update && apt-get install -y unzip && apt-get clean
 # Make sure the mono certificate store is up-to-date to prevent issues with nuget restore
 RUN apt-get update && apt-get install -y curl && apt-get clean
 RUN curl https://curl.haxx.se/ca/cacert.pem > ~/cacert.pem && cert-sync ~/cacert.pem && rm -f ~/cacert.pem
+
+# we have a separate distribtest for netcoreapp3.1
+ENV SKIP_NETCOREAPP31_DISTRIBTEST=1
+# we have a separate distribtest for net5.0
+ENV SKIP_NET50_DISTRIBTEST=1
index ec74b00..7f013b7 100644 (file)
@@ -16,6 +16,6 @@ FROM debian:stretch
 
 RUN apt-get update && apt-get install -y php php-dev php-pear wget zlib1g-dev
 
-RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && \
-  mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \
+RUN wget https://phar.phpunit.de/phpunit-8.5.8.phar && \
+  mv phpunit-8.5.8.phar /usr/local/bin/phpunit && \
   chmod +x /usr/local/bin/phpunit
index d2b2d8e..4c9e480 100644 (file)
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # Docker file for building gRPC artifacts.
-# Updated: 2020-06-16
+# Updated: 2020-10-08
 
 ##################
 # Base
index ec6a25a..96effec 100644 (file)
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # Docker file for building gRPC artifacts.
-# Updated: 2020-06-16
+# Updated: 2020-10-08
 
 ##################
 # Base
index 287ed1c..84fa461 100644 (file)
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # Docker file for building gRPC manylinux Python artifacts.
-# Updated: 2020-06-25
+# Updated: 2020-10-08
 
 FROM quay.io/pypa/manylinux2010_x86_64
 
index 240165a..b375792 100644 (file)
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # Docker file for building gRPC manylinux Python artifacts.
-# Updated: 2020-06-25
+# Updated: 2020-10-08
 
 FROM quay.io/pypa/manylinux2010_i686
 
index ef90555..1ded6e7 100644 (file)
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # Docker file for building gRPC manylinux Python artifacts.
-# Updated: 2020-06-25
+# Updated: 2020-10-08
 
 FROM quay.io/pypa/manylinux2014_x86_64
 
index ff23414..2f25e29 100644 (file)
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # Docker file for building gRPC manylinux Python artifacts.
-# Updated: 2020-06-25
+# Updated: 2020-10-08
 
 FROM quay.io/pypa/manylinux2014_i686
 
index 69ec202..acc784a 100644 (file)
 
 FROM debian:10
 
-RUN apt-get update && apt-get install -y clang-format
+# Add buster-backports for more recent clang packages
+RUN echo "deb http://deb.debian.org/debian buster-backports main" | tee /etc/apt/sources.list.d/buster-backports.list
+
+# Install clang-format
+RUN apt-get update && apt-get install -y clang-format-8
+ENV CLANG_FORMAT=clang-format-8
+
 ADD clang_format_all_the_things.sh /
 
 # When running locally, we'll be impersonating the current user, so we need
index 494dc64..662ff8a 100644 (file)
@@ -61,12 +61,12 @@ RUN mkdir /var/local/jenkins
 
 
 
-# Install clang-tidy 6.0
-# This is because clang-tidy 7.0 started treating compiler errors as tidy errors
-# and there are a couple of files which are not properly compiled via tidy so it
-# should be using 6.0 version until all compilation errors are addressed.
-RUN apt-get update && apt-get install -y clang-tidy-6.0
-ENV CLANG_TIDY=clang-tidy-6.0
+# Add buster-backports for more recent clang packages
+RUN echo "deb http://deb.debian.org/debian buster-backports main" | tee /etc/apt/sources.list.d/buster-backports.list
+
+# Install clang-tidy 7
+RUN apt-get update && apt-get install -y clang-tidy-8 jq
+ENV CLANG_TIDY=clang-tidy-8
 
 ADD clang_tidy_all_the_things.sh /
 
index cad2b2b..947ffba 100755 (executable)
@@ -20,5 +20,9 @@ CLANG_TIDY=${CLANG_TIDY:-clang-tidy}
 
 cd ${CLANG_TIDY_ROOT}
 
-find src/core src/cpp test/core test/cpp ! -path 'src/core/ext/upb-generated/*' ! -path 'src/core/ext/upbdefs-generated/*' -name '*.h' -or -name '*.cc' -print0 \
-  | xargs -0 tools/distrib/run_clang_tidy.py "$@"
+# run clang tidy for all source files
+cat compile_commands.json | jq -r '.[].file' \
+  | grep -E "(^src/core/|^src/cpp/|^test/core/|^test/cpp/)" \
+  | grep -v -E "/upb-generated/|/upbdefs-generated/" \
+  | sort \
+  | xargs tools/distrib/run_clang_tidy.py "$@"
index e771df4..71d76fc 100644 (file)
@@ -19,7 +19,7 @@ FROM grpc/base
 ADD version.txt version.txt
 
 # Install tools needed for building protoc.
-RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev
+RUN apt-get update && apt-get -y install libgtest-dev
 
 # Get the protobuf source from GitHub.
 RUN mkdir -p /var/local/git
index 265bafa..cc11221 100644 (file)
@@ -17,7 +17,6 @@ FROM grpc/clang:latest
 RUN apt-get update && apt-get install -y \
   autoconf \
   libtool \
-  libgflags-dev \
   libgtest-dev \
   && apt-get clean
 
index 39d26d4..6c65771 100644 (file)
@@ -63,7 +63,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 #================
 # C# dependencies
index 39d26d4..6c65771 100644 (file)
@@ -63,7 +63,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 #================
 # C# dependencies
index 40b56cc..6a2863a 100644 (file)
@@ -64,7 +64,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 #=================
 # C++ dependencies
index dd9b8e5..279df5b 100644 (file)
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-FROM google/dart:2.7
+FROM google/dart:2.10
 
 # Define the default command.
 CMD ["bash"]
index 78f6a72..62c68b1 100644 (file)
@@ -31,7 +31,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Define the default command.
 CMD ["bash"]
index b11ace3..309340c 100755 (executable)
 # Builds Go interop server and client in a base image.
 set -e
 
+# Turn on support for Go modules.
+export GO111MODULE=on
+
 # Clone just the grpc-go source code without any dependencies.
 # We are cloning from a local git repo that contains the right revision
 # to test instead of using "go get" to download from Github directly.
 git clone --recursive /var/local/jenkins/grpc-go src/google.golang.org/grpc
 
-# Get all gRPC Go dependencies
-(cd src/google.golang.org/grpc && make deps && make testdeps)
-
 # copy service account keys if available
 cp -r /var/local/jenkins/service_account $HOME || true
 
index 06787bc..146af2d 100644 (file)
@@ -31,7 +31,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Define the default command.
 CMD ["bash"]
index b11ace3..309340c 100644 (file)
 # Builds Go interop server and client in a base image.
 set -e
 
+# Turn on support for Go modules.
+export GO111MODULE=on
+
 # Clone just the grpc-go source code without any dependencies.
 # We are cloning from a local git repo that contains the right revision
 # to test instead of using "go get" to download from Github directly.
 git clone --recursive /var/local/jenkins/grpc-go src/google.golang.org/grpc
 
-# Get all gRPC Go dependencies
-(cd src/google.golang.org/grpc && make deps && make testdeps)
-
 # copy service account keys if available
 cp -r /var/local/jenkins/service_account $HOME || true
 
diff --git a/tools/dockerfile/interoptest/grpc_interop_go1.7/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_go1.7/Dockerfile
deleted file mode 100644 (file)
index 2467c1e..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2017 gRPC authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-FROM golang:1.7
-
-# Using login shell removes Go from path, so we add it.
-RUN ln -s /usr/local/go/bin/go /usr/local/bin
-
-#====================
-# Python dependencies
-
-# Install dependencies
-
-RUN apt-get update && apt-get install -y \
-    python-all-dev \
-    python3-all-dev \
-    python-setuptools
-
-# Install Python packages from PyPI
-RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
-RUN pip install --upgrade pip==19.3.1
-RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
-
-# Define the default command.
-CMD ["bash"]
diff --git a/tools/dockerfile/interoptest/grpc_interop_go1.7/build_interop.sh b/tools/dockerfile/interoptest/grpc_interop_go1.7/build_interop.sh
deleted file mode 100644 (file)
index b11ace3..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-# Copyright 2015 gRPC authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# Builds Go interop server and client in a base image.
-set -e
-
-# Clone just the grpc-go source code without any dependencies.
-# We are cloning from a local git repo that contains the right revision
-# to test instead of using "go get" to download from Github directly.
-git clone --recursive /var/local/jenkins/grpc-go src/google.golang.org/grpc
-
-# Get all gRPC Go dependencies
-(cd src/google.golang.org/grpc && make deps && make testdeps)
-
-# copy service account keys if available
-cp -r /var/local/jenkins/service_account $HOME || true
-
-# Build the interop client and server
-(cd src/google.golang.org/grpc/interop/client && go install)
-(cd src/google.golang.org/grpc/interop/server && go install)
-  
index e8384dd..45fd264 100644 (file)
@@ -31,7 +31,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Define the default command.
 CMD ["bash"]
index d0232d6..ef13d2d 100644 (file)
@@ -31,7 +31,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 RUN pip install twisted h2==2.6.1 hyper
 
index cc9e254..5754ead 100644 (file)
@@ -64,7 +64,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 #==================
 # Node dependencies
index b3becf1..9507dbc 100644 (file)
@@ -64,7 +64,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 #==================
 # Ruby dependencies
index f07a3b5..f317b5b 100644 (file)
@@ -28,7 +28,7 @@ RUN ln -s /usr/local/go/bin/go /usr/local/bin
 # Install Python packages from PyPI
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Define the default command.
 CMD ["bash"]
index 4080538..c10b83e 100644 (file)
@@ -47,7 +47,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 
 #=================
index 684c26f..609b34f 100644 (file)
@@ -63,7 +63,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Google Cloud platform API libraries
 RUN pip install --upgrade google-api-python-client oauth2client
index c75945f..cfff38e 100644 (file)
@@ -40,16 +40,11 @@ RUN apk update && apk add \
 # Install Python packages from PyPI
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.0.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.0.post1 six==1.15.0 twisted==17.5.0
 
 # Google Cloud platform API libraries
 RUN pip install --upgrade google-api-python-client
 
-# Install gflags
-RUN git clone https://github.com/gflags/gflags.git && cd gflags && git checkout v2.2.0
-RUN cd gflags && cmake . && make && make install
-RUN ln -s /usr/local/include/gflags /usr/include/gflags
-
 
 RUN mkdir /var/local/jenkins
 
index 1f43614..7ab7392 100644 (file)
@@ -63,7 +63,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Google Cloud platform API libraries
 RUN pip install --upgrade google-api-python-client oauth2client
index 00f51cf..a9a6124 100644 (file)
@@ -64,7 +64,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Google Cloud platform API libraries
 RUN pip install --upgrade google-api-python-client oauth2client
index ce5e074..3d5cf6d 100644 (file)
@@ -64,7 +64,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Google Cloud platform API libraries
 RUN pip install --upgrade google-api-python-client oauth2client
index 3c74483..043b1a6 100644 (file)
@@ -63,7 +63,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Google Cloud platform API libraries
 RUN pip install --upgrade google-api-python-client oauth2client
index 637ad1f..7928ef0 100644 (file)
@@ -63,7 +63,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Google Cloud platform API libraries
 RUN pip install --upgrade google-api-python-client oauth2client
index 9f9f247..3e776f0 100644 (file)
@@ -64,7 +64,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Google Cloud platform API libraries
 RUN pip install --upgrade google-api-python-client oauth2client
index 30c278c..5936a81 100644 (file)
@@ -75,7 +75,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Google Cloud platform API libraries
 RUN pip install --upgrade google-api-python-client oauth2client
index 0113d68..446e287 100644 (file)
@@ -34,7 +34,7 @@ RUN cd pthreads && \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 RUN curl -sS https://getcomposer.org/installer | php
 RUN mv composer.phar /usr/local/bin/composer
index 60fec1d..2e456a1 100644 (file)
@@ -75,7 +75,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Google Cloud platform API libraries
 RUN pip install --upgrade google-api-python-client oauth2client
index 1b806ab..b36b134 100644 (file)
@@ -39,7 +39,7 @@ RUN apk update && apk add \
 # Install Python packages from PyPI
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.0.post1 six==1.10.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.0.post1 six==1.15.0
 
 # Google Cloud platform API libraries
 RUN pip install --upgrade google-api-python-client oauth2client
index 12dc385..b0f6ddb 100644 (file)
@@ -64,7 +64,7 @@ RUN apt-get update && apt-get install -y \
 RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
 RUN pip install --upgrade pip==19.3.1
 RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
 
 # Google Cloud platform API libraries
 RUN pip install --upgrade google-api-python-client oauth2client
index 7a75aba..2d4c243 100644 (file)
@@ -81,15 +81,13 @@ RUN apt-get update && apt-get install -y \
 RUN python2 -m pip install simplejson mako virtualenv==16.7.9 lxml
 RUN python3 -m pip install simplejson mako virtualenv==16.7.9 lxml
 
-# Install clang & clang-format
-RUN apt-get install -y clang clang-format
-
-# Install clang-tidy 6.0
-# This is because clang-tidy 7.0 started treating compiler errors as tidy errors
-# and there are a couple of files which are not properly compiled via tidy so it
-# should be using 6.0 version until all compilation errors are addressed.
-RUN apt-get install -y clang-tidy-6.0
-ENV CLANG_TIDY=clang-tidy-6.0
+# Add buster-backports for more recent clang packages
+RUN echo "deb http://deb.debian.org/debian buster-backports main" | tee /etc/apt/sources.list.d/buster-backports.list
+
+# Install clang, clang-format, and clang-tidy
+RUN apt-get update && apt-get install -y clang clang-format-8 clang-tidy-8 jq
+ENV CLANG_FORMAT=clang-format-8
+ENV CLANG_TIDY=clang-tidy-8
 
 
 #========================
index 0e26133..eafa49e 100644 (file)
@@ -40,7 +40,7 @@ PROJECT_NAME           = "GRPC C++"
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 1.33.2
+PROJECT_NUMBER         = 1.34.0
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -1010,6 +1010,7 @@ include/grpcpp/security/auth_context.h \
 include/grpcpp/security/auth_metadata_processor.h \
 include/grpcpp/security/credentials.h \
 include/grpcpp/security/server_credentials.h \
+include/grpcpp/security/tls_certificate_provider.h \
 include/grpcpp/security/tls_credentials_options.h \
 include/grpcpp/server.h \
 include/grpcpp/server_builder.h \
index 4360f38..2a278bb 100644 (file)
@@ -40,7 +40,7 @@ PROJECT_NAME           = "GRPC C++"
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 1.33.2
+PROJECT_NUMBER         = 1.34.0
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -1010,6 +1010,7 @@ include/grpcpp/security/auth_context.h \
 include/grpcpp/security/auth_metadata_processor.h \
 include/grpcpp/security/credentials.h \
 include/grpcpp/security/server_credentials.h \
+include/grpcpp/security/tls_certificate_provider.h \
 include/grpcpp/security/tls_credentials_options.h \
 include/grpcpp/server.h \
 include/grpcpp/server_builder.h \
@@ -1086,8 +1087,8 @@ src/core/ext/filters/client_channel/lb_policy/subchannel_list.h \
 src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \
 src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \
 src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \
-src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc \
 src/core/ext/filters/client_channel/lb_policy/xds/xds.h \
+src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc \
 src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc \
 src/core/ext/filters/client_channel/lb_policy_factory.h \
 src/core/ext/filters/client_channel/lb_policy_registry.cc \
@@ -1348,8 +1349,6 @@ src/core/ext/upb-generated/google/api/http.upb.c \
 src/core/ext/upb-generated/google/api/http.upb.h \
 src/core/ext/upb-generated/google/protobuf/any.upb.c \
 src/core/ext/upb-generated/google/protobuf/any.upb.h \
-src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
-src/core/ext/upb-generated/google/protobuf/descriptor.upb.h \
 src/core/ext/upb-generated/google/protobuf/duration.upb.c \
 src/core/ext/upb-generated/google/protobuf/duration.upb.h \
 src/core/ext/upb-generated/google/protobuf/empty.upb.c \
@@ -1398,16 +1397,177 @@ src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
 src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h \
 src/core/ext/upb-generated/validate/validate.upb.c \
 src/core/ext/upb-generated/validate/validate.upb.h \
+src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h \
+src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c \
+src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h \
+src/core/ext/upbdefs-generated/google/api/http.upbdefs.c \
+src/core/ext/upbdefs-generated/google/api/http.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h \
+src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \
+src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h \
+src/core/ext/upbdefs-generated/validate/validate.upbdefs.c \
+src/core/ext/upbdefs-generated/validate/validate.upbdefs.h \
 src/core/ext/xds/certificate_provider_factory.h \
 src/core/ext/xds/certificate_provider_registry.cc \
 src/core/ext/xds/certificate_provider_registry.h \
+src/core/ext/xds/certificate_provider_store.cc \
 src/core/ext/xds/certificate_provider_store.h \
+src/core/ext/xds/file_watcher_certificate_provider_factory.cc \
+src/core/ext/xds/file_watcher_certificate_provider_factory.h \
 src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc \
 src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h \
 src/core/ext/xds/xds_api.cc \
 src/core/ext/xds/xds_api.h \
 src/core/ext/xds/xds_bootstrap.cc \
 src/core/ext/xds/xds_bootstrap.h \
+src/core/ext/xds/xds_certificate_provider.cc \
+src/core/ext/xds/xds_certificate_provider.h \
 src/core/ext/xds/xds_channel_args.h \
 src/core/ext/xds/xds_client.cc \
 src/core/ext/xds/xds_client.h \
@@ -1499,6 +1659,7 @@ src/core/lib/gpr/tls_gcc.h \
 src/core/lib/gpr/tls_msvc.h \
 src/core/lib/gpr/tls_pthread.cc \
 src/core/lib/gpr/tls_pthread.h \
+src/core/lib/gpr/tls_stdcpp.h \
 src/core/lib/gpr/tmpfile.h \
 src/core/lib/gpr/tmpfile_msys.cc \
 src/core/lib/gpr/tmpfile_posix.cc \
@@ -1510,6 +1671,8 @@ src/core/lib/gprpp/arena.h \
 src/core/lib/gprpp/atomic.h \
 src/core/lib/gprpp/debug_location.h \
 src/core/lib/gprpp/dual_ref_counted.h \
+src/core/lib/gprpp/examine_stack.cc \
+src/core/lib/gprpp/examine_stack.h \
 src/core/lib/gprpp/fork.cc \
 src/core/lib/gprpp/fork.h \
 src/core/lib/gprpp/global_config.h \
@@ -1527,6 +1690,9 @@ src/core/lib/gprpp/mpscq.h \
 src/core/lib/gprpp/orphanable.h \
 src/core/lib/gprpp/ref_counted.h \
 src/core/lib/gprpp/ref_counted_ptr.h \
+src/core/lib/gprpp/stat.h \
+src/core/lib/gprpp/stat_posix.cc \
+src/core/lib/gprpp/stat_windows.cc \
 src/core/lib/gprpp/sync.h \
 src/core/lib/gprpp/thd.h \
 src/core/lib/gprpp/thd_posix.cc \
@@ -1730,8 +1896,6 @@ src/core/lib/security/authorization/mock_cel/cel_expression.h \
 src/core/lib/security/authorization/mock_cel/cel_value.h \
 src/core/lib/security/authorization/mock_cel/evaluator_core.h \
 src/core/lib/security/authorization/mock_cel/flat_expr_builder.h \
-src/core/lib/security/authorization/mock_cel/statusor.h \
-src/core/lib/security/certificate_provider.h \
 src/core/lib/security/context/security_context.cc \
 src/core/lib/security/context/security_context.h \
 src/core/lib/security/credentials/alts/alts_credentials.cc \
@@ -1750,6 +1914,14 @@ src/core/lib/security/credentials/composite/composite_credentials.h \
 src/core/lib/security/credentials/credentials.cc \
 src/core/lib/security/credentials/credentials.h \
 src/core/lib/security/credentials/credentials_metadata.cc \
+src/core/lib/security/credentials/external/aws_request_signer.cc \
+src/core/lib/security/credentials/external/aws_request_signer.h \
+src/core/lib/security/credentials/external/external_account_credentials.cc \
+src/core/lib/security/credentials/external/external_account_credentials.h \
+src/core/lib/security/credentials/external/file_external_account_credentials.cc \
+src/core/lib/security/credentials/external/file_external_account_credentials.h \
+src/core/lib/security/credentials/external/url_external_account_credentials.cc \
+src/core/lib/security/credentials/external/url_external_account_credentials.h \
 src/core/lib/security/credentials/fake/fake_credentials.cc \
 src/core/lib/security/credentials/fake/fake_credentials.h \
 src/core/lib/security/credentials/google_default/credentials_generic.cc \
@@ -1757,6 +1929,7 @@ src/core/lib/security/credentials/google_default/google_default_credentials.cc \
 src/core/lib/security/credentials/google_default/google_default_credentials.h \
 src/core/lib/security/credentials/iam/iam_credentials.cc \
 src/core/lib/security/credentials/iam/iam_credentials.h \
+src/core/lib/security/credentials/insecure/insecure_credentials.cc \
 src/core/lib/security/credentials/jwt/json_token.cc \
 src/core/lib/security/credentials/jwt/json_token.h \
 src/core/lib/security/credentials/jwt/jwt_credentials.cc \
@@ -1773,6 +1946,8 @@ src/core/lib/security/credentials/ssl/ssl_credentials.cc \
 src/core/lib/security/credentials/ssl/ssl_credentials.h \
 src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc \
 src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h \
+src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc \
+src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h \
 src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc \
 src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h \
 src/core/lib/security/credentials/tls/tls_credentials.cc \
@@ -1783,6 +1958,8 @@ src/core/lib/security/security_connector/alts/alts_security_connector.cc \
 src/core/lib/security/security_connector/alts/alts_security_connector.h \
 src/core/lib/security/security_connector/fake/fake_security_connector.cc \
 src/core/lib/security/security_connector/fake/fake_security_connector.h \
+src/core/lib/security/security_connector/insecure/insecure_security_connector.cc \
+src/core/lib/security/security_connector/insecure/insecure_security_connector.h \
 src/core/lib/security/security_connector/load_system_roots.h \
 src/core/lib/security/security_connector/load_system_roots_fallback.cc \
 src/core/lib/security/security_connector/load_system_roots_linux.cc \
@@ -1953,6 +2130,7 @@ src/cpp/client/credentials_cc.cc \
 src/cpp/client/insecure_credentials.cc \
 src/cpp/client/secure_credentials.cc \
 src/cpp/client/secure_credentials.h \
+src/cpp/client/xds_credentials.cc \
 src/cpp/codegen/codegen_init.cc \
 src/cpp/common/alarm.cc \
 src/cpp/common/auth_property_iterator.cc \
@@ -1967,6 +2145,7 @@ src/cpp/common/secure_auth_context.cc \
 src/cpp/common/secure_auth_context.h \
 src/cpp/common/secure_channel_arguments.cc \
 src/cpp/common/secure_create_auth_context.cc \
+src/cpp/common/tls_certificate_provider.cc \
 src/cpp/common/tls_credentials_options.cc \
 src/cpp/common/tls_credentials_options_util.cc \
 src/cpp/common/tls_credentials_options_util.h \
index 9952600..ff7e77f 100644 (file)
@@ -40,7 +40,7 @@ PROJECT_NAME           = "GRPC Core"
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 13.0.0
+PROJECT_NUMBER         = 14.0.0
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
index 4701354..fd1cc39 100644 (file)
@@ -40,7 +40,7 @@ PROJECT_NAME           = "GRPC Core"
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 13.0.0
+PROJECT_NUMBER         = 14.0.0
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -914,8 +914,8 @@ src/core/ext/filters/client_channel/lb_policy/subchannel_list.h \
 src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \
 src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \
 src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \
-src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc \
 src/core/ext/filters/client_channel/lb_policy/xds/xds.h \
+src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc \
 src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc \
 src/core/ext/filters/client_channel/lb_policy_factory.h \
 src/core/ext/filters/client_channel/lb_policy_registry.cc \
@@ -1186,8 +1186,6 @@ src/core/ext/upb-generated/google/api/http.upb.c \
 src/core/ext/upb-generated/google/api/http.upb.h \
 src/core/ext/upb-generated/google/protobuf/any.upb.c \
 src/core/ext/upb-generated/google/protobuf/any.upb.h \
-src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
-src/core/ext/upb-generated/google/protobuf/descriptor.upb.h \
 src/core/ext/upb-generated/google/protobuf/duration.upb.c \
 src/core/ext/upb-generated/google/protobuf/duration.upb.h \
 src/core/ext/upb-generated/google/protobuf/empty.upb.c \
@@ -1236,16 +1234,177 @@ src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
 src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h \
 src/core/ext/upb-generated/validate/validate.upb.c \
 src/core/ext/upb-generated/validate/validate.upb.h \
+src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h \
+src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c \
+src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h \
+src/core/ext/upbdefs-generated/google/api/http.upbdefs.c \
+src/core/ext/upbdefs-generated/google/api/http.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h \
+src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c \
+src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h \
+src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \
+src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h \
+src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c \
+src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h \
+src/core/ext/upbdefs-generated/validate/validate.upbdefs.c \
+src/core/ext/upbdefs-generated/validate/validate.upbdefs.h \
 src/core/ext/xds/certificate_provider_factory.h \
 src/core/ext/xds/certificate_provider_registry.cc \
 src/core/ext/xds/certificate_provider_registry.h \
+src/core/ext/xds/certificate_provider_store.cc \
 src/core/ext/xds/certificate_provider_store.h \
+src/core/ext/xds/file_watcher_certificate_provider_factory.cc \
+src/core/ext/xds/file_watcher_certificate_provider_factory.h \
 src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc \
 src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h \
 src/core/ext/xds/xds_api.cc \
 src/core/ext/xds/xds_api.h \
 src/core/ext/xds/xds_bootstrap.cc \
 src/core/ext/xds/xds_bootstrap.h \
+src/core/ext/xds/xds_certificate_provider.cc \
+src/core/ext/xds/xds_certificate_provider.h \
 src/core/ext/xds/xds_channel_args.h \
 src/core/ext/xds/xds_client.cc \
 src/core/ext/xds/xds_client.h \
@@ -1340,6 +1499,7 @@ src/core/lib/gpr/tls_gcc.h \
 src/core/lib/gpr/tls_msvc.h \
 src/core/lib/gpr/tls_pthread.cc \
 src/core/lib/gpr/tls_pthread.h \
+src/core/lib/gpr/tls_stdcpp.h \
 src/core/lib/gpr/tmpfile.h \
 src/core/lib/gpr/tmpfile_msys.cc \
 src/core/lib/gpr/tmpfile_posix.cc \
@@ -1352,6 +1512,8 @@ src/core/lib/gprpp/arena.h \
 src/core/lib/gprpp/atomic.h \
 src/core/lib/gprpp/debug_location.h \
 src/core/lib/gprpp/dual_ref_counted.h \
+src/core/lib/gprpp/examine_stack.cc \
+src/core/lib/gprpp/examine_stack.h \
 src/core/lib/gprpp/fork.cc \
 src/core/lib/gprpp/fork.h \
 src/core/lib/gprpp/global_config.h \
@@ -1369,6 +1531,9 @@ src/core/lib/gprpp/mpscq.h \
 src/core/lib/gprpp/orphanable.h \
 src/core/lib/gprpp/ref_counted.h \
 src/core/lib/gprpp/ref_counted_ptr.h \
+src/core/lib/gprpp/stat.h \
+src/core/lib/gprpp/stat_posix.cc \
+src/core/lib/gprpp/stat_windows.cc \
 src/core/lib/gprpp/sync.h \
 src/core/lib/gprpp/thd.h \
 src/core/lib/gprpp/thd_posix.cc \
@@ -1573,8 +1738,6 @@ src/core/lib/security/authorization/mock_cel/cel_expression.h \
 src/core/lib/security/authorization/mock_cel/cel_value.h \
 src/core/lib/security/authorization/mock_cel/evaluator_core.h \
 src/core/lib/security/authorization/mock_cel/flat_expr_builder.h \
-src/core/lib/security/authorization/mock_cel/statusor.h \
-src/core/lib/security/certificate_provider.h \
 src/core/lib/security/context/security_context.cc \
 src/core/lib/security/context/security_context.h \
 src/core/lib/security/credentials/alts/alts_credentials.cc \
@@ -1593,6 +1756,14 @@ src/core/lib/security/credentials/composite/composite_credentials.h \
 src/core/lib/security/credentials/credentials.cc \
 src/core/lib/security/credentials/credentials.h \
 src/core/lib/security/credentials/credentials_metadata.cc \
+src/core/lib/security/credentials/external/aws_request_signer.cc \
+src/core/lib/security/credentials/external/aws_request_signer.h \
+src/core/lib/security/credentials/external/external_account_credentials.cc \
+src/core/lib/security/credentials/external/external_account_credentials.h \
+src/core/lib/security/credentials/external/file_external_account_credentials.cc \
+src/core/lib/security/credentials/external/file_external_account_credentials.h \
+src/core/lib/security/credentials/external/url_external_account_credentials.cc \
+src/core/lib/security/credentials/external/url_external_account_credentials.h \
 src/core/lib/security/credentials/fake/fake_credentials.cc \
 src/core/lib/security/credentials/fake/fake_credentials.h \
 src/core/lib/security/credentials/google_default/credentials_generic.cc \
@@ -1600,6 +1771,7 @@ src/core/lib/security/credentials/google_default/google_default_credentials.cc \
 src/core/lib/security/credentials/google_default/google_default_credentials.h \
 src/core/lib/security/credentials/iam/iam_credentials.cc \
 src/core/lib/security/credentials/iam/iam_credentials.h \
+src/core/lib/security/credentials/insecure/insecure_credentials.cc \
 src/core/lib/security/credentials/jwt/json_token.cc \
 src/core/lib/security/credentials/jwt/json_token.h \
 src/core/lib/security/credentials/jwt/jwt_credentials.cc \
@@ -1616,6 +1788,8 @@ src/core/lib/security/credentials/ssl/ssl_credentials.cc \
 src/core/lib/security/credentials/ssl/ssl_credentials.h \
 src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc \
 src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h \
+src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc \
+src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h \
 src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc \
 src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h \
 src/core/lib/security/credentials/tls/tls_credentials.cc \
@@ -1626,6 +1800,8 @@ src/core/lib/security/security_connector/alts/alts_security_connector.cc \
 src/core/lib/security/security_connector/alts/alts_security_connector.h \
 src/core/lib/security/security_connector/fake/fake_security_connector.cc \
 src/core/lib/security/security_connector/fake/fake_security_connector.h \
+src/core/lib/security/security_connector/insecure/insecure_security_connector.cc \
+src/core/lib/security/security_connector/insecure/insecure_security_connector.h \
 src/core/lib/security/security_connector/load_system_roots.h \
 src/core/lib/security/security_connector/load_system_roots_fallback.cc \
 src/core/lib/security/security_connector/load_system_roots_linux.cc \
index 5791c71..0dc39d5 100644 (file)
@@ -40,7 +40,7 @@ PROJECT_NAME           = "GRPC Objective-C"
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 1.33.2
+PROJECT_NUMBER         = 1.34.0
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
index ac88597..1225e47 100644 (file)
@@ -40,7 +40,7 @@ PROJECT_NAME           = "GRPC Objective-C"
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 1.33.2
+PROJECT_NUMBER         = 1.34.0
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
index 01b8386..8913214 100644 (file)
@@ -40,7 +40,7 @@ PROJECT_NAME           = "GRPC PHP"
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 1.33.2
+PROJECT_NUMBER         = 1.34.0
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
index 63d54a4..62e0fdf 100755 (executable)
@@ -30,7 +30,7 @@ CLOUD_PROJECT=grpc-testing
 ZONE=us-central1-b  # this zone allows 32core machines
 
 INSTANCE_NAME="${1:-grpc-kokoro-performance-server1}"
-MACHINE_TYPE=n1-standard-32
+MACHINE_TYPE=e2-standard-32
 
 gcloud compute instances create "$INSTANCE_NAME" \
     --project="$CLOUD_PROJECT" \
index 1b014ad..412015f 100755 (executable)
@@ -25,7 +25,7 @@ ZONE=us-central1-b  # this zone allows 32core machines
 LATEST_PERF_WORKER_IMAGE=grpc-performance-kokoro-v5  # update if newer image exists
 
 INSTANCE_NAME="${1:-grpc-kokoro-performance-server}"
-MACHINE_TYPE="${2:-n1-standard-32}"
+MACHINE_TYPE="${2:-e2-standard-32}"
 
 gcloud compute instances create "$INSTANCE_NAME" \
     --project="$CLOUD_PROJECT" \
index 3625df8..fe8168c 100755 (executable)
@@ -31,7 +31,7 @@ else
   INSTANCE_NAME="${USER}-windows-kokoro-debug1"
 fi
 
-MACHINE_TYPE=n1-standard-8
+MACHINE_TYPE=e2-standard-8
 TMP_DISK_NAME="$INSTANCE_NAME-temp-disk"
 
 gcloud compute disks create "$TMP_DISK_NAME" \
@@ -50,7 +50,7 @@ gcloud compute instances create "$INSTANCE_NAME" \
     --zone "$ZONE" \
     --machine-type "$MACHINE_TYPE" \
     --image-project google.com:kokoro \
-    --image kokoro-win7build-v11-prod-debug \
+    --image kokoro-winserver2016-v2m-prod-debug \
     --boot-disk-size 500 \
     --boot-disk-type pd-ssd \
     --tags=allow-ssh \
index f89e81b..e81ba21 100755 (executable)
@@ -74,7 +74,7 @@ sudo apt-get install -y python-psutil python3-psutil
 sudo apt-get install -y google-cloud-sdk
 
 # C++ dependencies
-sudo apt-get install -y libgflags-dev libgtest-dev libc++-dev clang
+sudo apt-get install -y libgtest-dev libc++-dev clang
 
 # Python dependencies
 sudo pip install --upgrade pip==19.3.1
@@ -162,8 +162,8 @@ gem install bundler
 
 # PHP dependencies
 sudo apt-get install -y php7.2 php7.2-dev php-pear unzip zlib1g-dev
-sudo wget https://phar.phpunit.de/phpunit-5.7.27.phar && \
-    sudo mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \
+sudo wget https://phar.phpunit.de/phpunit-8.5.8.phar && \
+    sudo mv phpunit-8.5.8.phar /usr/local/bin/phpunit && \
     sudo chmod +x /usr/local/bin/phpunit
 curl -sS https://getcomposer.org/installer | php
 sudo mv composer.phar /usr/local/bin/composer
index f003175..9885adc 100644 (file)
@@ -85,7 +85,7 @@ $Python39x86Config = @{
     PythonInstallPath = "C:\Python39_32bit"
     PythonInstallerHash = "4a2812db8ab9f2e522c96c7728cfcccb"
 }
-Install-Python @Python39x86Config
+Install-Python @Python39x86Config
 
 $Python39x64Config = @{
     PythonVersion = "3.9.0"
@@ -93,4 +93,4 @@ $Python39x64Config = @{
     PythonInstallPath = "C:\Python39"
     PythonInstallerHash = "b61a33dc28f13b561452f3089c87eb63"
 }
-Install-Python @Python39x64Config
+Install-Python @Python39x64Config
index 47c2e31..a8851cc 100644 (file)
@@ -26,7 +26,7 @@ ulimit -a
 # - only add stuff that you absolutely need for your builds to work (add comment to explain why its needed)
 
 # Add GCP credentials for BQ access
-pip install --user google-api-python-client oauth2client
+pip install --user google-api-python-client oauth2client six==1.15.0
 export GOOGLE_APPLICATION_CREDENTIALS=${KOKORO_GFILE_DIR}/GrpcTesting-d0eeee2db331.json
 
 # If this is a PR using RUN_TESTS_FLAGS var, then add flags to filter tests
@@ -37,16 +37,32 @@ fi
 if [ "${PREPARE_BUILD_INSTALL_DEPS_RUBY}" == "true" ]
 then
   brew update
+
+  # The latest gnupg version removes support for macos high sierra which would break ruby installation,
+  # so we need to pin a version before that. Unfortunately Homebrew is one of the most pathetic package
+  # managers out there and there is simply no way to install a specific version of gnupg.
+  # Instead, we force homebrew to use a slightly old version of the homebrew-core
+  # formula repository (before things got broken for us), so the homebrew formulas installed later
+  # will still work with MacOS high-sierra.
+  # Also https://github.com/Homebrew/homebrew-core/blob/07f2f9aab198ce369e24621b7c7224f63ffd27fb/Formula/gnupg.rb
+  # TODO(jtattermusch): migrate to MacOS mojave as soon as possible to avoid this ugly hack.
+  (cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core; git checkout 07f2f9aab198ce369e24621b7c7224f63ffd27fb)
+  # disable automatic brew update on "brew install" (which would ruin our explicit checkout)
+  export HOMEBREW_NO_AUTO_UPDATE=1
   # special case fix for https://github.com/grpc/grpc/issues/23027
   rm -f /usr/local/bin/gpg
   rm -f /usr/local/bin/gpgconf
   rm -f /usr/local/bin/gpgsm
   # end https://github.com/grpc/grpc/issues/23027
   brew cleanup
+
   set +ex
   source $HOME/.rvm/scripts/rvm
   set -ex
   for RUBY_VERSION in 2.5.0 2.7.0; do
+    # TODO(jtattermusch): find a better way of installing ruby, as the current way installs a huge number
+    # of completely unnecessary brew packages which 1. takes long time 2. is very prone to errors
+    # 3. generates a ton of logs making it super hard to debug when it breaks.
     rvm --debug requirements "ruby-${RUBY_VERSION}"
     time rvm install "$RUBY_VERSION"
     time gem install bundler -v 1.17.3 --no-document
@@ -62,13 +78,11 @@ if [ "${PREPARE_BUILD_INSTALL_DEPS_OBJC}" == "true" ]
 then
   # cocoapods
   export LANG=en_US.UTF-8
+  time gem install cocoapods --version 1.7.2 --no-document
   # pre-fetch cocoapods master repo's most recent commit only
   mkdir -p ~/.cocoapods/repos
   time git clone --depth 1 https://github.com/CocoaPods/Specs.git ~/.cocoapods/repos/master
 
-  # set xcode version for Obj-C tests
-  sudo xcode-select -switch /Applications/Xcode_9.2.app/Contents/Developer/
-
   # Needed for ios-binary-size
   time pip install --user pyyaml pyjwt cryptography requests
 
@@ -88,7 +102,7 @@ if [ "${PREPARE_BUILD_INSTALL_DEPS_PYTHON}" == "true" ]
 then
   # python
   time pip install --user virtualenv
-  time pip install --user --upgrade Mako six tox setuptools==44.1.1 twisted pyyaml pyjwt cryptography requests
+  time pip install --user --upgrade Mako tox setuptools==44.1.1 twisted pyyaml pyjwt cryptography requests
 
   # make sure md5sum is available (requires coreutils 8.31+)
   brew update-reset
@@ -113,9 +127,6 @@ then
   export NUGET_XMLDOC_MODE=skip
   export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true
   export DOTNET_CLI_TELEMETRY_OPTOUT=true
-
-  # Xcode 10+ doesn't support building for i386 architecture
-  sudo xcode-select -switch /Applications/Xcode_9.2.app/Contents/Developer/
 fi
 
 # PHP tests currently require using an older version of PHPUnit
index df2b724..fdc7b09 100644 (file)
@@ -36,16 +36,16 @@ python -m pip install google-api-python-client || goto :error
 powershell -File src\csharp\install_dotnet_sdk.ps1 || goto :error
 set PATH=%LOCALAPPDATA%\Microsoft\dotnet;%PATH%
 
-@rem Install Python interpreters
-@rem NOTE(lidiz): Python installer process may live longer than expected, and
-@rem has other side effects. It needs to be installed last to reduce impact.
-powershell -File tools\internal_ci\helper_scripts\install_python_interpreters.ps1 || goto :error
-
 @rem Disable some unwanted dotnet options
 set NUGET_XMLDOC_MODE=skip
 set DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true
 set DOTNET_CLI_TELEMETRY_OPTOUT=true
 
+@rem Only install Python interpreters if we are running Python tests
+If "%PREPARE_BUILD_INSTALL_DEPS_PYTHON%" == "true" (
+    powershell -File tools\internal_ci\helper_scripts\install_python_interpreters.ps1 || goto :error
+)
+
 git submodule update --init || goto :error
 
 goto :EOF
index e6e751c..60d5fc3 100755 (executable)
@@ -26,3 +26,18 @@ ${name}')
 cd /var/local/git/grpc
 
 bazel build :all //test/... //examples/...
+
+# TODO(jtattersmusch): Adding a build here for --define=grpc_no_xds is not ideal
+# and we should find a better place for this. Refer
+# https://github.com/grpc/grpc/pull/24536#pullrequestreview-517466531 for more
+# details.
+# Test that builds with --define=grpc_no_xds=true work.
+bazel build //test/cpp/end2end:end2end_test --define=grpc_no_xds=true
+# Test that builds that need xDS do not build with --define=grpc_no_xds=true
+EXIT_CODE=0
+bazel build //test/cpp/end2end:xds_end2end_test --define=grpc_no_xds=true || EXIT_CODE=$?
+if [ $EXIT_CODE -eq 0 ]
+then
+       echo "Building xds_end2end_test succeeded even with --define=grpc_no_xds=true"
+       exit 1
+fi
index 5a358ac..d5b38de 100755 (executable)
@@ -34,7 +34,6 @@ tools/bazel \
   test \
   --invocation_id="${BAZEL_INVOCATION_ID}" \
   --workspace_status_command=tools/remote_build/workspace_status_kokoro.sh \
-  --google_credentials="${KOKORO_GFILE_DIR}/GrpcTesting-d0eeee2db331.json" \
   $@ \
   -- //test/... || FAILED="true"
 
index abfc486..4ed1036 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/grpc_asan_on_foundry.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index 607b2e5..4af3b7e 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/grpc_bazel_on_foundry_dbg.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index fdd7324..172cc15 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/grpc_bazel_rbe_incompatible_changes.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index 9803647..8877670 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/grpc_msan_on_foundry.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index e34e041..615536c 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/grpc_bazel_on_foundry_opt.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index 4877981..92852ff 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/grpc_tsan_on_foundry.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index 1c72b91..21cdbff 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/grpc_ubsan_on_foundry.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index 7ab0898..d14ccc7 100755 (executable)
@@ -62,7 +62,7 @@ bazel build //src/python/grpcio_tests/tests_py3_only/interop:xds_interop_client
 
 # Test cases "path_matching" and "header_matching" are not included in "all",
 # because not all interop clients in all languages support these new tests.
-GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,xds_cluster_manager_lb,cds_lb,eds_lb,priority_lb,weighted_target_lb,lrs_lb "$PYTHON" \
+GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,xds_cluster_manager_lb,cds_lb,eds_lb,priority_lb,xds_cluster_impl_lb,weighted_target_lb "$PYTHON" \
   tools/run_tests/run_xds_tests.py \
     --test_case="all,path_matching,header_matching" \
     --project_id=grpc-testing \
index da306d1..c14fd7e 100755 (executable)
@@ -65,7 +65,7 @@ bazel build test/cpp/interop:xds_interop_client
 #
 # TODO: remove "path_matching" and "header_matching" from --test_case after
 # they are added into "all".
-GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,xds_cluster_manager_lb,cds_lb,eds_lb,priority_lb,weighted_target_lb,lrs_lb "$PYTHON" \
+GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,xds_cluster_manager_lb,cds_lb,eds_lb,priority_lb,xds_cluster_impl_lb,weighted_target_lb "$PYTHON" \
   tools/run_tests/run_xds_tests.py \
     --test_case="all,path_matching,header_matching" \
     --project_id=grpc-testing \
index d043c7f..36c4c88 100755 (executable)
@@ -65,7 +65,7 @@ python tools/run_tests/run_tests.py -l csharp -c opt --build_only
 #
 # TODO(jtattermusch): remove "path_matching" and "header_matching" from
 # --test_case after they are added into "all".
-GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,xds_cluster_manager_lb,cds_lb,eds_lb,priority_lb,weighted_target_lb,lrs_lb "$PYTHON" \
+GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,xds_cluster_manager_lb,cds_lb,eds_lb,priority_lb,xds_cluster_impl_lb,weighted_target_lb "$PYTHON" \
   tools/run_tests/run_xds_tests.py \
     --test_case="all,path_matching,header_matching" \
     --project_id=grpc-testing \
index 01f15b2..bcb72cf 100755 (executable)
@@ -70,7 +70,7 @@ export CC=/usr/bin/gcc
   composer install && \
   ./bin/generate_proto_php.sh)
 
-GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,xds_cluster_manager_lb,cds_lb,eds_lb,priority_lb,weighted_target_lb,lrs_lb "$PYTHON" \
+GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,xds_cluster_manager_lb,cds_lb,eds_lb,priority_lb,xds_cluster_impl_lb,weighted_target_lb "$PYTHON" \
   tools/run_tests/run_xds_tests.py \
   --test_case="all,path_matching,header_matching" \
   --project_id=grpc-testing \
index 9b84e49..47ead81 100644 (file)
@@ -60,7 +60,7 @@ touch "$TOOLS_DIR"/src/proto/grpc/health/v1/__init__.py
 
 (cd src/ruby && bundle && rake compile)
 
-GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,xds_cluster_manager_lb,cds_lb,eds_lb,priority_lb,weighted_target_lb,lrs_lb "$PYTHON" \
+GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,xds_cluster_manager_lb,cds_lb,eds_lb,priority_lb,xds_cluster_impl_lb,weighted_target_lb "$PYTHON" \
   tools/run_tests/run_xds_tests.py \
     --test_case="all,path_matching,header_matching" \
     --project_id=grpc-testing \
index b8aada2..5c794b8 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/pull_request/grpc_asan_on_foundry.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index 38efccf..c1aaf0c 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/pull_request/grpc_bazel_on_foundry_dbg.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index 14b97b6..078a6ae 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/pull_request/grpc_msan_on_foundry.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index f352113..cc6173d 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/pull_request/grpc_bazel_on_foundry_opt.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index 993024f..1b595b2 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/pull_request/grpc_tsan_on_foundry.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index 282aa55..b81692e 100644 (file)
@@ -18,7 +18,6 @@
 build_file: "grpc/tools/internal_ci/linux/pull_request/grpc_ubsan_on_foundry.sh"
 timeout_mins: 90
 
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
 
 bazel_setting {
index ed9c972..bfe1c8c 100644 (file)
@@ -48,7 +48,7 @@ if [ "$UPLOAD_TEST_RESULTS" != "" ]
 then
   # Sleep to let ResultStore finish writing results before querying
   sleep 60
-  python ./tools/run_tests/python_utils/upload_rbe_results.py
+  PYTHONHTTPSVERIFY=0 python ./tools/run_tests/python_utils/upload_rbe_results.py
 fi
 
 if [ "$FAILED" != "" ]
index 0ba0dc9..a878434 100644 (file)
@@ -24,7 +24,7 @@ powershell -Command "[guid]::NewGuid().ToString()" >%KOKORO_ARTIFACTS_DIR%/bazel
 set /p BAZEL_INVOCATION_ID=<%KOKORO_ARTIFACTS_DIR%/bazel_invocation_ids
 
 @rem TODO(jtattermusch): windows RBE should be able to use the same credentials as Linux RBE.
-bazel --bazelrc=tools/remote_build/windows.bazelrc test --invocation_id="%BAZEL_INVOCATION_ID%" %BAZEL_FLAGS% --workspace_status_command=tools/remote_build/workspace_status_kokoro.bat --google_credentials=%KOKORO_GFILE_DIR%/rbe-windows-credentials.json //test/...
+bazel --bazelrc=tools/remote_build/windows.bazelrc test --invocation_id="%BAZEL_INVOCATION_ID%" %BAZEL_FLAGS% --workspace_status_command=tools/remote_build/workspace_status_kokoro.bat //test/...
 set BAZEL_EXITCODE=%errorlevel%
 
 if not "%UPLOAD_TEST_RESULTS%"=="" (
index b0f6f67..c68e0ff 100644 (file)
@@ -16,7 +16,7 @@
 
 # Location of the continuous shell script in repository.
 build_file: "grpc/tools/internal_ci/windows/grpc_run_tests_matrix.bat"
-timeout_mins: 60
+timeout_mins: 90
 action {
   define_artifacts {
     regex: "**/*sponge_log.*"
index 6e7fdc8..d13b36a 100644 (file)
@@ -21,7 +21,6 @@ timeout_mins: 90
 
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/rbe-windows-credentials.json"
 
 bazel_setting {
   # In order for Kokoro to recognize this as a bazel build and publish the bazel resultstore link,
index b1a1de0..87cc379 100644 (file)
@@ -21,7 +21,6 @@ timeout_mins: 90
 
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/rbe-windows-credentials.json"
 
 bazel_setting {
   # In order for Kokoro to recognize this as a bazel build and publish the bazel resultstore link,
index 473b6ee..b8901e3 100644 (file)
@@ -19,6 +19,7 @@ choco install nasm -y --limit-output
 @rem enter repo root
 cd /d %~dp0\..\..\..
 
+set PREPARE_BUILD_INSTALL_DEPS_PYTHON=true
 call tools/internal_ci/helper_scripts/prepare_build_windows.bat || exit /b 1
 
 python tools/run_tests/task_runner.py -f artifact windows -j 4
index f45cfda..9097849 100644 (file)
@@ -16,7 +16,7 @@
 
 # Location of the continuous shell script in repository.
 build_file: "grpc/tools/internal_ci/windows/grpc_build_artifacts.bat"
-timeout_mins: 120
+timeout_mins: 180
 action {
   define_artifacts {
     regex: "**/*sponge_log.*"
index a5bffb2..8f1e579 100644 (file)
@@ -17,12 +17,12 @@ cd /d %~dp0\..\..\..
 
 call tools/internal_ci/helper_scripts/prepare_build_windows.bat || exit /b 1
 
-@rem Move artifacts generated by the previous step in the build chain.
-powershell -Command "mv %KOKORO_GFILE_DIR%\github\grpc\artifacts input_artifacts"
-dir input_artifacts
-
-python tools/run_tests/task_runner.py -f package windows -j 4
-set RUNTESTS_EXITCODE=%errorlevel%
+rem NOTHING TO DO HERE
+rem This script used to run "task_runner.py -f package windows", but
+rem currently there are no build_packages tasks that need to be run on windows.
+rem The only build_packages task that ever needed to run on windows was C#, but we switched to
+rem building C# nugets on linux (as dotnet SDK on linux does a good job)
+rem TODO(jtattermusch): remove the infrastructure for running "build_packages" kokoro job on windows.
 
 bash tools/internal_ci/helper_scripts/delete_nonartifacts.sh
 
index 01d1f81..01d6026 100644 (file)
@@ -15,6 +15,9 @@
 @rem enter repo root
 cd /d %~dp0\..\..\..
 
+If Not "%RUN_TESTS_FLAGS%"=="%RUN_TESTS_FLAGS:python=%" (
+    set PREPARE_BUILD_INSTALL_DEPS_PYTHON=true
+)
 call tools/internal_ci/helper_scripts/prepare_build_windows.bat || exit /b 1
 
 python tools/run_tests/run_tests_matrix.py %RUN_TESTS_FLAGS%
index 6947e8e..aba512d 100644 (file)
@@ -16,7 +16,7 @@
 
 # Location of the continuous shell script in repository.
 build_file: "grpc/tools/internal_ci/windows/grpc_run_tests_matrix.bat"
-timeout_mins: 60
+timeout_mins: 90
 action {
   define_artifacts {
     regex: "**/*sponge_log.*"
@@ -26,5 +26,5 @@ action {
 
 env_vars {
   key: "RUN_TESTS_FLAGS"
-  value: "-f basictests windows python -j 1 --inner_jobs 8 --internal_ci --max_time=3600"
+  value: "-f basictests windows python -j 1 --inner_jobs 8 --internal_ci --max_time=5400"
 }
index 7735f76..116afeb 100644 (file)
@@ -21,7 +21,6 @@ timeout_mins: 90
 
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/rbe-windows-credentials.json"
 
 bazel_setting {
   # In order for Kokoro to recognize this as a bazel build and publish the bazel resultstore link,
index df17148..b4750e1 100644 (file)
@@ -21,7 +21,6 @@ timeout_mins: 90
 
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
 gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/resultstore_api_key"
-gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/rbe-windows-credentials.json"
 
 bazel_setting {
   # In order for Kokoro to recognize this as a bazel build and publish the bazel resultstore link,
index 876cbfb..f3f7bb9 100644 (file)
@@ -108,6 +108,7 @@ LANG_RELEASE_MATRIX = {
             ('v1.30.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
             ('v1.31.1', ReleaseInfo(testcases_file='cxx__v1.31.1')),
             ('v1.32.0', ReleaseInfo()),
+            ('v1.33.2', ReleaseInfo()),
         ]),
     'go':
         OrderedDict([
@@ -159,6 +160,10 @@ LANG_RELEASE_MATRIX = {
             ('v1.27.1', ReleaseInfo(runtimes=['go1.11'])),
             ('v1.28.0', ReleaseInfo(runtimes=['go1.11'])),
             ('v1.29.0', ReleaseInfo(runtimes=['go1.11'])),
+            ('v1.30.0', ReleaseInfo(runtimes=['go1.11'])),
+            ('v1.31.1', ReleaseInfo(runtimes=['go1.11'])),
+            ('v1.32.0', ReleaseInfo(runtimes=['go1.11'])),
+            ('v1.33.1', ReleaseInfo(runtimes=['go1.11'])),
         ]),
     'java':
         OrderedDict([
@@ -224,7 +229,8 @@ LANG_RELEASE_MATRIX = {
             ('v1.29.0', ReleaseInfo()),
             ('v1.30.2', ReleaseInfo()),
             ('v1.31.1', ReleaseInfo()),
-            ('v1.32.1', ReleaseInfo()),
+            ('v1.32.2', ReleaseInfo()),
+            ('v1.33.1', ReleaseInfo()),
         ]),
     'python':
         OrderedDict([
@@ -283,6 +289,7 @@ LANG_RELEASE_MATRIX = {
             ('v1.30.0', ReleaseInfo(runtimes=['python'])),
             ('v1.31.1', ReleaseInfo(runtimes=['python'])),
             ('v1.32.0', ReleaseInfo(runtimes=['python'])),
+            ('v1.33.2', ReleaseInfo(runtimes=['python'])),
         ]),
     'node':
         OrderedDict([
@@ -344,6 +351,7 @@ LANG_RELEASE_MATRIX = {
             ('v1.30.0', ReleaseInfo()),
             ('v1.31.1', ReleaseInfo()),
             ('v1.32.0', ReleaseInfo()),
+            ('v1.33.2', ReleaseInfo()),
         ]),
     'php':
         OrderedDict([
@@ -378,6 +386,7 @@ LANG_RELEASE_MATRIX = {
             ('v1.30.0', ReleaseInfo()),
             ('v1.31.1', ReleaseInfo()),
             ('v1.32.0', ReleaseInfo()),
+            ('v1.33.2', ReleaseInfo()),
         ]),
     'csharp':
         OrderedDict([
@@ -417,5 +426,6 @@ LANG_RELEASE_MATRIX = {
             ('v1.30.0', ReleaseInfo()),
             ('v1.31.1', ReleaseInfo()),
             ('v1.32.0', ReleaseInfo()),
+            ('v1.33.2', ReleaseInfo()),
         ]),
 }
index ed0e89e..ffb5186 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2.7
+#!/usr/bin/env python3
 #
 # Copyright 2018 gRPC authors.
 #
@@ -143,6 +143,6 @@ for frameworks in [False, True]:
             text += '\n No significant differences in binary sizes\n'
     text += '\n'
 
-print text
+print(text)
 
 check_on_pr.check_on_pr('Binary Size', '```\n%s\n```' % text)
index eaa1d6e..95ca153 100755 (executable)
@@ -36,7 +36,7 @@ def parse_link_map(filename):
     objc_size = 0
     protobuf_size = 0
 
-    lines = list(open(filename))
+    lines = open(filename, encoding='utf-8', errors='ignore').readlines()
     for line in lines:
         line_stripped = line[:-1]
         if "# Object files:" == line_stripped:
@@ -66,6 +66,8 @@ def parse_link_map(filename):
             if len(line_stripped) == 0 or line_stripped[0] == '#':
                 continue
             segs = re.search('^.+?\s+(.+?)\s+(\[.+?\]).*', line_stripped)
+            if not segs:
+                continue
             target = table_tag[segs.group(2)]
             target_stripped = re.search('^(.*?)(\(.+?\))?$', target).group(1)
             size = int(segs.group(1), 16)
index e69fc49..511c93e 100644 (file)
@@ -69,9 +69,9 @@ Ruby
 
 """
 
-rl_header = """This is the {version} release ([{name}](https://github.com/grpc/grpc/blob/master/doc/g_stands_for.md)) of gRPC Core.
+rl_header = """This is release {version} ([{name}](https://github.com/grpc/grpc/blob/master/doc/g_stands_for.md)) of gRPC Core.
 
-Please see the notes for the previous releases here: https://github.com/grpc/grpc/releases. Please consult https://grpc.io/ for all information regarding this product.
+For gRPC documentation, see [grpc.io](https://grpc.io/). For previous releases, see [Releases](https://github.com/grpc/grpc/releases).
 
 This release contains refinements, improvements, and bug fixes, with highlights listed below.
 
index b2937f2..fbbfcc8 100644 (file)
@@ -344,10 +344,17 @@ class ProtocArtifact:
 
 def targets():
     """Gets list of supported targets"""
-    return ([
-        Cls(platform, arch) for Cls in (CSharpExtArtifact, ProtocArtifact)
-        for platform in ('linux', 'macos', 'windows') for arch in ('x86', 'x64')
-    ] + [
+    return [
+        ProtocArtifact('linux', 'x64'),
+        ProtocArtifact('linux', 'x86'),
+        ProtocArtifact('macos', 'x64'),
+        ProtocArtifact('macos', 'x86'),
+        ProtocArtifact('windows', 'x64'),
+        ProtocArtifact('windows', 'x86'),
+        CSharpExtArtifact('linux', 'x64'),
+        CSharpExtArtifact('macos', 'x64'),
+        CSharpExtArtifact('windows', 'x64'),
+        CSharpExtArtifact('windows', 'x86'),
         CSharpExtArtifact('linux', 'android', arch_abi='arm64-v8a'),
         CSharpExtArtifact('linux', 'android', arch_abi='armeabi-v7a'),
         CSharpExtArtifact('linux', 'android', arch_abi='x86'),
@@ -393,16 +400,14 @@ def targets():
         PythonArtifact('windows', 'x86', 'Python36_32bit'),
         PythonArtifact('windows', 'x86', 'Python37_32bit'),
         PythonArtifact('windows', 'x86', 'Python38_32bit'),
-        # TODO(lidiz) uncomment if Python39 installs stably.
-        # PythonArtifact('windows', 'x86', 'Python39_32bit'),
+        PythonArtifact('windows', 'x86', 'Python39_32bit'),
         PythonArtifact('windows', 'x64', 'Python27'),
         PythonArtifact('windows', 'x64', 'Python35'),
         PythonArtifact('windows', 'x64', 'Python36'),
         PythonArtifact('windows', 'x64', 'Python37'),
         PythonArtifact('windows', 'x64', 'Python38'),
-        # TODO(lidiz) uncomment if Python39 installs stably.
-        # PythonArtifact('windows', 'x64', 'Python39'),
+        PythonArtifact('windows', 'x64', 'Python39'),
         RubyArtifact('linux', 'x64'),
         RubyArtifact('macos', 'x64'),
         PHPArtifact('linux', 'x64')
-    ])
+    ]
index ff5a6af..b9b058b 100644 (file)
 @rem See the License for the specific language governing permissions and
 @rem limitations under the License.
 
-@rem set path to python & mingw compiler
-set PATH=C:\%1;C:\%1\scripts;C:\msys64\mingw%2\bin;C:\tools\msys64\mingw%2\bin;%PATH%
+@rem set path to python
+set PATH=C:\%1;C:\%1\scripts;%PATH%
+
+if "%1" == "Python27" goto :install_mingw64_with_msvcr90
+if "%1" == "Python27_32bit" goto :install_mingw64_with_msvcr90
+@rem set path to the existed mingw compiler
+set PATH=C:\msys64\mingw%2\bin;C:\tools\msys64\mingw%2\bin;%PATH%
+:end_mingw64_installation
 
 python -m pip install --upgrade six
 @rem some artifacts are broken for setuptools 38.5.0. See https://github.com/grpc/grpc/issues/14317
@@ -21,11 +27,12 @@ python -m pip install --upgrade setuptools==44.1.1
 python -m pip install --upgrade cython
 python -m pip install -rrequirements.txt --user
 
+@rem set GRPC_PYTHON_OVERRIDE_CYGWIN_DETECTION_FOR_27=1
 set GRPC_PYTHON_BUILD_WITH_CYTHON=1
 
 @rem Allow build_ext to build C/C++ files in parallel
 @rem by enabling a monkeypatch. It speeds up the build a lot.
-set GRPC_PYTHON_BUILD_EXT_COMPILER_JOBS=2
+set GRPC_PYTHON_BUILD_EXT_COMPILER_JOBS=4
 
 mkdir -p %ARTIFACTS_OUT%
 set ARTIFACT_DIR=%cd%\%ARTIFACTS_OUT%
@@ -59,3 +66,13 @@ goto :EOF
 :error
 popd
 exit /b 1
+
+:install_mingw64_with_msvcr90
+set MSYS64_DOWNLOAD_URL=https://storage.googleapis.com/grpc-build-helper/msys64.zip
+set MSYS64_PATH=C:\tools\msys64_win7
+set PATH=%MSYS64_PATH%\mingw%2\bin;%PATH%
+@rem Skip the installation if the directory exists
+if exist "%MSYS64_PATH%" goto :end_mingw64_installation
+python -m pip install requests || goto :error
+python tools\run_tests\python_utils\download_and_unzip.py "%MSYS64_DOWNLOAD_URL%" "%MSYS64_PATH%" || goto :error
+goto :end_mingw64_installation
index ba4ab7c..c2df322 100644 (file)
@@ -328,14 +328,15 @@ def targets():
         CppDistribTest('windows', 'x86', testcase='cmake_as_externalproject'),
         # C#
         CSharpDistribTest('linux', 'x64', 'jessie'),
-        CSharpDistribTest('linux', 'x86', 'jessie'),
         CSharpDistribTest('linux', 'x64', 'stretch'),
         CSharpDistribTest('linux', 'x64', 'stretch', use_dotnet_cli=True),
         CSharpDistribTest('linux', 'x64', 'centos7'),
         CSharpDistribTest('linux', 'x64', 'ubuntu1604'),
         CSharpDistribTest('linux', 'x64', 'ubuntu1604', use_dotnet_cli=True),
         CSharpDistribTest('linux', 'x64', 'alpine', use_dotnet_cli=True),
-        CSharpDistribTest('macos', 'x86'),
+        CSharpDistribTest('linux', 'x64', 'dotnet31', use_dotnet_cli=True),
+        CSharpDistribTest('linux', 'x64', 'dotnet5', use_dotnet_cli=True),
+        CSharpDistribTest('macos', 'x64'),
         CSharpDistribTest('windows', 'x86'),
         CSharpDistribTest('windows', 'x64'),
         # Python
index 9a52bec..cc057ec 100644 (file)
@@ -76,12 +76,12 @@ class CSharpPackage:
 
     def __init__(self, unity=False):
         self.unity = unity
-        self.labels = ['package', 'csharp', 'windows']
+        self.labels = ['package', 'csharp', 'linux']
         if unity:
-            self.name = 'csharp_package_unity_windows'
+            self.name = 'csharp_package_unity_linux'
             self.labels += ['unity']
         else:
-            self.name = 'csharp_package_nuget_windows'
+            self.name = 'csharp_package_nuget_linux'
             self.labels += ['nuget']
 
     def pre_build_jobspecs(self):
@@ -89,16 +89,13 @@ class CSharpPackage:
 
     def build_jobspec(self):
         if self.unity:
-            # use very high CPU cost to avoid running nuget package build
-            # and unity build concurrently
-            return create_jobspec(self.name, ['build_unitypackage.bat'],
-                                  cwd='src\\csharp',
-                                  cpu_cost=1e6,
-                                  shell=True)
+            return create_docker_jobspec(
+                self.name, 'tools/dockerfile/test/csharp_stretch_x64',
+                'src/csharp/build_unitypackage.sh')
         else:
-            return create_jobspec(self.name, ['build_packages_dotnetcli.bat'],
-                                  cwd='src\\csharp',
-                                  shell=True)
+            return create_docker_jobspec(
+                self.name, 'tools/dockerfile/test/csharp_stretch_x64',
+                'src/csharp/build_nuget.sh')
 
     def __str__(self):
         return self.name
index 3ef9cdb..f90648b 100644 (file)
@@ -1,88 +1,88 @@
 [
   {
-    "config": "opt"
-  }, 
-  {
-    "config": "asan-trace-cmp", 
+    "config": "asan",
     "environ": {
-      "ASAN_OPTIONS": "detect_leaks=1:color=always", 
+      "ASAN_OPTIONS": "detect_leaks=1:color=always",
       "LSAN_OPTIONS": "suppressions=test/core/util/lsan_suppressions.txt:report_objects=1"
     }
-  }, 
-  {
-    "config": "dbg"
-  }, 
+  },
   {
-    "config": "asan", 
+    "config": "asan-noleaks",
     "environ": {
-      "ASAN_OPTIONS": "detect_leaks=1:color=always", 
-      "LSAN_OPTIONS": "suppressions=test/core/util/lsan_suppressions.txt:report_objects=1"
+      "ASAN_OPTIONS": "detect_leaks=0:color=always"
     }
-  }, 
+  },
   {
-    "config": "msan", 
+    "config": "asan-trace-cmp",
     "environ": {
-      "MSAN_OPTIONS": "poison_in_dtor=1"
+      "ASAN_OPTIONS": "detect_leaks=1:color=always",
+      "LSAN_OPTIONS": "suppressions=test/core/util/lsan_suppressions.txt:report_objects=1"
     }
-  }, 
+  },
   {
     "config": "basicprof"
-  }, 
-  {
-    "config": "helgrind", 
-    "tool_prefix": [
-      "valgrind", 
-      "--tool=helgrind"
-    ]
-  }, 
-  {
-    "config": "asan-noleaks", 
-    "environ": {
-      "ASAN_OPTIONS": "detect_leaks=0:color=always"
-    }
-  }, 
+  },
   {
-    "config": "noexcept"
-  }, 
-  {
-    "config": "ubsan", 
-    "environ": {
-      "UBSAN_OPTIONS": "halt_on_error=1:print_stacktrace=1:suppressions=test/core/util/ubsan_suppressions.txt"
-    }
-  }, 
+    "config": "c++-compat"
+  },
   {
-    "config": "tsan", 
-    "environ": {
-      "TSAN_OPTIONS": "suppressions=test/core/util/tsan_suppressions.txt:halt_on_error=1:second_deadlock_stack=1"
-    }
-  }, 
+    "config": "counters"
+  },
   {
     "config": "counters_with_memory_counter"
-  }, 
+  },
   {
-    "config": "stapprof"
-  }, 
+    "config": "dbg"
+  },
   {
     "config": "gcov"
-  }, 
+  },
   {
-    "config": "memcheck", 
+    "config": "helgrind",
     "tool_prefix": [
-      "valgrind", 
-      "--tool=memcheck", 
-      "--leak-check=full"
+      "valgrind",
+      "--tool=helgrind"
     ]
-  }, 
+  },
   {
     "config": "lto"
-  }, 
+  },
   {
-    "config": "c++-compat"
-  }, 
+    "config": "memcheck",
+    "tool_prefix": [
+      "valgrind",
+      "--tool=memcheck",
+      "--leak-check=full"
+    ]
+  },
+  {
+    "config": "msan",
+    "environ": {
+      "MSAN_OPTIONS": "poison_in_dtor=1"
+    }
+  },
   {
     "config": "mutrace"
-  }, 
+  },
   {
-    "config": "counters"
+    "config": "noexcept"
+  },
+  {
+    "config": "opt"
+  },
+  {
+    "config": "stapprof"
+  },
+  {
+    "config": "tsan",
+    "environ": {
+      "TSAN_OPTIONS": "suppressions=test/core/util/tsan_suppressions.txt:halt_on_error=1:second_deadlock_stack=1"
+    }
+  },
+  {
+    "config": "ubsan",
+    "environ": {
+      "UBSAN_OPTIONS": "halt_on_error=1:print_stacktrace=1:suppressions=test/core/util/ubsan_suppressions.txt"
+    }
   }
 ]
index 4f956c5..a2d12a0 100644 (file)
 
 [
     {
-        "backend_configs": [], 
-        "balancer_configs": [], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        "backend_configs": [],
+        "balancer_configs": [],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
-        "name": "no_balancer_because_lb_a_record_returns_nx_domain_insecure", 
-        "skip_langs": [], 
+        ],
+        "name": "no_balancer_because_lb_a_record_returns_nx_domain_insecure",
+        "skip_langs": [],
         "transport_sec": "insecure"
-    }, 
+    },
     {
-        "backend_configs": [], 
-        "balancer_configs": [], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        "backend_configs": [],
+        "balancer_configs": [],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
-        "name": "no_balancer_because_lb_a_record_returns_nx_domain_alts", 
-        "skip_langs": [], 
+        ],
+        "name": "no_balancer_because_lb_a_record_returns_nx_domain_alts",
+        "skip_langs": [],
         "transport_sec": "alts"
-    }, 
+    },
     {
-        "backend_configs": [], 
-        "balancer_configs": [], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        "backend_configs": [],
+        "balancer_configs": [],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
-        "name": "no_balancer_because_lb_a_record_returns_nx_domain_tls", 
-        "skip_langs": [], 
+        ],
+        "name": "no_balancer_because_lb_a_record_returns_nx_domain_tls",
+        "skip_langs": [],
         "transport_sec": "tls"
-    }, 
+    },
     {
-        "backend_configs": [], 
-        "balancer_configs": [], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        "backend_configs": [],
+        "balancer_configs": [],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
-        "name": "no_balancer_because_lb_a_record_returns_nx_domain_google_default_credentials", 
-        "skip_langs": [], 
+        ],
+        "name": "no_balancer_because_lb_a_record_returns_nx_domain_google_default_credentials",
+        "skip_langs": [],
         "transport_sec": "google_default_credentials"
-    }, 
+    },
     {
-        "backend_configs": [], 
-        "balancer_configs": [], 
-        "cause_no_error_no_data_for_balancer_a_record": true, 
+        "backend_configs": [],
+        "balancer_configs": [],
+        "cause_no_error_no_data_for_balancer_a_record": true,
         "fallback_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
-        "name": "no_balancer_because_lb_a_record_returns_no_data_insecure", 
-        "skip_langs": [], 
+        ],
+        "name": "no_balancer_because_lb_a_record_returns_no_data_insecure",
+        "skip_langs": [],
         "transport_sec": "insecure"
-    }, 
+    },
     {
-        "backend_configs": [], 
-        "balancer_configs": [], 
-        "cause_no_error_no_data_for_balancer_a_record": true, 
+        "backend_configs": [],
+        "balancer_configs": [],
+        "cause_no_error_no_data_for_balancer_a_record": true,
         "fallback_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
-        "name": "no_balancer_because_lb_a_record_returns_no_data_alts", 
-        "skip_langs": [], 
+        ],
+        "name": "no_balancer_because_lb_a_record_returns_no_data_alts",
+        "skip_langs": [],
         "transport_sec": "alts"
-    }, 
+    },
     {
-        "backend_configs": [], 
-        "balancer_configs": [], 
-        "cause_no_error_no_data_for_balancer_a_record": true, 
+        "backend_configs": [],
+        "balancer_configs": [],
+        "cause_no_error_no_data_for_balancer_a_record": true,
         "fallback_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
-        "name": "no_balancer_because_lb_a_record_returns_no_data_tls", 
-        "skip_langs": [], 
+        ],
+        "name": "no_balancer_because_lb_a_record_returns_no_data_tls",
+        "skip_langs": [],
         "transport_sec": "tls"
-    }, 
+    },
     {
-        "backend_configs": [], 
-        "balancer_configs": [], 
-        "cause_no_error_no_data_for_balancer_a_record": true, 
+        "backend_configs": [],
+        "balancer_configs": [],
+        "cause_no_error_no_data_for_balancer_a_record": true,
         "fallback_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
-        "name": "no_balancer_because_lb_a_record_returns_no_data_google_default_credentials", 
-        "skip_langs": [], 
+        ],
+        "name": "no_balancer_because_lb_a_record_returns_no_data_google_default_credentials",
+        "skip_langs": [],
         "transport_sec": "google_default_credentials"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "insecure"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_insecure_short_stream_True", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_insecure_short_stream_True",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "insecure"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_alts_short_stream_True", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_alts_short_stream_True",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "alts"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "tls"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_tls_short_stream_True", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_tls_short_stream_True",
         "skip_langs": [
-            "java", 
+            "java",
             "java"
-        ], 
+        ],
         "transport_sec": "tls"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_google_default_credentials_short_stream_True", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_google_default_credentials_short_stream_True",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "google_default_credentials"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "insecure"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_insecure_short_stream_False", 
-        "skip_langs": [], 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_insecure_short_stream_False",
+        "skip_langs": [],
         "transport_sec": "insecure"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_alts_short_stream_False", 
-        "skip_langs": [], 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_alts_short_stream_False",
+        "skip_langs": [],
         "transport_sec": "alts"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "tls"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_tls_short_stream_False", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_tls_short_stream_False",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "tls"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_google_default_credentials_short_stream_False", 
-        "skip_langs": [], 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_google_default_credentials_short_stream_False",
+        "skip_langs": [],
         "transport_sec": "google_default_credentials"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
-        "name": "client_referred_to_backend_fallback_broken_alts_short_stream_True", 
+        ],
+        "name": "client_referred_to_backend_fallback_broken_alts_short_stream_True",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "alts"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "tls"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
-        "name": "client_referred_to_backend_fallback_broken_tls_short_stream_True", 
+        ],
+        "name": "client_referred_to_backend_fallback_broken_tls_short_stream_True",
         "skip_langs": [
-            "java", 
+            "java",
             "java"
-        ], 
+        ],
         "transport_sec": "tls"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
-        "name": "client_referred_to_backend_fallback_broken_google_default_credentials_short_stream_True", 
+        ],
+        "name": "client_referred_to_backend_fallback_broken_google_default_credentials_short_stream_True",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "google_default_credentials"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
-        "name": "client_referred_to_backend_fallback_broken_alts_short_stream_False", 
-        "skip_langs": [], 
+        ],
+        "name": "client_referred_to_backend_fallback_broken_alts_short_stream_False",
+        "skip_langs": [],
         "transport_sec": "alts"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "tls"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
-        "name": "client_referred_to_backend_fallback_broken_tls_short_stream_False", 
+        ],
+        "name": "client_referred_to_backend_fallback_broken_tls_short_stream_False",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "tls"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
-        "name": "client_referred_to_backend_fallback_broken_google_default_credentials_short_stream_False", 
-        "skip_langs": [], 
+        ],
+        "name": "client_referred_to_backend_fallback_broken_google_default_credentials_short_stream_False",
+        "skip_langs": [],
         "transport_sec": "google_default_credentials"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "insecure"
-            }, 
+            },
             {
                 "transport_sec": "insecure"
-            }, 
+            },
             {
                 "transport_sec": "insecure"
-            }, 
+            },
             {
                 "transport_sec": "insecure"
-            }, 
+            },
             {
                 "transport_sec": "insecure"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "insecure"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_backends_insecure_short_stream_True", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_backends_insecure_short_stream_True",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "insecure"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_backends_alts_short_stream_True", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_backends_alts_short_stream_True",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "alts"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "tls"
-            }, 
+            },
             {
                 "transport_sec": "tls"
-            }, 
+            },
             {
                 "transport_sec": "tls"
-            }, 
+            },
             {
                 "transport_sec": "tls"
-            }, 
+            },
             {
                 "transport_sec": "tls"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "tls"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_backends_tls_short_stream_True", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_backends_tls_short_stream_True",
         "skip_langs": [
-            "java", 
+            "java",
             "java"
-        ], 
+        ],
         "transport_sec": "tls"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_backends_google_default_credentials_short_stream_True", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_backends_google_default_credentials_short_stream_True",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "google_default_credentials"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "insecure"
-            }, 
+            },
             {
                 "transport_sec": "insecure"
-            }, 
+            },
             {
                 "transport_sec": "insecure"
-            }, 
+            },
             {
                 "transport_sec": "insecure"
-            }, 
+            },
             {
                 "transport_sec": "insecure"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "insecure"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_backends_insecure_short_stream_False", 
-        "skip_langs": [], 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_backends_insecure_short_stream_False",
+        "skip_langs": [],
         "transport_sec": "insecure"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_backends_alts_short_stream_False", 
-        "skip_langs": [], 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_backends_alts_short_stream_False",
+        "skip_langs": [],
         "transport_sec": "alts"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "tls"
-            }, 
+            },
             {
                 "transport_sec": "tls"
-            }, 
+            },
             {
                 "transport_sec": "tls"
-            }, 
+            },
             {
                 "transport_sec": "tls"
-            }, 
+            },
             {
                 "transport_sec": "tls"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "tls"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_backends_tls_short_stream_False", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_backends_tls_short_stream_False",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "tls"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
-            }, 
+            },
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_backends_google_default_credentials_short_stream_False", 
-        "skip_langs": [], 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_backends_google_default_credentials_short_stream_False",
+        "skip_langs": [],
         "transport_sec": "google_default_credentials"
-    }, 
+    },
     {
-        "backend_configs": [], 
+        "backend_configs": [],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "insecure"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
-        "name": "client_falls_back_because_no_backends_insecure_short_stream_True", 
+        ],
+        "name": "client_falls_back_because_no_backends_insecure_short_stream_True",
         "skip_langs": [
-            "go", 
-            "java", 
+            "go",
+            "java",
             "java"
-        ], 
+        ],
         "transport_sec": "insecure"
-    }, 
+    },
     {
-        "backend_configs": [], 
+        "backend_configs": [],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
-        "name": "client_falls_back_because_no_backends_alts_short_stream_True", 
+        ],
+        "name": "client_falls_back_because_no_backends_alts_short_stream_True",
         "skip_langs": [
-            "go", 
-            "java", 
+            "go",
+            "java",
             "java"
-        ], 
+        ],
         "transport_sec": "alts"
-    }, 
+    },
     {
-        "backend_configs": [], 
+        "backend_configs": [],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "tls"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
-        "name": "client_falls_back_because_no_backends_tls_short_stream_True", 
+        ],
+        "name": "client_falls_back_because_no_backends_tls_short_stream_True",
         "skip_langs": [
-            "go", 
-            "java", 
-            "java", 
+            "go",
+            "java",
+            "java",
             "java"
-        ], 
+        ],
         "transport_sec": "tls"
-    }, 
+    },
     {
-        "backend_configs": [], 
+        "backend_configs": [],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
-        "name": "client_falls_back_because_no_backends_google_default_credentials_short_stream_True", 
+        ],
+        "name": "client_falls_back_because_no_backends_google_default_credentials_short_stream_True",
         "skip_langs": [
-            "go", 
-            "java", 
+            "go",
+            "java",
             "java"
-        ], 
+        ],
         "transport_sec": "google_default_credentials"
-    }, 
+    },
     {
-        "backend_configs": [], 
+        "backend_configs": [],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "insecure"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
-        "name": "client_falls_back_because_no_backends_insecure_short_stream_False", 
+        ],
+        "name": "client_falls_back_because_no_backends_insecure_short_stream_False",
         "skip_langs": [
-            "go", 
+            "go",
             "java"
-        ], 
+        ],
         "transport_sec": "insecure"
-    }, 
+    },
     {
-        "backend_configs": [], 
+        "backend_configs": [],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
-        "name": "client_falls_back_because_no_backends_alts_short_stream_False", 
+        ],
+        "name": "client_falls_back_because_no_backends_alts_short_stream_False",
         "skip_langs": [
-            "go", 
+            "go",
             "java"
-        ], 
+        ],
         "transport_sec": "alts"
-    }, 
+    },
     {
-        "backend_configs": [], 
+        "backend_configs": [],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "tls"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
-        "name": "client_falls_back_because_no_backends_tls_short_stream_False", 
+        ],
+        "name": "client_falls_back_because_no_backends_tls_short_stream_False",
         "skip_langs": [
-            "go", 
-            "java", 
+            "go",
+            "java",
             "java"
-        ], 
+        ],
         "transport_sec": "tls"
-    }, 
+    },
     {
-        "backend_configs": [], 
+        "backend_configs": [],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
-        "name": "client_falls_back_because_no_backends_google_default_credentials_short_stream_False", 
+        ],
+        "name": "client_falls_back_because_no_backends_google_default_credentials_short_stream_False",
         "skip_langs": [
-            "go", 
+            "go",
             "java"
-        ], 
+        ],
         "transport_sec": "google_default_credentials"
-    }, 
+    },
     {
-        "backend_configs": [], 
+        "backend_configs": [],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "insecure"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
-        "name": "client_falls_back_because_balancer_connection_broken_alts", 
-        "skip_langs": [], 
+        ],
+        "name": "client_falls_back_because_balancer_connection_broken_alts",
+        "skip_langs": [],
         "transport_sec": "alts"
-    }, 
+    },
     {
-        "backend_configs": [], 
+        "backend_configs": [],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "insecure"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
-        "name": "client_falls_back_because_balancer_connection_broken_tls", 
+        ],
+        "name": "client_falls_back_because_balancer_connection_broken_tls",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "tls"
-    }, 
+    },
     {
-        "backend_configs": [], 
+        "backend_configs": [],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "insecure"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
         "fallback_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
-        "name": "client_falls_back_because_balancer_connection_broken_google_default_credentials", 
-        "skip_langs": [], 
+        ],
+        "name": "client_falls_back_because_balancer_connection_broken_google_default_credentials",
+        "skip_langs": [],
         "transport_sec": "google_default_credentials"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "insecure"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "insecure"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "insecure"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "insecure"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "insecure"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_balancers_insecure_short_stream_True", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_balancers_insecure_short_stream_True",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "insecure"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_balancers_alts_short_stream_True", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_balancers_alts_short_stream_True",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "alts"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "tls"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "tls"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "tls"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "tls"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "tls"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_balancers_tls_short_stream_True", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_balancers_tls_short_stream_True",
         "skip_langs": [
-            "java", 
+            "java",
             "java"
-        ], 
+        ],
         "transport_sec": "tls"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": true, 
+                "short_stream": true,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_balancers_google_default_credentials_short_stream_True", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_balancers_google_default_credentials_short_stream_True",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "google_default_credentials"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "insecure"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "insecure"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "insecure"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "insecure"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "insecure"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "insecure"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_balancers_insecure_short_stream_False", 
-        "skip_langs": [], 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_balancers_insecure_short_stream_False",
+        "skip_langs": [],
         "transport_sec": "insecure"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_balancers_alts_short_stream_False", 
-        "skip_langs": [], 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_balancers_alts_short_stream_False",
+        "skip_langs": [],
         "transport_sec": "alts"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "tls"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "tls"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "tls"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "tls"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "tls"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "tls"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_balancers_tls_short_stream_False", 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_balancers_tls_short_stream_False",
         "skip_langs": [
             "java"
-        ], 
+        ],
         "transport_sec": "tls"
-    }, 
+    },
     {
         "backend_configs": [
             {
                 "transport_sec": "alts"
             }
-        ], 
+        ],
         "balancer_configs": [
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
-            }, 
+            },
             {
-                "short_stream": false, 
+                "short_stream": false,
                 "transport_sec": "alts"
             }
-        ], 
-        "cause_no_error_no_data_for_balancer_a_record": false, 
-        "fallback_configs": [], 
-        "name": "client_referred_to_backend_multiple_balancers_google_default_credentials_short_stream_False", 
-        "skip_langs": [], 
+        ],
+        "cause_no_error_no_data_for_balancer_a_record": false,
+        "fallback_configs": [],
+        "name": "client_referred_to_backend_multiple_balancers_google_default_credentials_short_stream_False",
+        "skip_langs": [],
         "transport_sec": "google_default_credentials"
     }
 ]
index 0d8d3d7..61ac2ff 100644 (file)
 
 [
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "algorithm_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "algorithm_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alloc_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alloc_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alpn_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alpn_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alts_counter_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alts_counter_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alts_crypt_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alts_crypt_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alts_crypter_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alts_crypter_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alts_frame_protector_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alts_frame_protector_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alts_grpc_record_protocol_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alts_grpc_record_protocol_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alts_handshaker_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alts_handshaker_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alts_iovec_record_protocol_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alts_iovec_record_protocol_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alts_security_connector_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alts_security_connector_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alts_tsi_handshaker_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alts_tsi_handshaker_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alts_tsi_utils_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alts_tsi_utils_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "alts_zero_copy_grpc_protector_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "alts_zero_copy_grpc_protector_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "arena_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "arena_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "auth_context_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "auth_context_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "avl_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "avl_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "b64_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "b64_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "bad_server_response_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "bad_server_response_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "bad_ssl_alpn_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "bad_ssl_alpn_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "bad_ssl_cert_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "bad_ssl_cert_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "bin_decoder_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "bin_decoder_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "bin_encoder_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "bin_encoder_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "buffer_list_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "buffer_list_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "channel_args_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "channel_args_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "channel_create_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "channel_create_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "channel_stack_builder_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "channel_stack_builder_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "channel_stack_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "channel_stack_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "check_gcp_environment_linux_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "check_gcp_environment_linux_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "check_gcp_environment_windows_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "check_gcp_environment_windows_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "client_ssl_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "client_ssl_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "cmdline_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "cmdline_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "combiner_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "combiner_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "compression_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "compression_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "connection_refused_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "connection_refused_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "cpu_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "cpu_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "--resolver=ares"
-    ], 
-    "benchmark": false, 
+    ],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "dns_resolver_connectivity_using_ares_resolver_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "dns_resolver_connectivity_using_ares_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
     "args": [
       "--resolver=native"
-    ], 
-    "benchmark": false, 
+    ],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "dns_resolver_connectivity_using_native_resolver_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "dns_resolver_connectivity_using_native_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "dns_resolver_cooldown_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "dns_resolver_cooldown_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "dns_resolver_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "dns_resolver_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "dualstack_socket_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "dualstack_socket_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "endpoint_pair_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "endpoint_pair_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "env_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "env_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "error_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "error_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "ev_epollex_linux_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "ev_epollex_linux_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "fake_resolver_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "fake_resolver_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "fake_transport_security_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "fake_transport_security_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "fd_conservation_posix_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "fd_conservation_posix_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "fd_posix_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "fd_posix_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "fling_stream_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "fling_stream_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "fling_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "fling_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "fork_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "fork_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "format_request_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "format_request_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "frame_handler_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "frame_handler_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "goaway_server_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "goaway_server_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "grpc_alts_credentials_options_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "grpc_alts_credentials_options_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "grpc_byte_buffer_reader_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "grpc_byte_buffer_reader_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "grpc_completion_queue_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "grpc_completion_queue_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "grpc_ipv6_loopback_available_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "grpc_ipv6_loopback_available_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "handshake_server_with_readahead_handshaker_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "handshake_server_with_readahead_handshaker_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "handshake_verify_peer_options_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "handshake_verify_peer_options_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "histogram_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "histogram_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "host_port_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "host_port_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "hpack_encoder_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "hpack_encoder_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "hpack_parser_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "hpack_parser_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "hpack_table_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "hpack_table_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "httpcli_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "httpcli_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "httpscli_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "httpscli_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "inproc_callback_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "inproc_callback_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "invalid_call_argument_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "invalid_call_argument_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "json_token_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "json_token_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "jwt_verifier_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "jwt_verifier_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "lame_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "lame_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "load_file_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "load_file_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "log_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "log_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "manual_constructor_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "manual_constructor_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "message_compress_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "message_compress_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "metadata_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "metadata_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "minimal_stack_is_minimal_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "minimal_stack_is_minimal_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "mpmcqueue_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "mpmcqueue_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "mpscq_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "mpscq_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "multiple_server_queues_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "multiple_server_queues_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "murmur_hash_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "murmur_hash_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "no_server_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "no_server_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "num_external_connectivity_watchers_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "num_external_connectivity_watchers_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "parse_address_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "parse_address_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "parse_address_with_named_scope_id_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "parse_address_with_named_scope_id_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "parser_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "parser_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "percent_encoding_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "percent_encoding_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "public_headers_must_be_c89", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "public_headers_must_be_c89",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
     "args": [
       "--resolver=ares"
-    ], 
-    "benchmark": false, 
+    ],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "resolve_address_using_ares_resolver_posix_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "resolve_address_using_ares_resolver_posix_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
     "args": [
       "--resolver=ares"
-    ], 
-    "benchmark": false, 
+    ],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "resolve_address_using_ares_resolver_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "resolve_address_using_ares_resolver_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
     "args": [
       "--resolver=native"
-    ], 
-    "benchmark": false, 
+    ],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "resolve_address_using_native_resolver_posix_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "resolve_address_using_native_resolver_posix_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
     "args": [
       "--resolver=native"
-    ], 
-    "benchmark": false, 
+    ],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "resolve_address_using_native_resolver_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "resolve_address_using_native_resolver_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "resource_quota_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "resource_quota_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "secure_channel_create_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "secure_channel_create_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "secure_endpoint_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "secure_endpoint_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "security_connector_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "security_connector_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "server_ssl_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "server_ssl_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "server_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "server_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "slice_buffer_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "slice_buffer_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "slice_string_helpers_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "slice_string_helpers_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "sockaddr_resolver_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "sockaddr_resolver_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "sockaddr_utils_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "sockaddr_utils_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "socket_utils_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "socket_utils_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "spinlock_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "spinlock_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "ssl_credentials_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "ssl_credentials_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "ssl_transport_security_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "ssl_transport_security_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "status_conversion_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "status_conversion_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "stream_compression_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "stream_compression_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "stream_map_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "stream_map_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "stream_owned_slice_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "stream_owned_slice_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "string_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "string_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "sync_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "sync_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "tcp_client_posix_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "tcp_client_posix_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "tcp_posix_test", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "tcp_posix_test",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "tcp_server_posix_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "tcp_server_posix_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "test_core_gpr_time_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "test_core_gpr_time_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "test_core_security_credentials_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "test_core_security_credentials_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "test_core_slice_slice_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "test_core_slice_slice_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "thd_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "thd_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "threadpool_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "threadpool_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "time_averaged_stats_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "time_averaged_stats_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "timeout_encoding_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "timeout_encoding_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "timer_heap_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "timer_heap_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "timer_list_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "timer_list_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "tls_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "tls_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "transport_security_common_api_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "transport_security_common_api_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "transport_security_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "transport_security_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "udp_server_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "udp_server_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "uri_parser_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "uri_parser_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "useful_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "useful_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
-    "name": "varint_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c",
+    "name": "varint_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "address_sorting_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "address_sorting_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "address_sorting_test_unsecure", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "address_sorting_test_unsecure",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "alarm_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "alarm_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "alts_concurrent_connectivity_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "alts_concurrent_connectivity_test",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "alts_util_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "alts_util_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "async_end2end_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "async_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "auth_property_iterator_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "auth_property_iterator_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "authorization_engine_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "authorization_engine_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "backoff_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "aws_request_signer_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
+    "uses_polling": true
+  },
+  {
+    "args": [],
+    "benchmark": false,
+    "ci_platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "backoff_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "bad_streaming_id_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "bad_streaming_id_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "badreq_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "badreq_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "bdp_estimator_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "bdp_estimator_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_alarm", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_alarm",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_arena", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_arena",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_byte_buffer", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_byte_buffer",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_call_create", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_call_create",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_callback_streaming_ping_pong", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_callback_streaming_ping_pong",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_callback_unary_ping_pong", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_callback_unary_ping_pong",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_channel", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_channel",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_chttp2_hpack", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_chttp2_hpack",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_chttp2_transport", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_chttp2_transport",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_closure", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_closure",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_cq", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_cq",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_cq_multiple_threads", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_cq_multiple_threads",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_error", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_error",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_fullstack_streaming_ping_pong", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_fullstack_streaming_ping_pong",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_fullstack_streaming_pump", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_fullstack_streaming_pump",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_fullstack_unary_ping_pong", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_fullstack_unary_ping_pong",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_metadata", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_metadata",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_pollset", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_pollset",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
+      "linux",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "bm_timer", 
-    "platforms": [
-      "linux", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "bm_timer",
+    "platforms": [
+      "linux",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "byte_buffer_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "byte_buffer_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "byte_stream_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "byte_stream_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "certificate_provider_registry_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "certificate_provider_registry_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "channel_arguments_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "certificate_provider_store_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
+    "uses_polling": true
+  },
+  {
+    "args": [],
+    "benchmark": false,
+    "ci_platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "channel_arguments_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "channel_filter_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "channel_filter_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "channel_trace_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "channel_trace_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "channelz_registry_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "channelz_registry_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "channelz_service_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "channelz_service_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "channelz_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "channelz_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "cli_call_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "cli_call_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "client_callback_end2end_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "client_callback_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "client_interceptors_end2end_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "client_interceptors_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "codegen_test_full", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "codegen_test_full",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "codegen_test_minimal", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "codegen_test_minimal",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "connection_prefix_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "connection_prefix_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "connectivity_state_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "connectivity_state_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "context_list_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "context_list_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "delegating_channel_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "delegating_channel_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "destroy_grpclb_channel_with_active_connect_stress_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "destroy_grpclb_channel_with_active_connect_stress_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "dual_ref_counted_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "dual_ref_counted_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "duplicate_header_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "duplicate_header_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "error_details_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "error_details_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "evaluate_args_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "evaluate_args_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "eventmanager_libuv_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "eventmanager_libuv_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix"
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "examine_stack_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix"
+    ],
+    "uses_polling": false
+  },
+  {
+    "args": [],
+    "benchmark": false,
+    "ci_platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "exception_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
+    "uses_polling": true
+  },
+  {
+    "args": [],
+    "benchmark": false,
+    "ci_platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "exception_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "file_watcher_certificate_provider_factory_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "filter_end2end_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "filter_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "generic_end2end_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "generic_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "global_config_env_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "global_config_env_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "global_config_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "global_config_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "google_mesh_ca_certificate_provider_factory_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "google_mesh_ca_certificate_provider_factory_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "grpc_tls_certificate_distributor_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "grpc_tls_certificate_distributor_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "grpc_tls_credentials_options_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "grpc_tls_credentials_options_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "grpc_tool_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "grpc_tool_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "grpclb_api_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "grpclb_api_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "h2_ssl_session_reuse_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "h2_ssl_session_reuse_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "head_of_line_blocking_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "head_of_line_blocking_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "headers_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "headers_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "health_service_end2end_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "health_service_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "hybrid_end2end_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "hybrid_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "init_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "init_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
+  {
+    "args": [],
+    "benchmark": false,
+    "ci_platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "initial_settings_frame_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
+    "uses_polling": true
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "initial_settings_frame_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "insecure_security_connector_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "interop_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "interop_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "json_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "json_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "large_metadata_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "large_metadata_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "lb_get_cpu_stats_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "lb_get_cpu_stats_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "lb_load_data_store_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "lb_load_data_store_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "linux_system_roots_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "linux_system_roots_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "message_allocator_end2end_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "message_allocator_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "mock_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "mock_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "nonblocking_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "nonblocking_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": true, 
+    "args": [],
+    "benchmark": true,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
-    "name": "noop-benchmark", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": false,
+    "language": "c++",
+    "name": "noop-benchmark",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "orphanable_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "orphanable_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "out_of_bounds_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "out_of_bounds_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "pid_controller_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "pid_controller_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "port_sharing_end2end_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "port_sharing_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "proto_server_reflection_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "proto_server_reflection_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "proto_utils_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "proto_utils_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "raw_end2end_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "raw_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "ref_counted_ptr_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "ref_counted_ptr_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "ref_counted_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "ref_counted_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "remove_stream_from_stalled_lists_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "remove_stream_from_stalled_lists_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "retry_throttle_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "retry_throttle_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "secure_auth_context_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "secure_auth_context_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "server_builder_plugin_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "server_builder_plugin_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "server_builder_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "server_builder_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "server_builder_with_socket_mutator_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "server_builder_with_socket_mutator_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "server_chttp2_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "server_chttp2_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "server_context_test_spouse_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "server_context_test_spouse_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "server_early_return_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "server_early_return_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "server_interceptors_end2end_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "server_interceptors_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "server_registered_method_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "server_registered_method_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "server_request_call_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "server_request_call_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "service_config_end2end_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "service_config_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "service_config_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "service_config_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "shutdown_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "shutdown_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "simple_request_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "simple_request_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix"
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "stack_tracer_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix"
+    ],
+    "uses_polling": false
+  },
+  {
+    "args": [],
+    "benchmark": false,
+    "ci_platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "static_metadata_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "stat_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
+    "uses_polling": false
+  },
+  {
+    "args": [],
+    "benchmark": false,
+    "ci_platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "static_metadata_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "stats_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "stats_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "status_metadata_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "status_metadata_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "status_util_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "status_util_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "streaming_throughput_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "streaming_throughput_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "string_ref_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "string_ref_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "test_cpp_client_credentials_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "test_cpp_client_credentials_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "test_cpp_util_slice_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "test_cpp_server_credentials_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
+    "uses_polling": true
+  },
+  {
+    "args": [],
+    "benchmark": false,
+    "ci_platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "test_cpp_util_slice_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "test_cpp_util_time_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "test_cpp_util_time_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "thread_manager_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "thread_manager_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "thread_stress_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "thread_stress_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "timer_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "timer_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "tls_security_connector_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "tls_security_connector_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "too_many_pings_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "too_many_pings_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "unknown_frame_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "unknown_frame_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "window_overflow_bad_client_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "window_overflow_bad_client_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "work_serializer_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "work_serializer_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
+      "linux",
+      "mac",
       "posix"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "writes_per_rpc_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "writes_per_rpc_test",
+    "platforms": [
+      "linux",
+      "mac",
       "posix"
-    ], 
+    ],
+    "uses_polling": true
+  },
+  {
+    "args": [],
+    "benchmark": false,
+    "ci_platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "xds_bootstrap_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
+    "uses_polling": true
+  },
+  {
+    "args": [],
+    "benchmark": false,
+    "ci_platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "xds_certificate_provider_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
+      "windows"
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "benchmark": false, 
+    "args": [],
+    "benchmark": false,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "xds_bootstrap_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "cpu_cost": 1.0,
+    "exclude_configs": [],
+    "exclude_iomgrs": [],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "xds_credentials_end2end_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
+    ],
     "uses_polling": true
-  }, 
+  },
   {
-    "args": [], 
-    "boringssl": true, 
+    "args": [],
+    "boringssl": true,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "defaults": "boringssl", 
+    ],
+    "cpu_cost": 1.0,
+    "defaults": "boringssl",
     "exclude_configs": [
-      "asan", 
+      "asan",
       "ubsan"
-    ], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "boringssl_ssl_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "boringssl_ssl_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
     ]
-  }, 
+  },
   {
-    "args": [], 
-    "boringssl": true, 
+    "args": [],
+    "boringssl": true,
     "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+      "linux",
+      "mac",
+      "posix",
       "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "defaults": "boringssl", 
+    ],
+    "cpu_cost": 1.0,
+    "defaults": "boringssl",
     "exclude_configs": [
-      "asan", 
+      "asan",
       "ubsan"
-    ], 
-    "flaky": false, 
-    "gtest": true, 
-    "language": "c++", 
-    "name": "boringssl_crypto_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
+    ],
+    "flaky": false,
+    "gtest": true,
+    "language": "c++",
+    "name": "boringssl_crypto_test",
+    "platforms": [
+      "linux",
+      "mac",
+      "posix",
       "windows"
     ]
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/0149b46b88d583e05be0fb1423d10f2a14d36c48"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/047fc351e73f760d329d5a8845944720be9ce773"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/04ef96c66d8222d1a2c07e6b2a6548e6a527042b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/05a7e16c1d7f92111f43e9c777421879920e79a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/063eb46f202fdfe7935c30ca38d7eb81c82db419"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/064773597c295fa871c184fc12d17b6de8aab31b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/087449740758b114d16790067707934479946bd6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/0a5d068feb57a2782c6eba57b637abe8668ac82f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/0b81e6d89bf7df80e87e5ee7c49f7cc1431f77e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/11409339cec708a5e353893101bfe76364337d5c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/147696a264cd6f197adb7c68aff834c30b1b77f8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/160e5cac38c5c9e919ed6e4fbafee76907d63044"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/173d02167db431040b0540d98f6fc5e8b456587d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/18a3fe239806b3c7d1af24bcd2bd23aeeb072d5c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/195abd83b2e9d32b1b5b854fe33da44b6db40880"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/19af2509c7d84334b9ec64de4767a07d5294fd72"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/1b9864b948fcf08b062fd4401ef55b214c259535"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/1edddfa67de854d7faaba41418fda845e9c6a89d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/20031bb00e6608e1b570aa96e6afb9de06d42167"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/22b4c7ce7db99b0df63c9eae9265de484b695922"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/27416437ad287bd3cc1c5efdecebc39f20df73c1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/27e8cd785c2b9346f68dba75761b52fbabaf2b72"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/28236f860d3d8e5ea11176746cb4c1c5c4f1f6c0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/29e15b492c5a409938092a30c003c5c34df7e283"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/2a47864d77749aa042b772895dbdf46f608ccc6d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/2cca5cb1b135c35f6e5e1ec4c37deb9e12d37dc0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/2df27b6c42dbaee382a29a87338d64ee87354acb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/2e9ddd1339d8e599cef658a08965985c4f45e428"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/31a2d12a84a7a56ace831a9668d6ab4847390679"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/33cb9ec0ce3538ed6079b5fcb127649a5d05955b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/348d9ae6eebb2e1644addf7f07231d108cf6f3b8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/359f76f3c802292e92b0640de2bfe051e780a3b6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/35a479988e965a6e3e75138b64b0bd1f45073e2f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/362b00d713686ff70cb0199f3d7d0058e5a1a27a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/3849c1625071791ceae709b9c6c705b28d099d67"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/39ef03c66ee2d4bcfb6c8da50486dcd40f02fb12"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/3a3ca061863499ebc171a4f910fa1b49523baad4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/3a890f3fd01b048ac9db65a9a9b4f4443268b91a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/3b9554038a425bd1fae057ba41f9366bb467e946"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/3ce0ae4aa226f205a3a4e66bbb253419d9d754bf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/3dccc5523986c37e27684659bba8a1037e7a92e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/3e0908c15b1cede4541d25f388b1345e8641e221"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/3fcb181ff6a8c8e2ba38ed34cf78f7482eb55cb7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/41c9b5f720eb8f8fa04c840375a881781a849b43"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/4257a018f08f13a3a9adc848ef808e1be50bc4cf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/42dfc5c4d13261b7259e65cd692df9c9d607194e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/43144664aedb585d45d42aa5249ddbfe81afe470"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/43e5ad495a47593b17dbcbd3e70c2e25a417bb6e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/446614e45b7bef49118b17e031c48faf167ebe3e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/46492477fa84ca88e85df914801af0b09b0939f6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/47157f83b166b57e0052c98a65c6db864fa6cb9b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/473fc9b6d768a925527d3ad805ca363d490dc741"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/483c0b4015100eee00f6b23d1100d8c4953dd3b1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/48be2dc4cdc5462407b319caa855d976cda88153"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/4e84eb54a0e438052b0c2e83653135042d9eb59a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/50839d5c8bf33f0970986dcc4b73b024f11a95b7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/523d964986d8ad966ae07e540a608681098813f9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/5410b8190c95dacd36d6e6ec75b7538a630e08de"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/549b2891ac79f504a7c9ea00f6d7527c34ce04e6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/55321649e7b7f1b5664ae20724e683c930643fc4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/55cc52f25865baee3e6e52c3110a9723caa2b3cb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/56c22410e3295ad03aa31552ab888f581756cc17"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/5724a705b62a7548ba2df1abe4ef0c970c4e1bd2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/576a148c107d56861d1611641a6f7c7921061c5c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/5a6b8263e8939f851cf5b1e347a33d97253b7b3d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/5ba93c9db0cff93f52b521d7420e43f6eda2784f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/5bd02a339fd7705449388580c75bfcc597aba954"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/5bd6fb6fc4163bf3a9db6ddaf509dce8df8a5000"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/5d06fc38005503af3d084721c60e574fb9d2f370"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/5ddc10489ff3269bdaa3051b70fb7af455ee1104"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/5ea9d515f0d10b04f1356b9463139bfe121a6e4a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/61c449793347cf2e1ed0c38d54d23c63dfaabeb8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/6287389c373e9788dcc04f9747b4be1fd1ef3028"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/64d4de4d5aafab7ec388a7fe83066c1a4d1d9d68"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/651c37806d2ac579dcfc97643c3c1ea74dbb8774"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/6551d02d20573cfa2944ec1f12b0c01f264a1326"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/65f029414ee10e45ff4b9f305f7b472364cea538"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/68b75a17fe2db060df3e61a597650ba99079abbf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/69e80594dbc5c4c648e39883a650b1760f20ab63"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/6cb47d0e640b4c41e32f13c0d64ee46eae1b80b5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/6da5fe063432cb9094c7c083efdbbe5ba4246d18"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/6dd140da774d85f272fb587dc1b2a85d881a7c21"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/6ddab273597d73be49e2307d68e00fa18bba4765"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/6eaf85d84fbf47ea0619d0dba8d366f4e3ff0be6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/6f751cc09af8113f6ecd491b1830bd8454c4738d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/70d9eb29a70d483d07e2faca6b00098af78d1fff"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/7192effa1058382b379fb7b87f1acad5ac554d05"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/730e85d6a62e70cb6721009b903782ade4ff73a2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/74002471a854059cb29de7cad8f9fb7adc3c5ec2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/747f2330cd1fc4a06d54b376a9a6528d0364f0ac"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/749d5d7a9e0b1545b297117e834462af32b3e230"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/77de0b1de120ac702ca45868b1008a48626daf12"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/792c67398bce19a4eeda32653c994436e79456e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/7a3022b248c8960289e4c80c7cc8df409499e5da"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/7a9372081294a6fbd3fecdd91b99589c98d4948e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/7bbe4ba828947550f4ad089d5989cb695ecbdb1b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/7f1ad514a96f0c3d5ca5d6f7880b929a65eeae96"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/7f2b075f0b6707c38db851747e2578343eeab286"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/81ebc64bfde3fad37af5a58ef7f1c5c3c54c4b5d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/82fae081afaea13831404024d39658344d56e1c6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/83ba41cea1adab707f7f213af5e2ed734bdddc25"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/841a3f66c94e5acd836a44cd5a8514d4ad45d83e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/841ef94ee0f1b0b45983d95b75aba25421d73f2c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/843b0aad4a9707c5dcc92d12d876b78675cfcb65"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/8483e3d92eda8df504b1d1d0d012f4bcd778cd33"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/876830fdff4e59038fa2173b700faef5bffe61de"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/87ca3342fdce0c1f678a3f1b62428032ef51442d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/87d044027cdb7d35fadb56532f497764246946a6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/88ce75ba18bdb7e93a81197d850f4e792f6a8155"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/89dc55e8e20e811e78c952c8bd2c16f55fe72f57"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/8a215a58908f44bdced595ceb01a81977f1d72f0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/8ac7459e918304ca40b1cf29a3ac0f555eada678"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/8b93e50a911f3ea0e0b0377ba4636574f2ee9a5e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/8c9ec0ffd803505772693833d56e7a02110645b3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/8e4b361a530dc6825afcfb4106bd482c3fd010fa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/8f6690d97bcda890f2a5b2930a2b7a4d7b56c6e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/917636de2c14dce2580d4308249a94d61d62c305"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/91f11008defda918951bda868cc68c6373fb0e6a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/92e01a34047b660a798086d55a3d8d7100a01939"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/963fafadb4de09dee0e6a852bd61b1740039a465"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/97bf33ec97b93fcc2449431915911a55b906e3b6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/99e31e12b02b02479d10b2c08426906bd93a0840"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/9a75ce693e7259d4d3bb9203dfc0a65f8bbaa466"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/9ac0d956f9743e026baad7319ba2a75d9f1a534f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/9ae56d4451dd3e1b66ddc250d84dbf6d8cae0dbd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/9b9a3a1e4023c9b172060249752a482a3437ef2a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/9c81164e10bf612c352dca3ecabf57743b451d42"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/9d8b420b5d32deb0140ab91eeebba58ca6163722"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/9de687bf1e2cfac54c3b2e2eb85b53014a460ff7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/9f3cda19a186bd11bfac361b464f92daa129a33b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/a14fc6a608121f8abf0fe25cf466720f00f25653"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/a39906074669a6b76a35b0adf2bf36ad751f3b35"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/a454ca483b4a66b83826d061be2859dd79ff0d6c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/a52df5607370ff0f56d821000f3d5e386a01d489"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/a56eaf47f7c7263e53efdc55ec39063dbb4ae71c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/a79249fb8f7d53f0a280359d2d9df31594adbdfc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/aa98a46f25004f7436aadb36ff8b7f07ed7bfce1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/adc83b19e793491b1c6ea0fd8b46cd9f32e592fc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/afd8e19f7bfd6c963f1856be59b75627864821dc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/b3966239b8568442baecbeb0f8a1aa29dcdfd7ed"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/b430d41ef65493b3e917182c23ce90df983e01ab"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/b44e715e0cfe05f0c92a9e000ac3c36aae17df9d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/b4cf4ef7b3f64eff76cf99091fddc04411774708"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/b53d84468ea93620a9824ca65acf1179f431e763"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/b6ac4831cc5baabee9c8ab9af9ca3923f91097a0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/b7f4a484866a8050dbc63bc905c9803c6964eda5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/b8f21e59f90431c982d5ec3fb54ae4605f102252"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/bad10b6581cdead8e7cb96e4f544dcf0ea650fbc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/bb01bed86b43257be9f527388e1183f52438c473"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/bb7497b00f0d999ef39dbf81c6bd0441e32723b6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/bf01b72e635deda1b4a8468f1cc36f01a54e1338"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/bf8b4530d8d246dd74ac53a13471bba17941dff7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/c08bc84ab6a512b901bb730beb05c8394e4f1c5d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/c244b635d94e6f5d6b344887434be3e001a04b41"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/c281efe9620da999a637ff6e9b3279ec613fb992"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/c30a212824ee71e215f475f453de17c65a200101"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/c449427f35b7ecdf5641073629f7723df52c4cb0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/c60240cd3b02eb71e2bf5ebd59afa3a5dc9b5e4d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/c60cdf9c3fb9060838f445b3bc3852b6f81e1e4c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/c72d0501bacadb45242c553ba292591302f12a6a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/c739e7b5ad999edbdeffdab672dbc30deb3959a0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/c7d73b12a7108d82f8dac6d8a6a34f838601aca6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/ca781e1add632433293e847ae9e71649c217ee5f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/cc48e916f40e8d69c2d07cfda42c7d3b7fe3447a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/cca1aff4c08ee4ccbcb6f80e1cd1480a0a093cfd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/cf6ae8bf1d08d25e235b7bee0839984bbc04edf6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/cfc52fa086292c699efd7bf41d2fae3deb449536"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/cfe13ef3c6c713a059f231f0001ecec97e2a932d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/d14026ac6421bca7161024f4e735cb80a1068d01"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/d2fb6e8f7867fc1e2ebe723da2b5246dc9cc6b14"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/d4db7d51bdaa4781cf12c3b59914bad414d2a41e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/d533da0e7f8c1e39bb025b4d7a89613142a6f54e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/d5cf489d01a1b847a7aac5dddabff23fdc218e1e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/d686f8561a249c7c15c78f76a5fceb884286e070"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/d92424daad9d96a40e5ab177e3824c36ef51dc0f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/db242a11ed88b2b26af46770dd1927d9f35301fb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/db32eb04db13d58f65f46d262608bd088987c063"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/db39a953317951759e40734de6607a0b4457728e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/dc5e8f3102456bed90d17303bc4cff1a7e076d5d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/dd9542bbed8e5dc58da2789edbfb9c38d578d3b4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/de2ebb1ed324385de500a1a3308846239857c3c7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/de8ba9158254c1cd84b53df1e4cdf1757b1392f1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/e1dd260746f50024822a8b729b89545d26decfb8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/e29add81b20dc570fdc885782689f6dccb1c5fad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/e2e99af62843cd3b29d50daeb118e58830784da9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/e46611c5daf99662e1576147c1623409752a1f39"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/e5a1ba11af830e9d2db201c5164f75747a85fe9b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/e6026ee0badf216b326443a5f708446b2f2e579f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/e6c7d2c0038fa1f03fc6590a726abc98f4c641f3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/eafdef6a630bed71bd0e4f3d4a16b5fa0c920651"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/ece985b9b82e27281514d460709d7edf8203ded7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/edb8f4259f756c2c4bc731f05beaa36f992cf079"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/edce7778c2e1adb81dda3d057a6536759a7cb293"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/ee4040c0dd406dd616c49ed2c37b40478dabfe0f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/ee69f2b380663d051a70f30fcfce9f79f5341e5a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/efc6743e47274058771bb6eda1fefa017bde4a95"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/f0038e54162000694d882b1acb80930c807b41d2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/f1deb9e388c877337dabe92f31b01e2a019a10f4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/f3a09373e4d3c7310d372089e6deb15d6b22c198"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/f3db7ef6495fa1ac5bb4db293fb38dd59122bb7c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/f434bb4ceecc573e085d4c3ef453ef01e93d9c89"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/f55bceaad42ddf9d2b37fdfca68255d29a696109"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/f62ca5321428a5d23f3c804fb51eb4e65bc58716"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/f7c6a558b8d0af64db2b139371a7af7068b01b92"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/faa1781e1444bba5b8c677bc5e2a38d023a1ec65"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/fceba33ada1dda05fccedfefd331c9a201f1a2e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/fd668bef6fdaf7f3ffd58d8c60ce550476652e60"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/fdf06b928e37e7c4ae59a568b5723ad98bbed6e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/fe2fc5d499aeb2762387ef2e3ce939280813dec0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/alts_credentials_corpus/ff548d368b090409a138e5cc4afc7f43b4a3fbbd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "alts_credentials_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "alts_credentials_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/001946397b463a3562c5951f6325069d8a3a2ded"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0083d5addbeca55271ed7ef93c8016bf7ca76903"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/00c8446b230bebbae2b473552b174a06b446337a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/01b05a9eaa95950f697627264bbd5006060f68e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/01c9569f5835a576fc50ea03141662c7ef1aa088"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/025215e11687c7d2e0055e5b2b902d08e0436f78"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/02ba99615d1d69eb328adce99670f659959c1bc1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/03abf728ac1d833c2d4a9ff7e0c912b949edc04c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/03beeae554ed6952e94a0bf32cdbe9f97eb3ba43"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0458afa7b507195f5d2cb51e887324d6361eb0c4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/04bef86965e816c0cd330896ecd981dd3b14275c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/050b79c8bf73ec690aca18072cdf95810c2efe8f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/05b4eaa1e1a759aa6b23521c06d915174e8fec88"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/05cfa5deaead322efce84b710758a24440cef16e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/07048654244e377ddf246e8cc18f71443035cd2b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/078232947d7ff25557e836b4e9e907214e99b320"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/07b0bed3226eefac4a84000ec584e4ce06ebf1bf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/07c4d3b37e850941d04ee067fcd356cf9bb4e0d7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/07cec5c8d9c856a910c6fb57da2ae954f44beed0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/08a8a647b6a8f47ae10852322d14832fc15021f1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0949f4ac376808482be6ab2dcb18a2ecb08d9a52"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0b6fa6330bce65dfe7f758bcbfca2a2844dd07a6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0c0169947924a15b1b5fbe8f9013fd94d1931a36"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0c27c9999302b39bf2256a90b0cdb767fb2b6fe3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0c30868720d5e1a19ff23c53740749c37a43540d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0c5e0660ddf5f14af8f3fbcc754a967506994c9b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0c6f2e0a2232788cb20c4f52ffa18d7ab8f0b938"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0d36da88698737ec1ca7b55b30fe2b2036de7e19"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0d407f099f8418de3dd94bd2146c858a8c6575ad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0d4d486aa9fd6e9c10cc9ca8967e922cadddb2fe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0d8c547f1d261ba07c2648bae009636c17709600"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0d9ba07b57eb0e076b187c4455f662db085e730b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0dd33527db106a3e84172e8f2189734b00ced4ed"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0e354d89d02c6c5cbba2f140dab7b609bf00793e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0e3a18f0f08dcb9dd174627bc997f74a5c7a1390"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0f6b989cec08ef9da603dc83704d85900bd22f1f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0f7480eb0099b7706b221f610d2613b401d6d3eb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0f83cbec19c834f534f353f4fce20c0cd88231f5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0f98d7d56e9a99b97e5dc7eb122ef22e9684077b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/0fd8859246740606c498755ab00d6147abcfec00"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/100bb8f2e6a0b41da13f4edb5c15d4a04e564840"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/101305ccd08c7a8bd0c2913c37d3dd0d39d4bb64"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/10b25b0726cb6d820165699e5a453691c7a9c343"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/10f5d1937cb068fee7f85e2654be2bfe77498bb9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/110074f658208166d52897c9266fc46cbaa8af36"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1160214cdb23e8fc187078a8d6796656c1ade925"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/118ffddb43ccf9dae8bdb4702232d1dc39b021f7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1231c6d007d9e43d169122348363e20d9f25ee93"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1306c4c6ea714d4db0e4d814c944d8d40335e0fa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/13a9b61e431c20734c19bb36d85883b6a501284e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1402bbcac6fa24eeb0475250e33f704096e2fb45"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/143e0d4f546bbb984a7c3ac1c60a37dcf85ea58d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1526ac4266e152b029b7c283255fe4fb6507f726"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1576c915ee38f5bd19f285ed0ed47e36026518f2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/15c8bfec99ff18b11211d464c824fc139cc791fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1602788cf33d0354d6d48ead549e5137cd211979"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1698ec182fad9d973b84615da3a683ecdf2d0b3b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/169f579e66b4b8ff423891a40380e648e8d45247"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/16c85fba7b4510ac26c0fb91886d8bd166a7e780"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/175f16901997fdee41ac9ec88f7e018d46d774e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/17b1758fc7cd69a00d140f113b1ac894023ff20b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/18185cbf9e9cfc1fd28d27ed0d651d7cee6a2c06"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1859e2ee759e20fe195f67615a1576ce2b7d5bbd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1875a4acdcffe505ca92ea8af8d9d6b174736e80"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/18850965807039500c7f5450a907e86825cf823d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/18926cdc608599e8df6b0f4df99d4ad856ef4373"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1965cd58fc41578a837231c69075994da2e871d9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/19876f91bd6e71eb4caf6748425ac645f3e73c5d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/19e984af62c36fe982284c87421d8ee46173e9f0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1a9017db5ad8a9dc6cfe72305da1683a87a73452"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1aee32faadffa3c2ec508e8fd30006423665488f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1ba08b63181066ffab948eb301a6a2363a81872d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1bd90335afc9e0a1e6a9296e3cc27c03c1201886"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1be157b0fc79f0e7e1e05dfa3cbbe1ad71528bc2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1c222dae4e2cde1fca9f9bf6226200f70d625342"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1ca51ab2fefef4f549c4a8e7f4910c6b5a4b4b1d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1cbcaad71950c62d41bab50f9c242d014cc0d904"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1d19042e6db2a90c52fcc3cb0aa76f2fd335014e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1d458954e8174bbb5dd4d0053df47d6b7adf290a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1dc86d0febe4adc5353230cea24b5f7cce829283"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1dfbb6d67ad8d2513a1841ca6f82faacc3783b61"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1e64080289ea4168304417f3fbd86b01d7d6f431"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1e84d42fcf18bbf81ef6e8a16a0c57abbf8d292a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1f040e756f76357979f317e0c6541f72fd93df06"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1fe7d16ffc2084d5d3c5f23d16902ae8810a5393"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/1ffc4952225dda41de59603e487ff7fd3026b958"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/20216d27af2b3dcc83d944e5f7a489ed2eff98fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/204093594b568ada9c7857a971f2a4b42123ee1c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/20539e464ced1a0a63d74bae731ca0a75db05967"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/205cf2b6994f10b783aa0a06938a5e47cb581126"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/207e12d6a84dc8fa020b3a60b3f75932ca4f8fa5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2086f83879663d7fd7fbd9a5b96ab6b5a555858e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/20ea73876cc9cd5b3d3efa1bda21deb5eac2d61e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/20ee437b7f456ebb19d98d94d9feb1d5e9174c65"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/20f43d29547f865e9832fd567c2a5a5899512c4d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2166c7093c424a2136c4cb8b10d0b124047320d4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2185f411bdb1edc610f16ffc86836ae366193e03"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2197f63b9ae90f5374726d0c5b252e729014a9cd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/21a6a133f3d1e06c077032ba56a7df4161f62efe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/224fa2e83fd8ecaa9059ad37a55238f74b8e0829"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/22661803bd1c7198df4be6e08924ef6a48af9cd4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/22741b8aa6129655a8130305da40ae1d1500b844"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/230527b90b0179139c961aca426187893191fdf2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/23066692f06a4802954b513a98546b3ac9b9ab85"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/23e8c1377addaf67019ea36a084e0b68ca7a33db"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2467fa0f8a9f4bd121f544892f0782498b2df533"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/246dcf347eba7f4d4e04d97dabc002f0acf2164e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/252de25a5237c830ad8c5e4732c176e03785042b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/25761748660a64111a8daa46f72ea1f336c2046a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2585dc7b6c095e978b56e0249fe9b5c61a4840af"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/25949b623930511f9d43fea4aa56a4389a28e11a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/25d2969baf8bd256e15b2ab72707682b2d18b40a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/26110f21dcb0fde99942e631366ebbd9d895860d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2663ce44ca5832381cbbdf7b252e39d6df021a93"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/269afce3bfff993c05c2a3b28c6cf3dfb3f461d7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/26b8a9d27cef1ce4c3c5aefa2dee50001aab4b13"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/26f250ae38865f030176a8801ce992536351a326"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2717067bbc0e9bfc1d90d15cddf6154800a25ec6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/27bb1ffec59d4475dd9076b408b2cc4e4e17d229"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/27f37037525aac7a41ffbadd6ce52e5a1851a2b7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2825cfc19c9371f4fe70851283c68d49470d4d55"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2862adc802092f1a422416a1666a5142f71d5d7f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/28680d04887f96a1167dd913573ec8daa2a39625"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/289cdf83f89f70a13e9078259f764a339617c827"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/28ee8cae75efa07da9649933a9482d00643b5395"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/28f54e558b181e294e101447c7a79d976fe36fcb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/29303c16f3afa18c2c0b84e77e587535a705a74c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/299034b9e0cc8d91c049c489dca6d1a2b8b08959"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/29952a15459cce9c647255ab5d7486df0507eff4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/299faa82b90ef12421d160148dfb6cd0077b57c0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/29be7d33920998bae7329d77d4c81989eae91647"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2a8260b23460f90f770cedcafa14868d24db201e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2b230a7b55b17f2f8e89c4be73a662d781f7fb3c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2b5eb5aac77af905877bd98ec2c4d746b247abb6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2b71439e9ebf611a92386b9f21ad44bde7926184"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2c1c3047f9ca95e64cb158c09eac2ba17455e918"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2c1ecf05c5dde692ed16502294e9570ac3b02600"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2c342f8715556398d49bcf3343b5a249d968e19e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2c452818a10ddef09b90c89a53db14b9b56b21f3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2c6e69067c68c145dc5d3a60b86d8081fdf95d0d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2c79128c697b53256c56b9c57c7259866e0e2347"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2cc43573f271ecd332551c1fb34ebc8645eaefe8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2d83097b3cbd2245b085e749fe923fb590790e0c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2dce4a1fc4bb00bfcd43d549a3785913c9280369"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2deb1aeb93c2abca4177b1fe886eb354c83fe8af"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2e888bda20346a2e19379e72ff04aa063897bf0c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2e9860242d55a74cec244bb5c5445eb2797a3157"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2f288409c5f3cf2a10b3e1970a9c3d037dabe080"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2f5f6d281a3d0473a04a17cbcbc6fd06cb73fd8b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/2feb41037f5dd34e9f3465a2fbf1a6d355c8ce9d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/300998021c7f743ff49d9cc192343ffd43eb47f2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/301e10bb6d9f60d91efde4e0c48893203a5b8b88"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/302a11eb9b9687464b88c9a670da371f6a6c57e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3104e3fcf2fe43d5a748772a04ae32a1c828e6d9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/310b2aff5e2ec78b6004630bed39d49f8d13bb21"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3128887b8e02f1873ed6b36766a870543269ea00"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/31545e9fe4c6aa43329dc0d4a735842574fcaaed"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/31d12a2b1378120d15b4097371d792daa95de0a9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/320dc10f64b59b0eb0ae140912eded1ef9276556"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3233f2ab3b6c9431289ef7dc4f40676d0128bcad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/330dd22142ff48078b189f4533ccc56878d88f92"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3336748264594689041e4080b51bc56f716d0689"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/333d0554d91872e693d118d6988132d95b7920ae"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/337d579ab5eb157d7d58e9287d447976062cbd8d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/33c32a80db0ec311ee8744991c5b19345bfd8fe9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/35fbd748458e3fd6068957d46a9fbb2b0113d2b3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3608078afee69879bcdbc2278e6f314469426bde"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/361c6f4374443671f039fd9659577e4460178020"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3656614c7b0dc11d4dd7e1826f77fa96a88c420f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/368c75135a7341a96627d0dcfc4b2081003d8979"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/370b2c16cc353621091eda4964d4c4329205ffc3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/370f893353f792c99754ece93baed2105decd71e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/375c2462d6ae891222686f9519294811fa5de010"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/379b177d55b1eb86ddb66dc3a037fd8283ee07c0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/37c4aa3ff3947065ea7850574a82a29af35c1a39"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3a01c85934363bd2067f76d0d40c491f9f846c8a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3a3eb65d51f30f4cd16cc6f8436a5b00702a5712"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3ae87e3150628c422ada13002b08f2d9c5a9d78e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3afbc4c35885b79c6e6628afce93ce852d7767de"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3b3b4f9a985ec49f6c54bae798208625e5adb777"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3bb052abecc1b916cc869b9aad29c9dd55a95068"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3c01b1f89d50fa37fcb3457cd3dd6502fe84e25b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3c5fa483ebfabe6e684831ce7c413176bc998c33"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3c6444b64ace5cd6c145614ad4412382271a6120"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3c7b516e302ad3503a933b5dcfb8c58acaea07a0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3d4d961511c1de95a81b129f2fe96390209de2e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3da7577acd806e1d92d48211b22fd9db352fd834"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3dec1981e8677ec6ad2517feba29869d53f8d884"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3e8f531043a07df2280bca73fe4a7987d82ce67e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3fc7331ba0cf4e65fd120c9925ec0134fe683b22"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/3fcc2da89f438b247cb5b4b41e15aceccfa75b36"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/400e6759ebf559748bde92047368f7c612457edd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4040224f3df361afe45bce682d56d26f13829413"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4045d25f065bb1d70a8b9c3751f7453d4b0625b9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/407cedf992b14edac6e19f7d440ab73c88e72465"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/40948412b61caddaf558a73661caa8c1d2f858a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4097094277bc09981f428280fc0cc0f590f20ded"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/411966ea7d9164fc432eeab55a55248ad808bb01"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/415dde26637ed3c0e803111c532a1a9ea9c49092"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/41aad2f11a7ab418213352e84de872d9997db8d2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/41b499e86caed7b48c59aaaf51360c3c71029400"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/42554ddbe59429d30d718282ca606ed8b5a90eb3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/42c395ab373346fb283ace021bdc1f6428f92f80"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/42ead79c94eccdf8a8c3d8036be73e14fa260dd5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/43202ad9b1a689d919ab9ae91c2d0223394867bf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/438789ebe8a5d676f6f03ef8329c3d77579aeba4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/44153f8b7af5a3b27625a46af89e1712daa3ae8a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4492f9d9339873fc83bf248e392b0dcbe28c0f6f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/44b6be630161765a3de5872629602ca14789c3bd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/44d64196fb2e8d9506734a81304f6ef17b9bc29d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/44f0973ec77d6fb9eac931e84fa7ec6fdadccca6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/450f9f56c80c8b71e37302a254ba7c3f7298dfd7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/451e69ab65e0fe0a5731622ed21ab2b5380df677"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/46dcb1c399e5a514267fbbd5a50939f34e0ad6be"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4740e1ad2320dc991596716087180e2965a38863"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/47e8aee44c2c7bd870f15b50fc085c5a8030edfc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/48521eae3d7e3f60237d1ed792a3c0f141919a19"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/489e9830136adcc53f4b191199c33504685b3737"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/48a3f2938fe5c8e383cbb028a36a943a64800f03"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/49112bf1277d93601eb6526fe9ee9d45864d759e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/49c5568cb0de363bc9f9298f1eacaace6c8a268a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4a11af9ef42aeb36691185520be281c4760ad27b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4a4553c2e939cd50981bc38e8ddb1f2109ddb3a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4b2ce115b15082ed951f4dc0b432da6a9d37bf85"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4b585eb75ebca2187c0aa5a6abe4c8125aa80127"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4b611a3748757e2fa89fcd2fb22d34444fbf5b42"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4bed84590a55b06d7eb30d8faa4b00a881ba9b2c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4e05d6cf1c3f0c04f6ee92d09a53ee0fe35c085a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4e21c4b5c454df51c102f09ea1ba78c42133ee16"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4eaff3c3515a1ca019d46b9be0b7318eaffb63d1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4ec113a0126fc5746fa3f955727d009040e8377f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4f5b9d5c707a35084918c272efd1295d301ca0b5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4f8b5b7489cca36225acec0f9aa7f5c556d79d8d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/4fc34239f220392581520aa8cebc659daa65a7a6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/50ece7ea16659b4e1a2284cea963fab662c19e6b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/514c9cd7b6519b596900d924ff2caa173d688f4b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/51c6c5297acebf9d21a8a7d6261d0a17c2adfb56"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/52939682304314f04897deddfbc9c7afa8ee50a9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/52c00bde7f4af95a86deb0a6717d1faf2828a939"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5323af7bd1b45a816c8f8e5c689f5a44fbb14a01"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/534c900ade27c8f7fccb1f3b7e7703f77f13a8f5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5360327e8bc8969f31b364df3081b51a1e03900c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5369926a559827d08bccf264876d592c7cae660d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/53ef530f65b0cff2e338a51b469c224f53b628d7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/542c958c84d1e319b9ba23c52de2c4bca08a8dc7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/54555ceac4403855f4cf20367f7be05714c46c51"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5482dc4af170def9c183315efaa48f9c186926a1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/54d1bf3559344653a4f758f7360c46307cdad159"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/54e67ed1036f3f5b315e0e3c02948c30eba900fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/55ca8f6d9928c239a7abb32554463e6e1e1ee084"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/560c1057487e6b0d2d457748c3ad8434423eb263"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/564f203f678fb333c7b1f8f4df79237589ce346d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/569d50f1d1307e63a549a8a8fa677c2a77acc0ac"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/56b0ac0636c57838f63415082b3ae2ec7a93f017"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/570ca8d2555dde94aa3b3121e8f5256e83eabe5e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/578ef036a0278e79f7b935293be37bc8c0467269"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/57e7cb796ac65d2e3ea2255b162da4b9873c83f4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/57ee6efc38f4c544a3ea3e5e73987e825bdf2980"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5821752bf8923fdaebc8484662624d8acd382716"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/58a067ec6eda7191a5a910d8120633271d3af074"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/58bcbd601894835bb3312d2a0bc56f2e0f65984c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/58d6dffb65a1fe1bc4e3fa970a15459587a32f77"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/58f6d7756d89ac2eaebb50c6d1d0b9f5fa0ce357"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/591d46b83d2e6babc0ce3c753c4606a10c46d7ce"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/591ef436ef8cc982b48fd827a4555b57cd9780e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/593792bfb0489b02828c93278cf869e6fc8bc230"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/598d346f284bcff26d1de997c4ba5c4794c90b68"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/59d28886db21f371ac9d999b68b116bcf425d971"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/59d78f6397f0483d139f5bd0a9f264156f34acc4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5a2447fdfdbf123f4592c1284007b7d50a01750b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5a52d683c9342dd301b0e699db36175aad715e1d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5a8cbd42a033b7899383d48c3929e517dafbb995"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5b7ff7c113c2bcf125271d22c937f758a0cd2ee4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5c14b48da74ab06b3cc20c4fe355e24f7dd7852a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5ca233a53e3e425cc12e04b466a49789291eaa00"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5dc7b2086a39f56d8b9135f524d34a01fcabafd8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5de72e607205dc17a45df703ec4e9b63c36821ec"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5e1659e7cd840ab3f958273ebffdd215f2c81da6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5e25cf639ba8ea37543d944f5efa94824c6272ff"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5f247d7b6753f7a8798cf952f49f303c532e017c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/5f3fc3d381f07c2593cd70d9889182fe67ded2cf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/605e474e9d9436488dfe084d348908e4dfab81a3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/6066fc9e28b4ce704230f0e8cf21e7c3195aa2a3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/607dac8012f188cb035b189fc3637028137023e0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/60ece7fac04e244655a6091a7fc6eb76f07c7192"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/611343a6b8879b393ba2f38ed41c7f5355355920"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/616e55354ba3517ce6762d6cd56600f97915e646"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/622d46854c2d38b5fe632649d58a69b7da0803c0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/629dd62ac0c44a5bb49a5b4b5e4d3f15852a0991"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/62c843359941660da3fc9eea62a5732aaa3be283"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/6353376941f932ad6ea7620be8673c27ec106aba"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/636a19b8f50c4efccccea83ab78a933d999e41fa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/63a1cb41d219394c9bab947202921506f3574ad0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/64696e93ead18265cdac3fb37dae29ad3be6d764"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/64af31c3b16ccf2e182998ef7739bc3d33781d8f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/64c0e0b4d9c2d25fdcb1e2bdcb999487fc096dad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/64cad305e1858eae27cd723778fb9f4b7052eaa5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/64d27dc9f984c49d421a5b0cb0391992d5aac1a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/650f74738d3961af2d1fe85ad8fc8212ea13cbbf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/653ec14661c40ea25bdbab4a7cb9371c669d10d9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/65c7a3ead9676f7669f0e93c432af714c232e5d1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/65cc92868683dcf3c5d1bd1a73db9473d6594bcf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/65dff388749da6a44926b491cdc555f61d708171"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/66145518601b1405361df12570f6e0b2b9a2e5b3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/662d81374a2c96f867ccd88a4295190827c45453"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/667ce3f1c874125b7106bd5520e60e865442a712"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/669256f857011c32f5757ec19b2e5b9a372f6c23"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/6749752b02f7d14fff9ac35f6b68dd62f5b49fcd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/676adbb1e5b3f4f9e3cba51d3d4ef963ba4ea7e3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/67e72cea2b7042f08e8dfba5191d27bb390e4d00"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/67f160446ded73c408f4e5a0665731b642b6edd4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/6856c7cb02d2ba74a60fd47140f042701dda63b3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/685fbddd9ea612b25e325a50bd659997b4d77da1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/690158fb146f7f3b3ea820979307a8d8e6f38314"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/69542ed81b00a5ec8daaf4e8d509201eecd502c5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/69be4179b28e408a0574935e893c6986bbca0de9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/69e14b73af03e8f2d998cfcf16215f65bf589efb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/69e52eef5dd0c51012b5c974cf70f4074ba814a9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/6b1698d096095d4035ce67a8680b52eada00cce2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/6bfd3679f4e30aaaa1808e96c980edcfa9cac1c0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/6ca3910d5f4f7967311853724b072750716dcb48"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/6d054bad0bd3c522d23221d71e3987a0e6875150"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/6d1509889d26c2ea16f5d12d5f6490dba7f1565a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/6e2796549e29e5066f780a5e926fd6e3bb362450"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/6e71553967212dfea2c9995f3641e582d8c2105b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/6f30de3096eb71f697885fdd9cbddd9ee6ce46c4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/70b8a3a8621ae1ede2b8a4a263060fc2e277bf2e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/71106770243ccca03f5025aadb298ee3a825824b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/717695057d76b81c344ed8c23cc024195caa9405"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7353a7b2ea9f61325728b2f118416549e89dd79b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/739228a1400cd69c47f110002c34dbe1661e8c41"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7465a4955a064e8f1bb777d4b0de5b3df8469831"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/748c538708f0a2f586d7ff5f662643b8f9137a01"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/74e6831be67485fb59b8e226fb8a48d88faf57d6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/74f8cfb3d1b8422927edac90107aa280a8a2a19c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/753efc088d6023ca113a12acc54015a22f7daf9f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/759a1e2e34cad14321a5e5790b1e6a783312fea1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/77cff7548cafe87410e4a0dde3ba6892b25594d3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/77ea9180617391d8503427a1c060538182f7729f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7885df741c88ca4b539798d9985c445f41cc2929"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/78abacff5d3a1e826a30f278ad52237661018a67"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7a7e42cad11ed5ac39966d23efd04777265fc50f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7a9a12b15c798b88f1a599779f52d14edf9f4ef5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7af3156d286a32a6a6fede46d93ec12ded1ac138"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7af41e5391204f4596cb1461792e2e23f9390b7b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7b8922ed2aef31167d305571a4ebbf7c182c502a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7beeb19272131701f3a0d1dd633f1b1969899366"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7c2e48b0d08aaeb95b5ca26036384aa2cec9de77"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7c73c0671308e37a8075a20863e70e180ef8b6ea"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7e0e459a0794d4f91954eb6e0b6a09685fa71c78"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7e18989175bba8d9aea34413d6f328549e1c6825"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/7f1530d4b702e68d043f89d9e63d314319dcd803"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8021c689f0078c5c59419c9959f5c58472245bc7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/807b8c4ca068cff4bc0fc8e854c1215a2fe65960"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/80bd4827db81a1da28fae8c150f5e2d46651c598"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/813d2c34c0df8d4a918e68e58cf0ae3703d0d46f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/822cae715352b8551c840be2c7e2f98df455c9c4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/824152f7bd022996b41327002f6971cd9900b265"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/829a1dc2bcb22a230df8aa20540def0e16864983"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/82c0e02a867a5fdfb805e01ebf1a008220311e27"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/83019387566fd48738546cdae398f750cccdc437"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/831248cea079b629bf0ef6d9d02c159d6f8ed41b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/834527ef0bc1572c584938ca7fe5336961754708"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8382c249fc9c7a248833d89de554e63807c475f7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/83baac5cfbec61ec277114aae4384a11a576b8f7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/83baaee9b46770d9eef0e161a6e52cda76e3b043"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/842cea88bccc41d7e2625dae8ff7268ee79e9f57"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/850c639595eae3cc9c2cfef473e28fd4e8174dc8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/857ce08213a5106c746767352c6863d7bd134208"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/85a7e47ef707d3b31cad924ed6c697c3678ab569"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/86eb156ff8ddd7edc535840d412342ada6f3b184"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/871a2e4d73a7fbb50f71558517a2f704b7fdb868"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8795e24f23db36e4f9ab609c9faff601b984eb6f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/87967bf3b1412ff60c5bec8815f4b031aec26b4c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/87c8549a5e524609c29e6a6ae32a3a301b72c286"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/87e97b460042d045629263ad10ff3de7b000f0a1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/89cf42c02d7135afa6c81d8a0c2bc4c3df557769"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8b0cf53ac17015fe066002cb3814933df9ee96be"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8b5c4543923da5e468aca1de1ab880aed2ac4451"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8b7b914723bfc23ec650cb91d209141641fba09f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8b8b9fcdfff1f891b1694614b7309cb4a2098f4b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8b8f6d58dff9ab0c37183ec93c9a600d5ba5d9e6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8ba00963037c9ff548b7a702497441799075f14b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8bacacba71bfa5c74fd74cb6577a49a7aec9cf1f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8c527bdf0f304a31866f71cdb298511041ecd320"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8d352ea63259e26e1bb61f5a8f78254be4e3e7b1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8d9784f85e9662734e180ca8bec2164425ae8a87"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8dfc4e78007040009f37109f9ca928c31b3ebb49"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8e3f138d163022d6e105ab595788f4cfdd9b9db3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8ea624983d766ed45780378a3eec24eb2faeb229"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8ecf066a6728b30e1153ad875562165db07b0d0a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8eeb8cf054ebd546ca0555ef1cd4ac6a08628917"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8f05b8da748cc04e64b688c4b435fe64699bd481"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8f980dd25f1c77e3536131c2c620aa32e8c13180"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8fd4873d307af2d217f5d2bf02b495ba681fad74"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/8fd758e2603f1e3772cfcd295ff0f951988d7648"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9018925b5e791ae4b3ae9c84b8a4d47d86671c2d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/90a9c3390752b94ca19a58cb2fe6267bc818f718"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/911e2ea20b6c10431e48f70d9933987815926a9d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9125277ed9ec5d59e51f3e1a8d97d25ef88a5d4f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/914464d372dcccf31ed5331293d84121e17616bb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/91916df7c8f04d8c2b6b8f4aeaeee6972ce0de74"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/92cce6dc5c31acd62347b15d89d52ab94b507e0f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/92ea0d3200665e1836ac12bed0837425cb9f43de"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9329b80d0125cc994d7ad36540c7a8265d76983c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/934a41b5027d1c5cca27ebda57560c38cb9e09ea"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9354652806d96b09c8e7082b1b7d22e7c3fb9f0b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9398ac1c2b4015792661266a9c84b6d7a68c3155"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/93ac93b7deabdfb4f86eb37a1e9f6669957d14a6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/94108ac8420347598c7cee743b2a158b1270fb8f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/94cb0b9e26e4a800f3d413f3617111bde2438009"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/954ea72fdbeaf5b46d18c6d5bb77fc1a0f97569d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9552c3f6304af40224b800f3a3a5df3887a530f6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/96e5126447131d3d59cc6547f6b91d3433ce37c8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/970fccda0b34b59ade44d52e1212699b4d2419a8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/97c4b73f72b248b4ebf4bf30892d0db828a85297"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/98c0c0a3c8c05aec3082755a4635e65baecf4752"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/98da5edafac67704810f093b38c86e4c77b75349"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/98dddd3f679af150e9933bd864ae20e20b7aa25a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/99099024a3f3e389f57cb7b697eb34485846f316"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9912de197918ac0e305f0c0107f863823e8ae818"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/998a54dc94ab6e7d6a6066415fb0dd9b52356171"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/999d0995c2f09beda8783eac95d7643a11d5c89a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9a21cda420d50994a8ed56e147f8316b75514db1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9a3f9531b10e8e0874699ce3e35031a35feee5d5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9a43f48d4f6219618f8cc9e876880fe81109ad72"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9a4da2a37a26c114e1226bfbe1cf80ec5ca99a66"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9abf980e8909aeb31936553ca22ccfd8680c4dab"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9ad011d38bed7470e7f60780faf64d8f008b9b04"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9b1355c6e2c43ce83001bbead09a79852e04feef"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9b4d4ce0457f5300d6b4b309762acfdbc41e3965"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9bd059ff0a90e86ada1ba7e5b90ae04637ae9e90"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9c4eac3dd734a74673c76e6b21fd9c18cdfa831c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9d2dd744ba59c1e8ec091e23938e46d1bb5ee519"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9d362d2aaeee243a5b54621d8187c4b16f87c9f5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9d43a08a964c82abba4a47246b1955d9e3609f6e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9d6947df24c9ebcbec72c568d9708d7b1ecae63c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9dfdce1b090a559a14f9a5852f78547413b1d1ed"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9e2ab07030bd35a4c31df32c79aca5e76c1d04f8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9eaf2ad607a943141c29f334b2c66c2e59e99980"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9f0ab521c728be21e93112b2730c52bc1d6c0021"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9f2316ddcea948c947fbbf35ae87b767b8c1dc55"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9f8e14ee5b4a2095f917084b60b5fda33f21d9fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9f9ed47f98b4905f1f6ef2b552a66905bdf79b1b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/9fee3212240d4bccfdab3696dbbc579b06d39982"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a09ef34c93fe0ffc13045f67b7ecec683fb72e98"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a210d629c305b89a34b7ff3c41ae4566cd22186b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a25b31398669b585ccab97bceadc31994de7ead7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a29a547671badd3154789e1a02bdb87332fcd6a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a30fc2605f4e74f7003f902ea4a4c994e3ce9bfd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a33e1b28074a41fc5c2611a67161ae5638a47dd5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a39ac9e92b41d1889096ed415b4c2eb1aba6ed50"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a3cd54d43d3b3bdfcf224d636dc11ce1b5ee4d30"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a4874327383ca168f9d9d59cffe327f61e9a6610"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a4e4a0473ac1f2b8de86efdf00fcb382a343126d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a502dbaf3c842bd86e9ae513e8782eb23c70ad7a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a5592f15d5424ab7e16a18e77027ab91c846d90a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a5c2fdae1a1c0487d00db0eec6e3429b12244b1f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a5cf80b996b2ba8c9580f8ecd22720c48de41044"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a60ae4e21a913e84405814f18555f0c179c24167"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a649093880c2a2f143f861893eaff5d30be95eb7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a6603e797695274d10bce000f66ca0a715f7d8c0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a6d4b6043d86c376e9b166d5ca395f3e099ae229"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a6f0d1ed80393ec0a884718b44fe2dc9f852d38a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a706f2067bfbda7837eaad68972d60547e2957c3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a814c5743d492b96d2b402f9e819bf8406262224"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a8249ebfe91327806446f14a6b2e7d9c8440257f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a8e306820fb76566b522c23ec68bdce0ad0536f2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a8e67676784506d2e6eab3a0dfa25e53a80b40a0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a97dbb159ef9bc6e39c9c25e04315752e871e739"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/a9d71e1ff2912d8874e38fc61cbd9a8ef28af4a9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/aa878edb0100e876e00e310ae221b220fdb5e028"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/aaada46c7f3bff58c2dd6f4a8394135ed5f253ee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ab27fb527771c7d86f74afb6864e95402328ec0e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ab8d6e1ecbd80c6223b8623a386c61023502a57c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ab90bebd4c017827a6d5de61511445df81169eb6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/abd52da5882855a63632a6917df3639538928cd3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ac38a6572f8420b4df37d9e39088d1905fced71d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ac727124e46a249419f088c8665324a11b357b84"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/adb9bf315315338bcad85929917b9def2aa098cb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ade2d2f0e120a9527487e9b92458ee6844800e4e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ae448bfe17f9a3a6eff074d4caa9f7261c94d2d5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ae8c538d4ad7f2996ac724bad7a075e1aea32556"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ae8cdc02275a1436bc131bee52a17ee797e2e6c9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/aef36c49d7dec0dcf8cdc224d9e9221fa2cb1db0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/af8b24ffaecdfaf96c0cd7c76f31dc9e1b4d0935"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/afcce9e02e0696a2af073855a386f589cc12c94d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b00a32e8bfb75e75f31410dfe3592da6248275c6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b09f98e13e5b67a4dd7f74eff00bb247b9967844"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b0af44b49dd7c2b2e02ed4fbc7658975338e352d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b10353c265bef989d8909055fd6cd52e49eef3e6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b24a0dd1bc0bfabb832f0d1c8410c018c4ddaf4e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b24c25c6d4b57a5f3d64a0adb205bf4f150c9138"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b26a3a83d0b319ce13a9ae164e90fa6da1b05a57"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b283eb8884c98dd50523995ce221aa1ecb3ca182"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b2a79b262ee3966c5ce7c7b42dcffd55d7d0956b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b2aa4861b5104e8bb8bb173f4b023a2172a7b9a2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b306bbbf43b343ce3ea91f3ecf08501411c57e9d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b3376cb338d9ff88fdef2f8670a09e973f28f6c6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b33eb7e1bde4c69671dbbf9489b4d4b87c5d23fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b387e46c23912785e6c353ab49b8ea4a92c2c2e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b39bfaf6a3072d8a50984dcc54967e9246f8d3e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b3cfcd55b0331ab0c931b8c61d4df41464587f10"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b3f33b78433af7f607bc99b569b0cef95a1a6ca0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b46e762671a5e28c7061da3baee6fc41dcc0122b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b6d86bedf3cf19441114e463458a454709e627b4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b755933ad6e318ee9e0c430ff69be7a515d44def"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b758f5c019696f33c50895168219c0e6cb04e11d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b7b664a39372dd6142b8ef7906857e4ab3f1fc84"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b7c31bb5f6acc65b88e31400dcae71f7be392c86"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/b93fd0a15287dd035eac86e547e3ce42183bdb28"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ba25be123c630bd3e4aeb9bda6304dd1a7e51365"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ba3566735888b53712c6b2e6d52ff5f2197afd6a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ba942f8fb244b60561a067129c242c4bc4fdd5e1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/baa28a5baedb645f4430940a4b4b1142f4b03e0f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/baf7839388e10ff0c410a58797482cb83693b309"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/bbc03bf6274a79528d43e200e8f1aaa770a155d6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/bc9e17fed43c5d0668a87e8d6354c344c5b4d00b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/bcc7340f8876a7dff381ca676efc39d30eed9f48"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/bd0bef14e73aa1073eb5acb6e4cc901c976335f5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/bd275178fd473028a5cedf7d5780b27e809882ee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/be1208404991b11ef9e246d2f3537ffd65a57824"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/be3237e72b3d8d56eec0520145dd7d1a5064eede"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/be8cc5bab95e0ea7af538ca11175d710da6207d9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/be988fc0c00a8422020dea3dc72451b09e25e1ad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/beabbe93f1e9b2e56f729af30559ec03a00f53fa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c0deaead93c9b3f2fc211fb7f0711ac192715a40"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c24143cf5f6f77f002e0ab82e3060906e2e7d062"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c2f666569d0c6fbec701fc6772433afa22a1dad0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c3afa705dab02fea4d892134e7c01c3af270cb6e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c3de41124a14ea562360aabc9e12666851bff2fe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c4c53b4727e9e1f040c5d7870639dd3daa184ddb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c4e60ae7c05b12a90dd7c43fbc85ae4be7540f18"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c5d0c169d326d79fc4ee8521b282dbcbf33c1d5c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c5dc5f5ba9c2a2af7e91e200a8e82ea2c44f3a56"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c5dfb4a82f91d07041d4b0ca6cc34cfa1e9c7199"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c685689a9d5b259afe237d857b7c6551dc95c176"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c77087b4651f4c62a780d77a3b4c233490244e8a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c77ee0b6cb21ab7b7cf222c7f6563b3b1b1b6eed"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c784ad2e205ba49b5bb1302746723dbc57320981"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c7b17d6ae5f3b155532a5a9bf0239c098c35eec1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c84da54dacf04445b50448a70fb0ecdd08e9234a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c8b79e05649da58817a10ee6160a00d80b4a217c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c8cb20176e427d2e108187924f570ef1df6d440c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c916ea9c6901c1e77af764773bd2843baa2ebdc6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c97ebf43d8a5ce5cdb8e93a5d0362239c284ab4d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c9b92995f282262c51aa7106608eee6cade3245b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/c9e2cf8be8a4dc2294020026c62840ef1fb4853b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ca0db313bf949ba3f87a5254646a7a7dc8a7f89d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/caaf9a7751c0eccc34f0fc00a048012ab5ed2f37"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cae3827ca308a477c16852cf8a435881a4058719"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cb49955601d171fd14c9ac21137b221392c7dab1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cbaabef34763f2fd922e67ff5f2ea283347e9823"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cbe59c62c6d36c7307c438159327e320cd2fcf57"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cc4197d2381a75b674fe4944b8c690fe69a0b3b1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ccc36ee2c6a0daad65a4d929599fda5cd38b8fd1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cceb4c620c02337138e489383db0d4f4e2c7a722"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cd4be18b1ae872c40580edc4fe8cbdf1fe2a3881"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cd76ed6aff7e074b0cfdcc6305ec4e453d8304bb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cdb000a2d87e073efc9491c59707289f6bc18fd9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cdd1a4e358ee2396ece54b32c1f0a8d0a2e3f3dc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ce1c326f3b0147841550ce3b5126390764bae8e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ce990633c0f2b2a2ddb66144ed942d4bc9bcd8fb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ceb297908903ba0fc24982ad4e6010e79dfbdd5e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cedd54df6d34491dbf7843c2621d6818418aca02"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cf75632ee185df2cbbbe148e2e1ad5410f11d361"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cf922d44bf08d223d3ebcd37a7e77d3e43555d08"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/cfa40fccc5ea4304e83ca26f4e567765c2c08627"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/clusterfuzz-testcase-minimized-grpc_client_fuzzer-5765697914404864"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-12b69708d452b3cefe2da4a708a1030a661d37fc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-133500314833c9037b34a4c34ad779dd78a0fa8d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-14ed70cd9ea7987cdd0c8f6e39398ee7c60ee2ff"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-17d5b79ce495f7d3f2e33d95588457281a5e8965"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-3bd02c98286bfa7be8e13c5500ddb587bba74fbb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-3e52af52deb0ed5d6ef06487d7e475e8fb616972"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-53e93a1906d8442d058500e7107929cdd3e84ff8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-570c79624a2e4d36be107745d2b25e74464553af"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-8e546795782dffa5d5f5e94c9510aac178fcee39"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-d5af12c391b7bf0ce63ee3dc656ee4410fe496eb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-d92bb454bbbd415175df541661e3696453ce3e43"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-e470e9fd09a5c9ef303813a40361c897650289fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/crash-ff53a3d713e83ae945b8dd1782e21f5b51aa649a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d10f52ffae7857c5989e16960942179856f308f6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d17e9507af1855fcf9eca78e2d25c8fb2c40a34c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d194592e6f471dd487ca2625e6c3da7802ea372f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d1b1863b478e1ea71eafac9e03256080c8f0d1c5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d1cabc19ce0f9fbe365d96db68eda9f86e005eef"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d21ca2b01baa21a666257d1a1e0275587eeb565d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d24d1b9d754391fd0b11b0456a2e8c6050cadee6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d250e525e8ff2ae4a9bddb2e478a90a1242155f0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d257c41db22b60cd937de16b9d90a44b9fa8e426"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d2b5fa141432c1894be8b8242c27c248fd55cddd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d2df8e95436cf98ef2189191a75a3d9c78b1be6c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d2f71a800612876010558ce804c9a72ad0a1b9fc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d3141a71cdaa7a0915c8c55abf2c940b0fd00172"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d3386702918881101368cdba2c4967e86ff3a7b9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d363f288f48fba8fde401978b7e764295735645e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d36e015b1e14ecb9559d67bb09c2851699f0aa35"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d3d7a110638c6814e7bc8b388d25891349de14e4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d46c3dcede830286dd9f4a1ba02a20a0b1430664"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d49450b97f489f0dea74a9f83c71abeba1066d3c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d4a72650e8218ec551fef6560ddd136d52828a4e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d4a744ef6dcef5cf08d5289e167b26270d39e9f2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d5a85ad91cfde27a96960b2e783d2ee43c50dcb9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d60440ebffe00597bedf89a47b7cac3346823a20"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d60469c0b5b385f20d55aa5cca55bc2c801f3b95"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d637cc9387087de633b9db535d19f64795c43be1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d70b2046ee62676b525490b70812c2157e5a3585"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d727b7edb460c549d7b12b90f581048c9f4747e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d86820c738718311fc75191b5a35cbe7029aaf18"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d88bb0b7ff687af84f33e6af22d3516fcdac5534"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d89026894e6c5f8b5c88dec12950f56c4b6924ba"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d895ece988ad4712b87de8aa9bc273eee315e8b8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d90c312791129dee8c5f85cb3308323d0c39b70d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/d91281daad9b821294db204dfc244b2d0d5496e4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/da2ec14db88e6f93bb19ba2f0a7306408de37cf9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/da322a6b88da87babb52d1527fe54cb4ac214b32"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/da424090e1b94c5d0e91e26f3f3dd6c4af18fcd5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/da4d300d0a8e6f803ec053e3e7689c4b91eaef90"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/da538941f1613c627523cb1be71eb220d1ca2579"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/da8d4c7f02dbeaa543c159b3a4e527059978a429"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/daa680dc94232de7a6949ca6610eddcdbf13152c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/data_frame.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/db3a30a6d8e605dd587e51b214c42f68bc43cf19"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/dbe415d09cd20abd88c858b8c9b2a9e552fbd8d8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/dc45008d5a94beeb4aba87c4b26ac6f87df1490e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/dc4a248fa4c903ce3a571dd18aea575019445740"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/dc7ebba06558484af10b5aafd01ec4fd59276b12"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/dc815fd6d5e817898238481472f359bc50b510c4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/dcb06a6e34cbed15515e5b3581ca666f704777bd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/dccd1fd6d3394f5f68c87950ed7356a2e9ef0f6f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/dd5ac34f5b220970447b2733848de78570c47883"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/dd662353bad317cee7d16191a39e094bfa4898f2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ddb283529bf32a85a79a57ac2f2f2d5f18631d92"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/de06dde2c760a56f63bafe6ff102663bf2d9339b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/de9b9a35e1e7040e842b597b8d2fe4cd602e67f1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/df20bbbb854cb997a73285ef30d227aa12d90e4e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/df684493457bc8d87dec2ca0825f7b43978fecfd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e0375839ce86fa191b85662247d9b0598ec35a5d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e0aa94f5a63cea106ff86739ff2bd85115fd3df0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e0d1ee5e2e169dcae87f790f5c27e84a3453cedb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e13b774309bbdec8e9d3b1d3f6dbf7d6851e30ac"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e18cab69ad5cc17c88f8b56ca9929ca8af3eed30"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e1bd70aa5c802cd4462ff4833c09ed432ce4c9fa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e1f2e203d39ab2509d4a67f7a44265b1e6364334"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e262f378a3d27bc519d472ce3650bdffcd48a055"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e309e21c69e4b96ab37f675f4e87a52453512ef8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e30c4ef6423bd4d872792fbd6954ff8e47d31a97"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e3422e8f5d63a9ef180aab552353955c7aba90b0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e3d12a2385b75443fe38d989e77c252e1f3cdb6d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e40b0fa5d814be8f2081ca2c8e0a4090d4893831"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e442f9fd63bc5345de1c14803d4ca4bb6f1152cf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e4c0e27cfd3690b8255a8214d6dd055385d1d24e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e4dc0a111e77dc495c5db07df5e2917adb674697"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e4f55281c481484bd9edc28fd10df0c2e0f7d546"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e5319a8570a762bbdd67135b49579097324e369a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e5a7c086208248a15ee6fa5195fc4ce22469de15"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e5ac3394971400b6636d029aec7ec665a94ecf29"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e5e276acd665ccb47f868fe3bc36e647bbb840bd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e61f728210ce72ed8b2c066bd1b1ecf9e6824b77"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e6a08259a7d47601eab5c0249cb6547024e002c7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e6b3c920b47e00055226d49b9f715c5d4353e3e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e6c52f2f31db7595d1ecde2939a7390777f15182"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e6f5cc0702a5f38b9e7339849e1dd2e4001e547d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e7c26599fb2e2b031346ff1ba09294fd758f7abe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e8323c817d18f0c920d3cf53be41a9bc0fd64b76"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e969affd8af10a1b87dc63afd3b29cce3e58fbb2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/e9f7f7f258c72222397a960652c01d2a37e2afe3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ea46b684f1e67a27c231f2d536c41da631189b9c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/eb591d069d89f44150c17082e83c48c66c8e7fe3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/eb969b9ab1b0d6b5d197795223ba7a091ebd8460"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ebb0786acc21c6185356eae9a62490a03fddd1f2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ec180175f0edea0a6c3eea2ae719b006bc029ff8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ed6358fbe6721c9ac01a6f4cab4d2df377eb1f11"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/edee7f771a04e8ced659e7a5ddd6139e75055a7f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ee436743977b8e31feec22a91b1ce23dee96665e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ef1984d6146670122c7a7246374bca460e7284e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ef2ae7dd190fdf0bd4cc2ae53c5cf1ea7db877fc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/efdf3f43fb29720dde23c3335cce7be48b761fb7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/eff9ad9144a2953fadc019fe72eb1cc3447c33fb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/empty"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/error_refcount"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f03120d1a8376638e071735bf4746454b6ede389"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f09410ab7bc19ee1ff206f94e8eec2931faef15f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f09cd3e3a16658174717668e51e7382e491df1da"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f11abb090bae8cdac1f7d9a2e344f2def0e50066"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f1a5f3011be9748fb83e392e334e46c629a04379"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f1b9b6803e41beabb1a762d511fc148116e09e78"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f24f925945aaf5e8b5ee470935e5aa7f847e7a72"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f2a6bb4e0137541e2b140b976764377d07d822d6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f391771de2dfbf761a3eb70af7aa5f0af4446116"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f41f9319bda14ef21b925c46945b30728503dfaf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f4499e3d4bf60ae3ae929c485a13ea4dc2713369"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f4ae2a2b692bfa83cdde75d007813426e14daef7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f4da422d640232e22f2613ebdacff33cecd61aea"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f5a629c8fd5720236b66a875e96ea22e29c45965"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f5b1eab444efb2664a295d4e6d087eb209c0c480"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f6627c55881fe4f0c8e6999980fb226836e6f5ce"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f66305230042fa83fcd1b98c469d90ffef3ff6da"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f69aa5666fd60c1b6814198f12d049abb0e9f148"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f6af3f46aacee395877d7f7909f8e412a6538efb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f74143e8160754e40eb4d21a182c970210707979"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f7812b2aca4d12ffbdac67bcacc41b34524de6cb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f7aeceaf0b6d971038a677994b5d080fa0e18011"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f803c87a92662898e2c8c847787b56d2c31f63b3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f81814b5f0191729c62ee5717775e1bb532efe7e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f8467d9574de94b9bb904f75a6a7e2405c36f105"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f84f5d6188cf099465f0b70337b87ad8aa8efb78"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f8981798dab237ea34051d18b5e903f2300a0653"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f89ad475ff51a5a9fe18603df833453bed320f36"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f8fb1348ec3ceeb75c2a03df6a2ead0de6f4127a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f91f76fa45a23adfed48a10ec9512cf16bfb6636"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f9583b3a39c1aecbba6e81d71e7fe9b9519c8b08"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f96843fdf2d6fdd661c26201d96ae7bec72c6c3d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f9940356ee9b212849fbdf0d818b17af1a4f3c6c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/f9c875c00b7327df5bf21c3e051b55b0d2ed3cc8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/fb340fff42a4d7ebf6b82adb9345655ffeeb05d9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/fc3ef8b3cb43e4d2721b252e7fb578d83ed6605f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/fcc557c9844892675be823fac8788eb694a3a118"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/fcefef90833e6ba74d3e74756105e1f32d985162"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/fda07f0de15cac77ccc54ec221d81cdade189bfd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/fdb553b8d82e68270a7345b048772bf8367b1224"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/fe1390762579b5c335bbdea73e251b95b979c3c9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/fea99272cd661a5fde2707e350d67a683a7c21a2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/fecccfc70b1cf1a524b9f28a9ba2c153c8e14d0e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/fef80aa34c31700ac8e53bede4a97131176ceef0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/ffd52d31f9c59a346aa195a683f077dda5ecef6b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/hdr_frame.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/server_hanging_response_1_header"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/server_hanging_response_2_header2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/settings_frame_1.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-2b505c78b53599040622864c18644b32c345884f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-53cf4d25741d5f6e7ad9147b286ff0b40cb500a9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-82794c7583f365eece6a10ce776d59874490a2e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-96939ec880829d76392ba9de2c6ac5b3ff78d20a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-bf008b5bfe748d33669c905f9b84be60856e57c8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-d446c0fd59ce5bd844a954f0c4f7e40a891135d9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-ff38df2c9451c2fd00fd746c53adef87a495da9d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-6b847dcc217d2c51134ddf8939e3fe5153153ba5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-76a0fb5e7896bbc694a45e713f9729248455aec5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-e4cc5c1a9ab8c5f3f7ae3ca97e395beb682d65b0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "client_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "client_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0141fcddc9807ee093313b2256f1306fbbdc6cda"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0255050a9ccb25f46d6c1bf6a5a8a4c0c7635599"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0320a995a8c76c64c8a0e0297f632b76d9bc92d6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/042091aeac4cc255506b96fa11c7354e699fde76"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/051268ade45dbed0aab896d7d9f4d10ba89d3b09"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0696e7bf7837d98de01c915d3c9d80e5d21b30d2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/06995c2f3f01c7ec50547415dc324c64030b7a3e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/06f7ce769fe07804fc842462d4be8c1aa2ba82c2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0781b055c85ab8fbd0a3d0080a32e394af8761c4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/080e1f19e6061c5bcac31add2095f87f6ce46129"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0828169ba82152a8907f1001e3d98804397d4610"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/08ffc4a4160e9fe6f322c28870a89a41fd9c37d7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/090a7a758898a6e7c9108b7e8a1cb9cda383e707"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0940663729501b750a18542e1041cc26385c6148"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0a10bd140c6c5fb109a0816ca061739688a6db9a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0a4d3fda02cdcb7adad1daa80d65780c9c8d1464"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0ad812832efa33e086874fbf3496664d3f1b4dbe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0c9996d4fef87bacd7a001e99a515b3ba3d5788f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0d6210208831fe55951af56cdeee3d54a91a5361"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0d784965b2262df7ed7a1eb57b92a718cc76bde8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0dc9e41eedf35ccedf4e2b0d230ead7c4d72fdb2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0dd470c8939ed535de6b36f7b7bfb68aeace493e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0e61e471fa6d3405daef4276ee00cf5fc189f378"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/0e9196f951874edbb5ed098739ea5c8b6c0751c2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/11442d93a554b9e7f9ab02782bbf9443bf6e1ddc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/11833b795d04eda5a3af56ef7b3c3a26a8ee3444"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/141272316382b0f3e9ec841c735b84e7aa517c3e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/15ae43369798e48c396dfe7d53a21878b96e66c8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/166bf1843c229d34a2880d234dd166c27bdc11fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/179e8ac763b4051a953a38b6b3b1f1e1f6cc6c9e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/17faf0ba8a491a835d35977a9007b90ab7d30d2a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/188f6cf2470e95b228341de305ef839b27f01a5c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/1ab3e52adace335d02e2b5130eb4f7c918add7fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/1b5150514364e2c17f5a4edac1b7af99b936f55a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/1e8befb98cbaba059d6771abd1680e19484e7723"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/1e9b962969c359bc2ff766704c8ca8e25f5eccfc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/1f80af104acf41b912bf4a48fb938267e3718719"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/1fcc4afd6f48e83d61ea74970df3ca9dcd8ec291"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/213a734ccdb813b18ad9f2dd99b7f9967ee1460b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/2151945f43991c27e123c45dc72b93752a47e65f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/21545d998c27a5a1572a89a552937752432b1c14"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/23c7443fa1ab713e7c34ec50222b1b8cceaedc65"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/2445bb2c6779712dc9e14c01fecb7103f8732858"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/244b0a20500e31d3c538418800db816b07f4d210"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/2461b9fa6b5bc4b6424dec5b9a18d4ec7c309112"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/24ec2f3e17d3850564788f3fed17a5c586c44658"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/2537b8d6b902b8dfc6e17f194cf7d05ddecf74cf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/253ad01acea4b7038edc3f2a8c4a0c0f5c4dcd05"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/256d0bbdbed22f5867a6f503bf082011e61ee12b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/26f0e88adbd8f8cdf778131a35b33ecf8711fa49"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/2e5dd8fb9d2a31fad9d681eda697d085b647b57c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/2fdfd2abf30c636ec8c841f1ac26594e25664f0f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/311dac5092e36134d3490f98aa4207425e0ee941"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/320fe6224a5b691c0425e34b6b14e8c6fe9f9620"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3255f1c7441a7150dc3c33022bfbe8c956c7b7b1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/33bc9db104eb72891fb096f34cbac191b3f9918d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/342ff1db70a7616b4ef76c03a42802c6702c18cb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/344c011df992ccfc0ec682c14a1cb2d7959998c7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/35775efb9d0d68fa07987b9a84934389b528e436"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3650168db6fe115fb1e73eed4b76cd224d977d01"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/38228bf98cdb50fd3fa830ba5a9d4c7399063dff"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/38717bee901151b22a10beb12c6623ccc844d3c2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3a4bb427a85bdc5bf66ac71db073c99e0dc9f881"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3ab48621d9b8f075369099a8ec7517bd23fd6e70"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3aec8d9311130dfbb6584fe6e619579c21992b5f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3b14837f22905dcb04f93aed2aa69bf95924fb9d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3be63c163805927e04fd7f84d96122c48240e601"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3bf2e349747c0f539181e0d4084a5fe506811a9e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3c5af4d73e94d0e8ad5666b6acb340f929031e95"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3d2b25346a9671d83bd082d170a45eed739bae6b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3de7b860c3fba2bc55707fd6875dce276f2f249b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3e2004ff9f40e398e0f41138a25a8b66e3d843d9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/3f8983e457033cc85997c356935ba9c21460e86b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/4105669086d83a20f8d991088553ba08202478cd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/4180619316eef7912d1cf52ffe85897242e1ae88"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/420291d7139d9246de747739fd98102434a742dd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/4256437fc5897c0cd5d755816e4e68c7be326849"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/42b25a5413c536478a3e63da5adef4250babf2f4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/42bef44ae751a45c671d9da5b1231d2ac747a48d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/438c3c9045c3cf7910aceec34f77b47a70ca4abd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/43af96b4f65ed0ace7236427f2f8833c4835989e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/44c6119bb91a452d6128ce0ea0d62938800779ea"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/46d595331689ae01d77aff387747a98ff3480096"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/471a307b81dc37459087d41532741c5c9d7ba836"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/48900b4a5557530922ce45c15ad0d3b0a337520d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/48bcce2c6487b18706ef0c609ca39c456215bac8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/49027bbd3f3f3cafa315843c8fe8280f86985273"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/499376c5e291da2f9c25999abf4960fab5a92ec8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/4a3b7ce0cdf217963a0b692769e5d6f4befe73b8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/4a3fdb96bc8c80f1992f0f72f963f84856cbade8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/4aae80e05793d7adb42a7e6e8a5283b677318777"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/4c7a034d3a3b4f29d99caf021a0e9bbb89706c2e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/4ce8a43fb17a075627160812ad26c25210d8a82d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/5032a75a98cd14d4dab75c1c5e2cd981abb19dcf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/50b3f4b6aed97f442496d27f3b4315a18ba76d5f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/51064b88a98658d48a0da7f1545c2d1293ad9538"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/51752f12d59fadaaa0dc72e6370612b84ee1555b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/51eff6fcbfe1a51ceb3f5f2140c01eea89b4313d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/51f65f681cf3a1218d83ad58642c06deaea86210"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/521809903d36db80b1ccd707f354361f2bf05075"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/5278e3581c069624157fd9176eddf52c0e58df67"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/52fe8f0e1fa270ea16f66c93f2ffab265ce059e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/53de87ae94acdc8e58a369459c12a3240f1294fe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/54a2b3993c3483745f6314c870a038a8e58f97a7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/55d60c2e5040a38be8ca41de63e137e3fef892a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/5653c44a5b520bdf2bdc599b7966f1d7c44950b3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/5838b5a683229ebb6e6277e2810863e642b8afc2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/588d225784891ac88e30ac6eb5651d63fac34083"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/58d51c21a20b6549567a0ab8fee29d162dd3fc5a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/58f1036d8ff855841ec25b3c33e85a8fec0d94b7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/5a99df42fb7bbafa2d55714ee235b1c46776b2ad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/5b42793550699b2c015bed677cfcddc052f73513"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/5b8ca72ba00231c38b19f582127e6a146eba4282"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/5baa13dc95da05e7ba02bbe9583ea24517a29a1a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/5bab61eb53176449e25c2c82f172b82cb13ffb9d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/5c6f6b6f7f3e7b435f060abb73c20d2b773a7f56"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/5c9fd9cc7100feaeead1e0e45201945a6e76fd85"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/5ff49c9edc7361797a951585f3e180222c8dd95d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/6129954942e26c2a9ec071b6659675745613cf3c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/61fa69b6b51b0ed91914fe48779173f8d26a1d54"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/6362ac61cfb6e964aff78f3cd648475dfd5fd4e9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/644deba51c79b6ebd470bd4367452941045d112a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/64beae98e2276749b133e6368c9e0f19a79eba96"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/64d7add9192301fd878854dc96f9fa9053f03992"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/65566df65e8f55428b6672cc351df414fa8f936c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/65bb703af35d5afb824cd68c41d7a1aeb3848d35"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/66c537bf59cb3667c037b3517be3d31245c9da8a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/66f576baeb0c9435a56eb7375dadc5b5d630ed87"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/67b4cec5183659aeae0f5bc71b3adf0542a11828"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/68c94721eda2f62481bff9f1d183df70498d0c5b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/68ee8169a65d58edb9fc1c752ea81dfec383203c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/6b203d49bbba6ee74def0d35c2266e06ad3c45d9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/6d580f28d785c0bf87ac351a31a89289449feadb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/6f231dec759eb2105e09263d53e171de19a92c74"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/70ff6621a09e4f641538cb1b27e8b382b2f56a94"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/71981b55f27a1eb6274eda247048fa2c597f5004"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/71c2b0bebf7f0e916e4ab7eb36d47ccca2b9101c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/74610e278a5b90aa12ce1beaf222c4306b02ed43"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/748ee9817eba56ec9938601a0e380c74bad4563f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/7727e3eeb2a48c46bf5a678c300ff8a38b8ffe3a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/78176d80c1d74c4b1b820d386ae483ac4d1d92b7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/789abb571563a6795220046f76b7cf0ade90743c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/78f5ff40e5554aa9c31b45f79a7ae9699f93e7fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/7a28fc2e9c72d51d29e87eed63ed405c9779b5e1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/7a42083be21dce7f96edef1f3b3b2fea0bcaeb3f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/7a51275b11ecb1efec9251390531681c8d6f2481"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/7b9682cd7a3984698f6eac034c59c0f91b4fb83d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/7ba7239a29d6183960e3986abc8f19cfb548b905"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/7d3b3d5f23d0ede9f7e5dbd1115db58c8a54a213"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/7ff3b6239b04479a9caf67f45b2d0c619f712815"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8035c81c95dedfc27c3649064f98f49e3e72c21f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/804e1052842ce4d44b9c775ade2b18fcb8ce7bcf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/80514b85933ea9bdd3462595f949c5af24409b87"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8057c32b8bd28a5ec2105d62f2abe8cf69c9f5fc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/806a3bd4e078d91adeacedfd3e47ef8ae229244a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8090444f98218e65ff9594789ff22bbea3c0497c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/80e516692955d5f224706f268e247858858e16d8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/810a1372fa97380265f5529c5043ae96f007f5bb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8127597d3c146b2a89579e44daef9d03a0f941ec"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/82ed571f8922caa572d13b4cc9b5c5fabafaade9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8328e86178800f87a3bf6f80749984f45b0cd0e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/84441efd7d8bdb0ce2fac28f218d3d5d4d77f1d4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/84cbf70f45a64d5a01d1c96367b6d6160134f1ad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/85eb0f4502a51e646dab4ae08eabd90613cdf8e1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/86080f33e4eae21b37863c253ce61eaa13021a97"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/862e3ccf601ee0f7fbd8b23e6811fd50485a118f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/86bae059b18af8ae263e5ae0022b67da0cfc0fbe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/870f9cc4bd89c6c04c6a51ceae1efa8634627cd6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8762a523cdb78d2344d553fa52a229bd63c44e51"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/894211571f9153c3c2ea4102541dac69be8aaa9c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/894e9b7832c52acb04bfa994ef53c7105d8db206"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8b0e12978b8e2eecf62346e438e47d0993845693"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8b3fa0bd4f289eff6a04a5205e04baaeafbdf637"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8d1deedd1e463f8c95129a6f839c380a7c83ab04"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8d1e029bd72381e382c87e61b4c5a9741d80d644"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8dd1983889b6632228d4897c365a1e6124d101e1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8dfc2183691385432f92957cff0b2538e5a0ebfa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8eb9b86b4f0aa79b8ef84b44e1fb03094e7bb426"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8ec540c36da3814e93da765bf2ff0825b59c1bd0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8f1bec32f4b8e64062f5405a096543e61d771076"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8f3e48c49d0794909f6e8e61e5a4312edf484c33"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/8fbbf3c0eaa25b64d0a97a8ee08006539e649199"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/907d0021d42d0fdc867fd02d3609cdce13c8a055"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/919511c217a3427c22cad4a71aae31a6cd47b193"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/9267c81c3283da8193c198de05e05fa30631a453"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/92e80997a4237d76f10b70dae2870b7255c97435"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/935322db76f5d4c74c2dc68fc4631915b8e24323"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/939f2627ef6263d0176566de267ff3eb910e6a60"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/94adea6a0d9a44bee6f5e88adcee57be9e9e3597"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/94dcbe0d3352bd9b230096b8dce9c6d8d63f9d51"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/95dad738f60e3e5eb0f1cdafd91ad461f4418e8f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/960c0a21c9e5c1a61b93b34da3189b0de1c264df"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/96903512b1f1dec08206123f024b62d0e31cd4dc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/96a89c005e8d9992e34cc149b0be096ad0051446"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/97db8a66dd513eea47a5a25115508f4e59984854"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/98f2cb84ad89550cf56ee54e11f1448ae7287247"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/993497422a59b7f9f0f6db8c867339b5c9e4c978"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/999821e3750a7f2c9db663d2d100b4404c225040"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/99b2ed83be40cab431d1940e8de2dc3ebfe9352f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/99e888b7372b29256dbefd476855ff73584cc00f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/9b18087deb3cfafa1b964aa65d8ee980bc61404e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/9b3c745ea3e313909a228a07b49aae110b02ae4a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/9be1ce0ba77758928ff5e9c45139b1624cbe9c2d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/9c703141efd69eb8f32a58133c8035fb585e0f4c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/9c7f77981677499f0426a0ffb5cb79d5fe55dcb2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/9ca59e6cadaa5be9af30dfe5620d1bcd70f442e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/9d139835d91474e8d8361d65698a31b8b38c4f7b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/9e2179564a99e96e179c96f28802a0a2759b581c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/9e56bb3b68d2e2617cb2d2f0f3941f7fc832e462"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/9f318b2c2ff9cf4615bd06ba13bdd086b4ad08c6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/9f8d90b1480989fc46ea2f1c66cf687638994587"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/a09db5715f0bc3879a0e18e4db5a6b5640b254a3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/a0c59a090818bca29d76ccf9843f7e2faf330ddf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/a1cf10478e5e01a0d951c743a3dd45aa5fc409f2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/a22c0f03f8c005a4612a9dcbcd6a643334c35d2f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/a3154b8ed26b3461f2b091c732da00b63ce8bed3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/a84a1ed1a24e753a27adfd3ba806f06fc44f899f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/a871e7ce66afd4f57702cd1299de06cd08995561"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/a8dc736ea964586b7dcbf2bc065ec4675d1daba3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/a91a835836c72217824f0b63491d9b623130502a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ab97c1f6033dc7d96f69b9e1461fd594c16f4ebf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ac8a8c23acd8c290a11dc7828f7f397957fa6400"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ac94b2788f5252f9e2e8502c7c75e04bef4c0b76"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ad03b4f58470c43db6593a35be48989486d754f9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/af417c83e831a96fda1bdde99a1af6509ef2df3d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/affd292cd2ce3306b4651cc7ec0ec0524cbbae3d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/b0587e6e319f4b56d877e7ed46bc7da9b1e7249c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/b166aa66b5b3ad178bc38aee5768226c8adc082f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/b1ade0571262c6e5f1d72f6d25ebb513d2055bc9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/b244c690157ff21d073940ef8c77d1898f37cf8e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/b523091ee4f17d20f51f9b5cf82293465cf61780"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/b7d4d49ac2c530eb8444a449feb689ee50fd210d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/b855c161121bfa29c6fb22d3c0236fae4af6984e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/bc4263a92952d56168b354f723eaa43a33cd0b35"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/bcaa71abf23b2e5130e0cc464755fe769bf4aaa7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/bcf4684ce097faa7e9d99b6e93cc2de24f57aee3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/bdca6504d2ee7925f62e176355bb481344772075"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/beb208fd8675ba7de2ecb12998d2d628d579ca7c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/bf0c98689ab81fc32787023300caf9a4175583dc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/bf479e97b39b697e715663de6a1e78dd58d64122"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/bf826c96be94d1b42eea0666f7239cc5f699a375"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c17650d19ae4a48abb36739c83d8979453f5705f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c1e5307d88feda2c3b15fc221cba92bcf41622bf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c249f408c552a0408eab3fe1d1cbeca95cd537c1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c26b460aebc9082c519539069f7e060042989696"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c2eae71daad0d3561ab4d09b8b85372b8d790bc1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c37fda8d02e99132a1de99f959596c784ab8a53c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c4836760377a7091fb20f4afa9c712875792b9a7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c48caad597176404f776d532d4baf9faf7655ee2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c4eff0f59986fc5ab09d5bd95f394292f2882659"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c5fc2086d167c8c3a7d9ec778db69c5fa14a59fe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c600877ce547166eb1b9d83afbe128d98767f8a3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c6a98fdaf6de78e59e1a149a43f3e42222d650b7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c8d22f7fb4f37f2d8cc7953fa2d599d38d899aec"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c90951c19b24bac84296e3ec32cdeafe99e99cfb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/c95ff2a172626efb50e94aa6781feba609820076"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ca6c557afb9c571de62e9b65ca6469a6133760da"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/cb2d0fb23f66c968af2e80d59f71d4c1aed96fbd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/cc60a642cc2037ad3c459a57381b8f65d8d7aa35"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ccd3b8aa26c52f6d9c607c26ebdf621142aff745"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ccdfd1354997eb117bd76b75440a7e4ff20bf564"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/cd7a7b8f08c189e95ae3e2ea44b9015000e823f3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ce05678d812a5f8ae8e115938410116ce9169456"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ce6b642b81373f05baa2a6fe6e9d5d1387046285"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/cf84d06e4dddb997a79a41f9b6122bf620bbdb4b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/cfbcc3e8cd65aa8b654688145ade34b8789468a6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/clusterfuzz-testcase-5298216461402112"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/clusterfuzz-testcase-minimized-4857057310146560"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/crash-5ac3e1ea7764cfb6383629574262f82dc7b3cada"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/d000502f32ca5620d7745f39ff6be3b547e26a6d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/d131f83ee73450ff45565d0c638be7d8beeb30d9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/d1c7ae01a81a122c2fd7c5d8debcae7566e9ee2f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/d2817b89d7aaa7fa880c077b1a67168ec2f4f0f7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/d3ccd7039dd34baef465c4b78baa7a30312a8f07"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/d4cfaf3b59b22b654d7af80ee6715ce5015bfdc0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/d5670827c8e8d4c95ac0f738c0790c19916c0336"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/d59d7e94863f1ed89cacfbaabf7bc59946036c8f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/d6d8b478e6d13945f7a6f7d27f424ff57ca12f7f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/d76d0c7f24ae3cc3f530d5306b8dcc15290c7ff2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/d8b15e9e555ad9900ba4be8cc9f87bef75725b24"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/d9748abd540810c2449c3dd39a0ebb62754e520f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/da9fc821f0c1e00728b139b36269bc3d21c0a8cc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/dcd1bd94ad97b4e67fd7e12ff1bf7c039eb17f66"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/dd3ba9b139e13324fc76cd62af84b00ca8b87205"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/de0a9dce0ea4e4bfdcb13f788ae728bf979fed25"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/deb6f9a930d9b31586ede19fd8fd3caae0e5b1f2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/dee95e0280b70681eddfb68e3b418126c5661e18"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/df01203edfa2dfe9e108ddde786ae48235624fef"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/df0adbe2523508e9afb42a58d98c2657710d6033"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e05fcba1b22f658c8bd6f3c330b2b3c9faebf977"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e145caa75d73e3d819a9cb4b6217f1f53112f3f8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e1d86c0094657386197d191855b5645ac1dd5936"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e25adf8de44f5978d00b7e8c52aee89c5cd1fe93"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e29f05162e3d96d5549f96aa4a54c868535b2847"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e3a970ac8636d29da3ded328b876ed3550cb3209"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e3cfdc862187b4ec28bd4fb2ced5094bb5b09909"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e4ce52007d001806fc9368b62c124dfc56e8471c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e52173f0bc3325629046e85e2dc41acc6ba7d1c3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e6589006e3bda4c57247ad66fcd73ac00ee2cbe2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e67c79d0ed89ab2d5e8d81127df22876e636ac44"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e6fab7572fb2a1c6e107b6f83cffd103a233d021"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e790f5d312957dbfd20abdefe4b1735779ff9689"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e8809017a4cf6c1e80a93f661166ead961f26bb4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/e9733e973c33b38c2087b7f1deb36688b3b14259"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ea8134769855d574f6673bf0301eb2e24632c6eb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/eb489536e4e5589a93a17cd36669475b8f2a5e1b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/eb48ebd4d01e5623dd16ae61938b3333fab3ce78"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/eb6ca7624384239c7f7e0d83edb7cc334b7926d7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ec9457ad41ed745ea9377ffdb16ad09f981daa7f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/edff5256a2d60d0e51caef25dc1d6f1643dad6d5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ee4d9c5d22512da42726f47213ff56404d1d81d1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/eef2f30b5e2ecd98ebefb12d57aba8b4ad52d904"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ef23911de1a27d03d2d4983ca1527e17d6a7092b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ef5b7fc62a2daecf1e8f928b1fa3ebd028413a41"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ef718258ca1870198e91a2fbc1eaa90b620673fb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/efb46deb37a78f41dd760f6b7203b20956eb114e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/efdd6824bd2456e3e408e0e84369c4fa3aa14f41"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/efec040a5de1969df5e37e4bc50a0a8f0de341d8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/f1e30464c24dc1d7cec7ec1dd2adec8512232b43"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/f27a617b936814476770a3b31a5afb80d0f3b423"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/f3f0d99ac2962f8fddb25c65fb4c8c6eb63518a9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/f4628084cf46f139babb886a782b4ab5977d5d2e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/f4753e8881e4b3c71f2728149be7d04cc648f6a6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/f4b48c4f3f310ed767755267210f212dd62bd715"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/f4d6ff635ae4fda497221da4bfa3e593df59a44e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/f52f4d51aaaed0f9c3a20936cf5efd25d0692f67"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/f7cf30724ab740918eee6e4a6b6658ae3d7706e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/f823828ffd2a60efee36f1de52cb0f024ac5b4bb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/f8760761bd5ab7b47376bfbc5a44e16b2d5ca800"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/fb15042c268625089ef6c8aa3d8a6f12d1d02c74"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/fc3dd4292d6884a770199596f5e9cbc1e869e5fb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/fcc06696e641a7743bfd2f3b7ecd88e7b727e00a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/fd34ec90fe8f9218fd25c3eac151aec998cff6d8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/fdf548cde981fab4fb17bd63a124b75eddc5c836"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/fe47fb18b064e26479c3c3140082bd01065e897a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ff2097734bd7bb8451aece13c9336c4624735170"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ff2c949863eb4e14d9e835c51591304403d91b6c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/transport/chttp2/hpack_parser_corpus/ff7d6ff060e63355701b2e655c802902338497de"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "hpack_parser_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "hpack_parser_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/0299ca2580e4398d170c4a336e0c33eb2cd9d427"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/05e613853d64a9669ea3cf41b0de777dc24931ba"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/069352518a1d1baa05f317c677d275cefda2ac97"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/0925527c9358b1e10ec0f0387cd99f35204d9a34"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/0c5b7c2569410b526605e308309a7f36574e530d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/0ef3d0a84360bb5ad66274f1226f5cb273ecdbcf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/1e1273f90187fdf5df3625764245610f86af6aa4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/1fbc57d118f3733287e9a9d808bb8947b3260e55"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/24756c396bc72894fd720092bb6f9c03e66b469f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/276def41311933421ae7a9ee42e906c85b6a4d3f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/29daa75432381937fd005cb25e314e328de6e9f9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/2a75204bc492084ad853682f8de3fb137d5907bc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/2d34ba249b755a880525cf53c665633a5e359305"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/33f4ea0c7ea27c37d8f95cfa64d282370efdafd2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/35554617ea6418bd43161fe9a2c337ed82d7ec5b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/35f0c561297cfc840ddaeebb9fc61091f4eadece"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/3787bcc22ef645e665cc5f722b8a633af86de9cf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/3953688866ccb3b4f371f1a858570d6afdb6452d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/39b19c41ba537f37511eff7727733715db432e76"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/3e3c4756d5e40b5aa250954cbac86b826e70a7ac"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/3f03265921120c6ffa61b944e213e062a5538d4b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/3fb034e66ee5494a67acae1b4e6ff64ba92a2046"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/466059ed07a0d55d6ad5e522c7d367cbf278eaf9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/487725eb38511c79a9340bf4560a1411061fa6fa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/48b9b205cae8ac21512a3f26f49fd53e21ee13c5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/4b1f1f79a0bfa3f942479dd5f8edb59a7c257c55"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/5028c56a5116a186b7343ff59567b47347a0796d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/533f62b3f495ce704babf3ee8d840f196a714dff"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/5892cbb284771fc9761caae37b19cd6e27dbc104"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/5aeab6e4f7c2a1c09d4ac0dbdb3beac4893607ee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/5b6292bdf009b0daecbc90b85cca30a88c36eec5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/5c1659b77678b41faa4fa13df7772dae3238d1c0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/5c81f61621e29ec9c6a64ac3af9b3b216141618e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/657368df512ca6294b9df16adf935a3f374a8be2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/7fc4520094902ce2c760d70eaad5b674d2817337"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/81f59a12b458ec3604035cb962165c604d1355e6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/8f41c50e88ee8c17ecad3d41d63d38fb12aca0b9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/97c16de7fe3c390a2e6c09ff5c28f17d5c67542c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/97e4499d450c95660de86747f527e670f2012548"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/9a996857196e0998a1278994a9bab3d35526e7f1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/9b7e00049ec356ecd84b1747e4e1941140139ae8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/9f0c38ec455cc363369b3674a2d32bc21c206de1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/a1dc7bc235e46eb21d91084d7b52d5ff9f45df85"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/aa3bbb876eafa8ad8ca4ff2eabc6dd94341d2441"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/ae8ba95d7dbe99926a8f5bfd80347fd6a4b616a0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/b04fea5c041c707db0ad9c09a81672557b52cc47"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/c4acff8aa2ff886f35439f72625d05002990c940"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/c55ce9995b002e88a102ae2891a71e8bacb346c8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/ca5a0c00b8969310acb73d15ad0d0c602f1bd0c2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/cce734f1b263de6994f7950e0df7bf0c81449f70"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/d39c8ee11a697634a09b309460c0bbd967e7effa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/d4c3e4cf5d035596433c30eaabbd2b2925f4b453"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/d51f7fcc089f269c7afecaaca51966bab5fde629"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/d936dad71c129cf659097dc3db64550c4dd467f4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/e275b0466a8fb8d9e0e15856e343ddc7112ae66b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/e5c364b205855a2991ce07482aebb2a3a6147089"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/ee2077e08c3cfccd9bd82adb574ac4fc7d429afb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/fc5d4b9117ba9e87388174aee4f4970bdfe8d066"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/fdeb2c7daa9e7704f67e141106384e6dd0042c0b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/request1.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/request2.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/request3.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/request4.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/request5.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/response1.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/response2.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/response3.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/response4.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/response5.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/response6.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/request_corpus/toolong.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_request_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_request_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/0299ca2580e4398d170c4a336e0c33eb2cd9d427"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/05e613853d64a9669ea3cf41b0de777dc24931ba"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/069352518a1d1baa05f317c677d275cefda2ac97"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/0925527c9358b1e10ec0f0387cd99f35204d9a34"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/0c5b7c2569410b526605e308309a7f36574e530d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/0ef3d0a84360bb5ad66274f1226f5cb273ecdbcf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/1e1273f90187fdf5df3625764245610f86af6aa4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/1fbc57d118f3733287e9a9d808bb8947b3260e55"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/24756c396bc72894fd720092bb6f9c03e66b469f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/276def41311933421ae7a9ee42e906c85b6a4d3f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/29daa75432381937fd005cb25e314e328de6e9f9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/2a75204bc492084ad853682f8de3fb137d5907bc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/2d34ba249b755a880525cf53c665633a5e359305"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/33f4ea0c7ea27c37d8f95cfa64d282370efdafd2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/35554617ea6418bd43161fe9a2c337ed82d7ec5b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/35f0c561297cfc840ddaeebb9fc61091f4eadece"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/3787bcc22ef645e665cc5f722b8a633af86de9cf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/3953688866ccb3b4f371f1a858570d6afdb6452d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/39b19c41ba537f37511eff7727733715db432e76"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/3e3c4756d5e40b5aa250954cbac86b826e70a7ac"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/3f03265921120c6ffa61b944e213e062a5538d4b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/3fb034e66ee5494a67acae1b4e6ff64ba92a2046"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/466059ed07a0d55d6ad5e522c7d367cbf278eaf9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/487725eb38511c79a9340bf4560a1411061fa6fa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/48b9b205cae8ac21512a3f26f49fd53e21ee13c5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/4b1f1f79a0bfa3f942479dd5f8edb59a7c257c55"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/5028c56a5116a186b7343ff59567b47347a0796d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/533f62b3f495ce704babf3ee8d840f196a714dff"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/5892cbb284771fc9761caae37b19cd6e27dbc104"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/5aeab6e4f7c2a1c09d4ac0dbdb3beac4893607ee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/5b6292bdf009b0daecbc90b85cca30a88c36eec5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/5c1659b77678b41faa4fa13df7772dae3238d1c0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/5c81f61621e29ec9c6a64ac3af9b3b216141618e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/657368df512ca6294b9df16adf935a3f374a8be2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/7fc4520094902ce2c760d70eaad5b674d2817337"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/81f59a12b458ec3604035cb962165c604d1355e6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/8f41c50e88ee8c17ecad3d41d63d38fb12aca0b9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/97c16de7fe3c390a2e6c09ff5c28f17d5c67542c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/97e4499d450c95660de86747f527e670f2012548"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/9a996857196e0998a1278994a9bab3d35526e7f1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/9b7e00049ec356ecd84b1747e4e1941140139ae8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/9f0c38ec455cc363369b3674a2d32bc21c206de1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/a1dc7bc235e46eb21d91084d7b52d5ff9f45df85"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/aa3bbb876eafa8ad8ca4ff2eabc6dd94341d2441"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/ae8ba95d7dbe99926a8f5bfd80347fd6a4b616a0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/b04fea5c041c707db0ad9c09a81672557b52cc47"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/c4acff8aa2ff886f35439f72625d05002990c940"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/c55ce9995b002e88a102ae2891a71e8bacb346c8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/ca5a0c00b8969310acb73d15ad0d0c602f1bd0c2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/cce734f1b263de6994f7950e0df7bf0c81449f70"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/d39c8ee11a697634a09b309460c0bbd967e7effa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/d4c3e4cf5d035596433c30eaabbd2b2925f4b453"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/d51f7fcc089f269c7afecaaca51966bab5fde629"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/d936dad71c129cf659097dc3db64550c4dd467f4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/e275b0466a8fb8d9e0e15856e343ddc7112ae66b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/e5c364b205855a2991ce07482aebb2a3a6147089"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/ee2077e08c3cfccd9bd82adb574ac4fc7d429afb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/fc5d4b9117ba9e87388174aee4f4970bdfe8d066"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/fdeb2c7daa9e7704f67e141106384e6dd0042c0b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/request1.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/request2.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/request3.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/request4.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/request5.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/response1.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/response2.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/response3.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/response4.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/response5.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/response6.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/http/response_corpus/toolong.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "http_response_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "http_response_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/006d552e952c42b5340baaeb85c2cb80c81e78dd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/007eb985c44b6089a34995a7d9ebf349f1c2bf18"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/03b74a08f23734691512cb12d0b38d189a8df905"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/0495693af07325fb0d52eafd2d4c4d802c6457c6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/05454ab015cf74e9c3e8574d995517e05dd56751"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/0716d9708d321ffb6a00818614779e779925365c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/0a9b3522a8e711e3bd53e2c2eb9d28b34a003acc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/0ade7c2cf97f75d009975f4d720d1fa6c19f4897"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/0b1fcf0ac07e1e50cfe27316c7e1c8cc997f1318"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/0bc13548356d08009703d35e9c8d74397367bdfb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/0ea9a160c57f2c705dce037196e360bf9be739c5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/0f20d9c46991c0e97419e2cca07c7389f1d6bdf8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/0f2e2e6346f70c419300b661251754d50f7ca8ea"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/108b310facc1a193833fc2971fd83081f775ea0c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/108e5bcd69b19ad0df743641085163b84f376fe8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/10e3ecd5624465020fdf0662a67e0f0885536cae"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/113c8c97cbb0a2b6176d75eaa9ac9baaa7ccddcc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/11479d936dd006410a5946b6081a94d573bf8efd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/11aa091189b78d1cc35c7ff4907ac16a73aba547"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/1227907b2ee5a9492a890beed55332e4560834c8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/134d65130947ec69cf8df8483424b45e99cf04e3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/13584505caa892d94982a968bbc4391ebcfe0d06"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/137f554ee0f6b903acb81ab4e1f98c11fe92b008"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/1401ea03ec78b8f20dc7be952555004d7147f0f5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/141d45a59b073aeec4443cd7bcf20f7833ddbc95"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/15a8f2e7f94aa00b46f1b991416aa015dd633580"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/15c9c1284c27c8893559e15c9b2a50cbd5bbb56f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/15d1a6cda48ef569b368a0c4627435bc2c80a988"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/17a29f2ac6df774585d7713091b299729738030c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/17b815f1f72cb64481bc40263e91ce063040f739"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/182d57403d2c973a394055017d35b7621aa0aa05"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/190fbe2da448f6bdec0706c5301ad13363ae3ad9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/1b045a24b8f1f1fd6e8234d5019952ee7713a8b7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/1b6453892473a467d07372d45eb05abc2031647a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/1c6463aa2dabcb4fadc8e5441d8b418535e768af"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/1dea95b5050b766274ef80847505c0e4f47f3ebb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/1df0754d3e7970b3afe549b11ca128dcd0d4832b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/1dfe267b623b20cd97c6e8969d8b9148af9f4a2c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/1e5c2f367f02e47a8c160cda1cd9d91decbac441"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/20efdba13ca7a3657d071b3d56997aa3b083068a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/215a956168f77421253e947c2436371d56aa7ea1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2174b9ab6bf4f7c21fe1ed56957f1776ef611959"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/232f4bced4075545bb1469d5c2360f083ec7ec65"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/26aca41ee8f199e7c0c7cf31d979952571c53fc9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/27d84210636e9e83786be9e9b96b69f70b743b86"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/27da426a5883662d19ea78f306d7a992be52f827"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/296dcda6f7e6979e68ddef7cbc1206a355084ad3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/29b08c03ca5a6851fa4604a984cb7ff44433a5a5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2a3d964ec4527ad9f02129fcbf087b67a6ea6444"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2b04974149815b143afb17af4388d751217e54ec"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2b3b1ad952e3acb566e32a84e2d503acde13eb53"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2cc301a6ed7f01e2cd339f02bd0fda20c227a17e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2d3d5b9275553430b4cfa68114099120ad7809ee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2d5dbf403e0c12e2fe21b04ca3daff171c028ab7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2d7c769bed62004270034b976b1d940a5686106b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2db120231eea12d9cdc6a00f30839b3cef2046be"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2db610e1a230409a205cf22fbad3348a54cbe703"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2df1dd2e2f5d57e7d9d4e60a756a86e603573225"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2e32faacd3ea4461ec7aace297b4be6904d9a389"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2e756d91759d7e74f5b776c0d2a1935292f576d1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/2f09b24f9f5fa0af2c29b604b4b0f97fa6163895"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/3027d901361162b38fcaf17f97ba7d9646e32495"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/30d4467ecb771ece9ed6c78a46adc299072d9db9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/311048bbf4c4bbabcde73607d7e76915cee9312e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/323b48969d7bf9a50aacf0912f1b5cb02119e2ab"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/33400a242baeb5c46ddb1578c28b10d32a9c3cd3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/356a192b7913b04c54574d18c28d46e6395428ab"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/35e995c107a71caeb833bb3b79f9f54781b33fa1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/373769c15c145472c8ec3bdde8fc84e85ec79211"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/3795d911970a1fd8416b93649051b418948e3edf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/37d3333e1e2a384c3ba14a52682ca29f061d1ac7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/38cd33bb390445e35b6514024b1317902cb7ba1b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/3a90c688f44447a78efc111872b061a001f04d2b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/3b1e7b56ad4465d126ea994d34d20dcecbb3a50a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/3c0a8d6c31edaca124714624eb64cb8ec0cbab13"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/3cc0c9adcf3882f01409c70391c3cd30588ef34c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/3d0d9878b812ce4634962ba3dd755c0953550200"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/3d4d5887a2fcdc5dd360b8a6f89dbce6500d8580"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/3efb5b7ff94c5b9d411c93da9a70e1cc547f4c59"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/421b7e8ea86e3c07474af16ab3ccef55d1857205"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/428d051e437dd260f2a2f7ed920d9734ca34dc90"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/42adc281578ffb1b8684b78b47aa40a16d10b6e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/43620ecd2e2fd58fe5650da2e9783f980f29ec07"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/43b1ffcda49477adb1632822202631990ed3a269"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/45279f85bf2f533a629073caf89403006279fab2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/455d9bb597f08bf698454157ecd86647b5dec4e0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/4561eb5c7e43cae048c06aaaad3d5f5218b376e9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/46417b001eeb87c32b642499fd5e1690d5d88c7f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/468af040024e96e9878ef33cc52755c5e7f5cbd5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/469e5ed2547e9e55a96e96eb832c615631e3b576"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/472b07b9fcf2c2451e8781e944bf5f77cd8457c8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/486da8aff04083c5e0fe112e733f2ae510e312a1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/488a5ed641e340ae51992e04ce6590bdec587218"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/4a0a19218e082a343a1b17e5333409af9d98f0f5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/4a6644a1a3d5218f4bbd60220cab79c0b7bef45e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/4b39d4b8a9a04b9469e8fe4016322327fe540882"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/4bb0294e14946fb1f64213384097a676d3ef94f0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/4cd66dfabbd964f8c6c4414b07cdb45dae692e19"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/4d134bc072212ace2df385dae143139da74ec0ef"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/4efa35221b2088e785048d0ff8fd99b03d5316fc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/4fa2a4a5a2f7dc4ddbdecae3ee85c787817b4cf8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/4fed4bf2dc6259d9de54e9fa7db4fd5a61f2535e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/4ff800de0863adb5851fa26935159aa53b11cba7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/4ff99a030518a132748c44bc1d836018e5b82cd0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/531c87b9772e54e3e183ef729f0a7d5a0d584f46"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/534d66e7b0709d1e7692faae9e7f7299c92bba4b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/548775f9d7d13339dba3001f8238b84e9a457533"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/54ec3b2d8a9b7a6d8204712eb1b90da703cf8a79"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/552cfe1d8958e6d003ec8e883c4983dd67ef255e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/55f0c61d096a08506076489ded3b868db4086770"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/56cd60743c2cee939f5f357905bd36ec9363f441"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/56e5f35e3d08b4e17e3558cacddf9e5ed13a0159"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/580b03c49fba02bb8e399500eb66f2ff0482b22a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5852643fbbcf92b0181327b69b4874c6ba6fa9f4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/58f497e5efaf9f69080f9eef63b0b9dabcfdbc0d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/59129aacfb6cebbe2c52f30ef3424209f7252e82"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/598a287a3e56caae23ed63abc95d5f3457165eef"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5a37a26dd2482226f534f79d321d28e7a615ab72"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5a710dcd4c78ca1a74ceb9fbfb011f7ac86a5f7b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5ae7b87f5377d5ffc16fd3f69b4a4aa7be8b1184"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5b3fe86d5a309a6ba745881bd220fe1100b271ce"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5c38b7da113ab4535dbc22777ce8a1480c1c9d1e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5ca6c45a8d2e11c782806df43e7668beb4aba8f5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5da7b543313339f84fd52e96bacf3a73368a1d2c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5e12ae9117668bcc22832640cc626315940aeba8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5e397439a2680ed827c46704969c6711dabbda84"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5e629dfb8b7533c7c2d173d4c3d587c88112cc29"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5e785c7c26813577f3e30ef8f7e37ab2a9ffe39c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5f3394f5058822cc044b92654837625897176480"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/5fb9bcbbb30a377209eab0541d144e44e71508d7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/6008213a61d06b4382b223768530c3452968b7b3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/60ba4b2daa4ed4d070fec06687e249e0e6f9ee45"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/625ed64c30c8ab2f0b3bc75690f9faa4270f0041"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/6314c2b304d04dc0108a95d29a93515e85e2b0b0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/6462d8079d2ea921617e7d073b85cfab706800d3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/6474383282788e556aa86f57fc8650137ad264d0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/648c3f58ecc8fb4b8c779e6b11006ab5b1986dad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/66328e03a2ccd5e54dab23b816182786e6f518b6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/683e9045bc95e0cb5fc16ec64b118433475ba559"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/689f13680f4682303c8aa6828b67955959dc9669"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/68c6ba7f0602a5410d1fa3c5de24fe264436b993"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/699cafde80b1e1777306f781186d1253f018ab23"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/69ab053b59e235fd6af246c5180f15bd95295113"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/69afa12510b2e653b0af7c7030832647b2d63c37"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/6b75857f86be5c51b21a97f4a61e69e8bb6cd698"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/6c75e71ecde9f073a7bad89f4831c8cde0bc1830"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/6ce5170dc4f2eee3b31a875b6a41f2444959f3dd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/6d2859436fbbee637f0a5981ca82e8f88a1d0d28"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/6d63e39f56d1d537bab9c2830303cabab3cd9035"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/6e05a0a240fe2974e14527bbe390d294564156e2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/6e6c9d301adb0f0ddffd79cdf3426a2de99bad48"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/6e989edf725ec64849377681ce02641c3d1870e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/70142f66475ae2fb33722d8d4750f386ecfefe7b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/719edbe667ce2729ac78a22dac29263c91144029"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/71f99ca2bda6ef2e15b965479a79587f9d794be0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/743e89b768af4bd591ea7228118550b1bfb8e7d1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/7714a1a32872442a2eaff472685f3ea69451a732"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/7719a1c782a1ba91c031a682a0a2f8658209adbf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/775e8ffda1f5d340dba472d06dc7c8bf8159e379"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/77de68daecd823babbb58edb1c8e14d7106e83bb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/7957dc9aac31e6a6783fb3a6ee073688fed6cf9d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/7ae893cbbf9b11ff411640b80985ce618907559c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/7b20ac50954063e3ad00813acab4a98b2bfdb858"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/7b6273145fb090de1c6163586f884a1da4b5cfbf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/7cf84b5a78281e6c6b5a9884110f3dbc6a40e310"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/7ef13b83e6bde582d9000be043e729cd3221c150"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/82059e250904b478f65daa0e647c1647ba6d6a3d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8207fdf4bd302d6b6b1894990b353944a8716aa7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/831a49ad81b59025c241ac9e58bd88463fd798eb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/84582c1dbe026475319df14c19967d1dd0bf751f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/860d4ad0b7c026d1fcf51932b5e46500be7860a6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/865c7cf36a4f4499a6242e51b77b58b868a7447b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/87a2b80f9272583517c0207af176fc40ea55022c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/887309d048beef83ad3eabf2a79a64a389ab1c9f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/88d89860ccaf21e5f0f002303a2cd853ecbb2acb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/88f658400b1870ddf081fb03020c3098b0b1e083"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/88f8b0984bb2f081918ad883c8f0ffacb5a8ff0a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/89304953495f060c7abd3584d83cb1c8e6d6653b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8a5f6dc6873e3fd51fd866854d85258f8aa83a02"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8a87261277c15667e2957dd52c5db6757ebc8e88"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8aa61d8bd260942521bb1ba82cd4cce2324fdbee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8d8874439569824e371a0284460440175cdb8a27"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8d952ec2e33b2a6a1c7876898719a610f5546388"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8e6fec8a05b24f221b6e94fdfe205e5bf7709a2c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8e7fda77644ff91578d25243fad51a3cd6d60860"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8ea6295ff82bb119acd44a91b463b19fedafb226"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8ee51caaa2c2f4ee2e5b4b7ef5a89db7df1068d7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8ef4dd9f2d0f9d770c937d9a43413d24df83f09b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8efd86fb78a56a5145ed7739dcb00c78581c5375"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8f0ba762c2fed0fc993feb91948902ac397b0919"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/8fe81e450694cac1eb4c4a5c966ffbc56ade3513"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/902ba3cda1883801594b6e1b452790cc53948fda"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/910a1528b28ebc6ff2f2a4fedb013c86de4103e2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/92049bf3d8a0ec93c2d1633631c0082e66ca69e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/920a3c318f3127b9c30ab02a077555c7dfbb6edb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/925fc05dd661aeb4a776dcbc5df3dcb2cefaf0a6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9367ba65affd5bf7aabf79c28e783cc5d93518e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/939f5049b1eefb91ccbd3fcecaed8cb21ea6b285"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9405c2b00eaa5526f71cc78914dbd3ecaf093b6e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/94d3598751569d2a5be258e59665cbbf0692dfbe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/94f96d95d01e98fd2f04ce26c0913e5f9a882fb4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/95b54a84db75abab401d282fdb04440a879a9708"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/96189202e587ec951d5795da3e03062f2fb5d708"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9711703428704ce2827a719eddb9d54be23a0cb7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9734597e96eebe99b2243121a51d178a338ec46f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9747c85a9510011bf87c23a80b029b9f2d04c37d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/97d170e1550eee4afc0af065b78cda302a97674c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/98e02e7fc96479e8d10ff2cc7610be772e2d6fba"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/996156b191b619eff79b2fcbb7598518a09b06bc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/99667fcfa6d583a742fb5450527fc86dfb78ebbf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9b1ead2dbeeb1a3e9a7bebcf6964c3cfbc7e8867"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9b7669e201574bfb979d56110539a90da5aca2c0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9c24b456af3cb51a1ff2780c2d9cbdd7d93f6c76"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9d0441f23ae7d5a3a5b1140497868ee6eeab656b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9d890bd3139a8f9a44d435ff8edfbeb5b072ded0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9e6a55b6b4563e652a23be9d623ca5055c356940"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9ec88420ef0408642f6930996e35f5b9f18ec88c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9edd067c569315d5e93b0d14c7eac9fa6d81d3cd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9fbda4f714043d975389b536b4497c6d713452e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/9fc8cb8ab3b05e306e5e81d9d949e69f931244ea"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a02b857f2eff73e8e188f35529dd91f8144b23b9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a060d5bfd1235cbbe4bcecf332fa3b03bc2282e3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a0931fae1d43e7887c1cabde83fdfc52eaeedba8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a0d4af29c6c223b48fe34d6a09b3a7466242f33c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a1abe8a785030d475a7350438fd23a05c382c110"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a1fb86293eac950c2b4f5182d9e4b5d9e0982ef6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a2d4e3d6f5ba43c9199d5d2011678f82cfd55afc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a39653cb3d97c58c44013197f4d7557577700177"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a4c74ad56ae0e94e96101a8f2ce9b1e588df5e44"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a6b34b06b00e9226f2bd961483f9da81d8de99a8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a72c3b9cc71eb7f0e0e4dabcd2dcd2b997f21c07"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a749d24bac55bc19465acc92b12244c56ca0f20d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a78009ff8b3f4d722ee0eb84795e857e74a58aea"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a7ae4b16677806d78d0016c276b6722eba8eef3c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a806f43dd48e35e75c27814c13a2a96c12449bd1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a90a858013f90d2a94e0d62a7156ffd6848bf238"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a94bfbfe16d026b52d7f73cf78fdf7d6a6c5c58b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/a9718f029d11a9335ef596cbd42794de5b0b18b5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/aa6e08a488d1ed00aa51f20c2477fc89e7b0a852"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/aaa038513c192fec501e4e7302156872ce2fde37"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/ac2686c095a5a1c92a1d4209a6c287778720c86d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/ac9231da4082430afe8f4d40127814c613648d8e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/adc83b19e793491b1c6ea0fd8b46cd9f32e592fc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/aff25e569bd8c93157e08cd18ebcd896438e34c9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/affced8168ec801de89deac663f708f0c96cf1a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b015dfc2f62b640d7c25adab7b38c5fcb5cb64c8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b021dd7cd98b63092685ea092df0dc01c8f63334"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b17485b8bdec8809b3819a83753ca893871df403"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b32ef51eca9c6c658e6fb75fdf96bbba066404e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b3f0c7f6bb763af1be91d9e74eabfeb199dc1f1f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b45a1635ec526bcc890f9d735976704e516c5f19"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b50ce51a7baa28cd298ebd05b4a3b9b70f9d4370"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b5126721812b925426b30d283d2bb8b6969f230a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b57af943a3ee411bffeaa3872eec9c6fb01569a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b5abf6fd22ed0f852781de35d043059d0f86f3cd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b6589fc6ab0dc82cf12099d1c2d40ab994e8410c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b6f19238d2b04c5b86a17369093dafda34f332e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b858cb282617fb0956d960215c8e84d1ccf909c6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/b9c38fad09c80db7781fefbe51039752de575ecc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/bb407c8992800444201dccfe744dac49c0295fde"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/bc335734f73502b92d2bd3587259ce915985f0ee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/bd113c2c8a2328e3674c680c7cff829a6c8ab924"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/be051d58015d4af1977a5dfd14ef3fd070ecc9d2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/be461a0cd1fda052a69c3fd94f8cf5f6f86afa34"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/bef524502f8dbbc45af717ece01ec88edd7f903b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c0b6a90832b78ed5f6d129d3640c612540527c85"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c18d315f0d35849b2aae4a47cab4608204b85d76"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c257fd6bc9e5254a733378ab4ddd39629c4a3069"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c2bf7f49d8f2e13a60af4473b3b3451b65b3aa9a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c308517acf6f7088634d491a1608240f83a3ac95"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c3badd71ef8a51b97ce93cbfe99f6778048f2128"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c482a632702ae7f532d126e70149dda4fadc3cd7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c541bb86e55b98e083b141114066f9c17d853374"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c5b50b9015b6aaedd7eb1077b1204858f837b53c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c62ef0dbd1350da9ea5a32e56672d385837643e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c7a34d6d49e1da1ccd490350c2df3a168ed09ae8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c88c4bec8d440c56d3ea7abce39276f0927dbe0a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c92f147bfc034003ac42ed9e62a16c84102ab417"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/c96b0fe6034668edf37ef0f5f391d5107953dc06"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/cac74aa5d7aab7fce0253f00c1a025980c1f9b7a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/caea0a0e6d8708cf682eaa446c344da56a7d5515"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/cc8a3dd2678d4b400ad630f402012b894e841b05"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/cd851bec7adad52f79777fb9347d5fd2f9486aa7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/ce3899b62ba3efe00eb31ddad2861ffe16a30d06"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/ce8b76fdcdbf1c951afc2b115be9acc8a6358b32"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/cec87b67871fc7a59652bc3546fbbb68e4d31e28"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/cf32406111908544e504c84731147f072cdf2fbd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/cf35dc76bf9a2052636c1ecc92942161830dcdc3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/cf6a5e6bfe4f15b43e411dd2782e10f1670c9767"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/cfc45616f5f0e7c25df91f6984ff5f6f1648beab"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/cff891e5858ae68d08ecc8470ca6a68c9438bfa3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/cfff4e9d08cba81b663dd1999710008342851e19"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/crash-f21867fe8b6df0b54c13e2e6e613dce871ecf0f0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/d1db03c626fb16c3b9cd44cc38cf40ebd355a194"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/d85ca051da784c0441898c5affbf11a2ae8f56bc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/da03f536ceaf609972aa2a699687cc6f73ac0dcd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/da4b9237bacccdf19c0760cab7aec4a8359010b0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/dcc45e405208d7a2db33d0b5b9da2a2f1b034957"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/dcc60d3aaa1fc4d00201a3512284fcb79b5b68ef"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/dd0567ae57bf3cc85891a1ca988c2945d9186678"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/dd890a5a32e9f0489c6c77695f2155041f00fc9a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/df88e2baf7b76ffb2e94b9da57fd8d137f44b1ef"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e00ee378c3f6e0b3cd89bd6e7517478d093f73dd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e0c124e90d068e2a70a3e148052869033453ec58"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e0d87b1f3e54e5adc5c2205f9e14772822a25766"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e1199df649697c570db5d6b2ea09d755eddd32b7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e235f6f2a8b6a22117f1baa932fb6c69799e1136"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e3a654055a867ae62d8e68fa2c410228ac55cb6d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e3c680aac46b9c46392e3b2c43ecdcc1547f2023"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e3d134b35cc25a4861d90023c95988ec6103ddd5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e3ff65de4b1622315c3b34b7a5e39bffb275489d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e4a4085cc31476f5de9047422851d8ccf86339df"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e4e3c69da200af932c8a79fa055d7aeea28eb1d1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e6c3dd630428fd54834172b8fd2735fed9416da4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e71eb37fca2070521e1e07c503c2bcd6445b35ea"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e760e6e22ae8cd1ea78fe28b5eb1f3d7b5fdc536"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e95ff1142118a2ca5b84935612a8a64d55360e64"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/e9c5e2c67930513941753c2d54591c7098c82f6c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/eb26070d17ffa908204912e75cb4313835042038"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/ebc6aee49e5ae57722df86e7fa33c420f045a449"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/ed1dc11d713e7487de18ce8317b62916959206d0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/ede3f66106acd7796da8b3942d029fe213058286"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/eed7bd220cd511b6d42ce6553019266a22a3d56a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/f090932162756b798b1a050b05e3d36a3437c4fc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/f1905eaa84ba6a3593ec6ac0486a5b42893c01f1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/f4635fbbf765ead81a261ca152df02622e182d2c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/f46eeb1020c7c4153e742a50bc24c2c6939dab1e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/f473451610783521d51bc08cdd920ddd97f8a71f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/f63aa599600f6e7d648c4287905e16e8e6e479fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/f667dcf1c06e87db2dc49d86ea1c285e796f8f8c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/f8d0f85975e49b959799cc52847110cc940b9db1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/f92c47e35da42d79a48beff54b93cd28f55f05fb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/f9a33bb8bd78d869fbafa402d9be58940ce2c318"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/fbf6f3156c1bd4bb701839bc0e26533bdccd1c9a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/fe2ef495a1152561572949784c16bf23abb28057"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/ff8fb34603c7f772768d61504954553e6bed173c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/test1.json"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/test2.json"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/test3.json"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/test4.json"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/test5.json"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/test6.json"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/test7.json"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/test8.json"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/json/corpus/test9.json"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "json_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/0052f8fb6a7884ced8a6754aa13441be1f7dcd51"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/0c35544f40d428d103e9c5b969ad9cd16767b110"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/0c60ee9ed55c9af6190b132ef6636c1d2abe4540"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/0ecb3e69889c036a86d21eb942077dc9abd649be"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/1324c95dafe597fe05f9babe92fe6fbf181c1897"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/14eb42f7423081b455820daa2c02b358315dc0fa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/1e2dd3a96d4c5142da19b2dd64014d9358504536"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/2277a90ab01e3f27a4a8caf34ecd9997f3ffbf19"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/23121c5f633db5d7c1a9f2225240754246fee513"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/235548307ee9f2b0855fded42a871990d9ade956"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/28ed3a797da3c48c309a4ef792147f3c56cfec40"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/2bf123dbfa1d37a04493b5662a4b3b9c147485fc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/2d4c0908ecc0310ea234d10b6bdb4f4ca3c41dd1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/30084b06df1cfb2bf2e1cfa8f8024c5af47a4d80"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/304e8cdc9122b709ec2c063a5c8c38489a788033"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/324d4a2aed8bc1840fee212fd38dadec80a72ea2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/32d5dad0f831572fbbd32ea3de5df43e27568f34"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/33353a0b011901a13d010c6b165074ccdaa717ac"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/37dfead09389fcd9b9d24ef817a0fed13d8ff2b0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/47879cc364be304754f6af15563ad6f9a538da41"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/49a5cef4c730ecab22712b156ddba5106f165afd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/4bbbbb794a098deeacff73b774c30f12c54ceacb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/4bd815b34ddfbbc45c780d1e7a97341796ee8471"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/4c498ce69c8476f745693deb23272930e05cad60"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/4fb5e3085c32e9bccac9e18343cca07017d037de"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/4fe5e46c1299e7f3e8a41dde3ae1bf1b60b4a43c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/595b8d51971c1d15146909567e539a1bb39b1af5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/670cc6bae958cb4f15e7297fe63959ac5799aa42"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/675f3263af7d1bbb084872f2b23f6d363227e85d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/67fe0d2acc727c8a39a707b92c6cebda9bd20986"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/6995dd153f712ad257ab5a365e5a4b84dc676ed3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/6d15065785eb8f4b5f17357a520cb4815a2cb355"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/706b579bfc3db01ef7216d77ce231ea477c2fae2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/71ec91b3a142105bc25dfa5b84ca0bd893e1db28"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/73285d7a70d73b517648067520d921e4477dbbfa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/747d1ed8bee4c6f0438beaf88ae76d8ef9f63da2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/74c9d6b5d7d31a7c48c842311857c319fafedd64"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/763878a34b3adeb99a03b54d09768a4451617016"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/7b4b0c2555178333ba15203a930c88ef7e7500e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/7b8a91aa46e370eb61307b4998889dc89775462f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/7cd11836c64f98742fa7beccec5c981ef4dd62ae"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/7d8f4f045e70e8a2cb45dc3c001504f5c2614b16"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/7e9848558fb004e14795b3ebd3e1488dcde1db8c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/8707d3367be279eba1ddb5ffb990e40a3141c7d0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/89734c37ee267e69a6950c6d60ee541c1be5ccff"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/899ef237274b4a44b5478d7ec880680a0cb7dd88"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/9034aaf45143996a2b14465c352ab0c6fa26b221"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/91e3b6a3484ab4b95cdeecc5aefe1291824060e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/95cd94c858e5e97f7df4a5eb7552e5e0d5ce1ec4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/971f42d5a4d9816145ebc9dd28ba33ed3f5860b0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/9849ff4673525f3c6ad567fc681b224a818da732"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/9db3a1854de87fd643b910aeab50553afc73e667"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/a10e7effe8b9a50ef55b5e0244ea4dba5c48e9f3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/a147873135c6c52d4da03c260a0165bc0ab1b979"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/a20fa4d2633e9a401cb765470913483b848721d1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/a710eead945dabbbffa213a980c75f9463a27398"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/a72406e3ca06d941fe8e168bbf67da88a81c947b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/a8a62a7ebb7d68b211ae319e082575935c07d188"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/a8abd012eb59b862bf9bc1ea443d2f35a1a2e222"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/aab56035a3533b5d83a32a439f179eb678250113"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/ac174acef2c5da26fadc7270bab9c8c4e938c463"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/acbbd60eeb76e41ce254d0fef353b92abe69c831"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/b24237aa77b5f09208a7eb80b6178aeb2d53d24a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/b8e1c06314e52491ba955b72e13161c74e9b1422"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/c1eed32e1e353737987da851ad760312ea8e557c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/c4214ace2c4bab24bb356f71aedca08544baad70"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/c4f87a6290aee1acfc1f26083974ce94621fca64"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/c6fa750d7de79b2547531ed597ab7f1c4cd74193"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/d285d78d3ba966b4b199453d38ead1aa36a7484f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/df5200f371cff3cae0e1595cd86d641725f5d1ba"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/dfc66cb172919102f3ba14f6816228aa46f78154"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/e53e789a4c175c6a2c468472f1047d0fe8db1177"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/e67fe6794e755ea801272980f2c272edb027f6dc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/ead61e86fedf118df8e44ed70ce002be651cf291"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/eced8b29efbdc82eb8a1d0865c5f382f0ff78446"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/f107c60f00da44a2c412c5b89c733efe5f9be4aa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/f58a9135d07ea9a5e3e710f6b3bf6d48d5942dfd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/f70e0dfc4185374b764189b1a96f3b4b7581ce0c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/f8c2c4ddd2f474b4839f13a9be862c00ab0ece77"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/faa1781e1444bba5b8c677bc5e2a38d023a1ec65"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/fb60def26b39a737e29e850194a0c2047e378900"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/fccda587af845f0685275960649d8f4a45272a95"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/timeout-3ec5d82cc22b6f35ab7d281faf1cc5e66f0e3bfb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/timeout-6995dd153f712ad257ab5a365e5a4b84dc676ed3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_response/timeout-e5609086439f47e81c775bf80a7213fb73eb028c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_response_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_response_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/000def12957806bb0d40005cb651d35b4cde7b4e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0068af2acc3020f344ee84b2c8adfb90492354c3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/009132022c3a1660b701728ac92e26baf82e8eac"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/00bf0233aa1155b34a3081e4a2b7a1c9cdf8ea1e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/013197cfb12b59755b807501c6d6615859f9cd3f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/018a4332eb19f2398162317cb6ad2e8cf700dfd6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0273d3496bf5f4594e59083ac319f8f863a15be0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0355002521e74dcdb3a0c633338bd02ab1d85312"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/053d8d6ceeba9453c97d0ee5374db863e6f77ad4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0628c29e3ae264f8fa08652435bb3e61afe60883"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/065e91578e5359b70a668164310af6f0dd40e922"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/06b4b617d5937da8a7b58aed5341dc5ef6d1bcd7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/07216a4f5934890b89d845f6256546c2681350ce"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/08584e8308b7f52f0fe380358800d7f585cba89c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/085a37568e99ec5855bd96affd259921515479e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0903d1e9297179c18de6a3707b16f27d0d54ed67"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0aa20a75bff4e8af10330c66d288e900146f1a39"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0ae76e2b24ca999bd5e09e517aa4d88f5b5f58a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0c3025fdfb008a6563ea2a2bb6cbc79b8ccbf8f3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0d219165cd317142afa36b8b5476cc022c95c4e6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0e053123dd6256de5aff55b0731f913de250c18e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0e065f98325849ac05eed515865b33dba0264cd4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0e4ff715d491c9f0b471c400b71804739b6d400a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0ec94942046cd7e00bc058204c1d046075ca9531"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0f0e8da530eb8c924cee6985d9c3dfd93274ef8c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/0ff365225c981d74b89499d1e708684ed4d0b570"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/113b1efff1677c1b9a24f89aec0c3ecc228ddf62"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/11697d621eab6743ba22715722d5b23830b79075"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/12463318b795c756f389bc0fb1cca9645eafef28"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/12784250cf16ec999529f601ae5c5798e853d34a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/13122d08c1cee0dae6434605917d4cc6d8ea8cc5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/148a1118649dd8aa9b4ed778efdf7c1611aa5d27"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/15dea2bb5fb36a3dd5172796da66a821a32918e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/16488fe15a7e33cb41f2b7c159c99154464b3fd3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/1870a48a3c9c1dd9027cbd85beb503b43cff6e89"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/1900b6a9123667a79020319aa7fd54d230bc7073"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/1a000f1cbccd2ab6f7e623e015ed2e84284c9dbf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/1c1d403f6175d52ac4430d1ef2401b549761707e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/1c2ae0e1915e18dffc2215e9121f1afe0e4335c4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/1c5d2eef52426db9d0842f3d57b27a219434c512"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/1d0676867c1ebce84531035fa7eb86ed00762df5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/1d92b263fa70450b0d0aeb81bf5d2f69eefbbd99"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/1e843ed4864d6a808b671dd6769ae191ac8a13ad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/1eb06a34ee568d584c4b33472788889bc68af3f5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/2169c2b4d560d74a5487df68b56f3af1d648f544"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/21f8f7583e58c1c81a3ac8237b5fa58071edf8a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/231e348407fdcb14412c691b0b20982940160ccd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/27b8f060e3296eaef77dcdd4c2cd11d5650604ac"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/28ed3a797da3c48c309a4ef792147f3c56cfec40"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/291fcc6e043942638fa3c865c0a1be5e4dcc0e70"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/2a7f6c1f8fdc090b24ceb90ab4f3a7b331c06c86"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/2b85f180fe56f84925b274819ce10a8972a594e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/2dea73d7d10ba0dcfd103f7542bdf7458e772b2b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/2e9c19f98ef88b83ec2dea8b1b7f92b8337f757b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/2fbd59ffb74aba392b86f4fe2ff8067b6d45cce8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/31059c32ea28d37b7442f51b20e966665662783c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/31f78e35feb36037864df5f8f47136f8e6e4768a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/326d322d1aa31696a14518830e544770f12146ee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/337df26552e0884ff133cc1be8e72020be38f457"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/33a2a0aa86956097e034b5ee16aeceacee7efc34"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/33d175d1ecb3a85be7dd93d24efc3ddda0a85ad6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/3718a1b790db16bcfc4ec30691fab24ea7bb0b74"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/37aa3946054035b712102a62b71c94747dfd1491"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/37b697adc0708ad12e4ed7355f3f8fdf1b7919ca"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/37bf4642c5e5a806e2042cdf5ead9bf3c97b9ac1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/37d94ca6a20303389b35404f3dfd20aaa9ff0851"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/39278604f6a1102366464bbe769ae846e542bc56"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/396b57d9a11a1b135e36ad266e155cc0c3b77d21"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/39a49db120a807fe4e80c502254a5009625c7599"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/39f04d1c6d4beefa3e3d6eae3a5317d969787055"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/3b199b80209fa0b8ffedba4381019f8729cc09d6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/3ccf7ffb96c3e4789409db33cc12bfd8ddc24c1a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/3d04382d1fe11ff3b717100aece7f9eff2d04b9b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/3d4eb9f836bb40cf4c734073bcba8b73e4cc93ae"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/41dc8c55e41d32c30865f9761931ddd4c5b740f8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/41ef7b74d212f8f7f6681edcffd0db719030d31d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/431187b5926fa7d0823305a9f87635616ea3ef27"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/44c6da04b8378986721f7225e70a1514695c176c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/450161236e37a1dfc0da6398c4876df82ff640ac"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/45257a176ca6a05ec65a6df430bbb6b85d0a676f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/46d1c2f2edcc9cdc0d1698fa0c8853cb19a6e7d9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/4764bd4297bf0c405348d2bb87b8fbc02beadcb8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/48199bfd0e2c160f56d03e881bb5dfe276eec462"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/48e865c56e8db13640d6ecbfc0f2486eb77e07d1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/499b003b8b98edd9dbe2668c8c6af948769d7e87"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/4a55591c4b390c5a36cecc6f1b6f5105300b546b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/4d33f97ec69c64e14dcf205be36a6319ddb8a20d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/4dbfb08904739928e19c2f459040b35ac410f699"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/501bd6fe1de2719cf8d2c517a071e5d883fbe766"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/5208871ea8948223b64b304336cea41ac3240244"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/5348c71be34967458403bd4b58bb2a8a744d35ee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/54362c2f6965268d0835a992c3ba656171b8f044"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/54411aa13f6d9118028171935322bbbc74c15329"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/54c50af22d147f192918499b4b3819eb389468a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/55441aac903d96b36bf8a11bc804234bcf0c04da"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/56e1a7c279482a57fcbca43468df96a791ee22b4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/57cbea7c563d5c4b6b290271b0009c3f348d92da"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/57e11c7a62f0fc807d7b51bb1ef0f0e22f43795b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/585183c1a240df6926689fe1bd8cb434664db4d8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/5b2ee8ca40508bf108a729dcb228191670ec34d6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/5b47eabaf74479348fd0318f174d649dbe96e7d2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/5ba93c9db0cff93f52b521d7420e43f6eda2784f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/5cc827e33932ccf8c72c6a839074e856d93463d8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/5cc89bbf687f94ff87241a8f935905e1c441de33"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/5ec6596f12462fe9f36924c262f97408b54bbba8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/5f8f3af69295223fb04c37d28035bb75b4cbd705"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/5fd76d48b9fefecbdabd4511decc161b25db79dd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/614cf839ccac2d896d61a0ba0ab1f42b2fabafea"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/618305cc2d3d3814d78b77ffbf421b769bd862cf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/61dfcd913c4f0a8d005bd089c34e95d8dbbf1897"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/65a89e10aab00039680e1f7d014737b634c74d8d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/66a273dbf5e37410efd45518a42b06a65cffe1f0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/673ff0de0702e8098892060a5365c175d8ef18fc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/68465c782c37bfdd98ac493b0458444bb94336e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/688451dee13d0be420598c6e205a3bc419173e18"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/68a1d9150e1380c219e0a1deb3993f321e000ecd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/69f49bf7ae8886f5b4c6296fdb1c570256919604"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/6a425f414cd69ffffdbaa34d03eb43841b432e11"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/6ca9e6e85f9b007a0920b0112decbd1403d506da"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/6cd62e3d67b4154639adbe753115bfdd770edddb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/6d4f2de4cc427417d6335ff5396ea2588509bb5b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/6ea84030dd0b5b03e4720c244ea8b4ec65e1f236"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/710c1fc8cf7dc1386312c34de5057933fcf868b3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/720e81dcaf83f867288a90293c5de3b088d5c556"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/72cdc8f78ab5237f96ed354264c726ac79ec429c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/73535a4f7af7e4c6aa23556cacd63f6929ac33fe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/73d7b933a5673a4d6f5905006ef6266dda1e4fba"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/753aea13c82d1f8841c2bd4309b1b55d0ae2ba8d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/754428e00e8a1d0471e00bd9e8f060ab88ab640e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/761c29151b23b4d14ce6261626641df1182f7a96"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/7658451dd805f277a5b1c3d4065d752d2d8de5f4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/767e91cedcd9bc1bdac882acc34a53cc23cf4d02"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/77d3754bdd4ea358369c936ed36b974b4181f6ab"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/7a95295bebe6237f65deb15ffeccab22716d574d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/7ad88b82e87fbfb3d4bddaa2f6e201a151e3a007"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/7b1010cc012e34af1d03e8845868ff0e1db3a601"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/7d3ddbd11e82807321c9a53835ea897cf43aa7f2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/7da9c5ab5f049da297b0f4c1322edd696202d02a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/7e265a019c02e5d089152849ac00bb005fa644f5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/7f33bff4f740eb898b908374b0c1badd47566947"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/81f13b9b65891f2bfce77cb183a06045c461fee6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/846a14a480ffa1ad0f6333f3ecf2be3057ce6aed"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/87373a7f89feba2d50591b433f69877044155af2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/8833ba4c780c94fc6c3c466f849c0387acefdb20"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/8c23a5ecd20db4da2c061f3463254e9de104c8b9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/8d883f1577ca8c334b7c6d75ccb71209d71ced13"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/8dc80bd5f5d1fea64412203e304432edcf5f52c4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/8fc9a9ea6ad7d6d51e770076eaddacad9f970c6f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/8fd167de17534776ef57aba2f27675789a11b8db"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/9117d3e51560813b3ce4615dced18fa0e4d0a25a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/921c68eaa8776f7544e195ae52224355d08a2d4d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/9293945411fca2dc81fc34b36b575a384e6d489e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/933287d66c3ff3f0a21f2c583c763f2f65872ef8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/933d1d91283403f0a56571f533f482e9744eb735"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/93855fc41b3e3004ca6ba85f34b985042d4c9869"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/9544f445c39470f05785b52cfc31bb73bda22659"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/97757217fde05ff4fc15c864bf29e9f560fd1c62"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/9877c0f2d40dd43878bb0209bbc4b5fa93bec55a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/98bc5065f79dd9d20cdac14ba28f0cf39908cb5f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/992860817f7fb0e49423607355dab973aa7ab815"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/995ee3d74bc6042fd6a8908c9df5a4cb530378d8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/9a38c24a6e87e99a72a3a4f007b117ec191a1705"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/9aa97a0ffcdc37a8ef487355fb7271eb6891deaa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/9b9fddc17ed7bc05a81c18f01e800a4e9efd0c8d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a0d4cb9a5a30bb01e8e4f68d636fb173632ed29d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a1e070288ec564d10a8c59779aa07fa771fa1d4f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a23d10723415d20f4ef1ed9b14d9dc24494856a0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a245750cfe4212dca7bfde918de85f64eb053232"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a24bbe3600f4dfd61bb8415c6a291e0521e4f267"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a25104d039a549c8d457ecea3b55369ed312f086"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a33c4fcabe6aebe012cd01c8cb851a9ab0a12098"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a393e1727b0decca9f193179765c3a83d7096437"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a5507f06be4735a3a9e416ea986d52c1a6a20909"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a5adf028c902d17dd6a7ddeadabbed2b36420313"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a6aa1237a282ee3a93f2544bb6bb7704e565209e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a871185cabce7b96c9e2f6ffb40d9901c774b335"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a89d0e67bf53e22533a635f103d1fd400969ad56"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/a8d1b4e5672a501d7a6cd14b2929297f3a82e035"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/aa614cc8d05a3a58c30a890c10b9a0c1d609b228"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/aa65320376f63805cc82b247612b2e05b87bdbee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/abd3f6e2cc8887942de20e1c257427b825aed0ad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ad0653a3a63675a7ce797e69b4673866b88ace33"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ae2ce27806f67312e0d0e29a492db9ab9cb9bf4e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ae4c0e671bd004165a1e7877d9c67249a165d2df"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/af75c24dff7e22948ed141c763a1309e6f540bcc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/b0f228c6d0cbbc9f10117f344d5aae6f001d00fa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/b2c6eab05580b85cda591093d3f05c44bf453fce"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/b35281c0aae174d1ddc8999d97b9713f8004f285"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/b484ae40795cf9730ba94d5a4ca40aa47b88eacb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/b49c2fed1417a981ba29b32be73ee1700bea7ec9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/b68542373c05c0ed25231d09955b2c699d37c45b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/b6d42cbe913f7275b574a71f0768781bdb6f45b7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/b80b6c2cae83c2097c7e4c1fb181d47cb8fd0519"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/b90ab62d8591182fd90cd21cdb893178d97f7e0e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ba45c93ee6b8b286798d8791ec049207c448f7cd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ba67e81ef0f9a14bf5a1ca228bff87c681e83a44"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/bbd1f06ddee4fbbd0e5c9c915889862e5df34f9c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/bd982feb5dd4362e6bd9746ed216c25ce2749df4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/be77053335e6496288fcf8b6c4d0b4abf86493ff"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/bfb53203499969fac4f4be48e1bcd9235c2fa101"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c143576bdb5b34ad89fa3319507ae382a721f587"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c1ac502a15c53a90a1934f4a31d30f93db36dc8a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c1b29883768551fa5aadc38ba6eaad8007b9b85b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c2331fe0660ab5e411f6d38968c706aed390d8f6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c32647119c244cc018bb1863853d5c7bd37090df"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c4098733900c27861bbf74a71afcbbd93d62f8ee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c4f5769bf3b4f2a55c006b4cf5a3bba44b347241"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c6ea7b2d47402a458d5d03235bb042b61e05b2e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c7255dc48b42d44f6c0676d6009051b7e1aa885b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c7d77af55176ae0ae5e59f46e48e1e6ea108d799"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c80827341dcdf1c21b303b82ec7e6df7eaf63f3d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c9501031a75c067b6602e2831f03421b87be4496"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/c98f88d962dfbc2a83e08bfbd8a87b0cc5a8b330"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ccd33fa22b2983978f9617b3cde76ea05b683c2c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/cd0e7701fd79879c56f680817a0d2705751b1f44"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/cd1c2b5c2684d831aab5265e9cd6f1ee045dab9b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/cf98e8b01e7a759f28a9c5f59c896317d74ac47c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/d1d171589e035be85dc347278f0735151a342d68"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/d243143bf9b8adf6be92a157428ec6cbfd785423"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/d2cd278979f2842ebd890f1d84712750273ad0fc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/d2e96eb2699c7dd4a183f13d3a063a1aa9c192fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/d3178f8b0d26275667c27bb8533a61643213e4d8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/d46f536ea4b601c0ff313a5eb5b47e2b55aa9eb0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/d4be3038631eac422022ee23f43b47905a15b2b5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/d56b30a2d1b5a2a13ae00392bcb4ca72085310d9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/d67f85948143218d11e2fb7936a119741036045d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/d6930ea81dfd91856a06a0c16483e47616642b4b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/d737c10038a92add90e2ebea5c174ed249de8018"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/d758a67f018b176dfc7d29630cf8cb587f5b2a6b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/dc7139105787f3ba67d7971d80796e9cf5786a91"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/dc8ec35f43e994b9c4ac61275d6b934990d42181"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/dd2694fe12a018bc6af6f288b5c22a030eec8049"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/de7424f44508582a953f137195533b7a0191eda7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/de91a02040d792dfcb71a4cb5aa4c1c006201273"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/deb576067b11f6e2a3a39b0f2ef38ddae5c67b18"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/df58248c414f342c81e056b40bee12d17a08bf61"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/e076020b2826abd3a4b960fb33a35fd7d0606dd8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/e0bcf682342967c002621acd2563a2157826d156"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/e1edca08a7654b42a64647abb0e773eddddb580b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/e2fa528289b5971f5b40b3687a2a6f0d17348de6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/e52af0ba8750572b98f3a8968de77811ddff0893"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/e5a0f40647f805b5001645ce2d94505e72fa64f3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/e69762f0c6a2750c0b03503a6aec90ffc94bcb72"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/e7064f0b80f61dbc65915311032d27baa569ae2a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/e863a4420854c36168d2b8dd39ce474ebe11cd26"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/e8993f97bb9c83f87c64cfc429095eeaccf32953"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/e9875d9a54b3ebc57df4da886cd30a39252ac666"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/e98a9d92bbbac9b1e64c0641e967adebd681b2aa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/eb7c31f48c77b742fa29126ac78a2c06c41208e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ec174492517f988010ed3ddbd003cb388f477bb6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ec4d6a393be7ec80ccb8c531337a7fc3ef140e66"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ecd40909ab5e2c61841d9fb95b8aacc87651100c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ed17c8ddb6cc8a0b653dc87aca999d31e80c781a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ee0b476126bb1c2249b299323718ecef1250645e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ee1fb6a0b4139c07f1cf6bce850eaac9a2db29ba"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/eeac145c017ed35305f0ae69f820fc41e26e7997"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/efac7390c6e3a653d3ce93c3d6902f2f1c281ce0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/f0f0dace93d51cd8e045aeacca89424fc836eebc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/f3341b8cc55c0bb6e2d0a1f7f06d68e4f04057f5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/f59ff56e341b94f2bddfd718b48ae9ab1692d720"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/f5a1824b9fd9f124df8097017607bcfa00eccfce"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/f5b92b69853a5d123bffdc6b0ab093f767ec30ad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/f6aea4c380e41ddef2489ee581ab35e17fa3e8dd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/f7b7254a3af7c41cb86e4b23bb93c5a6d55e2583"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/f7bdc1b174f53a49c6ef8f8cdb9b8e74e0a5d4ab"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/f98c78c028baf22f39c77faf6e70edb86ac1d927"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/fb440171bca6ff922727e9ff2a4ac40d8d7905ff"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/fc76cc4030b422e4cb5c145c3e8ed122e242acf0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/fcab3b80624b431e464dc12d3b6da1cf538bd15e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/fdb3a9b59798d7e851d9074db69422b1d2df38dd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/fe5de5f387e31b029d589d9b1777fd0d6b3e47b3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/nanopb/corpus_serverlist/ff52d938aaa10c08b2eb0830fc0066c3b57e040f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "nanopb_fuzzer_serverlist_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "nanopb_fuzzer_serverlist_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/04cb8ccc553f9b2f5e52c421aff6d1c954d3dae6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/0dd8f3a63745b3a2d39791559b5c1b311447b537"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/17eeaca784409adbe43365c32ac87915d736bba3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/2040c1ff65f52a7ae668c2c8f324de5dacc9d695"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/26b0d1da23027ae54db96e125e4a9e98842d77fb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/2a089c0db45acdb4c6ed8e7ff81ca7235792c0b9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/35b7b3bc3a740d5c3abca0d75b53f0e1e1ee998a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/36367ba1adba47a1cbc3a88707fde8cc7abdc248"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/39c2ba51548a0beaf0d6d1164531f1447dc311b5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/56d08fea787c041395c6697ce26cfbc0decbe688"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/678d981fdabb9f0d6640235cf1719dd1e1e66ae9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/68751961609ec010565de0aa87521dcbf0722c5d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/7875c06c6f03c9aa2f8e9c59f8d8957c8a32e759"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/7b302090e090a5829b6d1dd7be30bd4e36a7e60f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/875e1022169c9e4c541a9ad894e69e989df22ba1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/8c1051ce066f5a26de9a9d133180621d0da957b4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/8e084e628ab83a18ac7ca7cb3506525263655c63"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/9d316c4675f40ddccaf8f1cc7aea94170b1e4223"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/ad1c7c11d18a7d116e2c2ef4d4c5afb1270836ae"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/b471f94aa4facf502e622e4a248f1ba4063ae681"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/bf52ece030f16136d46e0dc97f58d60a0d8a1f0b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/clusterfuzz-testcase-minimized-grpc_percent_decode_fuzzer-5652313562808320"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/d5b2a7177339ba2b7ce2f60e5f4459bef1e72758"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/de867b64c54a7ed773dc611fc5cd2f17c5433113"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/e3948dbe004950591630dd5c52f4e0fcbd5e388a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/e7064f0b80f61dbc65915311032d27baa569ae2a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_decode_corpus/xyz"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_decode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_decode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/0d3ee7fa54e6c66103965fd4409b044ba7db6c3f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/2e7ccf75e27b9501e3b28cf1c50ed0c45ab7c226"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/55bb859f3942c462b03b7cbcf22ab4a0ac9705cf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/56070cecd54c845b6d4334953b17b712eb000d93"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/61f50e891bf7ff5eb7a7af206f1e25d77f8756e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/6e0c60cefc704c7940e475a87dd9ae423061cb5a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/7271ebcc6d22a0f186f7bc3c1973a7ed1bec8d8e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/74c83ece3e2920a67593a9be9c82468f16cbb969"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/98e004fd2a9f141a7a019720820080e12d637c06"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/ba2c1e98227aa21ea3bb2ca4d0e504119717da8b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/c16b9fd45370d4afb5d3ebd307a6e263c25ffd45"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/d58c3cd4eab9b6d2343abfa1c25c90a383fe0ec3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/e2619218ede30d2b7b8ecd601a9f0ae754b728b4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/f93b3653e453f0e3eea3198001be6ce46e64bd21"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/fd41d029c7682ad3d1c40a9fd017a4c85b673a54"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/slice/percent_encode_corpus/xyz"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "percent_encode_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "percent_encode_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/01c008fa.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/021ec59f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/023517819bc642abe41d8735112fcacaf018c0cc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/02918e4ad9e8928845f232c0cb043057add3c9a9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0336e1ff71939de9e2007fdb4aba891e35a37488"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/033dd2f6.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0384345c.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/03a304b82629155af693978c2b53439e553f6450"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/03a72675e1969f836094f1ecfec2a7b34418e306"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/03b9be1fa172dff5d1543be079b9c64fa2c9a278"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0416afd6875d9ba55f1e5f86a6456a5445d5e576"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/052c8f28e5884bb48f0d504461272cd3a5893215"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/05551028437699c8650f5d08eb5f95ee25adf436"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/05c3a0390d0f52d241728926fa901599a47e4606"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/05efe6d81ce606557691432634e81f61e68b0b81"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/06285b50669cc16463db009ac821f99cf1ec2e24"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/06bd2f82fefb9943787d63ea359f9b77072380c2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0766afc7c27c06ea18d896083470d587a380de3c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/07ad7e0ea2aaecba37f2429a64e946fc6e2556f1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/07c96c06eddbed5a3ce050436bc805f6821cbc9b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/081e56ce6f6b1c57adb806fbc5baa9f93f87513a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/08492d3d0994005206d1d3213b8747d1026ae1eb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/084e9e02b8f2ed41ff9c22fef80e522e491227c5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/08c42ef29eff83052c5887855f2fa3e07ebe470c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/09938e3256d06a8e168eb038d8a58b8462f7f697"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0aa599e20761777c2cb9b41cd89e5c2e18f82d9e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0aa7b949.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0ab8698b211ee696f35f20a25c27e9429235fa41"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0abd533e.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0b275a7f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0c129f78eacfb0d0d3c89dd4e578724096a3cea0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0c413d2b361b2221585026d42f3046ff4135d2ff"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0d10bb63.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0e349b8762703d080b3a696600e21d64c23a2ed3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0f700e05.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/0ff4d220.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/10724098.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/108e270a272e312fc97ec23004b80fdc7bad3906"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/11516d58.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/11cda3f70be4b507ea936bca93af9ce5aaab3be7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/11e90d0f3ecbf72ad5027051d476a31b8d7e0671"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/129382aa11fa2922053fa47ba691dddb98901260"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/13501419f349b7855d2e94060bd08b28923d1f37"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1353e447b7b10fb3eabb02863a1fc5bc9bb50460"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1421a8e9f045ac65a0f6938fae93fece1060c41d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/146b7d66ad932c4b623eec8004e286d3705697d3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/14f9a0cda0d64590430218aaf6dedd9be2a3533f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/15ae78a8543a4794a27e6c79b0d34540322b97fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/15afdcf2cadb93f56dbe36233d8cd7ea9d2bd6fe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1650b19093c56a1e86ee192bd9cd8d2266a9e353"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/16753235697083ecc45c117287f1d8ce6ad1ad1a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1703a8f0c3b3c9dda9eba8d3850e69536436d57a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/17d7c718ec2597353a5dd2c78d6717a3d6aabfae"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/18d8d274aa7c163fd6d0084d5c25c8623e10c541"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/18f00b5f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1928c455f3685f4abe7a04697f571ab864cae02e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1939a9021aba59ea2e49d3d0909e6fdf86ac3f9e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1a69d5fc.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1aa6897b6eebb8c68c972cc5025b39c7e60c17fe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1ba889ea1543297824e99e641e6ca8b91f45732e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1cf17783de9e662f3720847f2d83d86dcdcab500"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1cfdde7a.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1d614f3d6b826f844178a77094bedb534748a362"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1e92aaa5.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1ea5651f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/1f992057.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/20fd12d3670571283dc0c5dbb3fc139a8e943790"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/21475569.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/218c1b123428a07622570947e9b7cdb48c310ca5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/21a2dcda.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/22ad891a.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/23c582f6e23c7bbc9ae7b039b3b4e2ccdea3d5d2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/23f261e44d54a2736f6e288128d98db9e5015206"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2463aea879c5ab49f8409d0e5c062c7e086b034b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/24ed80095e58199c52997f174046272f61ce4a8d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/25ab638f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/26048c58bd5f2a94843f6fd1e4ab0be04b232636"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/26870785fd0564f552af4e0ca418738a85b21086"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2701d1669c2996c097a74c5255d569615357b916"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/27ac2ae2.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2814d70c.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/282b6585.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/29a8346696d6f0962072714b9626966c81dcef0c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2a688fd507072e1cfa2e3bc58652a7cd82dface3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2abe64b96e5e72adcf2dcc43444a69d0fb664b66"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2ad6cedd32cd646ba8e25226c7c13a107c1d6447"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2b14c6e618ec95754ea7e24fe6bc5a3a97df6897"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2b40aa21723c7e67e92e74a3083df008461d591c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2bf69fe6b40734cc3f0abdd765757809b14b0b88"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2c4c7e2ed6d977ec119b040b328ad09808909a70"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2c6660ba.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2cc6d1f3ee8933518e91b8410781fa6e105b3a15"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2e4805c3.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2f20e2decd09b6f211a5469c67efbada355e6c04"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2f3b1cd6780fe475f76f17e9e36541963d993165"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/2fb017cd4c34f4af183d03c4a219d2bb36ee2dd6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/30bba77d0f420c4f454011476f3c94e31c50c161"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3224e6cd.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/326ec4d5.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3292129aa7f6eba86b70fff64408f18fff895c12"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/32b11997.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/32cecacca27b249bd764f852168036c5f962bd16"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/330ad4b6.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/33b4cf1ac251f0ba0c014005ef8207afe1dea623"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/33e2ecd5c9bbc1f1dcab29d00195e0ab6d04642d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/340b032d39e2b212828a2bd1a97e2b6b81dcd41b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/34bba9e4.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/374262a5acf9cde1f480e7b7254c788e1936a4de"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/37ec9df8.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/38df7e63181cbd045e5af9dbee463360c8254618"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/395aea4fcfea081fc0d2733fff2d14405439fa72"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/39ea47bb.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3aa82376296ab5a33f2921d7705b75b78b683c2d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3b09bf453c6f93983c24c4d5481e55d66213f93a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3b55d09b98e3982d6f80913a792463c3974766db"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3ca5da2f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3d7ef8c7b05f26e914c479dedb1bef5e378d2d94"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3dc665f93db294b9ccb8fcec94bcc2a91f3a04e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3de41f3f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3e2077a4fd2def7b11e618d46245d0aa85824317"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3e3ae35a.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3e787760.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3efcff3d4ca529a89061c05ef9e8035f36d564b1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3f3069cf26f761366f947e025f7049254d555e7f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3fd914fc88fbf1a8804c6715100793d27fefd21d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/3ff171516486f77dda57bec1f757da1691547b9c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/404e234751b01dd0b51f9e7610f787253b074528"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/407607d2.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/40af8d589c76d7912bec06c2ae1f2466065018e7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4123bd764c04385191342ea64918408140313714"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/416160124b3b64fc9355f24dd789b3d1fd097b8b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/418f392319c44d06a018ce4c62569d527829177a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/41b31ef0.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/422708b4.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/422fa704.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4271fbb36e03cee79b21a4a5a65f37ceef58a8cd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/42b0afca.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/43fc6abab9840be5ee614211f17395b5966f6070"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/44516839d35af9ccaf8a2c62f3ce6a723482445e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/44f342a6.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4558ddeb.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/459c0bf6.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/468cf8bf3e31e1013c7c6d2288baac47ff90aa63"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/47563391b73b6ef4bf987014c3e631fe2555a377"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/49cb33cbb60f041e8e99dd718993acd2c3354416"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4aa883d0.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4b7bcb4ae6c0222a1a24d1fb1a5d96519750ca5e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4c412cc1a775cea041fa270483d610afb72f463b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4d55d5ae.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4d982c41efad2242f8c06630c23c68146153b47b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4db3d4075ed27f2a2311f85dd1d6df028cc5d083"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4eb269c3.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4ecfe1be695df0d2489dddb52da8bcdeb6ed779d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4f96a5fba4d11401eb22d4b1e365fbbb2d684f24"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4f97bd97ab5dc6b4c0f62f8459be8a9593dc83b3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/4ff50e49865768323f94116bd98d2314455273cc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/508def44e4d60f237f18a40d7058e58a752a74e1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/51a1abd1.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/52b5478161de7b2eba0f7bfbc29aea985c8d9ee7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/52ecfedca3b2b26e6999b6afc846f3dbd5d35130"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/53d18398c0d484de00afd8d583fe802d55d4da44"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/53de507f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/540ada69.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/5413b531fe06923ddf2c9e3eb958769374bc2445"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/5429f0da.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/5435005f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/546367bfdd2b9464fbfe5d74f55d8cd220accbab"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/54aca6c103dbdf019a2bf45506786c095e470de1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/54d0fc6c.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/552199651d942e7220141a93ec33dd8256210a18"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/55af20415ead0ddd417f37fa91a4c767b749ee34"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/55f6fb1a.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/5780565e.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/57918260.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/5841d898d2cd804f2d6373538e341dfba8a4dfab"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/58b88a24.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/59743fe120be6ae1aed1c02230ee1bb460f621ee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/597fdab5.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/59ce7091c00075943d79e857c01ad1af5f38c78e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/59d0b24d1acd01c749fb4bd6802a5f4dd003ce75"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/59dcfde4.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/5ac92c4a7fb476393f8275fe4b79a2b13e3bcad9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/5d43ac923d7607a16e3d7bf8b838f52622871251"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/5d817877.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/5db8b96291c7ee12141eafc925be845c4f5ea069"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/5e2508e15c79fbe9c2e6c1a393b490356a17efbc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/5f758756.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/5f820fa8d44229219d0b7c4724e3e40a2ace97f4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/609706c57e848ea58d7ca14fe6cc253322f3e8ce"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/61e798bdd49b339983fea4ccfe18efe44afbd69b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/62d05f336176a10a2c339c04d818f23b6e9a2637"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/6499e2db.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/64cdbb31d5eda779d07885fa7881812db7800c05"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/65077d2946cfb822cf92c9dfc44517a34589f277"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/65099066.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/652bfdce.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/65d5ae42e6acb429459a1e1a5fb35f09c0f95de2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/65fd6cb3058ee0baae854cc7859b7c0c1e1c1166"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/6652f7be83a876214affc3f230040757f7db4ea8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/67b04816.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/67ebf074c7f928c4fe32fef44e5c958cf441c93c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/68f564fd8064233897ff704b5955b33a2e29293a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/69891e9f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/6c0ec181e81b915071766762f5d78e9b1ccc9128"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/6c5bb78b51cf5006c92258292de19550985c00ba"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/6c66271b74a11f4e7065a6acbc86e4611e7e0dcc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/6db42d0c5471ac697d82e882c01867b73f71c71f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/6dc4455c.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/6e050e98.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/6f3bd9f33ca05bebe3811f7b3ae6ed112e1e45b9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/6f9d75e1af7ae7010d32872da888a582a25fddb4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/70ebe7f32c63ca8940017eb83e6db4d8b39ee03c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/712300b98afdb5f0d15c657c13cea76841164b13"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/71ab07577909ca4b766f8ea0c6b8ec2bc395fc66"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/72296cf9e1052ced4b60e2053aba9f1a569144e9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/72db978194609ac138bca393650740a3eae8f448"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/7342b3febb07521e39abdf4ee976d16199d51239"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/746715fe.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/76294f12a5974e9f87d8f092d0df5429cf6c0466"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/769f5d079151d1b5cab388c47a74f3c297c18d58"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/7839f12a8410a73d66e191cb5183d36d09a375e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/7a946bf3cd91b63001f2cf3f40c515c747f2ecde"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/7b453adcb9c4bf31dbc448ff32c2bc90ebcbdf0f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/7d25c28298fb4d0fe41209d0d14307e4aa67c59e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/7ddfac7d7845b424bf670070781ca6ff8586c63b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/7df75412d12894fc501bd2d8493fe9e5a753ad88"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/7f15bbce.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/7ffd05db.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/8138b18a9a743659befc2f2b23d23cb9c3086a09"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/8164d3c4af043c47cfd6966873bccd2353d072bf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/81fb19dfcb3c3a18fd9e7c177356479503e75e6f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/82dda42ddde662192ebaa96788945b7673bb486b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/830e3f794c53f7b284eb5c635b2943db9ee9aaee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/8338ebee.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/84a3c6cf853ff318ae163231ce295171a59d5871"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/86478f200fa3602b9859597fd1ae56a04027d7e9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/8694fdefd4ed3d3fdb30fe1d7595f6ea6f5f5054"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/86a19d13cc65790696299c819cac17b14e337647"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/86e6dbf2.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/87155c97c3fc6276f7b8f13b50a50e2307b2d397"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/87e6640111fb02fa4cda7db9c1d51432b3b06212"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/88017b0894db1e6f4e3a6640ffe2876d31a54723"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/8846918f967dd6513040c6d382fcd68ff7099873"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/885fe25a0b441ef46ab176b88771c133e530cb73"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/88e1329b.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/89cd90fb47bb9eb289e8126b26021ee00d572d95"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/8b186384.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/8c04817a75fddd71f13779f2ad5b994f45c333a2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/8c72c3f35e9b9fd168ad9024c953a703f33ae3c1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/8c760938a2a72fa92b27e00e05005e2e4c429359"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/8da521d9.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/8de81717.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/8ec00f45afb097066f47d0bad256a8b856b1efe8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/90224b8e.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/90240c7c.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/9099ac4e83f6460c80b5557c87f653e4c65aa091"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/914ed07570b6441365a3636d05850f7316c7f2a8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/916b825da0ffc46fdb6120b1044e98ae158fce70"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/925011abb99fd56bb0f425ae5e0d92e6d341f804"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/92f1df2266f34a097e96dd22188d8633832d37b1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/93beeba2.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/93c3ffcb7e3bcb5ed7e37a5b3dfb97b43ca42718"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/947f53c0978672e59be452395670fa949a33cb4f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/9540d3ad3fa75bfb95c0d57cefd737611c7069a5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/954337ef.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/95d25ba2e190fafa2b3ca1e1c467b9ef64868962"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/9764015f89a0b7a59f3b5359b0a037b38d6e39d7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/97aed4bd.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/984886f71bcbb9e5c224ca15165d5c21d9daf13e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/986c9ca7db83b2cddbae2a0db2dca87f52277074"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/9953eb28aa1ed661612a4710a9d16a15de4ae353"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/99a1acc96512c1155f91afa378e2345726d307c3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/9a176b6f7e0dc5f681a1788d8954f76fabd08cad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/9a6963b0d0fcb0e91a31748c47c6f0e1e842fea9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/9bf7553a.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/9d2d18fce18c790035d8f67ed798703bdda0a949"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/9d7b307bf4ef07f46b2c99311b4486bf40884b1a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a112d484b70e778835fcd478fd651828720791e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a24bf2dc.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a32be0653ccc65463445b4aaf24a7a1164d5c642"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a357658d.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a3a2b1af.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a40c3ba87b4206142b134f67485859b7c9b7c75c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a5348197.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a5b529754606b96a8c801615ac12a1f6ee5c3f54"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a5cc3762cb2b2cac316c60ddee794016057fb4ff"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a5ccb8f124d8ddb5350b90bc0d6b96db280cb7c9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a7e64803.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a7fac1265a384fe9e45a9ee3d708b79c4e80505e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a8305e9bb4a544eaef27e8bd21b4faabf524a84e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a8b4049240b53947a8bc76cadf8d4ff9a802c783"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a8d229374635fa6f2a75ca1669892e1bc244e719"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a8f2345b2c949e9e32a434c99accf771f405eb65"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a9463428cdc47d37efb6e3c5633d1e5e78911f16"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a9966f7181d08f6a9ff8158736ad77a285d743a6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a9e22d93.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/a9fc296cc61d020bc9afbdd0e7e5e3031e884176"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/aa3c8974.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/aa825693.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/aa8729d7.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/aaafca90a7f59184f3d768a1d6f9093e8f737b8a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/aaf049720c707d4e14e47e7eb31d6a2dda60e66a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/ab41d96d82d2dd3f41cd495c53ea031d7979b47a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/ac4e19c9fe290afc54bbb1e5f6cfe84a9c1f3c29"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/ad810f7f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/ae297426638eb5a0611324f403c3189515274f1b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/aedefcd9bd7fc10b7bf60372da54c43e953523bd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/aefcbc29f2caea5038cda4dbc927cdadd9b844c4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/b06ce623.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/b1128694.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/b220d23a13d98d4815b1f7a3e4fe7dd8672b1c83"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/b28959dd.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/b431df13.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/b5acaa52.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/b74dcd9c2780f145e09a27d2e03119576889a301"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/b7ce4a4f6eea20c0b83d9f7fa8406a0730ee0040"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/b829143b.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/b887097732b9c30719f6c7ea7a7cbac531512a31"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/b924c842.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/bad4f467.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/bc9545cebdcb3af82406a5f0c1b286d28f9d4f5a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/bd63e44a3b004e7ed471c2367c3efae2c58a676d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/be9b6e78.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/bf5e21c32becb5839deeb81e9174cf6478a25473"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/bfb55acd5b66521eb5bd8ce6b57b3b6895883675"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/bfcbffa9.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c004455e9d60bc2fff094e79cd0b38507023e018"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c039ac9a5a570f8fd9064df9320890b885edf9c3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c1188b44.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c12835aa9f3513d3f7179ee4f9976292713f7cb9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c13188118af1634061b6a3947b81618891aeb6a3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c2d2aa1977b17d6e38f906968aa756e98dd09ffa"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c35968bf.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c39c0192d0d4f2b24f05c25a9e669cc091bff9e9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c43d97f2.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c4534867.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c4a71cdd29759b51f9cc54175ad69c44b4ab6eb6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c4e4c7572e005e18d56eac407033da058737a5ab"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c559f565.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c56fada76f5c198232201a608072a1a63e3d3785"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c5ff50ae447ac7a0c8fb3363b2458824d405e64c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c66e84d1.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c6a1d2cc8935808b6e317a69baec1c3cb87cac94"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c7c44b98faa21c8f0645a818a65b60d956d15952"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c8073f5f41970fab4738215e42ec97a4383855e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c81dec02.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/c8812dc8a1ab1592a2d7b71300e1a0a5da6a6382"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/ca843c66c4c4807ccb1615b472c79bc459e5c6cb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/cbb04be69714f81f5cd09e36e8ea4e69ea73d618"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/cc97ece92b72cc2a4d045e16c0e2f2021bc014f8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/cca29902.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/cdba6c45.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/clusterfuzz-testcase-5417405008314368"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/clusterfuzz-testcase-5595941564317696"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/clusterfuzz-testcase-6312731374256128"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-0f4b135c0242669ce425d2662168e9440f8a628d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-239cc27a23827ea53b60ccbaee0ecc64dad2bff0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-41ab0e868e84612275f77118f9e832bc94ff45c5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-73923add5066617ae08f187b79d2639b4fd96138"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-7af5da2a8da23d197d9336e32da72c9ff64c15b3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-7e121dd3be057176369bea160d873040b32a03dc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-901723090ff2042ecc5a008ccd7ae0845c1681cb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-c1f66840627e3bfdedf2e4c225bc4de0c267ed37"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-ccf36bef9318fe6d5e5e1560c5485cdc87d0a701"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-dae0f07934a527989f23f06e630710ff6ca8c809"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-e097bf07afa8e55d7dd5f5df3569e34903ccf9a7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-e34b0a9a428001cb4094a9ebca76329f578811a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/d0f7eebc.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/d2031009d3783fcf083963fa30bb493f7f935541"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/d28155c6c92642c61dfb097f7b2eb1d6ced272c0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/d297b3f84e3dee9f74bf1162718aff66a11a7f5c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/d44d94764e1761cb7278ffe5cb17871abab7ed89"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/d6979f0f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/d6bed9cc3c10338a8c5f41064ff8bec0bbc267ce"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/d8a1d141a9e3876b71c7decbe6e3affccf6de397"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/d9074e68.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/d95556cac07e720909aaf2ac09d876106420463f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/d96da249094db51ea92b1413907abfd27a4f2426"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/da7e44a9.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/dab172ff.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/dad922e2daf84cf039f50cf8636eaa9dbd01ff83"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/db33559d4afb4c32e68525c000fde16a4c3300f5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/dcabac1ef8b197ef39b188bcf5dc470f9749e903"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/dda9643679f8c8b796e64232a7d153e447d64991"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/df5d3cf5f05eab65ef9d385e263780ae73c42b19"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/df80b527a003e47a26099088a283228ec62a61c7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/e021c5b9815f02ee9d1e5a003cbf3500e19db13c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/e0d9a9a7.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/e2652fbb.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/e2c954e1.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/e3bab014.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/e7ad0c4b7d0f289c90a3988309e9e03b78f7eea3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/e7b08e36420fa107f0aee652e62158af85a4ef15"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/e96ad9c17795e52edc810a08d4fc61fe8790002a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/e9bbe2fe47b7b9c2683e7f17f4a33625c6ffbd8c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/e9d96662.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/eb66106b.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/eba8472a.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/ec4949487fa84f0cead39521b51f837af9dc784a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/ed8da77f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/ee64e1ba4897bfd7c6baa1fb72d4c5f83b5654e4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f0387dfdd6b8c925d958113e669ec4a1897034b4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f1121b952e75463cc71137683dc2528f9cbc19b7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f3220426.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f3a092425c89f49b50469d522c99abbdb1b6dedf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f3d084cf20b92a5f026fe7cc6e5af49bde28693d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f4024b01.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f541d27e.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f5424a9d7bd14317b6de7b15587df28bfde8362d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f5c877c4.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f5f0615030439dda162e8862b6bbd09f81f14d81"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f74b9428.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f7bf0d7bb0dd6e1866ccef9fafc3cb295db2f07f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f826100f.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f88ffb7f3066f2706cfcd9be077595e07834cc15"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/f8b46e92c7ceb4c2f2cdcb3452a6d8c58768eaa2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fa202a5f51cd49f8ea5af60c5f403f797c01c504"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fa36b4280d9e28edd81c5e4d192d1a5c2765e5e4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fb3b0d80.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fb84edfa9e8cbddba26a7184e7fdc219bde556c0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fc162db40f87facb73cff20751e23af2e1f5296e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fcb1dea251d1ce74e30351f13a3f71e3debec3d2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fd14bea45ecaf13af0053900edb2f17b71a0bf09"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fd26e0a6.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fd943e69304dffebf47e1e40b0849e12abeee287"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fdf67df81857577361d319e76559c5e85a257b07"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fe17c07ffbaa67f1165938d2578038637b93cf57"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fe1957b9bc7c6bf9d8b6089c422d72a0f444da6e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fe66893c.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fe69ddfa5827dd560bb0b5d4da7d982273f17ef9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/fe740f8c4ffd07f79456c8cee24ef556ee348f55"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/ff227015.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/ff898c08.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/ff902ef808e01b0b2d167c1c7e8e263d6f561941"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/hope.bin"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-0292270056246b7a4ccd2e7d0356665cef307ef2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-03c6f209b2f144734c83d81ed452839d9e244fe9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-082763e16153cb6b8f3f5308cd060e822f475e5a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-098ec93ded3a20e6043d11e9cc6066351e257f8e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-0aa52e00ddd54f8e129430852c2da95650c354b0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-129ecb5e7b80616f36791e3580844e520f2ba7d3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-13501419f349b7855d2e94060bd08b28923d1f37"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-14862768a1fe076896fd37e2543ddd23192a9e3c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-1a3ebf8f8bb0b5a0109a5ef44734cc64170377f9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-1ae0ed17a042aab8a3c3199c83a809b0243d1424"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-1b6c4b5c1949adae3efd5e3264bb32a40eea524e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-1dc659f500e7bee41a4fee4423ade8332c162cc0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-30408c9d13f29804168fc62a0818cc894c6375ae"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-33d8bf197de7131be78244e10fbb0da5055cf266"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-350b5da741597222c98fe86768432507850317f5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-395aea4fcfea081fc0d2733fff2d14405439fa72"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-3991c873ba814d0cd03a67d25fff0c8fe8713aca"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-3cec540a680b108dda1e0a8e0bfb2d44e5a4a4e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-45cf8ac5faa9c7b15baf9281e8d7e0b4e103f0e0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-4c6da955e4c101b81a62b2f8e934d94a62ae534b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-51cdbfa3e97a46ceefde405e6ab087a109c26907"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-523cb1bca5ad56690c618b4ceac7fceca1113b9d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-58f116dfba8d428a01ca596174fca63f4ac523f0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-59f6edc7cf4aeed49b4dc024052db4846d5d7fc8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-60a9f77951c5059616764894e1963d83d478edfe"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-63ebf780ee6c2003eba622686a4bf94c503ad96e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-68ed2d33c9d32f73343c097303c3d5a6a3467c83"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-6d37c5e6d7efee56319b1316725fdc5aee5a52c3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-6e980a9d12c392175b5f66683e608626ae983276"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-7233d53f94386b0339b2c2b01ef2d348f5862f1f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-7281d9eaed0d20b0b6b5e7709c57e78fefe9c315"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-73e0a41066bc09c8e3fbd0dd7628445bcdaabb4a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-84f22ffca68c6e1590a44aa9f6dd0cef1f680c77"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-93cd6b3f9786ee107a0e2d135b40d13f96e652ed"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-97a338fa892093ed5013a76b96b35dd112df3342"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-9a176b6f7e0dc5f681a1788d8954f76fabd08cad"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-9de2e92150e54982d4e502b18f374f8cd8fd453b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a1b2cfcf0997acb13a32fc5c004f57d9e9bc4275"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a1ed26e6f82ca0e81e3f415bd8b0b8b520d3927b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a61a28cf78149518466b87e5463ec5c771dc504e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a877fe99fd0e92721d162bc252bf72a4f67ba1ea"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-aa23c18f6badd88a7bec65e8b04f7801ba624ec6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-adaac86cf1aa1e98e95240c5f92c3708456c3624"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-b281f018cc919301131cf3ed28449cfbd24b6bbf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-ba0016a62a8576a57f000b90c364847ef6b12dcc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-ba17346b8e46e6a05aaa7342a959a7c5ab0f1471"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-ba2b1fde90cc70d9abae22c4c4cb051aae8aa148"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-bd9d24f5c7c915174b6ca9d1a3573e16e0edee12"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-bda43d420a3e5d5228a5f5130207a1f11fc1c81f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-c05c239719a7beeca2c126b7e5ef7251fa615b54"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-c151762e5f37e233142059c1b269ce55434cf6a6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-cacd0e0c5f7d4169085735400100da4d36397185"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-ccafab6afdc6474610023b47bd7b3e1b9ea4647b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-d3c3cba3897fafec97665411ea1f94a89bb4de7b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-d3fcd80cd6f1bb05f5e5084ebb2ee801067863fb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-dc57e96cd02ba32fa4a99c97b6490e9879d30be5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-ddfe613d8791b2d377e14fbdffb18b84a89d49b6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f3c688876395bf7a529f29f7b91532726cf5cbce"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f412afea6b01aa53da919a41a65ffbf9885f2d65"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f67be653815f6c2c10eea55c8009e1167ac9c20b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f6c1042f96e15183dcc13b9658d971cc29426d53"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f9a2773d6502fd4b1ffa73df3c550b0da63af833"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/05cda1e986096f42698ee2d86ab0a4a3f6a6690b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/0f65ef472e8308561c77ada56afd4de5932d950a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/128915cb83e66a736f8a1833c8901eccb81e0656"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/134d3a5e7a1609a583f6282c48ef9b871e0fdc15"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/13fccd43a6b52c62851ea24e8be4f8cfe6c0103d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/171bc6b14b94c72435d2da2e31e9682f12a3f13c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/17dea38d21e9282ecd062466cf287ecf5b30c1cf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/1961eb9d4dd4bf21cbcd9c45a17b1d025eb0d200"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/226ebb5cc16ac42fae3be273de533ac79759ae01"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/2333cf428cb1e2976679ac84e64873bf76c6595e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/2885553a9e6829265d5f44ea4e24fcf7d6513436"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/28bce9a7cb21f3232239b9b71ef568137bf801f4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/2a0286615be426d1e7fd5894aadf1a503df05a0a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/2b4a1f3ebe223d91c042a5e86aff31e460f6cc3f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/2cfbe809bcf53160ecc0109b2df01a8696a226fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/2f770de96db36ef9a71f7eb09b2e8695ac1f0655"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/30ba8ad171657470b5312232387b7da70c387219"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/36548a97a8b847e17a77d1e646c6eb5ec001d84a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/3c442804f73cfe826a609d97c12ef87852742883"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/3dad758011b16a3771376f9af91242953be3e47b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/43b56a1adffaf2c3c994679bf2b6fe6414e13df4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/4446c60ab89c34e5ccc26bec18d7e7d21fe5aec1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/44924b3866956d0668ec65750c3663279ac84a36"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/44e4370a4eafde61f8e7dc7e4542e0ad5ecf5253"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/44fb8c02117ebd75c97e517624c0abc9f9a76aa7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/45d76dd1f0a29fce3f8d289b5177263871eb3f83"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/4fcbf18c4135352539eaf445c26f2f8a5da9b68e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/508ca86c6f4e6ecc30c252ccf74e78256a893b17"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/515d240b860fcd1e77d4a5af291aa4a667d9b609"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/528e9738d5016f01cf59d74f20a8aa3f341ad89e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/54b636a2bb66ccf8247b53ff76a6400e9f1355d0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/5cc337c4b33cd703cd354804530f5b72684260d0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/5ce3ec59111bf328044e41fcf26b3bc542df527e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/5eaac270339f19cfce4eafa2e69d62adf100ad1c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/6129382083353687a5c3acb3d4274b811227bf3d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/616a25f7c4557ef9eb33d4367c6884abc336802d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/6214e558afbfdb8451e49b62619896492f1a8972"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/6c6a6b2ce74acf8a8b90fc0b268ecc7dc992cd60"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/6f72309e1b23b824e9bbb9abf74a014b78be038e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/7137ffad853e4dd76c6d6490f37b36e20de7ede0"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/71c9356b6b6c5a3a07033d0fa4ed417fa74a77e5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/7414938799ed61282f41d5fb1474751ca52b2682"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/75e853eb2ff7e78efb327e114b39baff5a1dd5bb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/7607c92952b4429e350260d8074c3c460468fd49"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/7677373c082fee56d8cdde009d9db5b117a4c8de"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/76abde5c970743f9fb8bc781e46c431dee2aa104"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/77e0b4e2066853df9d32d475b8788e3d7d19329b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/78e66840048ddc3c75e0e4abffbb3109af0d750e"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/7dc620eb45764390c7b106362fc4922227415407"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/82ca7a52d589e9dbae37ebf1c59fac7ad876eb7c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/8997d472f73eec84fea712638abd762818ec92ec"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/933bc3fdc56718d7ac0486c26eecddb6db1c5ba2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/94431bda60ddc175cf86273ddc07cb41ecf45fa1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/94c4272b2bb4fa9178eb4ae7dcf4b796fdcb22ac"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/9551c32a794250fb425005d8faf4bd24475acd41"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/9677da7c82f18cec3e0ed2e78aadd6e590271a52"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/9c2e6291aff608f3f5307a7c80db6b17107f0575"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/9c39dc04c7414ca0bb64fb942422bebe83ed8e8f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/9cc8547d183a4f2ab7022b36376ca4a6230726c6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/9e19e5e77789c34f99bbe1e6de198610d6765806"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/9f0853ccf6912df9fba2d5fc3a1ddece41c377ac"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/a6d521e501322f052df5a81ee622e0e4942ddcda"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/a9dc20f09890403be510357a7665a8f0db2468a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/ac1c60970910880558ae7a2ca2e155cfd7772e05"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/afe36d0187a155fc6e4e5c055c0ed0f3802cf696"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/b12b5fc39edc5407b4a525c414ff6b5e116eee05"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/b5b088c6e3a96f88119a940874ab04cb954797ae"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/b65ad77a43ede3394ba714238829860c4ef4bc9f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/b6f265cad9d47e2ccd17a73a6d309d8898dc5428"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/b7ca5868bca7ae7d1952f44ca966218b26fb7207"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/bd20809eacabadb9bcc77d31e42d3359117b03f2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/c328623c4ce12505a54cf1a7a1606e1db36e870d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/c823e8bd5526d9fe7d51319737f51bd18bdd75e8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/c9394095d86ff36b69d90f7122592bf51cafe7dd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/cdbf0d2ae953bec07a67b7152785b548e55f85a4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/cef06f9c35ee338998703555847d70c26bfc9474"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/cfb40ab8eb7031e978bed2418cdc2f0b8a8d8ec7"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/d30840c3f48f11179ef976ada30477045c6d1e98"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/d5afef69141edc7f4911243cf2deb19c912999cf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/d5cf71396e1a04da1a7ec266957ffd2de29d6a57"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/d6dd8a2b085db5d33ef24b23502293ce1ce906a3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/d7676dcd39b7c7cfaac513a98b56fe4ac8ea27d8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/d8c9e9ef14abc23b36cb493283ba3e2812d9e537"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/d9edb0aa5d2fe4af26ac861770c1530a4075f919"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/da1b52041957334b9ea1371bd2993013118bc82d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/dca7861424c8f92d3720de5c4488454cde1c39df"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/df3755e257d024ef8ab08f6d5cefcf28148ea4b1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/e360a49faefb87d671edb99e777f528f52cac9ae"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/e5e789605744d47e5a5d433bb04db1b413bc91a8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/e6e44a6aa0ece409450c85e43d02c57e338ce1da"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/e8ebd49ee98cf57ca7eb35b6e96ef8866270aac6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/ea0645f46ccd233337a8389b6118db5b0289f040"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/f6f7687df6b7056d3c819c03c9268e22a956b6b5"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/f725caa73aa9467c5e934c49780fc409b36b251c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/f8d3326a860091edd4d60725f96f429d13f3abe6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/f9261344b4049e90e88b5af784dd29b938c5c838"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/f95b97ece3b46815204a8e6d6e94f92ec40a9672"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/f97db29497e4e3225016a6ced837e20a13622f16"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/security/corpus/ssl_server_corpus/ff1a900b12f19772f9a86bd5f560a754cdb18d1a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "ssl_server_fuzzer_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "ssl_server_fuzzer_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/02d156dc5e6f2c11c90c2e06fcee04adf036a342"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/042dc4512fa3d391c5170cf3aa61e6a638f84342"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/0e9bbe975f2027e8c39c89f85f667530368e7d11"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/1155aa6ea7ef262a81a63692513ea395f84dad6f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/13856a5569ffd085a4d5c07af5f8e9310835a118"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/14b57bcbf1e17b1db1de491ef2ba3768f704b7dc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/1794310671a060eead6e5ee66ac978a18ec7e84f"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/1d30b2a79afbaf2828ff42b9a9647e942ba1ab80"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/1fcf5d9c333b70596cf5ba04d1f7affdf445b971"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/23162c8a8936e20b195404c21337ee734d02a6bc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/23f3198b815ca60bdadcaae682b9f965dda387f1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/2ef3893b43f1f60b77b59ce06a6bce9815d78eaf"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/356c3c129e203b5c74550b4209764d74b9caefce"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/396568fc41c8ccb31ec925b4a862e4d29ead1327"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/3b1e7526a99918006b87e499d2beb6c4ac9c3c0c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/3b58860f3451d3e7aad99690a8d39782ca5116fc"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/41963cc10752f70c3af7e3d85868efb097a0ea9c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/47b5228404451fc9d4071fa69192514bb4ce33c1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/56a2da4b2e6fb795243901023ed8d0aa083d1aab"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/574c2f13858a9a6d724654bd913ede9ae3abf822"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/582f789c19033a152094cbf8565f14154a778ddb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/636c5606fc23713a1bae88c8899c0541cfad4fd8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/63fe493b270b17426d77a27cbf3abac5b2c2794a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/655300a902b62662296a8e46bfb04fbcb07182cb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/6ae3acd9d8507b61bf235748026080a4138dba58"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/6b70979a70a038ff6607d6cf85485ee95baf58e6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/7314ab3545a7535a26e0e8aad67caea5534d68b1"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/7ff4d8b8d1ffd0d42c48bbb91e5856a9ec31aecb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/87daa131e0973b77a232a870ed749ef29cf58e6d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/884dcaee2908ffe5f12b65b8eba81016099c4266"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/8d7e944fd5d0ede94097fcc98b47b09a3f9c76cb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/9671149af0b444f59bbdf71340d3441dadd8a7b4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/96c8d266b7dc037288ef305c996608270f72e7fb"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/975536c71ade4800415a7e9c2f1b45c35a6d5ea8"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/99750aa67d30beaea8af565c829d4999aa8cb91b"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/a1140f3f8b5cffc1010221b9a4084a25fb75c1f6"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/a1f0f9b75bb354eb063d7cba4fcfa2d0b88d63de"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/a296eb3d1d436ed7df7195b10aa3c4de3896f98d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/a8b8e66050b424f1b8c07d46f868199fb7f60e38"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/aba1472880406a318ce207ee79815b7acf087757"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/af55baf8c8855e563befdf1eefbcbd46c5ddb8d2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/b3c0bf66c2bf5d24ef1daf4cc5a9d6d5bd0e8bfd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/c28a47409cf5d95bb372238d01e73d8b831408e4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/c3ef1d41888063a08700c3add1e4465aabcf8807"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/c550a76af21f9b9cc92a386d5c8998b26f8f2e4d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/c79721406d0ab80495f186fd88e37fba98637ae9"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/ceb4e2264ba7a8d5be47d276b37ec09489e00245"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/cf4395958f5bfb46fd6f535a39657d016c75114c"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/d46668372b7e20154a89409a7430a28e642afdca"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/d6fe7412a0a1d1c733160246f3fa425f4f97682a"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/dns.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/e241f29957b0e30ec11aaaf91b2339f7015fa5fd"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/ea02d9fea9bad5b89cf353a0169238f584177e71"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/ec4731dddf94ed3ea92ae4d5a71f145ab6e3f6ee"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/ed2f78646f19fc47dd85ff0877c232b71913ece2"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/f6889f4a6350fea1596a3adea5cdac02bd5d1ff3"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/f6f3bd030f0d321efe7c51ca3f057de23509af67"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/f97598cff03306af3c70400608fec47268b5075d"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/f9e1ec1fc642b575bc9955618b7065747f56b101"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/fe0630a3aeed2ec6f474f362e4c839478290d5c4"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/ipv4.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/ipv6.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
-  }, 
+  },
   {
     "args": [
       "test/core/uri/uri_corpus/unix.txt"
-    ], 
+    ],
     "ci_platforms": [
       "linux"
-    ], 
-    "cpu_cost": 0.1, 
+    ],
+    "cpu_cost": 0.1,
     "exclude_configs": [
       "tsan"
-    ], 
+    ],
     "exclude_iomgrs": [
       "uv"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "uri_fuzzer_test_one_entry", 
+    ],
+    "flaky": false,
+    "language": "c++",
+    "name": "uri_fuzzer_test_one_entry",
     "platforms": [
-      "mac", 
+      "mac",
       "linux"
-    ], 
+    ],
     "uses_polling": false
   }
 ]
diff --git a/tools/run_tests/python_utils/download_and_unzip.py b/tools/run_tests/python_utils/download_and_unzip.py
new file mode 100644 (file)
index 0000000..e4b574f
--- /dev/null
@@ -0,0 +1,47 @@
+# Copyright 2020 The gRPC Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Download and unzip the target file to the destination."""
+
+from __future__ import print_function
+
+import os
+import sys
+import zipfile
+import requests
+import tempfile
+
+
+def main():
+    if len(sys.argv) != 3:
+        print("Usage: python download_and_unzip.py [zipfile-url] [destination]")
+        sys.exit(1)
+    download_url = sys.argv[1]
+    destination = sys.argv[2]
+
+    with tempfile.TemporaryFile() as tmp_file:
+        r = requests.get(download_url)
+        if r.status_code != requests.codes.ok:
+            print("Download %s failed with [%d] \"%s\"" %
+                  (download_url, r.status_code, r.text()))
+            sys.exit(1)
+        else:
+            tmp_file.write(r.content)
+            print("Successfully downloaded from %s", download_url)
+        with zipfile.ZipFile(tmp_file, 'r') as target_zip_file:
+            target_zip_file.extractall(destination)
+        print("Successfully unzip to %s" % destination)
+
+
+if __name__ == "__main__":
+    main()
index 256611c..64d6c90 100755 (executable)
@@ -157,7 +157,7 @@ class Handler(BaseHTTPRequestHandler):
             self.end_headers()
             p = allocate_port(self)
             self.log_message('allocated port %d' % p)
-            self.wfile.write(bytes('%d' % p))
+            self.wfile.write(str(p).encode('ascii'))
         elif self.path[0:6] == '/drop/':
             self.send_response(200)
             self.send_header('Content-Type', 'text/plain')
@@ -177,7 +177,7 @@ class Handler(BaseHTTPRequestHandler):
             self.send_response(200)
             self.send_header('Content-Type', 'text/plain')
             self.end_headers()
-            self.wfile.write(bytes('%d' % _MY_VERSION))
+            self.wfile.write(str(_MY_VERSION).encode('ascii'))
         elif self.path == '/dump':
             # yaml module is not installed on Macs and Windows machines by default
             # so we import it lazily (/dump action is only used for debugging)
@@ -192,7 +192,7 @@ class Handler(BaseHTTPRequestHandler):
                 'in_use': dict((k, now - v) for k, v in in_use.items())
             })
             mu.release()
-            self.wfile.write(bytes(out))
+            self.wfile.write(out.encode('ascii'))
         elif self.path == '/quitquitquit':
             self.send_response(200)
             self.end_headers()
index 62f57dd..93fec98 100755 (executable)
@@ -287,7 +287,8 @@ if __name__ == "__main__":
 
     if not args.skip_upload:
         # BigQuery sometimes fails with large uploads, so batch 1,000 rows at a time.
-        for i in range((len(bq_rows) / 1000) + 1):
-            _upload_results_to_bq(bq_rows[i * 1000:(i + 1) * 1000])
+        MAX_ROWS = 1000
+        for i in range(0, len(bq_rows), MAX_ROWS):
+            _upload_results_to_bq(bq_rows[i:i + MAX_ROWS])
     else:
         print('Skipped upload to bigquery.')
index b106f67..4f525d5 100755 (executable)
@@ -331,7 +331,7 @@ class GoLanguage:
         return ['go', 'run', 'server.go'] + args
 
     def global_env(self):
-        return {}
+        return {'GO111MODULE': 'on'}
 
     def unimplemented_test_cases(self):
         return _SKIP_COMPRESSION
@@ -501,7 +501,6 @@ class PHP7Language:
     def unimplemented_test_cases(self):
         return _SKIP_SERVER_COMPRESSION + \
             _SKIP_DATA_FRAME_PADDING + \
-            _SKIP_SPECIAL_STATUS_MESSAGE + \
             _SKIP_GOOGLE_DEFAULT_CREDS + \
             _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS
 
index 4df1f7d..ac462df 100755 (executable)
@@ -1100,7 +1100,7 @@ class ObjCLanguage(object):
         out.append(
             self.config.job_spec(
                 ['test/core/iomgr/ios/CFStreamTests/build_and_run_tests.sh'],
-                timeout_seconds=20 * 60,
+                timeout_seconds=60 * 60,
                 shortname='ios-test-cfstream-tests',
                 cpu_cost=1e6,
                 environ=_FORCE_ENVIRON_FOR_WRAPPERS))
@@ -1137,7 +1137,7 @@ class ObjCLanguage(object):
                                  environ={'SCHEME': 'PerfTestsPosix'}))
         out.append(
             self.config.job_spec(['test/cpp/ios/build_and_run_tests.sh'],
-                                 timeout_seconds=30 * 60,
+                                 timeout_seconds=60 * 60,
                                  shortname='ios-cpp-test-cronet',
                                  cpu_cost=1e6,
                                  environ=_FORCE_ENVIRON_FOR_WRAPPERS))
index 0cfa59e..1fca4de 100755 (executable)
@@ -62,7 +62,11 @@ _TEST_CASES = [
 # aren't enabled automatically for all languages.
 #
 # TODO: Move them into _TEST_CASES when support is ready in all languages.
-_ADDITIONAL_TEST_CASES = ['path_matching', 'header_matching']
+_ADDITIONAL_TEST_CASES = [
+    'path_matching',
+    'header_matching',
+    'circuit_breaking',
+]
 
 
 def parse_test_cases(arg):
@@ -124,6 +128,12 @@ argp.add_argument(
     help='Command to launch xDS test client. {server_uri}, {stats_port} and '
     '{qps} references will be replaced using str.format(). GRPC_XDS_BOOTSTRAP '
     'will be set for the command')
+argp.add_argument(
+    '--client_hosts',
+    default=None,
+    help='Comma-separated list of hosts running client processes. If set, '
+    '--client_cmd is ignored and client processes are assumed to be running on '
+    'the specified hosts.')
 argp.add_argument('--zone', default='us-central1-a')
 argp.add_argument('--secondary_zone',
                   default='us-west1-b',
@@ -221,6 +231,10 @@ args = argp.parse_args()
 if args.verbose:
     logger.setLevel(logging.DEBUG)
 
+CLIENT_HOSTS = []
+if args.client_hosts:
+    CLIENT_HOSTS = args.client_hosts.split(',')
+
 _DEFAULT_SERVICE_PORT = 80
 _WAIT_FOR_BACKEND_SEC = args.wait_for_backend_sec
 _WAIT_FOR_OPERATION_SEC = 1200
@@ -281,17 +295,70 @@ _SPONGE_XML_NAME = 'sponge_log.xml'
 
 
 def get_client_stats(num_rpcs, timeout_sec):
-    with grpc.insecure_channel('localhost:%d' % args.stats_port) as channel:
-        stub = test_pb2_grpc.LoadBalancerStatsServiceStub(channel)
-        request = messages_pb2.LoadBalancerStatsRequest()
-        request.num_rpcs = num_rpcs
-        request.timeout_sec = timeout_sec
-        rpc_timeout = timeout_sec + _CONNECTION_TIMEOUT_SEC
-        response = stub.GetClientStats(request,
-                                       wait_for_ready=True,
-                                       timeout=rpc_timeout)
-        logger.debug('Invoked GetClientStats RPC: %s', response)
-        return response
+    if CLIENT_HOSTS:
+        hosts = CLIENT_HOSTS
+    else:
+        hosts = ['localhost']
+    for host in hosts:
+        with grpc.insecure_channel('%s:%d' %
+                                   (host, args.stats_port)) as channel:
+            stub = test_pb2_grpc.LoadBalancerStatsServiceStub(channel)
+            request = messages_pb2.LoadBalancerStatsRequest()
+            request.num_rpcs = num_rpcs
+            request.timeout_sec = timeout_sec
+            rpc_timeout = timeout_sec + _CONNECTION_TIMEOUT_SEC
+            logger.debug('Invoking GetClientStats RPC to %s:%d:', host,
+                         args.stats_port)
+            response = stub.GetClientStats(request,
+                                           wait_for_ready=True,
+                                           timeout=rpc_timeout)
+            logger.debug('Invoked GetClientStats RPC to %s: %s', host, response)
+            return response
+
+
+def get_client_accumulated_stats():
+    if CLIENT_HOSTS:
+        hosts = CLIENT_HOSTS
+    else:
+        hosts = ['localhost']
+    for host in hosts:
+        with grpc.insecure_channel('%s:%d' %
+                                   (host, args.stats_port)) as channel:
+            stub = test_pb2_grpc.LoadBalancerStatsServiceStub(channel)
+            request = messages_pb2.LoadBalancerAccumulatedStatsRequest()
+            logger.debug('Invoking GetClientAccumulatedStats RPC to %s:%d:',
+                         host, args.stats_port)
+            response = stub.GetClientAccumulatedStats(
+                request, wait_for_ready=True, timeout=_CONNECTION_TIMEOUT_SEC)
+            logger.debug('Invoked GetClientAccumulatedStats RPC to %s: %s',
+                         host, response)
+            return response
+
+
+def configure_client(rpc_types, metadata):
+    if CLIENT_HOSTS:
+        hosts = CLIENT_HOSTS
+    else:
+        hosts = ['localhost']
+    for host in hosts:
+        with grpc.insecure_channel('%s:%d' %
+                                   (host, args.stats_port)) as channel:
+            stub = test_pb2_grpc.XdsUpdateClientConfigureServiceStub(channel)
+            request = messages_pb2.ClientConfigureRequest()
+            request.types.extend(rpc_types)
+            for rpc_type, md_key, md_value in metadata:
+                md = request.metadata.add()
+                md.type = rpc_type
+                md.key = md_key
+                md.value = md_value
+            logger.debug(
+                'Invoking XdsUpdateClientConfigureService RPC to %s:%d: %s',
+                host, args.stats_port, request)
+            stub.Configure(request,
+                           wait_for_ready=True,
+                           timeout=_CONNECTION_TIMEOUT_SEC)
+            logger.debug('Invoked XdsUpdateClientConfigureService RPC to %s',
+                         host)
 
 
 class RpcDistributionError(Exception):
@@ -339,6 +406,60 @@ def wait_until_all_rpcs_go_to_given_backends(backends,
                                    allow_failures=False)
 
 
+def wait_until_rpcs_in_flight(rpc_type, timeout_sec, num_rpcs, threshold):
+    '''Block until the test client reaches the state with the given number
+    of RPCs being outstanding stably.
+
+    Args:
+      rpc_type: A string indicating the RPC method to check for. Either
+        'UnaryCall' or 'EmptyCall'.
+      timeout_sec: Maximum number of seconds to wait until the desired state
+        is reached.
+      num_rpcs: Expected number of RPCs to be in-flight.
+      threshold: Number within [0,100], the tolerable percentage by which
+        the actual number of RPCs in-flight can differ from the expected number.
+    '''
+    if threshold < 0 or threshold > 100:
+        raise ValueError('Value error: Threshold should be between 0 to 100')
+    threshold_fraction = threshold / 100.0
+    start_time = time.time()
+    error_msg = None
+    logger.debug(
+        'Waiting for %d sec until %d %s RPCs (with %d%% tolerance) in-flight' %
+        (timeout_sec, num_rpcs, rpc_type, threshold))
+    while time.time() - start_time <= timeout_sec:
+        error_msg = _check_rpcs_in_flight(rpc_type, num_rpcs, threshold,
+                                          threshold_fraction)
+        if error_msg:
+            time.sleep(2)
+        else:
+            break
+    # Ensure the number of outstanding RPCs is stable.
+    if not error_msg:
+        time.sleep(5)
+        error_msg = _check_rpcs_in_flight(rpc_type, num_rpcs, threshold,
+                                          threshold_fraction)
+    if error_msg:
+        raise Exception("Wrong number of %s RPCs in-flight: %s" %
+                        (rpc_type, error_msg))
+
+
+def _check_rpcs_in_flight(rpc_type, num_rpcs, threshold, threshold_fraction):
+    error_msg = None
+    stats = get_client_accumulated_stats()
+    rpcs_started = stats.num_rpcs_started_by_method[rpc_type]
+    rpcs_succeeded = stats.num_rpcs_succeeded_by_method[rpc_type]
+    rpcs_failed = stats.num_rpcs_failed_by_method[rpc_type]
+    rpcs_in_flight = rpcs_started - rpcs_succeeded - rpcs_failed
+    if rpcs_in_flight < (num_rpcs * (1 - threshold_fraction)):
+        error_msg = ('actual(%d) < expected(%d - %d%%)' %
+                     (rpcs_in_flight, num_rpcs, threshold))
+    elif rpcs_in_flight > (num_rpcs * (1 + threshold_fraction)):
+        error_msg = ('actual(%d) > expected(%d + %d%%)' %
+                     (rpcs_in_flight, num_rpcs, threshold))
+    return error_msg
+
+
 def compare_distributions(actual_distribution, expected_distribution,
                           threshold):
     """Compare if two distributions are similar.
@@ -424,8 +545,8 @@ def test_change_backend_service(gcp, original_backend_service, instance_group,
     original_backend_instances = get_instance_names(gcp, instance_group)
     alternate_backend_instances = get_instance_names(gcp,
                                                      same_zone_instance_group)
-    patch_backend_instances(gcp, alternate_backend_service,
-                            [same_zone_instance_group])
+    patch_backend_service(gcp, alternate_backend_service,
+                          [same_zone_instance_group])
     wait_for_healthy_backends(gcp, original_backend_service, instance_group)
     wait_for_healthy_backends(gcp, alternate_backend_service,
                               same_zone_instance_group)
@@ -437,7 +558,7 @@ def test_change_backend_service(gcp, original_backend_service, instance_group,
                                                  _WAIT_FOR_URL_MAP_PATCH_SEC)
     finally:
         patch_url_map_backend_service(gcp, original_backend_service)
-        patch_backend_instances(gcp, alternate_backend_service, [])
+        patch_backend_service(gcp, alternate_backend_service, [])
 
 
 def test_gentle_failover(gcp,
@@ -452,7 +573,7 @@ def test_gentle_failover(gcp,
         if num_primary_instances < min_instances_for_gentle_failover:
             resize_instance_group(gcp, primary_instance_group,
                                   min_instances_for_gentle_failover)
-        patch_backend_instances(
+        patch_backend_service(
             gcp, backend_service,
             [primary_instance_group, secondary_instance_group])
         primary_instance_names = get_instance_names(gcp, primary_instance_group)
@@ -488,7 +609,7 @@ def test_gentle_failover(gcp,
         else:
             raise e
     finally:
-        patch_backend_instances(gcp, backend_service, [primary_instance_group])
+        patch_backend_service(gcp, backend_service, [primary_instance_group])
         resize_instance_group(gcp, primary_instance_group,
                               num_primary_instances)
         instance_names = get_instance_names(gcp, primary_instance_group)
@@ -508,10 +629,10 @@ def test_remove_instance_group(gcp, backend_service, instance_group,
                                same_zone_instance_group):
     logger.info('Running test_remove_instance_group')
     try:
-        patch_backend_instances(gcp,
-                                backend_service,
-                                [instance_group, same_zone_instance_group],
-                                balancing_mode='RATE')
+        patch_backend_service(gcp,
+                              backend_service,
+                              [instance_group, same_zone_instance_group],
+                              balancing_mode='RATE')
         wait_for_healthy_backends(gcp, backend_service, instance_group)
         wait_for_healthy_backends(gcp, backend_service,
                                   same_zone_instance_group)
@@ -538,13 +659,13 @@ def test_remove_instance_group(gcp, backend_service, instance_group,
                     same_zone_instance_names, _WAIT_FOR_STATS_SEC)
                 remaining_instance_group = instance_group
                 remaining_instance_names = instance_names
-        patch_backend_instances(gcp,
-                                backend_service, [remaining_instance_group],
-                                balancing_mode='RATE')
+        patch_backend_service(gcp,
+                              backend_service, [remaining_instance_group],
+                              balancing_mode='RATE')
         wait_until_all_rpcs_go_to_given_backends(remaining_instance_names,
                                                  _WAIT_FOR_BACKEND_SEC)
     finally:
-        patch_backend_instances(gcp, backend_service, [instance_group])
+        patch_backend_service(gcp, backend_service, [instance_group])
         wait_until_all_rpcs_go_to_given_backends(instance_names,
                                                  _WAIT_FOR_BACKEND_SEC)
 
@@ -591,7 +712,7 @@ def test_secondary_locality_gets_no_requests_on_partial_primary_failure(
         'Running secondary_locality_gets_no_requests_on_partial_primary_failure'
     )
     try:
-        patch_backend_instances(
+        patch_backend_service(
             gcp, backend_service,
             [primary_instance_group, secondary_instance_group])
         wait_for_healthy_backends(gcp, backend_service, primary_instance_group)
@@ -625,7 +746,7 @@ def test_secondary_locality_gets_no_requests_on_partial_primary_failure(
         else:
             raise e
     finally:
-        patch_backend_instances(gcp, backend_service, [primary_instance_group])
+        patch_backend_service(gcp, backend_service, [primary_instance_group])
 
 
 def test_secondary_locality_gets_requests_on_primary_failure(
@@ -636,7 +757,7 @@ def test_secondary_locality_gets_requests_on_primary_failure(
         swapped_primary_and_secondary=False):
     logger.info('Running secondary_locality_gets_requests_on_primary_failure')
     try:
-        patch_backend_instances(
+        patch_backend_service(
             gcp, backend_service,
             [primary_instance_group, secondary_instance_group])
         wait_for_healthy_backends(gcp, backend_service, primary_instance_group)
@@ -670,7 +791,7 @@ def test_secondary_locality_gets_requests_on_primary_failure(
         else:
             raise e
     finally:
-        patch_backend_instances(gcp, backend_service, [primary_instance_group])
+        patch_backend_service(gcp, backend_service, [primary_instance_group])
 
 
 def prepare_services_for_urlmap_tests(gcp, original_backend_service,
@@ -686,8 +807,8 @@ def prepare_services_for_urlmap_tests(gcp, original_backend_service,
     logger.info('waiting for original backends to become healthy')
     wait_for_healthy_backends(gcp, original_backend_service, instance_group)
 
-    patch_backend_instances(gcp, alternate_backend_service,
-                            [same_zone_instance_group])
+    patch_backend_service(gcp, alternate_backend_service,
+                          [same_zone_instance_group])
     logger.info('waiting for alternate to become healthy')
     wait_for_healthy_backends(gcp, alternate_backend_service,
                               same_zone_instance_group)
@@ -776,7 +897,7 @@ def test_traffic_splitting(gcp, original_backend_service, instance_group,
                 break
     finally:
         patch_url_map_backend_service(gcp, original_backend_service)
-        patch_backend_instances(gcp, alternate_backend_service, [])
+        patch_backend_service(gcp, alternate_backend_service, [])
 
 
 def test_path_matching(gcp, original_backend_service, instance_group,
@@ -883,7 +1004,7 @@ def test_path_matching(gcp, original_backend_service, instance_group,
                     break
     finally:
         patch_url_map_backend_service(gcp, original_backend_service)
-        patch_backend_instances(gcp, alternate_backend_service, [])
+        patch_backend_service(gcp, alternate_backend_service, [])
 
 
 def test_header_matching(gcp, original_backend_service, instance_group,
@@ -953,7 +1074,166 @@ def test_header_matching(gcp, original_backend_service, instance_group,
                     break
     finally:
         patch_url_map_backend_service(gcp, original_backend_service)
-        patch_backend_instances(gcp, alternate_backend_service, [])
+        patch_backend_service(gcp, alternate_backend_service, [])
+
+
+def test_circuit_breaking(gcp, original_backend_service, instance_group,
+                          same_zone_instance_group):
+    '''
+    Since backend service circuit_breakers configuration cannot be unset,
+    which causes trouble for restoring validate_for_proxy flag in target
+    proxy/global forwarding rule. This test uses dedicated backend sevices.
+    The url_map and backend services undergoes the following state changes:
+
+    Before test:
+       original_backend_service -> [instance_group]
+       extra_backend_service -> []
+       more_extra_backend_service -> []
+
+       url_map -> [original_backend_service]
+
+    In test:
+       extra_backend_service (with circuit_breakers) -> [instance_group]
+       more_extra_backend_service (with circuit_breakers) -> [same_zone_instance_group]
+
+       url_map -> [extra_backend_service, more_extra_backend_service]
+
+    After test:
+       original_backend_service -> [instance_group]
+       extra_backend_service (with circuit_breakers) -> []
+       more_extra_backend_service (with circuit_breakers) -> []
+
+       url_map -> [original_backend_service]
+    '''
+    logger.info('Running test_circuit_breaking')
+    additional_backend_services = []
+    try:
+        # TODO(chengyuanzhang): Dedicated backend services created for circuit
+        # breaking test. Once the issue for unsetting backend service circuit
+        # breakers is resolved or configuring backend service circuit breakers is
+        # enabled for config validation, these dedicated backend services can be
+        # eliminated.
+        extra_backend_service_name = _BASE_BACKEND_SERVICE_NAME + '-extra' + gcp_suffix
+        more_extra_backend_service_name = _BASE_BACKEND_SERVICE_NAME + '-more-extra' + gcp_suffix
+        extra_backend_service = add_backend_service(gcp,
+                                                    extra_backend_service_name)
+        additional_backend_services.append(extra_backend_service)
+        more_extra_backend_service = add_backend_service(
+            gcp, more_extra_backend_service_name)
+        additional_backend_services.append(more_extra_backend_service)
+        # The config validation for proxyless doesn't allow setting
+        # circuit_breakers. Disable validate validate_for_proxyless
+        # for this test. This can be removed when validation
+        # accepts circuit_breakers.
+        logger.info('disabling validate_for_proxyless in target proxy')
+        set_validate_for_proxyless(gcp, False)
+        extra_backend_service_max_requests = 500
+        more_extra_backend_service_max_requests = 1000
+        patch_backend_service(gcp,
+                              extra_backend_service, [instance_group],
+                              circuit_breakers={
+                                  'maxRequests':
+                                      extra_backend_service_max_requests
+                              })
+        logger.info('Waiting for extra backends to become healthy')
+        wait_for_healthy_backends(gcp, extra_backend_service, instance_group)
+        patch_backend_service(gcp,
+                              more_extra_backend_service,
+                              [same_zone_instance_group],
+                              circuit_breakers={
+                                  'maxRequests':
+                                      more_extra_backend_service_max_requests
+                              })
+        logger.info('Waiting for more extra backend to become healthy')
+        wait_for_healthy_backends(gcp, more_extra_backend_service,
+                                  same_zone_instance_group)
+        extra_backend_instances = get_instance_names(gcp, instance_group)
+        more_extra_backend_instances = get_instance_names(
+            gcp, same_zone_instance_group)
+        route_rules = [
+            {
+                'priority': 0,
+                # UnaryCall -> extra_backend_service
+                'matchRules': [{
+                    'fullPathMatch': '/grpc.testing.TestService/UnaryCall'
+                }],
+                'service': extra_backend_service.url
+            },
+            {
+                'priority': 1,
+                # EmptyCall -> more_extra_backend_service
+                'matchRules': [{
+                    'fullPathMatch': '/grpc.testing.TestService/EmptyCall'
+                }],
+                'service': more_extra_backend_service.url
+            },
+        ]
+
+        # Make client send UNARY_CALL and EMPTY_CALL.
+        configure_client([
+            messages_pb2.ClientConfigureRequest.RpcType.UNARY_CALL,
+            messages_pb2.ClientConfigureRequest.RpcType.EMPTY_CALL
+        ], [])
+        logger.info('Patching url map with %s', route_rules)
+        patch_url_map_backend_service(gcp,
+                                      extra_backend_service,
+                                      route_rules=route_rules)
+        logger.info('Waiting for traffic to go to all backends')
+        wait_until_all_rpcs_go_to_given_backends(
+            extra_backend_instances + more_extra_backend_instances,
+            _WAIT_FOR_STATS_SEC)
+
+        # Make all calls keep-open.
+        configure_client([
+            messages_pb2.ClientConfigureRequest.RpcType.UNARY_CALL,
+            messages_pb2.ClientConfigureRequest.RpcType.EMPTY_CALL
+        ], [(messages_pb2.ClientConfigureRequest.RpcType.UNARY_CALL,
+             'rpc-behavior', 'keep-open'),
+            (messages_pb2.ClientConfigureRequest.RpcType.EMPTY_CALL,
+             'rpc-behavior', 'keep-open')])
+        wait_until_rpcs_in_flight(
+            'UNARY_CALL', (_WAIT_FOR_BACKEND_SEC +
+                           int(extra_backend_service_max_requests / args.qps)),
+            extra_backend_service_max_requests, 1)
+        wait_until_rpcs_in_flight(
+            'EMPTY_CALL',
+            (_WAIT_FOR_BACKEND_SEC +
+             int(more_extra_backend_service_max_requests / args.qps)),
+            more_extra_backend_service_max_requests, 1)
+
+        # Increment circuit breakers max_requests threshold.
+        extra_backend_service_max_requests = 800
+        patch_backend_service(gcp,
+                              extra_backend_service, [instance_group],
+                              circuit_breakers={
+                                  'maxRequests':
+                                      extra_backend_service_max_requests
+                              })
+        wait_until_rpcs_in_flight(
+            'UNARY_CALL', (_WAIT_FOR_BACKEND_SEC +
+                           int(extra_backend_service_max_requests / args.qps)),
+            extra_backend_service_max_requests, 1)
+    finally:
+        patch_url_map_backend_service(gcp, original_backend_service)
+        patch_backend_service(gcp, original_backend_service, [instance_group])
+        for backend_service in additional_backend_services:
+            delete_backend_service(gcp, backend_service)
+        set_validate_for_proxyless(gcp, True)
+
+
+def set_validate_for_proxyless(gcp, validate_for_proxyless):
+    if not gcp.alpha_compute:
+        logger.debug(
+            'Not setting validateForProxy because alpha is not enabled')
+        return
+    # This function deletes global_forwarding_rule and target_proxy, then
+    # recreate target_proxy with validateForProxyless=False. This is necessary
+    # because patching target_grpc_proxy isn't supported.
+    delete_global_forwarding_rule(gcp)
+    delete_target_proxy(gcp)
+    create_target_proxy(gcp, gcp.target_proxy.name, validate_for_proxyless)
+    create_global_forwarding_rule(gcp, gcp.global_forwarding_rule.name,
+                                  [gcp.service_port])
 
 
 def get_serving_status(instance, service_port):
@@ -1184,12 +1464,12 @@ def patch_url_map_host_rule_with_port(gcp, name, backend_service, host_name):
     wait_for_global_operation(gcp, result['name'])
 
 
-def create_target_proxy(gcp, name):
+def create_target_proxy(gcp, name, validate_for_proxyless=True):
     if gcp.alpha_compute:
         config = {
             'name': name,
             'url_map': gcp.url_map.url,
-            'validate_for_proxyless': True,
+            'validate_for_proxyless': validate_for_proxyless
         }
         logger.debug('Sending GCP request with body=%s', config)
         result = gcp.alpha_compute.targetGrpcProxies().insert(
@@ -1337,16 +1617,19 @@ def delete_url_map(gcp):
         logger.info('Delete failed: %s', http_error)
 
 
+def delete_backend_service(gcp, backend_service):
+    try:
+        result = gcp.compute.backendServices().delete(
+            project=gcp.project, backendService=backend_service.name).execute(
+                num_retries=_GCP_API_RETRIES)
+        wait_for_global_operation(gcp, result['name'])
+    except googleapiclient.errors.HttpError as http_error:
+        logger.info('Delete failed: %s', http_error)
+
+
 def delete_backend_services(gcp):
     for backend_service in gcp.backend_services:
-        try:
-            result = gcp.compute.backendServices().delete(
-                project=gcp.project,
-                backendService=backend_service.name).execute(
-                    num_retries=_GCP_API_RETRIES)
-            wait_for_global_operation(gcp, result['name'])
-        except googleapiclient.errors.HttpError as http_error:
-            logger.info('Delete failed: %s', http_error)
+        delete_backend_service(gcp, backend_service)
 
 
 def delete_firewall(gcp):
@@ -1397,10 +1680,11 @@ def delete_instance_template(gcp):
         logger.info('Delete failed: %s', http_error)
 
 
-def patch_backend_instances(gcp,
-                            backend_service,
-                            instance_groups,
-                            balancing_mode='UTILIZATION'):
+def patch_backend_service(gcp,
+                          backend_service,
+                          instance_groups,
+                          balancing_mode='UTILIZATION',
+                          circuit_breakers=None):
     if gcp.alpha_compute:
         compute_to_use = gcp.alpha_compute
     else:
@@ -1411,6 +1695,7 @@ def patch_backend_instances(gcp,
             'balancingMode': balancing_mode,
             'maxRate': 1 if balancing_mode == 'RATE' else None
         } for instance_group in instance_groups],
+        'circuitBreakers': circuit_breakers,
     }
     logger.debug('Sending GCP request with body=%s', config)
     result = compute_to_use.backendServices().patch(
@@ -1649,7 +1934,11 @@ try:
     gcp_suffix = args.gcp_suffix
     health_check_name = _BASE_HEALTH_CHECK_NAME + gcp_suffix
     if not args.use_existing_gcp_resources:
-        num_attempts = 5
+        if gcp_suffix:
+            num_attempts = 5
+        else:
+            # If not given a suffix, do not retry if already in use.
+            num_attempts = 1
         for i in range(num_attempts):
             try:
                 logger.info('Using GCP suffix %s', gcp_suffix)
@@ -1720,7 +2009,7 @@ try:
                                  startup_script)
         instance_group = add_instance_group(gcp, args.zone, instance_group_name,
                                             _INSTANCE_GROUP_SIZE)
-        patch_backend_instances(gcp, backend_service, [instance_group])
+        patch_backend_service(gcp, backend_service, [instance_group])
         same_zone_instance_group = add_instance_group(
             gcp, args.zone, same_zone_instance_group_name, _INSTANCE_GROUP_SIZE)
         secondary_zone_instance_group = add_instance_group(
@@ -1750,6 +2039,7 @@ try:
                             bootstrap_server_features)).encode('utf-8'))
                 bootstrap_path = bootstrap_file.name
         client_env['GRPC_XDS_BOOTSTRAP'] = bootstrap_path
+        client_env['GRPC_XDS_EXPERIMENTAL_CIRCUIT_BREAKING'] = 'true'
         test_results = {}
         failed_tests = []
         for test_case in args.test_case:
@@ -1792,20 +2082,21 @@ try:
             # resources).
             fail_on_failed_rpc = ''
 
-            client_cmd_formatted = args.client_cmd.format(
-                server_uri=server_uri,
-                stats_port=args.stats_port,
-                qps=args.qps,
-                fail_on_failed_rpc=fail_on_failed_rpc,
-                rpcs_to_send=rpcs_to_send,
-                metadata_to_send=metadata_to_send)
-            logger.debug('running client: %s', client_cmd_formatted)
-            client_cmd = shlex.split(client_cmd_formatted)
             try:
-                client_process = subprocess.Popen(client_cmd,
-                                                  env=client_env,
-                                                  stderr=subprocess.STDOUT,
-                                                  stdout=test_log_file)
+                if not CLIENT_HOSTS:
+                    client_cmd_formatted = args.client_cmd.format(
+                        server_uri=server_uri,
+                        stats_port=args.stats_port,
+                        qps=args.qps,
+                        fail_on_failed_rpc=fail_on_failed_rpc,
+                        rpcs_to_send=rpcs_to_send,
+                        metadata_to_send=metadata_to_send)
+                    logger.debug('running client: %s', client_cmd_formatted)
+                    client_cmd = shlex.split(client_cmd_formatted)
+                    client_process = subprocess.Popen(client_cmd,
+                                                      env=client_env,
+                                                      stderr=subprocess.STDOUT,
+                                                      stdout=test_log_file)
                 if test_case == 'backends_restart':
                     test_backends_restart(gcp, backend_service, instance_group)
                 elif test_case == 'change_backend_service':
@@ -1844,10 +2135,13 @@ try:
                     test_header_matching(gcp, backend_service, instance_group,
                                          alternate_backend_service,
                                          same_zone_instance_group)
+                elif test_case == 'circuit_breaking':
+                    test_circuit_breaking(gcp, backend_service, instance_group,
+                                          same_zone_instance_group)
                 else:
                     logger.error('Unknown test case: %s', test_case)
                     sys.exit(1)
-                if client_process.poll() is not None:
+                if client_process and client_process.poll() is not None:
                     raise Exception(
                         'Client process exited prematurely with exit code %d' %
                         client_process.returncode)
@@ -1859,8 +2153,12 @@ try:
                 result.state = 'FAILED'
                 result.message = str(e)
             finally:
-                if client_process and not client_process.returncode:
-                    client_process.terminate()
+                if client_process:
+                    if client_process.returncode:
+                        logger.info('Client exited with code %d' %
+                                    client_process.returncode)
+                    else:
+                        client_process.terminate()
                 test_log_file.close()
                 # Workaround for Python 3, as report_utils will invoke decode() on
                 # result.message, which has a default value of ''.
index 69afd08..b73f1f2 100755 (executable)
@@ -35,6 +35,7 @@ git_submodule_hashes = {
 
 _BAZEL_SKYLIB_DEP_NAME = 'bazel_skylib'
 _BAZEL_TOOLCHAINS_DEP_NAME = 'bazel_toolchains'
+_BAZEL_COMPDB_DEP_NAME = 'bazel_compdb'
 _TWISTED_TWISTED_DEP_NAME = 'com_github_twisted_twisted'
 _YAML_PYYAML_DEP_NAME = 'com_github_yaml_pyyaml'
 _TWISTED_INCREMENTAL_DEP_NAME = 'com_github_twisted_incremental'
@@ -48,7 +49,6 @@ _GRPC_DEP_NAMES = [
     'com_google_protobuf',
     'com_google_googletest',
     'rules_cc',
-    'com_github_gflags_gflags',
     'com_github_google_benchmark',
     'com_github_cares_cares',
     'com_google_absl',
@@ -56,6 +56,7 @@ _GRPC_DEP_NAMES = [
     'envoy_api',
     _BAZEL_SKYLIB_DEP_NAME,
     _BAZEL_TOOLCHAINS_DEP_NAME,
+    _BAZEL_COMPDB_DEP_NAME,
     _TWISTED_TWISTED_DEP_NAME,
     _YAML_PYYAML_DEP_NAME,
     _TWISTED_INCREMENTAL_DEP_NAME,
@@ -75,6 +76,7 @@ _GRPC_BAZEL_ONLY_DEPS = [
     'io_opencensus_cpp',
     _BAZEL_SKYLIB_DEP_NAME,
     _BAZEL_TOOLCHAINS_DEP_NAME,
+    _BAZEL_COMPDB_DEP_NAME,
     _TWISTED_TWISTED_DEP_NAME,
     _YAML_PYYAML_DEP_NAME,
     _TWISTED_INCREMENTAL_DEP_NAME,
@@ -149,7 +151,10 @@ build_rules = {
 exec(bazel_file) in build_rules
 for name in _GRPC_DEP_NAMES:
     assert name in names_and_urls.keys()
-assert len(_GRPC_DEP_NAMES) == len(names_and_urls.keys())
+if len(_GRPC_DEP_NAMES) != len(names_and_urls.keys()):
+    assert False, "Diff: " + (str(set(_GRPC_DEP_NAMES) - set(names_and_urls)) +
+                              "," +
+                              str(set(names_and_urls) - set(_GRPC_DEP_NAMES)))
 
 # There are some "bazel-only" deps that are exceptions to this sanity check,
 # we don't require that there is a corresponding git module for these.
index 9558ab2..0c63d09 100755 (executable)
@@ -26,13 +26,12 @@ want_submodules=$(mktemp /tmp/submXXXXXX)
 
 git submodule | awk '{ print $1 }' | sort > "$submodules"
 cat << EOF | awk '{ print $1 }' | sort > "$want_submodules"
df3ea785d8c30a9503321a3d35ee7d35808f190d third_party/abseil-cpp (heads/master)
0f3bb466b868b523cf1dc9b2aaaed65c77b28862 third_party/abseil-cpp (heads/master)
  090faecb454fbd6e6e17a75ef8146acb037118d4 third_party/benchmark (v1.5.0)
  73594cde8c9a52a102c4341c244c833aa61b9c06 third_party/bloaty (remotes/origin/wide-14-g73594cd)
88aeb757f1a415c71fb4cbf5af936ecae4bc8179 third_party/boringssl-with-bazel (remotes/origin/master-with-bazel)
29c6e0e27268f5a43e039cd2ed4e849d6b736fc1 third_party/boringssl-with-bazel (remotes/origin/master-with-bazel)
  e982924acee7f7313b4baa4ee5ec000c5e373c30 third_party/cares/cares (cares-1_15_0)
  9997e1137cdb59e622af13e57ca915a2f3c9f84f third_party/envoy-api (heads/master)
- 28f50e0fed19872e0fd50dd23ce2ee8cd759338e third_party/gflags (v2.2.0-5-g30dbc81)
  80ed4d0bbf65d57cc267dfc63bd2584557f11f9b third_party/googleapis (common-protos-1_3_1-915-g80ed4d0bb)
  c9ccac7cb7345901884aabf5d1a786cfa6e2f397 third_party/googletest (6e2f397)
  15ae750151ac9341e5945eb38f8982d59fb99201 third_party/libuv (v1.34.0)
index b94e7b3..9b6d300 100644 (file)
@@ -24,6 +24,9 @@
 - script: tools/distrib/check_pytype.sh
 - script: tools/distrib/clang_format_code.sh
 - script: tools/distrib/clang_tidy_code.sh
+  # ClangTidy needs to run exclusively because it uses files under the bazel output
+  # directory and this will be removed by another bazel invocation.
+  cpu_cost: 1000
 - script: tools/distrib/pylint_code.sh
 - script: tools/distrib/python/check_grpcio_tools.py
 - script: tools/distrib/yapf_code.sh --diff