Allow TraceProcessor to parse ChromeCompositorSchedulerState.
This will parse the provided proto into the args table for now. In future we
could upgrade some columns to full indexed values if they are determined to be
especially useful.
Change-Id: Ic7138fbb9395a1c04b0ab254552998f0d0e7865b
diff --git a/Android.bp b/Android.bp
index 1fe8359..569aea5 100644
--- a/Android.bp
+++ b/Android.bp
@@ -4656,6 +4656,14 @@
],
}
+// GN: //src/trace_processor:descriptors
+filegroup {
+ name: "perfetto_src_trace_processor_descriptors",
+ srcs: [
+ "src/trace_processor/descriptors.cc",
+ ],
+}
+
// GN: //src/trace_processor:lib
filegroup {
name: "perfetto_src_trace_processor_lib",
@@ -4694,7 +4702,6 @@
filegroup {
name: "perfetto_src_trace_processor_metrics_lib",
srcs: [
- "src/trace_processor/metrics/descriptors.cc",
"src/trace_processor/metrics/metrics.cc",
],
}
@@ -4749,6 +4756,7 @@
"src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.cc",
"src/trace_processor/importers/fuchsia/fuchsia_trace_utils.cc",
"src/trace_processor/importers/proto/android_probes_parser.cc",
+ "src/trace_processor/importers/proto/args_table_utils.cc",
"src/trace_processor/importers/proto/graphics_event_parser.cc",
"src/trace_processor/importers/proto/heap_graph_module.cc",
"src/trace_processor/importers/proto/heap_graph_tracker.cc",
@@ -4801,6 +4809,7 @@
"src/trace_processor/ftrace_utils_unittest.cc",
"src/trace_processor/heap_profile_tracker_unittest.cc",
"src/trace_processor/importers/fuchsia/fuchsia_trace_utils_unittest.cc",
+ "src/trace_processor/importers/proto/args_table_utils_unittest.cc",
"src/trace_processor/importers/proto/heap_graph_walker_unittest.cc",
"src/trace_processor/importers/proto/proto_trace_parser_unittest.cc",
"src/trace_processor/importers/systrace/systrace_parser_unittest.cc",
@@ -5549,6 +5558,7 @@
":perfetto_src_trace_processor_common",
":perfetto_src_trace_processor_db_lib",
":perfetto_src_trace_processor_db_unittests",
+ ":perfetto_src_trace_processor_descriptors",
":perfetto_src_trace_processor_lib",
":perfetto_src_trace_processor_metrics_lib",
":perfetto_src_trace_processor_metrics_unittests",
@@ -5767,6 +5777,7 @@
":perfetto_src_protozero_protozero",
":perfetto_src_trace_processor_common",
":perfetto_src_trace_processor_db_lib",
+ ":perfetto_src_trace_processor_descriptors",
":perfetto_src_trace_processor_lib",
":perfetto_src_trace_processor_metrics_lib",
":perfetto_src_trace_processor_sqlite_sqlite",
@@ -5872,6 +5883,7 @@
":perfetto_src_protozero_protozero",
":perfetto_src_trace_processor_common",
":perfetto_src_trace_processor_db_lib",
+ ":perfetto_src_trace_processor_descriptors",
":perfetto_src_trace_processor_lib",
":perfetto_src_trace_processor_metrics_lib",
":perfetto_src_trace_processor_sqlite_sqlite",
diff --git a/BUILD b/BUILD
index 9838258..6db9a3e 100644
--- a/BUILD
+++ b/BUILD
@@ -620,8 +620,6 @@
filegroup(
name = "src_trace_processor_metrics_lib",
srcs = [
- "src/trace_processor/metrics/descriptors.cc",
- "src/trace_processor/metrics/descriptors.h",
"src/trace_processor/metrics/metrics.cc",
"src/trace_processor/metrics/metrics.descriptor.h",
"src/trace_processor/metrics/metrics.h",
@@ -685,6 +683,15 @@
],
)
+# GN target: //src/trace_processor:descriptors
+filegroup(
+ name = "src_trace_processor_descriptors",
+ srcs = [
+ "src/trace_processor/descriptors.cc",
+ "src/trace_processor/descriptors.h",
+ ],
+)
+
# GN target: //src/trace_processor:export_json
filegroup(
name = "src_trace_processor_export_json",
@@ -800,6 +807,9 @@
"src/trace_processor/importers/proto/android_probes_module.h",
"src/trace_processor/importers/proto/android_probes_parser.cc",
"src/trace_processor/importers/proto/android_probes_parser.h",
+ "src/trace_processor/importers/proto/args_table_utils.cc",
+ "src/trace_processor/importers/proto/args_table_utils.h",
+ "src/trace_processor/importers/proto/chrome_compositor_scheduler_state.descriptor.h",
"src/trace_processor/importers/proto/graphics_event_module.h",
"src/trace_processor/importers/proto/graphics_event_parser.cc",
"src/trace_processor/importers/proto/graphics_event_parser.h",
@@ -2487,6 +2497,7 @@
":src_protozero_protozero",
":src_trace_processor_common",
":src_trace_processor_db_lib",
+ ":src_trace_processor_descriptors",
":src_trace_processor_export_json",
":src_trace_processor_lib",
":src_trace_processor_metrics_lib",
@@ -2563,6 +2574,7 @@
":src_protozero_protozero",
":src_trace_processor_common",
":src_trace_processor_db_lib",
+ ":src_trace_processor_descriptors",
":src_trace_processor_export_json",
":src_trace_processor_lib",
":src_trace_processor_metrics_lib",
@@ -2714,6 +2726,7 @@
":src_protozero_protozero",
":src_trace_processor_common",
":src_trace_processor_db_lib",
+ ":src_trace_processor_descriptors",
":src_trace_processor_export_json",
":src_trace_processor_lib",
":src_trace_processor_metrics_lib",
diff --git a/src/perfetto_cmd/perfetto_config.descriptor.h b/src/perfetto_cmd/perfetto_config.descriptor.h
index 0a9d7f8..8e950d5 100644
--- a/src/perfetto_cmd/perfetto_config.descriptor.h
+++ b/src/perfetto_cmd/perfetto_config.descriptor.h
@@ -10,7 +10,7 @@
// This file was autogenerated by tools/gen_binary_descriptors. Do not edit.
// SHA1(tools/gen_binary_descriptors)
-// 192b582ae52bb07b3d3ba66a94bcfd3127a5f42f
+// a6fca0c2012a0bfb620b978f2c0579145cdad174
// SHA1(protos/perfetto/config/perfetto_config.proto)
// 3cad942a7f5da2b1936464abea5d6c3d76525e9e
diff --git a/src/protozero/test/example_proto/test_messages.descriptor.h b/src/protozero/test/example_proto/test_messages.descriptor.h
new file mode 100644
index 0000000..9d0affc
--- /dev/null
+++ b/src/protozero/test/example_proto/test_messages.descriptor.h
@@ -0,0 +1,375 @@
+
+#ifndef SRC_PROTOZERO_TEST_EXAMPLE_PROTO_TEST_MESSAGES_DESCRIPTOR_H_
+#define SRC_PROTOZERO_TEST_EXAMPLE_PROTO_TEST_MESSAGES_DESCRIPTOR_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <array>
+
+// This file was autogenerated by tools/gen_binary_descriptors. Do not edit.
+
+// SHA1(tools/gen_binary_descriptors)
+// a6fca0c2012a0bfb620b978f2c0579145cdad174
+// SHA1(src/protozero/test/example_proto/test_messages.proto)
+// 61c0771c4c18c994996335be97413d944ce8f80d
+
+// This is the proto TestMessages encoded as a ProtoFileDescriptor to allow
+// for reflection without libprotobuf full/non-lite protos.
+
+namespace perfetto {
+
+constexpr std::array<uint8_t, 4181> kTestMessagesDescriptor{
+ {0x0a, 0x66, 0x0a, 0x33, 0x73, 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x65,
+ 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x2f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72,
+ 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x54, 0x72,
+ 0x69, 0x63, 0x6b, 0x79, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x6d,
+ 0x70, 0x6f, 0x72, 0x74, 0x42, 0x02, 0x48, 0x03, 0x0a, 0xcc, 0x01, 0x0a,
+ 0x41, 0x73, 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65,
+ 0x72, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6c, 0x69,
+ 0x62, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x73, 0x2f, 0x67, 0x61, 0x6c, 0x61, 0x78, 0x69, 0x65, 0x73,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x1a, 0x33, 0x73, 0x72, 0x63, 0x2f, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2f, 0x74, 0x65, 0x73,
+ 0x74, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x2f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x69, 0x6d,
+ 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2a, 0x35,
+ 0x0a, 0x06, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x12, 0x0d, 0x0a, 0x09,
+ 0x4d, 0x49, 0x4c, 0x4b, 0x59, 0x5f, 0x57, 0x41, 0x59, 0x10, 0x01, 0x12,
+ 0x0d, 0x0a, 0x09, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x4d, 0x45, 0x44, 0x41,
+ 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x4e, 0x46, 0x4c, 0x4f,
+ 0x57, 0x45, 0x52, 0x10, 0x03, 0x42, 0x02, 0x48, 0x03, 0x50, 0x00, 0x0a,
+ 0xb4, 0x03, 0x0a, 0x2e, 0x73, 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x65,
+ 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x2f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x12, 0x15, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72,
+ 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x73, 0x1a, 0x41, 0x73, 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x7a, 0x65, 0x72, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x65, 0x78,
+ 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
+ 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x73, 0x2f, 0x67, 0x61, 0x6c, 0x61, 0x78, 0x69,
+ 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa1, 0x02, 0x0a,
+ 0x14, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x67, 0x61, 0x6c, 0x61, 0x63, 0x74,
+ 0x69, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x42, 0x0a,
+ 0x0d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x67, 0x61, 0x6c, 0x61,
+ 0x78, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73,
+ 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x47, 0x61, 0x6c,
+ 0x61, 0x78, 0x79, 0x52, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x47,
+ 0x61, 0x6c, 0x61, 0x78, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x72, 0x69,
+ 0x67, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e,
+ 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x12, 0x4c, 0x0a, 0x12, 0x64, 0x65,
+ 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61,
+ 0x6c, 0x61, 0x78, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74,
+ 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x47,
+ 0x61, 0x6c, 0x61, 0x78, 0x79, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69,
+ 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79,
+ 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x18, 0x04,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x12,
+ 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+ 0x42, 0x02, 0x48, 0x03, 0x50, 0x00, 0x0a, 0xe4, 0x1a, 0x0a, 0x34, 0x73,
+ 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f,
+ 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,
+ 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74,
+ 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65,
+ 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x73, 0x1a, 0x2e, 0x73, 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x65,
+ 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x2f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x22, 0x81, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, 0x73,
+ 0x67, 0x61, 0x6c, 0x61, 0x63, 0x74, 0x69, 0x63, 0x50, 0x61, 0x72, 0x63,
+ 0x65, 0x6c, 0x12, 0x45, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x6e,
+ 0x73, 0x67, 0x61, 0x6c, 0x61, 0x63, 0x74, 0x69, 0x63, 0x4d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0c, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x43, 0x6f,
+ 0x64, 0x65, 0x22, 0xf5, 0x06, 0x0a, 0x0a, 0x45, 0x76, 0x65, 0x72, 0x79,
+ 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x65,
+ 0x6c, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x05, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x6e, 0x74,
+ 0x33, 0x32, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f,
+ 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52,
+ 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12,
+ 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x75, 0x69, 0x6e,
+ 0x74, 0x33, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x66,
+ 0x69, 0x65, 0x6c, 0x64, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x21,
+ 0x0a, 0x0c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74,
+ 0x36, 0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x66, 0x69,
+ 0x65, 0x6c, 0x64, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x21, 0x0a,
+ 0x0c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x33,
+ 0x32, 0x18, 0x05, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0b, 0x66, 0x69, 0x65,
+ 0x6c, 0x64, 0x53, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x21, 0x0a, 0x0c,
+ 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34,
+ 0x18, 0x06, 0x20, 0x01, 0x28, 0x12, 0x52, 0x0b, 0x66, 0x69, 0x65, 0x6c,
+ 0x64, 0x53, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x23, 0x0a, 0x0d, 0x66,
+ 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32,
+ 0x18, 0x07, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69, 0x65, 0x6c,
+ 0x64, 0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x12, 0x23, 0x0a, 0x0d,
+ 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36,
+ 0x34, 0x18, 0x08, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0c, 0x66, 0x69, 0x65,
+ 0x6c, 0x64, 0x46, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x12, 0x25, 0x0a,
+ 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65,
+ 0x64, 0x33, 0x32, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0f, 0x52, 0x0d, 0x66,
+ 0x69, 0x65, 0x6c, 0x64, 0x53, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32,
+ 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x73, 0x66,
+ 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x10,
+ 0x52, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x66, 0x69, 0x78, 0x65,
+ 0x64, 0x36, 0x34, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64,
+ 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02,
+ 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x46, 0x6c, 0x6f, 0x61, 0x74,
+ 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x64, 0x6f,
+ 0x75, 0x62, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b,
+ 0x66, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12,
+ 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x6f, 0x6f,
+ 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x66, 0x69, 0x65,
+ 0x6c, 0x64, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x3f, 0x0a, 0x0a, 0x73, 0x6d,
+ 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x33, 0x20, 0x01,
+ 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65,
+ 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x73, 0x2e, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x75, 0x6d,
+ 0x52, 0x09, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x75, 0x6d, 0x12,
+ 0x42, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x65, 0x6e,
+ 0x75, 0x6d, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73,
+ 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67,
+ 0x6e, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0a, 0x73, 0x69, 0x67,
+ 0x6e, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x39, 0x0a, 0x08, 0x62,
+ 0x69, 0x67, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x35, 0x20, 0x01, 0x28,
+ 0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72,
+ 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x73, 0x2e, 0x42, 0x69, 0x67, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x07, 0x62,
+ 0x69, 0x67, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69,
+ 0x65, 0x6c, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0xf4,
+ 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64,
+ 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x69,
+ 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0xf9, 0x03,
+ 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x42,
+ 0x79, 0x74, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74,
+ 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0xd8, 0x04, 0x20, 0x01,
+ 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65,
+ 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x72, 0x79, 0x46, 0x69, 0x65, 0x6c,
+ 0x64, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d,
+ 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d,
+ 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28,
+ 0x05, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x49,
+ 0x6e, 0x74, 0x33, 0x32, 0x22, 0x20, 0x0a, 0x0a, 0x4e, 0x65, 0x73, 0x74,
+ 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x49,
+ 0x4e, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4f, 0x4e, 0x47,
+ 0x10, 0x02, 0x22, 0x9b, 0x02, 0x0a, 0x07, 0x4e, 0x65, 0x73, 0x74, 0x65,
+ 0x64, 0x41, 0x12, 0x45, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,
+ 0x65, 0x64, 0x5f, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74,
+ 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4e,
+ 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65,
+ 0x64, 0x42, 0x52, 0x09, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x41, 0x12, 0x51, 0x0a, 0x0c, 0x73, 0x75, 0x70, 0x65, 0x72, 0x5f, 0x6e,
+ 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e,
+ 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e,
+ 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x2e, 0x4e, 0x65, 0x73, 0x74,
+ 0x65, 0x64, 0x42, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x52,
+ 0x0b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64,
+ 0x1a, 0x76, 0x0a, 0x07, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x12,
+ 0x47, 0x0a, 0x07, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x62, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41,
+ 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x2e, 0x4e, 0x65, 0x73,
+ 0x74, 0x65, 0x64, 0x43, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42,
+ 0x1a, 0x22, 0x0a, 0x07, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x12,
+ 0x17, 0x0a, 0x07, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x43,
+ 0x22, 0x80, 0x02, 0x0a, 0x0f, 0x43, 0x61, 0x6d, 0x65, 0x6c, 0x43, 0x61,
+ 0x73, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0b,
+ 0x66, 0x6f, 0x6f, 0x5f, 0x62, 0x61, 0x72, 0x5f, 0x62, 0x61, 0x7a, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x66, 0x6f, 0x6f, 0x42, 0x61,
+ 0x72, 0x42, 0x61, 0x7a, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x61, 0x72, 0x42,
+ 0x61, 0x7a, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x62, 0x61,
+ 0x72, 0x42, 0x61, 0x7a, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x6f, 0x6f, 0x4d,
+ 0x6f, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6d, 0x6f,
+ 0x6f, 0x4d, 0x6f, 0x6f, 0x12, 0x1e, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x45,
+ 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08,
+ 0x52, 0x0a, 0x75, 0x52, 0x4c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72,
+ 0x12, 0x12, 0x0a, 0x04, 0x58, 0x4d, 0x61, 0x70, 0x18, 0x05, 0x20, 0x01,
+ 0x28, 0x08, 0x52, 0x04, 0x78, 0x4d, 0x61, 0x70, 0x12, 0x21, 0x0a, 0x0d,
+ 0x55, 0x72, 0x4c, 0x45, 0x5f, 0x6e, 0x63, 0x6f, 0x5f, 0x5f, 0x64, 0x65,
+ 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x72, 0x4c,
+ 0x45, 0x4e, 0x63, 0x6f, 0x44, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x09, 0x5f,
+ 0x5f, 0x62, 0x69, 0x67, 0x42, 0x61, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01,
+ 0x28, 0x08, 0x52, 0x07, 0x62, 0x69, 0x67, 0x42, 0x61, 0x6e, 0x67, 0x12,
+ 0x0e, 0x0a, 0x02, 0x55, 0x32, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x02, 0x75, 0x32, 0x12, 0x1a, 0x0a, 0x09, 0x62, 0x61, 0x6e, 0x67, 0x42,
+ 0x69, 0x67, 0x5f, 0x5f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
+ 0x62, 0x61, 0x6e, 0x67, 0x42, 0x69, 0x67, 0x22, 0x8f, 0x01, 0x0a, 0x14,
+ 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74,
+ 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0b,
+ 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18,
+ 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x66,
+ 0x69, 0x65, 0x6c, 0x64, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x27, 0x0a,
+ 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64,
+ 0x33, 0x32, 0x18, 0x02, 0x20, 0x03, 0x28, 0x07, 0x42, 0x02, 0x10, 0x01,
+ 0x52, 0x0c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x46, 0x69, 0x78, 0x65, 0x64,
+ 0x33, 0x32, 0x12, 0x29, 0x0a, 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f,
+ 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x03, 0x20, 0x03,
+ 0x28, 0x10, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x66, 0x69, 0x65, 0x6c,
+ 0x64, 0x53, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x22, 0x82, 0x04,
+ 0x0a, 0x11, 0x54, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x56, 0x31, 0x12, 0x19, 0x0a, 0x08, 0x72,
+ 0x6f, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x05, 0x52, 0x07, 0x72, 0x6f, 0x6f, 0x74, 0x49, 0x6e, 0x74, 0x12, 0x47,
+ 0x0a, 0x05, 0x65, 0x6e, 0x75, 0x6d, 0x7a, 0x18, 0x02, 0x20, 0x03, 0x28,
+ 0x0e, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72,
+ 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x56, 0x31, 0x2e, 0x45, 0x6e, 0x75, 0x6d,
+ 0x7a, 0x5f, 0x56, 0x31, 0x52, 0x05, 0x65, 0x6e, 0x75, 0x6d, 0x7a, 0x12,
+ 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69,
+ 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x6f,
+ 0x6f, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a,
+ 0x72, 0x65, 0x70, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x04,
+ 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x70, 0x53, 0x74, 0x72,
+ 0x69, 0x6e, 0x67, 0x12, 0x44, 0x0a, 0x04, 0x73, 0x75, 0x62, 0x31, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x56, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x56, 0x31, 0x2e,
+ 0x53, 0x75, 0x62, 0x31, 0x5f, 0x56, 0x31, 0x52, 0x04, 0x73, 0x75, 0x62,
+ 0x31, 0x12, 0x4b, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x31, 0x5f, 0x72, 0x65,
+ 0x70, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74,
+ 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x56,
+ 0x31, 0x2e, 0x53, 0x75, 0x62, 0x31, 0x5f, 0x56, 0x31, 0x52, 0x07, 0x73,
+ 0x75, 0x62, 0x31, 0x52, 0x65, 0x70, 0x12, 0x51, 0x0a, 0x09, 0x73, 0x75,
+ 0x62, 0x31, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72,
+ 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x56, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x31,
+ 0x5f, 0x56, 0x31, 0x42, 0x02, 0x28, 0x01, 0x52, 0x08, 0x73, 0x75, 0x62,
+ 0x31, 0x4c, 0x61, 0x7a, 0x79, 0x1a, 0x45, 0x0a, 0x07, 0x53, 0x75, 0x62,
+ 0x31, 0x5f, 0x56, 0x31, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x31,
+ 0x5f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07,
+ 0x73, 0x75, 0x62, 0x31, 0x49, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73,
+ 0x75, 0x62, 0x31, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x31, 0x53, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x22, 0x1c, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d,
+ 0x7a, 0x5f, 0x56, 0x31, 0x12, 0x07, 0x0a, 0x03, 0x4f, 0x4e, 0x45, 0x10,
+ 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x57, 0x4f, 0x10, 0x02, 0x22, 0xa4,
+ 0x07, 0x0a, 0x11, 0x54, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x56, 0x32, 0x12, 0x19, 0x0a, 0x08,
+ 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x05, 0x52, 0x07, 0x72, 0x6f, 0x6f, 0x74, 0x49, 0x6e, 0x74, 0x12,
+ 0x47, 0x0a, 0x05, 0x65, 0x6e, 0x75, 0x6d, 0x7a, 0x18, 0x02, 0x20, 0x03,
+ 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65,
+ 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x56, 0x32, 0x2e, 0x45, 0x6e, 0x75,
+ 0x6d, 0x7a, 0x5f, 0x56, 0x32, 0x52, 0x05, 0x65, 0x6e, 0x75, 0x6d, 0x7a,
+ 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x72,
+ 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72,
+ 0x6f, 0x6f, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a,
+ 0x0a, 0x72, 0x65, 0x70, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18,
+ 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x70, 0x53, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x12, 0x44, 0x0a, 0x04, 0x73, 0x75, 0x62, 0x31,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x56,
+ 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x56, 0x32,
+ 0x2e, 0x53, 0x75, 0x62, 0x31, 0x5f, 0x56, 0x32, 0x52, 0x04, 0x73, 0x75,
+ 0x62, 0x31, 0x12, 0x4b, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x31, 0x5f, 0x72,
+ 0x65, 0x70, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73,
+ 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x54, 0x65, 0x73,
+ 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f,
+ 0x56, 0x32, 0x2e, 0x53, 0x75, 0x62, 0x31, 0x5f, 0x56, 0x32, 0x52, 0x07,
+ 0x73, 0x75, 0x62, 0x31, 0x52, 0x65, 0x70, 0x12, 0x51, 0x0a, 0x09, 0x73,
+ 0x75, 0x62, 0x31, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x07, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65,
+ 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x56, 0x32, 0x2e, 0x53, 0x75, 0x62,
+ 0x31, 0x5f, 0x56, 0x32, 0x42, 0x02, 0x28, 0x01, 0x52, 0x08, 0x73, 0x75,
+ 0x62, 0x31, 0x4c, 0x61, 0x7a, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x72, 0x6f,
+ 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x32, 0x18, 0x0a, 0x20,
+ 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x49, 0x6e, 0x74,
+ 0x56, 0x32, 0x12, 0x44, 0x0a, 0x04, 0x73, 0x75, 0x62, 0x32, 0x18, 0x0b,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72,
+ 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x56, 0x32, 0x2e, 0x53,
+ 0x75, 0x62, 0x32, 0x5f, 0x56, 0x32, 0x52, 0x04, 0x73, 0x75, 0x62, 0x32,
+ 0x12, 0x4b, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x32, 0x5f, 0x72, 0x65, 0x70,
+ 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x56,
+ 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x56, 0x32,
+ 0x2e, 0x53, 0x75, 0x62, 0x32, 0x5f, 0x56, 0x32, 0x52, 0x07, 0x73, 0x75,
+ 0x62, 0x32, 0x52, 0x65, 0x70, 0x12, 0x51, 0x0a, 0x09, 0x73, 0x75, 0x62,
+ 0x32, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x7a, 0x65, 0x72, 0x6f,
+ 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
+ 0x2e, 0x54, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+ 0x69, 0x6e, 0x67, 0x5f, 0x56, 0x32, 0x2e, 0x53, 0x75, 0x62, 0x32, 0x5f,
+ 0x56, 0x32, 0x42, 0x02, 0x28, 0x01, 0x52, 0x08, 0x73, 0x75, 0x62, 0x32,
+ 0x4c, 0x61, 0x7a, 0x79, 0x1a, 0x8b, 0x01, 0x0a, 0x07, 0x53, 0x75, 0x62,
+ 0x31, 0x5f, 0x56, 0x32, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x31,
+ 0x5f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07,
+ 0x73, 0x75, 0x62, 0x31, 0x49, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73,
+ 0x75, 0x62, 0x31, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x31, 0x53, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x31,
+ 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x05, 0x52, 0x09, 0x73, 0x75, 0x62, 0x31, 0x49, 0x6e, 0x74, 0x56, 0x32,
+ 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x31, 0x5f, 0x73, 0x74, 0x72,
+ 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x32, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0c, 0x73, 0x75, 0x62, 0x31, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
+ 0x56, 0x32, 0x1a, 0x45, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x32, 0x5f, 0x56,
+ 0x32, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x32, 0x5f, 0x69, 0x6e,
+ 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x75, 0x62,
+ 0x32, 0x49, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x32,
+ 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x32, 0x53, 0x74, 0x72, 0x69, 0x6e,
+ 0x67, 0x22, 0x2a, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x7a, 0x5f, 0x56,
+ 0x32, 0x12, 0x07, 0x0a, 0x03, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x07,
+ 0x0a, 0x03, 0x54, 0x57, 0x4f, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x54,
+ 0x48, 0x52, 0x45, 0x45, 0x5f, 0x56, 0x32, 0x10, 0x03, 0x2a, 0x25, 0x0a,
+ 0x09, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x09,
+ 0x0a, 0x05, 0x54, 0x4f, 0x5f, 0x42, 0x45, 0x10, 0x01, 0x12, 0x0d, 0x0a,
+ 0x09, 0x4e, 0x4f, 0x54, 0x5f, 0x54, 0x4f, 0x5f, 0x42, 0x45, 0x10, 0x00,
+ 0x2a, 0x3e, 0x0a, 0x0a, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x45, 0x6e,
+ 0x75, 0x6d, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49,
+ 0x56, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x45, 0x55, 0x54,
+ 0x52, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x08, 0x4e, 0x45, 0x47,
+ 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x01, 0x2a, 0x1f, 0x0a, 0x07, 0x42, 0x69, 0x67, 0x45,
+ 0x6e, 0x75, 0x6d, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x45, 0x47, 0x49, 0x4e,
+ 0x10, 0x0a, 0x12, 0x09, 0x0a, 0x03, 0x45, 0x4e, 0x44, 0x10, 0x94, 0x91,
+ 0x06, 0x42, 0x02, 0x48, 0x03}};
+
+} // namespace perfetto
+
+#endif // SRC_PROTOZERO_TEST_EXAMPLE_PROTO_TEST_MESSAGES_DESCRIPTOR_H_
diff --git a/src/trace_processor/BUILD.gn b/src/trace_processor/BUILD.gn
index 0cd6ff5..cc9c087 100644
--- a/src/trace_processor/BUILD.gn
+++ b/src/trace_processor/BUILD.gn
@@ -44,6 +44,20 @@
}
}
+source_set("descriptors") {
+ sources = [
+ "descriptors.cc",
+ "descriptors.h",
+ ]
+ deps = [
+ "../../gn:default_deps",
+ "../../include/perfetto/trace_processor",
+ "../../protos/perfetto/common:zero",
+ "../base",
+ "../protozero:protozero",
+ ]
+}
+
source_set("storage") {
sources = [
"args_tracker.cc",
@@ -70,6 +84,9 @@
"importers/fuchsia/fuchsia_provider_view.h",
"importers/proto/android_probes_module.h",
"importers/proto/android_probes_parser.h",
+ "importers/proto/args_table_utils.cc",
+ "importers/proto/args_table_utils.h",
+ "importers/proto/chrome_compositor_scheduler_state.descriptor.h",
"importers/proto/graphics_event_module.h",
"importers/proto/graphics_event_parser.h",
"importers/proto/heap_graph_module.h",
@@ -121,6 +138,7 @@
deps = [
":common",
+ ":descriptors",
"../../gn:default_deps",
"../../gn:zlib",
"../../protos/perfetto/common:zero",
@@ -364,6 +382,7 @@
"event_tracker_unittest.cc",
"forwarding_trace_parser_unittest.cc",
"heap_profile_tracker_unittest.cc",
+ "importers/proto/args_table_utils_unittest.cc",
"importers/proto/proto_trace_parser_unittest.cc",
"importers/systrace/systrace_parser_unittest.cc",
"null_term_string_view_unittest.cc",
@@ -374,6 +393,7 @@
]
deps = [
":common",
+ ":descriptors",
":storage",
"../../gn:default_deps",
"../../gn:gtest_and_gmock",
@@ -391,6 +411,7 @@
"../../protos/perfetto/trace/track_event:zero",
"../base",
"../protozero",
+ "../protozero:testing_messages_zero",
"db:unittests",
"tables:unittests",
]
diff --git a/src/trace_processor/metrics/descriptors.cc b/src/trace_processor/descriptors.cc
similarity index 83%
rename from src/trace_processor/metrics/descriptors.cc
rename to src/trace_processor/descriptors.cc
index 6e563e2..7e04d32 100644
--- a/src/trace_processor/metrics/descriptors.cc
+++ b/src/trace_processor/descriptors.cc
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "src/trace_processor/metrics/descriptors.h"
+#include "src/trace_processor/descriptors.h"
#include "perfetto/ext/base/string_view.h"
#include "perfetto/protozero/field.h"
@@ -22,7 +22,6 @@
namespace perfetto {
namespace trace_processor {
-namespace metrics {
namespace {
@@ -97,7 +96,8 @@
parent_name + "." + base::StringView(decoder.name()).ToStdString();
using FieldDescriptorProto = protos::pbzero::FieldDescriptorProto;
- ProtoDescriptor proto_descriptor(package_name, full_name, parent_idx);
+ ProtoDescriptor proto_descriptor(package_name, full_name,
+ ProtoDescriptor::Type::kMessage, parent_idx);
for (auto it = decoder.field(); it; ++it) {
FieldDescriptorProto::Decoder f_decoder(*it);
proto_descriptor.AddField(CreateFieldFromDecoder(f_decoder));
@@ -105,11 +105,36 @@
descriptors_.emplace_back(std::move(proto_descriptor));
auto idx = static_cast<uint32_t>(descriptors_.size()) - 1;
+ for (auto it = decoder.enum_type(); it; ++it) {
+ AddEnumProtoDescriptors(package_name, idx, *it);
+ }
for (auto it = decoder.nested_type(); it; ++it) {
AddNestedProtoDescriptors(package_name, idx, *it);
}
}
+void DescriptorPool::AddEnumProtoDescriptors(
+ const std::string& package_name,
+ base::Optional<uint32_t> parent_idx,
+ protozero::ConstBytes descriptor_proto) {
+ protos::pbzero::EnumDescriptorProto::Decoder decoder(descriptor_proto);
+
+ auto parent_name =
+ parent_idx ? descriptors_[*parent_idx].full_name() : package_name;
+ auto full_name =
+ parent_name + "." + base::StringView(decoder.name()).ToStdString();
+
+ ProtoDescriptor proto_descriptor(package_name, full_name,
+ ProtoDescriptor::Type::kEnum, base::nullopt);
+ for (auto it = decoder.value(); it; ++it) {
+ protos::pbzero::EnumValueDescriptorProto::Decoder enum_value(it->data(),
+ it->size());
+ proto_descriptor.AddEnumValue(enum_value.number(),
+ enum_value.name().ToStdString());
+ }
+ descriptors_.emplace_back(std::move(proto_descriptor));
+}
+
util::Status DescriptorPool::AddFromFileDescriptorSet(
const uint8_t* file_descriptor_set_proto,
size_t size) {
@@ -123,6 +148,9 @@
for (auto message_it = file.message_type(); message_it; ++message_it) {
AddNestedProtoDescriptors(package, base::nullopt, *message_it);
}
+ for (auto enum_it = file.enum_type(); enum_it; ++enum_it) {
+ AddEnumProtoDescriptors(package, base::nullopt, *enum_it);
+ }
}
// Second pass: extract all the extension protos and add them to the real
@@ -180,9 +208,11 @@
ProtoDescriptor::ProtoDescriptor(std::string package_name,
std::string full_name,
+ Type type,
base::Optional<uint32_t> parent_id)
: package_name_(std::move(package_name)),
full_name_(std::move(full_name)),
+ type_(type),
parent_id_(parent_id) {}
FieldDescriptor::FieldDescriptor(std::string name,
@@ -196,6 +226,5 @@
raw_type_name_(std::move(raw_type_name)),
is_repeated_(is_repeated) {}
-} // namespace metrics
} // namespace trace_processor
} // namespace perfetto
diff --git a/src/trace_processor/metrics/descriptors.h b/src/trace_processor/descriptors.h
similarity index 66%
rename from src/trace_processor/metrics/descriptors.h
rename to src/trace_processor/descriptors.h
index e8151bf..7dd6ded 100644
--- a/src/trace_processor/metrics/descriptors.h
+++ b/src/trace_processor/descriptors.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef SRC_TRACE_PROCESSOR_METRICS_DESCRIPTORS_H_
-#define SRC_TRACE_PROCESSOR_METRICS_DESCRIPTORS_H_
+#ifndef SRC_TRACE_PROCESSOR_DESCRIPTORS_H_
+#define SRC_TRACE_PROCESSOR_DESCRIPTORS_H_
#include <algorithm>
#include <string>
@@ -31,7 +31,6 @@
namespace perfetto {
namespace trace_processor {
-namespace metrics {
class FieldDescriptor {
public:
@@ -63,15 +62,27 @@
class ProtoDescriptor {
public:
+ enum class Type { kEnum = 0, kMessage = 1 };
+
ProtoDescriptor(std::string package_name,
std::string full_name,
+ Type type,
base::Optional<uint32_t> parent_id);
void AddField(FieldDescriptor descriptor) {
+ PERFETTO_DCHECK(type_ == Type::kMessage);
fields_.emplace_back(std::move(descriptor));
}
- base::Optional<uint32_t> FindFieldIdx(const std::string& name) const {
+ void AddEnumValue(int32_t integer_representation,
+ std::string string_representation) {
+ PERFETTO_DCHECK(type_ == Type::kEnum);
+ enum_values_.emplace_back(integer_representation,
+ std::move(string_representation));
+ }
+
+ base::Optional<uint32_t> FindFieldIdxByName(const std::string& name) const {
+ PERFETTO_DCHECK(type_ == Type::kMessage);
auto it = std::find_if(
fields_.begin(), fields_.end(),
[name](const FieldDescriptor& desc) { return desc.name() == name; });
@@ -79,6 +90,27 @@
return idx < fields_.size() ? base::Optional<uint32_t>(idx) : base::nullopt;
}
+ base::Optional<uint32_t> FindFieldIdxByTag(const uint16_t tag_number) const {
+ PERFETTO_DCHECK(type_ == Type::kMessage);
+ auto it = std::find_if(fields_.begin(), fields_.end(),
+ [tag_number](const FieldDescriptor& desc) {
+ return desc.number() == tag_number;
+ });
+ auto idx = static_cast<uint32_t>(std::distance(fields_.begin(), it));
+ return idx < fields_.size() ? base::Optional<uint32_t>(idx) : base::nullopt;
+ }
+
+ base::Optional<std::string> FindEnumString(const int32_t value) const {
+ PERFETTO_DCHECK(type_ == Type::kEnum);
+ auto it =
+ std::find_if(enum_values_.begin(), enum_values_.end(),
+ [value](const std::pair<int32_t, std::string>& enum_val) {
+ return enum_val.first == value;
+ });
+ return it == enum_values_.end() ? base::nullopt
+ : base::Optional<std::string>(it->second);
+ }
+
const std::string& package_name() const { return package_name_; }
const std::string& full_name() const { return full_name_; }
@@ -89,8 +121,10 @@
private:
std::string package_name_;
std::string full_name_;
+ const Type type_;
base::Optional<uint32_t> parent_id_;
std::vector<FieldDescriptor> fields_;
+ std::vector<std::pair<int32_t, std::string>> enum_values_;
};
class DescriptorPool {
@@ -110,6 +144,9 @@
void AddNestedProtoDescriptors(const std::string& package_name,
base::Optional<uint32_t> parent_idx,
protozero::ConstBytes descriptor_proto);
+ void AddEnumProtoDescriptors(const std::string& package_name,
+ base::Optional<uint32_t> parent_idx,
+ protozero::ConstBytes descriptor_proto);
util::Status AddExtensionField(const std::string& package_name,
protozero::ConstBytes field_desc_proto);
@@ -122,8 +159,7 @@
std::vector<ProtoDescriptor> descriptors_;
};
-} // namespace metrics
} // namespace trace_processor
} // namespace perfetto
-#endif // SRC_TRACE_PROCESSOR_METRICS_DESCRIPTORS_H_
+#endif // SRC_TRACE_PROCESSOR_DESCRIPTORS_H_
diff --git a/src/trace_processor/importers/proto/args_table_utils.cc b/src/trace_processor/importers/proto/args_table_utils.cc
new file mode 100644
index 0000000..d784bd3
--- /dev/null
+++ b/src/trace_processor/importers/proto/args_table_utils.cc
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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/trace_processor/importers/proto/args_table_utils.h"
+
+#include "protos/perfetto/common/descriptor.pbzero.h"
+#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
+#include "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.pbzero.h"
+#include "protos/perfetto/trace/track_event/source_location.pbzero.h"
+
+namespace perfetto {
+namespace trace_processor {
+
+ProtoToArgsTable::ProtoToArgsTable(PacketSequenceState* sequence_state,
+ size_t sequence_state_generation,
+ TraceProcessorContext* context,
+ std::string starting_prefix,
+ size_t prefix_size_hint)
+ : state_{context->args_tracker.get(), context, sequence_state,
+ sequence_state_generation, RowId(0)},
+ prefix_(std::move(starting_prefix)) {
+ prefix_.reserve(prefix_size_hint);
+}
+
+util::Status ProtoToArgsTable::AddProtoFileDescriptor(
+ const uint8_t* proto_descriptor_array,
+ size_t proto_descriptor_array_size) {
+ return pool_.AddFromFileDescriptorSet(proto_descriptor_array,
+ proto_descriptor_array_size);
+}
+
+util::Status ProtoToArgsTable::InternProtoIntoArgsTable(
+ const protozero::ConstBytes& cb,
+ const std::string& type,
+ RowId row) {
+ state_.row_id = row;
+ return InternProtoIntoArgsTableInternal(cb, type, row, &prefix_);
+}
+
+util::Status ProtoToArgsTable::InternProtoIntoArgsTableInternal(
+ const protozero::ConstBytes& cb,
+ const std::string& type,
+ RowId row,
+ std::string* prefix) {
+ // Given |type| field the proto descriptor for this proto message.
+ auto opt_proto_descriptor_idx = pool_.FindDescriptorIdx(type);
+ if (!opt_proto_descriptor_idx) {
+ return util::Status("Failed to find proto descriptor");
+ }
+ auto proto_descriptor = pool_.descriptors()[*opt_proto_descriptor_idx];
+
+ // Parse this message field by field until there are no bytes left.
+ protozero::ProtoDecoder decoder(cb.data, cb.size);
+ for (auto field = decoder.ReadField(); field.valid();
+ field = decoder.ReadField()) {
+ auto opt_field_descriptor_idx =
+ proto_descriptor.FindFieldIdxByTag(field.id());
+ if (!opt_field_descriptor_idx) {
+ // Since the binary descriptor is compiled in it is possible we're seeing
+ // a new message that our descriptors don't have. Just skip the field.
+ continue;
+ }
+ const auto& field_descriptor =
+ proto_descriptor.fields()[*opt_field_descriptor_idx];
+
+ // In the args table we build up message1.message2.field1 as the column
+ // name. This will append the ".field1" suffix to |prefix| and then remove
+ // it when it goes out of scope.
+ ScopedStringAppender scoped_prefix(field_descriptor.name(), prefix);
+
+ // If we have an override parser then use that instead and move onto the
+ // next loop.
+ auto it = FindOverride(*prefix);
+ if (it != overrides_.end()) {
+ if (it->second(state_, field)) {
+ continue;
+ }
+ }
+
+ // If this is not a message we can just immediately add the column name and
+ // get the value out of |field|. However if it is a message we need to
+ // recurse into it.
+ if (field_descriptor.type() ==
+ protos::pbzero::FieldDescriptorProto::TYPE_MESSAGE) {
+ auto status = InternProtoIntoArgsTableInternal(
+ field.as_bytes(), field_descriptor.resolved_type_name(), row, prefix);
+ if (!status.ok()) {
+ return status;
+ }
+ } else {
+ const StringId id =
+ state_.context->storage->InternString(base::StringView(*prefix));
+ state_.args_tracker->AddArg(
+ row, id, id, ConvertProtoTypeToVariadic(field_descriptor, field));
+ }
+ }
+ PERFETTO_DCHECK(decoder.bytes_left() == 0);
+ return util::OkStatus();
+}
+
+void ProtoToArgsTable::AddParsingOverride(std::string field,
+ ParsingOverride func) {
+ overrides_.emplace_back(std::move(field), func);
+}
+
+ProtoToArgsTable::OverrideIterator ProtoToArgsTable::FindOverride(
+ const std::string& field) {
+ return std::find_if(
+ overrides_.begin(), overrides_.end(),
+ [&field](const std::pair<std::string, ParsingOverride>& overrides) {
+ return overrides.first == field;
+ });
+}
+
+Variadic ProtoToArgsTable::ConvertProtoTypeToVariadic(
+ const FieldDescriptor& descriptor,
+ const protozero::Field& field) {
+ using FieldDescriptorProto = protos::pbzero::FieldDescriptorProto;
+ switch (descriptor.type()) {
+ case FieldDescriptorProto::TYPE_INT32:
+ case FieldDescriptorProto::TYPE_SFIXED32:
+ case FieldDescriptorProto::TYPE_FIXED32:
+ return Variadic::Integer(field.as_int32());
+ case FieldDescriptorProto::TYPE_SINT32:
+ return Variadic::Integer(field.as_sint32());
+ case FieldDescriptorProto::TYPE_INT64:
+ case FieldDescriptorProto::TYPE_SFIXED64:
+ case FieldDescriptorProto::TYPE_FIXED64:
+ return Variadic::Integer(field.as_int64());
+ case FieldDescriptorProto::TYPE_SINT64:
+ return Variadic::Integer(field.as_sint64());
+ case FieldDescriptorProto::TYPE_UINT32:
+ return Variadic::UnsignedInteger(field.as_uint32());
+ case FieldDescriptorProto::TYPE_UINT64:
+ return Variadic::UnsignedInteger(field.as_uint64());
+ case FieldDescriptorProto::TYPE_BOOL:
+ return Variadic::Boolean(field.as_bool());
+ case FieldDescriptorProto::TYPE_DOUBLE:
+ return Variadic::Real(field.as_double());
+ case FieldDescriptorProto::TYPE_FLOAT:
+ return Variadic::Real(static_cast<double>(field.as_float()));
+ case FieldDescriptorProto::TYPE_STRING:
+ return Variadic::String(
+ state_.context->storage->InternString(field.as_string()));
+ case FieldDescriptorProto::TYPE_ENUM: {
+ auto opt_enum_descriptor_idx =
+ pool_.FindDescriptorIdx(descriptor.resolved_type_name());
+ if (!opt_enum_descriptor_idx) {
+ // Fall back to the integer representation of the field.
+ return Variadic::Integer(field.as_int32());
+ }
+ auto opt_enum_string =
+ pool_.descriptors()[*opt_enum_descriptor_idx].FindEnumString(
+ field.as_int32());
+ if (!opt_enum_string) {
+ // Fall back to the integer representation of the field.
+ return Variadic::Integer(field.as_int32());
+ }
+ return Variadic::String(state_.context->storage->InternString(
+ base::StringView(*opt_enum_string)));
+ }
+ default: {
+ PERFETTO_FATAL(
+ "Tried to write value of type field %s (in proto type "
+ "%s) which has type enum %d",
+ descriptor.name().c_str(), descriptor.resolved_type_name().c_str(),
+ descriptor.type());
+ }
+ }
+ return Variadic{};
+}
+
+ProtoToArgsTable::ScopedStringAppender::ScopedStringAppender(
+ const std::string& append,
+ std::string* dest)
+ : old_size_(dest->size()), str_(dest) {
+ if (dest->empty()) {
+ str_->reserve(append.size());
+ } else {
+ str_->reserve(old_size_ + 1 + append.size());
+ str_->append(".");
+ }
+ str_->append(append);
+}
+
+ProtoToArgsTable::ScopedStringAppender::~ScopedStringAppender() {
+ str_->erase(old_size_);
+}
+
+} // namespace trace_processor
+} // namespace perfetto
diff --git a/src/trace_processor/importers/proto/args_table_utils.h b/src/trace_processor/importers/proto/args_table_utils.h
new file mode 100644
index 0000000..d7caf9b
--- /dev/null
+++ b/src/trace_processor/importers/proto/args_table_utils.h
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_ARGS_TABLE_UTILS_H_
+#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_ARGS_TABLE_UTILS_H_
+
+#include "perfetto/protozero/proto_decoder.h"
+#include "perfetto/trace_processor/status.h"
+#include "src/trace_processor/args_tracker.h"
+#include "src/trace_processor/descriptors.h"
+#include "src/trace_processor/importers/proto/packet_sequence_state.h"
+#include "src/trace_processor/trace_storage.h"
+
+namespace perfetto {
+namespace trace_processor {
+
+// ProtoToArgsTable encapsulates the process of taking an arbitary proto and
+// assocating each field as a column in an args set. This is done by traversing
+// the proto using reflection (with descriptors provided by
+// AddProtoFileDescriptor()) and creating column names equal to this traversal.
+//
+// I.E. given a proto like
+//
+// package perfetto.protos;
+// message SubMessage {
+// optional int32 field = 1;
+// }
+// message MainMessage {
+// optional int32 field1 = 1;
+// optional string field2 = 2;
+// optional SubMessage field3 = 3;
+// }
+//
+// We will get the args set columns "field1", "field2", "field3.field" and will
+// store the values found inside as the result.
+//
+// Usage of this is as follows:
+//
+// ProtoToArgsTable helper( /* provide current parsing state */ ...);
+// helper.AddProtoFileDescriptor(
+// /* provide descriptor generated by tools/gen_binary_descriptors */);
+// helper.InternProtoIntoArgs(const_bytes, ".perfetto.protos.MainMessage",
+// row_id);
+//
+// Optionally one can handle particular fields as well by providing a
+// ParsingOverride through AddParsingOverride.
+//
+// helper.AddParsingOverride("field3.field",
+// [](const ProtoToArgsTable::ParsingOverrideState& state,
+// const protozero::Field& field) {
+// if (!should_handle()) {
+// return false;
+// }
+// // Parse |field| and add any rows for it to args using |state|.
+// return true;
+// });
+class ProtoToArgsTable {
+ public:
+ struct ParsingOverrideState {
+ ArgsTracker* args_tracker;
+ TraceProcessorContext* context;
+ PacketSequenceState* sequence_state;
+ size_t sequence_generation;
+ RowId row_id;
+ };
+ using ParsingOverride = bool (*)(const ParsingOverrideState& state,
+ const protozero::Field&);
+
+ // ScopedStringAppender will add |append| to |dest| when constructed and
+ // erases the appended suffix from |dest| when it goes out of scope. Thus
+ // |dest| must be valid for the entire lifetime of ScopedStringAppender.
+ //
+ // This is useful as we descend into a proto since the column names just
+ // appended with ".field_name" as we go lower.
+ //
+ // I.E. message1.message2.field_name1 is a column, but we'll then need to
+ // append message1.message2.field_name2 afterwards so we only need to append
+ // "field_name1" within some scope. This is public so people implementing a
+ // ParsingOverride can follow this same behaviour.
+ class ScopedStringAppender {
+ public:
+ ScopedStringAppender(const std::string& append, std::string* dest);
+ ~ScopedStringAppender();
+
+ private:
+ size_t old_size_;
+ std::string* str_;
+ };
+
+ // |sequence_state| and |sequence_state_generation| provide access to
+ // interning data. |context| provides access to storage.
+ //
+ // |proto_descriptor_array| and |proto_descriptor_array_size| define the
+ // compile time reflection of the proto we are outputing.
+ // |args_tracker| is the access to the Args table.
+ // |starting_prefix| will be prepended to all columns.
+ // |prefix_size_hint| allows the class to upfront reserve the expected string
+ // size needed.
+ ProtoToArgsTable(PacketSequenceState* sequence_state,
+ size_t sequence_state_generation,
+ TraceProcessorContext* context,
+ std::string starting_prefix = "",
+ size_t prefix_size_hint = 64);
+
+ // Adds a compile time reflection of a set of proto files. You must provide
+ // the descriptor before attempting to parse this with
+ // InternProtoIntoArgsTable().
+ //
+ // To generate |proto_descriptor_array| please see
+ // tools/gen_binary_descriptors and ensure the proto you are interested in is
+ // listed as a whitelisted proto. You can then find your variable inside the
+ // header location specified inside that python script.
+ util::Status AddProtoFileDescriptor(const uint8_t* proto_descriptor_array,
+ size_t proto_descriptor_array_size);
+
+ // Given a view of bytes that represent a serialized protozero message of
+ // |type| we will parse each field into the Args table using RowId |row|.
+ //
+ // Returns on any error with a status describing the problem. However any
+ // added values before encountering the error will be added to the
+ // args_tracker.
+ //
+ // Note:
+ // |type| must be the fully qualified name, but with a '.' added to the
+ // beginning. I.E. ".perfetto.protos.TrackEvent". And must match one of the
+ // descriptors already added through |AddProtoFileDescriptor|.
+ //
+ // IMPORTANT: currently bytes fields are not supported and repeated fields do
+ // not properly use key/flat_key in the args table (they will be equal in
+ // value).
+ //
+ // TODO(b/145578432): Add support for repeated fields and byte fields.
+ util::Status InternProtoIntoArgsTable(const protozero::ConstBytes& cb,
+ const std::string& type,
+ RowId row);
+
+ // Installs an override for the field at the specified path. We will invoke
+ // |parsing_override| when the field is encountered.
+ //
+ // If |parsing_override| returns false we will continue and fallback on
+ // default behaviour. However if it returns true we will assume that it added
+ // all required messages to the args_tracker.
+ //
+ // Note |field_path| must be the full path separated by periods. I.E. in the
+ // proto
+ //
+ // message SubMessage {
+ // optional int32 field = 1;
+ // }
+ // message MainMessage {
+ // optional SubMessage field1 = 1;
+ // optional SubMessage field2 = 2;
+ // }
+ //
+ // To override the handling of both SubMessage fields you must add two parsing
+ // overrides. One with a |field_path| == "field1.field" and another with
+ // "field2.field".
+ void AddParsingOverride(std::string field_path,
+ ParsingOverride parsing_override);
+
+ private:
+ util::Status InternProtoIntoArgsTableInternal(const protozero::ConstBytes& cb,
+ const std::string& type,
+ RowId row,
+ std::string* prefix);
+
+ using OverrideIterator =
+ std::vector<std::pair<std::string, ParsingOverride>>::iterator;
+ OverrideIterator FindOverride(const std::string& field);
+
+ Variadic ConvertProtoTypeToVariadic(const FieldDescriptor& descriptor,
+ const protozero::Field& field);
+
+ ParsingOverrideState state_;
+ std::vector<std::pair<std::string, ParsingOverride>> overrides_;
+ DescriptorPool pool_;
+ std::string prefix_;
+};
+
+} // namespace trace_processor
+} // namespace perfetto
+#endif // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_ARGS_TABLE_UTILS_H_
diff --git a/src/trace_processor/importers/proto/args_table_utils_unittest.cc b/src/trace_processor/importers/proto/args_table_utils_unittest.cc
new file mode 100644
index 0000000..daa1325
--- /dev/null
+++ b/src/trace_processor/importers/proto/args_table_utils_unittest.cc
@@ -0,0 +1,412 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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/trace_processor/importers/proto/args_table_utils.h"
+
+#include "perfetto/ext/base/string_view.h"
+#include "perfetto/protozero/scattered_heap_buffer.h"
+#include "protos/perfetto/common/descriptor.pbzero.h"
+#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
+#include "protos/perfetto/trace/track_event/source_location.pbzero.h"
+#include "src/protozero/test/example_proto/test_messages.descriptor.h"
+#include "src/protozero/test/example_proto/test_messages.pbzero.h"
+#include "src/trace_processor/args_tracker.h"
+#include "src/trace_processor/importers/proto/chrome_compositor_scheduler_state.descriptor.h"
+#include "src/trace_processor/trace_storage.h"
+#include "test/gtest_and_gmock.h"
+
+namespace perfetto {
+namespace trace_processor {
+namespace {
+
+constexpr size_t kChunkSize = 42;
+
+using ::testing::_;
+using ::testing::Eq;
+using ::testing::Invoke;
+using ::testing::NiceMock;
+
+class ArgsTableUtilsTest : public ::testing::Test {
+ protected:
+ ArgsTableUtilsTest() {
+ context_.storage.reset(new TraceStorage);
+ storage_ = context_.storage.get();
+ context_.args_tracker.reset(new ArgsTracker(&context_));
+ sequence_state_.reset(new PacketSequenceState(&context_));
+ }
+
+ bool HasArg(ArgSetId set_id, const base::StringView& key, Variadic value) {
+ const auto& args = storage_->args();
+ auto key_id = storage_->string_pool().GetId(key);
+ EXPECT_TRUE(key_id);
+ auto rows =
+ std::equal_range(args.set_ids().begin(), args.set_ids().end(), set_id);
+ bool found = false;
+ for (; rows.first != rows.second; rows.first++) {
+ size_t index = static_cast<size_t>(
+ std::distance(args.set_ids().begin(), rows.first));
+ if (args.keys()[index] == key_id) {
+ EXPECT_EQ(args.flat_keys()[index], key_id);
+ if (args.flat_keys()[index] == key_id &&
+ args.arg_values()[index] == value) {
+ found = true;
+ break;
+ }
+ }
+ }
+ return found;
+ }
+
+ uint32_t arg_set_id_ = 1;
+ std::unique_ptr<PacketSequenceState> sequence_state_;
+ TraceProcessorContext context_;
+ TraceStorage* storage_;
+};
+
+TEST_F(ArgsTableUtilsTest, EnsureChromeCompositorStateDescriptorParses) {
+ ProtoToArgsTable helper(sequence_state_.get(),
+ sequence_state_->current_generation(), &context_, "",
+ 0);
+ auto status = helper.AddProtoFileDescriptor(
+ kChromeCompositorSchedulerStateDescriptor.data(),
+ kChromeCompositorSchedulerStateDescriptor.size());
+ EXPECT_TRUE(status.ok())
+ << "Failed to parse kChromeCompositorSchedulerStateDescriptor: "
+ << status.message();
+}
+
+TEST_F(ArgsTableUtilsTest, EnsureTestMessageProtoParses) {
+ ProtoToArgsTable helper(sequence_state_.get(),
+ sequence_state_->current_generation(), &context_, "",
+ 0);
+ auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
+ kTestMessagesDescriptor.size());
+ EXPECT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
+ << status.message();
+}
+
+TEST_F(ArgsTableUtilsTest, BasicSingleLayerProto) {
+ using namespace protozero::test::protos::pbzero;
+ protozero::HeapBuffered<EveryField> msg{kChunkSize, kChunkSize};
+ msg->set_field_int32(-1);
+ msg->set_field_int64(-333123456789ll);
+ msg->set_field_uint32(600);
+ msg->set_field_uint64(333123456789ll);
+ msg->set_field_sint32(-5);
+ msg->set_field_sint64(-9000);
+ msg->set_field_fixed32(12345);
+ msg->set_field_fixed64(444123450000ll);
+ msg->set_field_sfixed32(-69999);
+ msg->set_field_sfixed64(-200);
+ msg->set_field_double(0.5555);
+ msg->set_field_bool(true);
+ msg->set_small_enum(SmallEnum::TO_BE);
+ msg->set_signed_enum(SignedEnum::NEGATIVE);
+ msg->set_big_enum(BigEnum::BEGIN);
+ msg->set_nested_enum(EveryField::PONG);
+ msg->set_field_float(3.14f);
+ msg->set_field_string("FizzBuzz");
+ msg->add_repeated_int32(1);
+ msg->add_repeated_int32(-1);
+ msg->add_repeated_int32(100);
+ msg->add_repeated_int32(2000000);
+
+ auto binary_proto = msg.SerializeAsArray();
+
+ storage_->mutable_track_table()->Insert({});
+ ProtoToArgsTable helper(sequence_state_.get(),
+ sequence_state_->current_generation(), &context_, "",
+ 0);
+ auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
+ kTestMessagesDescriptor.size());
+ ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
+ << status.message();
+
+ status = helper.InternProtoIntoArgsTable(
+ protozero::ConstBytes{binary_proto.data(), binary_proto.size()},
+ ".protozero.test.protos.EveryField",
+ TraceStorage::CreateRowId(TableId::kTrack, 0));
+
+ EXPECT_TRUE(status.ok()) << "InternProtoIntoArgsTable failed with error: "
+ << status.message();
+
+ context_.args_tracker->Flush();
+ EXPECT_TRUE(
+ HasArg(ArgSetId(arg_set_id_), "field_int32", Variadic::Integer(-1)));
+ EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "field_int64",
+ Variadic::Integer(-333123456789ll)));
+ EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "field_uint32",
+ Variadic::UnsignedInteger(600)));
+ EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "field_uint64",
+ Variadic::UnsignedInteger(333123456789ll)));
+ EXPECT_TRUE(
+ HasArg(ArgSetId(arg_set_id_), "field_sint32", Variadic::Integer(-5)));
+ EXPECT_TRUE(
+ HasArg(ArgSetId(arg_set_id_), "field_sint64", Variadic::Integer(-9000)));
+ EXPECT_TRUE(
+ HasArg(ArgSetId(arg_set_id_), "field_fixed32", Variadic::Integer(12345)));
+ EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "field_fixed64",
+ Variadic::Integer(444123450000ll)));
+ EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "field_sfixed32",
+ Variadic::Integer(-69999)));
+ EXPECT_TRUE(
+ HasArg(ArgSetId(arg_set_id_), "field_sfixed64", Variadic::Integer(-200)));
+ EXPECT_TRUE(
+ HasArg(ArgSetId(arg_set_id_), "field_double", Variadic::Real(0.5555)));
+ EXPECT_TRUE(
+ HasArg(ArgSetId(arg_set_id_), "field_bool", Variadic::Boolean(true)));
+ EXPECT_TRUE(HasArg(
+ ArgSetId(arg_set_id_), "small_enum",
+ Variadic::String(*context_.storage->string_pool().GetId("TO_BE"))));
+ EXPECT_TRUE(HasArg(
+ ArgSetId(arg_set_id_), "signed_enum",
+ Variadic::String(*context_.storage->string_pool().GetId("NEGATIVE"))));
+ EXPECT_TRUE(HasArg(
+ ArgSetId(arg_set_id_), "big_enum",
+ Variadic::String(*context_.storage->string_pool().GetId("BEGIN"))));
+ EXPECT_TRUE(
+ HasArg(ArgSetId(arg_set_id_), "nested_enum",
+ Variadic::String(*context_.storage->string_pool().GetId("PONG"))));
+ EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "field_float",
+ Variadic::Real(static_cast<double>(3.14f))));
+ ASSERT_TRUE(context_.storage->string_pool().GetId("FizzBuzz"));
+ EXPECT_TRUE(HasArg(
+ ArgSetId(arg_set_id_), "field_string",
+ Variadic::String(*context_.storage->string_pool().GetId("FizzBuzz"))));
+ EXPECT_TRUE(
+ HasArg(ArgSetId(arg_set_id_), "repeated_int32", Variadic::Integer(1)));
+ EXPECT_TRUE(
+ HasArg(ArgSetId(arg_set_id_), "repeated_int32", Variadic::Integer(-1)));
+}
+
+TEST_F(ArgsTableUtilsTest, NestedProto) {
+ using namespace protozero::test::protos::pbzero;
+ protozero::HeapBuffered<NestedA> msg{kChunkSize, kChunkSize};
+ msg->set_super_nested()->set_value_c(3);
+
+ auto binary_proto = msg.SerializeAsArray();
+
+ storage_->mutable_track_table()->Insert({});
+ ProtoToArgsTable helper(sequence_state_.get(),
+ sequence_state_->current_generation(), &context_, "",
+ 0);
+ auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
+ kTestMessagesDescriptor.size());
+ ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
+ << status.message();
+
+ status = helper.InternProtoIntoArgsTable(
+ protozero::ConstBytes{binary_proto.data(), binary_proto.size()},
+ ".protozero.test.protos.NestedA",
+ TraceStorage::CreateRowId(TableId::kTrack, 0));
+ EXPECT_TRUE(status.ok()) << "InternProtoIntoArgsTable failed with error: "
+ << status.message();
+ context_.args_tracker->Flush();
+ EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "super_nested.value_c",
+ Variadic::Integer(3)));
+}
+
+TEST_F(ArgsTableUtilsTest, CamelCaseFieldsProto) {
+ using namespace protozero::test::protos::pbzero;
+ protozero::HeapBuffered<CamelCaseFields> msg{kChunkSize, kChunkSize};
+ msg->set_barbaz(true);
+ msg->set_moomoo(true);
+ msg->set___bigbang(true);
+
+ auto binary_proto = msg.SerializeAsArray();
+
+ storage_->mutable_track_table()->Insert({});
+ ProtoToArgsTable helper(sequence_state_.get(),
+ sequence_state_->current_generation(), &context_, "",
+ 0);
+ auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
+ kTestMessagesDescriptor.size());
+ ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
+ << status.message();
+
+ status = helper.InternProtoIntoArgsTable(
+ protozero::ConstBytes{binary_proto.data(), binary_proto.size()},
+ ".protozero.test.protos.CamelCaseFields",
+ TraceStorage::CreateRowId(TableId::kTrack, 0));
+ EXPECT_TRUE(status.ok()) << "InternProtoIntoArgsTable failed with error: "
+ << status.message();
+ context_.args_tracker->Flush();
+ EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "barBaz", Variadic::Boolean(true)));
+ EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "MooMoo", Variadic::Boolean(true)));
+ EXPECT_TRUE(
+ HasArg(ArgSetId(arg_set_id_), "__bigBang", Variadic::Boolean(true)));
+}
+
+TEST_F(ArgsTableUtilsTest, NestedProtoParsingOverrideHandled) {
+ using namespace protozero::test::protos::pbzero;
+ protozero::HeapBuffered<NestedA> msg{kChunkSize, kChunkSize};
+ msg->set_super_nested()->set_value_c(3);
+
+ auto binary_proto = msg.SerializeAsArray();
+
+ storage_->mutable_track_table()->Insert({});
+ ProtoToArgsTable helper(sequence_state_.get(),
+ sequence_state_->current_generation(), &context_, "",
+ 0);
+ auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
+ kTestMessagesDescriptor.size());
+ ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
+ << status.message();
+
+ helper.AddParsingOverride(
+ "super_nested.value_c",
+ [](const ProtoToArgsTable::ParsingOverrideState& state,
+ const protozero::Field& field) {
+ EXPECT_EQ(field.type(), protozero::proto_utils::ProtoWireType::kVarInt);
+ EXPECT_TRUE(state.args_tracker);
+ EXPECT_TRUE(state.context);
+ EXPECT_TRUE(state.sequence_state);
+ auto id = state.context->storage->InternString(
+ "super_nested.value_b.replaced");
+ int32_t val = field.as_int32();
+ state.args_tracker->AddArg(state.row_id, id, id,
+ Variadic::Integer(val + 1));
+ // We've handled this field by adding the desired args.
+ return true;
+ });
+ status = helper.InternProtoIntoArgsTable(
+ protozero::ConstBytes{binary_proto.data(), binary_proto.size()},
+ ".protozero.test.protos.NestedA",
+ TraceStorage::CreateRowId(TableId::kTrack, 0));
+ EXPECT_TRUE(status.ok()) << "InternProtoIntoArgsTable failed with error: "
+ << status.message();
+ context_.args_tracker->Flush();
+ EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "super_nested.value_b.replaced",
+ Variadic::Integer(4)));
+}
+
+TEST_F(ArgsTableUtilsTest, NestedProtoParsingOverrideSkipped) {
+ using namespace protozero::test::protos::pbzero;
+ protozero::HeapBuffered<NestedA> msg{kChunkSize, kChunkSize};
+ msg->set_super_nested()->set_value_c(3);
+
+ auto binary_proto = msg.SerializeAsArray();
+
+ storage_->mutable_track_table()->Insert({});
+ ProtoToArgsTable helper(sequence_state_.get(),
+ sequence_state_->current_generation(), &context_, "",
+ 0);
+ auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
+ kTestMessagesDescriptor.size());
+ ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
+ << status.message();
+
+ helper.AddParsingOverride(
+ "super_nested.value_c",
+ [](const ProtoToArgsTable::ParsingOverrideState& state,
+ const protozero::Field& field) {
+ static int val = 0;
+ ++val;
+ EXPECT_EQ(1, val);
+ EXPECT_EQ(field.type(), protozero::proto_utils::ProtoWireType::kVarInt);
+ EXPECT_TRUE(state.args_tracker);
+ EXPECT_TRUE(state.sequence_state);
+ EXPECT_TRUE(state.context);
+ // By returning false we expect this field to be handled like regular.
+ return false;
+ });
+ status = helper.InternProtoIntoArgsTable(
+ protozero::ConstBytes{binary_proto.data(), binary_proto.size()},
+ ".protozero.test.protos.NestedA",
+ TraceStorage::CreateRowId(TableId::kTrack, 0));
+ EXPECT_TRUE(status.ok()) << "InternProtoIntoArgsTable failed with error: "
+ << status.message();
+ context_.args_tracker->Flush();
+ EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "super_nested.value_c",
+ Variadic::Integer(3)));
+}
+
+TEST_F(ArgsTableUtilsTest, LookingUpInternedStateParsingOverride) {
+ using namespace protozero::test::protos::pbzero;
+ // The test proto, we will use |value_c| as the source_location iid.
+ protozero::HeapBuffered<NestedA> msg{kChunkSize, kChunkSize};
+ msg->set_super_nested()->set_value_c(3);
+ auto binary_proto = msg.SerializeAsArray();
+
+ // The interned source location.
+ protozero::HeapBuffered<protos::pbzero::SourceLocation> src_loc{kChunkSize,
+ kChunkSize};
+ src_loc->set_iid(3);
+ src_loc->set_file_name("test_file_name");
+ // We need to update sequence_state to point to it.
+ auto binary_data = src_loc.SerializeAsArray();
+ std::unique_ptr<uint8_t[]> buffer(new uint8_t[binary_data.size()]);
+ for (size_t i = 0; i < binary_data.size(); ++i) {
+ buffer.get()[i] = binary_data[i];
+ }
+ TraceBlobView blob(std::move(buffer), 0, binary_data.size());
+ sequence_state_->InternMessage(
+ protos::pbzero::InternedData::kSourceLocationsFieldNumber,
+ std::move(blob));
+
+ ProtoToArgsTable helper(sequence_state_.get(),
+ sequence_state_->current_generation(), &context_, "",
+ 0);
+ // Now we override the behaviour of |value_c| so we can expand the iid into
+ // multiple args rows.
+ helper.AddParsingOverride(
+ "super_nested.value_c",
+ [](const ProtoToArgsTable::ParsingOverrideState& state,
+ const protozero::Field& field) {
+ EXPECT_EQ(field.type(), protozero::proto_utils::ProtoWireType::kVarInt);
+ auto* decoder = state.sequence_state->LookupInternedMessage<
+ protos::pbzero::InternedData::kSourceLocationsFieldNumber,
+ protos::pbzero::SourceLocation>(state.sequence_generation,
+ field.as_uint64());
+ if (!decoder) {
+ // Lookup failed fall back on default behaviour.
+ return false;
+ }
+ TraceStorage* storage = state.context->storage.get();
+ auto file_name_id = storage->InternString("file_name");
+ auto line_number_id = storage->InternString("line_number");
+ auto file_id = storage->InternString(decoder->file_name());
+ state.args_tracker->AddArg(state.row_id, file_name_id, file_name_id,
+ Variadic::String(file_id));
+ state.args_tracker->AddArg(state.row_id, line_number_id, line_number_id,
+ Variadic::Integer(2));
+ return true;
+ });
+
+ storage_->mutable_track_table()->Insert({});
+ auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
+ kTestMessagesDescriptor.size());
+ ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
+ << status.message();
+
+ status = helper.InternProtoIntoArgsTable(
+ protozero::ConstBytes{binary_proto.data(), binary_proto.size()},
+ ".protozero.test.protos.NestedA",
+ TraceStorage::CreateRowId(TableId::kTrack, 0));
+ EXPECT_TRUE(status.ok()) << "InternProtoIntoArgsTable failed with error: "
+ << status.message();
+ auto file_name_id = storage_->string_pool().GetId("test_file_name");
+ ASSERT_TRUE(file_name_id);
+ context_.args_tracker->Flush();
+ EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "file_name",
+ Variadic::String(*file_name_id)));
+ EXPECT_TRUE(
+ HasArg(ArgSetId(arg_set_id_), "line_number", Variadic::Integer(2)));
+}
+
+} // namespace
+} // namespace trace_processor
+} // namespace perfetto
diff --git a/src/trace_processor/importers/proto/chrome_compositor_scheduler_state.descriptor.h b/src/trace_processor/importers/proto/chrome_compositor_scheduler_state.descriptor.h
new file mode 100644
index 0000000..bd8b3f2
--- /dev/null
+++ b/src/trace_processor/importers/proto/chrome_compositor_scheduler_state.descriptor.h
@@ -0,0 +1,871 @@
+
+#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_CHROME_COMPOSITOR_SCHEDULER_STATE_DESCRIPTOR_H_
+#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_CHROME_COMPOSITOR_SCHEDULER_STATE_DESCRIPTOR_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <array>
+
+// This file was autogenerated by tools/gen_binary_descriptors. Do not edit.
+
+// SHA1(tools/gen_binary_descriptors)
+// a6fca0c2012a0bfb620b978f2c0579145cdad174
+// SHA1(protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto)
+// 360017d4658dfd81fbf16af8cc2abb994958af05
+
+// This is the proto ChromeCompositorSchedulerState encoded as a ProtoFileDescriptor to allow
+// for reflection without libprotobuf full/non-lite protos.
+
+namespace perfetto {
+
+constexpr std::array<uint8_t, 10133> kChromeCompositorSchedulerStateDescriptor{
+ {0x0a, 0xd6, 0x01, 0x0a, 0x37, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f,
+ 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2f, 0x74, 0x72, 0x61,
+ 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x65, 0x76, 0x65,
+ 0x6e, 0x74, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6c, 0x6f,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x12, 0x0f, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x53, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x12, 0x10, 0x0a, 0x03, 0x69, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x04, 0x52, 0x03, 0x69, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69,
+ 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+ 0x23, 0x0a, 0x0d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
+ 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65,
+ 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d,
+ 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c,
+ 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x02, 0x48,
+ 0x03, 0x0a, 0xb9, 0x4d, 0x0a, 0x49, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
+ 0x2f, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2f, 0x74, 0x72,
+ 0x61, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x65, 0x76,
+ 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x5f, 0x63,
+ 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x63,
+ 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x70, 0x65, 0x72,
+ 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
+ 0x1a, 0x37, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x70, 0x65, 0x72,
+ 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2f,
+ 0x74, 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe6, 0x0b,
+ 0x0a, 0x1e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x70,
+ 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75,
+ 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x0d,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e,
+ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65,
+ 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x70,
+ 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d,
+ 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x3f, 0x0a, 0x1c,
+ 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x65,
+ 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19,
+ 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x67,
+ 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63,
+ 0x65, 0x12, 0x42, 0x0a, 0x1e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x69,
+ 0x6d, 0x70, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x64, 0x65,
+ 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x62, 0x65, 0x67, 0x69, 0x6e,
+ 0x49, 0x6d, 0x70, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x61,
+ 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x37, 0x0a,
+ 0x18, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x65, 0x67,
+ 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x73,
+ 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x70, 0x65, 0x6e,
+ 0x64, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x46, 0x72, 0x61,
+ 0x6d, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x5b, 0x0a, 0x2b, 0x73, 0x6b,
+ 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66,
+ 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x5f,
+ 0x65, 0x78, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x61,
+ 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x26, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x4c, 0x61, 0x73, 0x74,
+ 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x45,
+ 0x78, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x44, 0x65, 0x61, 0x64, 0x6c,
+ 0x69, 0x6e, 0x65, 0x12, 0x4d, 0x0a, 0x24, 0x73, 0x6b, 0x69, 0x70, 0x70,
+ 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x72, 0x61, 0x6d,
+ 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x5f,
+ 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28,
+ 0x08, 0x52, 0x1f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x4c, 0x61,
+ 0x73, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x64,
+ 0x75, 0x63, 0x65, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x55,
+ 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x61, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e,
+ 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x43, 0x6f,
+ 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x63, 0x68, 0x65,
+ 0x64, 0x75, 0x6c, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+ 0x0c, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x12, 0x6f, 0x0a, 0x0d, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e,
+ 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e,
+ 0x32, 0x4a, 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d,
+ 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x53,
+ 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x49, 0x6d, 0x70, 0x6c, 0x46,
+ 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65,
+ 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69,
+ 0x6e, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65,
+ 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x73, 0x18, 0x09, 0x20,
+ 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e,
+ 0x65, 0x55, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x64, 0x65, 0x61, 0x64, 0x6c,
+ 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65,
+ 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28,
+ 0x03, 0x52, 0x15, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x53,
+ 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x55, 0x73,
+ 0x12, 0x15, 0x0a, 0x06, 0x6e, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x18, 0x0b,
+ 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6e, 0x6f, 0x77, 0x55, 0x73, 0x12,
+ 0x36, 0x0a, 0x18, 0x6e, 0x6f, 0x77, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65,
+ 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61,
+ 0x5f, 0x75, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x6e,
+ 0x6f, 0x77, 0x54, 0x6f, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65,
+ 0x44, 0x65, 0x6c, 0x74, 0x61, 0x55, 0x73, 0x12, 0x4e, 0x0a, 0x25, 0x6e,
+ 0x6f, 0x77, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69,
+ 0x6e, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64,
+ 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x75, 0x73,
+ 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1f, 0x6e, 0x6f, 0x77, 0x54,
+ 0x6f, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x63, 0x68,
+ 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x44, 0x65, 0x6c, 0x74,
+ 0x61, 0x55, 0x73, 0x12, 0x56, 0x0a, 0x15, 0x62, 0x65, 0x67, 0x69, 0x6e,
+ 0x5f, 0x69, 0x6d, 0x70, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f,
+ 0x61, 0x72, 0x67, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23,
+ 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x49, 0x6d,
+ 0x70, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73, 0x52,
+ 0x12, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x49, 0x6d, 0x70, 0x6c, 0x46, 0x72,
+ 0x61, 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x65, 0x0a, 0x1a, 0x62,
+ 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6f,
+ 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65,
+ 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x73, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65,
+ 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x52, 0x17, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d,
+ 0x65, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x12, 0x5f, 0x0a, 0x18, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f,
+ 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+ 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x26, 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e,
+ 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x52, 0x15, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x46,
+ 0x72, 0x61, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x12, 0x64, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x70, 0x6f,
+ 0x73, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67,
+ 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x11, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74,
+ 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x6f, 0x6d,
+ 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x69, 0x6e,
+ 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x17, 0x63, 0x6f,
+ 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x69,
+ 0x6e, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, 0xbe, 0x01,
+ 0x0a, 0x1a, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x49, 0x6d, 0x70, 0x6c, 0x46,
+ 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65,
+ 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x45, 0x41, 0x44,
+ 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e,
+ 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
+ 0x16, 0x0a, 0x12, 0x44, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x5f,
+ 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x12,
+ 0x1b, 0x0a, 0x17, 0x44, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x5f,
+ 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x49, 0x4d, 0x4d, 0x45, 0x44, 0x49, 0x41,
+ 0x54, 0x45, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x45, 0x41, 0x44,
+ 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45,
+ 0x47, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x44,
+ 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45,
+ 0x5f, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x04, 0x12, 0x19, 0x0a, 0x15, 0x44,
+ 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45,
+ 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x05, 0x22, 0x86,
+ 0x28, 0x0a, 0x1c, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x43, 0x6f, 0x6d,
+ 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x59, 0x0a, 0x0b, 0x6d,
+ 0x61, 0x6a, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65,
+ 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43,
+ 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69,
+ 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68,
+ 0x69, 0x6e, 0x65, 0x2e, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x52, 0x0a, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x12, 0x59, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x5f,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x38, 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65,
+ 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x4d,
+ 0x69, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x6d,
+ 0x69, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0xf9, 0x0a,
+ 0x0a, 0x0a, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x12, 0x51, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e,
+ 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x43, 0x6f,
+ 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x63, 0x68, 0x65,
+ 0x64, 0x75, 0x6c, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+ 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x81, 0x01, 0x0a, 0x16, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6d,
+ 0x70, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x4c, 0x2e, 0x70,
+ 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x43, 0x6f, 0x6d,
+ 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x4d, 0x61, 0x6a, 0x6f,
+ 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e,
+ 0x49, 0x6d, 0x70, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x52, 0x13, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x49, 0x6d, 0x70,
+ 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
+ 0x81, 0x01, 0x0a, 0x16, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x61,
+ 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x4c, 0x2e, 0x70,
+ 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x43, 0x6f, 0x6d,
+ 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x4d, 0x61, 0x6a, 0x6f,
+ 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e,
+ 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x52, 0x13, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x4d, 0x61, 0x69,
+ 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
+ 0x8e, 0x01, 0x0a, 0x1b, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x74, 0x72,
+ 0x65, 0x65, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x6e,
+ 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
+ 0x0e, 0x32, 0x50, 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f,
+ 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
+ 0x2e, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e,
+ 0x4c, 0x61, 0x79, 0x65, 0x72, 0x54, 0x72, 0x65, 0x65, 0x46, 0x72, 0x61,
+ 0x6d, 0x65, 0x53, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52,
+ 0x17, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x54, 0x72, 0x65, 0x65, 0x46, 0x72,
+ 0x61, 0x6d, 0x65, 0x53, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x12, 0x83, 0x01, 0x0a, 0x13, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x5f,
+ 0x72, 0x65, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x53, 0x2e, 0x70, 0x65, 0x72,
+ 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
+ 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f,
+ 0x73, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x61,
+ 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x52,
+ 0x65, 0x64, 0x72, 0x61, 0x77, 0x4f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f,
+ 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x11, 0x66, 0x6f, 0x72,
+ 0x63, 0x65, 0x64, 0x52, 0x65, 0x64, 0x72, 0x61, 0x77, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x13, 0x42, 0x65, 0x67, 0x69, 0x6e,
+ 0x49, 0x6d, 0x70, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f,
+ 0x49, 0x4d, 0x50, 0x4c, 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x55,
+ 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
+ 0x12, 0x19, 0x0a, 0x15, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x49, 0x4d,
+ 0x50, 0x4c, 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x49, 0x44, 0x4c,
+ 0x45, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x42, 0x45, 0x47, 0x49, 0x4e,
+ 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f,
+ 0x49, 0x4e, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x42, 0x45, 0x47, 0x49, 0x4e,
+ 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20,
+ 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x5f, 0x46,
+ 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x44, 0x45, 0x5f,
+ 0x44, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x03, 0x22, 0x93,
+ 0x01, 0x0a, 0x13, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x4d, 0x61, 0x69, 0x6e,
+ 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20,
+ 0x0a, 0x1c, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x49, 0x4e,
+ 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
+ 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15,
+ 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x46,
+ 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x01, 0x12,
+ 0x19, 0x0a, 0x15, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x49,
+ 0x4e, 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x53, 0x45, 0x4e, 0x54,
+ 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f,
+ 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x52,
+ 0x45, 0x41, 0x44, 0x59, 0x5f, 0x54, 0x4f, 0x5f, 0x43, 0x4f, 0x4d, 0x4d,
+ 0x49, 0x54, 0x10, 0x03, 0x22, 0xf4, 0x01, 0x0a, 0x17, 0x4c, 0x61, 0x79,
+ 0x65, 0x72, 0x54, 0x72, 0x65, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53,
+ 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x1c,
+ 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x54, 0x52, 0x45, 0x45, 0x5f, 0x46,
+ 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49,
+ 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x41,
+ 0x59, 0x45, 0x52, 0x5f, 0x54, 0x52, 0x45, 0x45, 0x5f, 0x46, 0x52, 0x41,
+ 0x4d, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x1b, 0x0a,
+ 0x17, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x54, 0x52, 0x45, 0x45, 0x5f,
+ 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45,
+ 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f,
+ 0x54, 0x52, 0x45, 0x45, 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x43,
+ 0x52, 0x45, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x2d, 0x0a,
+ 0x29, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x54, 0x52, 0x45, 0x45, 0x5f,
+ 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e,
+ 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f,
+ 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x04, 0x12, 0x31, 0x0a, 0x2d,
+ 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x54, 0x52, 0x45, 0x45, 0x5f, 0x46,
+ 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47,
+ 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x41,
+ 0x43, 0x54, 0x49, 0x56, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x22,
+ 0xc7, 0x01, 0x0a, 0x1a, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x52, 0x65,
+ 0x64, 0x72, 0x61, 0x77, 0x4f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75,
+ 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x46, 0x4f,
+ 0x52, 0x43, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x44, 0x52, 0x41, 0x57, 0x5f,
+ 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
+ 0x00, 0x12, 0x16, 0x0a, 0x12, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x44, 0x5f,
+ 0x52, 0x45, 0x44, 0x52, 0x41, 0x57, 0x5f, 0x49, 0x44, 0x4c, 0x45, 0x10,
+ 0x01, 0x12, 0x24, 0x0a, 0x20, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x44, 0x5f,
+ 0x52, 0x45, 0x44, 0x52, 0x41, 0x57, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x49,
+ 0x4e, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49,
+ 0x54, 0x10, 0x02, 0x12, 0x28, 0x0a, 0x24, 0x46, 0x4f, 0x52, 0x43, 0x45,
+ 0x44, 0x5f, 0x52, 0x45, 0x44, 0x52, 0x41, 0x57, 0x5f, 0x57, 0x41, 0x49,
+ 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x41, 0x43, 0x54,
+ 0x49, 0x56, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x22, 0x0a,
+ 0x1e, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x44, 0x52,
+ 0x41, 0x57, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x46,
+ 0x4f, 0x52, 0x5f, 0x44, 0x52, 0x41, 0x57, 0x10, 0x04, 0x1a, 0xb3, 0x1b,
+ 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x63,
+ 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b,
+ 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12,
+ 0x30, 0x0a, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x66,
+ 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65,
+ 0x6e, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65,
+ 0x72, 0x12, 0x4a, 0x0a, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x72,
+ 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x73,
+ 0x75, 0x62, 0x6d, 0x69, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72,
+ 0x6d, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, 0x6c,
+ 0x61, 0x73, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62,
+ 0x65, 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x65, 0x72, 0x66,
+ 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x46, 0x0a, 0x20, 0x6c, 0x61, 0x73,
+ 0x74, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62,
+ 0x65, 0x72, 0x5f, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x65, 0x72, 0x66,
+ 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52,
+ 0x1c, 0x6c, 0x61, 0x73, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75,
+ 0x6d, 0x62, 0x65, 0x72, 0x44, 0x72, 0x61, 0x77, 0x50, 0x65, 0x72, 0x66,
+ 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x27, 0x6c, 0x61, 0x73,
+ 0x74, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62,
+ 0x65, 0x72, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x69,
+ 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x6e, 0x74,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x21, 0x6c, 0x61, 0x73, 0x74,
+ 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42,
+ 0x65, 0x67, 0x69, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d,
+ 0x65, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x69, 0x64,
+ 0x5f, 0x64, 0x72, 0x61, 0x77, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x07, 0x64, 0x69, 0x64, 0x44, 0x72, 0x61, 0x77, 0x12, 0x59, 0x0a, 0x2b,
+ 0x64, 0x69, 0x64, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x62, 0x65, 0x67,
+ 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d,
+ 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e,
+ 0x74, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28,
+ 0x08, 0x52, 0x24, 0x64, 0x69, 0x64, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x65,
+ 0x67, 0x69, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65,
+ 0x46, 0x6f, 0x72, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x46, 0x72,
+ 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x2e, 0x64, 0x69, 0x64, 0x5f, 0x6e,
+ 0x6f, 0x74, 0x69, 0x66, 0x79, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f,
+ 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e,
+ 0x6f, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f,
+ 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x27, 0x64, 0x69, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x65,
+ 0x67, 0x69, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65,
+ 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x55,
+ 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x5d, 0x0a, 0x2d, 0x64, 0x69, 0x64, 0x5f,
+ 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e,
+ 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f,
+ 0x6e, 0x6f, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64,
+ 0x5f, 0x73, 0x6f, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x26, 0x64, 0x69, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x65,
+ 0x67, 0x69, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65,
+ 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53,
+ 0x6f, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x23, 0x77, 0x61, 0x6e, 0x74, 0x73,
+ 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f,
+ 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x65, 0x78,
+ 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08,
+ 0x52, 0x1e, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x42, 0x65, 0x67, 0x69, 0x6e,
+ 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x6f, 0x74,
+ 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x35, 0x0a, 0x17,
+ 0x64, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x64,
+ 0x75, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18,
+ 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x64, 0x43, 0x6f,
+ 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x72,
+ 0x61, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x24, 0x64, 0x69, 0x64, 0x5f, 0x69,
+ 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x61,
+ 0x79, 0x65, 0x72, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x5f, 0x66, 0x72, 0x61,
+ 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28,
+ 0x08, 0x52, 0x1f, 0x64, 0x69, 0x64, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69,
+ 0x64, 0x61, 0x74, 0x65, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x54, 0x72, 0x65,
+ 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x69, 0x6e, 0x6b, 0x12, 0x48,
+ 0x0a, 0x21, 0x64, 0x69, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72,
+ 0x6d, 0x5f, 0x69, 0x6d, 0x70, 0x6c, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f,
+ 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x69, 0x6f, 0x6e, 0x18,
+ 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x64, 0x69, 0x64, 0x50, 0x65,
+ 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x6d, 0x70, 0x6c, 0x53, 0x69, 0x64,
+ 0x65, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x69, 0x6f, 0x6e,
+ 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x70,
+ 0x61, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0e, 0x20,
+ 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x69, 0x64, 0x50, 0x72, 0x65, 0x70,
+ 0x61, 0x72, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x23,
+ 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x5f,
+ 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64,
+ 0x5f, 0x61, 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
+ 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x21, 0x63, 0x6f, 0x6e, 0x73, 0x65,
+ 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65,
+ 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x6e, 0x69, 0x6d, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x65, 0x6e, 0x64,
+ 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x5f, 0x66,
+ 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52,
+ 0x13, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x62, 0x6d,
+ 0x69, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x63, 0x0a, 0x30,
+ 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65,
+ 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65,
+ 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x74, 0x72, 0x65,
+ 0x65, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x6b,
+ 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x29, 0x73, 0x75, 0x62, 0x6d,
+ 0x69, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68,
+ 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x79, 0x65, 0x72,
+ 0x54, 0x72, 0x65, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x69, 0x6e,
+ 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x5f, 0x72,
+ 0x65, 0x64, 0x72, 0x61, 0x77, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x0b, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x64, 0x72, 0x61, 0x77,
+ 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x5f, 0x70, 0x72,
+ 0x65, 0x70, 0x61, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18,
+ 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x6e, 0x65, 0x65, 0x64, 0x73,
+ 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x73,
+ 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x5f, 0x62, 0x65,
+ 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61,
+ 0x6d, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x6e, 0x65,
+ 0x65, 0x64, 0x73, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x4d, 0x61, 0x69, 0x6e,
+ 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x1a, 0x6e, 0x65, 0x65,
+ 0x64, 0x73, 0x5f, 0x6f, 0x6e, 0x65, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e,
+ 0x5f, 0x69, 0x6d, 0x70, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18,
+ 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x6e, 0x65, 0x65, 0x64, 0x73,
+ 0x4f, 0x6e, 0x65, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x49, 0x6d, 0x70, 0x6c,
+ 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x62,
+ 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x75, 0x73, 0x65, 0x64,
+ 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x62, 0x65, 0x67, 0x69,
+ 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,
+ 0x50, 0x61, 0x75, 0x73, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x61,
+ 0x6e, 0x5f, 0x64, 0x72, 0x61, 0x77, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08,
+ 0x52, 0x07, 0x63, 0x61, 0x6e, 0x44, 0x72, 0x61, 0x77, 0x12, 0x2b, 0x0a,
+ 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6c, 0x65, 0x73,
+ 0x73, 0x5f, 0x64, 0x72, 0x61, 0x77, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08,
+ 0x52, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6c, 0x65,
+ 0x73, 0x73, 0x44, 0x72, 0x61, 0x77, 0x12, 0x28, 0x0a, 0x10, 0x68, 0x61,
+ 0x73, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72,
+ 0x65, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x68, 0x61,
+ 0x73, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x65, 0x65,
+ 0x12, 0x4d, 0x0a, 0x24, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f,
+ 0x74, 0x72, 0x65, 0x65, 0x5f, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64,
+ 0x79, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f,
+ 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x65, 0x65, 0x49,
+ 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x46, 0x6f, 0x72, 0x41, 0x63, 0x74,
+ 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x1c, 0x61,
+ 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x5f, 0x6e,
+ 0x65, 0x65, 0x64, 0x73, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x64,
+ 0x72, 0x61, 0x77, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x61,
+ 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x65, 0x65,
+ 0x64, 0x73, 0x46, 0x69, 0x72, 0x73, 0x74, 0x44, 0x72, 0x61, 0x77, 0x12,
+ 0x3d, 0x0a, 0x1c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x72,
+ 0x65, 0x65, 0x5f, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f,
+ 0x74, 0x6f, 0x5f, 0x64, 0x72, 0x61, 0x77, 0x18, 0x1d, 0x20, 0x01, 0x28,
+ 0x08, 0x52, 0x17, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x65,
+ 0x65, 0x49, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x44, 0x72,
+ 0x61, 0x77, 0x12, 0x6c, 0x0a, 0x35, 0x64, 0x69, 0x64, 0x5f, 0x63, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x69,
+ 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x69, 0x72, 0x73,
+ 0x74, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x74, 0x72, 0x65, 0x65,
+ 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x18,
+ 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x2d, 0x64, 0x69, 0x64, 0x43, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x49, 0x6e, 0x69, 0x74, 0x69,
+ 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4c, 0x61,
+ 0x79, 0x65, 0x72, 0x54, 0x72, 0x65, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65,
+ 0x53, 0x69, 0x6e, 0x6b, 0x12, 0x6a, 0x0a, 0x0d, 0x74, 0x72, 0x65, 0x65,
+ 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x1f, 0x20,
+ 0x01, 0x28, 0x0e, 0x32, 0x45, 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74,
+ 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x68,
+ 0x72, 0x6f, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74,
+ 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69,
+ 0x6e, 0x65, 0x2e, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69,
+ 0x74, 0x79, 0x52, 0x0c, 0x74, 0x72, 0x65, 0x65, 0x50, 0x72, 0x69, 0x6f,
+ 0x72, 0x69, 0x74, 0x79, 0x12, 0x7d, 0x0a, 0x14, 0x73, 0x63, 0x72, 0x6f,
+ 0x6c, 0x6c, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x4b,
+ 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x43,
+ 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x4d, 0x69,
+ 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x63, 0x72,
+ 0x6f, 0x6c, 0x6c, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x52, 0x12, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x48,
+ 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
+ 0x5d, 0x0a, 0x2d, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f,
+ 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66,
+ 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x74, 0x69,
+ 0x76, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x73, 0x5f, 0x66, 0x61, 0x73, 0x74,
+ 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x52, 0x26, 0x63, 0x72, 0x69, 0x74,
+ 0x69, 0x63, 0x61, 0x6c, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x4d, 0x61, 0x69,
+ 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x41, 0x63, 0x74, 0x69,
+ 0x76, 0x61, 0x74, 0x65, 0x49, 0x73, 0x46, 0x61, 0x73, 0x74, 0x12, 0x46,
+ 0x0a, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61,
+ 0x64, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x73,
+ 0x74, 0x5f, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x22,
+ 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x6d, 0x61, 0x69, 0x6e, 0x54, 0x68,
+ 0x72, 0x65, 0x61, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x4c, 0x61,
+ 0x73, 0x74, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x5b,
+ 0x0a, 0x2c, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f,
+ 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66,
+ 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x64, 0x75,
+ 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x23,
+ 0x20, 0x01, 0x28, 0x08, 0x52, 0x25, 0x73, 0x6b, 0x69, 0x70, 0x4e, 0x65,
+ 0x78, 0x74, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x46,
+ 0x72, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65,
+ 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x37, 0x0a, 0x18, 0x76,
+ 0x69, 0x64, 0x65, 0x6f, 0x5f, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x5f, 0x62,
+ 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18,
+ 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x76, 0x69, 0x64, 0x65, 0x6f,
+ 0x4e, 0x65, 0x65, 0x64, 0x73, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x46, 0x72,
+ 0x61, 0x6d, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x64, 0x65, 0x66, 0x65,
+ 0x72, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x69, 0x6e,
+ 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08,
+ 0x52, 0x13, 0x64, 0x65, 0x66, 0x65, 0x72, 0x42, 0x65, 0x67, 0x69, 0x6e,
+ 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a,
+ 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74,
+ 0x5f, 0x68, 0x61, 0x64, 0x5f, 0x6e, 0x6f, 0x5f, 0x75, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x73, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x6c,
+ 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x48, 0x61, 0x64,
+ 0x4e, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a,
+ 0x16, 0x64, 0x69, 0x64, 0x5f, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x69, 0x6e,
+ 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18,
+ 0x27, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x69, 0x64, 0x44, 0x72,
+ 0x61, 0x77, 0x49, 0x6e, 0x4c, 0x61, 0x73, 0x74, 0x46, 0x72, 0x61, 0x6d,
+ 0x65, 0x12, 0x36, 0x0a, 0x18, 0x64, 0x69, 0x64, 0x5f, 0x73, 0x75, 0x62,
+ 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f,
+ 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x14, 0x64, 0x69, 0x64, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x49, 0x6e,
+ 0x4c, 0x61, 0x73, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a,
+ 0x1c, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x5f, 0x69, 0x6d, 0x70, 0x6c, 0x5f,
+ 0x73, 0x69, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x29, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x19, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x49, 0x6d, 0x70, 0x6c, 0x53, 0x69,
+ 0x64, 0x65, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x21, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e,
+ 0x74, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72,
+ 0x65, 0x65, 0x5f, 0x69, 0x73, 0x5f, 0x69, 0x6d, 0x70, 0x6c, 0x5f, 0x73,
+ 0x69, 0x64, 0x65, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x63,
+ 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e,
+ 0x67, 0x54, 0x72, 0x65, 0x65, 0x49, 0x73, 0x49, 0x6d, 0x70, 0x6c, 0x53,
+ 0x69, 0x64, 0x65, 0x12, 0x4b, 0x0a, 0x23, 0x70, 0x72, 0x65, 0x76, 0x69,
+ 0x6f, 0x75, 0x73, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f,
+ 0x74, 0x72, 0x65, 0x65, 0x5f, 0x77, 0x61, 0x73, 0x5f, 0x69, 0x6d, 0x70,
+ 0x6c, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x08,
+ 0x52, 0x1e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x50, 0x65,
+ 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x65, 0x65, 0x57, 0x61, 0x73,
+ 0x49, 0x6d, 0x70, 0x6c, 0x53, 0x69, 0x64, 0x65, 0x12, 0x5f, 0x0a, 0x2d,
+ 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x61,
+ 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x6f, 0x72,
+ 0x6b, 0x6c, 0x65, 0x74, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x61, 0x63,
+ 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x18, 0x2c, 0x20,
+ 0x01, 0x28, 0x08, 0x52, 0x28, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
+ 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x65, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x41,
+ 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x65, 0x65, 0x12, 0x61, 0x0a,
+ 0x2e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f,
+ 0x61, 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x6f,
+ 0x72, 0x6b, 0x6c, 0x65, 0x74, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x70,
+ 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x18,
+ 0x2d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x29, 0x70, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x65, 0x74, 0x73, 0x46, 0x6f,
+ 0x72, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x65, 0x65,
+ 0x12, 0x59, 0x0a, 0x2a, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69,
+ 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x5f, 0x77, 0x6f, 0x72,
+ 0x6b, 0x6c, 0x65, 0x74, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x70, 0x65,
+ 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x18, 0x2e,
+ 0x20, 0x01, 0x28, 0x08, 0x52, 0x25, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73,
+ 0x73, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x69, 0x6e, 0x74, 0x57, 0x6f, 0x72,
+ 0x6b, 0x6c, 0x65, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x65, 0x6e, 0x64,
+ 0x69, 0x6e, 0x67, 0x54, 0x72, 0x65, 0x65, 0x22, 0xb8, 0x01, 0x0a, 0x0c,
+ 0x54, 0x72, 0x65, 0x65, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79,
+ 0x12, 0x1d, 0x0a, 0x19, 0x54, 0x52, 0x45, 0x45, 0x5f, 0x50, 0x52, 0x49,
+ 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
+ 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2e, 0x0a, 0x2a, 0x54,
+ 0x52, 0x45, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x4f, 0x52, 0x49, 0x54, 0x59,
+ 0x5f, 0x53, 0x41, 0x4d, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x4f, 0x52, 0x49,
+ 0x54, 0x59, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x42, 0x4f, 0x54, 0x48, 0x5f,
+ 0x54, 0x52, 0x45, 0x45, 0x53, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x54,
+ 0x52, 0x45, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x4f, 0x52, 0x49, 0x54, 0x59,
+ 0x5f, 0x53, 0x4d, 0x4f, 0x4f, 0x54, 0x48, 0x4e, 0x45, 0x53, 0x53, 0x5f,
+ 0x54, 0x41, 0x4b, 0x45, 0x53, 0x5f, 0x50, 0x52, 0x49, 0x4f, 0x52, 0x49,
+ 0x54, 0x59, 0x10, 0x02, 0x12, 0x2c, 0x0a, 0x28, 0x54, 0x52, 0x45, 0x45,
+ 0x5f, 0x50, 0x52, 0x49, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x45,
+ 0x57, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x41,
+ 0x4b, 0x45, 0x53, 0x5f, 0x50, 0x52, 0x49, 0x4f, 0x52, 0x49, 0x54, 0x59,
+ 0x10, 0x03, 0x22, 0x82, 0x01, 0x0a, 0x12, 0x53, 0x63, 0x72, 0x6f, 0x6c,
+ 0x6c, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x43, 0x52, 0x4f, 0x4c, 0x4c, 0x5f,
+ 0x48, 0x41, 0x4e, 0x44, 0x4c, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50,
+ 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a,
+ 0x1d, 0x53, 0x43, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x41, 0x46, 0x46, 0x45,
+ 0x43, 0x54, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x48,
+ 0x41, 0x4e, 0x44, 0x4c, 0x45, 0x52, 0x10, 0x01, 0x12, 0x29, 0x0a, 0x25,
+ 0x53, 0x43, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f,
+ 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x46, 0x46, 0x45, 0x43, 0x54, 0x5f, 0x53,
+ 0x43, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x48, 0x41, 0x4e, 0x44, 0x4c, 0x45,
+ 0x52, 0x10, 0x02, 0x22, 0x8f, 0x05, 0x0a, 0x0e, 0x42, 0x65, 0x67, 0x69,
+ 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x46,
+ 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
+ 0x32, 0x32, 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e,
+ 0x46, 0x72, 0x61, 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73, 0x2e, 0x42, 0x65,
+ 0x67, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73,
+ 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b,
+ 0x0a, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x6f, 0x75, 0x72, 0x63,
+ 0x65, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x71, 0x75, 0x65,
+ 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03,
+ 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e,
+ 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0d,
+ 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75,
+ 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x66, 0x72, 0x61,
+ 0x6d, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x73, 0x12, 0x1f, 0x0a, 0x0b,
+ 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x73, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x65, 0x61, 0x64, 0x6c,
+ 0x69, 0x6e, 0x65, 0x55, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f,
+ 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x55,
+ 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x6e, 0x5f, 0x63, 0x72, 0x69, 0x74,
+ 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20,
+ 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6f, 0x6e, 0x43, 0x72, 0x69, 0x74, 0x69,
+ 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x61,
+ 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18,
+ 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6e, 0x69, 0x6d, 0x61,
+ 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x30, 0x0a, 0x13, 0x73, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x5f, 0x69, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x48,
+ 0x00, 0x52, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x6f, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x69, 0x64, 0x12, 0x4a, 0x0a, 0x0f,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e,
+ 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x6f,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x22, 0xa2, 0x01, 0x0a, 0x12, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x46, 0x72,
+ 0x61, 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12,
+ 0x25, 0x0a, 0x21, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x46, 0x52, 0x41,
+ 0x4d, 0x45, 0x5f, 0x41, 0x52, 0x47, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45,
+ 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
+ 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f,
+ 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x41, 0x52, 0x47, 0x53, 0x5f, 0x54,
+ 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10,
+ 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x46,
+ 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x41, 0x52, 0x47, 0x53, 0x5f, 0x54, 0x59,
+ 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x02, 0x12,
+ 0x20, 0x0a, 0x1c, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x46, 0x52, 0x41,
+ 0x4d, 0x45, 0x5f, 0x41, 0x52, 0x47, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45,
+ 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x45, 0x44, 0x10, 0x03, 0x42, 0x0e, 0x0a,
+ 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x6f,
+ 0x6d, 0x22, 0xf5, 0x05, 0x0a, 0x12, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x49,
+ 0x6d, 0x70, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73,
+ 0x12, 0x22, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f,
+ 0x61, 0x74, 0x5f, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+ 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x55, 0x73,
+ 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64,
+ 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,
+ 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74,
+ 0x55, 0x73, 0x12, 0x3f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x72, 0x66,
+ 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e,
+ 0x42, 0x65, 0x67, 0x69, 0x6e, 0x49, 0x6d, 0x70, 0x6c, 0x46, 0x72, 0x61,
+ 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x0c, 0x63,
+ 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x65, 0x72, 0x66,
+ 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e,
+ 0x42, 0x65, 0x67, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x41, 0x72,
+ 0x67, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e,
+ 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x09, 0x6c, 0x61, 0x73,
+ 0x74, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x1f, 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e,
+ 0x46, 0x72, 0x61, 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73, 0x48, 0x00, 0x52,
+ 0x08, 0x6c, 0x61, 0x73, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x5c, 0x0a,
+ 0x10, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x5f,
+ 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x32, 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x49,
+ 0x6d, 0x70, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73,
+ 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x49,
+ 0x6e, 0x55, 0x73, 0x52, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+ 0x6d, 0x70, 0x73, 0x49, 0x6e, 0x55, 0x73, 0x1a, 0xad, 0x02, 0x0a, 0x0e,
+ 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x49, 0x6e,
+ 0x55, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76,
+ 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x03, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,
+ 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x31, 0x0a, 0x15, 0x6e, 0x6f, 0x77,
+ 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65,
+ 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,
+ 0x52, 0x12, 0x6e, 0x6f, 0x77, 0x54, 0x6f, 0x44, 0x65, 0x61, 0x64, 0x6c,
+ 0x69, 0x6e, 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x34, 0x0a, 0x17,
+ 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74,
+ 0x6f, 0x5f, 0x6e, 0x6f, 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x66, 0x72, 0x61, 0x6d, 0x65,
+ 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x4e, 0x6f, 0x77, 0x44, 0x65, 0x6c,
+ 0x74, 0x61, 0x12, 0x3e, 0x0a, 0x1c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f,
+ 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x61, 0x64,
+ 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x04,
+ 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x54,
+ 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e,
+ 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6e, 0x6f,
+ 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6e, 0x6f, 0x77,
+ 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x69,
+ 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x66, 0x72,
+ 0x61, 0x6d, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64,
+ 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28,
+ 0x03, 0x52, 0x08, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x22,
+ 0x38, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x14,
+ 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f,
+ 0x46, 0x49, 0x4e, 0x49, 0x53, 0x48, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15,
+ 0x0a, 0x11, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x46, 0x52, 0x41, 0x4d,
+ 0x45, 0x5f, 0x55, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x42, 0x06, 0x0a,
+ 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x17, 0x42, 0x65,
+ 0x67, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4f, 0x62, 0x73, 0x65,
+ 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a,
+ 0x18, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x62, 0x65, 0x67,
+ 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x61, 0x72, 0x67,
+ 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x72, 0x6f,
+ 0x70, 0x70, 0x65, 0x64, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x46, 0x72, 0x61,
+ 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x52, 0x0a, 0x15, 0x6c, 0x61,
+ 0x73, 0x74, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61,
+ 0x6d, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x65, 0x67, 0x69,
+ 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73, 0x52, 0x12,
+ 0x6c, 0x61, 0x73, 0x74, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x46, 0x72, 0x61,
+ 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x15, 0x42,
+ 0x65, 0x67, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49,
+ 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x75, 0x73, 0x65, 0x64, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x61, 0x75, 0x73, 0x65,
+ 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x73,
+ 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d,
+ 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65,
+ 0x72, 0x73, 0x12, 0x52, 0x0a, 0x15, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62,
+ 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x61,
+ 0x72, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e,
+ 0x70, 0x65, 0x72, 0x66, 0x65, 0x74, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x46, 0x72, 0x61,
+ 0x6d, 0x65, 0x41, 0x72, 0x67, 0x73, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74,
+ 0x42, 0x65, 0x67, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x41, 0x72,
+ 0x67, 0x73, 0x22, 0xfd, 0x04, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6f,
+ 0x73, 0x69, 0x74, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x48,
+ 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x65, 0x0a, 0x31, 0x62, 0x65,
+ 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61,
+ 0x6d, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x63, 0x72, 0x69,
+ 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61,
+ 0x74, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x75, 0x73, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x2a, 0x62, 0x65, 0x67, 0x69, 0x6e,
+ 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x51, 0x75, 0x65,
+ 0x75, 0x65, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x45, 0x73,
+ 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x55,
+ 0x73, 0x12, 0x6c, 0x0a, 0x35, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x6d,
+ 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x71, 0x75,
+ 0x65, 0x75, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x63, 0x72, 0x69, 0x74,
+ 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74,
+ 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x75, 0x73, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x03, 0x52, 0x2d, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x4d,
+ 0x61, 0x69, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x51, 0x75, 0x65, 0x75,
+ 0x65, 0x4e, 0x6f, 0x74, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c,
+ 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x44, 0x65, 0x6c, 0x74,
+ 0x61, 0x55, 0x73, 0x12, 0x76, 0x0a, 0x3b, 0x62, 0x65, 0x67, 0x69, 0x6e,
+ 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f,
+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61,
+ 0x64, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74,
+ 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x65,
+ 0x6c, 0x74, 0x61, 0x5f, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
+ 0x52, 0x31, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x46,
+ 0x72, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x6f, 0x52,
+ 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74,
+ 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x44, 0x65, 0x6c, 0x74,
+ 0x61, 0x55, 0x73, 0x12, 0x5d, 0x0a, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69,
+ 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74,
+ 0x6f, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x65,
+ 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74,
+ 0x61, 0x5f, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x26,
+ 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64,
+ 0x79, 0x54, 0x6f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x45,
+ 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61,
+ 0x55, 0x73, 0x12, 0x44, 0x0a, 0x1f, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72,
+ 0x65, 0x5f, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x65, 0x73, 0x74, 0x69,
+ 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x75,
+ 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1b, 0x70, 0x72, 0x65,
+ 0x70, 0x61, 0x72, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x73, 0x74,
+ 0x69, 0x6d, 0x61, 0x74, 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x55, 0x73,
+ 0x12, 0x3b, 0x0a, 0x1a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65,
+ 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x65,
+ 0x6c, 0x74, 0x61, 0x5f, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03,
+ 0x52, 0x17, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x45, 0x73,
+ 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x55,
+ 0x73, 0x12, 0x33, 0x0a, 0x16, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x65, 0x73,
+ 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61,
+ 0x5f, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x64,
+ 0x72, 0x61, 0x77, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x44,
+ 0x65, 0x6c, 0x74, 0x61, 0x55, 0x73, 0x2a, 0xb0, 0x05, 0x0a, 0x1f, 0x43,
+ 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69,
+ 0x74, 0x6f, 0x72, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72,
+ 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x43,
+ 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x41,
+ 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
+ 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x43,
+ 0x43, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f,
+ 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10,
+ 0x01, 0x12, 0x2d, 0x0a, 0x29, 0x43, 0x43, 0x5f, 0x53, 0x43, 0x48, 0x45,
+ 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e,
+ 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f,
+ 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x10, 0x02,
+ 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x43, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44,
+ 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f,
+ 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x03, 0x12, 0x2a, 0x0a, 0x26,
+ 0x43, 0x43, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52,
+ 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x43, 0x54, 0x49,
+ 0x56, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x54, 0x52,
+ 0x45, 0x45, 0x10, 0x04, 0x12, 0x28, 0x0a, 0x24, 0x43, 0x43, 0x5f, 0x53,
+ 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x41, 0x43, 0x54,
+ 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x52, 0x41, 0x57, 0x5f, 0x49, 0x46, 0x5f,
+ 0x50, 0x4f, 0x53, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x05, 0x12, 0x23,
+ 0x0a, 0x1f, 0x43, 0x43, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c,
+ 0x45, 0x52, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x52,
+ 0x41, 0x57, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x44, 0x10, 0x06, 0x12,
+ 0x22, 0x0a, 0x1e, 0x43, 0x43, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55,
+ 0x4c, 0x45, 0x52, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44,
+ 0x52, 0x41, 0x57, 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x10, 0x07, 0x12,
+ 0x3c, 0x0a, 0x38, 0x43, 0x43, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55,
+ 0x4c, 0x45, 0x52, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42,
+ 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x54,
+ 0x52, 0x45, 0x45, 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x53, 0x49,
+ 0x4e, 0x4b, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10,
+ 0x08, 0x12, 0x25, 0x0a, 0x21, 0x43, 0x43, 0x5f, 0x53, 0x43, 0x48, 0x45,
+ 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e,
+ 0x5f, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x54, 0x49, 0x4c,
+ 0x45, 0x53, 0x10, 0x09, 0x12, 0x38, 0x0a, 0x34, 0x43, 0x43, 0x5f, 0x53,
+ 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x41, 0x43, 0x54,
+ 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41,
+ 0x54, 0x45, 0x5f, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x54, 0x52, 0x45,
+ 0x45, 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x4b,
+ 0x10, 0x0a, 0x12, 0x36, 0x0a, 0x32, 0x43, 0x43, 0x5f, 0x53, 0x43, 0x48,
+ 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f,
+ 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x49, 0x4d,
+ 0x50, 0x4c, 0x5f, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41,
+ 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0b, 0x12, 0x42,
+ 0x0a, 0x3e, 0x43, 0x43, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c,
+ 0x45, 0x52, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f,
+ 0x54, 0x49, 0x46, 0x59, 0x5f, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x4d,
+ 0x41, 0x49, 0x4e, 0x5f, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x4e, 0x4f,
+ 0x54, 0x5f, 0x45, 0x58, 0x50, 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, 0x55,
+ 0x4e, 0x54, 0x49, 0x4c, 0x10, 0x0c, 0x12, 0x41, 0x0a, 0x3d, 0x43, 0x43,
+ 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x41,
+ 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x59,
+ 0x5f, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x5f,
+ 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x45, 0x58,
+ 0x50, 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x4f, 0x4f, 0x4e, 0x10,
+ 0x0d, 0x42, 0x02, 0x48, 0x03}};
+
+} // namespace perfetto
+
+#endif // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_CHROME_COMPOSITOR_SCHEDULER_STATE_DESCRIPTOR_H_
diff --git a/src/trace_processor/importers/proto/track_event_parser.cc b/src/trace_processor/importers/proto/track_event_parser.cc
index 721775c..1305fbf 100644
--- a/src/trace_processor/importers/proto/track_event_parser.cc
+++ b/src/trace_processor/importers/proto/track_event_parser.cc
@@ -20,11 +20,14 @@
#include "perfetto/base/logging.h"
#include "src/trace_processor/args_tracker.h"
+#include "src/trace_processor/importers/proto/args_table_utils.h"
+#include "src/trace_processor/importers/proto/chrome_compositor_scheduler_state.descriptor.h"
#include "src/trace_processor/importers/proto/packet_sequence_state.h"
#include "src/trace_processor/process_tracker.h"
#include "src/trace_processor/track_tracker.h"
#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
+#include "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.pbzero.h"
#include "protos/perfetto/trace/track_event/debug_annotation.pbzero.h"
#include "protos/perfetto/trace/track_event/log_message.pbzero.h"
#include "protos/perfetto/trace/track_event/source_location.pbzero.h"
@@ -41,6 +44,43 @@
// with these placeholder values.
constexpr int64_t kPendingThreadDuration = -1;
constexpr int64_t kPendingThreadInstructionDelta = -1;
+
+void AddStringToArgsTable(const char* field,
+ const protozero::ConstChars& str,
+ const ProtoToArgsTable::ParsingOverrideState& state) {
+ auto val = state.context->storage->InternString(base::StringView(str));
+ auto key = state.context->storage->InternString(base::StringView(field));
+ state.args_tracker->AddArg(state.row_id, key, key, Variadic::String(val));
+}
+
+bool MaybeParseSourceLocation(
+ std::string prefix,
+ const ProtoToArgsTable::ParsingOverrideState& state,
+ const protozero::Field& field) {
+ auto* decoder = state.sequence_state->LookupInternedMessage<
+ protos::pbzero::InternedData::kSourceLocationsFieldNumber,
+ protos::pbzero::SourceLocation>(state.sequence_generation,
+ field.as_uint64());
+ if (!decoder) {
+ // Lookup failed fall back on default behaviour which will just put
+ // the source_location_iid into the args table.
+ return false;
+ }
+ {
+ ProtoToArgsTable::ScopedStringAppender scoped("file_name", &prefix);
+ AddStringToArgsTable(prefix.c_str(), decoder->file_name(), state);
+ }
+ {
+ ProtoToArgsTable::ScopedStringAppender scoped("function_name", &prefix);
+ AddStringToArgsTable(prefix.c_str(), decoder->function_name(), state);
+ }
+ ProtoToArgsTable::ScopedStringAppender scoped("line_number", &prefix);
+ auto key = state.context->storage->InternString(base::StringView(prefix));
+ state.args_tracker->AddArg(state.row_id, key, key,
+ Variadic::Integer(decoder->line_number()));
+ // By returning false we expect this field to be handled like regular.
+ return true;
+}
} // namespace
TrackEventParser::TrackEventParser(TraceProcessorContext* context)
@@ -366,6 +406,10 @@
sequence_state_generation, ts, utid, args_tracker,
row_id);
}
+ if (event.has_cc_scheduler_state()) {
+ ParseCcScheduler(event.cc_scheduler_state(), sequence_state,
+ sequence_state_generation, row_id);
+ }
if (legacy_tid) {
args_tracker->AddArg(row_id, legacy_event_original_tid_id_,
@@ -912,5 +956,46 @@
// TODO(nicomazz): Add the source location as an argument.
}
+void TrackEventParser::ParseCcScheduler(ConstBytes cc,
+ PacketSequenceState* sequence_state,
+ size_t sequence_state_generation,
+ RowId row) {
+ // The 79 decides the initial amount of memory reserved in the prefix. This
+ // was determined my manually counting the length of the longest column.
+ constexpr size_t kCcSchedulerStateMaxColumnLength = 79;
+ ProtoToArgsTable helper(sequence_state, sequence_state_generation, context_,
+ /* starting_prefix = */ "",
+ kCcSchedulerStateMaxColumnLength);
+ auto status = helper.AddProtoFileDescriptor(
+ kChromeCompositorSchedulerStateDescriptor.data(),
+ kChromeCompositorSchedulerStateDescriptor.size());
+ PERFETTO_DCHECK(status.ok());
+
+ // Switch |source_location_iid| into its interned data variant.
+ helper.AddParsingOverride(
+ "begin_impl_frame_args.current_args.source_location_iid",
+ [](const ProtoToArgsTable::ParsingOverrideState& state,
+ const protozero::Field& field) {
+ return MaybeParseSourceLocation("begin_impl_frame_args.current_args",
+ state, field);
+ });
+ helper.AddParsingOverride(
+ "begin_impl_frame_args.last_args.source_location_iid",
+ [](const ProtoToArgsTable::ParsingOverrideState& state,
+ const protozero::Field& field) {
+ return MaybeParseSourceLocation("begin_impl_frame_args.last_args",
+ state, field);
+ });
+ helper.AddParsingOverride(
+ "begin_frame_observer_state.last_begin_frame_args.source_location_iid",
+ [](const ProtoToArgsTable::ParsingOverrideState& state,
+ const protozero::Field& field) {
+ return MaybeParseSourceLocation(
+ "begin_frame_observer_state.last_begin_frame_args", state, field);
+ });
+ helper.InternProtoIntoArgsTable(
+ cc, ".perfetto.protos.ChromeCompositorSchedulerState", row);
+}
+
} // namespace trace_processor
} // namespace perfetto
diff --git a/src/trace_processor/importers/proto/track_event_parser.h b/src/trace_processor/importers/proto/track_event_parser.h
index 0aa072d..0c4ce41 100644
--- a/src/trace_processor/importers/proto/track_event_parser.h
+++ b/src/trace_processor/importers/proto/track_event_parser.h
@@ -75,6 +75,10 @@
base::Optional<UniqueTid>,
ArgsTracker*,
RowId);
+ void ParseCcScheduler(protozero::ConstBytes cc_scheduler,
+ PacketSequenceState*,
+ size_t sequence_state_generation,
+ RowId row);
private:
TraceProcessorContext* context_;
diff --git a/src/trace_processor/metrics/BUILD.gn b/src/trace_processor/metrics/BUILD.gn
index 82ae165..57ad33a 100644
--- a/src/trace_processor/metrics/BUILD.gn
+++ b/src/trace_processor/metrics/BUILD.gn
@@ -64,8 +64,6 @@
if (enable_perfetto_trace_processor_metrics) {
source_set("lib") {
sources = [
- "descriptors.cc",
- "descriptors.h",
"metrics.cc",
"metrics.descriptor.h",
"metrics.h",
@@ -84,6 +82,7 @@
]
public_deps = [
":gen_merged_sql_metrics",
+ "../../trace_processor:descriptors",
]
}
diff --git a/src/trace_processor/metrics/metrics.cc b/src/trace_processor/metrics/metrics.cc
index 048ef7f..eae7f9c 100644
--- a/src/trace_processor/metrics/metrics.cc
+++ b/src/trace_processor/metrics/metrics.cc
@@ -96,7 +96,7 @@
util::Status ProtoBuilder::AppendLong(const std::string& field_name,
int64_t value,
bool is_inside_repeated) {
- auto field_idx = descriptor_->FindFieldIdx(field_name);
+ auto field_idx = descriptor_->FindFieldIdxByName(field_name);
if (!field_idx.has_value()) {
return util::ErrStatus("Field with name %s not found in proto type %s",
field_name.c_str(),
@@ -141,7 +141,7 @@
util::Status ProtoBuilder::AppendDouble(const std::string& field_name,
double value,
bool is_inside_repeated) {
- auto field_idx = descriptor_->FindFieldIdx(field_name);
+ auto field_idx = descriptor_->FindFieldIdxByName(field_name);
if (!field_idx.has_value()) {
return util::ErrStatus("Field with name %s not found in proto type %s",
field_name.c_str(),
@@ -179,7 +179,7 @@
util::Status ProtoBuilder::AppendString(const std::string& field_name,
base::StringView data,
bool is_inside_repeated) {
- auto field_idx = descriptor_->FindFieldIdx(field_name);
+ auto field_idx = descriptor_->FindFieldIdxByName(field_name);
if (!field_idx.has_value()) {
return util::ErrStatus("Field with name %s not found in proto type %s",
field_name.c_str(),
@@ -213,7 +213,7 @@
const uint8_t* ptr,
size_t size,
bool is_inside_repeated) {
- auto field_idx = descriptor_->FindFieldIdx(field_name);
+ auto field_idx = descriptor_->FindFieldIdxByName(field_name);
if (!field_idx.has_value()) {
return util::ErrStatus("Field with name %s not found in proto type %s",
field_name.c_str(),
diff --git a/src/trace_processor/metrics/metrics.descriptor.h b/src/trace_processor/metrics/metrics.descriptor.h
index 7aad96f..9a910bb 100644
--- a/src/trace_processor/metrics/metrics.descriptor.h
+++ b/src/trace_processor/metrics/metrics.descriptor.h
@@ -10,7 +10,7 @@
// This file was autogenerated by tools/gen_binary_descriptors. Do not edit.
// SHA1(tools/gen_binary_descriptors)
-// 192b582ae52bb07b3d3ba66a94bcfd3127a5f42f
+// a6fca0c2012a0bfb620b978f2c0579145cdad174
// SHA1(protos/perfetto/metrics/metrics.proto)
// e1fea13f5853cbb276ae800c5fee91c46704565d
diff --git a/src/trace_processor/metrics/metrics.h b/src/trace_processor/metrics/metrics.h
index 31d0e78..589413b 100644
--- a/src/trace_processor/metrics/metrics.h
+++ b/src/trace_processor/metrics/metrics.h
@@ -27,7 +27,7 @@
#include "perfetto/protozero/message.h"
#include "perfetto/protozero/scattered_heap_buffer.h"
#include "perfetto/trace_processor/trace_processor.h"
-#include "src/trace_processor/metrics/descriptors.h"
+#include "src/trace_processor/descriptors.h"
#include "protos/perfetto/trace_processor/metrics_impl.pbzero.h"
diff --git a/src/trace_processor/metrics/metrics_unittest.cc b/src/trace_processor/metrics/metrics_unittest.cc
index 534b181..abbb57a 100644
--- a/src/trace_processor/metrics/metrics_unittest.cc
+++ b/src/trace_processor/metrics/metrics_unittest.cc
@@ -75,7 +75,7 @@
// optional int64 int_value = 1;
// }
ProtoDescriptor descriptor(".perfetto.protos", ".perfetto.protos.TestProto",
- base::nullopt);
+ ProtoDescriptor::Type::kMessage, base::nullopt);
descriptor.AddField(FieldDescriptor(
"int_value", 1, FieldDescriptorProto::TYPE_INT64, "", false));
@@ -96,7 +96,7 @@
// optional double double_value = 1;
// }
ProtoDescriptor descriptor(".perfetto.protos", ".perfetto.protos.TestProto",
- base::nullopt);
+ ProtoDescriptor::Type::kMessage, base::nullopt);
descriptor.AddField(FieldDescriptor(
"double_value", 1, FieldDescriptorProto::TYPE_DOUBLE, "", false));
@@ -117,7 +117,7 @@
// optional string string_value = 1;
// }
ProtoDescriptor descriptor(".perfetto.protos", ".perfetto.protos.TestProto",
- base::nullopt);
+ ProtoDescriptor::Type::kMessage, base::nullopt);
descriptor.AddField(FieldDescriptor(
"string_value", 1, FieldDescriptorProto::TYPE_STRING, "", false));
@@ -142,12 +142,12 @@
// }
ProtoDescriptor nested(".perfetto.protos",
".perfetto.protos.TestProto.NestedProto",
- base::nullopt);
+ ProtoDescriptor::Type::kMessage, base::nullopt);
nested.AddField(FieldDescriptor("nested_int_value", 1,
FieldDescriptorProto::TYPE_INT64, "", false));
ProtoDescriptor descriptor(".perfetto.protos", ".perfetto.protos.TestProto",
- base::nullopt);
+ ProtoDescriptor::Type::kMessage, base::nullopt);
auto field =
FieldDescriptor("nested_value", 1, FieldDescriptorProto::TYPE_MESSAGE,
".perfetto.protos.TestProto.NestedProto", false);
@@ -187,7 +187,7 @@
// repeated int64 int_value = 1;
// }
ProtoDescriptor descriptor(".perfetto.protos", ".perfetto.protos.TestProto",
- base::nullopt);
+ ProtoDescriptor::Type::kMessage, base::nullopt);
descriptor.AddField(FieldDescriptor(
"rep_int_value", 1, FieldDescriptorProto::TYPE_INT64, "", true));
diff --git a/src/trace_processor/trace_processor_impl.cc b/src/trace_processor/trace_processor_impl.cc
index a51913a..d2fc890 100644
--- a/src/trace_processor/trace_processor_impl.cc
+++ b/src/trace_processor/trace_processor_impl.cc
@@ -46,7 +46,6 @@
#include "src/trace_processor/window_operator_table.h"
#if PERFETTO_BUILDFLAG(PERFETTO_TP_METRICS)
-#include "src/trace_processor/metrics/descriptors.h"
#include "src/trace_processor/metrics/metrics.descriptor.h"
#include "src/trace_processor/metrics/metrics.h"
#include "src/trace_processor/metrics/sql_metrics.h"
diff --git a/src/trace_processor/trace_processor_impl.h b/src/trace_processor/trace_processor_impl.h
index 3149225..4cdf702 100644
--- a/src/trace_processor/trace_processor_impl.h
+++ b/src/trace_processor/trace_processor_impl.h
@@ -32,7 +32,7 @@
#include "src/trace_processor/trace_processor_storage_impl.h"
#if PERFETTO_BUILDFLAG(PERFETTO_TP_METRICS)
-#include "src/trace_processor/metrics/descriptors.h"
+#include "src/trace_processor/descriptors.h"
#include "src/trace_processor/metrics/metrics.h"
#endif // PERFETTO_BUILDFLAG(PERFETTO_TP_METRICS)
@@ -80,7 +80,7 @@
ScopedDb db_;
#if PERFETTO_BUILDFLAG(PERFETTO_TP_METRICS)
- metrics::DescriptorPool pool_;
+ DescriptorPool pool_;
std::vector<metrics::SqlMetricFile> sql_metrics_;
#endif // PERFETTO_BUILDFLAG(PERFETTO_TP_METRICS)
diff --git a/tools/gen_binary_descriptors b/tools/gen_binary_descriptors
index 1d26587..8bba861 100755
--- a/tools/gen_binary_descriptors
+++ b/tools/gen_binary_descriptors
@@ -31,6 +31,10 @@
'src/perfetto_cmd/perfetto_config.descriptor.h',
'protos/perfetto/metrics/metrics.proto':
'src/trace_processor/metrics/metrics.descriptor.h',
+ 'protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto':
+ 'src/trace_processor/importers/proto/chrome_compositor_scheduler_state.descriptor.h',
+ 'src/protozero/test/example_proto/test_messages.proto':
+ 'src/protozero/test/example_proto/test_messages.descriptor.h',
}
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))