<?php
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: google/protobuf/descriptor.proto

namespace Google\Protobuf\Internal;

use Google\Protobuf\Internal\DescriptorPool;
use Google\Protobuf\Internal\GPBType;
use Google\Protobuf\Internal\GPBWire;
use Google\Protobuf\Internal\RepeatedField;
use Google\Protobuf\Internal\InputStream;

use Google\Protobuf\Internal\GPBUtil;

class FileDescriptorSet extends \Google\Protobuf\Internal\Message
{
    private $file;
    private $has_file = false;

    public function getFile()
    {
        return $this->file;
    }

    public function setFile(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\FileDescriptorProto::class);
        $this->file = $var;
        $this->has_file = true;
    }

    public function hasFile()
    {
        return $this->has_file;
    }

}

class FileDescriptorProto extends \Google\Protobuf\Internal\Message
{
    private $name = '';
    private $has_name = false;
    private $package = '';
    private $has_package = false;
    private $dependency;
    private $has_dependency = false;
    private $public_dependency;
    private $has_public_dependency = false;
    private $weak_dependency;
    private $has_weak_dependency = false;
    private $message_type;
    private $has_message_type = false;
    private $enum_type;
    private $has_enum_type = false;
    private $service;
    private $has_service = false;
    private $extension;
    private $has_extension = false;
    private $options = null;
    private $has_options = false;
    private $source_code_info = null;
    private $has_source_code_info = false;
    private $syntax = '';
    private $has_syntax = false;

    public function getName()
    {
        return $this->name;
    }

    public function setName($var)
    {
        GPBUtil::checkString($var, True);
        $this->name = $var;
        $this->has_name = true;
    }

    public function hasName()
    {
        return $this->has_name;
    }

    public function getPackage()
    {
        return $this->package;
    }

    public function setPackage($var)
    {
        GPBUtil::checkString($var, True);
        $this->package = $var;
        $this->has_package = true;
    }

    public function hasPackage()
    {
        return $this->has_package;
    }

    public function getDependency()
    {
        return $this->dependency;
    }

    public function setDependency(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::STRING);
        $this->dependency = $var;
        $this->has_dependency = true;
    }

    public function hasDependency()
    {
        return $this->has_dependency;
    }

    public function getPublicDependency()
    {
        return $this->public_dependency;
    }

    public function setPublicDependency(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::INT32);
        $this->public_dependency = $var;
        $this->has_public_dependency = true;
    }

    public function hasPublicDependency()
    {
        return $this->has_public_dependency;
    }

    public function getWeakDependency()
    {
        return $this->weak_dependency;
    }

    public function setWeakDependency(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::INT32);
        $this->weak_dependency = $var;
        $this->has_weak_dependency = true;
    }

    public function hasWeakDependency()
    {
        return $this->has_weak_dependency;
    }

    public function getMessageType()
    {
        return $this->message_type;
    }

    public function setMessageType(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class);
        $this->message_type = $var;
        $this->has_message_type = true;
    }

    public function hasMessageType()
    {
        return $this->has_message_type;
    }

    public function getEnumType()
    {
        return $this->enum_type;
    }

    public function setEnumType(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class);
        $this->enum_type = $var;
        $this->has_enum_type = true;
    }

    public function hasEnumType()
    {
        return $this->has_enum_type;
    }

    public function getService()
    {
        return $this->service;
    }

    public function setService(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\ServiceDescriptorProto::class);
        $this->service = $var;
        $this->has_service = true;
    }

    public function hasService()
    {
        return $this->has_service;
    }

    public function getExtension()
    {
        return $this->extension;
    }

    public function setExtension(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
        $this->extension = $var;
        $this->has_extension = true;
    }

    public function hasExtension()
    {
        return $this->has_extension;
    }

    public function getOptions()
    {
        return $this->options;
    }

    public function setOptions(&$var)
    {
        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FileOptions::class);
        $this->options = $var;
        $this->has_options = true;
    }

    public function hasOptions()
    {
        return $this->has_options;
    }

    public function getSourceCodeInfo()
    {
        return $this->source_code_info;
    }

    public function setSourceCodeInfo(&$var)
    {
        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\SourceCodeInfo::class);
        $this->source_code_info = $var;
        $this->has_source_code_info = true;
    }

    public function hasSourceCodeInfo()
    {
        return $this->has_source_code_info;
    }

    public function getSyntax()
    {
        return $this->syntax;
    }

    public function setSyntax($var)
    {
        GPBUtil::checkString($var, True);
        $this->syntax = $var;
        $this->has_syntax = true;
    }

    public function hasSyntax()
    {
        return $this->has_syntax;
    }

}

class DescriptorProto extends \Google\Protobuf\Internal\Message
{
    private $name = '';
    private $has_name = false;
    private $field;
    private $has_field = false;
    private $extension;
    private $has_extension = false;
    private $nested_type;
    private $has_nested_type = false;
    private $enum_type;
    private $has_enum_type = false;
    private $extension_range;
    private $has_extension_range = false;
    private $oneof_decl;
    private $has_oneof_decl = false;
    private $options = null;
    private $has_options = false;
    private $reserved_range;
    private $has_reserved_range = false;
    private $reserved_name;
    private $has_reserved_name = false;

    public function getName()
    {
        return $this->name;
    }

    public function setName($var)
    {
        GPBUtil::checkString($var, True);
        $this->name = $var;
        $this->has_name = true;
    }

    public function hasName()
    {
        return $this->has_name;
    }

    public function getField()
    {
        return $this->field;
    }

    public function setField(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
        $this->field = $var;
        $this->has_field = true;
    }

    public function hasField()
    {
        return $this->has_field;
    }

    public function getExtension()
    {
        return $this->extension;
    }

    public function setExtension(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
        $this->extension = $var;
        $this->has_extension = true;
    }

    public function hasExtension()
    {
        return $this->has_extension;
    }

    public function getNestedType()
    {
        return $this->nested_type;
    }

    public function setNestedType(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class);
        $this->nested_type = $var;
        $this->has_nested_type = true;
    }

    public function hasNestedType()
    {
        return $this->has_nested_type;
    }

    public function getEnumType()
    {
        return $this->enum_type;
    }

    public function setEnumType(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class);
        $this->enum_type = $var;
        $this->has_enum_type = true;
    }

    public function hasEnumType()
    {
        return $this->has_enum_type;
    }

    public function getExtensionRange()
    {
        return $this->extension_range;
    }

    public function setExtensionRange(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ExtensionRange::class);
        $this->extension_range = $var;
        $this->has_extension_range = true;
    }

    public function hasExtensionRange()
    {
        return $this->has_extension_range;
    }

    public function getOneofDecl()
    {
        return $this->oneof_decl;
    }

    public function setOneofDecl(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\OneofDescriptorProto::class);
        $this->oneof_decl = $var;
        $this->has_oneof_decl = true;
    }

    public function hasOneofDecl()
    {
        return $this->has_oneof_decl;
    }

    public function getOptions()
    {
        return $this->options;
    }

    public function setOptions(&$var)
    {
        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MessageOptions::class);
        $this->options = $var;
        $this->has_options = true;
    }

    public function hasOptions()
    {
        return $this->has_options;
    }

    public function getReservedRange()
    {
        return $this->reserved_range;
    }

    public function setReservedRange(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ReservedRange::class);
        $this->reserved_range = $var;
        $this->has_reserved_range = true;
    }

    public function hasReservedRange()
    {
        return $this->has_reserved_range;
    }

    public function getReservedName()
    {
        return $this->reserved_name;
    }

    public function setReservedName(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::STRING);
        $this->reserved_name = $var;
        $this->has_reserved_name = true;
    }

    public function hasReservedName()
    {
        return $this->has_reserved_name;
    }

}

class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message
{
    private $start = 0;
    private $has_start = false;
    private $end = 0;
    private $has_end = false;

    public function getStart()
    {
        return $this->start;
    }

    public function setStart($var)
    {
        GPBUtil::checkInt32($var);
        $this->start = $var;
        $this->has_start = true;
    }

    public function hasStart()
    {
        return $this->has_start;
    }

    public function getEnd()
    {
        return $this->end;
    }

    public function setEnd($var)
    {
        GPBUtil::checkInt32($var);
        $this->end = $var;
        $this->has_end = true;
    }

    public function hasEnd()
    {
        return $this->has_end;
    }

}

class DescriptorProto_ReservedRange extends \Google\Protobuf\Internal\Message
{
    private $start = 0;
    private $has_start = false;
    private $end = 0;
    private $has_end = false;

    public function getStart()
    {
        return $this->start;
    }

    public function setStart($var)
    {
        GPBUtil::checkInt32($var);
        $this->start = $var;
        $this->has_start = true;
    }

    public function hasStart()
    {
        return $this->has_start;
    }

    public function getEnd()
    {
        return $this->end;
    }

    public function setEnd($var)
    {
        GPBUtil::checkInt32($var);
        $this->end = $var;
        $this->has_end = true;
    }

    public function hasEnd()
    {
        return $this->has_end;
    }

}

class FieldDescriptorProto extends \Google\Protobuf\Internal\Message
{
    private $name = '';
    private $has_name = false;
    private $number = 0;
    private $has_number = false;
    private $label = 0;
    private $has_label = false;
    private $type = 0;
    private $has_type = false;
    private $type_name = '';
    private $has_type_name = false;
    private $extendee = '';
    private $has_extendee = false;
    private $default_value = '';
    private $has_default_value = false;
    private $oneof_index = 0;
    private $has_oneof_index = false;
    private $json_name = '';
    private $has_json_name = false;
    private $options = null;
    private $has_options = false;

    public function getName()
    {
        return $this->name;
    }

    public function setName($var)
    {
        GPBUtil::checkString($var, True);
        $this->name = $var;
        $this->has_name = true;
    }

    public function hasName()
    {
        return $this->has_name;
    }

    public function getNumber()
    {
        return $this->number;
    }

    public function setNumber($var)
    {
        GPBUtil::checkInt32($var);
        $this->number = $var;
        $this->has_number = true;
    }

    public function hasNumber()
    {
        return $this->has_number;
    }

    public function getLabel()
    {
        return $this->label;
    }

    public function setLabel($var)
    {
        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Label::class);
        $this->label = $var;
        $this->has_label = true;
    }

    public function hasLabel()
    {
        return $this->has_label;
    }

    public function getType()
    {
        return $this->type;
    }

    public function setType($var)
    {
        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Type::class);
        $this->type = $var;
        $this->has_type = true;
    }

    public function hasType()
    {
        return $this->has_type;
    }

    public function getTypeName()
    {
        return $this->type_name;
    }

    public function setTypeName($var)
    {
        GPBUtil::checkString($var, True);
        $this->type_name = $var;
        $this->has_type_name = true;
    }

    public function hasTypeName()
    {
        return $this->has_type_name;
    }

    public function getExtendee()
    {
        return $this->extendee;
    }

    public function setExtendee($var)
    {
        GPBUtil::checkString($var, True);
        $this->extendee = $var;
        $this->has_extendee = true;
    }

    public function hasExtendee()
    {
        return $this->has_extendee;
    }

    public function getDefaultValue()
    {
        return $this->default_value;
    }

    public function setDefaultValue($var)
    {
        GPBUtil::checkString($var, True);
        $this->default_value = $var;
        $this->has_default_value = true;
    }

    public function hasDefaultValue()
    {
        return $this->has_default_value;
    }

    public function getOneofIndex()
    {
        return $this->oneof_index;
    }

    public function setOneofIndex($var)
    {
        GPBUtil::checkInt32($var);
        $this->oneof_index = $var;
        $this->has_oneof_index = true;
    }

    public function hasOneofIndex()
    {
        return $this->has_oneof_index;
    }

    public function getJsonName()
    {
        return $this->json_name;
    }

    public function setJsonName($var)
    {
        GPBUtil::checkString($var, True);
        $this->json_name = $var;
        $this->has_json_name = true;
    }

    public function hasJsonName()
    {
        return $this->has_json_name;
    }

    public function getOptions()
    {
        return $this->options;
    }

    public function setOptions(&$var)
    {
        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FieldOptions::class);
        $this->options = $var;
        $this->has_options = true;
    }

    public function hasOptions()
    {
        return $this->has_options;
    }

}

class FieldDescriptorProto_Type
{
    const TYPE_DOUBLE = 1;
    const TYPE_FLOAT = 2;
    const TYPE_INT64 = 3;
    const TYPE_UINT64 = 4;
    const TYPE_INT32 = 5;
    const TYPE_FIXED64 = 6;
    const TYPE_FIXED32 = 7;
    const TYPE_BOOL = 8;
    const TYPE_STRING = 9;
    const TYPE_GROUP = 10;
    const TYPE_MESSAGE = 11;
    const TYPE_BYTES = 12;
    const TYPE_UINT32 = 13;
    const TYPE_ENUM = 14;
    const TYPE_SFIXED32 = 15;
    const TYPE_SFIXED64 = 16;
    const TYPE_SINT32 = 17;
    const TYPE_SINT64 = 18;
}

class FieldDescriptorProto_Label
{
    const LABEL_OPTIONAL = 1;
    const LABEL_REQUIRED = 2;
    const LABEL_REPEATED = 3;
}

class OneofDescriptorProto extends \Google\Protobuf\Internal\Message
{
    private $name = '';
    private $has_name = false;
    private $options = null;
    private $has_options = false;

    public function getName()
    {
        return $this->name;
    }

    public function setName($var)
    {
        GPBUtil::checkString($var, True);
        $this->name = $var;
        $this->has_name = true;
    }

    public function hasName()
    {
        return $this->has_name;
    }

    public function getOptions()
    {
        return $this->options;
    }

    public function setOptions(&$var)
    {
        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\OneofOptions::class);
        $this->options = $var;
        $this->has_options = true;
    }

    public function hasOptions()
    {
        return $this->has_options;
    }

}

class EnumDescriptorProto extends \Google\Protobuf\Internal\Message
{
    private $name = '';
    private $has_name = false;
    private $value;
    private $has_value = false;
    private $options = null;
    private $has_options = false;

    public function getName()
    {
        return $this->name;
    }

    public function setName($var)
    {
        GPBUtil::checkString($var, True);
        $this->name = $var;
        $this->has_name = true;
    }

    public function hasName()
    {
        return $this->has_name;
    }

    public function getValue()
    {
        return $this->value;
    }

    public function setValue(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\EnumValueDescriptorProto::class);
        $this->value = $var;
        $this->has_value = true;
    }

    public function hasValue()
    {
        return $this->has_value;
    }

    public function getOptions()
    {
        return $this->options;
    }

    public function setOptions(&$var)
    {
        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumOptions::class);
        $this->options = $var;
        $this->has_options = true;
    }

    public function hasOptions()
    {
        return $this->has_options;
    }

}

class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message
{
    private $name = '';
    private $has_name = false;
    private $number = 0;
    private $has_number = false;
    private $options = null;
    private $has_options = false;

    public function getName()
    {
        return $this->name;
    }

    public function setName($var)
    {
        GPBUtil::checkString($var, True);
        $this->name = $var;
        $this->has_name = true;
    }

    public function hasName()
    {
        return $this->has_name;
    }

    public function getNumber()
    {
        return $this->number;
    }

    public function setNumber($var)
    {
        GPBUtil::checkInt32($var);
        $this->number = $var;
        $this->has_number = true;
    }

    public function hasNumber()
    {
        return $this->has_number;
    }

    public function getOptions()
    {
        return $this->options;
    }

    public function setOptions(&$var)
    {
        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumValueOptions::class);
        $this->options = $var;
        $this->has_options = true;
    }

    public function hasOptions()
    {
        return $this->has_options;
    }

}

class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message
{
    private $name = '';
    private $has_name = false;
    private $method;
    private $has_method = false;
    private $options = null;
    private $has_options = false;

    public function getName()
    {
        return $this->name;
    }

    public function setName($var)
    {
        GPBUtil::checkString($var, True);
        $this->name = $var;
        $this->has_name = true;
    }

    public function hasName()
    {
        return $this->has_name;
    }

    public function getMethod()
    {
        return $this->method;
    }

    public function setMethod(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\MethodDescriptorProto::class);
        $this->method = $var;
        $this->has_method = true;
    }

    public function hasMethod()
    {
        return $this->has_method;
    }

    public function getOptions()
    {
        return $this->options;
    }

    public function setOptions(&$var)
    {
        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\ServiceOptions::class);
        $this->options = $var;
        $this->has_options = true;
    }

    public function hasOptions()
    {
        return $this->has_options;
    }

}

class MethodDescriptorProto extends \Google\Protobuf\Internal\Message
{
    private $name = '';
    private $has_name = false;
    private $input_type = '';
    private $has_input_type = false;
    private $output_type = '';
    private $has_output_type = false;
    private $options = null;
    private $has_options = false;
    private $client_streaming = false;
    private $has_client_streaming = false;
    private $server_streaming = false;
    private $has_server_streaming = false;

    public function getName()
    {
        return $this->name;
    }

    public function setName($var)
    {
        GPBUtil::checkString($var, True);
        $this->name = $var;
        $this->has_name = true;
    }

    public function hasName()
    {
        return $this->has_name;
    }

    public function getInputType()
    {
        return $this->input_type;
    }

    public function setInputType($var)
    {
        GPBUtil::checkString($var, True);
        $this->input_type = $var;
        $this->has_input_type = true;
    }

    public function hasInputType()
    {
        return $this->has_input_type;
    }

    public function getOutputType()
    {
        return $this->output_type;
    }

    public function setOutputType($var)
    {
        GPBUtil::checkString($var, True);
        $this->output_type = $var;
        $this->has_output_type = true;
    }

    public function hasOutputType()
    {
        return $this->has_output_type;
    }

    public function getOptions()
    {
        return $this->options;
    }

    public function setOptions(&$var)
    {
        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MethodOptions::class);
        $this->options = $var;
        $this->has_options = true;
    }

    public function hasOptions()
    {
        return $this->has_options;
    }

    public function getClientStreaming()
    {
        return $this->client_streaming;
    }

    public function setClientStreaming($var)
    {
        GPBUtil::checkBool($var);
        $this->client_streaming = $var;
        $this->has_client_streaming = true;
    }

    public function hasClientStreaming()
    {
        return $this->has_client_streaming;
    }

    public function getServerStreaming()
    {
        return $this->server_streaming;
    }

    public function setServerStreaming($var)
    {
        GPBUtil::checkBool($var);
        $this->server_streaming = $var;
        $this->has_server_streaming = true;
    }

    public function hasServerStreaming()
    {
        return $this->has_server_streaming;
    }

}

class FileOptions extends \Google\Protobuf\Internal\Message
{
    private $java_package = '';
    private $has_java_package = false;
    private $java_outer_classname = '';
    private $has_java_outer_classname = false;
    private $java_multiple_files = false;
    private $has_java_multiple_files = false;
    private $java_generate_equals_and_hash = false;
    private $has_java_generate_equals_and_hash = false;
    private $java_string_check_utf8 = false;
    private $has_java_string_check_utf8 = false;
    private $optimize_for = 0;
    private $has_optimize_for = false;
    private $go_package = '';
    private $has_go_package = false;
    private $cc_generic_services = false;
    private $has_cc_generic_services = false;
    private $java_generic_services = false;
    private $has_java_generic_services = false;
    private $py_generic_services = false;
    private $has_py_generic_services = false;
    private $deprecated = false;
    private $has_deprecated = false;
    private $cc_enable_arenas = false;
    private $has_cc_enable_arenas = false;
    private $objc_class_prefix = '';
    private $has_objc_class_prefix = false;
    private $csharp_namespace = '';
    private $has_csharp_namespace = false;
    private $uninterpreted_option;
    private $has_uninterpreted_option = false;

    public function getJavaPackage()
    {
        return $this->java_package;
    }

    public function setJavaPackage($var)
    {
        GPBUtil::checkString($var, True);
        $this->java_package = $var;
        $this->has_java_package = true;
    }

    public function hasJavaPackage()
    {
        return $this->has_java_package;
    }

    public function getJavaOuterClassname()
    {
        return $this->java_outer_classname;
    }

    public function setJavaOuterClassname($var)
    {
        GPBUtil::checkString($var, True);
        $this->java_outer_classname = $var;
        $this->has_java_outer_classname = true;
    }

    public function hasJavaOuterClassname()
    {
        return $this->has_java_outer_classname;
    }

    public function getJavaMultipleFiles()
    {
        return $this->java_multiple_files;
    }

    public function setJavaMultipleFiles($var)
    {
        GPBUtil::checkBool($var);
        $this->java_multiple_files = $var;
        $this->has_java_multiple_files = true;
    }

    public function hasJavaMultipleFiles()
    {
        return $this->has_java_multiple_files;
    }

    public function getJavaGenerateEqualsAndHash()
    {
        return $this->java_generate_equals_and_hash;
    }

    public function setJavaGenerateEqualsAndHash($var)
    {
        GPBUtil::checkBool($var);
        $this->java_generate_equals_and_hash = $var;
        $this->has_java_generate_equals_and_hash = true;
    }

    public function hasJavaGenerateEqualsAndHash()
    {
        return $this->has_java_generate_equals_and_hash;
    }

    public function getJavaStringCheckUtf8()
    {
        return $this->java_string_check_utf8;
    }

    public function setJavaStringCheckUtf8($var)
    {
        GPBUtil::checkBool($var);
        $this->java_string_check_utf8 = $var;
        $this->has_java_string_check_utf8 = true;
    }

    public function hasJavaStringCheckUtf8()
    {
        return $this->has_java_string_check_utf8;
    }

    public function getOptimizeFor()
    {
        return $this->optimize_for;
    }

    public function setOptimizeFor($var)
    {
        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FileOptions_OptimizeMode::class);
        $this->optimize_for = $var;
        $this->has_optimize_for = true;
    }

    public function hasOptimizeFor()
    {
        return $this->has_optimize_for;
    }

    public function getGoPackage()
    {
        return $this->go_package;
    }

    public function setGoPackage($var)
    {
        GPBUtil::checkString($var, True);
        $this->go_package = $var;
        $this->has_go_package = true;
    }

    public function hasGoPackage()
    {
        return $this->has_go_package;
    }

    public function getCcGenericServices()
    {
        return $this->cc_generic_services;
    }

    public function setCcGenericServices($var)
    {
        GPBUtil::checkBool($var);
        $this->cc_generic_services = $var;
        $this->has_cc_generic_services = true;
    }

    public function hasCcGenericServices()
    {
        return $this->has_cc_generic_services;
    }

    public function getJavaGenericServices()
    {
        return $this->java_generic_services;
    }

    public function setJavaGenericServices($var)
    {
        GPBUtil::checkBool($var);
        $this->java_generic_services = $var;
        $this->has_java_generic_services = true;
    }

    public function hasJavaGenericServices()
    {
        return $this->has_java_generic_services;
    }

    public function getPyGenericServices()
    {
        return $this->py_generic_services;
    }

    public function setPyGenericServices($var)
    {
        GPBUtil::checkBool($var);
        $this->py_generic_services = $var;
        $this->has_py_generic_services = true;
    }

    public function hasPyGenericServices()
    {
        return $this->has_py_generic_services;
    }

    public function getDeprecated()
    {
        return $this->deprecated;
    }

    public function setDeprecated($var)
    {
        GPBUtil::checkBool($var);
        $this->deprecated = $var;
        $this->has_deprecated = true;
    }

    public function hasDeprecated()
    {
        return $this->has_deprecated;
    }

    public function getCcEnableArenas()
    {
        return $this->cc_enable_arenas;
    }

    public function setCcEnableArenas($var)
    {
        GPBUtil::checkBool($var);
        $this->cc_enable_arenas = $var;
        $this->has_cc_enable_arenas = true;
    }

    public function hasCcEnableArenas()
    {
        return $this->has_cc_enable_arenas;
    }

    public function getObjcClassPrefix()
    {
        return $this->objc_class_prefix;
    }

    public function setObjcClassPrefix($var)
    {
        GPBUtil::checkString($var, True);
        $this->objc_class_prefix = $var;
        $this->has_objc_class_prefix = true;
    }

    public function hasObjcClassPrefix()
    {
        return $this->has_objc_class_prefix;
    }

    public function getCsharpNamespace()
    {
        return $this->csharp_namespace;
    }

    public function setCsharpNamespace($var)
    {
        GPBUtil::checkString($var, True);
        $this->csharp_namespace = $var;
        $this->has_csharp_namespace = true;
    }

    public function hasCsharpNamespace()
    {
        return $this->has_csharp_namespace;
    }

    public function getUninterpretedOption()
    {
        return $this->uninterpreted_option;
    }

    public function setUninterpretedOption(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
        $this->uninterpreted_option = $var;
        $this->has_uninterpreted_option = true;
    }

    public function hasUninterpretedOption()
    {
        return $this->has_uninterpreted_option;
    }

}

class FileOptions_OptimizeMode
{
    const SPEED = 1;
    const CODE_SIZE = 2;
    const LITE_RUNTIME = 3;
}

class MessageOptions extends \Google\Protobuf\Internal\Message
{
    private $message_set_wire_format = false;
    private $has_message_set_wire_format = false;
    private $no_standard_descriptor_accessor = false;
    private $has_no_standard_descriptor_accessor = false;
    private $deprecated = false;
    private $has_deprecated = false;
    private $map_entry = false;
    private $has_map_entry = false;
    private $uninterpreted_option;
    private $has_uninterpreted_option = false;

    public function getMessageSetWireFormat()
    {
        return $this->message_set_wire_format;
    }

    public function setMessageSetWireFormat($var)
    {
        GPBUtil::checkBool($var);
        $this->message_set_wire_format = $var;
        $this->has_message_set_wire_format = true;
    }

    public function hasMessageSetWireFormat()
    {
        return $this->has_message_set_wire_format;
    }

    public function getNoStandardDescriptorAccessor()
    {
        return $this->no_standard_descriptor_accessor;
    }

    public function setNoStandardDescriptorAccessor($var)
    {
        GPBUtil::checkBool($var);
        $this->no_standard_descriptor_accessor = $var;
        $this->has_no_standard_descriptor_accessor = true;
    }

    public function hasNoStandardDescriptorAccessor()
    {
        return $this->has_no_standard_descriptor_accessor;
    }

    public function getDeprecated()
    {
        return $this->deprecated;
    }

    public function setDeprecated($var)
    {
        GPBUtil::checkBool($var);
        $this->deprecated = $var;
        $this->has_deprecated = true;
    }

    public function hasDeprecated()
    {
        return $this->has_deprecated;
    }

    public function getMapEntry()
    {
        return $this->map_entry;
    }

    public function setMapEntry($var)
    {
        GPBUtil::checkBool($var);
        $this->map_entry = $var;
        $this->has_map_entry = true;
    }

    public function hasMapEntry()
    {
        return $this->has_map_entry;
    }

    public function getUninterpretedOption()
    {
        return $this->uninterpreted_option;
    }

    public function setUninterpretedOption(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
        $this->uninterpreted_option = $var;
        $this->has_uninterpreted_option = true;
    }

    public function hasUninterpretedOption()
    {
        return $this->has_uninterpreted_option;
    }

}

class FieldOptions extends \Google\Protobuf\Internal\Message
{
    private $ctype = 0;
    private $has_ctype = false;
    private $packed = false;
    private $has_packed = false;
    private $jstype = 0;
    private $has_jstype = false;
    private $lazy = false;
    private $has_lazy = false;
    private $deprecated = false;
    private $has_deprecated = false;
    private $weak = false;
    private $has_weak = false;
    private $uninterpreted_option;
    private $has_uninterpreted_option = false;

    public function getCtype()
    {
        return $this->ctype;
    }

    public function setCtype($var)
    {
        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_CType::class);
        $this->ctype = $var;
        $this->has_ctype = true;
    }

    public function hasCtype()
    {
        return $this->has_ctype;
    }

    public function getPacked()
    {
        return $this->packed;
    }

    public function setPacked($var)
    {
        GPBUtil::checkBool($var);
        $this->packed = $var;
        $this->has_packed = true;
    }

    public function hasPacked()
    {
        return $this->has_packed;
    }

    public function getJstype()
    {
        return $this->jstype;
    }

    public function setJstype($var)
    {
        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_JSType::class);
        $this->jstype = $var;
        $this->has_jstype = true;
    }

    public function hasJstype()
    {
        return $this->has_jstype;
    }

    public function getLazy()
    {
        return $this->lazy;
    }

    public function setLazy($var)
    {
        GPBUtil::checkBool($var);
        $this->lazy = $var;
        $this->has_lazy = true;
    }

    public function hasLazy()
    {
        return $this->has_lazy;
    }

    public function getDeprecated()
    {
        return $this->deprecated;
    }

    public function setDeprecated($var)
    {
        GPBUtil::checkBool($var);
        $this->deprecated = $var;
        $this->has_deprecated = true;
    }

    public function hasDeprecated()
    {
        return $this->has_deprecated;
    }

    public function getWeak()
    {
        return $this->weak;
    }

    public function setWeak($var)
    {
        GPBUtil::checkBool($var);
        $this->weak = $var;
        $this->has_weak = true;
    }

    public function hasWeak()
    {
        return $this->has_weak;
    }

    public function getUninterpretedOption()
    {
        return $this->uninterpreted_option;
    }

    public function setUninterpretedOption(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
        $this->uninterpreted_option = $var;
        $this->has_uninterpreted_option = true;
    }

    public function hasUninterpretedOption()
    {
        return $this->has_uninterpreted_option;
    }

}

class FieldOptions_CType
{
    const STRING = 0;
    const CORD = 1;
    const STRING_PIECE = 2;
}

class FieldOptions_JSType
{
    const JS_NORMAL = 0;
    const JS_STRING = 1;
    const JS_NUMBER = 2;
}

class OneofOptions extends \Google\Protobuf\Internal\Message
{
    private $uninterpreted_option;
    private $has_uninterpreted_option = false;

    public function getUninterpretedOption()
    {
        return $this->uninterpreted_option;
    }

    public function setUninterpretedOption(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
        $this->uninterpreted_option = $var;
        $this->has_uninterpreted_option = true;
    }

    public function hasUninterpretedOption()
    {
        return $this->has_uninterpreted_option;
    }

}

class EnumOptions extends \Google\Protobuf\Internal\Message
{
    private $allow_alias = false;
    private $has_allow_alias = false;
    private $deprecated = false;
    private $has_deprecated = false;
    private $uninterpreted_option;
    private $has_uninterpreted_option = false;

    public function getAllowAlias()
    {
        return $this->allow_alias;
    }

    public function setAllowAlias($var)
    {
        GPBUtil::checkBool($var);
        $this->allow_alias = $var;
        $this->has_allow_alias = true;
    }

    public function hasAllowAlias()
    {
        return $this->has_allow_alias;
    }

    public function getDeprecated()
    {
        return $this->deprecated;
    }

    public function setDeprecated($var)
    {
        GPBUtil::checkBool($var);
        $this->deprecated = $var;
        $this->has_deprecated = true;
    }

    public function hasDeprecated()
    {
        return $this->has_deprecated;
    }

    public function getUninterpretedOption()
    {
        return $this->uninterpreted_option;
    }

    public function setUninterpretedOption(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
        $this->uninterpreted_option = $var;
        $this->has_uninterpreted_option = true;
    }

    public function hasUninterpretedOption()
    {
        return $this->has_uninterpreted_option;
    }

}

class EnumValueOptions extends \Google\Protobuf\Internal\Message
{
    private $deprecated = false;
    private $has_deprecated = false;
    private $uninterpreted_option;
    private $has_uninterpreted_option = false;

    public function getDeprecated()
    {
        return $this->deprecated;
    }

    public function setDeprecated($var)
    {
        GPBUtil::checkBool($var);
        $this->deprecated = $var;
        $this->has_deprecated = true;
    }

    public function hasDeprecated()
    {
        return $this->has_deprecated;
    }

    public function getUninterpretedOption()
    {
        return $this->uninterpreted_option;
    }

    public function setUninterpretedOption(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
        $this->uninterpreted_option = $var;
        $this->has_uninterpreted_option = true;
    }

    public function hasUninterpretedOption()
    {
        return $this->has_uninterpreted_option;
    }

}

class ServiceOptions extends \Google\Protobuf\Internal\Message
{
    private $deprecated = false;
    private $has_deprecated = false;
    private $uninterpreted_option;
    private $has_uninterpreted_option = false;

    public function getDeprecated()
    {
        return $this->deprecated;
    }

    public function setDeprecated($var)
    {
        GPBUtil::checkBool($var);
        $this->deprecated = $var;
        $this->has_deprecated = true;
    }

    public function hasDeprecated()
    {
        return $this->has_deprecated;
    }

    public function getUninterpretedOption()
    {
        return $this->uninterpreted_option;
    }

    public function setUninterpretedOption(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
        $this->uninterpreted_option = $var;
        $this->has_uninterpreted_option = true;
    }

    public function hasUninterpretedOption()
    {
        return $this->has_uninterpreted_option;
    }

}

class MethodOptions extends \Google\Protobuf\Internal\Message
{
    private $deprecated = false;
    private $has_deprecated = false;
    private $uninterpreted_option;
    private $has_uninterpreted_option = false;

    public function getDeprecated()
    {
        return $this->deprecated;
    }

    public function setDeprecated($var)
    {
        GPBUtil::checkBool($var);
        $this->deprecated = $var;
        $this->has_deprecated = true;
    }

    public function hasDeprecated()
    {
        return $this->has_deprecated;
    }

    public function getUninterpretedOption()
    {
        return $this->uninterpreted_option;
    }

    public function setUninterpretedOption(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
        $this->uninterpreted_option = $var;
        $this->has_uninterpreted_option = true;
    }

    public function hasUninterpretedOption()
    {
        return $this->has_uninterpreted_option;
    }

}

class UninterpretedOption extends \Google\Protobuf\Internal\Message
{
    private $name;
    private $has_name = false;
    private $identifier_value = '';
    private $has_identifier_value = false;
    private $positive_int_value = 0;
    private $has_positive_int_value = false;
    private $negative_int_value = 0;
    private $has_negative_int_value = false;
    private $double_value = 0.0;
    private $has_double_value = false;
    private $string_value = '';
    private $has_string_value = false;
    private $aggregate_value = '';
    private $has_aggregate_value = false;

    public function getName()
    {
        return $this->name;
    }

    public function setName(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption_NamePart::class);
        $this->name = $var;
        $this->has_name = true;
    }

    public function hasName()
    {
        return $this->has_name;
    }

    public function getIdentifierValue()
    {
        return $this->identifier_value;
    }

    public function setIdentifierValue($var)
    {
        GPBUtil::checkString($var, True);
        $this->identifier_value = $var;
        $this->has_identifier_value = true;
    }

    public function hasIdentifierValue()
    {
        return $this->has_identifier_value;
    }

    public function getPositiveIntValue()
    {
        return $this->positive_int_value;
    }

    public function setPositiveIntValue($var)
    {
        GPBUtil::checkUint64($var);
        $this->positive_int_value = $var;
        $this->has_positive_int_value = true;
    }

    public function hasPositiveIntValue()
    {
        return $this->has_positive_int_value;
    }

    public function getNegativeIntValue()
    {
        return $this->negative_int_value;
    }

    public function setNegativeIntValue($var)
    {
        GPBUtil::checkInt64($var);
        $this->negative_int_value = $var;
        $this->has_negative_int_value = true;
    }

    public function hasNegativeIntValue()
    {
        return $this->has_negative_int_value;
    }

    public function getDoubleValue()
    {
        return $this->double_value;
    }

    public function setDoubleValue($var)
    {
        GPBUtil::checkDouble($var);
        $this->double_value = $var;
        $this->has_double_value = true;
    }

    public function hasDoubleValue()
    {
        return $this->has_double_value;
    }

    public function getStringValue()
    {
        return $this->string_value;
    }

    public function setStringValue($var)
    {
        GPBUtil::checkString($var, False);
        $this->string_value = $var;
        $this->has_string_value = true;
    }

    public function hasStringValue()
    {
        return $this->has_string_value;
    }

    public function getAggregateValue()
    {
        return $this->aggregate_value;
    }

    public function setAggregateValue($var)
    {
        GPBUtil::checkString($var, True);
        $this->aggregate_value = $var;
        $this->has_aggregate_value = true;
    }

    public function hasAggregateValue()
    {
        return $this->has_aggregate_value;
    }

}

class UninterpretedOption_NamePart extends \Google\Protobuf\Internal\Message
{
    private $name_part = '';
    private $has_name_part = false;
    private $is_extension = false;
    private $has_is_extension = false;

    public function getNamePart()
    {
        return $this->name_part;
    }

    public function setNamePart($var)
    {
        GPBUtil::checkString($var, True);
        $this->name_part = $var;
        $this->has_name_part = true;
    }

    public function hasNamePart()
    {
        return $this->has_name_part;
    }

    public function getIsExtension()
    {
        return $this->is_extension;
    }

    public function setIsExtension($var)
    {
        GPBUtil::checkBool($var);
        $this->is_extension = $var;
        $this->has_is_extension = true;
    }

    public function hasIsExtension()
    {
        return $this->has_is_extension;
    }

}

class SourceCodeInfo extends \Google\Protobuf\Internal\Message
{
    private $location;
    private $has_location = false;

    public function getLocation()
    {
        return $this->location;
    }

    public function setLocation(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\SourceCodeInfo_Location::class);
        $this->location = $var;
        $this->has_location = true;
    }

    public function hasLocation()
    {
        return $this->has_location;
    }

}

class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message
{
    private $path;
    private $has_path = false;
    private $span;
    private $has_span = false;
    private $leading_comments = '';
    private $has_leading_comments = false;
    private $trailing_comments = '';
    private $has_trailing_comments = false;
    private $leading_detached_comments;
    private $has_leading_detached_comments = false;

    public function getPath()
    {
        return $this->path;
    }

    public function setPath(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::INT32);
        $this->path = $var;
        $this->has_path = true;
    }

    public function hasPath()
    {
        return $this->has_path;
    }

    public function getSpan()
    {
        return $this->span;
    }

    public function setSpan(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::INT32);
        $this->span = $var;
        $this->has_span = true;
    }

    public function hasSpan()
    {
        return $this->has_span;
    }

    public function getLeadingComments()
    {
        return $this->leading_comments;
    }

    public function setLeadingComments($var)
    {
        GPBUtil::checkString($var, True);
        $this->leading_comments = $var;
        $this->has_leading_comments = true;
    }

    public function hasLeadingComments()
    {
        return $this->has_leading_comments;
    }

    public function getTrailingComments()
    {
        return $this->trailing_comments;
    }

    public function setTrailingComments($var)
    {
        GPBUtil::checkString($var, True);
        $this->trailing_comments = $var;
        $this->has_trailing_comments = true;
    }

    public function hasTrailingComments()
    {
        return $this->has_trailing_comments;
    }

    public function getLeadingDetachedComments()
    {
        return $this->leading_detached_comments;
    }

    public function setLeadingDetachedComments(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::STRING);
        $this->leading_detached_comments = $var;
        $this->has_leading_detached_comments = true;
    }

    public function hasLeadingDetachedComments()
    {
        return $this->has_leading_detached_comments;
    }

}

class GeneratedCodeInfo extends \Google\Protobuf\Internal\Message
{
    private $annotation;
    private $has_annotation = false;

    public function getAnnotation()
    {
        return $this->annotation;
    }

    public function setAnnotation(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\GeneratedCodeInfo_Annotation::class);
        $this->annotation = $var;
        $this->has_annotation = true;
    }

    public function hasAnnotation()
    {
        return $this->has_annotation;
    }

}

class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message
{
    private $path;
    private $has_path = false;
    private $source_file = '';
    private $has_source_file = false;
    private $begin = 0;
    private $has_begin = false;
    private $end = 0;
    private $has_end = false;

    public function getPath()
    {
        return $this->path;
    }

    public function setPath(&$var)
    {
        GPBUtil::checkRepeatedField($var, GPBType::INT32);
        $this->path = $var;
        $this->has_path = true;
    }

    public function hasPath()
    {
        return $this->has_path;
    }

    public function getSourceFile()
    {
        return $this->source_file;
    }

    public function setSourceFile($var)
    {
        GPBUtil::checkString($var, True);
        $this->source_file = $var;
        $this->has_source_file = true;
    }

    public function hasSourceFile()
    {
        return $this->has_source_file;
    }

    public function getBegin()
    {
        return $this->begin;
    }

    public function setBegin($var)
    {
        GPBUtil::checkInt32($var);
        $this->begin = $var;
        $this->has_begin = true;
    }

    public function hasBegin()
    {
        return $this->has_begin;
    }

    public function getEnd()
    {
        return $this->end;
    }

    public function setEnd($var)
    {
        GPBUtil::checkInt32($var);
        $this->end = $var;
        $this->has_end = true;
    }

    public function hasEnd()
    {
        return $this->has_end;
    }

}

$pool = DescriptorPool::getGeneratedPool();

$pool->addMessage('google.protobuf.internal.FileDescriptorSet', FileDescriptorSet::class)
    ->repeated('file', GPBType::MESSAGE, 1, 'google.protobuf.internal.FileDescriptorProto')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.FileDescriptorProto', FileDescriptorProto::class)
    ->optional('name', GPBType::STRING, 1)
    ->optional('package', GPBType::STRING, 2)
    ->repeated('dependency', GPBType::STRING, 3)
    ->repeated('public_dependency', GPBType::INT32, 10)
    ->repeated('weak_dependency', GPBType::INT32, 11)
    ->repeated('message_type', GPBType::MESSAGE, 4, 'google.protobuf.internal.DescriptorProto')
    ->repeated('enum_type', GPBType::MESSAGE, 5, 'google.protobuf.internal.EnumDescriptorProto')
    ->repeated('service', GPBType::MESSAGE, 6, 'google.protobuf.internal.ServiceDescriptorProto')
    ->repeated('extension', GPBType::MESSAGE, 7, 'google.protobuf.internal.FieldDescriptorProto')
    ->optional('options', GPBType::MESSAGE, 8, 'google.protobuf.internal.FileOptions')
    ->optional('source_code_info', GPBType::MESSAGE, 9, 'google.protobuf.internal.SourceCodeInfo')
    ->optional('syntax', GPBType::STRING, 12)
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.DescriptorProto', DescriptorProto::class)
    ->optional('name', GPBType::STRING, 1)
    ->repeated('field', GPBType::MESSAGE, 2, 'google.protobuf.internal.FieldDescriptorProto')
    ->repeated('extension', GPBType::MESSAGE, 6, 'google.protobuf.internal.FieldDescriptorProto')
    ->repeated('nested_type', GPBType::MESSAGE, 3, 'google.protobuf.internal.DescriptorProto')
    ->repeated('enum_type', GPBType::MESSAGE, 4, 'google.protobuf.internal.EnumDescriptorProto')
    ->repeated('extension_range', GPBType::MESSAGE, 5, 'google.protobuf.internal.DescriptorProto.ExtensionRange')
    ->repeated('oneof_decl', GPBType::MESSAGE, 8, 'google.protobuf.internal.OneofDescriptorProto')
    ->optional('options', GPBType::MESSAGE, 7, 'google.protobuf.internal.MessageOptions')
    ->repeated('reserved_range', GPBType::MESSAGE, 9, 'google.protobuf.internal.DescriptorProto.ReservedRange')
    ->repeated('reserved_name', GPBType::STRING, 10)
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.DescriptorProto.ExtensionRange', DescriptorProto_ExtensionRange::class)
    ->optional('start', GPBType::INT32, 1)
    ->optional('end', GPBType::INT32, 2)
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.DescriptorProto.ReservedRange', DescriptorProto_ReservedRange::class)
    ->optional('start', GPBType::INT32, 1)
    ->optional('end', GPBType::INT32, 2)
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.FieldDescriptorProto', FieldDescriptorProto::class)
    ->optional('name', GPBType::STRING, 1)
    ->optional('number', GPBType::INT32, 3)
    ->optional('label', GPBType::ENUM, 4, 'google.protobuf.internal.FieldDescriptorProto.Label')
    ->optional('type', GPBType::ENUM, 5, 'google.protobuf.internal.FieldDescriptorProto.Type')
    ->optional('type_name', GPBType::STRING, 6)
    ->optional('extendee', GPBType::STRING, 2)
    ->optional('default_value', GPBType::STRING, 7)
    ->optional('oneof_index', GPBType::INT32, 9)
    ->optional('json_name', GPBType::STRING, 10)
    ->optional('options', GPBType::MESSAGE, 8, 'google.protobuf.internal.FieldOptions')
    ->finalizeToPool();

$pool->addEnum('google.protobuf.internal.FieldDescriptorProto.Type', Type::class)
    ->value("TYPE_DOUBLE", 1)
    ->value("TYPE_FLOAT", 2)
    ->value("TYPE_INT64", 3)
    ->value("TYPE_UINT64", 4)
    ->value("TYPE_INT32", 5)
    ->value("TYPE_FIXED64", 6)
    ->value("TYPE_FIXED32", 7)
    ->value("TYPE_BOOL", 8)
    ->value("TYPE_STRING", 9)
    ->value("TYPE_GROUP", 10)
    ->value("TYPE_MESSAGE", 11)
    ->value("TYPE_BYTES", 12)
    ->value("TYPE_UINT32", 13)
    ->value("TYPE_ENUM", 14)
    ->value("TYPE_SFIXED32", 15)
    ->value("TYPE_SFIXED64", 16)
    ->value("TYPE_SINT32", 17)
    ->value("TYPE_SINT64", 18)
    ->finalizeToPool();

$pool->addEnum('google.protobuf.internal.FieldDescriptorProto.Label', Label::class)
    ->value("LABEL_OPTIONAL", 1)
    ->value("LABEL_REQUIRED", 2)
    ->value("LABEL_REPEATED", 3)
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.OneofDescriptorProto', OneofDescriptorProto::class)
    ->optional('name', GPBType::STRING, 1)
    ->optional('options', GPBType::MESSAGE, 2, 'google.protobuf.internal.OneofOptions')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.EnumDescriptorProto', EnumDescriptorProto::class)
    ->optional('name', GPBType::STRING, 1)
    ->repeated('value', GPBType::MESSAGE, 2, 'google.protobuf.internal.EnumValueDescriptorProto')
    ->optional('options', GPBType::MESSAGE, 3, 'google.protobuf.internal.EnumOptions')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.EnumValueDescriptorProto', EnumValueDescriptorProto::class)
    ->optional('name', GPBType::STRING, 1)
    ->optional('number', GPBType::INT32, 2)
    ->optional('options', GPBType::MESSAGE, 3, 'google.protobuf.internal.EnumValueOptions')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.ServiceDescriptorProto', ServiceDescriptorProto::class)
    ->optional('name', GPBType::STRING, 1)
    ->repeated('method', GPBType::MESSAGE, 2, 'google.protobuf.internal.MethodDescriptorProto')
    ->optional('options', GPBType::MESSAGE, 3, 'google.protobuf.internal.ServiceOptions')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.MethodDescriptorProto', MethodDescriptorProto::class)
    ->optional('name', GPBType::STRING, 1)
    ->optional('input_type', GPBType::STRING, 2)
    ->optional('output_type', GPBType::STRING, 3)
    ->optional('options', GPBType::MESSAGE, 4, 'google.protobuf.internal.MethodOptions')
    ->optional('client_streaming', GPBType::BOOL, 5)
    ->optional('server_streaming', GPBType::BOOL, 6)
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.FileOptions', FileOptions::class)
    ->optional('java_package', GPBType::STRING, 1)
    ->optional('java_outer_classname', GPBType::STRING, 8)
    ->optional('java_multiple_files', GPBType::BOOL, 10)
    ->optional('java_generate_equals_and_hash', GPBType::BOOL, 20)
    ->optional('java_string_check_utf8', GPBType::BOOL, 27)
    ->optional('optimize_for', GPBType::ENUM, 9, 'google.protobuf.internal.FileOptions.OptimizeMode')
    ->optional('go_package', GPBType::STRING, 11)
    ->optional('cc_generic_services', GPBType::BOOL, 16)
    ->optional('java_generic_services', GPBType::BOOL, 17)
    ->optional('py_generic_services', GPBType::BOOL, 18)
    ->optional('deprecated', GPBType::BOOL, 23)
    ->optional('cc_enable_arenas', GPBType::BOOL, 31)
    ->optional('objc_class_prefix', GPBType::STRING, 36)
    ->optional('csharp_namespace', GPBType::STRING, 37)
    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
    ->finalizeToPool();

$pool->addEnum('google.protobuf.internal.FileOptions.OptimizeMode', OptimizeMode::class)
    ->value("SPEED", 1)
    ->value("CODE_SIZE", 2)
    ->value("LITE_RUNTIME", 3)
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.MessageOptions', MessageOptions::class)
    ->optional('message_set_wire_format', GPBType::BOOL, 1)
    ->optional('no_standard_descriptor_accessor', GPBType::BOOL, 2)
    ->optional('deprecated', GPBType::BOOL, 3)
    ->optional('map_entry', GPBType::BOOL, 7)
    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.FieldOptions', FieldOptions::class)
    ->optional('ctype', GPBType::ENUM, 1, 'google.protobuf.internal.FieldOptions.CType')
    ->optional('packed', GPBType::BOOL, 2)
    ->optional('jstype', GPBType::ENUM, 6, 'google.protobuf.internal.FieldOptions.JSType')
    ->optional('lazy', GPBType::BOOL, 5)
    ->optional('deprecated', GPBType::BOOL, 3)
    ->optional('weak', GPBType::BOOL, 10)
    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
    ->finalizeToPool();

$pool->addEnum('google.protobuf.internal.FieldOptions.CType', CType::class)
    ->value("STRING", 0)
    ->value("CORD", 1)
    ->value("STRING_PIECE", 2)
    ->finalizeToPool();

$pool->addEnum('google.protobuf.internal.FieldOptions.JSType', JSType::class)
    ->value("JS_NORMAL", 0)
    ->value("JS_STRING", 1)
    ->value("JS_NUMBER", 2)
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.OneofOptions', OneofOptions::class)
    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.EnumOptions', EnumOptions::class)
    ->optional('allow_alias', GPBType::BOOL, 2)
    ->optional('deprecated', GPBType::BOOL, 3)
    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.EnumValueOptions', EnumValueOptions::class)
    ->optional('deprecated', GPBType::BOOL, 1)
    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.ServiceOptions', ServiceOptions::class)
    ->optional('deprecated', GPBType::BOOL, 33)
    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.MethodOptions', MethodOptions::class)
    ->optional('deprecated', GPBType::BOOL, 33)
    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.UninterpretedOption', UninterpretedOption::class)
    ->repeated('name', GPBType::MESSAGE, 2, 'google.protobuf.internal.UninterpretedOption.NamePart')
    ->optional('identifier_value', GPBType::STRING, 3)
    ->optional('positive_int_value', GPBType::UINT64, 4)
    ->optional('negative_int_value', GPBType::INT64, 5)
    ->optional('double_value', GPBType::DOUBLE, 6)
    ->optional('string_value', GPBType::BYTES, 7)
    ->optional('aggregate_value', GPBType::STRING, 8)
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.UninterpretedOption.NamePart', UninterpretedOption_NamePart::class)
    ->required('name_part', GPBType::STRING, 1)
    ->required('is_extension', GPBType::BOOL, 2)
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.SourceCodeInfo', SourceCodeInfo::class)
    ->repeated('location', GPBType::MESSAGE, 1, 'google.protobuf.internal.SourceCodeInfo.Location')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.SourceCodeInfo.Location', SourceCodeInfo_Location::class)
    ->repeated('path', GPBType::INT32, 1)
    ->repeated('span', GPBType::INT32, 2)
    ->optional('leading_comments', GPBType::STRING, 3)
    ->optional('trailing_comments', GPBType::STRING, 4)
    ->repeated('leading_detached_comments', GPBType::STRING, 6)
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.GeneratedCodeInfo', GeneratedCodeInfo::class)
    ->repeated('annotation', GPBType::MESSAGE, 1, 'google.protobuf.internal.GeneratedCodeInfo.Annotation')
    ->finalizeToPool();

$pool->addMessage('google.protobuf.internal.GeneratedCodeInfo.Annotation', GeneratedCodeInfo_Annotation::class)
    ->repeated('path', GPBType::INT32, 1)
    ->optional('source_file', GPBType::STRING, 2)
    ->optional('begin', GPBType::INT32, 3)
    ->optional('end', GPBType::INT32, 4)
    ->finalizeToPool();

$pool->finish();
