%% -*- coding: utf-8 -*-
%% % this file is @generated
%% @private
%% Automatically generated, do not edit
%% Generated by gpb_compile version 4.21.1
%% Version source: file
-module(opentelemetry_exporter_trace_service_pb).

-export([encode_msg/2, encode_msg/3]).
-export([decode_msg/2, decode_msg/3]).
-export([merge_msgs/3, merge_msgs/4]).
-export([verify_msg/2, verify_msg/3]).
-export([get_msg_defs/0]).
-export([get_msg_names/0]).
-export([get_group_names/0]).
-export([get_msg_or_group_names/0]).
-export([get_enum_names/0]).
-export([find_msg_def/1, fetch_msg_def/1]).
-export([find_enum_def/1, fetch_enum_def/1]).
-export([enum_symbol_by_value/2, enum_value_by_symbol/2]).
-export(['enum_symbol_by_value_span.SpanKind'/1, 'enum_value_by_symbol_span.SpanKind'/1]).
-export(['enum_symbol_by_value_status.StatusCode'/1, 'enum_value_by_symbol_status.StatusCode'/1]).
-export(['enum_symbol_by_value_opentelemetry.proto.trace.v1.SpanFlags'/1, 'enum_value_by_symbol_opentelemetry.proto.trace.v1.SpanFlags'/1]).
-export([get_service_names/0]).
-export([get_service_def/1]).
-export([get_rpc_names/1]).
-export([find_rpc_def/2, fetch_rpc_def/2]).
-export([fqbin_to_service_name/1]).
-export([service_name_to_fqbin/1]).
-export([fqbins_to_service_and_rpc_name/2]).
-export([service_and_rpc_name_to_fqbins/2]).
-export([fqbin_to_msg_name/1]).
-export([msg_name_to_fqbin/1]).
-export([fqbin_to_enum_name/1]).
-export([enum_name_to_fqbin/1]).
-export([get_package_name/0]).
-export([uses_packages/0]).
-export([source_basename/0]).
-export([get_all_source_basenames/0]).
-export([get_all_proto_names/0]).
-export([get_msg_containment/1]).
-export([get_pkg_containment/1]).
-export([get_service_containment/1]).
-export([get_rpc_containment/1]).
-export([get_enum_containment/1]).
-export([get_proto_by_msg_name_as_fqbin/1]).
-export([get_proto_by_service_name_as_fqbin/1]).
-export([get_proto_by_enum_name_as_fqbin/1]).
-export([get_protos_by_pkg_name_as_fqbin/1]).
-export([gpb_version_as_string/0, gpb_version_as_list/0]).
-export([gpb_version_source/0]).

-eqwalizer(ignore).

%% enumerated types
-type 'span.SpanKind'() :: 'SPAN_KIND_UNSPECIFIED' | 'SPAN_KIND_INTERNAL' | 'SPAN_KIND_SERVER' | 'SPAN_KIND_CLIENT' | 'SPAN_KIND_PRODUCER' | 'SPAN_KIND_CONSUMER'.
-type 'status.StatusCode'() :: 'STATUS_CODE_UNSET' | 'STATUS_CODE_OK' | 'STATUS_CODE_ERROR'.
-type 'opentelemetry.proto.trace.v1.SpanFlags'() :: 'SPAN_FLAGS_DO_NOT_USE' | 'SPAN_FLAGS_TRACE_FLAGS_MASK'.
-export_type(['span.SpanKind'/0, 'status.StatusCode'/0, 'opentelemetry.proto.trace.v1.SpanFlags'/0]).

%% message types
-type export_trace_service_request() ::
      #{resource_spans          => [resource_spans()] % = 1, repeated
       }.

-type export_trace_service_response() ::
      #{partial_success         => export_trace_partial_success() % = 1, optional
       }.

-type export_trace_partial_success() ::
      #{rejected_spans          => integer(),       % = 1, optional, 64 bits
        error_message           => unicode:chardata() % = 2, optional
       }.

-type traces_data() ::
      #{resource_spans          => [resource_spans()] % = 1, repeated
       }.

-type resource_spans() ::
      #{resource                => resource(),      % = 1, optional
        scope_spans             => [scope_spans()], % = 2, repeated
        schema_url              => unicode:chardata() % = 3, optional
       }.

-type scope_spans() ::
      #{scope                   => instrumentation_scope(), % = 1, optional
        spans                   => [span()],        % = 2, repeated
        schema_url              => unicode:chardata() % = 3, optional
       }.

-type event() ::
      #{time_unix_nano          => non_neg_integer(), % = 1, optional, 64 bits
        name                    => unicode:chardata(), % = 2, optional
        attributes              => [key_value()],   % = 3, repeated
        dropped_attributes_count => non_neg_integer() % = 4, optional, 32 bits
       }.

-type link() ::
      #{trace_id                => iodata(),        % = 1, optional
        span_id                 => iodata(),        % = 2, optional
        trace_state             => unicode:chardata(), % = 3, optional
        attributes              => [key_value()],   % = 4, repeated
        dropped_attributes_count => non_neg_integer(), % = 5, optional, 32 bits
        flags                   => non_neg_integer() % = 6, optional, 32 bits
       }.

-type span() ::
      #{trace_id                => iodata(),        % = 1, optional
        span_id                 => iodata(),        % = 2, optional
        trace_state             => unicode:chardata(), % = 3, optional
        parent_span_id          => iodata(),        % = 4, optional
        flags                   => non_neg_integer(), % = 16, optional, 32 bits
        name                    => unicode:chardata(), % = 5, optional
        kind                    => 'SPAN_KIND_UNSPECIFIED' | 'SPAN_KIND_INTERNAL' | 'SPAN_KIND_SERVER' | 'SPAN_KIND_CLIENT' | 'SPAN_KIND_PRODUCER' | 'SPAN_KIND_CONSUMER' | integer(), % = 6, optional, enum span.SpanKind
        start_time_unix_nano    => non_neg_integer(), % = 7, optional, 64 bits
        end_time_unix_nano      => non_neg_integer(), % = 8, optional, 64 bits
        attributes              => [key_value()],   % = 9, repeated
        dropped_attributes_count => non_neg_integer(), % = 10, optional, 32 bits
        events                  => [event()],       % = 11, repeated
        dropped_events_count    => non_neg_integer(), % = 12, optional, 32 bits
        links                   => [link()],        % = 13, repeated
        dropped_links_count     => non_neg_integer(), % = 14, optional, 32 bits
        status                  => status()         % = 15, optional
       }.

-type status() ::
      #{message                 => unicode:chardata(), % = 2, optional
        code                    => 'STATUS_CODE_UNSET' | 'STATUS_CODE_OK' | 'STATUS_CODE_ERROR' | integer() % = 3, optional, enum status.StatusCode
       }.

-type any_value() ::
      #{value                   => {string_value, unicode:chardata()} | {bool_value, boolean() | 0 | 1} | {int_value, integer()} | {double_value, float() | integer() | infinity | '-infinity' | nan} | {array_value, array_value()} | {kvlist_value, key_value_list()} | {bytes_value, iodata()} % oneof
       }.

-type array_value() ::
      #{values                  => [any_value()]    % = 1, repeated
       }.

-type key_value_list() ::
      #{values                  => [key_value()]    % = 1, repeated
       }.

-type key_value() ::
      #{key                     => unicode:chardata(), % = 1, optional
        value                   => any_value()      % = 2, optional
       }.

-type instrumentation_scope() ::
      #{name                    => unicode:chardata(), % = 1, optional
        version                 => unicode:chardata(), % = 2, optional
        attributes              => [key_value()],   % = 3, repeated
        dropped_attributes_count => non_neg_integer() % = 4, optional, 32 bits
       }.

-type resource() ::
      #{attributes              => [key_value()],   % = 1, repeated
        dropped_attributes_count => non_neg_integer() % = 2, optional, 32 bits
       }.

-export_type(['export_trace_service_request'/0, 'export_trace_service_response'/0, 'export_trace_partial_success'/0, 'traces_data'/0, 'resource_spans'/0, 'scope_spans'/0, 'event'/0, 'link'/0, 'span'/0, 'status'/0, 'any_value'/0, 'array_value'/0, 'key_value_list'/0, 'key_value'/0, 'instrumentation_scope'/0, 'resource'/0]).
-type '$msg_name'() :: export_trace_service_request | export_trace_service_response | export_trace_partial_success | traces_data | resource_spans | scope_spans | event | link | span | status | any_value | array_value | key_value_list | key_value | instrumentation_scope | resource.
-type '$msg'() :: export_trace_service_request() | export_trace_service_response() | export_trace_partial_success() | traces_data() | resource_spans() | scope_spans() | event() | link() | span() | status() | any_value() | array_value() | key_value_list() | key_value() | instrumentation_scope() | resource().
-export_type(['$msg_name'/0, '$msg'/0]).

-if(?OTP_RELEASE >= 24).
-dialyzer({no_underspecs, encode_msg/2}).
-endif.
-spec encode_msg('$msg'(), '$msg_name'()) -> binary().
encode_msg(Msg, MsgName) when is_atom(MsgName) -> encode_msg(Msg, MsgName, []).

-if(?OTP_RELEASE >= 24).
-dialyzer({no_underspecs, encode_msg/3}).
-endif.
-spec encode_msg('$msg'(), '$msg_name'(), list()) -> binary().
encode_msg(Msg, MsgName, Opts) ->
    case proplists:get_bool(verify, Opts) of
        true -> verify_msg(Msg, MsgName, Opts);
        false -> ok
    end,
    TrUserData = proplists:get_value(user_data, Opts),
    case MsgName of
        export_trace_service_request -> encode_msg_export_trace_service_request(id(Msg, TrUserData), TrUserData);
        export_trace_service_response -> encode_msg_export_trace_service_response(id(Msg, TrUserData), TrUserData);
        export_trace_partial_success -> encode_msg_export_trace_partial_success(id(Msg, TrUserData), TrUserData);
        traces_data -> encode_msg_traces_data(id(Msg, TrUserData), TrUserData);
        resource_spans -> encode_msg_resource_spans(id(Msg, TrUserData), TrUserData);
        scope_spans -> encode_msg_scope_spans(id(Msg, TrUserData), TrUserData);
        event -> encode_msg_event(id(Msg, TrUserData), TrUserData);
        link -> encode_msg_link(id(Msg, TrUserData), TrUserData);
        span -> encode_msg_span(id(Msg, TrUserData), TrUserData);
        status -> encode_msg_status(id(Msg, TrUserData), TrUserData);
        any_value -> encode_msg_any_value(id(Msg, TrUserData), TrUserData);
        array_value -> encode_msg_array_value(id(Msg, TrUserData), TrUserData);
        key_value_list -> encode_msg_key_value_list(id(Msg, TrUserData), TrUserData);
        key_value -> encode_msg_key_value(id(Msg, TrUserData), TrUserData);
        instrumentation_scope -> encode_msg_instrumentation_scope(id(Msg, TrUserData), TrUserData);
        resource -> encode_msg_resource(id(Msg, TrUserData), TrUserData)
    end.


encode_msg_export_trace_service_request(Msg, TrUserData) -> encode_msg_export_trace_service_request(Msg, <<>>, TrUserData).


encode_msg_export_trace_service_request(#{} = M, Bin, TrUserData) ->
    case M of
        #{resource_spans := F1} ->
            TrF1 = id(F1, TrUserData),
            if TrF1 == [] -> Bin;
               true -> e_field_export_trace_service_request_resource_spans(TrF1, Bin, TrUserData)
            end;
        _ -> Bin
    end.

encode_msg_export_trace_service_response(Msg, TrUserData) -> encode_msg_export_trace_service_response(Msg, <<>>, TrUserData).


encode_msg_export_trace_service_response(#{} = M, Bin, TrUserData) ->
    case M of
        #{partial_success := F1} ->
            begin
                TrF1 = id(F1, TrUserData),
                if TrF1 =:= undefined -> Bin;
                   true -> e_mfield_export_trace_service_response_partial_success(TrF1, <<Bin/binary, 10>>, TrUserData)
                end
            end;
        _ -> Bin
    end.

encode_msg_export_trace_partial_success(Msg, TrUserData) -> encode_msg_export_trace_partial_success(Msg, <<>>, TrUserData).


encode_msg_export_trace_partial_success(#{} = M, Bin, TrUserData) ->
    B1 = case M of
             #{rejected_spans := F1} ->
                 begin
                     TrF1 = id(F1, TrUserData),
                     if TrF1 =:= 0 -> Bin;
                        true -> e_type_int64(TrF1, <<Bin/binary, 8>>, TrUserData)
                     end
                 end;
             _ -> Bin
         end,
    case M of
        #{error_message := F2} ->
            begin
                TrF2 = id(F2, TrUserData),
                case is_empty_string(TrF2) of
                    true -> B1;
                    false -> e_type_string(TrF2, <<B1/binary, 18>>, TrUserData)
                end
            end;
        _ -> B1
    end.

encode_msg_traces_data(Msg, TrUserData) -> encode_msg_traces_data(Msg, <<>>, TrUserData).


encode_msg_traces_data(#{} = M, Bin, TrUserData) ->
    case M of
        #{resource_spans := F1} ->
            TrF1 = id(F1, TrUserData),
            if TrF1 == [] -> Bin;
               true -> e_field_traces_data_resource_spans(TrF1, Bin, TrUserData)
            end;
        _ -> Bin
    end.

encode_msg_resource_spans(Msg, TrUserData) -> encode_msg_resource_spans(Msg, <<>>, TrUserData).


encode_msg_resource_spans(#{} = M, Bin, TrUserData) ->
    B1 = case M of
             #{resource := F1} ->
                 begin
                     TrF1 = id(F1, TrUserData),
                     if TrF1 =:= undefined -> Bin;
                        true -> e_mfield_resource_spans_resource(TrF1, <<Bin/binary, 10>>, TrUserData)
                     end
                 end;
             _ -> Bin
         end,
    B2 = case M of
             #{scope_spans := F2} ->
                 TrF2 = id(F2, TrUserData),
                 if TrF2 == [] -> B1;
                    true -> e_field_resource_spans_scope_spans(TrF2, B1, TrUserData)
                 end;
             _ -> B1
         end,
    case M of
        #{schema_url := F3} ->
            begin
                TrF3 = id(F3, TrUserData),
                case is_empty_string(TrF3) of
                    true -> B2;
                    false -> e_type_string(TrF3, <<B2/binary, 26>>, TrUserData)
                end
            end;
        _ -> B2
    end.

encode_msg_scope_spans(Msg, TrUserData) -> encode_msg_scope_spans(Msg, <<>>, TrUserData).


encode_msg_scope_spans(#{} = M, Bin, TrUserData) ->
    B1 = case M of
             #{scope := F1} ->
                 begin
                     TrF1 = id(F1, TrUserData),
                     if TrF1 =:= undefined -> Bin;
                        true -> e_mfield_scope_spans_scope(TrF1, <<Bin/binary, 10>>, TrUserData)
                     end
                 end;
             _ -> Bin
         end,
    B2 = case M of
             #{spans := F2} ->
                 TrF2 = id(F2, TrUserData),
                 if TrF2 == [] -> B1;
                    true -> e_field_scope_spans_spans(TrF2, B1, TrUserData)
                 end;
             _ -> B1
         end,
    case M of
        #{schema_url := F3} ->
            begin
                TrF3 = id(F3, TrUserData),
                case is_empty_string(TrF3) of
                    true -> B2;
                    false -> e_type_string(TrF3, <<B2/binary, 26>>, TrUserData)
                end
            end;
        _ -> B2
    end.

encode_msg_event(Msg, TrUserData) -> encode_msg_event(Msg, <<>>, TrUserData).


encode_msg_event(#{} = M, Bin, TrUserData) ->
    B1 = case M of
             #{time_unix_nano := F1} ->
                 begin
                     TrF1 = id(F1, TrUserData),
                     if TrF1 =:= 0 -> Bin;
                        true -> e_type_fixed64(TrF1, <<Bin/binary, 9>>, TrUserData)
                     end
                 end;
             _ -> Bin
         end,
    B2 = case M of
             #{name := F2} ->
                 begin
                     TrF2 = id(F2, TrUserData),
                     case is_empty_string(TrF2) of
                         true -> B1;
                         false -> e_type_string(TrF2, <<B1/binary, 18>>, TrUserData)
                     end
                 end;
             _ -> B1
         end,
    B3 = case M of
             #{attributes := F3} ->
                 TrF3 = id(F3, TrUserData),
                 if TrF3 == [] -> B2;
                    true -> e_field_event_attributes(TrF3, B2, TrUserData)
                 end;
             _ -> B2
         end,
    case M of
        #{dropped_attributes_count := F4} ->
            begin
                TrF4 = id(F4, TrUserData),
                if TrF4 =:= 0 -> B3;
                   true -> e_varint(TrF4, <<B3/binary, 32>>, TrUserData)
                end
            end;
        _ -> B3
    end.

encode_msg_link(Msg, TrUserData) -> encode_msg_link(Msg, <<>>, TrUserData).


encode_msg_link(#{} = M, Bin, TrUserData) ->
    B1 = case M of
             #{trace_id := F1} ->
                 begin
                     TrF1 = id(F1, TrUserData),
                     case iolist_size(TrF1) of
                         0 -> Bin;
                         _ -> e_type_bytes(TrF1, <<Bin/binary, 10>>, TrUserData)
                     end
                 end;
             _ -> Bin
         end,
    B2 = case M of
             #{span_id := F2} ->
                 begin
                     TrF2 = id(F2, TrUserData),
                     case iolist_size(TrF2) of
                         0 -> B1;
                         _ -> e_type_bytes(TrF2, <<B1/binary, 18>>, TrUserData)
                     end
                 end;
             _ -> B1
         end,
    B3 = case M of
             #{trace_state := F3} ->
                 begin
                     TrF3 = id(F3, TrUserData),
                     case is_empty_string(TrF3) of
                         true -> B2;
                         false -> e_type_string(TrF3, <<B2/binary, 26>>, TrUserData)
                     end
                 end;
             _ -> B2
         end,
    B4 = case M of
             #{attributes := F4} ->
                 TrF4 = id(F4, TrUserData),
                 if TrF4 == [] -> B3;
                    true -> e_field_link_attributes(TrF4, B3, TrUserData)
                 end;
             _ -> B3
         end,
    B5 = case M of
             #{dropped_attributes_count := F5} ->
                 begin
                     TrF5 = id(F5, TrUserData),
                     if TrF5 =:= 0 -> B4;
                        true -> e_varint(TrF5, <<B4/binary, 40>>, TrUserData)
                     end
                 end;
             _ -> B4
         end,
    case M of
        #{flags := F6} ->
            begin
                TrF6 = id(F6, TrUserData),
                if TrF6 =:= 0 -> B5;
                   true -> e_type_fixed32(TrF6, <<B5/binary, 53>>, TrUserData)
                end
            end;
        _ -> B5
    end.

encode_msg_span(Msg, TrUserData) -> encode_msg_span(Msg, <<>>, TrUserData).


encode_msg_span(#{} = M, Bin, TrUserData) ->
    B1 = case M of
             #{trace_id := F1} ->
                 begin
                     TrF1 = id(F1, TrUserData),
                     case iolist_size(TrF1) of
                         0 -> Bin;
                         _ -> e_type_bytes(TrF1, <<Bin/binary, 10>>, TrUserData)
                     end
                 end;
             _ -> Bin
         end,
    B2 = case M of
             #{span_id := F2} ->
                 begin
                     TrF2 = id(F2, TrUserData),
                     case iolist_size(TrF2) of
                         0 -> B1;
                         _ -> e_type_bytes(TrF2, <<B1/binary, 18>>, TrUserData)
                     end
                 end;
             _ -> B1
         end,
    B3 = case M of
             #{trace_state := F3} ->
                 begin
                     TrF3 = id(F3, TrUserData),
                     case is_empty_string(TrF3) of
                         true -> B2;
                         false -> e_type_string(TrF3, <<B2/binary, 26>>, TrUserData)
                     end
                 end;
             _ -> B2
         end,
    B4 = case M of
             #{parent_span_id := F4} ->
                 begin
                     TrF4 = id(F4, TrUserData),
                     case iolist_size(TrF4) of
                         0 -> B3;
                         _ -> e_type_bytes(TrF4, <<B3/binary, 34>>, TrUserData)
                     end
                 end;
             _ -> B3
         end,
    B5 = case M of
             #{flags := F5} ->
                 begin
                     TrF5 = id(F5, TrUserData),
                     if TrF5 =:= 0 -> B4;
                        true -> e_type_fixed32(TrF5, <<B4/binary, 133, 1>>, TrUserData)
                     end
                 end;
             _ -> B4
         end,
    B6 = case M of
             #{name := F6} ->
                 begin
                     TrF6 = id(F6, TrUserData),
                     case is_empty_string(TrF6) of
                         true -> B5;
                         false -> e_type_string(TrF6, <<B5/binary, 42>>, TrUserData)
                     end
                 end;
             _ -> B5
         end,
    B7 = case M of
             #{kind := F7} ->
                 begin
                     TrF7 = id(F7, TrUserData),
                     if TrF7 =:= 'SPAN_KIND_UNSPECIFIED'; TrF7 =:= 0 -> B6;
                        true -> 'e_enum_span.SpanKind'(TrF7, <<B6/binary, 48>>, TrUserData)
                     end
                 end;
             _ -> B6
         end,
    B8 = case M of
             #{start_time_unix_nano := F8} ->
                 begin
                     TrF8 = id(F8, TrUserData),
                     if TrF8 =:= 0 -> B7;
                        true -> e_type_fixed64(TrF8, <<B7/binary, 57>>, TrUserData)
                     end
                 end;
             _ -> B7
         end,
    B9 = case M of
             #{end_time_unix_nano := F9} ->
                 begin
                     TrF9 = id(F9, TrUserData),
                     if TrF9 =:= 0 -> B8;
                        true -> e_type_fixed64(TrF9, <<B8/binary, 65>>, TrUserData)
                     end
                 end;
             _ -> B8
         end,
    B10 = case M of
              #{attributes := F10} ->
                  TrF10 = id(F10, TrUserData),
                  if TrF10 == [] -> B9;
                     true -> e_field_span_attributes(TrF10, B9, TrUserData)
                  end;
              _ -> B9
          end,
    B11 = case M of
              #{dropped_attributes_count := F11} ->
                  begin
                      TrF11 = id(F11, TrUserData),
                      if TrF11 =:= 0 -> B10;
                         true -> e_varint(TrF11, <<B10/binary, 80>>, TrUserData)
                      end
                  end;
              _ -> B10
          end,
    B12 = case M of
              #{events := F12} ->
                  TrF12 = id(F12, TrUserData),
                  if TrF12 == [] -> B11;
                     true -> e_field_span_events(TrF12, B11, TrUserData)
                  end;
              _ -> B11
          end,
    B13 = case M of
              #{dropped_events_count := F13} ->
                  begin
                      TrF13 = id(F13, TrUserData),
                      if TrF13 =:= 0 -> B12;
                         true -> e_varint(TrF13, <<B12/binary, 96>>, TrUserData)
                      end
                  end;
              _ -> B12
          end,
    B14 = case M of
              #{links := F14} ->
                  TrF14 = id(F14, TrUserData),
                  if TrF14 == [] -> B13;
                     true -> e_field_span_links(TrF14, B13, TrUserData)
                  end;
              _ -> B13
          end,
    B15 = case M of
              #{dropped_links_count := F15} ->
                  begin
                      TrF15 = id(F15, TrUserData),
                      if TrF15 =:= 0 -> B14;
                         true -> e_varint(TrF15, <<B14/binary, 112>>, TrUserData)
                      end
                  end;
              _ -> B14
          end,
    case M of
        #{status := F16} ->
            begin
                TrF16 = id(F16, TrUserData),
                if TrF16 =:= undefined -> B15;
                   true -> e_mfield_span_status(TrF16, <<B15/binary, 122>>, TrUserData)
                end
            end;
        _ -> B15
    end.

encode_msg_status(Msg, TrUserData) -> encode_msg_status(Msg, <<>>, TrUserData).


encode_msg_status(#{} = M, Bin, TrUserData) ->
    B1 = case M of
             #{message := F1} ->
                 begin
                     TrF1 = id(F1, TrUserData),
                     case is_empty_string(TrF1) of
                         true -> Bin;
                         false -> e_type_string(TrF1, <<Bin/binary, 18>>, TrUserData)
                     end
                 end;
             _ -> Bin
         end,
    case M of
        #{code := F2} ->
            begin
                TrF2 = id(F2, TrUserData),
                if TrF2 =:= 'STATUS_CODE_UNSET'; TrF2 =:= 0 -> B1;
                   true -> 'e_enum_status.StatusCode'(TrF2, <<B1/binary, 24>>, TrUserData)
                end
            end;
        _ -> B1
    end.

encode_msg_any_value(Msg, TrUserData) -> encode_msg_any_value(Msg, <<>>, TrUserData).


encode_msg_any_value(#{} = M, Bin, TrUserData) ->
    case M of
        #{value := F1} ->
            case id(F1, TrUserData) of
                {string_value, TF1} -> begin TrTF1 = id(TF1, TrUserData), e_type_string(TrTF1, <<Bin/binary, 10>>, TrUserData) end;
                {bool_value, TF1} -> begin TrTF1 = id(TF1, TrUserData), e_type_bool(TrTF1, <<Bin/binary, 16>>, TrUserData) end;
                {int_value, TF1} -> begin TrTF1 = id(TF1, TrUserData), e_type_int64(TrTF1, <<Bin/binary, 24>>, TrUserData) end;
                {double_value, TF1} -> begin TrTF1 = id(TF1, TrUserData), e_type_double(TrTF1, <<Bin/binary, 33>>, TrUserData) end;
                {array_value, TF1} -> begin TrTF1 = id(TF1, TrUserData), e_mfield_any_value_array_value(TrTF1, <<Bin/binary, 42>>, TrUserData) end;
                {kvlist_value, TF1} -> begin TrTF1 = id(TF1, TrUserData), e_mfield_any_value_kvlist_value(TrTF1, <<Bin/binary, 50>>, TrUserData) end;
                {bytes_value, TF1} -> begin TrTF1 = id(TF1, TrUserData), e_type_bytes(TrTF1, <<Bin/binary, 58>>, TrUserData) end
            end;
        _ -> Bin
    end.

encode_msg_array_value(Msg, TrUserData) -> encode_msg_array_value(Msg, <<>>, TrUserData).


encode_msg_array_value(#{} = M, Bin, TrUserData) ->
    case M of
        #{values := F1} ->
            TrF1 = id(F1, TrUserData),
            if TrF1 == [] -> Bin;
               true -> e_field_array_value_values(TrF1, Bin, TrUserData)
            end;
        _ -> Bin
    end.

encode_msg_key_value_list(Msg, TrUserData) -> encode_msg_key_value_list(Msg, <<>>, TrUserData).


encode_msg_key_value_list(#{} = M, Bin, TrUserData) ->
    case M of
        #{values := F1} ->
            TrF1 = id(F1, TrUserData),
            if TrF1 == [] -> Bin;
               true -> e_field_key_value_list_values(TrF1, Bin, TrUserData)
            end;
        _ -> Bin
    end.

encode_msg_key_value(Msg, TrUserData) -> encode_msg_key_value(Msg, <<>>, TrUserData).


encode_msg_key_value(#{} = M, Bin, TrUserData) ->
    B1 = case M of
             #{key := F1} ->
                 begin
                     TrF1 = id(F1, TrUserData),
                     case is_empty_string(TrF1) of
                         true -> Bin;
                         false -> e_type_string(TrF1, <<Bin/binary, 10>>, TrUserData)
                     end
                 end;
             _ -> Bin
         end,
    case M of
        #{value := F2} ->
            begin
                TrF2 = id(F2, TrUserData),
                if TrF2 =:= undefined -> B1;
                   true -> e_mfield_key_value_value(TrF2, <<B1/binary, 18>>, TrUserData)
                end
            end;
        _ -> B1
    end.

encode_msg_instrumentation_scope(Msg, TrUserData) -> encode_msg_instrumentation_scope(Msg, <<>>, TrUserData).


encode_msg_instrumentation_scope(#{} = M, Bin, TrUserData) ->
    B1 = case M of
             #{name := F1} ->
                 begin
                     TrF1 = id(F1, TrUserData),
                     case is_empty_string(TrF1) of
                         true -> Bin;
                         false -> e_type_string(TrF1, <<Bin/binary, 10>>, TrUserData)
                     end
                 end;
             _ -> Bin
         end,
    B2 = case M of
             #{version := F2} ->
                 begin
                     TrF2 = id(F2, TrUserData),
                     case is_empty_string(TrF2) of
                         true -> B1;
                         false -> e_type_string(TrF2, <<B1/binary, 18>>, TrUserData)
                     end
                 end;
             _ -> B1
         end,
    B3 = case M of
             #{attributes := F3} ->
                 TrF3 = id(F3, TrUserData),
                 if TrF3 == [] -> B2;
                    true -> e_field_instrumentation_scope_attributes(TrF3, B2, TrUserData)
                 end;
             _ -> B2
         end,
    case M of
        #{dropped_attributes_count := F4} ->
            begin
                TrF4 = id(F4, TrUserData),
                if TrF4 =:= 0 -> B3;
                   true -> e_varint(TrF4, <<B3/binary, 32>>, TrUserData)
                end
            end;
        _ -> B3
    end.

encode_msg_resource(Msg, TrUserData) -> encode_msg_resource(Msg, <<>>, TrUserData).


encode_msg_resource(#{} = M, Bin, TrUserData) ->
    B1 = case M of
             #{attributes := F1} ->
                 TrF1 = id(F1, TrUserData),
                 if TrF1 == [] -> Bin;
                    true -> e_field_resource_attributes(TrF1, Bin, TrUserData)
                 end;
             _ -> Bin
         end,
    case M of
        #{dropped_attributes_count := F2} ->
            begin
                TrF2 = id(F2, TrUserData),
                if TrF2 =:= 0 -> B1;
                   true -> e_varint(TrF2, <<B1/binary, 16>>, TrUserData)
                end
            end;
        _ -> B1
    end.

e_mfield_export_trace_service_request_resource_spans(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_resource_spans(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_export_trace_service_request_resource_spans([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 10>>,
    Bin3 = e_mfield_export_trace_service_request_resource_spans(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_export_trace_service_request_resource_spans(Rest, Bin3, TrUserData);
e_field_export_trace_service_request_resource_spans([], Bin, _TrUserData) -> Bin.

e_mfield_export_trace_service_response_partial_success(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_export_trace_partial_success(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_mfield_traces_data_resource_spans(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_resource_spans(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_traces_data_resource_spans([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 10>>,
    Bin3 = e_mfield_traces_data_resource_spans(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_traces_data_resource_spans(Rest, Bin3, TrUserData);
e_field_traces_data_resource_spans([], Bin, _TrUserData) -> Bin.

e_mfield_resource_spans_resource(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_resource(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_mfield_resource_spans_scope_spans(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_scope_spans(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_resource_spans_scope_spans([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 18>>,
    Bin3 = e_mfield_resource_spans_scope_spans(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_resource_spans_scope_spans(Rest, Bin3, TrUserData);
e_field_resource_spans_scope_spans([], Bin, _TrUserData) -> Bin.

e_mfield_scope_spans_scope(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_instrumentation_scope(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_mfield_scope_spans_spans(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_span(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_scope_spans_spans([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 18>>,
    Bin3 = e_mfield_scope_spans_spans(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_scope_spans_spans(Rest, Bin3, TrUserData);
e_field_scope_spans_spans([], Bin, _TrUserData) -> Bin.

e_mfield_event_attributes(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_key_value(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_event_attributes([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 26>>,
    Bin3 = e_mfield_event_attributes(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_event_attributes(Rest, Bin3, TrUserData);
e_field_event_attributes([], Bin, _TrUserData) -> Bin.

e_mfield_link_attributes(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_key_value(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_link_attributes([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 34>>,
    Bin3 = e_mfield_link_attributes(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_link_attributes(Rest, Bin3, TrUserData);
e_field_link_attributes([], Bin, _TrUserData) -> Bin.

e_mfield_span_attributes(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_key_value(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_span_attributes([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 74>>,
    Bin3 = e_mfield_span_attributes(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_span_attributes(Rest, Bin3, TrUserData);
e_field_span_attributes([], Bin, _TrUserData) -> Bin.

e_mfield_span_events(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_event(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_span_events([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 90>>,
    Bin3 = e_mfield_span_events(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_span_events(Rest, Bin3, TrUserData);
e_field_span_events([], Bin, _TrUserData) -> Bin.

e_mfield_span_links(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_link(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_span_links([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 106>>,
    Bin3 = e_mfield_span_links(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_span_links(Rest, Bin3, TrUserData);
e_field_span_links([], Bin, _TrUserData) -> Bin.

e_mfield_span_status(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_status(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_mfield_any_value_array_value(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_array_value(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_mfield_any_value_kvlist_value(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_key_value_list(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_mfield_array_value_values(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_any_value(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_array_value_values([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 10>>,
    Bin3 = e_mfield_array_value_values(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_array_value_values(Rest, Bin3, TrUserData);
e_field_array_value_values([], Bin, _TrUserData) -> Bin.

e_mfield_key_value_list_values(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_key_value(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_key_value_list_values([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 10>>,
    Bin3 = e_mfield_key_value_list_values(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_key_value_list_values(Rest, Bin3, TrUserData);
e_field_key_value_list_values([], Bin, _TrUserData) -> Bin.

e_mfield_key_value_value(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_any_value(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_mfield_instrumentation_scope_attributes(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_key_value(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_instrumentation_scope_attributes([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 26>>,
    Bin3 = e_mfield_instrumentation_scope_attributes(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_instrumentation_scope_attributes(Rest, Bin3, TrUserData);
e_field_instrumentation_scope_attributes([], Bin, _TrUserData) -> Bin.

e_mfield_resource_attributes(Msg, Bin, TrUserData) ->
    SubBin = encode_msg_key_value(Msg, <<>>, TrUserData),
    Bin2 = e_varint(byte_size(SubBin), Bin),
    <<Bin2/binary, SubBin/binary>>.

e_field_resource_attributes([Elem | Rest], Bin, TrUserData) ->
    Bin2 = <<Bin/binary, 10>>,
    Bin3 = e_mfield_resource_attributes(id(Elem, TrUserData), Bin2, TrUserData),
    e_field_resource_attributes(Rest, Bin3, TrUserData);
e_field_resource_attributes([], Bin, _TrUserData) -> Bin.

'e_enum_span.SpanKind'('SPAN_KIND_UNSPECIFIED', Bin, _TrUserData) -> <<Bin/binary, 0>>;
'e_enum_span.SpanKind'('SPAN_KIND_INTERNAL', Bin, _TrUserData) -> <<Bin/binary, 1>>;
'e_enum_span.SpanKind'('SPAN_KIND_SERVER', Bin, _TrUserData) -> <<Bin/binary, 2>>;
'e_enum_span.SpanKind'('SPAN_KIND_CLIENT', Bin, _TrUserData) -> <<Bin/binary, 3>>;
'e_enum_span.SpanKind'('SPAN_KIND_PRODUCER', Bin, _TrUserData) -> <<Bin/binary, 4>>;
'e_enum_span.SpanKind'('SPAN_KIND_CONSUMER', Bin, _TrUserData) -> <<Bin/binary, 5>>;
'e_enum_span.SpanKind'(V, Bin, _TrUserData) -> e_varint(V, Bin).

'e_enum_status.StatusCode'('STATUS_CODE_UNSET', Bin, _TrUserData) -> <<Bin/binary, 0>>;
'e_enum_status.StatusCode'('STATUS_CODE_OK', Bin, _TrUserData) -> <<Bin/binary, 1>>;
'e_enum_status.StatusCode'('STATUS_CODE_ERROR', Bin, _TrUserData) -> <<Bin/binary, 2>>;
'e_enum_status.StatusCode'(V, Bin, _TrUserData) -> e_varint(V, Bin).

-compile({nowarn_unused_function,e_type_sint/3}).
e_type_sint(Value, Bin, _TrUserData) when Value >= 0 -> e_varint(Value * 2, Bin);
e_type_sint(Value, Bin, _TrUserData) -> e_varint(Value * -2 - 1, Bin).

-compile({nowarn_unused_function,e_type_int32/3}).
e_type_int32(Value, Bin, _TrUserData) when 0 =< Value, Value =< 127 -> <<Bin/binary, Value>>;
e_type_int32(Value, Bin, _TrUserData) ->
    <<N:64/unsigned-native>> = <<Value:64/signed-native>>,
    e_varint(N, Bin).

-compile({nowarn_unused_function,e_type_int64/3}).
e_type_int64(Value, Bin, _TrUserData) when 0 =< Value, Value =< 127 -> <<Bin/binary, Value>>;
e_type_int64(Value, Bin, _TrUserData) ->
    <<N:64/unsigned-native>> = <<Value:64/signed-native>>,
    e_varint(N, Bin).

-compile({nowarn_unused_function,e_type_bool/3}).
e_type_bool(true, Bin, _TrUserData) -> <<Bin/binary, 1>>;
e_type_bool(false, Bin, _TrUserData) -> <<Bin/binary, 0>>;
e_type_bool(1, Bin, _TrUserData) -> <<Bin/binary, 1>>;
e_type_bool(0, Bin, _TrUserData) -> <<Bin/binary, 0>>.

-compile({nowarn_unused_function,e_type_string/3}).
e_type_string(S, Bin, _TrUserData) ->
    Utf8 = unicode:characters_to_binary(S),
    Bin2 = e_varint(byte_size(Utf8), Bin),
    <<Bin2/binary, Utf8/binary>>.

-compile({nowarn_unused_function,e_type_bytes/3}).
e_type_bytes(Bytes, Bin, _TrUserData) when is_binary(Bytes) ->
    Bin2 = e_varint(byte_size(Bytes), Bin),
    <<Bin2/binary, Bytes/binary>>;
e_type_bytes(Bytes, Bin, _TrUserData) when is_list(Bytes) ->
    BytesBin = iolist_to_binary(Bytes),
    Bin2 = e_varint(byte_size(BytesBin), Bin),
    <<Bin2/binary, BytesBin/binary>>.

-compile({nowarn_unused_function,e_type_fixed32/3}).
e_type_fixed32(Value, Bin, _TrUserData) -> <<Bin/binary, Value:32/little>>.

-compile({nowarn_unused_function,e_type_sfixed32/3}).
e_type_sfixed32(Value, Bin, _TrUserData) -> <<Bin/binary, Value:32/little-signed>>.

-compile({nowarn_unused_function,e_type_fixed64/3}).
e_type_fixed64(Value, Bin, _TrUserData) -> <<Bin/binary, Value:64/little>>.

-compile({nowarn_unused_function,e_type_sfixed64/3}).
e_type_sfixed64(Value, Bin, _TrUserData) -> <<Bin/binary, Value:64/little-signed>>.

-compile({nowarn_unused_function,e_type_float/3}).
e_type_float(V, Bin, _) when is_number(V) -> <<Bin/binary, V:32/little-float>>;
e_type_float(infinity, Bin, _) -> <<Bin/binary, 0:16, 128, 127>>;
e_type_float('-infinity', Bin, _) -> <<Bin/binary, 0:16, 128, 255>>;
e_type_float(nan, Bin, _) -> <<Bin/binary, 0:16, 192, 127>>.

-compile({nowarn_unused_function,e_type_double/3}).
e_type_double(V, Bin, _) when is_number(V) -> <<Bin/binary, V:64/little-float>>;
e_type_double(infinity, Bin, _) -> <<Bin/binary, 0:48, 240, 127>>;
e_type_double('-infinity', Bin, _) -> <<Bin/binary, 0:48, 240, 255>>;
e_type_double(nan, Bin, _) -> <<Bin/binary, 0:48, 248, 127>>.

-compile({nowarn_unused_function,e_unknown_elems/2}).
e_unknown_elems([Elem | Rest], Bin) ->
    BinR = case Elem of
               {varint, FNum, N} ->
                   BinF = e_varint(FNum bsl 3, Bin),
                   e_varint(N, BinF);
               {length_delimited, FNum, Data} ->
                   BinF = e_varint(FNum bsl 3 bor 2, Bin),
                   BinL = e_varint(byte_size(Data), BinF),
                   <<BinL/binary, Data/binary>>;
               {group, FNum, GroupFields} ->
                   Bin1 = e_varint(FNum bsl 3 bor 3, Bin),
                   Bin2 = e_unknown_elems(GroupFields, Bin1),
                   e_varint(FNum bsl 3 bor 4, Bin2);
               {fixed32, FNum, V} ->
                   BinF = e_varint(FNum bsl 3 bor 5, Bin),
                   <<BinF/binary, V:32/little>>;
               {fixed64, FNum, V} ->
                   BinF = e_varint(FNum bsl 3 bor 1, Bin),
                   <<BinF/binary, V:64/little>>
           end,
    e_unknown_elems(Rest, BinR);
e_unknown_elems([], Bin) -> Bin.

-compile({nowarn_unused_function,e_varint/3}).
e_varint(N, Bin, _TrUserData) -> e_varint(N, Bin).

-compile({nowarn_unused_function,e_varint/2}).
e_varint(N, Bin) when N =< 127 -> <<Bin/binary, N>>;
e_varint(N, Bin) ->
    Bin2 = <<Bin/binary, (N band 127 bor 128)>>,
    e_varint(N bsr 7, Bin2).

is_empty_string("") -> true;
is_empty_string(<<>>) -> true;
is_empty_string(L) when is_list(L) -> not string_has_chars(L);
is_empty_string(B) when is_binary(B) -> false.

string_has_chars([C | _]) when is_integer(C) -> true;
string_has_chars([H | T]) ->
    case string_has_chars(H) of
        true -> true;
        false -> string_has_chars(T)
    end;
string_has_chars(B) when is_binary(B), byte_size(B) =/= 0 -> true;
string_has_chars(C) when is_integer(C) -> true;
string_has_chars(<<>>) -> false;
string_has_chars([]) -> false.


decode_msg(Bin, MsgName) when is_binary(Bin) -> decode_msg(Bin, MsgName, []).

decode_msg(Bin, MsgName, Opts) when is_binary(Bin) ->
    TrUserData = proplists:get_value(user_data, Opts),
    decode_msg_1_catch(Bin, MsgName, TrUserData).

-ifdef('OTP_RELEASE').
decode_msg_1_catch(Bin, MsgName, TrUserData) ->
    try decode_msg_2_doit(MsgName, Bin, TrUserData)
    catch
        error:{gpb_error,_}=Reason:StackTrace ->
            erlang:raise(error, Reason, StackTrace);
        Class:Reason:StackTrace -> error({gpb_error,{decoding_failure, {Bin, MsgName, {Class, Reason, StackTrace}}}})
    end.
-else.
decode_msg_1_catch(Bin, MsgName, TrUserData) ->
    try decode_msg_2_doit(MsgName, Bin, TrUserData)
    catch
        error:{gpb_error,_}=Reason ->
            erlang:raise(error, Reason,
                         erlang:get_stacktrace());
        Class:Reason ->
            StackTrace = erlang:get_stacktrace(),
            error({gpb_error,{decoding_failure, {Bin, MsgName, {Class, Reason, StackTrace}}}})
    end.
-endif.

decode_msg_2_doit(export_trace_service_request, Bin, TrUserData) -> id(decode_msg_export_trace_service_request(Bin, TrUserData), TrUserData);
decode_msg_2_doit(export_trace_service_response, Bin, TrUserData) -> id(decode_msg_export_trace_service_response(Bin, TrUserData), TrUserData);
decode_msg_2_doit(export_trace_partial_success, Bin, TrUserData) -> id(decode_msg_export_trace_partial_success(Bin, TrUserData), TrUserData);
decode_msg_2_doit(traces_data, Bin, TrUserData) -> id(decode_msg_traces_data(Bin, TrUserData), TrUserData);
decode_msg_2_doit(resource_spans, Bin, TrUserData) -> id(decode_msg_resource_spans(Bin, TrUserData), TrUserData);
decode_msg_2_doit(scope_spans, Bin, TrUserData) -> id(decode_msg_scope_spans(Bin, TrUserData), TrUserData);
decode_msg_2_doit(event, Bin, TrUserData) -> id(decode_msg_event(Bin, TrUserData), TrUserData);
decode_msg_2_doit(link, Bin, TrUserData) -> id(decode_msg_link(Bin, TrUserData), TrUserData);
decode_msg_2_doit(span, Bin, TrUserData) -> id(decode_msg_span(Bin, TrUserData), TrUserData);
decode_msg_2_doit(status, Bin, TrUserData) -> id(decode_msg_status(Bin, TrUserData), TrUserData);
decode_msg_2_doit(any_value, Bin, TrUserData) -> id(decode_msg_any_value(Bin, TrUserData), TrUserData);
decode_msg_2_doit(array_value, Bin, TrUserData) -> id(decode_msg_array_value(Bin, TrUserData), TrUserData);
decode_msg_2_doit(key_value_list, Bin, TrUserData) -> id(decode_msg_key_value_list(Bin, TrUserData), TrUserData);
decode_msg_2_doit(key_value, Bin, TrUserData) -> id(decode_msg_key_value(Bin, TrUserData), TrUserData);
decode_msg_2_doit(instrumentation_scope, Bin, TrUserData) -> id(decode_msg_instrumentation_scope(Bin, TrUserData), TrUserData);
decode_msg_2_doit(resource, Bin, TrUserData) -> id(decode_msg_resource(Bin, TrUserData), TrUserData).



decode_msg_export_trace_service_request(Bin, TrUserData) -> dfp_read_field_def_export_trace_service_request(Bin, 0, 0, 0, id([], TrUserData), TrUserData).

dfp_read_field_def_export_trace_service_request(<<10, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_export_trace_service_request_resource_spans(Rest, Z1, Z2, F, F@_1, TrUserData);
dfp_read_field_def_export_trace_service_request(<<>>, 0, 0, _, R1, TrUserData) ->
    S1 = #{},
    if R1 == '$undef' -> S1;
       true -> S1#{resource_spans => lists_reverse(R1, TrUserData)}
    end;
dfp_read_field_def_export_trace_service_request(Other, Z1, Z2, F, F@_1, TrUserData) -> dg_read_field_def_export_trace_service_request(Other, Z1, Z2, F, F@_1, TrUserData).

dg_read_field_def_export_trace_service_request(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 32 - 7 -> dg_read_field_def_export_trace_service_request(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
dg_read_field_def_export_trace_service_request(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_export_trace_service_request_resource_spans(Rest, 0, 0, 0, F@_1, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_export_trace_service_request(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                1 -> skip_64_export_trace_service_request(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                2 -> skip_length_delimited_export_trace_service_request(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                3 -> skip_group_export_trace_service_request(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                5 -> skip_32_export_trace_service_request(Rest, 0, 0, Key bsr 3, F@_1, TrUserData)
            end
    end;
dg_read_field_def_export_trace_service_request(<<>>, 0, 0, _, R1, TrUserData) ->
    S1 = #{},
    if R1 == '$undef' -> S1;
       true -> S1#{resource_spans => lists_reverse(R1, TrUserData)}
    end.

d_field_export_trace_service_request_resource_spans(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> d_field_export_trace_service_request_resource_spans(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
d_field_export_trace_service_request_resource_spans(<<0:1, X:7, Rest/binary>>, N, Acc, F, Prev, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_resource_spans(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_export_trace_service_request(RestF, 0, 0, F, cons(NewFValue, Prev, TrUserData), TrUserData).

skip_varint_export_trace_service_request(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> skip_varint_export_trace_service_request(Rest, Z1, Z2, F, F@_1, TrUserData);
skip_varint_export_trace_service_request(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_export_trace_service_request(Rest, Z1, Z2, F, F@_1, TrUserData).

skip_length_delimited_export_trace_service_request(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> skip_length_delimited_export_trace_service_request(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
skip_length_delimited_export_trace_service_request(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_export_trace_service_request(Rest2, 0, 0, F, F@_1, TrUserData).

skip_group_export_trace_service_request(Bin, _, Z2, FNum, F@_1, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_export_trace_service_request(Rest, 0, Z2, FNum, F@_1, TrUserData).

skip_32_export_trace_service_request(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_export_trace_service_request(Rest, Z1, Z2, F, F@_1, TrUserData).

skip_64_export_trace_service_request(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_export_trace_service_request(Rest, Z1, Z2, F, F@_1, TrUserData).

decode_msg_export_trace_service_response(Bin, TrUserData) -> dfp_read_field_def_export_trace_service_response(Bin, 0, 0, 0, id('$undef', TrUserData), TrUserData).

dfp_read_field_def_export_trace_service_response(<<10, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_export_trace_service_response_partial_success(Rest, Z1, Z2, F, F@_1, TrUserData);
dfp_read_field_def_export_trace_service_response(<<>>, 0, 0, _, F@_1, _) ->
    S1 = #{},
    if F@_1 == '$undef' -> S1;
       true -> S1#{partial_success => F@_1}
    end;
dfp_read_field_def_export_trace_service_response(Other, Z1, Z2, F, F@_1, TrUserData) -> dg_read_field_def_export_trace_service_response(Other, Z1, Z2, F, F@_1, TrUserData).

dg_read_field_def_export_trace_service_response(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 32 - 7 -> dg_read_field_def_export_trace_service_response(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
dg_read_field_def_export_trace_service_response(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_export_trace_service_response_partial_success(Rest, 0, 0, 0, F@_1, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_export_trace_service_response(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                1 -> skip_64_export_trace_service_response(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                2 -> skip_length_delimited_export_trace_service_response(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                3 -> skip_group_export_trace_service_response(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                5 -> skip_32_export_trace_service_response(Rest, 0, 0, Key bsr 3, F@_1, TrUserData)
            end
    end;
dg_read_field_def_export_trace_service_response(<<>>, 0, 0, _, F@_1, _) ->
    S1 = #{},
    if F@_1 == '$undef' -> S1;
       true -> S1#{partial_success => F@_1}
    end.

d_field_export_trace_service_response_partial_success(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> d_field_export_trace_service_response_partial_success(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
d_field_export_trace_service_response_partial_success(<<0:1, X:7, Rest/binary>>, N, Acc, F, Prev, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_export_trace_partial_success(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_export_trace_service_response(RestF,
                                                     0,
                                                     0,
                                                     F,
                                                     if Prev == '$undef' -> NewFValue;
                                                        true -> merge_msg_export_trace_partial_success(Prev, NewFValue, TrUserData)
                                                     end,
                                                     TrUserData).

skip_varint_export_trace_service_response(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> skip_varint_export_trace_service_response(Rest, Z1, Z2, F, F@_1, TrUserData);
skip_varint_export_trace_service_response(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_export_trace_service_response(Rest, Z1, Z2, F, F@_1, TrUserData).

skip_length_delimited_export_trace_service_response(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> skip_length_delimited_export_trace_service_response(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
skip_length_delimited_export_trace_service_response(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_export_trace_service_response(Rest2, 0, 0, F, F@_1, TrUserData).

skip_group_export_trace_service_response(Bin, _, Z2, FNum, F@_1, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_export_trace_service_response(Rest, 0, Z2, FNum, F@_1, TrUserData).

skip_32_export_trace_service_response(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_export_trace_service_response(Rest, Z1, Z2, F, F@_1, TrUserData).

skip_64_export_trace_service_response(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_export_trace_service_response(Rest, Z1, Z2, F, F@_1, TrUserData).

decode_msg_export_trace_partial_success(Bin, TrUserData) -> dfp_read_field_def_export_trace_partial_success(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), TrUserData).

dfp_read_field_def_export_trace_partial_success(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> d_field_export_trace_partial_success_rejected_spans(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData);
dfp_read_field_def_export_trace_partial_success(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> d_field_export_trace_partial_success_error_message(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData);
dfp_read_field_def_export_trace_partial_success(<<>>, 0, 0, _, F@_1, F@_2, _) -> #{rejected_spans => F@_1, error_message => F@_2};
dfp_read_field_def_export_trace_partial_success(Other, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dg_read_field_def_export_trace_partial_success(Other, Z1, Z2, F, F@_1, F@_2, TrUserData).

dg_read_field_def_export_trace_partial_success(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 32 - 7 -> dg_read_field_def_export_trace_partial_success(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
dg_read_field_def_export_trace_partial_success(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        8 -> d_field_export_trace_partial_success_rejected_spans(Rest, 0, 0, 0, F@_1, F@_2, TrUserData);
        18 -> d_field_export_trace_partial_success_error_message(Rest, 0, 0, 0, F@_1, F@_2, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_export_trace_partial_success(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                1 -> skip_64_export_trace_partial_success(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                2 -> skip_length_delimited_export_trace_partial_success(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                3 -> skip_group_export_trace_partial_success(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                5 -> skip_32_export_trace_partial_success(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData)
            end
    end;
dg_read_field_def_export_trace_partial_success(<<>>, 0, 0, _, F@_1, F@_2, _) -> #{rejected_spans => F@_1, error_message => F@_2}.

d_field_export_trace_partial_success_rejected_spans(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> d_field_export_trace_partial_success_rejected_spans(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
d_field_export_trace_partial_success_rejected_spans(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, TrUserData) ->
    {NewFValue, RestF} = {begin <<Res:64/signed-native>> = <<(X bsl N + Acc):64/unsigned-native>>, id(Res, TrUserData) end, Rest},
    dfp_read_field_def_export_trace_partial_success(RestF, 0, 0, F, NewFValue, F@_2, TrUserData).

d_field_export_trace_partial_success_error_message(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> d_field_export_trace_partial_success_error_message(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
d_field_export_trace_partial_success_error_message(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_export_trace_partial_success(RestF, 0, 0, F, F@_1, NewFValue, TrUserData).

skip_varint_export_trace_partial_success(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> skip_varint_export_trace_partial_success(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData);
skip_varint_export_trace_partial_success(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_export_trace_partial_success(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).

skip_length_delimited_export_trace_partial_success(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> skip_length_delimited_export_trace_partial_success(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
skip_length_delimited_export_trace_partial_success(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_export_trace_partial_success(Rest2, 0, 0, F, F@_1, F@_2, TrUserData).

skip_group_export_trace_partial_success(Bin, _, Z2, FNum, F@_1, F@_2, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_export_trace_partial_success(Rest, 0, Z2, FNum, F@_1, F@_2, TrUserData).

skip_32_export_trace_partial_success(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_export_trace_partial_success(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).

skip_64_export_trace_partial_success(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_export_trace_partial_success(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).

decode_msg_traces_data(Bin, TrUserData) -> dfp_read_field_def_traces_data(Bin, 0, 0, 0, id([], TrUserData), TrUserData).

dfp_read_field_def_traces_data(<<10, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_traces_data_resource_spans(Rest, Z1, Z2, F, F@_1, TrUserData);
dfp_read_field_def_traces_data(<<>>, 0, 0, _, R1, TrUserData) ->
    S1 = #{},
    if R1 == '$undef' -> S1;
       true -> S1#{resource_spans => lists_reverse(R1, TrUserData)}
    end;
dfp_read_field_def_traces_data(Other, Z1, Z2, F, F@_1, TrUserData) -> dg_read_field_def_traces_data(Other, Z1, Z2, F, F@_1, TrUserData).

dg_read_field_def_traces_data(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 32 - 7 -> dg_read_field_def_traces_data(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
dg_read_field_def_traces_data(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_traces_data_resource_spans(Rest, 0, 0, 0, F@_1, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_traces_data(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                1 -> skip_64_traces_data(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                2 -> skip_length_delimited_traces_data(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                3 -> skip_group_traces_data(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                5 -> skip_32_traces_data(Rest, 0, 0, Key bsr 3, F@_1, TrUserData)
            end
    end;
dg_read_field_def_traces_data(<<>>, 0, 0, _, R1, TrUserData) ->
    S1 = #{},
    if R1 == '$undef' -> S1;
       true -> S1#{resource_spans => lists_reverse(R1, TrUserData)}
    end.

d_field_traces_data_resource_spans(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> d_field_traces_data_resource_spans(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
d_field_traces_data_resource_spans(<<0:1, X:7, Rest/binary>>, N, Acc, F, Prev, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_resource_spans(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_traces_data(RestF, 0, 0, F, cons(NewFValue, Prev, TrUserData), TrUserData).

skip_varint_traces_data(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> skip_varint_traces_data(Rest, Z1, Z2, F, F@_1, TrUserData);
skip_varint_traces_data(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_traces_data(Rest, Z1, Z2, F, F@_1, TrUserData).

skip_length_delimited_traces_data(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> skip_length_delimited_traces_data(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
skip_length_delimited_traces_data(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_traces_data(Rest2, 0, 0, F, F@_1, TrUserData).

skip_group_traces_data(Bin, _, Z2, FNum, F@_1, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_traces_data(Rest, 0, Z2, FNum, F@_1, TrUserData).

skip_32_traces_data(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_traces_data(Rest, Z1, Z2, F, F@_1, TrUserData).

skip_64_traces_data(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_traces_data(Rest, Z1, Z2, F, F@_1, TrUserData).

decode_msg_resource_spans(Bin, TrUserData) -> dfp_read_field_def_resource_spans(Bin, 0, 0, 0, id('$undef', TrUserData), id([], TrUserData), id(<<>>, TrUserData), TrUserData).

dfp_read_field_def_resource_spans(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_resource_spans_resource(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
dfp_read_field_def_resource_spans(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_resource_spans_scope_spans(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
dfp_read_field_def_resource_spans(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_resource_spans_schema_url(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
dfp_read_field_def_resource_spans(<<>>, 0, 0, _, F@_1, R1, F@_3, TrUserData) ->
    S1 = #{schema_url => F@_3},
    S2 = if F@_1 == '$undef' -> S1;
            true -> S1#{resource => F@_1}
         end,
    if R1 == '$undef' -> S2;
       true -> S2#{scope_spans => lists_reverse(R1, TrUserData)}
    end;
dfp_read_field_def_resource_spans(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dg_read_field_def_resource_spans(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData).

dg_read_field_def_resource_spans(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 32 - 7 -> dg_read_field_def_resource_spans(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
dg_read_field_def_resource_spans(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_resource_spans_resource(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData);
        18 -> d_field_resource_spans_scope_spans(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData);
        26 -> d_field_resource_spans_schema_url(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_resource_spans(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData);
                1 -> skip_64_resource_spans(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData);
                2 -> skip_length_delimited_resource_spans(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData);
                3 -> skip_group_resource_spans(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData);
                5 -> skip_32_resource_spans(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData)
            end
    end;
dg_read_field_def_resource_spans(<<>>, 0, 0, _, F@_1, R1, F@_3, TrUserData) ->
    S1 = #{schema_url => F@_3},
    S2 = if F@_1 == '$undef' -> S1;
            true -> S1#{resource => F@_1}
         end,
    if R1 == '$undef' -> S2;
       true -> S2#{scope_spans => lists_reverse(R1, TrUserData)}
    end.

d_field_resource_spans_resource(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_resource_spans_resource(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
d_field_resource_spans_resource(<<0:1, X:7, Rest/binary>>, N, Acc, F, Prev, F@_2, F@_3, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_resource(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_resource_spans(RestF,
                                      0,
                                      0,
                                      F,
                                      if Prev == '$undef' -> NewFValue;
                                         true -> merge_msg_resource(Prev, NewFValue, TrUserData)
                                      end,
                                      F@_2,
                                      F@_3,
                                      TrUserData).

d_field_resource_spans_scope_spans(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_resource_spans_scope_spans(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
d_field_resource_spans_scope_spans(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, Prev, F@_3, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_scope_spans(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_resource_spans(RestF, 0, 0, F, F@_1, cons(NewFValue, Prev, TrUserData), F@_3, TrUserData).

d_field_resource_spans_schema_url(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_resource_spans_schema_url(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
d_field_resource_spans_schema_url(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_resource_spans(RestF, 0, 0, F, F@_1, F@_2, NewFValue, TrUserData).

skip_varint_resource_spans(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> skip_varint_resource_spans(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
skip_varint_resource_spans(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_resource_spans(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData).

skip_length_delimited_resource_spans(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> skip_length_delimited_resource_spans(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
skip_length_delimited_resource_spans(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_resource_spans(Rest2, 0, 0, F, F@_1, F@_2, F@_3, TrUserData).

skip_group_resource_spans(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_resource_spans(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, TrUserData).

skip_32_resource_spans(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_resource_spans(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData).

skip_64_resource_spans(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_resource_spans(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData).

decode_msg_scope_spans(Bin, TrUserData) -> dfp_read_field_def_scope_spans(Bin, 0, 0, 0, id('$undef', TrUserData), id([], TrUserData), id(<<>>, TrUserData), TrUserData).

dfp_read_field_def_scope_spans(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_scope_spans_scope(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
dfp_read_field_def_scope_spans(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_scope_spans_spans(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
dfp_read_field_def_scope_spans(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_scope_spans_schema_url(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
dfp_read_field_def_scope_spans(<<>>, 0, 0, _, F@_1, R1, F@_3, TrUserData) ->
    S1 = #{schema_url => F@_3},
    S2 = if F@_1 == '$undef' -> S1;
            true -> S1#{scope => F@_1}
         end,
    if R1 == '$undef' -> S2;
       true -> S2#{spans => lists_reverse(R1, TrUserData)}
    end;
dfp_read_field_def_scope_spans(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dg_read_field_def_scope_spans(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData).

dg_read_field_def_scope_spans(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 32 - 7 -> dg_read_field_def_scope_spans(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
dg_read_field_def_scope_spans(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_scope_spans_scope(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData);
        18 -> d_field_scope_spans_spans(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData);
        26 -> d_field_scope_spans_schema_url(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_scope_spans(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData);
                1 -> skip_64_scope_spans(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData);
                2 -> skip_length_delimited_scope_spans(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData);
                3 -> skip_group_scope_spans(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData);
                5 -> skip_32_scope_spans(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData)
            end
    end;
dg_read_field_def_scope_spans(<<>>, 0, 0, _, F@_1, R1, F@_3, TrUserData) ->
    S1 = #{schema_url => F@_3},
    S2 = if F@_1 == '$undef' -> S1;
            true -> S1#{scope => F@_1}
         end,
    if R1 == '$undef' -> S2;
       true -> S2#{spans => lists_reverse(R1, TrUserData)}
    end.

d_field_scope_spans_scope(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_scope_spans_scope(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
d_field_scope_spans_scope(<<0:1, X:7, Rest/binary>>, N, Acc, F, Prev, F@_2, F@_3, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_instrumentation_scope(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_scope_spans(RestF,
                                   0,
                                   0,
                                   F,
                                   if Prev == '$undef' -> NewFValue;
                                      true -> merge_msg_instrumentation_scope(Prev, NewFValue, TrUserData)
                                   end,
                                   F@_2,
                                   F@_3,
                                   TrUserData).

d_field_scope_spans_spans(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_scope_spans_spans(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
d_field_scope_spans_spans(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, Prev, F@_3, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_span(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_scope_spans(RestF, 0, 0, F, F@_1, cons(NewFValue, Prev, TrUserData), F@_3, TrUserData).

d_field_scope_spans_schema_url(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_scope_spans_schema_url(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
d_field_scope_spans_schema_url(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_scope_spans(RestF, 0, 0, F, F@_1, F@_2, NewFValue, TrUserData).

skip_varint_scope_spans(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> skip_varint_scope_spans(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
skip_varint_scope_spans(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_scope_spans(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData).

skip_length_delimited_scope_spans(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> skip_length_delimited_scope_spans(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
skip_length_delimited_scope_spans(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_scope_spans(Rest2, 0, 0, F, F@_1, F@_2, F@_3, TrUserData).

skip_group_scope_spans(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_scope_spans(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, TrUserData).

skip_32_scope_spans(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_scope_spans(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData).

skip_64_scope_spans(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_scope_spans(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData).

decode_msg_event(Bin, TrUserData) -> dfp_read_field_def_event(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id([], TrUserData), id(0, TrUserData), TrUserData).

dfp_read_field_def_event(<<9, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_event_time_unix_nano(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dfp_read_field_def_event(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_event_name(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dfp_read_field_def_event(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_event_attributes(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dfp_read_field_def_event(<<32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_event_dropped_attributes_count(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dfp_read_field_def_event(<<>>, 0, 0, _, F@_1, F@_2, R1, F@_4, TrUserData) ->
    S1 = #{time_unix_nano => F@_1, name => F@_2, dropped_attributes_count => F@_4},
    if R1 == '$undef' -> S1;
       true -> S1#{attributes => lists_reverse(R1, TrUserData)}
    end;
dfp_read_field_def_event(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dg_read_field_def_event(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData).

dg_read_field_def_event(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 32 - 7 -> dg_read_field_def_event(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dg_read_field_def_event(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        9 -> d_field_event_time_unix_nano(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData);
        18 -> d_field_event_name(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData);
        26 -> d_field_event_attributes(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData);
        32 -> d_field_event_dropped_attributes_count(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_event(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData);
                1 -> skip_64_event(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData);
                2 -> skip_length_delimited_event(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData);
                3 -> skip_group_event(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData);
                5 -> skip_32_event(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData)
            end
    end;
dg_read_field_def_event(<<>>, 0, 0, _, F@_1, F@_2, R1, F@_4, TrUserData) ->
    S1 = #{time_unix_nano => F@_1, name => F@_2, dropped_attributes_count => F@_4},
    if R1 == '$undef' -> S1;
       true -> S1#{attributes => lists_reverse(R1, TrUserData)}
    end.

d_field_event_time_unix_nano(<<Value:64/little, Rest/binary>>, Z1, Z2, F, _, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_event(Rest, Z1, Z2, F, id(Value, TrUserData), F@_2, F@_3, F@_4, TrUserData).

d_field_event_name(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_event_name(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
d_field_event_name(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_event(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, TrUserData).

d_field_event_attributes(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_event_attributes(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
d_field_event_attributes(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, Prev, F@_4, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_key_value(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_event(RestF, 0, 0, F, F@_1, F@_2, cons(NewFValue, Prev, TrUserData), F@_4, TrUserData).

d_field_event_dropped_attributes_count(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_event_dropped_attributes_count(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
d_field_event_dropped_attributes_count(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, _, TrUserData) ->
    {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
    dfp_read_field_def_event(RestF, 0, 0, F, F@_1, F@_2, F@_3, NewFValue, TrUserData).

skip_varint_event(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> skip_varint_event(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
skip_varint_event(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_event(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData).

skip_length_delimited_event(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> skip_length_delimited_event(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
skip_length_delimited_event(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_event(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, TrUserData).

skip_group_event(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_event(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, TrUserData).

skip_32_event(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_event(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData).

skip_64_event(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_event(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData).

decode_msg_link(Bin, TrUserData) -> dfp_read_field_def_link(Bin, 0, 0, 0, id(<<>>, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id([], TrUserData), id(0, TrUserData), id(0, TrUserData), TrUserData).

dfp_read_field_def_link(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_link_trace_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
dfp_read_field_def_link(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_link_span_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
dfp_read_field_def_link(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_link_trace_state(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
dfp_read_field_def_link(<<34, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_link_attributes(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
dfp_read_field_def_link(<<40, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_link_dropped_attributes_count(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
dfp_read_field_def_link(<<53, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_link_flags(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
dfp_read_field_def_link(<<>>, 0, 0, _, F@_1, F@_2, F@_3, R1, F@_5, F@_6, TrUserData) ->
    S1 = #{trace_id => F@_1, span_id => F@_2, trace_state => F@_3, dropped_attributes_count => F@_5, flags => F@_6},
    if R1 == '$undef' -> S1;
       true -> S1#{attributes => lists_reverse(R1, TrUserData)}
    end;
dfp_read_field_def_link(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> dg_read_field_def_link(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData).

dg_read_field_def_link(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) when N < 32 - 7 -> dg_read_field_def_link(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
dg_read_field_def_link(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_link_trace_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
        18 -> d_field_link_span_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
        26 -> d_field_link_trace_state(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
        34 -> d_field_link_attributes(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
        40 -> d_field_link_dropped_attributes_count(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
        53 -> d_field_link_flags(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_link(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
                1 -> skip_64_link(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
                2 -> skip_length_delimited_link(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
                3 -> skip_group_link(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
                5 -> skip_32_link(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData)
            end
    end;
dg_read_field_def_link(<<>>, 0, 0, _, F@_1, F@_2, F@_3, R1, F@_5, F@_6, TrUserData) ->
    S1 = #{trace_id => F@_1, span_id => F@_2, trace_state => F@_3, dropped_attributes_count => F@_5, flags => F@_6},
    if R1 == '$undef' -> S1;
       true -> S1#{attributes => lists_reverse(R1, TrUserData)}
    end.

d_field_link_trace_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) when N < 57 -> d_field_link_trace_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
d_field_link_trace_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_link(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData).

d_field_link_span_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) when N < 57 -> d_field_link_span_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
d_field_link_span_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, F@_5, F@_6, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_link(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, F@_5, F@_6, TrUserData).

d_field_link_trace_state(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) when N < 57 -> d_field_link_trace_state(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
d_field_link_trace_state(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, F@_5, F@_6, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_link(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, F@_5, F@_6, TrUserData).

d_field_link_attributes(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) when N < 57 -> d_field_link_attributes(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
d_field_link_attributes(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, Prev, F@_5, F@_6, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_key_value(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_link(RestF, 0, 0, F, F@_1, F@_2, F@_3, cons(NewFValue, Prev, TrUserData), F@_5, F@_6, TrUserData).

d_field_link_dropped_attributes_count(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) when N < 57 ->
    d_field_link_dropped_attributes_count(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
d_field_link_dropped_attributes_count(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, _, F@_6, TrUserData) ->
    {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
    dfp_read_field_def_link(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, NewFValue, F@_6, TrUserData).

d_field_link_flags(<<Value:32/little, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, _, TrUserData) -> dfp_read_field_def_link(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, id(Value, TrUserData), TrUserData).

skip_varint_link(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> skip_varint_link(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
skip_varint_link(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> dfp_read_field_def_link(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData).

skip_length_delimited_link(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) when N < 57 -> skip_length_delimited_link(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
skip_length_delimited_link(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_link(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData).

skip_group_link(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_link(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData).

skip_32_link(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> dfp_read_field_def_link(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData).

skip_64_link(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> dfp_read_field_def_link(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData).

decode_msg_span(Bin, TrUserData) ->
    dfp_read_field_def_span(Bin,
                            0,
                            0,
                            0,
                            id(<<>>, TrUserData),
                            id(<<>>, TrUserData),
                            id(<<>>, TrUserData),
                            id(<<>>, TrUserData),
                            id(0, TrUserData),
                            id(<<>>, TrUserData),
                            id('SPAN_KIND_UNSPECIFIED', TrUserData),
                            id(0, TrUserData),
                            id(0, TrUserData),
                            id([], TrUserData),
                            id(0, TrUserData),
                            id([], TrUserData),
                            id(0, TrUserData),
                            id([], TrUserData),
                            id(0, TrUserData),
                            id('$undef', TrUserData),
                            TrUserData).

dfp_read_field_def_span(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_trace_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_span_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_trace_state(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<34, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_parent_span_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<133, 1, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_flags(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<42, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_name(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<48, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_kind(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<57, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_start_time_unix_nano(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<65, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_end_time_unix_nano(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<74, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_attributes(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<80, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_dropped_attributes_count(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<90, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_events(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<96, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_dropped_events_count(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<106, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_links(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<112, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_dropped_links_count(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<122, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    d_field_span_status(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dfp_read_field_def_span(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, R1, F@_11, R2, F@_13, R3, F@_15, F@_16, TrUserData) ->
    S1 = #{trace_id => F@_1, span_id => F@_2, trace_state => F@_3, parent_span_id => F@_4, flags => F@_5, name => F@_6, kind => F@_7, start_time_unix_nano => F@_8, end_time_unix_nano => F@_9, dropped_attributes_count => F@_11,
           dropped_events_count => F@_13, dropped_links_count => F@_15},
    S2 = if R1 == '$undef' -> S1;
            true -> S1#{attributes => lists_reverse(R1, TrUserData)}
         end,
    S3 = if R2 == '$undef' -> S2;
            true -> S2#{events => lists_reverse(R2, TrUserData)}
         end,
    S4 = if R3 == '$undef' -> S3;
            true -> S3#{links => lists_reverse(R3, TrUserData)}
         end,
    if F@_16 == '$undef' -> S4;
       true -> S4#{status => F@_16}
    end;
dfp_read_field_def_span(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    dg_read_field_def_span(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

dg_read_field_def_span(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 32 - 7 ->
    dg_read_field_def_span(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
dg_read_field_def_span(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_span_trace_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        18 -> d_field_span_span_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        26 -> d_field_span_trace_state(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        34 -> d_field_span_parent_span_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        133 -> d_field_span_flags(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        42 -> d_field_span_name(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        48 -> d_field_span_kind(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        57 -> d_field_span_start_time_unix_nano(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        65 -> d_field_span_end_time_unix_nano(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        74 -> d_field_span_attributes(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        80 -> d_field_span_dropped_attributes_count(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        90 -> d_field_span_events(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        96 -> d_field_span_dropped_events_count(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        106 -> d_field_span_links(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        112 -> d_field_span_dropped_links_count(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        122 -> d_field_span_status(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_span(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
                1 -> skip_64_span(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
                2 -> skip_length_delimited_span(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
                3 -> skip_group_span(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
                5 -> skip_32_span(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData)
            end
    end;
dg_read_field_def_span(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, R1, F@_11, R2, F@_13, R3, F@_15, F@_16, TrUserData) ->
    S1 = #{trace_id => F@_1, span_id => F@_2, trace_state => F@_3, parent_span_id => F@_4, flags => F@_5, name => F@_6, kind => F@_7, start_time_unix_nano => F@_8, end_time_unix_nano => F@_9, dropped_attributes_count => F@_11,
           dropped_events_count => F@_13, dropped_links_count => F@_15},
    S2 = if R1 == '$undef' -> S1;
            true -> S1#{attributes => lists_reverse(R1, TrUserData)}
         end,
    S3 = if R2 == '$undef' -> S2;
            true -> S2#{events => lists_reverse(R2, TrUserData)}
         end,
    S4 = if R3 == '$undef' -> S3;
            true -> S3#{links => lists_reverse(R3, TrUserData)}
         end,
    if F@_16 == '$undef' -> S4;
       true -> S4#{status => F@_16}
    end.

d_field_span_trace_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_trace_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_trace_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_span(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

d_field_span_span_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_span_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_span_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_span(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

d_field_span_trace_state(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_trace_state(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_trace_state(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_span(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

d_field_span_parent_span_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_parent_span_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_parent_span_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, _, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_span(RestF, 0, 0, F, F@_1, F@_2, F@_3, NewFValue, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

d_field_span_flags(<<Value:32/little, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, _, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    dfp_read_field_def_span(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, id(Value, TrUserData), F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

d_field_span_name(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_name(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_name(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, _, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_span(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, NewFValue, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

d_field_span_kind(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_kind(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_kind(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, _, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    {NewFValue, RestF} = {id('d_enum_span.SpanKind'(begin <<Res:32/signed-native>> = <<(X bsl N + Acc):32/unsigned-native>>, id(Res, TrUserData) end), TrUserData), Rest},
    dfp_read_field_def_span(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, NewFValue, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

d_field_span_start_time_unix_nano(<<Value:64/little, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, _, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    dfp_read_field_def_span(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, id(Value, TrUserData), F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

d_field_span_end_time_unix_nano(<<Value:64/little, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, _, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    dfp_read_field_def_span(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, id(Value, TrUserData), F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

d_field_span_attributes(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_attributes(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_attributes(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, Prev, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_key_value(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_span(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, cons(NewFValue, Prev, TrUserData), F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

d_field_span_dropped_attributes_count(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_dropped_attributes_count(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_dropped_attributes_count(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, _, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
    dfp_read_field_def_span(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, NewFValue, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

d_field_span_events(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_events(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_events(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, Prev, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_event(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_span(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, cons(NewFValue, Prev, TrUserData), F@_13, F@_14, F@_15, F@_16, TrUserData).

d_field_span_dropped_events_count(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_dropped_events_count(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_dropped_events_count(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, _, F@_14, F@_15, F@_16, TrUserData) ->
    {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
    dfp_read_field_def_span(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, NewFValue, F@_14, F@_15, F@_16, TrUserData).

d_field_span_links(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_links(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_links(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, Prev, F@_15, F@_16, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_link(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_span(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, cons(NewFValue, Prev, TrUserData), F@_15, F@_16, TrUserData).

d_field_span_dropped_links_count(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_dropped_links_count(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_dropped_links_count(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, _, F@_16, TrUserData) ->
    {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
    dfp_read_field_def_span(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, NewFValue, F@_16, TrUserData).

d_field_span_status(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    d_field_span_status(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
d_field_span_status(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, Prev, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_status(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_span(RestF,
                            0,
                            0,
                            F,
                            F@_1,
                            F@_2,
                            F@_3,
                            F@_4,
                            F@_5,
                            F@_6,
                            F@_7,
                            F@_8,
                            F@_9,
                            F@_10,
                            F@_11,
                            F@_12,
                            F@_13,
                            F@_14,
                            F@_15,
                            if Prev == '$undef' -> NewFValue;
                               true -> merge_msg_status(Prev, NewFValue, TrUserData)
                            end,
                            TrUserData).

skip_varint_span(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    skip_varint_span(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
skip_varint_span(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    dfp_read_field_def_span(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

skip_length_delimited_span(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) when N < 57 ->
    skip_length_delimited_span(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData);
skip_length_delimited_span(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_span(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

skip_group_span(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_span(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

skip_32_span(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    dfp_read_field_def_span(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

skip_64_span(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData) ->
    dfp_read_field_def_span(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, F@_11, F@_12, F@_13, F@_14, F@_15, F@_16, TrUserData).

decode_msg_status(Bin, TrUserData) -> dfp_read_field_def_status(Bin, 0, 0, 0, id(<<>>, TrUserData), id('STATUS_CODE_UNSET', TrUserData), TrUserData).

dfp_read_field_def_status(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> d_field_status_message(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData);
dfp_read_field_def_status(<<24, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> d_field_status_code(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData);
dfp_read_field_def_status(<<>>, 0, 0, _, F@_1, F@_2, _) -> #{message => F@_1, code => F@_2};
dfp_read_field_def_status(Other, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dg_read_field_def_status(Other, Z1, Z2, F, F@_1, F@_2, TrUserData).

dg_read_field_def_status(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 32 - 7 -> dg_read_field_def_status(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
dg_read_field_def_status(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        18 -> d_field_status_message(Rest, 0, 0, 0, F@_1, F@_2, TrUserData);
        24 -> d_field_status_code(Rest, 0, 0, 0, F@_1, F@_2, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_status(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                1 -> skip_64_status(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                2 -> skip_length_delimited_status(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                3 -> skip_group_status(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                5 -> skip_32_status(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData)
            end
    end;
dg_read_field_def_status(<<>>, 0, 0, _, F@_1, F@_2, _) -> #{message => F@_1, code => F@_2}.

d_field_status_message(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> d_field_status_message(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
d_field_status_message(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_status(RestF, 0, 0, F, NewFValue, F@_2, TrUserData).

d_field_status_code(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> d_field_status_code(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
d_field_status_code(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, TrUserData) ->
    {NewFValue, RestF} = {id('d_enum_status.StatusCode'(begin <<Res:32/signed-native>> = <<(X bsl N + Acc):32/unsigned-native>>, id(Res, TrUserData) end), TrUserData), Rest},
    dfp_read_field_def_status(RestF, 0, 0, F, F@_1, NewFValue, TrUserData).

skip_varint_status(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> skip_varint_status(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData);
skip_varint_status(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_status(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).

skip_length_delimited_status(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> skip_length_delimited_status(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
skip_length_delimited_status(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_status(Rest2, 0, 0, F, F@_1, F@_2, TrUserData).

skip_group_status(Bin, _, Z2, FNum, F@_1, F@_2, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_status(Rest, 0, Z2, FNum, F@_1, F@_2, TrUserData).

skip_32_status(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_status(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).

skip_64_status(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_status(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).

decode_msg_any_value(Bin, TrUserData) -> dfp_read_field_def_any_value(Bin, 0, 0, 0, id('$undef', TrUserData), TrUserData).

dfp_read_field_def_any_value(<<10, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_any_value_string_value(Rest, Z1, Z2, F, F@_1, TrUserData);
dfp_read_field_def_any_value(<<16, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_any_value_bool_value(Rest, Z1, Z2, F, F@_1, TrUserData);
dfp_read_field_def_any_value(<<24, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_any_value_int_value(Rest, Z1, Z2, F, F@_1, TrUserData);
dfp_read_field_def_any_value(<<33, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_any_value_double_value(Rest, Z1, Z2, F, F@_1, TrUserData);
dfp_read_field_def_any_value(<<42, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_any_value_array_value(Rest, Z1, Z2, F, F@_1, TrUserData);
dfp_read_field_def_any_value(<<50, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_any_value_kvlist_value(Rest, Z1, Z2, F, F@_1, TrUserData);
dfp_read_field_def_any_value(<<58, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_any_value_bytes_value(Rest, Z1, Z2, F, F@_1, TrUserData);
dfp_read_field_def_any_value(<<>>, 0, 0, _, F@_1, _) ->
    S1 = #{},
    if F@_1 == '$undef' -> S1;
       true -> S1#{value => F@_1}
    end;
dfp_read_field_def_any_value(Other, Z1, Z2, F, F@_1, TrUserData) -> dg_read_field_def_any_value(Other, Z1, Z2, F, F@_1, TrUserData).

dg_read_field_def_any_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 32 - 7 -> dg_read_field_def_any_value(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
dg_read_field_def_any_value(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_any_value_string_value(Rest, 0, 0, 0, F@_1, TrUserData);
        16 -> d_field_any_value_bool_value(Rest, 0, 0, 0, F@_1, TrUserData);
        24 -> d_field_any_value_int_value(Rest, 0, 0, 0, F@_1, TrUserData);
        33 -> d_field_any_value_double_value(Rest, 0, 0, 0, F@_1, TrUserData);
        42 -> d_field_any_value_array_value(Rest, 0, 0, 0, F@_1, TrUserData);
        50 -> d_field_any_value_kvlist_value(Rest, 0, 0, 0, F@_1, TrUserData);
        58 -> d_field_any_value_bytes_value(Rest, 0, 0, 0, F@_1, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_any_value(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                1 -> skip_64_any_value(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                2 -> skip_length_delimited_any_value(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                3 -> skip_group_any_value(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                5 -> skip_32_any_value(Rest, 0, 0, Key bsr 3, F@_1, TrUserData)
            end
    end;
dg_read_field_def_any_value(<<>>, 0, 0, _, F@_1, _) ->
    S1 = #{},
    if F@_1 == '$undef' -> S1;
       true -> S1#{value => F@_1}
    end.

d_field_any_value_string_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> d_field_any_value_string_value(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
d_field_any_value_string_value(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_any_value(RestF, 0, 0, F, id({string_value, NewFValue}, TrUserData), TrUserData).

d_field_any_value_bool_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> d_field_any_value_bool_value(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
d_field_any_value_bool_value(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, TrUserData) ->
    {NewFValue, RestF} = {id(X bsl N + Acc =/= 0, TrUserData), Rest},
    dfp_read_field_def_any_value(RestF, 0, 0, F, id({bool_value, NewFValue}, TrUserData), TrUserData).

d_field_any_value_int_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> d_field_any_value_int_value(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
d_field_any_value_int_value(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, TrUserData) ->
    {NewFValue, RestF} = {begin <<Res:64/signed-native>> = <<(X bsl N + Acc):64/unsigned-native>>, id(Res, TrUserData) end, Rest},
    dfp_read_field_def_any_value(RestF, 0, 0, F, id({int_value, NewFValue}, TrUserData), TrUserData).

d_field_any_value_double_value(<<0:48, 240, 127, Rest/binary>>, Z1, Z2, F, _, TrUserData) -> dfp_read_field_def_any_value(Rest, Z1, Z2, F, id({double_value, id(infinity, TrUserData)}, TrUserData), TrUserData);
d_field_any_value_double_value(<<0:48, 240, 255, Rest/binary>>, Z1, Z2, F, _, TrUserData) -> dfp_read_field_def_any_value(Rest, Z1, Z2, F, id({double_value, id('-infinity', TrUserData)}, TrUserData), TrUserData);
d_field_any_value_double_value(<<_:48, 15:4, _:4, _:1, 127:7, Rest/binary>>, Z1, Z2, F, _, TrUserData) -> dfp_read_field_def_any_value(Rest, Z1, Z2, F, id({double_value, id(nan, TrUserData)}, TrUserData), TrUserData);
d_field_any_value_double_value(<<Value:64/little-float, Rest/binary>>, Z1, Z2, F, _, TrUserData) -> dfp_read_field_def_any_value(Rest, Z1, Z2, F, id({double_value, id(Value, TrUserData)}, TrUserData), TrUserData).

d_field_any_value_array_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> d_field_any_value_array_value(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
d_field_any_value_array_value(<<0:1, X:7, Rest/binary>>, N, Acc, F, Prev, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_array_value(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_any_value(RestF,
                                 0,
                                 0,
                                 F,
                                 case Prev of
                                     '$undef' -> id({array_value, NewFValue}, TrUserData);
                                     {array_value, MVPrev} -> id({array_value, merge_msg_array_value(MVPrev, NewFValue, TrUserData)}, TrUserData);
                                     _ -> id({array_value, NewFValue}, TrUserData)
                                 end,
                                 TrUserData).

d_field_any_value_kvlist_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> d_field_any_value_kvlist_value(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
d_field_any_value_kvlist_value(<<0:1, X:7, Rest/binary>>, N, Acc, F, Prev, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_key_value_list(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_any_value(RestF,
                                 0,
                                 0,
                                 F,
                                 case Prev of
                                     '$undef' -> id({kvlist_value, NewFValue}, TrUserData);
                                     {kvlist_value, MVPrev} -> id({kvlist_value, merge_msg_key_value_list(MVPrev, NewFValue, TrUserData)}, TrUserData);
                                     _ -> id({kvlist_value, NewFValue}, TrUserData)
                                 end,
                                 TrUserData).

d_field_any_value_bytes_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> d_field_any_value_bytes_value(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
d_field_any_value_bytes_value(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_any_value(RestF, 0, 0, F, id({bytes_value, NewFValue}, TrUserData), TrUserData).

skip_varint_any_value(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> skip_varint_any_value(Rest, Z1, Z2, F, F@_1, TrUserData);
skip_varint_any_value(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_any_value(Rest, Z1, Z2, F, F@_1, TrUserData).

skip_length_delimited_any_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> skip_length_delimited_any_value(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
skip_length_delimited_any_value(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_any_value(Rest2, 0, 0, F, F@_1, TrUserData).

skip_group_any_value(Bin, _, Z2, FNum, F@_1, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_any_value(Rest, 0, Z2, FNum, F@_1, TrUserData).

skip_32_any_value(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_any_value(Rest, Z1, Z2, F, F@_1, TrUserData).

skip_64_any_value(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_any_value(Rest, Z1, Z2, F, F@_1, TrUserData).

decode_msg_array_value(Bin, TrUserData) -> dfp_read_field_def_array_value(Bin, 0, 0, 0, id([], TrUserData), TrUserData).

dfp_read_field_def_array_value(<<10, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_array_value_values(Rest, Z1, Z2, F, F@_1, TrUserData);
dfp_read_field_def_array_value(<<>>, 0, 0, _, R1, TrUserData) ->
    S1 = #{},
    if R1 == '$undef' -> S1;
       true -> S1#{values => lists_reverse(R1, TrUserData)}
    end;
dfp_read_field_def_array_value(Other, Z1, Z2, F, F@_1, TrUserData) -> dg_read_field_def_array_value(Other, Z1, Z2, F, F@_1, TrUserData).

dg_read_field_def_array_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 32 - 7 -> dg_read_field_def_array_value(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
dg_read_field_def_array_value(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_array_value_values(Rest, 0, 0, 0, F@_1, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_array_value(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                1 -> skip_64_array_value(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                2 -> skip_length_delimited_array_value(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                3 -> skip_group_array_value(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                5 -> skip_32_array_value(Rest, 0, 0, Key bsr 3, F@_1, TrUserData)
            end
    end;
dg_read_field_def_array_value(<<>>, 0, 0, _, R1, TrUserData) ->
    S1 = #{},
    if R1 == '$undef' -> S1;
       true -> S1#{values => lists_reverse(R1, TrUserData)}
    end.

d_field_array_value_values(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> d_field_array_value_values(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
d_field_array_value_values(<<0:1, X:7, Rest/binary>>, N, Acc, F, Prev, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_any_value(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_array_value(RestF, 0, 0, F, cons(NewFValue, Prev, TrUserData), TrUserData).

skip_varint_array_value(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> skip_varint_array_value(Rest, Z1, Z2, F, F@_1, TrUserData);
skip_varint_array_value(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_array_value(Rest, Z1, Z2, F, F@_1, TrUserData).

skip_length_delimited_array_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> skip_length_delimited_array_value(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
skip_length_delimited_array_value(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_array_value(Rest2, 0, 0, F, F@_1, TrUserData).

skip_group_array_value(Bin, _, Z2, FNum, F@_1, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_array_value(Rest, 0, Z2, FNum, F@_1, TrUserData).

skip_32_array_value(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_array_value(Rest, Z1, Z2, F, F@_1, TrUserData).

skip_64_array_value(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_array_value(Rest, Z1, Z2, F, F@_1, TrUserData).

decode_msg_key_value_list(Bin, TrUserData) -> dfp_read_field_def_key_value_list(Bin, 0, 0, 0, id([], TrUserData), TrUserData).

dfp_read_field_def_key_value_list(<<10, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_key_value_list_values(Rest, Z1, Z2, F, F@_1, TrUserData);
dfp_read_field_def_key_value_list(<<>>, 0, 0, _, R1, TrUserData) ->
    S1 = #{},
    if R1 == '$undef' -> S1;
       true -> S1#{values => lists_reverse(R1, TrUserData)}
    end;
dfp_read_field_def_key_value_list(Other, Z1, Z2, F, F@_1, TrUserData) -> dg_read_field_def_key_value_list(Other, Z1, Z2, F, F@_1, TrUserData).

dg_read_field_def_key_value_list(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 32 - 7 -> dg_read_field_def_key_value_list(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
dg_read_field_def_key_value_list(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_key_value_list_values(Rest, 0, 0, 0, F@_1, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_key_value_list(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                1 -> skip_64_key_value_list(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                2 -> skip_length_delimited_key_value_list(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                3 -> skip_group_key_value_list(Rest, 0, 0, Key bsr 3, F@_1, TrUserData);
                5 -> skip_32_key_value_list(Rest, 0, 0, Key bsr 3, F@_1, TrUserData)
            end
    end;
dg_read_field_def_key_value_list(<<>>, 0, 0, _, R1, TrUserData) ->
    S1 = #{},
    if R1 == '$undef' -> S1;
       true -> S1#{values => lists_reverse(R1, TrUserData)}
    end.

d_field_key_value_list_values(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> d_field_key_value_list_values(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
d_field_key_value_list_values(<<0:1, X:7, Rest/binary>>, N, Acc, F, Prev, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_key_value(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_key_value_list(RestF, 0, 0, F, cons(NewFValue, Prev, TrUserData), TrUserData).

skip_varint_key_value_list(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> skip_varint_key_value_list(Rest, Z1, Z2, F, F@_1, TrUserData);
skip_varint_key_value_list(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_key_value_list(Rest, Z1, Z2, F, F@_1, TrUserData).

skip_length_delimited_key_value_list(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> skip_length_delimited_key_value_list(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData);
skip_length_delimited_key_value_list(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_key_value_list(Rest2, 0, 0, F, F@_1, TrUserData).

skip_group_key_value_list(Bin, _, Z2, FNum, F@_1, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_key_value_list(Rest, 0, Z2, FNum, F@_1, TrUserData).

skip_32_key_value_list(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_key_value_list(Rest, Z1, Z2, F, F@_1, TrUserData).

skip_64_key_value_list(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_key_value_list(Rest, Z1, Z2, F, F@_1, TrUserData).

decode_msg_key_value(Bin, TrUserData) -> dfp_read_field_def_key_value(Bin, 0, 0, 0, id(<<>>, TrUserData), id('$undef', TrUserData), TrUserData).

dfp_read_field_def_key_value(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> d_field_key_value_key(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData);
dfp_read_field_def_key_value(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> d_field_key_value_value(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData);
dfp_read_field_def_key_value(<<>>, 0, 0, _, F@_1, F@_2, _) ->
    S1 = #{key => F@_1},
    if F@_2 == '$undef' -> S1;
       true -> S1#{value => F@_2}
    end;
dfp_read_field_def_key_value(Other, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dg_read_field_def_key_value(Other, Z1, Z2, F, F@_1, F@_2, TrUserData).

dg_read_field_def_key_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 32 - 7 -> dg_read_field_def_key_value(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
dg_read_field_def_key_value(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_key_value_key(Rest, 0, 0, 0, F@_1, F@_2, TrUserData);
        18 -> d_field_key_value_value(Rest, 0, 0, 0, F@_1, F@_2, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_key_value(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                1 -> skip_64_key_value(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                2 -> skip_length_delimited_key_value(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                3 -> skip_group_key_value(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                5 -> skip_32_key_value(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData)
            end
    end;
dg_read_field_def_key_value(<<>>, 0, 0, _, F@_1, F@_2, _) ->
    S1 = #{key => F@_1},
    if F@_2 == '$undef' -> S1;
       true -> S1#{value => F@_2}
    end.

d_field_key_value_key(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> d_field_key_value_key(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
d_field_key_value_key(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_key_value(RestF, 0, 0, F, NewFValue, F@_2, TrUserData).

d_field_key_value_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> d_field_key_value_value(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
d_field_key_value_value(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, Prev, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_any_value(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_key_value(RestF,
                                 0,
                                 0,
                                 F,
                                 F@_1,
                                 if Prev == '$undef' -> NewFValue;
                                    true -> merge_msg_any_value(Prev, NewFValue, TrUserData)
                                 end,
                                 TrUserData).

skip_varint_key_value(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> skip_varint_key_value(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData);
skip_varint_key_value(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_key_value(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).

skip_length_delimited_key_value(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> skip_length_delimited_key_value(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
skip_length_delimited_key_value(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_key_value(Rest2, 0, 0, F, F@_1, F@_2, TrUserData).

skip_group_key_value(Bin, _, Z2, FNum, F@_1, F@_2, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_key_value(Rest, 0, Z2, FNum, F@_1, F@_2, TrUserData).

skip_32_key_value(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_key_value(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).

skip_64_key_value(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_key_value(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).

decode_msg_instrumentation_scope(Bin, TrUserData) -> dfp_read_field_def_instrumentation_scope(Bin, 0, 0, 0, id(<<>>, TrUserData), id(<<>>, TrUserData), id([], TrUserData), id(0, TrUserData), TrUserData).

dfp_read_field_def_instrumentation_scope(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_instrumentation_scope_name(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dfp_read_field_def_instrumentation_scope(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_instrumentation_scope_version(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dfp_read_field_def_instrumentation_scope(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_instrumentation_scope_attributes(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dfp_read_field_def_instrumentation_scope(<<32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_instrumentation_scope_dropped_attributes_count(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dfp_read_field_def_instrumentation_scope(<<>>, 0, 0, _, F@_1, F@_2, R1, F@_4, TrUserData) ->
    S1 = #{name => F@_1, version => F@_2, dropped_attributes_count => F@_4},
    if R1 == '$undef' -> S1;
       true -> S1#{attributes => lists_reverse(R1, TrUserData)}
    end;
dfp_read_field_def_instrumentation_scope(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dg_read_field_def_instrumentation_scope(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData).

dg_read_field_def_instrumentation_scope(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 32 - 7 -> dg_read_field_def_instrumentation_scope(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dg_read_field_def_instrumentation_scope(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_instrumentation_scope_name(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData);
        18 -> d_field_instrumentation_scope_version(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData);
        26 -> d_field_instrumentation_scope_attributes(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData);
        32 -> d_field_instrumentation_scope_dropped_attributes_count(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_instrumentation_scope(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData);
                1 -> skip_64_instrumentation_scope(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData);
                2 -> skip_length_delimited_instrumentation_scope(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData);
                3 -> skip_group_instrumentation_scope(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData);
                5 -> skip_32_instrumentation_scope(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData)
            end
    end;
dg_read_field_def_instrumentation_scope(<<>>, 0, 0, _, F@_1, F@_2, R1, F@_4, TrUserData) ->
    S1 = #{name => F@_1, version => F@_2, dropped_attributes_count => F@_4},
    if R1 == '$undef' -> S1;
       true -> S1#{attributes => lists_reverse(R1, TrUserData)}
    end.

d_field_instrumentation_scope_name(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_instrumentation_scope_name(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
d_field_instrumentation_scope_name(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_instrumentation_scope(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, TrUserData).

d_field_instrumentation_scope_version(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_instrumentation_scope_version(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
d_field_instrumentation_scope_version(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
    dfp_read_field_def_instrumentation_scope(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, TrUserData).

d_field_instrumentation_scope_attributes(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_instrumentation_scope_attributes(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
d_field_instrumentation_scope_attributes(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, Prev, F@_4, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_key_value(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_instrumentation_scope(RestF, 0, 0, F, F@_1, F@_2, cons(NewFValue, Prev, TrUserData), F@_4, TrUserData).

d_field_instrumentation_scope_dropped_attributes_count(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 ->
    d_field_instrumentation_scope_dropped_attributes_count(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
d_field_instrumentation_scope_dropped_attributes_count(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, _, TrUserData) ->
    {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
    dfp_read_field_def_instrumentation_scope(RestF, 0, 0, F, F@_1, F@_2, F@_3, NewFValue, TrUserData).

skip_varint_instrumentation_scope(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> skip_varint_instrumentation_scope(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
skip_varint_instrumentation_scope(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_instrumentation_scope(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData).

skip_length_delimited_instrumentation_scope(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> skip_length_delimited_instrumentation_scope(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
skip_length_delimited_instrumentation_scope(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_instrumentation_scope(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, TrUserData).

skip_group_instrumentation_scope(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_instrumentation_scope(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, TrUserData).

skip_32_instrumentation_scope(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_instrumentation_scope(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData).

skip_64_instrumentation_scope(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_instrumentation_scope(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData).

decode_msg_resource(Bin, TrUserData) -> dfp_read_field_def_resource(Bin, 0, 0, 0, id([], TrUserData), id(0, TrUserData), TrUserData).

dfp_read_field_def_resource(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> d_field_resource_attributes(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData);
dfp_read_field_def_resource(<<16, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> d_field_resource_dropped_attributes_count(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData);
dfp_read_field_def_resource(<<>>, 0, 0, _, R1, F@_2, TrUserData) ->
    S1 = #{dropped_attributes_count => F@_2},
    if R1 == '$undef' -> S1;
       true -> S1#{attributes => lists_reverse(R1, TrUserData)}
    end;
dfp_read_field_def_resource(Other, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dg_read_field_def_resource(Other, Z1, Z2, F, F@_1, F@_2, TrUserData).

dg_read_field_def_resource(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 32 - 7 -> dg_read_field_def_resource(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
dg_read_field_def_resource(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, TrUserData) ->
    Key = X bsl N + Acc,
    case Key of
        10 -> d_field_resource_attributes(Rest, 0, 0, 0, F@_1, F@_2, TrUserData);
        16 -> d_field_resource_dropped_attributes_count(Rest, 0, 0, 0, F@_1, F@_2, TrUserData);
        _ ->
            case Key band 7 of
                0 -> skip_varint_resource(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                1 -> skip_64_resource(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                2 -> skip_length_delimited_resource(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                3 -> skip_group_resource(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData);
                5 -> skip_32_resource(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData)
            end
    end;
dg_read_field_def_resource(<<>>, 0, 0, _, R1, F@_2, TrUserData) ->
    S1 = #{dropped_attributes_count => F@_2},
    if R1 == '$undef' -> S1;
       true -> S1#{attributes => lists_reverse(R1, TrUserData)}
    end.

d_field_resource_attributes(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> d_field_resource_attributes(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
d_field_resource_attributes(<<0:1, X:7, Rest/binary>>, N, Acc, F, Prev, F@_2, TrUserData) ->
    {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_key_value(Bs, TrUserData), TrUserData), Rest2} end,
    dfp_read_field_def_resource(RestF, 0, 0, F, cons(NewFValue, Prev, TrUserData), F@_2, TrUserData).

d_field_resource_dropped_attributes_count(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> d_field_resource_dropped_attributes_count(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
d_field_resource_dropped_attributes_count(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, TrUserData) ->
    {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
    dfp_read_field_def_resource(RestF, 0, 0, F, F@_1, NewFValue, TrUserData).

skip_varint_resource(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> skip_varint_resource(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData);
skip_varint_resource(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_resource(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).

skip_length_delimited_resource(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> skip_length_delimited_resource(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData);
skip_length_delimited_resource(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) ->
    Length = X bsl N + Acc,
    <<_:Length/binary, Rest2/binary>> = Rest,
    dfp_read_field_def_resource(Rest2, 0, 0, F, F@_1, F@_2, TrUserData).

skip_group_resource(Bin, _, Z2, FNum, F@_1, F@_2, TrUserData) ->
    {_, Rest} = read_group(Bin, FNum),
    dfp_read_field_def_resource(Rest, 0, Z2, FNum, F@_1, F@_2, TrUserData).

skip_32_resource(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_resource(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).

skip_64_resource(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_resource(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).

'd_enum_span.SpanKind'(0) -> 'SPAN_KIND_UNSPECIFIED';
'd_enum_span.SpanKind'(1) -> 'SPAN_KIND_INTERNAL';
'd_enum_span.SpanKind'(2) -> 'SPAN_KIND_SERVER';
'd_enum_span.SpanKind'(3) -> 'SPAN_KIND_CLIENT';
'd_enum_span.SpanKind'(4) -> 'SPAN_KIND_PRODUCER';
'd_enum_span.SpanKind'(5) -> 'SPAN_KIND_CONSUMER';
'd_enum_span.SpanKind'(V) -> V.

'd_enum_status.StatusCode'(0) -> 'STATUS_CODE_UNSET';
'd_enum_status.StatusCode'(1) -> 'STATUS_CODE_OK';
'd_enum_status.StatusCode'(2) -> 'STATUS_CODE_ERROR';
'd_enum_status.StatusCode'(V) -> V.

read_group(Bin, FieldNum) ->
    {NumBytes, EndTagLen} = read_gr_b(Bin, 0, 0, 0, 0, FieldNum),
    <<Group:NumBytes/binary, _:EndTagLen/binary, Rest/binary>> = Bin,
    {Group, Rest}.

%% Like skipping over fields, but record the total length,
%% Each field is <(FieldNum bsl 3) bor FieldType> ++ <FieldValue>
%% Record the length because varints may be non-optimally encoded.
%%
%% Groups can be nested, but assume the same FieldNum cannot be nested
%% because group field numbers are shared with the rest of the fields
%% numbers. Thus we can search just for an group-end with the same
%% field number.
%%
%% (The only time the same group field number could occur would
%% be in a nested sub message, but then it would be inside a
%% length-delimited entry, which we skip-read by length.)
read_gr_b(<<1:1, X:7, Tl/binary>>, N, Acc, NumBytes, TagLen, FieldNum)
  when N < (32-7) ->
    read_gr_b(Tl, N+7, X bsl N + Acc, NumBytes, TagLen+1, FieldNum);
read_gr_b(<<0:1, X:7, Tl/binary>>, N, Acc, NumBytes, TagLen,
          FieldNum) ->
    Key = X bsl N + Acc,
    TagLen1 = TagLen + 1,
    case {Key bsr 3, Key band 7} of
        {FieldNum, 4} -> % 4 = group_end
            {NumBytes, TagLen1};
        {_, 0} -> % 0 = varint
            read_gr_vi(Tl, 0, NumBytes + TagLen1, FieldNum);
        {_, 1} -> % 1 = bits64
            <<_:64, Tl2/binary>> = Tl,
            read_gr_b(Tl2, 0, 0, NumBytes + TagLen1 + 8, 0, FieldNum);
        {_, 2} -> % 2 = length_delimited
            read_gr_ld(Tl, 0, 0, NumBytes + TagLen1, FieldNum);
        {_, 3} -> % 3 = group_start
            read_gr_b(Tl, 0, 0, NumBytes + TagLen1, 0, FieldNum);
        {_, 4} -> % 4 = group_end
            read_gr_b(Tl, 0, 0, NumBytes + TagLen1, 0, FieldNum);
        {_, 5} -> % 5 = bits32
            <<_:32, Tl2/binary>> = Tl,
            read_gr_b(Tl2, 0, 0, NumBytes + TagLen1 + 4, 0, FieldNum)
    end.

read_gr_vi(<<1:1, _:7, Tl/binary>>, N, NumBytes, FieldNum)
  when N < (64-7) ->
    read_gr_vi(Tl, N+7, NumBytes+1, FieldNum);
read_gr_vi(<<0:1, _:7, Tl/binary>>, _, NumBytes, FieldNum) ->
    read_gr_b(Tl, 0, 0, NumBytes+1, 0, FieldNum).

read_gr_ld(<<1:1, X:7, Tl/binary>>, N, Acc, NumBytes, FieldNum)
  when N < (64-7) ->
    read_gr_ld(Tl, N+7, X bsl N + Acc, NumBytes+1, FieldNum);
read_gr_ld(<<0:1, X:7, Tl/binary>>, N, Acc, NumBytes, FieldNum) ->
    Len = X bsl N + Acc,
    NumBytes1 = NumBytes + 1,
    <<_:Len/binary, Tl2/binary>> = Tl,
    read_gr_b(Tl2, 0, 0, NumBytes1 + Len, 0, FieldNum).

merge_msgs(Prev, New, MsgName) when is_atom(MsgName) -> merge_msgs(Prev, New, MsgName, []).

merge_msgs(Prev, New, MsgName, Opts) ->
    TrUserData = proplists:get_value(user_data, Opts),
    case MsgName of
        export_trace_service_request -> merge_msg_export_trace_service_request(Prev, New, TrUserData);
        export_trace_service_response -> merge_msg_export_trace_service_response(Prev, New, TrUserData);
        export_trace_partial_success -> merge_msg_export_trace_partial_success(Prev, New, TrUserData);
        traces_data -> merge_msg_traces_data(Prev, New, TrUserData);
        resource_spans -> merge_msg_resource_spans(Prev, New, TrUserData);
        scope_spans -> merge_msg_scope_spans(Prev, New, TrUserData);
        event -> merge_msg_event(Prev, New, TrUserData);
        link -> merge_msg_link(Prev, New, TrUserData);
        span -> merge_msg_span(Prev, New, TrUserData);
        status -> merge_msg_status(Prev, New, TrUserData);
        any_value -> merge_msg_any_value(Prev, New, TrUserData);
        array_value -> merge_msg_array_value(Prev, New, TrUserData);
        key_value_list -> merge_msg_key_value_list(Prev, New, TrUserData);
        key_value -> merge_msg_key_value(Prev, New, TrUserData);
        instrumentation_scope -> merge_msg_instrumentation_scope(Prev, New, TrUserData);
        resource -> merge_msg_resource(Prev, New, TrUserData)
    end.

-compile({nowarn_unused_function,merge_msg_export_trace_service_request/3}).
merge_msg_export_trace_service_request(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    case {PMsg, NMsg} of
        {#{resource_spans := PFresource_spans}, #{resource_spans := NFresource_spans}} -> S1#{resource_spans => 'erlang_++'(PFresource_spans, NFresource_spans, TrUserData)};
        {_, #{resource_spans := NFresource_spans}} -> S1#{resource_spans => NFresource_spans};
        {#{resource_spans := PFresource_spans}, _} -> S1#{resource_spans => PFresource_spans};
        {_, _} -> S1
    end.

-compile({nowarn_unused_function,merge_msg_export_trace_service_response/3}).
merge_msg_export_trace_service_response(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    case {PMsg, NMsg} of
        {#{partial_success := PFpartial_success}, #{partial_success := NFpartial_success}} -> S1#{partial_success => merge_msg_export_trace_partial_success(PFpartial_success, NFpartial_success, TrUserData)};
        {_, #{partial_success := NFpartial_success}} -> S1#{partial_success => NFpartial_success};
        {#{partial_success := PFpartial_success}, _} -> S1#{partial_success => PFpartial_success};
        {_, _} -> S1
    end.

-compile({nowarn_unused_function,merge_msg_export_trace_partial_success/3}).
merge_msg_export_trace_partial_success(PMsg, NMsg, _) ->
    S1 = #{},
    S2 = case {PMsg, NMsg} of
             {_, #{rejected_spans := NFrejected_spans}} -> S1#{rejected_spans => NFrejected_spans};
             {#{rejected_spans := PFrejected_spans}, _} -> S1#{rejected_spans => PFrejected_spans};
             _ -> S1
         end,
    case {PMsg, NMsg} of
        {_, #{error_message := NFerror_message}} -> S2#{error_message => NFerror_message};
        {#{error_message := PFerror_message}, _} -> S2#{error_message => PFerror_message};
        _ -> S2
    end.

-compile({nowarn_unused_function,merge_msg_traces_data/3}).
merge_msg_traces_data(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    case {PMsg, NMsg} of
        {#{resource_spans := PFresource_spans}, #{resource_spans := NFresource_spans}} -> S1#{resource_spans => 'erlang_++'(PFresource_spans, NFresource_spans, TrUserData)};
        {_, #{resource_spans := NFresource_spans}} -> S1#{resource_spans => NFresource_spans};
        {#{resource_spans := PFresource_spans}, _} -> S1#{resource_spans => PFresource_spans};
        {_, _} -> S1
    end.

-compile({nowarn_unused_function,merge_msg_resource_spans/3}).
merge_msg_resource_spans(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    S2 = case {PMsg, NMsg} of
             {#{resource := PFresource}, #{resource := NFresource}} -> S1#{resource => merge_msg_resource(PFresource, NFresource, TrUserData)};
             {_, #{resource := NFresource}} -> S1#{resource => NFresource};
             {#{resource := PFresource}, _} -> S1#{resource => PFresource};
             {_, _} -> S1
         end,
    S3 = case {PMsg, NMsg} of
             {#{scope_spans := PFscope_spans}, #{scope_spans := NFscope_spans}} -> S2#{scope_spans => 'erlang_++'(PFscope_spans, NFscope_spans, TrUserData)};
             {_, #{scope_spans := NFscope_spans}} -> S2#{scope_spans => NFscope_spans};
             {#{scope_spans := PFscope_spans}, _} -> S2#{scope_spans => PFscope_spans};
             {_, _} -> S2
         end,
    case {PMsg, NMsg} of
        {_, #{schema_url := NFschema_url}} -> S3#{schema_url => NFschema_url};
        {#{schema_url := PFschema_url}, _} -> S3#{schema_url => PFschema_url};
        _ -> S3
    end.

-compile({nowarn_unused_function,merge_msg_scope_spans/3}).
merge_msg_scope_spans(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    S2 = case {PMsg, NMsg} of
             {#{scope := PFscope}, #{scope := NFscope}} -> S1#{scope => merge_msg_instrumentation_scope(PFscope, NFscope, TrUserData)};
             {_, #{scope := NFscope}} -> S1#{scope => NFscope};
             {#{scope := PFscope}, _} -> S1#{scope => PFscope};
             {_, _} -> S1
         end,
    S3 = case {PMsg, NMsg} of
             {#{spans := PFspans}, #{spans := NFspans}} -> S2#{spans => 'erlang_++'(PFspans, NFspans, TrUserData)};
             {_, #{spans := NFspans}} -> S2#{spans => NFspans};
             {#{spans := PFspans}, _} -> S2#{spans => PFspans};
             {_, _} -> S2
         end,
    case {PMsg, NMsg} of
        {_, #{schema_url := NFschema_url}} -> S3#{schema_url => NFschema_url};
        {#{schema_url := PFschema_url}, _} -> S3#{schema_url => PFschema_url};
        _ -> S3
    end.

-compile({nowarn_unused_function,merge_msg_event/3}).
merge_msg_event(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    S2 = case {PMsg, NMsg} of
             {_, #{time_unix_nano := NFtime_unix_nano}} -> S1#{time_unix_nano => NFtime_unix_nano};
             {#{time_unix_nano := PFtime_unix_nano}, _} -> S1#{time_unix_nano => PFtime_unix_nano};
             _ -> S1
         end,
    S3 = case {PMsg, NMsg} of
             {_, #{name := NFname}} -> S2#{name => NFname};
             {#{name := PFname}, _} -> S2#{name => PFname};
             _ -> S2
         end,
    S4 = case {PMsg, NMsg} of
             {#{attributes := PFattributes}, #{attributes := NFattributes}} -> S3#{attributes => 'erlang_++'(PFattributes, NFattributes, TrUserData)};
             {_, #{attributes := NFattributes}} -> S3#{attributes => NFattributes};
             {#{attributes := PFattributes}, _} -> S3#{attributes => PFattributes};
             {_, _} -> S3
         end,
    case {PMsg, NMsg} of
        {_, #{dropped_attributes_count := NFdropped_attributes_count}} -> S4#{dropped_attributes_count => NFdropped_attributes_count};
        {#{dropped_attributes_count := PFdropped_attributes_count}, _} -> S4#{dropped_attributes_count => PFdropped_attributes_count};
        _ -> S4
    end.

-compile({nowarn_unused_function,merge_msg_link/3}).
merge_msg_link(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    S2 = case {PMsg, NMsg} of
             {_, #{trace_id := NFtrace_id}} -> S1#{trace_id => NFtrace_id};
             {#{trace_id := PFtrace_id}, _} -> S1#{trace_id => PFtrace_id};
             _ -> S1
         end,
    S3 = case {PMsg, NMsg} of
             {_, #{span_id := NFspan_id}} -> S2#{span_id => NFspan_id};
             {#{span_id := PFspan_id}, _} -> S2#{span_id => PFspan_id};
             _ -> S2
         end,
    S4 = case {PMsg, NMsg} of
             {_, #{trace_state := NFtrace_state}} -> S3#{trace_state => NFtrace_state};
             {#{trace_state := PFtrace_state}, _} -> S3#{trace_state => PFtrace_state};
             _ -> S3
         end,
    S5 = case {PMsg, NMsg} of
             {#{attributes := PFattributes}, #{attributes := NFattributes}} -> S4#{attributes => 'erlang_++'(PFattributes, NFattributes, TrUserData)};
             {_, #{attributes := NFattributes}} -> S4#{attributes => NFattributes};
             {#{attributes := PFattributes}, _} -> S4#{attributes => PFattributes};
             {_, _} -> S4
         end,
    S6 = case {PMsg, NMsg} of
             {_, #{dropped_attributes_count := NFdropped_attributes_count}} -> S5#{dropped_attributes_count => NFdropped_attributes_count};
             {#{dropped_attributes_count := PFdropped_attributes_count}, _} -> S5#{dropped_attributes_count => PFdropped_attributes_count};
             _ -> S5
         end,
    case {PMsg, NMsg} of
        {_, #{flags := NFflags}} -> S6#{flags => NFflags};
        {#{flags := PFflags}, _} -> S6#{flags => PFflags};
        _ -> S6
    end.

-compile({nowarn_unused_function,merge_msg_span/3}).
merge_msg_span(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    S2 = case {PMsg, NMsg} of
             {_, #{trace_id := NFtrace_id}} -> S1#{trace_id => NFtrace_id};
             {#{trace_id := PFtrace_id}, _} -> S1#{trace_id => PFtrace_id};
             _ -> S1
         end,
    S3 = case {PMsg, NMsg} of
             {_, #{span_id := NFspan_id}} -> S2#{span_id => NFspan_id};
             {#{span_id := PFspan_id}, _} -> S2#{span_id => PFspan_id};
             _ -> S2
         end,
    S4 = case {PMsg, NMsg} of
             {_, #{trace_state := NFtrace_state}} -> S3#{trace_state => NFtrace_state};
             {#{trace_state := PFtrace_state}, _} -> S3#{trace_state => PFtrace_state};
             _ -> S3
         end,
    S5 = case {PMsg, NMsg} of
             {_, #{parent_span_id := NFparent_span_id}} -> S4#{parent_span_id => NFparent_span_id};
             {#{parent_span_id := PFparent_span_id}, _} -> S4#{parent_span_id => PFparent_span_id};
             _ -> S4
         end,
    S6 = case {PMsg, NMsg} of
             {_, #{flags := NFflags}} -> S5#{flags => NFflags};
             {#{flags := PFflags}, _} -> S5#{flags => PFflags};
             _ -> S5
         end,
    S7 = case {PMsg, NMsg} of
             {_, #{name := NFname}} -> S6#{name => NFname};
             {#{name := PFname}, _} -> S6#{name => PFname};
             _ -> S6
         end,
    S8 = case {PMsg, NMsg} of
             {_, #{kind := NFkind}} -> S7#{kind => NFkind};
             {#{kind := PFkind}, _} -> S7#{kind => PFkind};
             _ -> S7
         end,
    S9 = case {PMsg, NMsg} of
             {_, #{start_time_unix_nano := NFstart_time_unix_nano}} -> S8#{start_time_unix_nano => NFstart_time_unix_nano};
             {#{start_time_unix_nano := PFstart_time_unix_nano}, _} -> S8#{start_time_unix_nano => PFstart_time_unix_nano};
             _ -> S8
         end,
    S10 = case {PMsg, NMsg} of
              {_, #{end_time_unix_nano := NFend_time_unix_nano}} -> S9#{end_time_unix_nano => NFend_time_unix_nano};
              {#{end_time_unix_nano := PFend_time_unix_nano}, _} -> S9#{end_time_unix_nano => PFend_time_unix_nano};
              _ -> S9
          end,
    S11 = case {PMsg, NMsg} of
              {#{attributes := PFattributes}, #{attributes := NFattributes}} -> S10#{attributes => 'erlang_++'(PFattributes, NFattributes, TrUserData)};
              {_, #{attributes := NFattributes}} -> S10#{attributes => NFattributes};
              {#{attributes := PFattributes}, _} -> S10#{attributes => PFattributes};
              {_, _} -> S10
          end,
    S12 = case {PMsg, NMsg} of
              {_, #{dropped_attributes_count := NFdropped_attributes_count}} -> S11#{dropped_attributes_count => NFdropped_attributes_count};
              {#{dropped_attributes_count := PFdropped_attributes_count}, _} -> S11#{dropped_attributes_count => PFdropped_attributes_count};
              _ -> S11
          end,
    S13 = case {PMsg, NMsg} of
              {#{events := PFevents}, #{events := NFevents}} -> S12#{events => 'erlang_++'(PFevents, NFevents, TrUserData)};
              {_, #{events := NFevents}} -> S12#{events => NFevents};
              {#{events := PFevents}, _} -> S12#{events => PFevents};
              {_, _} -> S12
          end,
    S14 = case {PMsg, NMsg} of
              {_, #{dropped_events_count := NFdropped_events_count}} -> S13#{dropped_events_count => NFdropped_events_count};
              {#{dropped_events_count := PFdropped_events_count}, _} -> S13#{dropped_events_count => PFdropped_events_count};
              _ -> S13
          end,
    S15 = case {PMsg, NMsg} of
              {#{links := PFlinks}, #{links := NFlinks}} -> S14#{links => 'erlang_++'(PFlinks, NFlinks, TrUserData)};
              {_, #{links := NFlinks}} -> S14#{links => NFlinks};
              {#{links := PFlinks}, _} -> S14#{links => PFlinks};
              {_, _} -> S14
          end,
    S16 = case {PMsg, NMsg} of
              {_, #{dropped_links_count := NFdropped_links_count}} -> S15#{dropped_links_count => NFdropped_links_count};
              {#{dropped_links_count := PFdropped_links_count}, _} -> S15#{dropped_links_count => PFdropped_links_count};
              _ -> S15
          end,
    case {PMsg, NMsg} of
        {#{status := PFstatus}, #{status := NFstatus}} -> S16#{status => merge_msg_status(PFstatus, NFstatus, TrUserData)};
        {_, #{status := NFstatus}} -> S16#{status => NFstatus};
        {#{status := PFstatus}, _} -> S16#{status => PFstatus};
        {_, _} -> S16
    end.

-compile({nowarn_unused_function,merge_msg_status/3}).
merge_msg_status(PMsg, NMsg, _) ->
    S1 = #{},
    S2 = case {PMsg, NMsg} of
             {_, #{message := NFmessage}} -> S1#{message => NFmessage};
             {#{message := PFmessage}, _} -> S1#{message => PFmessage};
             _ -> S1
         end,
    case {PMsg, NMsg} of
        {_, #{code := NFcode}} -> S2#{code => NFcode};
        {#{code := PFcode}, _} -> S2#{code => PFcode};
        _ -> S2
    end.

-compile({nowarn_unused_function,merge_msg_any_value/3}).
merge_msg_any_value(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    case {PMsg, NMsg} of
        {#{value := {array_value, OPFvalue}}, #{value := {array_value, ONFvalue}}} -> S1#{value => {array_value, merge_msg_array_value(OPFvalue, ONFvalue, TrUserData)}};
        {#{value := {kvlist_value, OPFvalue}}, #{value := {kvlist_value, ONFvalue}}} -> S1#{value => {kvlist_value, merge_msg_key_value_list(OPFvalue, ONFvalue, TrUserData)}};
        {_, #{value := NFvalue}} -> S1#{value => NFvalue};
        {#{value := PFvalue}, _} -> S1#{value => PFvalue};
        {_, _} -> S1
    end.

-compile({nowarn_unused_function,merge_msg_array_value/3}).
merge_msg_array_value(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    case {PMsg, NMsg} of
        {#{values := PFvalues}, #{values := NFvalues}} -> S1#{values => 'erlang_++'(PFvalues, NFvalues, TrUserData)};
        {_, #{values := NFvalues}} -> S1#{values => NFvalues};
        {#{values := PFvalues}, _} -> S1#{values => PFvalues};
        {_, _} -> S1
    end.

-compile({nowarn_unused_function,merge_msg_key_value_list/3}).
merge_msg_key_value_list(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    case {PMsg, NMsg} of
        {#{values := PFvalues}, #{values := NFvalues}} -> S1#{values => 'erlang_++'(PFvalues, NFvalues, TrUserData)};
        {_, #{values := NFvalues}} -> S1#{values => NFvalues};
        {#{values := PFvalues}, _} -> S1#{values => PFvalues};
        {_, _} -> S1
    end.

-compile({nowarn_unused_function,merge_msg_key_value/3}).
merge_msg_key_value(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    S2 = case {PMsg, NMsg} of
             {_, #{key := NFkey}} -> S1#{key => NFkey};
             {#{key := PFkey}, _} -> S1#{key => PFkey};
             _ -> S1
         end,
    case {PMsg, NMsg} of
        {#{value := PFvalue}, #{value := NFvalue}} -> S2#{value => merge_msg_any_value(PFvalue, NFvalue, TrUserData)};
        {_, #{value := NFvalue}} -> S2#{value => NFvalue};
        {#{value := PFvalue}, _} -> S2#{value => PFvalue};
        {_, _} -> S2
    end.

-compile({nowarn_unused_function,merge_msg_instrumentation_scope/3}).
merge_msg_instrumentation_scope(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    S2 = case {PMsg, NMsg} of
             {_, #{name := NFname}} -> S1#{name => NFname};
             {#{name := PFname}, _} -> S1#{name => PFname};
             _ -> S1
         end,
    S3 = case {PMsg, NMsg} of
             {_, #{version := NFversion}} -> S2#{version => NFversion};
             {#{version := PFversion}, _} -> S2#{version => PFversion};
             _ -> S2
         end,
    S4 = case {PMsg, NMsg} of
             {#{attributes := PFattributes}, #{attributes := NFattributes}} -> S3#{attributes => 'erlang_++'(PFattributes, NFattributes, TrUserData)};
             {_, #{attributes := NFattributes}} -> S3#{attributes => NFattributes};
             {#{attributes := PFattributes}, _} -> S3#{attributes => PFattributes};
             {_, _} -> S3
         end,
    case {PMsg, NMsg} of
        {_, #{dropped_attributes_count := NFdropped_attributes_count}} -> S4#{dropped_attributes_count => NFdropped_attributes_count};
        {#{dropped_attributes_count := PFdropped_attributes_count}, _} -> S4#{dropped_attributes_count => PFdropped_attributes_count};
        _ -> S4
    end.

-compile({nowarn_unused_function,merge_msg_resource/3}).
merge_msg_resource(PMsg, NMsg, TrUserData) ->
    S1 = #{},
    S2 = case {PMsg, NMsg} of
             {#{attributes := PFattributes}, #{attributes := NFattributes}} -> S1#{attributes => 'erlang_++'(PFattributes, NFattributes, TrUserData)};
             {_, #{attributes := NFattributes}} -> S1#{attributes => NFattributes};
             {#{attributes := PFattributes}, _} -> S1#{attributes => PFattributes};
             {_, _} -> S1
         end,
    case {PMsg, NMsg} of
        {_, #{dropped_attributes_count := NFdropped_attributes_count}} -> S2#{dropped_attributes_count => NFdropped_attributes_count};
        {#{dropped_attributes_count := PFdropped_attributes_count}, _} -> S2#{dropped_attributes_count => PFdropped_attributes_count};
        _ -> S2
    end.


verify_msg(Msg, MsgName) when is_atom(MsgName) -> verify_msg(Msg, MsgName, []).

verify_msg(Msg, MsgName, Opts) ->
    TrUserData = proplists:get_value(user_data, Opts),
    case MsgName of
        export_trace_service_request -> v_msg_export_trace_service_request(Msg, [MsgName], TrUserData);
        export_trace_service_response -> v_msg_export_trace_service_response(Msg, [MsgName], TrUserData);
        export_trace_partial_success -> v_msg_export_trace_partial_success(Msg, [MsgName], TrUserData);
        traces_data -> v_msg_traces_data(Msg, [MsgName], TrUserData);
        resource_spans -> v_msg_resource_spans(Msg, [MsgName], TrUserData);
        scope_spans -> v_msg_scope_spans(Msg, [MsgName], TrUserData);
        event -> v_msg_event(Msg, [MsgName], TrUserData);
        link -> v_msg_link(Msg, [MsgName], TrUserData);
        span -> v_msg_span(Msg, [MsgName], TrUserData);
        status -> v_msg_status(Msg, [MsgName], TrUserData);
        any_value -> v_msg_any_value(Msg, [MsgName], TrUserData);
        array_value -> v_msg_array_value(Msg, [MsgName], TrUserData);
        key_value_list -> v_msg_key_value_list(Msg, [MsgName], TrUserData);
        key_value -> v_msg_key_value(Msg, [MsgName], TrUserData);
        instrumentation_scope -> v_msg_instrumentation_scope(Msg, [MsgName], TrUserData);
        resource -> v_msg_resource(Msg, [MsgName], TrUserData);
        _ -> mk_type_error(not_a_known_message, Msg, [])
    end.


-compile({nowarn_unused_function,v_msg_export_trace_service_request/3}).
-dialyzer({nowarn_function,v_msg_export_trace_service_request/3}).
v_msg_export_trace_service_request(#{} = M, Path, TrUserData) ->
    case M of
        #{resource_spans := F1} ->
            if is_list(F1) ->
                   _ = [v_submsg_resource_spans(Elem, [resource_spans | Path], TrUserData) || Elem <- F1],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, resource_spans}}, F1, [resource_spans | Path])
            end;
        _ -> ok
    end,
    lists:foreach(fun (resource_spans) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_export_trace_service_request(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), export_trace_service_request}, M, Path);
v_msg_export_trace_service_request(X, Path, _TrUserData) -> mk_type_error({expected_msg, export_trace_service_request}, X, Path).

-compile({nowarn_unused_function,v_msg_export_trace_service_response/3}).
-dialyzer({nowarn_function,v_msg_export_trace_service_response/3}).
v_msg_export_trace_service_response(#{} = M, Path, TrUserData) ->
    case M of
        #{partial_success := F1} -> v_submsg_export_trace_partial_success(F1, [partial_success | Path], TrUserData);
        _ -> ok
    end,
    lists:foreach(fun (partial_success) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_export_trace_service_response(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), export_trace_service_response}, M, Path);
v_msg_export_trace_service_response(X, Path, _TrUserData) -> mk_type_error({expected_msg, export_trace_service_response}, X, Path).

-compile({nowarn_unused_function,v_submsg_export_trace_partial_success/3}).
-dialyzer({nowarn_function,v_submsg_export_trace_partial_success/3}).
v_submsg_export_trace_partial_success(Msg, Path, TrUserData) -> v_msg_export_trace_partial_success(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_export_trace_partial_success/3}).
-dialyzer({nowarn_function,v_msg_export_trace_partial_success/3}).
v_msg_export_trace_partial_success(#{} = M, Path, TrUserData) ->
    case M of
        #{rejected_spans := F1} -> v_type_int64(F1, [rejected_spans | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{error_message := F2} -> v_type_string(F2, [error_message | Path], TrUserData);
        _ -> ok
    end,
    lists:foreach(fun (rejected_spans) -> ok;
                      (error_message) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_export_trace_partial_success(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), export_trace_partial_success}, M, Path);
v_msg_export_trace_partial_success(X, Path, _TrUserData) -> mk_type_error({expected_msg, export_trace_partial_success}, X, Path).

-compile({nowarn_unused_function,v_msg_traces_data/3}).
-dialyzer({nowarn_function,v_msg_traces_data/3}).
v_msg_traces_data(#{} = M, Path, TrUserData) ->
    case M of
        #{resource_spans := F1} ->
            if is_list(F1) ->
                   _ = [v_submsg_resource_spans(Elem, [resource_spans | Path], TrUserData) || Elem <- F1],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, resource_spans}}, F1, [resource_spans | Path])
            end;
        _ -> ok
    end,
    lists:foreach(fun (resource_spans) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_traces_data(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), traces_data}, M, Path);
v_msg_traces_data(X, Path, _TrUserData) -> mk_type_error({expected_msg, traces_data}, X, Path).

-compile({nowarn_unused_function,v_submsg_resource_spans/3}).
-dialyzer({nowarn_function,v_submsg_resource_spans/3}).
v_submsg_resource_spans(Msg, Path, TrUserData) -> v_msg_resource_spans(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_resource_spans/3}).
-dialyzer({nowarn_function,v_msg_resource_spans/3}).
v_msg_resource_spans(#{} = M, Path, TrUserData) ->
    case M of
        #{resource := F1} -> v_submsg_resource(F1, [resource | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{scope_spans := F2} ->
            if is_list(F2) ->
                   _ = [v_submsg_scope_spans(Elem, [scope_spans | Path], TrUserData) || Elem <- F2],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, scope_spans}}, F2, [scope_spans | Path])
            end;
        _ -> ok
    end,
    case M of
        #{schema_url := F3} -> v_type_string(F3, [schema_url | Path], TrUserData);
        _ -> ok
    end,
    lists:foreach(fun (resource) -> ok;
                      (scope_spans) -> ok;
                      (schema_url) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_resource_spans(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), resource_spans}, M, Path);
v_msg_resource_spans(X, Path, _TrUserData) -> mk_type_error({expected_msg, resource_spans}, X, Path).

-compile({nowarn_unused_function,v_submsg_scope_spans/3}).
-dialyzer({nowarn_function,v_submsg_scope_spans/3}).
v_submsg_scope_spans(Msg, Path, TrUserData) -> v_msg_scope_spans(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_scope_spans/3}).
-dialyzer({nowarn_function,v_msg_scope_spans/3}).
v_msg_scope_spans(#{} = M, Path, TrUserData) ->
    case M of
        #{scope := F1} -> v_submsg_instrumentation_scope(F1, [scope | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{spans := F2} ->
            if is_list(F2) ->
                   _ = [v_submsg_span(Elem, [spans | Path], TrUserData) || Elem <- F2],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, span}}, F2, [spans | Path])
            end;
        _ -> ok
    end,
    case M of
        #{schema_url := F3} -> v_type_string(F3, [schema_url | Path], TrUserData);
        _ -> ok
    end,
    lists:foreach(fun (scope) -> ok;
                      (spans) -> ok;
                      (schema_url) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_scope_spans(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), scope_spans}, M, Path);
v_msg_scope_spans(X, Path, _TrUserData) -> mk_type_error({expected_msg, scope_spans}, X, Path).

-compile({nowarn_unused_function,v_submsg_event/3}).
-dialyzer({nowarn_function,v_submsg_event/3}).
v_submsg_event(Msg, Path, TrUserData) -> v_msg_event(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_event/3}).
-dialyzer({nowarn_function,v_msg_event/3}).
v_msg_event(#{} = M, Path, TrUserData) ->
    case M of
        #{time_unix_nano := F1} -> v_type_fixed64(F1, [time_unix_nano | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{name := F2} -> v_type_string(F2, [name | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{attributes := F3} ->
            if is_list(F3) ->
                   _ = [v_submsg_key_value(Elem, [attributes | Path], TrUserData) || Elem <- F3],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, key_value}}, F3, [attributes | Path])
            end;
        _ -> ok
    end,
    case M of
        #{dropped_attributes_count := F4} -> v_type_uint32(F4, [dropped_attributes_count | Path], TrUserData);
        _ -> ok
    end,
    lists:foreach(fun (time_unix_nano) -> ok;
                      (name) -> ok;
                      (attributes) -> ok;
                      (dropped_attributes_count) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_event(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), event}, M, Path);
v_msg_event(X, Path, _TrUserData) -> mk_type_error({expected_msg, event}, X, Path).

-compile({nowarn_unused_function,v_submsg_link/3}).
-dialyzer({nowarn_function,v_submsg_link/3}).
v_submsg_link(Msg, Path, TrUserData) -> v_msg_link(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_link/3}).
-dialyzer({nowarn_function,v_msg_link/3}).
v_msg_link(#{} = M, Path, TrUserData) ->
    case M of
        #{trace_id := F1} -> v_type_bytes(F1, [trace_id | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{span_id := F2} -> v_type_bytes(F2, [span_id | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{trace_state := F3} -> v_type_string(F3, [trace_state | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{attributes := F4} ->
            if is_list(F4) ->
                   _ = [v_submsg_key_value(Elem, [attributes | Path], TrUserData) || Elem <- F4],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, key_value}}, F4, [attributes | Path])
            end;
        _ -> ok
    end,
    case M of
        #{dropped_attributes_count := F5} -> v_type_uint32(F5, [dropped_attributes_count | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{flags := F6} -> v_type_fixed32(F6, [flags | Path], TrUserData);
        _ -> ok
    end,
    lists:foreach(fun (trace_id) -> ok;
                      (span_id) -> ok;
                      (trace_state) -> ok;
                      (attributes) -> ok;
                      (dropped_attributes_count) -> ok;
                      (flags) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_link(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), link}, M, Path);
v_msg_link(X, Path, _TrUserData) -> mk_type_error({expected_msg, link}, X, Path).

-compile({nowarn_unused_function,v_submsg_span/3}).
-dialyzer({nowarn_function,v_submsg_span/3}).
v_submsg_span(Msg, Path, TrUserData) -> v_msg_span(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_span/3}).
-dialyzer({nowarn_function,v_msg_span/3}).
v_msg_span(#{} = M, Path, TrUserData) ->
    case M of
        #{trace_id := F1} -> v_type_bytes(F1, [trace_id | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{span_id := F2} -> v_type_bytes(F2, [span_id | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{trace_state := F3} -> v_type_string(F3, [trace_state | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{parent_span_id := F4} -> v_type_bytes(F4, [parent_span_id | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{flags := F5} -> v_type_fixed32(F5, [flags | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{name := F6} -> v_type_string(F6, [name | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{kind := F7} -> 'v_enum_span.SpanKind'(F7, [kind | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{start_time_unix_nano := F8} -> v_type_fixed64(F8, [start_time_unix_nano | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{end_time_unix_nano := F9} -> v_type_fixed64(F9, [end_time_unix_nano | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{attributes := F10} ->
            if is_list(F10) ->
                   _ = [v_submsg_key_value(Elem, [attributes | Path], TrUserData) || Elem <- F10],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, key_value}}, F10, [attributes | Path])
            end;
        _ -> ok
    end,
    case M of
        #{dropped_attributes_count := F11} -> v_type_uint32(F11, [dropped_attributes_count | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{events := F12} ->
            if is_list(F12) ->
                   _ = [v_submsg_event(Elem, [events | Path], TrUserData) || Elem <- F12],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, event}}, F12, [events | Path])
            end;
        _ -> ok
    end,
    case M of
        #{dropped_events_count := F13} -> v_type_uint32(F13, [dropped_events_count | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{links := F14} ->
            if is_list(F14) ->
                   _ = [v_submsg_link(Elem, [links | Path], TrUserData) || Elem <- F14],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, link}}, F14, [links | Path])
            end;
        _ -> ok
    end,
    case M of
        #{dropped_links_count := F15} -> v_type_uint32(F15, [dropped_links_count | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{status := F16} -> v_submsg_status(F16, [status | Path], TrUserData);
        _ -> ok
    end,
    lists:foreach(fun (trace_id) -> ok;
                      (span_id) -> ok;
                      (trace_state) -> ok;
                      (parent_span_id) -> ok;
                      (flags) -> ok;
                      (name) -> ok;
                      (kind) -> ok;
                      (start_time_unix_nano) -> ok;
                      (end_time_unix_nano) -> ok;
                      (attributes) -> ok;
                      (dropped_attributes_count) -> ok;
                      (events) -> ok;
                      (dropped_events_count) -> ok;
                      (links) -> ok;
                      (dropped_links_count) -> ok;
                      (status) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_span(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), span}, M, Path);
v_msg_span(X, Path, _TrUserData) -> mk_type_error({expected_msg, span}, X, Path).

-compile({nowarn_unused_function,v_submsg_status/3}).
-dialyzer({nowarn_function,v_submsg_status/3}).
v_submsg_status(Msg, Path, TrUserData) -> v_msg_status(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_status/3}).
-dialyzer({nowarn_function,v_msg_status/3}).
v_msg_status(#{} = M, Path, TrUserData) ->
    case M of
        #{message := F1} -> v_type_string(F1, [message | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{code := F2} -> 'v_enum_status.StatusCode'(F2, [code | Path], TrUserData);
        _ -> ok
    end,
    lists:foreach(fun (message) -> ok;
                      (code) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_status(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), status}, M, Path);
v_msg_status(X, Path, _TrUserData) -> mk_type_error({expected_msg, status}, X, Path).

-compile({nowarn_unused_function,v_submsg_any_value/3}).
-dialyzer({nowarn_function,v_submsg_any_value/3}).
v_submsg_any_value(Msg, Path, TrUserData) -> v_msg_any_value(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_any_value/3}).
-dialyzer({nowarn_function,v_msg_any_value/3}).
v_msg_any_value(#{} = M, Path, TrUserData) ->
    case M of
        #{value := {string_value, OF1}} -> v_type_string(OF1, [string_value, value | Path], TrUserData);
        #{value := {bool_value, OF1}} -> v_type_bool(OF1, [bool_value, value | Path], TrUserData);
        #{value := {int_value, OF1}} -> v_type_int64(OF1, [int_value, value | Path], TrUserData);
        #{value := {double_value, OF1}} -> v_type_double(OF1, [double_value, value | Path], TrUserData);
        #{value := {array_value, OF1}} -> v_submsg_array_value(OF1, [array_value, value | Path], TrUserData);
        #{value := {kvlist_value, OF1}} -> v_submsg_key_value_list(OF1, [kvlist_value, value | Path], TrUserData);
        #{value := {bytes_value, OF1}} -> v_type_bytes(OF1, [bytes_value, value | Path], TrUserData);
        #{value := F1} -> mk_type_error(invalid_oneof, F1, [value | Path]);
        _ -> ok
    end,
    lists:foreach(fun (value) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_any_value(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), any_value}, M, Path);
v_msg_any_value(X, Path, _TrUserData) -> mk_type_error({expected_msg, any_value}, X, Path).

-compile({nowarn_unused_function,v_submsg_array_value/3}).
-dialyzer({nowarn_function,v_submsg_array_value/3}).
v_submsg_array_value(Msg, Path, TrUserData) -> v_msg_array_value(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_array_value/3}).
-dialyzer({nowarn_function,v_msg_array_value/3}).
v_msg_array_value(#{} = M, Path, TrUserData) ->
    case M of
        #{values := F1} ->
            if is_list(F1) ->
                   _ = [v_submsg_any_value(Elem, [values | Path], TrUserData) || Elem <- F1],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, any_value}}, F1, [values | Path])
            end;
        _ -> ok
    end,
    lists:foreach(fun (values) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_array_value(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), array_value}, M, Path);
v_msg_array_value(X, Path, _TrUserData) -> mk_type_error({expected_msg, array_value}, X, Path).

-compile({nowarn_unused_function,v_submsg_key_value_list/3}).
-dialyzer({nowarn_function,v_submsg_key_value_list/3}).
v_submsg_key_value_list(Msg, Path, TrUserData) -> v_msg_key_value_list(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_key_value_list/3}).
-dialyzer({nowarn_function,v_msg_key_value_list/3}).
v_msg_key_value_list(#{} = M, Path, TrUserData) ->
    case M of
        #{values := F1} ->
            if is_list(F1) ->
                   _ = [v_submsg_key_value(Elem, [values | Path], TrUserData) || Elem <- F1],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, key_value}}, F1, [values | Path])
            end;
        _ -> ok
    end,
    lists:foreach(fun (values) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_key_value_list(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), key_value_list}, M, Path);
v_msg_key_value_list(X, Path, _TrUserData) -> mk_type_error({expected_msg, key_value_list}, X, Path).

-compile({nowarn_unused_function,v_submsg_key_value/3}).
-dialyzer({nowarn_function,v_submsg_key_value/3}).
v_submsg_key_value(Msg, Path, TrUserData) -> v_msg_key_value(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_key_value/3}).
-dialyzer({nowarn_function,v_msg_key_value/3}).
v_msg_key_value(#{} = M, Path, TrUserData) ->
    case M of
        #{key := F1} -> v_type_string(F1, [key | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{value := F2} -> v_submsg_any_value(F2, [value | Path], TrUserData);
        _ -> ok
    end,
    lists:foreach(fun (key) -> ok;
                      (value) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_key_value(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), key_value}, M, Path);
v_msg_key_value(X, Path, _TrUserData) -> mk_type_error({expected_msg, key_value}, X, Path).

-compile({nowarn_unused_function,v_submsg_instrumentation_scope/3}).
-dialyzer({nowarn_function,v_submsg_instrumentation_scope/3}).
v_submsg_instrumentation_scope(Msg, Path, TrUserData) -> v_msg_instrumentation_scope(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_instrumentation_scope/3}).
-dialyzer({nowarn_function,v_msg_instrumentation_scope/3}).
v_msg_instrumentation_scope(#{} = M, Path, TrUserData) ->
    case M of
        #{name := F1} -> v_type_string(F1, [name | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{version := F2} -> v_type_string(F2, [version | Path], TrUserData);
        _ -> ok
    end,
    case M of
        #{attributes := F3} ->
            if is_list(F3) ->
                   _ = [v_submsg_key_value(Elem, [attributes | Path], TrUserData) || Elem <- F3],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, key_value}}, F3, [attributes | Path])
            end;
        _ -> ok
    end,
    case M of
        #{dropped_attributes_count := F4} -> v_type_uint32(F4, [dropped_attributes_count | Path], TrUserData);
        _ -> ok
    end,
    lists:foreach(fun (name) -> ok;
                      (version) -> ok;
                      (attributes) -> ok;
                      (dropped_attributes_count) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_instrumentation_scope(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), instrumentation_scope}, M, Path);
v_msg_instrumentation_scope(X, Path, _TrUserData) -> mk_type_error({expected_msg, instrumentation_scope}, X, Path).

-compile({nowarn_unused_function,v_submsg_resource/3}).
-dialyzer({nowarn_function,v_submsg_resource/3}).
v_submsg_resource(Msg, Path, TrUserData) -> v_msg_resource(Msg, Path, TrUserData).

-compile({nowarn_unused_function,v_msg_resource/3}).
-dialyzer({nowarn_function,v_msg_resource/3}).
v_msg_resource(#{} = M, Path, TrUserData) ->
    case M of
        #{attributes := F1} ->
            if is_list(F1) ->
                   _ = [v_submsg_key_value(Elem, [attributes | Path], TrUserData) || Elem <- F1],
                   ok;
               true -> mk_type_error({invalid_list_of, {msg, key_value}}, F1, [attributes | Path])
            end;
        _ -> ok
    end,
    case M of
        #{dropped_attributes_count := F2} -> v_type_uint32(F2, [dropped_attributes_count | Path], TrUserData);
        _ -> ok
    end,
    lists:foreach(fun (attributes) -> ok;
                      (dropped_attributes_count) -> ok;
                      (OtherKey) -> mk_type_error({extraneous_key, OtherKey}, M, Path)
                  end,
                  maps:keys(M)),
    ok;
v_msg_resource(M, Path, _TrUserData) when is_map(M) -> mk_type_error({missing_fields, [] -- maps:keys(M), resource}, M, Path);
v_msg_resource(X, Path, _TrUserData) -> mk_type_error({expected_msg, resource}, X, Path).

-compile({nowarn_unused_function,'v_enum_span.SpanKind'/3}).
-dialyzer({nowarn_function,'v_enum_span.SpanKind'/3}).
'v_enum_span.SpanKind'('SPAN_KIND_UNSPECIFIED', _Path, _TrUserData) -> ok;
'v_enum_span.SpanKind'('SPAN_KIND_INTERNAL', _Path, _TrUserData) -> ok;
'v_enum_span.SpanKind'('SPAN_KIND_SERVER', _Path, _TrUserData) -> ok;
'v_enum_span.SpanKind'('SPAN_KIND_CLIENT', _Path, _TrUserData) -> ok;
'v_enum_span.SpanKind'('SPAN_KIND_PRODUCER', _Path, _TrUserData) -> ok;
'v_enum_span.SpanKind'('SPAN_KIND_CONSUMER', _Path, _TrUserData) -> ok;
'v_enum_span.SpanKind'(V, _Path, _TrUserData) when -2147483648 =< V, V =< 2147483647, is_integer(V) -> ok;
'v_enum_span.SpanKind'(X, Path, _TrUserData) -> mk_type_error({invalid_enum, 'span.SpanKind'}, X, Path).

-compile({nowarn_unused_function,'v_enum_status.StatusCode'/3}).
-dialyzer({nowarn_function,'v_enum_status.StatusCode'/3}).
'v_enum_status.StatusCode'('STATUS_CODE_UNSET', _Path, _TrUserData) -> ok;
'v_enum_status.StatusCode'('STATUS_CODE_OK', _Path, _TrUserData) -> ok;
'v_enum_status.StatusCode'('STATUS_CODE_ERROR', _Path, _TrUserData) -> ok;
'v_enum_status.StatusCode'(V, _Path, _TrUserData) when -2147483648 =< V, V =< 2147483647, is_integer(V) -> ok;
'v_enum_status.StatusCode'(X, Path, _TrUserData) -> mk_type_error({invalid_enum, 'status.StatusCode'}, X, Path).

-compile({nowarn_unused_function,v_type_int64/3}).
-dialyzer({nowarn_function,v_type_int64/3}).
v_type_int64(N, _Path, _TrUserData) when is_integer(N), -9223372036854775808 =< N, N =< 9223372036854775807 -> ok;
v_type_int64(N, Path, _TrUserData) when is_integer(N) -> mk_type_error({value_out_of_range, int64, signed, 64}, N, Path);
v_type_int64(X, Path, _TrUserData) -> mk_type_error({bad_integer, int64, signed, 64}, X, Path).

-compile({nowarn_unused_function,v_type_uint32/3}).
-dialyzer({nowarn_function,v_type_uint32/3}).
v_type_uint32(N, _Path, _TrUserData) when is_integer(N), 0 =< N, N =< 4294967295 -> ok;
v_type_uint32(N, Path, _TrUserData) when is_integer(N) -> mk_type_error({value_out_of_range, uint32, unsigned, 32}, N, Path);
v_type_uint32(X, Path, _TrUserData) -> mk_type_error({bad_integer, uint32, unsigned, 32}, X, Path).

-compile({nowarn_unused_function,v_type_fixed32/3}).
-dialyzer({nowarn_function,v_type_fixed32/3}).
v_type_fixed32(N, _Path, _TrUserData) when is_integer(N), 0 =< N, N =< 4294967295 -> ok;
v_type_fixed32(N, Path, _TrUserData) when is_integer(N) -> mk_type_error({value_out_of_range, fixed32, unsigned, 32}, N, Path);
v_type_fixed32(X, Path, _TrUserData) -> mk_type_error({bad_integer, fixed32, unsigned, 32}, X, Path).

-compile({nowarn_unused_function,v_type_fixed64/3}).
-dialyzer({nowarn_function,v_type_fixed64/3}).
v_type_fixed64(N, _Path, _TrUserData) when is_integer(N), 0 =< N, N =< 18446744073709551615 -> ok;
v_type_fixed64(N, Path, _TrUserData) when is_integer(N) -> mk_type_error({value_out_of_range, fixed64, unsigned, 64}, N, Path);
v_type_fixed64(X, Path, _TrUserData) -> mk_type_error({bad_integer, fixed64, unsigned, 64}, X, Path).

-compile({nowarn_unused_function,v_type_bool/3}).
-dialyzer({nowarn_function,v_type_bool/3}).
v_type_bool(false, _Path, _TrUserData) -> ok;
v_type_bool(true, _Path, _TrUserData) -> ok;
v_type_bool(0, _Path, _TrUserData) -> ok;
v_type_bool(1, _Path, _TrUserData) -> ok;
v_type_bool(X, Path, _TrUserData) -> mk_type_error(bad_boolean_value, X, Path).

-compile({nowarn_unused_function,v_type_double/3}).
-dialyzer({nowarn_function,v_type_double/3}).
v_type_double(N, _Path, _TrUserData) when is_float(N) -> ok;
v_type_double(N, _Path, _TrUserData) when is_integer(N) -> ok;
v_type_double(infinity, _Path, _TrUserData) -> ok;
v_type_double('-infinity', _Path, _TrUserData) -> ok;
v_type_double(nan, _Path, _TrUserData) -> ok;
v_type_double(X, Path, _TrUserData) -> mk_type_error(bad_double_value, X, Path).

-compile({nowarn_unused_function,v_type_string/3}).
-dialyzer({nowarn_function,v_type_string/3}).
v_type_string(S, Path, _TrUserData) when is_list(S); is_binary(S) ->
    try unicode:characters_to_binary(S) of
        B when is_binary(B) -> ok;
        {error, _, _} -> mk_type_error(bad_unicode_string, S, Path)
    catch
        error:badarg -> mk_type_error(bad_unicode_string, S, Path)
    end;
v_type_string(X, Path, _TrUserData) -> mk_type_error(bad_unicode_string, X, Path).

-compile({nowarn_unused_function,v_type_bytes/3}).
-dialyzer({nowarn_function,v_type_bytes/3}).
v_type_bytes(B, _Path, _TrUserData) when is_binary(B) -> ok;
v_type_bytes(B, _Path, _TrUserData) when is_list(B) -> ok;
v_type_bytes(X, Path, _TrUserData) -> mk_type_error(bad_binary_value, X, Path).

-compile({nowarn_unused_function,mk_type_error/3}).
-spec mk_type_error(_, _, list()) -> no_return().
mk_type_error(Error, ValueSeen, Path) ->
    Path2 = prettify_path(Path),
    erlang:error({gpb_type_error, {Error, [{value, ValueSeen}, {path, Path2}]}}).


-compile({nowarn_unused_function,prettify_path/1}).
-dialyzer({nowarn_function,prettify_path/1}).
prettify_path([]) -> top_level;
prettify_path(PathR) -> lists:append(lists:join(".", lists:map(fun atom_to_list/1, lists:reverse(PathR)))).


-compile({nowarn_unused_function,id/2}).
-compile({inline,id/2}).
id(X, _TrUserData) -> X.

-compile({nowarn_unused_function,v_ok/3}).
-compile({inline,v_ok/3}).
v_ok(_Value, _Path, _TrUserData) -> ok.

-compile({nowarn_unused_function,m_overwrite/3}).
-compile({inline,m_overwrite/3}).
m_overwrite(_Prev, New, _TrUserData) -> New.

-compile({nowarn_unused_function,cons/3}).
-compile({inline,cons/3}).
cons(Elem, Acc, _TrUserData) -> [Elem | Acc].

-compile({nowarn_unused_function,lists_reverse/2}).
-compile({inline,lists_reverse/2}).
'lists_reverse'(L, _TrUserData) -> lists:reverse(L).
-compile({nowarn_unused_function,'erlang_++'/3}).
-compile({inline,'erlang_++'/3}).
'erlang_++'(A, B, _TrUserData) -> A ++ B.


get_msg_defs() ->
    [{{enum, 'span.SpanKind'}, [{'SPAN_KIND_UNSPECIFIED', 0}, {'SPAN_KIND_INTERNAL', 1}, {'SPAN_KIND_SERVER', 2}, {'SPAN_KIND_CLIENT', 3}, {'SPAN_KIND_PRODUCER', 4}, {'SPAN_KIND_CONSUMER', 5}]},
     {{enum, 'status.StatusCode'}, [{'STATUS_CODE_UNSET', 0}, {'STATUS_CODE_OK', 1}, {'STATUS_CODE_ERROR', 2}]},
     {{enum, 'opentelemetry.proto.trace.v1.SpanFlags'}, [{'SPAN_FLAGS_DO_NOT_USE', 0}, {'SPAN_FLAGS_TRACE_FLAGS_MASK', 255}]},
     {{msg, export_trace_service_request}, [#{name => resource_spans, fnum => 1, rnum => 2, type => {msg, resource_spans}, occurrence => repeated, opts => []}]},
     {{msg, export_trace_service_response}, [#{name => partial_success, fnum => 1, rnum => 2, type => {msg, export_trace_partial_success}, occurrence => optional, opts => []}]},
     {{msg, export_trace_partial_success}, [#{name => rejected_spans, fnum => 1, rnum => 2, type => int64, occurrence => optional, opts => []}, #{name => error_message, fnum => 2, rnum => 3, type => string, occurrence => optional, opts => []}]},
     {{msg, traces_data}, [#{name => resource_spans, fnum => 1, rnum => 2, type => {msg, resource_spans}, occurrence => repeated, opts => []}]},
     {{msg, resource_spans},
      [#{name => resource, fnum => 1, rnum => 2, type => {msg, resource}, occurrence => optional, opts => []},
       #{name => scope_spans, fnum => 2, rnum => 3, type => {msg, scope_spans}, occurrence => repeated, opts => []},
       #{name => schema_url, fnum => 3, rnum => 4, type => string, occurrence => optional, opts => []}]},
     {{msg, scope_spans},
      [#{name => scope, fnum => 1, rnum => 2, type => {msg, instrumentation_scope}, occurrence => optional, opts => []},
       #{name => spans, fnum => 2, rnum => 3, type => {msg, span}, occurrence => repeated, opts => []},
       #{name => schema_url, fnum => 3, rnum => 4, type => string, occurrence => optional, opts => []}]},
     {{msg, event},
      [#{name => time_unix_nano, fnum => 1, rnum => 2, type => fixed64, occurrence => optional, opts => []},
       #{name => name, fnum => 2, rnum => 3, type => string, occurrence => optional, opts => []},
       #{name => attributes, fnum => 3, rnum => 4, type => {msg, key_value}, occurrence => repeated, opts => []},
       #{name => dropped_attributes_count, fnum => 4, rnum => 5, type => uint32, occurrence => optional, opts => []}]},
     {{msg, link},
      [#{name => trace_id, fnum => 1, rnum => 2, type => bytes, occurrence => optional, opts => []},
       #{name => span_id, fnum => 2, rnum => 3, type => bytes, occurrence => optional, opts => []},
       #{name => trace_state, fnum => 3, rnum => 4, type => string, occurrence => optional, opts => []},
       #{name => attributes, fnum => 4, rnum => 5, type => {msg, key_value}, occurrence => repeated, opts => []},
       #{name => dropped_attributes_count, fnum => 5, rnum => 6, type => uint32, occurrence => optional, opts => []},
       #{name => flags, fnum => 6, rnum => 7, type => fixed32, occurrence => optional, opts => []}]},
     {{msg, span},
      [#{name => trace_id, fnum => 1, rnum => 2, type => bytes, occurrence => optional, opts => []},
       #{name => span_id, fnum => 2, rnum => 3, type => bytes, occurrence => optional, opts => []},
       #{name => trace_state, fnum => 3, rnum => 4, type => string, occurrence => optional, opts => []},
       #{name => parent_span_id, fnum => 4, rnum => 5, type => bytes, occurrence => optional, opts => []},
       #{name => flags, fnum => 16, rnum => 6, type => fixed32, occurrence => optional, opts => []},
       #{name => name, fnum => 5, rnum => 7, type => string, occurrence => optional, opts => []},
       #{name => kind, fnum => 6, rnum => 8, type => {enum, 'span.SpanKind'}, occurrence => optional, opts => []},
       #{name => start_time_unix_nano, fnum => 7, rnum => 9, type => fixed64, occurrence => optional, opts => []},
       #{name => end_time_unix_nano, fnum => 8, rnum => 10, type => fixed64, occurrence => optional, opts => []},
       #{name => attributes, fnum => 9, rnum => 11, type => {msg, key_value}, occurrence => repeated, opts => []},
       #{name => dropped_attributes_count, fnum => 10, rnum => 12, type => uint32, occurrence => optional, opts => []},
       #{name => events, fnum => 11, rnum => 13, type => {msg, event}, occurrence => repeated, opts => []},
       #{name => dropped_events_count, fnum => 12, rnum => 14, type => uint32, occurrence => optional, opts => []},
       #{name => links, fnum => 13, rnum => 15, type => {msg, link}, occurrence => repeated, opts => []},
       #{name => dropped_links_count, fnum => 14, rnum => 16, type => uint32, occurrence => optional, opts => []},
       #{name => status, fnum => 15, rnum => 17, type => {msg, status}, occurrence => optional, opts => []}]},
     {{msg, status}, [#{name => message, fnum => 2, rnum => 2, type => string, occurrence => optional, opts => []}, #{name => code, fnum => 3, rnum => 3, type => {enum, 'status.StatusCode'}, occurrence => optional, opts => []}]},
     {{msg, any_value},
      [#{name => value, rnum => 2,
         fields =>
             [#{name => string_value, fnum => 1, rnum => 2, type => string, occurrence => optional, opts => []},
              #{name => bool_value, fnum => 2, rnum => 2, type => bool, occurrence => optional, opts => []},
              #{name => int_value, fnum => 3, rnum => 2, type => int64, occurrence => optional, opts => []},
              #{name => double_value, fnum => 4, rnum => 2, type => double, occurrence => optional, opts => []},
              #{name => array_value, fnum => 5, rnum => 2, type => {msg, array_value}, occurrence => optional, opts => []},
              #{name => kvlist_value, fnum => 6, rnum => 2, type => {msg, key_value_list}, occurrence => optional, opts => []},
              #{name => bytes_value, fnum => 7, rnum => 2, type => bytes, occurrence => optional, opts => []}],
         opts => []}]},
     {{msg, array_value}, [#{name => values, fnum => 1, rnum => 2, type => {msg, any_value}, occurrence => repeated, opts => []}]},
     {{msg, key_value_list}, [#{name => values, fnum => 1, rnum => 2, type => {msg, key_value}, occurrence => repeated, opts => []}]},
     {{msg, key_value}, [#{name => key, fnum => 1, rnum => 2, type => string, occurrence => optional, opts => []}, #{name => value, fnum => 2, rnum => 3, type => {msg, any_value}, occurrence => optional, opts => []}]},
     {{msg, instrumentation_scope},
      [#{name => name, fnum => 1, rnum => 2, type => string, occurrence => optional, opts => []},
       #{name => version, fnum => 2, rnum => 3, type => string, occurrence => optional, opts => []},
       #{name => attributes, fnum => 3, rnum => 4, type => {msg, key_value}, occurrence => repeated, opts => []},
       #{name => dropped_attributes_count, fnum => 4, rnum => 5, type => uint32, occurrence => optional, opts => []}]},
     {{msg, resource}, [#{name => attributes, fnum => 1, rnum => 2, type => {msg, key_value}, occurrence => repeated, opts => []}, #{name => dropped_attributes_count, fnum => 2, rnum => 3, type => uint32, occurrence => optional, opts => []}]}].


get_msg_names() ->
    [export_trace_service_request, export_trace_service_response, export_trace_partial_success, traces_data, resource_spans, scope_spans, event, link, span, status, any_value, array_value, key_value_list, key_value, instrumentation_scope, resource].


get_group_names() -> [].


get_msg_or_group_names() ->
    [export_trace_service_request, export_trace_service_response, export_trace_partial_success, traces_data, resource_spans, scope_spans, event, link, span, status, any_value, array_value, key_value_list, key_value, instrumentation_scope, resource].


get_enum_names() -> ['span.SpanKind', 'status.StatusCode', 'opentelemetry.proto.trace.v1.SpanFlags'].


fetch_msg_def(MsgName) ->
    case find_msg_def(MsgName) of
        Fs when is_list(Fs) -> Fs;
        error -> erlang:error({no_such_msg, MsgName})
    end.


fetch_enum_def(EnumName) ->
    case find_enum_def(EnumName) of
        Es when is_list(Es) -> Es;
        error -> erlang:error({no_such_enum, EnumName})
    end.


find_msg_def(export_trace_service_request) -> [#{name => resource_spans, fnum => 1, rnum => 2, type => {msg, resource_spans}, occurrence => repeated, opts => []}];
find_msg_def(export_trace_service_response) -> [#{name => partial_success, fnum => 1, rnum => 2, type => {msg, export_trace_partial_success}, occurrence => optional, opts => []}];
find_msg_def(export_trace_partial_success) -> [#{name => rejected_spans, fnum => 1, rnum => 2, type => int64, occurrence => optional, opts => []}, #{name => error_message, fnum => 2, rnum => 3, type => string, occurrence => optional, opts => []}];
find_msg_def(traces_data) -> [#{name => resource_spans, fnum => 1, rnum => 2, type => {msg, resource_spans}, occurrence => repeated, opts => []}];
find_msg_def(resource_spans) ->
    [#{name => resource, fnum => 1, rnum => 2, type => {msg, resource}, occurrence => optional, opts => []},
     #{name => scope_spans, fnum => 2, rnum => 3, type => {msg, scope_spans}, occurrence => repeated, opts => []},
     #{name => schema_url, fnum => 3, rnum => 4, type => string, occurrence => optional, opts => []}];
find_msg_def(scope_spans) ->
    [#{name => scope, fnum => 1, rnum => 2, type => {msg, instrumentation_scope}, occurrence => optional, opts => []},
     #{name => spans, fnum => 2, rnum => 3, type => {msg, span}, occurrence => repeated, opts => []},
     #{name => schema_url, fnum => 3, rnum => 4, type => string, occurrence => optional, opts => []}];
find_msg_def(event) ->
    [#{name => time_unix_nano, fnum => 1, rnum => 2, type => fixed64, occurrence => optional, opts => []},
     #{name => name, fnum => 2, rnum => 3, type => string, occurrence => optional, opts => []},
     #{name => attributes, fnum => 3, rnum => 4, type => {msg, key_value}, occurrence => repeated, opts => []},
     #{name => dropped_attributes_count, fnum => 4, rnum => 5, type => uint32, occurrence => optional, opts => []}];
find_msg_def(link) ->
    [#{name => trace_id, fnum => 1, rnum => 2, type => bytes, occurrence => optional, opts => []},
     #{name => span_id, fnum => 2, rnum => 3, type => bytes, occurrence => optional, opts => []},
     #{name => trace_state, fnum => 3, rnum => 4, type => string, occurrence => optional, opts => []},
     #{name => attributes, fnum => 4, rnum => 5, type => {msg, key_value}, occurrence => repeated, opts => []},
     #{name => dropped_attributes_count, fnum => 5, rnum => 6, type => uint32, occurrence => optional, opts => []},
     #{name => flags, fnum => 6, rnum => 7, type => fixed32, occurrence => optional, opts => []}];
find_msg_def(span) ->
    [#{name => trace_id, fnum => 1, rnum => 2, type => bytes, occurrence => optional, opts => []},
     #{name => span_id, fnum => 2, rnum => 3, type => bytes, occurrence => optional, opts => []},
     #{name => trace_state, fnum => 3, rnum => 4, type => string, occurrence => optional, opts => []},
     #{name => parent_span_id, fnum => 4, rnum => 5, type => bytes, occurrence => optional, opts => []},
     #{name => flags, fnum => 16, rnum => 6, type => fixed32, occurrence => optional, opts => []},
     #{name => name, fnum => 5, rnum => 7, type => string, occurrence => optional, opts => []},
     #{name => kind, fnum => 6, rnum => 8, type => {enum, 'span.SpanKind'}, occurrence => optional, opts => []},
     #{name => start_time_unix_nano, fnum => 7, rnum => 9, type => fixed64, occurrence => optional, opts => []},
     #{name => end_time_unix_nano, fnum => 8, rnum => 10, type => fixed64, occurrence => optional, opts => []},
     #{name => attributes, fnum => 9, rnum => 11, type => {msg, key_value}, occurrence => repeated, opts => []},
     #{name => dropped_attributes_count, fnum => 10, rnum => 12, type => uint32, occurrence => optional, opts => []},
     #{name => events, fnum => 11, rnum => 13, type => {msg, event}, occurrence => repeated, opts => []},
     #{name => dropped_events_count, fnum => 12, rnum => 14, type => uint32, occurrence => optional, opts => []},
     #{name => links, fnum => 13, rnum => 15, type => {msg, link}, occurrence => repeated, opts => []},
     #{name => dropped_links_count, fnum => 14, rnum => 16, type => uint32, occurrence => optional, opts => []},
     #{name => status, fnum => 15, rnum => 17, type => {msg, status}, occurrence => optional, opts => []}];
find_msg_def(status) -> [#{name => message, fnum => 2, rnum => 2, type => string, occurrence => optional, opts => []}, #{name => code, fnum => 3, rnum => 3, type => {enum, 'status.StatusCode'}, occurrence => optional, opts => []}];
find_msg_def(any_value) ->
    [#{name => value, rnum => 2,
       fields =>
           [#{name => string_value, fnum => 1, rnum => 2, type => string, occurrence => optional, opts => []},
            #{name => bool_value, fnum => 2, rnum => 2, type => bool, occurrence => optional, opts => []},
            #{name => int_value, fnum => 3, rnum => 2, type => int64, occurrence => optional, opts => []},
            #{name => double_value, fnum => 4, rnum => 2, type => double, occurrence => optional, opts => []},
            #{name => array_value, fnum => 5, rnum => 2, type => {msg, array_value}, occurrence => optional, opts => []},
            #{name => kvlist_value, fnum => 6, rnum => 2, type => {msg, key_value_list}, occurrence => optional, opts => []},
            #{name => bytes_value, fnum => 7, rnum => 2, type => bytes, occurrence => optional, opts => []}],
       opts => []}];
find_msg_def(array_value) -> [#{name => values, fnum => 1, rnum => 2, type => {msg, any_value}, occurrence => repeated, opts => []}];
find_msg_def(key_value_list) -> [#{name => values, fnum => 1, rnum => 2, type => {msg, key_value}, occurrence => repeated, opts => []}];
find_msg_def(key_value) -> [#{name => key, fnum => 1, rnum => 2, type => string, occurrence => optional, opts => []}, #{name => value, fnum => 2, rnum => 3, type => {msg, any_value}, occurrence => optional, opts => []}];
find_msg_def(instrumentation_scope) ->
    [#{name => name, fnum => 1, rnum => 2, type => string, occurrence => optional, opts => []},
     #{name => version, fnum => 2, rnum => 3, type => string, occurrence => optional, opts => []},
     #{name => attributes, fnum => 3, rnum => 4, type => {msg, key_value}, occurrence => repeated, opts => []},
     #{name => dropped_attributes_count, fnum => 4, rnum => 5, type => uint32, occurrence => optional, opts => []}];
find_msg_def(resource) -> [#{name => attributes, fnum => 1, rnum => 2, type => {msg, key_value}, occurrence => repeated, opts => []}, #{name => dropped_attributes_count, fnum => 2, rnum => 3, type => uint32, occurrence => optional, opts => []}];
find_msg_def(_) -> error.


find_enum_def('span.SpanKind') -> [{'SPAN_KIND_UNSPECIFIED', 0}, {'SPAN_KIND_INTERNAL', 1}, {'SPAN_KIND_SERVER', 2}, {'SPAN_KIND_CLIENT', 3}, {'SPAN_KIND_PRODUCER', 4}, {'SPAN_KIND_CONSUMER', 5}];
find_enum_def('status.StatusCode') -> [{'STATUS_CODE_UNSET', 0}, {'STATUS_CODE_OK', 1}, {'STATUS_CODE_ERROR', 2}];
find_enum_def('opentelemetry.proto.trace.v1.SpanFlags') -> [{'SPAN_FLAGS_DO_NOT_USE', 0}, {'SPAN_FLAGS_TRACE_FLAGS_MASK', 255}];
find_enum_def(_) -> error.


enum_symbol_by_value('span.SpanKind', Value) -> 'enum_symbol_by_value_span.SpanKind'(Value);
enum_symbol_by_value('status.StatusCode', Value) -> 'enum_symbol_by_value_status.StatusCode'(Value);
enum_symbol_by_value('opentelemetry.proto.trace.v1.SpanFlags', Value) -> 'enum_symbol_by_value_opentelemetry.proto.trace.v1.SpanFlags'(Value).


enum_value_by_symbol('span.SpanKind', Sym) -> 'enum_value_by_symbol_span.SpanKind'(Sym);
enum_value_by_symbol('status.StatusCode', Sym) -> 'enum_value_by_symbol_status.StatusCode'(Sym);
enum_value_by_symbol('opentelemetry.proto.trace.v1.SpanFlags', Sym) -> 'enum_value_by_symbol_opentelemetry.proto.trace.v1.SpanFlags'(Sym).


'enum_symbol_by_value_span.SpanKind'(0) -> 'SPAN_KIND_UNSPECIFIED';
'enum_symbol_by_value_span.SpanKind'(1) -> 'SPAN_KIND_INTERNAL';
'enum_symbol_by_value_span.SpanKind'(2) -> 'SPAN_KIND_SERVER';
'enum_symbol_by_value_span.SpanKind'(3) -> 'SPAN_KIND_CLIENT';
'enum_symbol_by_value_span.SpanKind'(4) -> 'SPAN_KIND_PRODUCER';
'enum_symbol_by_value_span.SpanKind'(5) -> 'SPAN_KIND_CONSUMER'.


'enum_value_by_symbol_span.SpanKind'('SPAN_KIND_UNSPECIFIED') -> 0;
'enum_value_by_symbol_span.SpanKind'('SPAN_KIND_INTERNAL') -> 1;
'enum_value_by_symbol_span.SpanKind'('SPAN_KIND_SERVER') -> 2;
'enum_value_by_symbol_span.SpanKind'('SPAN_KIND_CLIENT') -> 3;
'enum_value_by_symbol_span.SpanKind'('SPAN_KIND_PRODUCER') -> 4;
'enum_value_by_symbol_span.SpanKind'('SPAN_KIND_CONSUMER') -> 5.

'enum_symbol_by_value_status.StatusCode'(0) -> 'STATUS_CODE_UNSET';
'enum_symbol_by_value_status.StatusCode'(1) -> 'STATUS_CODE_OK';
'enum_symbol_by_value_status.StatusCode'(2) -> 'STATUS_CODE_ERROR'.


'enum_value_by_symbol_status.StatusCode'('STATUS_CODE_UNSET') -> 0;
'enum_value_by_symbol_status.StatusCode'('STATUS_CODE_OK') -> 1;
'enum_value_by_symbol_status.StatusCode'('STATUS_CODE_ERROR') -> 2.

'enum_symbol_by_value_opentelemetry.proto.trace.v1.SpanFlags'(0) -> 'SPAN_FLAGS_DO_NOT_USE';
'enum_symbol_by_value_opentelemetry.proto.trace.v1.SpanFlags'(255) -> 'SPAN_FLAGS_TRACE_FLAGS_MASK'.


'enum_value_by_symbol_opentelemetry.proto.trace.v1.SpanFlags'('SPAN_FLAGS_DO_NOT_USE') -> 0;
'enum_value_by_symbol_opentelemetry.proto.trace.v1.SpanFlags'('SPAN_FLAGS_TRACE_FLAGS_MASK') -> 255.


get_service_names() -> ['opentelemetry.proto.collector.trace.v1.TraceService'].


get_service_def('opentelemetry.proto.collector.trace.v1.TraceService') ->
    {{service, 'opentelemetry.proto.collector.trace.v1.TraceService'}, [#{name => 'Export', input => export_trace_service_request, output => export_trace_service_response, input_stream => false, output_stream => false, opts => []}]};
get_service_def(_) -> error.


get_rpc_names('opentelemetry.proto.collector.trace.v1.TraceService') -> ['Export'];
get_rpc_names(_) -> error.


find_rpc_def('opentelemetry.proto.collector.trace.v1.TraceService', RpcName) -> 'find_rpc_def_opentelemetry.proto.collector.trace.v1.TraceService'(RpcName);
find_rpc_def(_, _) -> error.


'find_rpc_def_opentelemetry.proto.collector.trace.v1.TraceService'('Export') -> #{name => 'Export', input => export_trace_service_request, output => export_trace_service_response, input_stream => false, output_stream => false, opts => []};
'find_rpc_def_opentelemetry.proto.collector.trace.v1.TraceService'(_) -> error.


fetch_rpc_def(ServiceName, RpcName) ->
    case find_rpc_def(ServiceName, RpcName) of
        Def when is_map(Def) -> Def;
        error -> erlang:error({no_such_rpc, ServiceName, RpcName})
    end.


%% Convert a a fully qualified (ie with package name) service name
%% as a binary to a service name as an atom.
fqbin_to_service_name(<<"opentelemetry.proto.collector.trace.v1.TraceService">>) -> 'opentelemetry.proto.collector.trace.v1.TraceService';
fqbin_to_service_name(X) -> error({gpb_error, {badservice, X}}).


%% Convert a service name as an atom to a fully qualified
%% (ie with package name) name as a binary.
service_name_to_fqbin('opentelemetry.proto.collector.trace.v1.TraceService') -> <<"opentelemetry.proto.collector.trace.v1.TraceService">>;
service_name_to_fqbin(X) -> error({gpb_error, {badservice, X}}).


%% Convert a a fully qualified (ie with package name) service name
%% and an rpc name, both as binaries to a service name and an rpc
%% name, as atoms.
fqbins_to_service_and_rpc_name(<<"opentelemetry.proto.collector.trace.v1.TraceService">>, <<"Export">>) -> {'opentelemetry.proto.collector.trace.v1.TraceService', 'Export'};
fqbins_to_service_and_rpc_name(S, R) -> error({gpb_error, {badservice_or_rpc, {S, R}}}).


%% Convert a service name and an rpc name, both as atoms,
%% to a fully qualified (ie with package name) service name and
%% an rpc name as binaries.
service_and_rpc_name_to_fqbins('opentelemetry.proto.collector.trace.v1.TraceService', 'Export') -> {<<"opentelemetry.proto.collector.trace.v1.TraceService">>, <<"Export">>};
service_and_rpc_name_to_fqbins(S, R) -> error({gpb_error, {badservice_or_rpc, {S, R}}}).


fqbin_to_msg_name(<<"opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest">>) -> export_trace_service_request;
fqbin_to_msg_name(<<"opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse">>) -> export_trace_service_response;
fqbin_to_msg_name(<<"opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess">>) -> export_trace_partial_success;
fqbin_to_msg_name(<<"opentelemetry.proto.trace.v1.TracesData">>) -> traces_data;
fqbin_to_msg_name(<<"opentelemetry.proto.trace.v1.ResourceSpans">>) -> resource_spans;
fqbin_to_msg_name(<<"opentelemetry.proto.trace.v1.ScopeSpans">>) -> scope_spans;
fqbin_to_msg_name(<<"opentelemetry.proto.trace.v1.Span.Event">>) -> event;
fqbin_to_msg_name(<<"opentelemetry.proto.trace.v1.Span.Link">>) -> link;
fqbin_to_msg_name(<<"opentelemetry.proto.trace.v1.Span">>) -> span;
fqbin_to_msg_name(<<"opentelemetry.proto.trace.v1.Status">>) -> status;
fqbin_to_msg_name(<<"opentelemetry.proto.common.v1.AnyValue">>) -> any_value;
fqbin_to_msg_name(<<"opentelemetry.proto.common.v1.ArrayValue">>) -> array_value;
fqbin_to_msg_name(<<"opentelemetry.proto.common.v1.KeyValueList">>) -> key_value_list;
fqbin_to_msg_name(<<"opentelemetry.proto.common.v1.KeyValue">>) -> key_value;
fqbin_to_msg_name(<<"opentelemetry.proto.common.v1.InstrumentationScope">>) -> instrumentation_scope;
fqbin_to_msg_name(<<"opentelemetry.proto.resource.v1.Resource">>) -> resource;
fqbin_to_msg_name(E) -> error({gpb_error, {badmsg, E}}).


msg_name_to_fqbin(export_trace_service_request) -> <<"opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest">>;
msg_name_to_fqbin(export_trace_service_response) -> <<"opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse">>;
msg_name_to_fqbin(export_trace_partial_success) -> <<"opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess">>;
msg_name_to_fqbin(traces_data) -> <<"opentelemetry.proto.trace.v1.TracesData">>;
msg_name_to_fqbin(resource_spans) -> <<"opentelemetry.proto.trace.v1.ResourceSpans">>;
msg_name_to_fqbin(scope_spans) -> <<"opentelemetry.proto.trace.v1.ScopeSpans">>;
msg_name_to_fqbin(event) -> <<"opentelemetry.proto.trace.v1.Span.Event">>;
msg_name_to_fqbin(link) -> <<"opentelemetry.proto.trace.v1.Span.Link">>;
msg_name_to_fqbin(span) -> <<"opentelemetry.proto.trace.v1.Span">>;
msg_name_to_fqbin(status) -> <<"opentelemetry.proto.trace.v1.Status">>;
msg_name_to_fqbin(any_value) -> <<"opentelemetry.proto.common.v1.AnyValue">>;
msg_name_to_fqbin(array_value) -> <<"opentelemetry.proto.common.v1.ArrayValue">>;
msg_name_to_fqbin(key_value_list) -> <<"opentelemetry.proto.common.v1.KeyValueList">>;
msg_name_to_fqbin(key_value) -> <<"opentelemetry.proto.common.v1.KeyValue">>;
msg_name_to_fqbin(instrumentation_scope) -> <<"opentelemetry.proto.common.v1.InstrumentationScope">>;
msg_name_to_fqbin(resource) -> <<"opentelemetry.proto.resource.v1.Resource">>;
msg_name_to_fqbin(E) -> error({gpb_error, {badmsg, E}}).


fqbin_to_enum_name(<<"opentelemetry.proto.trace.v1.Span.SpanKind">>) -> 'span.SpanKind';
fqbin_to_enum_name(<<"opentelemetry.proto.trace.v1.Status.StatusCode">>) -> 'status.StatusCode';
fqbin_to_enum_name(<<"opentelemetry.proto.trace.v1.SpanFlags">>) -> 'opentelemetry.proto.trace.v1.SpanFlags';
fqbin_to_enum_name(E) -> error({gpb_error, {badenum, E}}).


enum_name_to_fqbin('span.SpanKind') -> <<"opentelemetry.proto.trace.v1.Span.SpanKind">>;
enum_name_to_fqbin('status.StatusCode') -> <<"opentelemetry.proto.trace.v1.Status.StatusCode">>;
enum_name_to_fqbin('opentelemetry.proto.trace.v1.SpanFlags') -> <<"opentelemetry.proto.trace.v1.SpanFlags">>;
enum_name_to_fqbin(E) -> error({gpb_error, {badenum, E}}).


get_package_name() -> 'opentelemetry.proto.collector.trace.v1'.


%% Whether or not the message names
%% are prepended with package name or not.
uses_packages() -> true.


source_basename() -> "trace_service.proto".


%% Retrieve all proto file names, also imported ones.
%% The order is top-down. The first element is always the main
%% source file. The files are returned with extension,
%% see get_all_proto_names/0 for a version that returns
%% the basenames sans extension
get_all_source_basenames() -> ["trace_service.proto", "trace.proto", "common.proto", "resource.proto"].


%% Retrieve all proto file names, also imported ones.
%% The order is top-down. The first element is always the main
%% source file. The files are returned sans .proto extension,
%% to make it easier to use them with the various get_xyz_containment
%% functions.
get_all_proto_names() -> ["trace_service", "trace", "common", "resource"].


get_msg_containment("trace_service") -> [export_trace_partial_success, export_trace_service_request, export_trace_service_response];
get_msg_containment("trace") -> [resource_spans, scope_spans, span, event, link, status, traces_data];
get_msg_containment("common") -> [any_value, array_value, instrumentation_scope, key_value, key_value_list];
get_msg_containment("resource") -> [resource];
get_msg_containment(P) -> error({gpb_error, {badproto, P}}).


get_pkg_containment("trace_service") -> 'opentelemetry.proto.collector.trace.v1';
get_pkg_containment("trace") -> 'opentelemetry.proto.trace.v1';
get_pkg_containment("common") -> 'opentelemetry.proto.common.v1';
get_pkg_containment("resource") -> 'opentelemetry.proto.resource.v1';
get_pkg_containment(P) -> error({gpb_error, {badproto, P}}).


get_service_containment("trace_service") -> ['opentelemetry.proto.collector.trace.v1.TraceService'];
get_service_containment("trace") -> [];
get_service_containment("common") -> [];
get_service_containment("resource") -> [];
get_service_containment(P) -> error({gpb_error, {badproto, P}}).


get_rpc_containment("trace_service") -> [{'opentelemetry.proto.collector.trace.v1.TraceService', 'Export'}];
get_rpc_containment("trace") -> [];
get_rpc_containment("common") -> [];
get_rpc_containment("resource") -> [];
get_rpc_containment(P) -> error({gpb_error, {badproto, P}}).


get_enum_containment("trace_service") -> [];
get_enum_containment("trace") -> ['span.SpanKind', 'opentelemetry.proto.trace.v1.SpanFlags', 'status.StatusCode'];
get_enum_containment("common") -> [];
get_enum_containment("resource") -> [];
get_enum_containment(P) -> error({gpb_error, {badproto, P}}).


get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.trace.v1.TracesData">>) -> "trace";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.trace.v1.Status">>) -> "trace";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.trace.v1.ScopeSpans">>) -> "trace";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.trace.v1.ResourceSpans">>) -> "trace";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess">>) -> "trace_service";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.common.v1.KeyValueList">>) -> "common";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.trace.v1.Span.Event">>) -> "trace";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest">>) -> "trace_service";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.resource.v1.Resource">>) -> "resource";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.common.v1.KeyValue">>) -> "common";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.common.v1.InstrumentationScope">>) -> "common";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.common.v1.ArrayValue">>) -> "common";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.common.v1.AnyValue">>) -> "common";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse">>) -> "trace_service";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.trace.v1.Span.Link">>) -> "trace";
get_proto_by_msg_name_as_fqbin(<<"opentelemetry.proto.trace.v1.Span">>) -> "trace";
get_proto_by_msg_name_as_fqbin(E) -> error({gpb_error, {badmsg, E}}).


get_proto_by_service_name_as_fqbin(<<"opentelemetry.proto.collector.trace.v1.TraceService">>) -> "trace_service";
get_proto_by_service_name_as_fqbin(E) -> error({gpb_error, {badservice, E}}).


get_proto_by_enum_name_as_fqbin(<<"opentelemetry.proto.trace.v1.SpanFlags">>) -> "trace";
get_proto_by_enum_name_as_fqbin(<<"opentelemetry.proto.trace.v1.Span.SpanKind">>) -> "trace";
get_proto_by_enum_name_as_fqbin(<<"opentelemetry.proto.trace.v1.Status.StatusCode">>) -> "trace";
get_proto_by_enum_name_as_fqbin(E) -> error({gpb_error, {badenum, E}}).


get_protos_by_pkg_name_as_fqbin(<<"opentelemetry.proto.resource.v1">>) -> ["resource"];
get_protos_by_pkg_name_as_fqbin(<<"opentelemetry.proto.common.v1">>) -> ["common"];
get_protos_by_pkg_name_as_fqbin(<<"opentelemetry.proto.trace.v1">>) -> ["trace"];
get_protos_by_pkg_name_as_fqbin(<<"opentelemetry.proto.collector.trace.v1">>) -> ["trace_service"];
get_protos_by_pkg_name_as_fqbin(E) -> error({gpb_error, {badpkg, E}}).



gpb_version_as_string() ->
    "4.21.1".

gpb_version_as_list() ->
    [4,21,1].

gpb_version_source() ->
    "file".
