҉ google/protobuf/descriptor.protogoogle.protobuf"M FileDescriptorSet8 file ( 2$.google.protobuf.FileDescriptorProtoRfile" FileDescriptorProto name ( Rname package ( Rpackage dependency ( R dependency+ public_dependency (RpublicDependency' weak_dependency (RweakDependencyC message_type ( 2 .google.protobuf.DescriptorProtoR messageTypeA enum_type ( 2$.google.protobuf.EnumDescriptorProtoRenumTypeA service ( 2'.google.protobuf.ServiceDescriptorProtoRserviceC extension ( 2%.google.protobuf.FieldDescriptorProtoR extension6 options ( 2.google.protobuf.FileOptionsRoptionsI source_code_info ( 2.google.protobuf.SourceCodeInfoRsourceCodeInfo syntax ( Rsyntax" DescriptorProto name ( Rname; field ( 2%.google.protobuf.FieldDescriptorProtoRfieldC extension ( 2%.google.protobuf.FieldDescriptorProtoR extensionA nested_type ( 2 .google.protobuf.DescriptorProtoR nestedTypeA enum_type ( 2$.google.protobuf.EnumDescriptorProtoRenumTypeX extension_range ( 2/.google.protobuf.DescriptorProto.ExtensionRangeRextensionRangeD oneof_decl ( 2%.google.protobuf.OneofDescriptorProtoR oneofDecl9 options ( 2.google.protobuf.MessageOptionsRoptionsU reserved_range ( 2..google.protobuf.DescriptorProto.ReservedRangeR reservedRange# reserved_name ( R reservedNamez ExtensionRange start (Rstart end (Rend@ options ( 2&.google.protobuf.ExtensionRangeOptionsRoptions7 ReservedRange start (Rstart end (Rend"| ExtensionRangeOptionsX uninterpreted_option ( 2$.google.protobuf.UninterpretedOptionRuninterpretedOption* " FieldDescriptorProto name ( Rname number (RnumberA label (2+.google.protobuf.FieldDescriptorProto.LabelRlabel> type (2*.google.protobuf.FieldDescriptorProto.TypeRtype type_name ( RtypeName extendee ( Rextendee# default_value ( R defaultValue oneof_index (R oneofIndex json_name ( RjsonName7 options ( 2.google.protobuf.FieldOptionsRoptions' proto3_optional (Rproto3Optional" Type TYPE_DOUBLE TYPE_FLOAT TYPE_INT64 TYPE_UINT64 TYPE_INT32 TYPE_FIXED64 TYPE_FIXED32 TYPE_BOOL TYPE_STRING  TYPE_GROUP  TYPE_MESSAGE  TYPE_BYTES  TYPE_UINT32  TYPE_ENUM TYPE_SFIXED32 TYPE_SFIXED64 TYPE_SINT32 TYPE_SINT64"C Label LABEL_OPTIONAL LABEL_REQUIRED LABEL_REPEATED"c OneofDescriptorProto name ( Rname7 options ( 2.google.protobuf.OneofOptionsRoptions" EnumDescriptorProto name ( Rname? value ( 2).google.protobuf.EnumValueDescriptorProtoRvalue6 options ( 2.google.protobuf.EnumOptionsRoptions] reserved_range ( 26.google.protobuf.EnumDescriptorProto.EnumReservedRangeR reservedRange# reserved_name ( R reservedName; EnumReservedRange start (Rstart end (Rend" EnumValueDescriptorProto name ( Rname number (Rnumber; options ( 2!.google.protobuf.EnumValueOptionsRoptions" ServiceDescriptorProto name ( Rname> method ( 2&.google.protobuf.MethodDescriptorProtoRmethod9 options ( 2.google.protobuf.ServiceOptionsRoptions" MethodDescriptorProto name ( Rname input_type ( R inputType output_type ( R outputType8 options ( 2.google.protobuf.MethodOptionsRoptions0 client_streaming (:falseRclientStreaming0 server_streaming (:falseRserverStreaming" FileOptions! java_package ( R javaPackage0 java_outer_classname ( RjavaOuterClassname5 java_multiple_files (:falseRjavaMultipleFilesD java_generate_equals_and_hash (BRjavaGenerateEqualsAndHash: java_string_check_utf8 (:falseRjavaStringCheckUtf8S optimize_for (2).google.protobuf.FileOptions.OptimizeMode:SPEEDR optimizeFor go_package ( R goPackage5 cc_generic_services (:falseRccGenericServices9 java_generic_services (:falseRjavaGenericServices5 py_generic_services (:falseRpyGenericServices7 php_generic_services* (:falseRphpGenericServices% deprecated (:falseR deprecated. cc_enable_arenas (:trueRccEnableArenas* objc_class_prefix$ ( RobjcClassPrefix) csharp_namespace% ( RcsharpNamespace! swift_prefix' ( R swiftPrefix( php_class_prefix( ( RphpClassPrefix# php_namespace) ( R phpNamespace4 php_metadata_namespace, ( RphpMetadataNamespace! ruby_package- ( R rubyPackageX uninterpreted_option ( 2$.google.protobuf.UninterpretedOptionRuninterpretedOption": OptimizeMode SPEED CODE_SIZE LITE_RUNTIME* J&'" MessageOptions< message_set_wire_format (:falseRmessageSetWireFormatL no_standard_descriptor_accessor (:falseRnoStandardDescriptorAccessor% deprecated (:falseR deprecated map_entry (RmapEntryX uninterpreted_option ( 2$.google.protobuf.UninterpretedOptionRuninterpretedOption* JJJJ J  " FieldOptionsA ctype (2#.google.protobuf.FieldOptions.CType:STRINGRctype packed (RpackedG jstype (2$.google.protobuf.FieldOptions.JSType: JS_NORMALRjstype lazy (:falseRlazy. unverified_lazy (:falseRunverifiedLazy% deprecated (:falseR deprecated weak (:falseRweakX uninterpreted_option ( 2$.google.protobuf.UninterpretedOptionRuninterpretedOption"/ CType STRING CORD STRING_PIECE"5 JSType JS_NORMAL JS_STRING JS_NUMBER* J"s OneofOptionsX uninterpreted_option ( 2$.google.protobuf.UninterpretedOptionRuninterpretedOption* " EnumOptions allow_alias (R allowAlias% deprecated (:falseR deprecatedX uninterpreted_option ( 2$.google.protobuf.UninterpretedOptionRuninterpretedOption* J" EnumValueOptions% deprecated (:falseR deprecatedX uninterpreted_option ( 2$.google.protobuf.UninterpretedOptionRuninterpretedOption* " ServiceOptions% deprecated! (:falseR deprecatedX uninterpreted_option ( 2$.google.protobuf.UninterpretedOptionRuninterpretedOption* " MethodOptions% deprecated! (:falseR deprecatedq idempotency_level" (2/.google.protobuf.MethodOptions.IdempotencyLevel:IDEMPOTENCY_UNKNOWNRidempotencyLevelX uninterpreted_option ( 2$.google.protobuf.UninterpretedOptionRuninterpretedOption"P IdempotencyLevel IDEMPOTENCY_UNKNOWN NO_SIDE_EFFECTS IDEMPOTENT* " UninterpretedOptionA name ( 2-.google.protobuf.UninterpretedOption.NamePartRname) identifier_value ( RidentifierValue, positive_int_value (RpositiveIntValue, negative_int_value (RnegativeIntValue! double_value (R doubleValue! string_value ( R stringValue' aggregate_value ( RaggregateValueJ NamePart name_part ( RnamePart! is_extension (R isExtension" SourceCodeInfoD location ( 2(.google.protobuf.SourceCodeInfo.LocationRlocation Location path (BRpath span (BRspan) leading_comments ( RleadingComments+ trailing_comments ( RtrailingComments: leading_detached_comments ( RleadingDetachedComments" GeneratedCodeInfoM annotation ( 2-.google.protobuf.GeneratedCodeInfo.AnnotationR annotationm Annotation path (BRpath source_file ( R sourceFile begin (Rbegin end (RendB~ com.google.protobufBDescriptorProtosHZ-google.golang.org/protobuf/types/descriptorpbGPBGoogle.Protobuf.ReflectionJ '   '2 Protocol Buffers - Google's data interchange format Copyright 2008 Google Inc. All rights reserved. https://developers.google.com/protocol-buffers/ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2 Author: kenton@google.com (Kenton Varda) Based on original Protocol Buffers design by Sanjay Ghemawat, Jeff Dean, and others. The messages in this file describe the definitions found in .proto files. A valid .proto file can be translated directly to a FileDescriptorProto without any other information (e.g. without reading its imports).  )  +D  +D  ,, ,,  -1 -1  .7 %.7  /! $/!  0 0  4   4t descriptor.proto must be optimized for speed because reflection-based algorithms don't work during bootstrapping. j 8:^ The protocol compiler can output a FileDescriptorSet containing the .proto files it parses. 8 9( 9 9  9# 9&' / =Z# Describes a complete .proto file. = 9 >", file name, relative to root of source tree > >  > > * ?" e.g. "foo", "foo.bar", etc. ? ?  ? ? 4 B!' Names of files imported by this file. B B  B B Q D(D Indexes of the public imported files in the dependency list above. D D  D" D%' z G&m Indexes of the weak imported files in the dependency list. For Google-internal migration only. Do not use. G G  G G#% 6 J,) All top-level definitions in this file. J J  J' J*+ K- K K  K( K+, L. L L ! L") L,- M. M M  M ) M,-  O#  O  O   O  O!"   U/ This field contains optional information about the original source code. You may safely remove this entire field without harming runtime functionality of the descriptors -- the information is needed only by development tools.  U  U   U*  U-. ]  YP The syntax of the proto file. The supported values are "proto2" and "proto3".  Y  Y   Y  Y ' ]} Describes a message type. ] ^ ^ ^  ^ ^ `* ` `  ` % `() a. a a  a ) a,- c+ c c  c& c)* d- d d  d( d+, fk f   g" Inclusive.  g  g   g  g  h" Exclusive.  h  h   h  h j/  j  j "  j#*  j-. l. l l  l) l,- n/ n n  n * n-. p& p p  p! p$%  ux Range of reserved tag numbers. Reserved tag numbers may not be used by fields or extension ranges in the same message. Reserved ranges may not overlap. u   v" Inclusive.  v  v   v  v  w" Exclusive.  w  w   w  w y, y y  y' y*+   |%u Reserved field names, which may not be used by fields in the same message. A given name may only be reserved once.  |  |   |  |"$   O :A The parser stores options it doesn't recognize here. See above.    3 69 Z M Clients can define custom options in extensions of this message. See above.      3 % Describes a field within a message.     S C 0 is reserved for errors. Order is weird for historical reasons.           w g Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if negative values are likely.           w g Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if negative values are likely.                                Tag-delimited aggregate. Group type is deprecated and not supported in proto3. However, Proto3 implementations should still be able to parse the group wire format and treat group fields as unknown fields.       -  " Length-delimited aggregate.       #   New in version 2.                                     ' " Uses ZigZag encoding.     ' " Uses ZigZag encoding.        *  0 is reserved for errors                                     If type_name is set, this need not be set. If both this and type_name are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.         For message and enum types, this is the name of the type. If the name starts with a '.', it is fully-qualified. Otherwise, C++-like scoping rules are used to find the type (i.e. first the nested types within this message are searched, then within the parent, on up to the root namespace).      ~ p For extensions, this is the name of the type being extended. It is resolved in the same manner as type_name.       $ For numeric types, contains the original text representation of the value. For booleans, "true" or "false". For strings, contains the default text contents (not escaped in any way). For bytes, contains the C escaped value. All bytes >= 128 are escaped.     "#  !v If set, gives the index of a oneof in the containing type's oneof_decl list. This field is a member of that oneof.       ! JSON name of this field. The value is set by protocol compiler. If the user has set a "json_name" option on this field, that option's value will be used. Otherwise, it's deduced from the field's name by converting it to camelCase.       $         "#  % If true, this is a proto3 "optional". When a proto3 field is optional, it tracks presence regardless of field type. When proto3_optional is true, this field must be belong to a oneof to signal to old proto3 clients that presence is tracked for this field. This oneof is known as a "synthetic" oneof, and this field must be its sole member (each proto3 optional field gets its own synthetic oneof). Synthetic oneofs exist in the descriptor only, and do not generate any API. Synthetic oneofs must be ordered after all "real" oneofs. For message fields, proto3_optional doesn't create any semantic change, since non-repeated message fields always track presence. However it still indicates the semantic detail of whether the user wrote "optional" or not. This can be useful for round-tripping the .proto file. For consistency we give message fields a synthetic oneof also, even though it is not required to track presence. This is especially important because the parser can't tell if a field is a message or an enum, so it must always create a synthetic oneof. Proto2 optional fields do not set this flag, because they already indicate optional with `LABEL_OPTIONAL`.         "$ "  Describes a oneof.        $     "# '  Describes an enum type.        .   # $) ,- #     !"   Range of reserved numeric values. Reserved values may not be used by entries in the same enum. Reserved ranges may not overlap. Note that this is distinct from DescriptorProto.ReservedRange in that it is inclusive such that it can appropriately represent the entire int32 domain.    " Inclusive.           " Inclusive.           0 Range of reserved numeric values. Reserved numeric values may not be used by enum values in the same enum declaration. Reserved ranges may not overlap.    + ./ l $^ Reserved enum value names, which may not be reused. A given name may only be reserved once.     "# 1 # Describes a value within an enum.              (    # &' $  Describes a service.        ,   !' *+ &    ! $% 0  " Describes a method of a service.                ! Input and output type names. These are resolved in the same way as FieldDescriptorProto.type_name, but must refer to a message type.           "          !  %         #$ E  77 Identifies if client streams multiple client messages         #$  %6  05 E  77 Identifies if server streams multiple server messages         #$  %6  05   2N =================================================================== Options 2 Each of the definitions above may have "options" attached. These are just annotations which may cause code to be generated slightly differently or may contain hints for code that manipulates protocol messages. Clients may define custom options as extensions of the *Options messages. These extensions may not yet be known at parsing time, so the parser cannot store the values in them. Instead it stores them in a field in the *Options message called uninterpreted_option. This field must have the same name across all *Options messages. We then use this field to populate the extensions when we build a descriptor, at which point all protos have been parsed and so all extensions are known. Extension numbers for custom options may be chosen as follows: * For options which will only be used within a single application or organization, or for experimental options, use field numbers 50000 through 99999. It is up to you to ensure that you do not use the same number for multiple options. * For options which will be published and used publicly by multiple independent entities, e-mail protobuf-global-extension-registry@google.com to reserve extension numbers. Simply provide your project name (e.g. Objective-C plugin) and your project website (if available) -- there's no need to explain how you intend to use them. Usually you only need one extension number. You can declare multiple options with only one extension number by putting them in a sub-message. See the Custom Options section of the docs for examples: https://developers.google.com/protocol-buffers/docs/proto#options If this turns out to be popular, a web service will be set up to automatically assign option numbers.     # Sets the Java package where classes generated from this .proto will be placed. By default, the proto package is used, but this is often inappropriate because proto packages do not normally start with backwards domain names.         !"   + Controls the name of the wrapper Java class generated for the .proto file. That class will always contain the .proto file's getDescriptor() method as well as any top-level extensions defined in the .proto file. If java_multiple_files is disabled, then all the other classes from the .proto file will be nested inside the single wrapper outer class.       &  )*   ; If enabled, then the Java code generator will generate a separate .java file for each top-level message, enum, and service defined in the .proto file. Thus, these types will *not* be nested inside the wrapper class named by java_outer_classname. However, the wrapper class will still be generated to contain the file's getDescriptor() method as well as any top-level extensions defined in the file.       #  &(  ):  49 )  E This option does nothing.       -  02  3D   4C   > If set true, then the Java2 code generator will generate code that throws an exception whenever an attempt is made to assign a non-UTF-8 byte sequence to a string field. Message reflection will do the same. However, an extension field still accepts non-UTF-8 byte sequences. This option has no effect on when used with the lite runtime.       &  )+  ,=  7< L  < Generated classes can be optimized for speed or code size.   D  "4 Generate complete code for parsing, serialization,       G   etc. "/ Use ReflectionOps to implement these methods.       G  "7 Generate code using MessageLite and the lite runtime.        ;       $  '(  ):  49   " Sets the Go package where structs generated from this .proto will be placed. If omitted, the Go package will be derived from the following: - The basename of the package import path, if provided. - Otherwise, the package statement in the .proto file, if present. - Otherwise, the basename of the .proto file, without extension.         !   ; Should generic services be generated in each language? "Generic" services are not specific to any particular RPC system. They are generated by the main code generators in each language (without additional plugins). Generic services were the only kind of service generation supported by early versions of google.protobuf. Generic services are now considered deprecated in favor of using plugins that generate code specific to your particular RPC system. Therefore, these default to false. Old code which depends on generic services should explicitly set them to true.       #  &(  ):  49  =       %  (*  +<  6;   ;          #   &(   ):   49   <          $   ')   *;   5:    2 Is this file deprecated? Depending on the target platform, this can emit Deprecated annotations for everything in the file, or it will be completely ignored; in the very least, this is a formalization for deprecating files.                 1   +0    7q Enables the use of arenas for the proto messages in this file. This applies only to generated classes for C++.             #%   &6   15    ) Sets the objective c class prefix which is prepended to all objective c generated classes from this .proto. There is no default.          #   &( I  (; Namespace for generated classes; defaults to the package.       "  %'   $ By default Swift generators will take the proto package and CamelCase it replacing '.' with underscore and use that to prefix the types/symbols defined. When this options is provided, they will use this value instead to prefix the types/symbols defined.         !# ~  (p Sets the php class prefix which is prepended to all php generated classes from this .proto. Default is empty.       "  %'   % Use this option to change the namespace of php generated classes. Default is empty. When this option is empty, the package name will be used for determining the namespace.         "$   . Use this option to change the namespace of php generated metadata classes. Default is empty. When this option is empty, the proto file name will be used for determining the namespace.       (  +-   $ Use this option to change the package of ruby generated classes. Default is empty. When this option is not set, the package name will be used for determining the ruby package.         !# |  :n The parser stores options it doesn't recognize here. See the documentation for the "Options" section above.       3  69   z Clients can define custom options in extensions of this message. See the documentation for the "Options" section above.                       > Set true to use the old proto1 MessageSet wire format for extensions. This is provided for backwards-compatibility with the MessageSet wire format. You should not use this for any other reason: It's less efficient, has fewer features, and is more complicated. The message must be defined exactly as follows: message Foo { option message_set_wire_format = true; extensions 4 to max; } Note that the message cannot have any defined fields; MessageSets only have extensions. All extensions of your type must be singular messages; e.g. they cannot be int32s, enums, or repeated messages. Because this is an option, the above two restrictions are not enforced by the protocol compiler.       '  *+  ,=  7<   F Disables the generation of the standard "descriptor()" accessor, which can conflict with a field of the same name. This is meant to make migration from proto1 easier; new code should avoid fields named "descriptor".       /  23  4E  ?D   1 Is this message deprecated? Depending on the target platform, this can emit Deprecated annotations for the message, or it will be completely ignored; in the very least, this is a formalization for deprecating messages.           0  */                        Whether the message is an automatically generated map entry type for the maps field. For maps fields: map map_field = 1; The parsed descriptor looks like: message MapFieldEntry { option map_entry = true; optional KeyType key = 1; optional ValueType value = 2; } repeated MapFieldEntry map_field = 1; Implementations may choose not to generate the map_entry=true message, but use a native map in the target language to hold the keys and values. The reflection APIs in such implementations still need to work as if the field is a repeated message field. NOTE: Do not set the option in .proto files. Always use the maps syntax instead. The option should only be implicitly set by the proto compiler parser.          $   " javalite_serializable          " javanano_as_lite       O  :A The parser stores options it doesn't recognize here. See above.       3  69 Z  M Clients can define custom options in extensions of this message. See above.               . The ctype option instructs the C++ code generator to use a different representation of the field than it normally would. See the specific options below. This option is not yet implemented in the open source release -- sorry, we'll try to include it in a future version!           -  &,         Default mode.                             The packed option can be enabled for repeated primitive fields to enable a more efficient representation on the wire. Rather than repeatedly writing the tag and type for each element, the entire array is encoded as a single length-delimited blob. In proto3, only explicit setting it to false will avoid using packed encoding.            3 The jstype option determines the JavaScript type used for values of the field. The option is permitted only for 64 bit integral and fixed types (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING is represented as JavaScript string, which avoids loss of precision that can happen when a large value is converted to a floating point JavaScript. Specifying JS_NUMBER for the jstype causes the generated JavaScript code to use the JavaScript "number" type. The behavior of the default option JS_NORMAL is implementation dependent. This option is an enum to permit additional types to be added, e.g. goog.math.Integer.           2  (1      '   Use the default type.       )   Use JavaScript strings.       )   Use JavaScript numbers.         + Should this field be parsed lazily? Lazy applies only to message-type fields. It means that when the outer message is initially parsed, the inner message's contents will not be parsed but instead stored in encoded form. The inner message will actually be parsed when it is first accessed. This is only a hint. Implementations are free to choose whether to use eager or lazy parsing regardless of the value of this option. However, setting this option true suggests that the protocol author believes that using lazy parsing on this field is worth the additional bookkeeping overhead typically needed to implement it. This option does not affect the public interface of any generated code; all method signatures remain the same. Furthermore, thread-safety of the interface is not affected by this option; const methods remain safe to call from multiple threads concurrently, while non-const methods continue to require exclusive access. Note that implementations may choose not to check required fields within a lazy sub-message. That is, calling IsInitialized() on the outer message may return true even if the inner message has missing required fields. This is necessary because otherwise the inner message would have to be parsed in order to perform the check, defeating the purpose of lazy parsing. An implementation which chooses not to check required fields must be consistent about it. That is, for any particular sub-message, the implementation must either *always* check its required fields, or *never* check its required fields, regardless of whether or not the message has been parsed. As of 2021, lazy does no correctness checks on the byte stream during parsing. This may lead to crashes if and when an invalid byte stream is finally parsed upon access. NODO(b/211906113): Enable validation on lazy fields.           *  $)   7 unverified_lazy does no correctness checks on the byte stream. This should only be used where lazy with verification is prohibitive for performance reasons.         "$  %6  05   1 Is this field deprecated? Depending on the target platform, this can emit Deprecated annotations for accessors, or it will be completely ignored; in the very least, this is a formalization for deprecating fields.           0  */ ?  ,1 For Google-internal migration only. Do not use.           +  %* O  :A The parser stores options it doesn't recognize here. See above.       3  69 Z  M Clients can define custom options in extensions of this message. See above.            " removed jtype           O  :A The parser stores options it doesn't recognize here. See above.       3  69 Z  M Clients can define custom options in extensions of this message. See above.           `  R Set this option to true to allow mapping different tag names to the same value.       1 Is this enum deprecated? Depending on the target platform, this can emit Deprecated annotations for the enum, or it will be completely ignored; in the very least, this is a formalization for deprecating enums.      0 */    " javanano_as_lite       O :A The parser stores options it doesn't recognize here. See above.    3 69 Z M Clients can define custom options in extensions of this message. See above.         1 Is this enum value deprecated? Depending on the target platform, this can emit Deprecated annotations for the enum value, or it will be completely ignored; in the very least, this is a formalization for deprecating enum values.      0 */ O :A The parser stores options it doesn't recognize here. See above.    3 69 Z M Clients can define custom options in extensions of this message. See above.         2 Is this service deprecated? Depending on the target platform, this can emit Deprecated annotations for the service, or it will be completely ignored; in the very least, this is a formalization for deprecating services. 2 Note: Field numbers 1 through 32 are reserved for Google's internal RPC framework. We apologize for hoarding these numbers to ourselves, but we were already using them long before we decided to release Protocol Buffers.       1 +0 O :A The parser stores options it doesn't recognize here. See above.    3 69 Z M Clients can define custom options in extensions of this message. See above.         2 Is this method deprecated? Depending on the target platform, this can emit Deprecated annotations for the method, or it will be completely ignored; in the very least, this is a formalization for deprecating methods. 2 Note: Field numbers 1 through 32 are reserved for Google's internal RPC framework. We apologize for hoarding these numbers to ourselves, but we were already using them long before we decided to release Protocol Buffers.       1 +0   Is this method side-effect-free (or safe in HTTP parlance), or idempotent, or neither? HTTP based RPC implementation may choose GET verb for safe methods, and PUT verb for idempotent methods instead of the default POST.        $ " implies idempotent     7 "' idempotent, but may have side effects      &    - 02 % $ O :A The parser stores options it doesn't recognize here. See above.    3 69 Z M Clients can define custom options in extensions of this message. See above.        A message representing a option the parser does not recognize. This only appears in options protos created by the compiler::Parser class. DescriptorPool resolves these when building Descriptor objects. Therefore, options protos in descriptor objects (e.g. returned by Descriptor::options(), or produced by Descriptor::CopyTo()) will never have UninterpretedOptions in them.    The name of the uninterpreted option. Each string represents a segment in a dot-separated name. is_extension is true iff a segment represents an extension (denoted with parentheses in options specs in .proto files). E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents "foo.(bar.baz).moo".    "          !  #         !"        ' The value of the uninterpreted option, in whatever type the tokenizer identified it as during parsing. Exactly one of these should be set.    " %& )    $ '( (    # &' #     !" "      ! &    ! $%  j Encapsulates information about the original source file from which a FileDescriptorProto was generated. 2` =================================================================== Optional source code info   ! A Location identifies a piece of source code in a .proto file which corresponds to a particular definition. This information is intended to be useful to IDEs, code indexers, documentation generators, and similar tools. For example, say we have a file like: message Foo { optional string foo = 1; } Let's look at just the field definition: optional string foo = 1; ^ ^^ ^^ ^ ^^^ a bc de f ghi We have the following locations: span path represents [a,i) [ 4, 0, 2, 0 ] The whole field definition. [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). [c,d) [ 4, 0, 2, 0, 5 ] The type (string). [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). [g,h) [ 4, 0, 2, 0, 3 ] The number (1). Notes: - A location may refer to a repeated field itself (i.e. not to any particular index within it). This is used whenever a set of elements are logically enclosed in a single code segment. For example, an entire extend block (possibly containing multiple extension definitions) will have an outer location whose path refers to the "extensions" repeated field without an index. - Multiple locations may have the same path. This happens when a single logical declaration is spread out across multiple places. The most obvious example is the "extend" block again -- there may be multiple extend blocks in the same scope, each of which will have the same path. - A location's span is not always a subset of its parent's span. For example, the "extendee" of an extension declaration appears at the beginning of the "extend" block and is shared by all extensions within the block. - Just because a location's span is a subset of some other location's span does not mean that it is a descendant. For example, a "group" defines both a type and a field in a single declaration. Thus, the locations corresponding to the type and field and their components will overlap. - Code which tries to interpret locations should probably be designed to ignore those that it doesn't understand, as more types of locations could be recorded in the future.           , Identifies which part of the FileDescriptorProto was defined at this location. Each element is a field number or an index. They form a path from the root FileDescriptorProto to the place where the definition occurs. For example, this path: [ 4, 3, 2, 7, 1 ] refers to: file.message_type(3) // 4, 3 .field(7) // 2, 7 .name() // 1 This is because FileDescriptorProto.message_type has field number 4: repeated DescriptorProto message_type = 4; and DescriptorProto.field has field number 2: repeated FieldDescriptorProto field = 2; and FieldDescriptorProto.name has field number 1: optional string name = 1; Thus, the above path gives the location of a field name. If we removed the last element: [ 4, 3, 2, 7 ] this path refers to the whole field declaration (from the beginning of the label to the terminating semicolon).           +  *  , Always has exactly three or four elements: start line, start column, end line (optional, otherwise assumed same as start line), end column. These are packed into a single field for efficiency. Note that line and column numbers are zero-based -- typically you will want to add 1 to each before displaying to a user.           +  * ) If this SourceCodeInfo represents a complete declaration, these are any comments appearing before and after the declaration which appear to be attached to the declaration. A series of line comments appearing on consecutive lines, with no other tokens appearing on those lines, will be treated as a single comment. leading_detached_comments will keep paragraphs of comments that appear before (but not connected to) the current element. Each paragraph, separated by empty lines, will be one comment element in the repeated field. Only the comment content is provided; comment markers (e.g. //) are stripped out. For block comments, leading whitespace and an asterisk will be stripped from the beginning of each line other than the first. Newlines are included in the output. Examples: optional int32 foo = 1; // Comment attached to foo. // Comment attached to bar. optional int32 bar = 2; optional string baz = 3; // Comment attached to baz. // Another line attached to baz. // Comment attached to moo. // // Another line attached to moo. optional double moo = 4; // Detached comment for corge. This is not leading or trailing comments // to moo or corge because there are blank lines separating it from // both. // Detached comment for corge paragraph 2. optional string corge = 5; /* Block comment attached * to corge. Leading asterisks * will be removed. */ /* Block comment attached to * grault. */ optional int32 grault = 6; // ignored detached comments.       $  '(  *       %  ()  2       -  01   Describes the relationship between generated code and its original source file. A GeneratedCodeInfo message is associated with only one generated source file, but may contain references to different source .proto files.  x %j An Annotation connects some span of text in generated code to an element of its generating .proto file.     #$      , Identifies the element in the original source .proto file. This field is formatted the same as SourceCodeInfo.Location.path.           +  * O $? Identifies the filesystem path to the original source .proto.         "# w g Identifies the starting offset in bytes in the generated code that relates to the identified object.            Identifies the ending offset in bytes in the generated code that relates to the identified offset. The end offset should be one past the last relevant byte (so the length of the text = end - begin).           sf/substreams/options.proto sf.substreams google/protobuf/descriptor.proto"\ FieldOptions$ load_from_file (R loadFromFile& zip_from_folder (R zipFromFolder:X options.google.protobuf.FieldOptions ( 2.sf.substreams.FieldOptionsRoptionsBCZAgithub.com/streamingfast/substreams/pb/sf/substreams;pbsubstreamsJ        X  X *      this option informs the `substreams pack` command that it should treat the corresponding manifest value as a path to a file, putting its content as bytes in this field. must be applied to a `bytes` or `string` field          this option informs the `substreams pack` command that it should treat the corresponding manifest value as a path to a folder, zipping its content and putting the zip content as bytes in this field. must be applied to a `bytes` field        ' #     "&bproto3 2 sf/substreams/v1/modules.protosf.substreams.v1"s Modules2 modules ( 2.sf.substreams.v1.ModuleRmodules4 binaries ( 2.sf.substreams.v1.BinaryRbinaries"6 Binary type ( Rtype content ( Rcontent" Module name ( Rname= kind_map ( 2 .sf.substreams.v1.Module.KindMapHRkindMapC kind_store ( 2".sf.substreams.v1.Module.KindStoreHR kindStoreS kind_block_index ( 2'.sf.substreams.v1.Module.KindBlockIndexHRkindBlockIndex! binary_index ( R binaryIndex+ binary_entrypoint ( RbinaryEntrypoint6 inputs ( 2.sf.substreams.v1.Module.InputRinputs7 output ( 2.sf.substreams.v1.Module.OutputRoutput# initial_block (R initialBlockG block_filter ( 2$.sf.substreams.v1.Module.BlockFilterR blockFilter BlockFilter module ( Rmodule# query_string ( HR queryStringV query_from_params ( 2(.sf.substreams.v1.Module.QueryFromParamsHRqueryFromParamsB query QueryFromParams* KindMap output_type ( R outputType KindStoreT update_policy (2/.sf.substreams.v1.Module.KindStore.UpdatePolicyR updatePolicy value_type ( R valueType" UpdatePolicy UPDATE_POLICY_UNSET UPDATE_POLICY_SET# UPDATE_POLICY_SET_IF_NOT_EXISTS UPDATE_POLICY_ADD UPDATE_POLICY_MIN UPDATE_POLICY_MAX UPDATE_POLICY_APPEND UPDATE_POLICY_SET_SUM1 KindBlockIndex output_type ( R outputType Input? source ( 2%.sf.substreams.v1.Module.Input.SourceHRsource6 map ( 2".sf.substreams.v1.Module.Input.MapHRmap< store ( 2$.sf.substreams.v1.Module.Input.StoreHRstore? params ( 2%.sf.substreams.v1.Module.Input.ParamsHRparams Source type ( Rtype& Map module_name ( R moduleName Store module_name ( R moduleName= mode (2).sf.substreams.v1.Module.Input.Store.ModeRmode"& Mode UNSET GET DELTAS Params value ( RvalueB input Output type ( RtypeB kindBFZDgithub.com/streamingfast/substreams/pb/sf/substreams/v1;pbsubstreamsJ" u       [  [                F  : Binary represents some code compiled to its binary form.              u                 )  # &(                            !  !  !  ! #* #  $  $  $   $  %)  %  &  &  &   & : ',"+ QueryFromStore query_from_store_keys = 3;  '  ''  '*+ , ,  .0 .  /  /  /   / 2O 2   ;# The `update_policy` determines the functions available to mutate the store (like `set()`, `set_if_not_exists()` or `sum()`, etc..) in order to ensure that parallel operations are possible and deterministic Say a store cumulates keys from block 0 to 1M, and a second store cumulates keys from block 1M to 2M. When we want to use this store as a dependency for a downstream module, we will merge the two stores according to this policy.  ;  ;  ;!" <  <  <   <  >N  >   ?  ?  ? W AF Provides a store where you can `set()` keys, and the latest key wins  A  A d C*S Provides a store where you can `set_if_not_exists()` keys, and the first key wins  C%  C() o E^ Provides a store where you can `add_*()` keys, where two stores merge by summing its values.  E  E v Ge Provides a store where you can `min_*()` keys, where two stores merge by leaving the minimum value.  G  G v Ie Provides a store where you can `max_*()` keys, where two stores merge by leaving the maximum value.  I  I ~ Km Provides a store where you can `append()` keys, where two stores merge by concatenating the bytes in order.  K  K L M ; Provides a store with both `set()` and `sum()` functions.  M  M QS Q  R  R  R   R Up U   V[  V  W  W  W   W X  X  X  X Y  Y  Y   Y Z  Z  Z   Z  ]_  ]  2 ^"! ex: "sf.ethereum.type.v1.Block"  ^  ^   ^  `b  `  ' a" ex: "block_to_pairs"  a  a   a  cl  c   d  d  d   d  e  e  e   e  gk  g   h  h  h  i  i  i  j  j  j  mo  m   n  n  n   n rt r  s  s  s   sbproto3 , google/protobuf/any.protogoogle.protobuf"6 Any type_url ( RtypeUrl value ( RvalueBv com.google.protobufBAnyProtoPZ,google.golang.org/protobuf/types/known/anypbGPBGoogle.Protobuf.WellKnownTypesJ*   2 Protocol Buffers - Google's data interchange format Copyright 2008 Google Inc. All rights reserved. https://developers.google.com/protocol-buffers/ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.     "; %";  #C  #C  $, $,  %) %)  &"  &"  '! $'!  | `Any` contains an arbitrary serialized protocol buffer message along with a URL that describes the type of the serialized message. Protobuf library provides support to pack/unpack Any values in the form of utility functions or additional generated methods of the Any type. Example 1: Pack and unpack a message in C++. Foo foo = ...; Any any; any.PackFrom(foo); ... if (any.UnpackTo(&foo)) { ... } Example 2: Pack and unpack a message in Java. Foo foo = ...; Any any = Any.pack(foo); ... if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() any.Pack(foo) ... if any.Is(Foo.DESCRIPTOR): any.Unpack(foo) ... Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) if err != nil { ... } ... foo := &pb.Foo{} if err := any.UnmarshalTo(foo); err != nil { ... } The pack methods provided by protobuf library will by default use 'type.googleapis.com/full.type.name' as the type URL and the unpack methods only use the fully qualified type name after the last '/' in the type URL, for example "foo.bar.com/x/y.z" will yield type name "y.z". JSON The JSON representation of an `Any` value uses the regular representation of the deserialized, embedded message, with an additional field `@type` which contains the type URL. Example: package google.profile; message Person { string first_name = 1; string last_name = 2; } { "@type": "type.googleapis.com/google.profile.Person", "firstName": , "lastName": } If the embedded message type is well-known and has a custom JSON representation, that representation will be embedded adding a field `value` which holds the custom JSON in addition to the `@type` field. Example (for message [google.protobuf.Duration][]): { "@type": "type.googleapis.com/google.protobuf.Duration", "value": "1.212s" } |  A URL/resource name that uniquely identifies the type of the serialized protocol buffer message. This string must contain at least one "/" character. The last segment of the URL's path must represent the fully qualified name of the type (as in `path/google.protobuf.Duration`). The name should be in a canonical form (e.g., leading "." is not accepted). In practice, teams usually precompile into the binary all types that they expect it to use in the context of Any. However, for URLs which use the scheme `http`, `https`, or no scheme, one can optionally set up a type server that maps type URLs to message definitions as follows: * If no scheme is provided, `https` is assumed. * An HTTP GET on the URL must yield a [google.protobuf.Type][] value in binary format, or produce an error. * Applications are allowed to cache lookup results based on the URL, or have them precompiled into a binary to avoid any lookup. Therefore, binary compatibility needs to be preserved on changes to types. (Use versioned type names to manage breaking changes.) Note: this functionality is not currently available in the official protobuf release, and it is not used for type URLs beginning with type.googleapis.com. Schemes other than `http`, `https` (or the empty scheme) might be used with implementation specific semantics.     W I Must be a valid serialized protocol buffer of the above specified type.   bproto3  sf/substreams/v1/package.protosf.substreams.v1 google/protobuf/descriptor.protogoogle/protobuf/any.protosf/substreams/v1/modules.proto" PackageE proto_files ( 2$.google.protobuf.FileDescriptorProtoR protoFiles version (Rversion3 modules ( 2.sf.substreams.v1.ModulesRmodulesA module_meta ( 2 .sf.substreams.v1.ModuleMetadataR moduleMetaD package_meta ( 2!.sf.substreams.v1.PackageMetadataR packageMeta network ( Rnetwork5 sink_config ( 2.google.protobuf.AnyR sinkConfig sink_module ( R sinkModule image ( RimageC networks ( 2'.sf.substreams.v1.Package.NetworksEntryRnetworksP block_filters ( 2+.sf.substreams.v1.Package.BlockFiltersEntryR blockFilters\ NetworksEntry key ( Rkey5 value ( 2.sf.substreams.v1.NetworkParamsRvalue:8? BlockFiltersEntry key ( Rkey value ( Rvalue:8J" NetworkParamsX initialBlocks ( 22.sf.substreams.v1.NetworkParams.InitialBlocksEntryR initialBlocksC params ( 2+.sf.substreams.v1.NetworkParams.ParamsEntryRparams@ InitialBlocksEntry key ( Rkey value (Rvalue:89 ParamsEntry key ( Rkey value ( Rvalue:8"c PackageMetadata version ( Rversion url ( Rurl name ( Rname doc ( Rdoc"G ModuleMetadata# package_index (R packageIndex doc ( RdocBFZDgithub.com/streamingfast/substreams/pb/sf/substreams/v1;pbsubstreamsJ 2       [  [ * # (       ?t Needs to be one so this file can be used _directly_ as a buf `Image` andor a ProtoSet for grpcurl and other tools    .  /:  => @  "4 Reserved for future: in case protosets adds fields             '  " %& *    % () ,    ' *+ D 7 Source network for Substreams to fetch its data from.     '  ! $&      P C image is the bytes to a JPEG, WebP or PNG file. Max size is 2 MiB     ,    &  )+  *    $  ') "% " #( # ## #&' $! $ $ $ ', ' ( ( (  ( ) ) ) ) * * * * + + + + .2 . J 0= Corresponds to the index in `Package.metadata.package_meta` 0 0  0 1 1 1 1bproto3 1 google/protobuf/timestamp.protogoogle.protobuf"; Timestamp seconds (Rseconds nanos (RnanosB com.google.protobufBTimestampProtoPZ2google.golang.org/protobuf/types/known/timestamppbGPBGoogle.Protobuf.WellKnownTypesJ/   2 Protocol Buffers - Google's data interchange format Copyright 2008 Google Inc. All rights reserved. https://developers.google.com/protocol-buffers/ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.     "; %";  # #  $I  $I  %, %,  &/ &/  '"  '"  (! $(!   A Timestamp represents a point in time independent of any time zone or local calendar, encoded as a count of seconds and fractions of seconds at nanosecond resolution. The count is relative to an epoch at UTC midnight on January 1, 1970, in the proleptic Gregorian calendar which extends the Gregorian calendar backwards to year one. All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap second table is needed for interpretation, using a [24-hour linear smear](https://developers.google.com/time/smear). The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By restricting to that range, we ensure that we can convert to and from [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. # Examples Example 1: Compute Timestamp from POSIX `time()`. Timestamp timestamp; timestamp.set_seconds(time(NULL)); timestamp.set_nanos(0); Example 2: Compute Timestamp from POSIX `gettimeofday()`. struct timeval tv; gettimeofday(&tv, NULL); Timestamp timestamp; timestamp.set_seconds(tv.tv_sec); timestamp.set_nanos(tv.tv_usec * 1000); Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. FILETIME ft; GetSystemTimeAsFileTime(&ft); UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. Timestamp timestamp; timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. long millis = System.currentTimeMillis(); Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) .setNanos((int) ((millis % 1000) * 1000000)).build(); Example 5: Compute Timestamp from Java `Instant.now()`. Instant now = Instant.now(); Timestamp timestamp = Timestamp.newBuilder().setSeconds(now.getEpochSecond()) .setNanos(now.getNano()).build(); Example 6: Compute Timestamp from current time in Python. timestamp = Timestamp() timestamp.GetCurrentTime() # JSON Mapping In JSON format, the Timestamp type is encoded as a string in the [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" where {year} is always expressed using four digits while {month}, {day}, {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone is required. A proto3 JSON serializer should always use UTC (as indicated by "Z") when printing the Timestamp type and a proto3 JSON parser should be able to accept both UTC and other timezones (as indicated by an offset). For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past 01:30 UTC on January 15, 2017. In JavaScript, one can convert a Date object to this format using the standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) method. In Python, a standard `datetime.datetime` object can be converted to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D ) to obtain a formatter capable of generating timestamps in this format.    Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.      Non-negative fractions of a second at nanosecond resolution. Negative second values with fractions must still have non-negative nanos values that count forward in time. Must be from 0 to 999,999,999 inclusive.   bproto3  sf/substreams/v1/clock.protosf.substreams.v1google/protobuf/timestamp.proto"i Clock id ( Rid number (Rnumber8 timestamp ( 2.google.protobuf.TimestampR timestamp"2 BlockRef id ( Rid number (RnumberBFZDgithub.com/streamingfast/substreams/pb/sf/substreams/v1;pbsubstreamsJ        [  [ ) @  4 Clock is a pointer to a block with added timestamp                  *    %  () S G BlockRef is a pointer to a block to which we don't know the timestamp          bproto3  !sf/substreams/index/v1/keys.protosf.substreams.index.v1" Keys keys ( RkeysBLZJgithub.com/streamingfast/substreams/pb/sf/substreams/index/v1;pbsubstreamsJ        a  a        bproto3 r "sf/substreams/rpc/v2/service.protosf.substreams.rpc.v2google/protobuf/any.protosf/substreams/v1/modules.protosf/substreams/v1/clock.proto" Request& start_block_num (R startBlockNum! start_cursor ( R startCursor$ stop_block_num (R stopBlockNum* final_blocks_only (RfinalBlocksOnly' production_mode (RproductionMode# output_module ( R outputModule3 modules ( 2.sf.substreams.v1.ModulesRmodulesU (debug_initial_store_snapshot_for_modules ( R#debugInitialStoreSnapshotForModules" Response= session ( 2!.sf.substreams.rpc.v2.SessionInitHRsessionC progress ( 2%.sf.substreams.rpc.v2.ModulesProgressHRprogressS block_scoped_data ( 2%.sf.substreams.rpc.v2.BlockScopedDataHRblockScopedDataS block_undo_signal ( 2%.sf.substreams.rpc.v2.BlockUndoSignalHRblockUndoSignal> fatal_error ( 2.sf.substreams.rpc.v2.ErrorHR fatalError[ debug_snapshot_data ( 2).sf.substreams.rpc.v2.InitialSnapshotDataHRdebugSnapshotDatag debug_snapshot_complete ( 2-.sf.substreams.rpc.v2.InitialSnapshotCompleteHRdebugSnapshotCompleteB message" BlockUndoSignalD last_valid_block ( 2.sf.substreams.v1.BlockRefRlastValidBlock* last_valid_cursor ( RlastValidCursor" BlockScopedData= output ( 2%.sf.substreams.rpc.v2.MapModuleOutputRoutput- clock ( 2.sf.substreams.v1.ClockRclock cursor ( Rcursor, final_block_height (RfinalBlockHeightQ debug_map_outputs ( 2%.sf.substreams.rpc.v2.MapModuleOutputRdebugMapOutputsW debug_store_outputs ( 2'.sf.substreams.rpc.v2.StoreModuleOutputRdebugStoreOutputs" SessionInit trace_id ( RtraceId0 resolved_start_block (RresolvedStartBlock0 linear_handoff_block (RlinearHandoffBlock0 max_parallel_workers (RmaxParallelWorkers"1 InitialSnapshotComplete cursor ( Rcursor" InitialSnapshotData module_name ( R moduleName8 deltas ( 2 .sf.substreams.rpc.v2.StoreDeltaRdeltas sent_keys (RsentKeys total_keys (R totalKeys" MapModuleOutput name ( Rname3 map_output ( 2.google.protobuf.AnyR mapOutputD debug_info ( 2%.sf.substreams.rpc.v2.OutputDebugInfoR debugInfo" StoreModuleOutput name ( RnameN debug_store_deltas ( 2 .sf.substreams.rpc.v2.StoreDeltaRdebugStoreDeltasD debug_info ( 2%.sf.substreams.rpc.v2.OutputDebugInfoR debugInfo"d OutputDebugInfo logs ( Rlogs% logs_truncated (R logsTruncated cached (Rcached" ModulesProgress< running_jobs ( 2.sf.substreams.rpc.v2.JobR runningJobsF modules_stats ( 2!.sf.substreams.rpc.v2.ModuleStatsR modulesStats3 stages ( 2.sf.substreams.rpc.v2.StageRstagesM processed_bytes ( 2$.sf.substreams.rpc.v2.ProcessedBytesRprocessedBytesJ"j ProcessedBytes( total_bytes_read (RtotalBytesRead. total_bytes_written (RtotalBytesWritten"r Error module ( Rmodule reason ( Rreason logs ( Rlogs% logs_truncated (R logsTruncated" Job stage ( Rstage start_block (R startBlock stop_block (R stopBlock) processed_blocks (RprocessedBlocks duration_ms (R durationMs"n Stage modules ( RmodulesK completed_ranges ( 2 .sf.substreams.rpc.v2.BlockRangeRcompletedRanges" ModuleStats name ( Rname= total_processed_block_count (RtotalProcessedBlockCount7 total_processing_time_ms (RtotalProcessingTimeMs\ external_call_metrics ( 2(.sf.substreams.rpc.v2.ExternalCallMetricRexternalCallMetrics@ total_store_operation_time_ms (RtotalStoreOperationTimeMs3 total_store_read_count (RtotalStoreReadCount5 total_store_write_count (RtotalStoreWriteCountC total_store_deleteprefix_count (RtotalStoreDeleteprefixCount( store_size_bytes (RstoreSizeBytes< total_store_merging_time_ms (RtotalStoreMergingTimeMs6 store_currently_merging (RstoreCurrentlyMerging8 highest_contiguous_block (RhighestContiguousBlock"W ExternalCallMetric name ( Rname count (Rcount time_ms (RtimeMs" StoreDeltaH operation (2*.sf.substreams.rpc.v2.StoreDelta.OperationR operation ordinal (Rordinal key ( Rkey old_value ( RoldValue new_value ( RnewValue": Operation UNSET CREATE UPDATE DELETE"J BlockRange start_block (R startBlock end_block (RendBlock2S StreamI Blocks.sf.substreams.rpc.v2.Request.sf.substreams.rpc.v2.Response0BMZKgithub.com/streamingfast/substreams/pb/sf/substreams/rpc/v2;pbsubstreamsrpcJN        b  b # ( &      0      %  &.  1                   With final_block_only, you only receive blocks that are irreversible: 'final_block_height' will be equal to current block and no 'undo_signal' will ever be sent     ) Substreams has two mode when executing your module(s) either development mode or production mode. Development and production modes impact the execution of Substreams, important aspects of execution include: * The time required to reach the first byte. * The speed that large ranges get executed. * The module logs and outputs sent back to the client. By default, the engine runs in developer mode, with richer and deeper output. Differences between production and development modes include: * Forward parallel execution is enabled in production mode and disabled in development mode * The time required to reach the first byte in development mode is faster than in production mode. Specific attributes of development mode include: * The client will receive all of the executed module's logs. * It's possible to request specific store snapshots in the execution tree (via `debug_initial_store_snapshot_for_modules`). * Multiple module's output is possible. With production mode`, however, you trade off functionality for high speed enabling forward parallel execution of module ahead of time. ) ) ) + + +  + -' - -" -%& / 0@" Available only in developer mode 0 0  0: 0=? 4A 4 5@ 5 6" Always sent first 6 6 6 [ 7!"N Progress of data preparation, before sending in the stream of `data` events. 7 7 7 8* 8 8% 8() 9* 9 9% 9() : : :  : o =1b Available only in developer mode, and only if `debug_initial_store_snapshot_for_modules` is set. = =+ =.0 o ?9b Available only in developer mode, and only if `debug_initial_store_snapshot_for_modules` is set. ? ?3 ?68  GJ BlockUndoSignal informs you that every bit of data with a block number above 'last_valid_block' has been reverted on-chain. Delete that data and restart from 'last_valid_cursor' G H1 H H, H/0 I I I  I LV L M M M M N# N N N!" O O O  O V R I Non-deterministic, allows substreams-sink to let go of their undo data. R R  R T2 T T  T, T/1 U6 U U  U0 U35 X] X Y Y Y  Y Z" Z Z  Z ! [" [ [  [ ! \" \ \  \ ! _a _ ` ` `  ` ch c d d d  d e! e e  e e f f f  f g g g  g jo j k k k k l% l l l#$ G n": DebugOutputInfo is available in non-production mode only n n n!  uy StoreModuleOutput are produced for store modules in development mode. It is not possible to retrieve store models in production, with parallelization enabled. If you need the deltas directly, write a pass through mapper module that will get them down to you. u v v v v w- w w  w( w+, x" x x x!  {  {  |  |  |   |  |    LogsTruncated is a flag that tells you if you received all the logs or if they were truncated because you logged too much (fixed limit currently is set to 128 KiB).               E  7 ModulesProgress is a message that is sent every 500ms       previously: repeated ModuleProgress modules = 1; these previous `modules` messages were sent in bursts and are not sent anymore.       5   ' List of jobs running on tier2 servers          4  )& Execution statistics for each module       $  '( <  . Stages definition and completed block ranges           %      #$               !                                            FailureLogsTruncated is a flag that tells you if you received all the logs or if they were truncated because you logged too much (fixed limit currently is set to 128 KiB).                                                                -    ( +,   ModuleStats gathers metrics and statistics from each module, running on tier1 or tier2 All the 'count' and 'time_ms' values may include duplicate for each stage going over that module  "  name of the module     T +F total_processed_blocks is the sum of blocks sent to that module code   & )* ^ (P total_processing_time_ms is the sum of all time spent running that module code   # &' Z :L// external_calls are chain-specific intrinsics, like "Ethereum RPC calls".     5 89  - total_store_operation_time_ms is the sum of all time spent running that module code waiting for a store operation (ex: read, write, delete...)   ( +, o &a total_store_read_count is the sum of all the store Read operations called from that module code   ! $% z (l total_store_write_count is the sum of all store Write operations called from that module code (store-only)   " %'  / total_store_deleteprefix_count is the sum of all store DeletePrefix operations called from that module code (store-only) note that DeletePrefix can be a costly operation on large stores   ) ,.  !~ store_size_bytes is the uncompressed size of the full KV store for that module, from the last 'merge' operation (store-only)       ,x total_store_merging_time_ms is the time spent merging partial stores into a full KV store for that module (store-only)     &  )+ |  &n store_currently_merging is true if there is a merging operation (partial store to full KV store) on the way.      #% }  )o highest_contiguous_block is the highest block in the highest merged full KV store of that module (store-only)     #  &(                                                                                   bproto3 A +sf/substreams/sink/service/v1/service.protosf.substreams.sink.service.v1sf/substreams/v1/package.protosf/substreams/options.proto" DeployRequestH substreams_package ( 2.sf.substreams.v1.PackageRsubstreamsPackage) development_mode (RdevelopmentModeH parameters ( 2(.sf.substreams.sink.service.v1.ParameterR parameters"3 Parameter key ( Rkey value ( Rvalue" DeployResponseG status (2/.sf.substreams.sink.service.v1.DeploymentStatusRstatus# deployment_id ( R deploymentIdW services ( 2;.sf.substreams.sink.service.v1.DeployResponse.ServicesEntryRservices reason ( Rreason motd ( Rmotd; ServicesEntry key ( Rkey value ( Rvalue:8" UpdateRequestH substreams_package ( 2.sf.substreams.v1.PackageRsubstreamsPackage# deployment_id ( R deploymentId reset (Rreset" UpdateResponseG status (2/.sf.substreams.sink.service.v1.DeploymentStatusRstatusW services ( 2;.sf.substreams.sink.service.v1.UpdateResponse.ServicesEntryRservices reason ( Rreason motd ( Rmotd; ServicesEntry key ( Rkey value ( Rvalue:8"2 InfoRequest# deployment_id ( R deploymentId" InfoResponseG status (2/.sf.substreams.sink.service.v1.DeploymentStatusRstatusU services ( 29.sf.substreams.sink.service.v1.InfoResponse.ServicesEntryRservices reason ( RreasonM package_info ( 2*.sf.substreams.sink.service.v1.PackageInfoR packageInfoG progress ( 2+.sf.substreams.sink.service.v1.SinkProgressRprogress motd ( Rmotd; ServicesEntry key ( Rkey value ( Rvalue:8"@ SinkProgress0 last_processed_block (RlastProcessedBlock" PackageInfo name ( Rname version ( Rversion, output_module_name ( RoutputModuleName, output_module_hash ( RoutputModuleHash" ListRequest"e ListResponseU deployments ( 23.sf.substreams.sink.service.v1.DeploymentWithStatusR deployments" DeploymentWithStatus id ( RidG status (2/.sf.substreams.sink.service.v1.DeploymentStatusRstatus reason ( RreasonM package_info ( 2*.sf.substreams.sink.service.v1.PackageInfoR packageInfoG progress ( 2+.sf.substreams.sink.service.v1.SinkProgressRprogress motd ( Rmotd"4 RemoveRequest# deployment_id ( R deploymentId"j RemoveResponseX previous_status (2/.sf.substreams.sink.service.v1.DeploymentStatusRpreviousStatus"3 PauseRequest# deployment_id ( R deploymentId" PauseResponseX previous_status (2/.sf.substreams.sink.service.v1.DeploymentStatusRpreviousStatusN new_status (2/.sf.substreams.sink.service.v1.DeploymentStatusR newStatus"2 StopRequest# deployment_id ( R deploymentId" StopResponseX previous_status (2/.sf.substreams.sink.service.v1.DeploymentStatusRpreviousStatusN new_status (2/.sf.substreams.sink.service.v1.DeploymentStatusR newStatus"4 ResumeRequest# deployment_id ( R deploymentId" ResumeResponseX previous_status (2/.sf.substreams.sink.service.v1.DeploymentStatusRpreviousStatusN new_status (2/.sf.substreams.sink.service.v1.DeploymentStatusR newStatus* DeploymentStatus UNKNOWN RUNNING FAILING PAUSED STOPPED STARTING PAUSING STOPPING REMOVING RESUMING 2 Providere Deploy,.sf.substreams.sink.service.v1.DeployRequest-.sf.substreams.sink.service.v1.DeployResponsee Update,.sf.substreams.sink.service.v1.UpdateRequest-.sf.substreams.sink.service.v1.UpdateResponse_ Info*.sf.substreams.sink.service.v1.InfoRequest+.sf.substreams.sink.service.v1.InfoResponse_ List*.sf.substreams.sink.service.v1.ListRequest+.sf.substreams.sink.service.v1.ListResponseb Pause+.sf.substreams.sink.service.v1.PauseRequest,.sf.substreams.sink.service.v1.PauseResponse_ Stop*.sf.substreams.sink.service.v1.StopRequest+.sf.substreams.sink.service.v1.StopResponsee Resume,.sf.substreams.sink.service.v1.ResumeRequest-.sf.substreams.sink.service.v1.ResumeResponsee Remove,.sf.substreams.sink.service.v1.RemoveRequest-.sf.substreams.sink.service.v1.RemoveResponseBPZNgithub.com/streamingfast/substreams/pb/sf/substreams/sink/service/v1;pbsinksvcJ      &  e  e ( %      5      %3  5      %3  /      !-  /      !- 2    #0 /    !- 5    %3 5    %3   2  - 01     $     "#             )   ! ! ! ! h $[ deployment_id is a short name (max 8 characters) that uniquely identifies your deployment $ $  $ &# & & &!" ' ' '  ' ( ( ( ( +/ + ,2 , ,- ,01 - - -  - . . . . 16 1 2 2 2 2 3# 3 3 3!" 4 4 4  4 5 5 5 5 8: 8 9 9 9  9 <C < = = = = ># > > >!" ? ? ?  ? @ @ @ @ A A A A B B B B EG E F$ F F  F"# IN I J J J  J K K K  K L" L L  L ! M" M M  M !  P  P  RT  R  S0  S  S   S +  S./  V]  V  W  W  W  W  X  X  X  X  Y  Y  Y   Y  Z  Z  Z  Z  [  [  [  [  \  \  \  \ _k _ ` ` ` a a a b b b c c c d d d f f f  g g g h h h  i i i   j  j  j   mo  m  n  n  n   n  qs  q  r'  r  r"  r%& uw u v v v  v y| y z' z z" z%& {" { { { ! ~ ~        '  " %& "    !          '  " %& "    !bproto3(2@ \ map_blocks* map_blocks2": proto:sf.substreams.v1.Clock proto:sf.substreams.v1.Clock? wasm/rust-v1?asm````~`pA A A Dmemory map_blocksallocdealloc __data_end __heap_base A  3N#A k"$ AjA6 A؀6 B7 A6 AjA L#A k"$ A:  6  6 AȀ6 A؀6 Aj I#Ak"$@ ("   ( 6  6  6   BϗL \#A k"$ AjA6 A؀6 B7 A+6 A؀6 Aj6 A  !~@@@@@ AI A! A{O  A j"Axq!A("E A!@ AI A! AK A Avg"kvAq AtkA>j! A k!@ AtAȃj("E A! AA AvkAq AFt!A!@@ (Axq" I  k" O ! !  A! !  Aj("   AvAqjAj("G  ! At! @ E !    A! A t"A krq"E  A kqhAtAȃj("   @@@@@@@A("A A jAxq A I"Av"v"Aq A(ȄM A("E A kqhAtAȃj("(Axq!@ (" Aj(!  k!@ E @ (Axq k" I!@ (" Aj(!   !  ! !   AI   Ar6  j" Ar6  j 6A(Ȅ"E  AxqAj!A(Є!A("A Avt"qE  (!  @@ AsAq j"At"Aȁj("Aj"(" Aj"F  6  6  A A~ wq6 At"Ar6 j" (Ar6  @@A Aq"t"A kr tq"A kqh"At"Aȁj("Aj"(" Aj"F  6  6  A A~ wq6 Ar6 j" At" k"Ar6 j 6@A(Ȅ"E AxqAj!A(Є!@@A("A Avt"qE (!  A  r6 !  6  6 6 6 A 6ЄA 6Ȅ  A  r6 !  6  6 6 6 A 6ЄA 6Ȅ    j"Ar6  j" (Ar6 Aj @ (Axq" O  k" Iq!@ (" Aj(!  !   ! !  E  @A(Ȅ" I  kO  @@ AI  Ar6  j" Ar6 j 6@ AI   AxqAj!@@A("A Avt"qE (!  A  r6 !  6  6 6 6    j"Ar6  j" (Ar6 Aj @@@@@@@@@@@@A(Ȅ" O A(̄" K A! Aj"Av@"AF" At"E AA(؄A A|q "j"6؄AA(܄"  K6܄A(Ԅ"E A!@ (" ("j F  ("  A(Є!@@ k"AK AA6ЄAA6Ȅ  Ar6  j" (Ar6  A 6ȄA  j"6Є  Ar6  j 6  Ar6 Aj A("E  K   (  K  I  AA("  I6  j!A!@@@@ ( F  ("  ( E  A!@@@ (" K  (j" K  (! A 6ԄA AXj"6̄  Ar6  jA(6AA6  A`jAxqAxj" AjI"A6A)! AjA)7  7A 6A 6A Aj6AA6 Aj!@ A6 Aj" I  F   (A~q6   k"Ar6  6@ AI   AxqAj!@@A("A Avt"qE (!  A  r6 !  6 6  6  6  6 ( j6  Ar6   j"k!@ A(ԄF A(ЄF  ("AqAG @@ Axq"AI   @ A j(" Aj("F  6  6  AA(A~ Avwq6  j!  j"(!  A 6ԄAA(̄ j"6̄ Ar6  A k"6̄AA(Ԅ" j"6Ԅ  Ar6 Ar6 Aj!  A 6   j6AA(Ԅ"AjAxq"Axj6ԄA kA(̄ j"jAj"6̄ A|j Ar6 jA(6AA6  A 6ЄAA(Ȅ j"6Ȅ Ar6 j 6   A~q6 Ar6 j 6@ AI   AxqAj!@@A("A Avt"qE (!  A  r6 !  6  6 6 6 Aj AA6A 6A 6AA6́AAȁ6ԁAA6ȁAAЁ6܁AAȁ6ЁAA؁6AAЁ6؁AA6AA؁6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6ĂAA6AA6̂AAȂ6ԂAA6ȂAAЂ6܂AAȂ6ЂAA؂6AAЂ6؂AA6AA؂6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6AA6ăAA6A 6ԄAA6A AXj"6̄  Ar6  jA(6AA6 A!A(̄" M A k"6̄AA(Ԅ" j"6Ԅ  Ar6 Ar6 Aj   (!@@@ ( " G AA Aj"("j(" A!  (" 6  6   Aj !@ !@ "Aj"(" Aj! (!  A6 @ E @@ (AtAȃj"( F AA ( Fj 6     6  AA(A~ (wq6  6@ ("E  6  6 Aj("E Aj 6  6 A!@ AK A Avg"kvAq AtkA>j! B7 6 AtAȃj!@@@@@A("A t"qE ("(Axq G  !  A  r6  6 6  AA AvkAq AFt!@  AvAqjAj"("E  At! ! (Axq G (" 6  6 A6 6 6  6 6 6 6  Axj" A|j("Axq"j!@@@ Aq AqE  (" j!@  k"A(ЄG (AqAG A 6Ȅ  (A~q6  Ar6  j 6 @ AI   @ A j(" Aj("F  6  6  AA(A~ Avwq6 @@ ("AqE  A~q6  Ar6  j 6  @@@@ A(ԄF A(ЄG A 6ЄAA(Ȅ j"6Ȅ  Ar6  j 6 A 6ԄAA(̄ j"6̄  Ar6 A(ЄF   Axq" j!@@ AI   @ A j(" Aj("F  6  6  AA(A~ Avwq6  Ar6  j 6 A(ЄG A 6Ȅ  AA6ȄAA6Є A(" O A(Ԅ"E A!@A(̄"A)I A!@@ (" K  (j K  (" @A("E A!@ Aj! (" A A AK6  M AA6 AI   A!AA(Aj"6 @A("E A!@ Aj! (" A A AK6  AxqAj!@@A("A Avt"qE (!  A  r6 !  6 6  6  6 8#Ak"$ Aj Aj(6  )7  E ("Aj(!@@ (  (- (- fAA("Aj6AA(Aj"6@ AH AK A(AL AK E   2@ A @@ AL "E    @ E  A library/alloc/src/raw_vec.rscapacity overflowcalled `Option::unwrap()` on a `None` valuelibrary/std/src/panicking.rsGname8_ZN5alloc7raw_vec17capacity_overflow17h4b275cb3c10b0a78E0_ZN4core9panicking9panic_fmt17h751be80779d42b53Erust_begin_unwind_ZN4core3ptr102drop_in_place$LT$$RF$core..iter..adapters..copied..Copied$LT$core..slice..iter..Iter$LT$u8$GT$$GT$$GT$17h05fa0f971b46b0e7EE_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17h13c78596688f67b2E,_ZN4core9panicking5panic17h8af046397a2bf65dE rust_panicC_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$6malloc17ha96fcefbb44d6da5EP_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18unlink_large_chunk17hbe8d36a9f4060ceeE P_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17hb12990f92538fbbfE A_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$4free17ha4737b7f84970addE M_ZN3std10sys_common9backtrace26__rust_end_short_backtrace17h53cabafab5b09adaE X_ZN3std9panicking19begin_panic_handler28_$u7b$$u7b$closure$u7d$$u7d$17hdcfc819ce836829eE ;_ZN3std9panicking20rust_panic_with_hook17h70a0e195f4db2a29E map_blocksallocdealloc__stack_pointer .rodataM producerslanguageRust processed-byrustc1.65.0 (897e37553 2022-11-02):B v1.0.1substreams_head_tracker"# Substreams Head Tracker * This substreams works on any change and does not send any actual data, except an empty package on every block, allowing you to get the clock. *XSends an empty message on every block, allowing you to track the clock of any blockchain