From cc798c510c2b4a6d473c8ac53e4ed39eca7df87a Mon Sep 17 00:00:00 2001 From: Might Date: Fri, 1 Sep 2017 15:23:59 +0800 Subject: [PATCH 1/3] use an aux table as container of all local-variables to break lua's local-variable count limitation; also solve enum default values; addtionally, adds cocoslua compatibility option. --- plugin/protoc-gen-lua | 76 ++++++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 27 deletions(-) diff --git a/plugin/protoc-gen-lua b/plugin/protoc-gen-lua index 25ef283..fe0567b 100755 --- a/plugin/protoc-gen-lua +++ b/plugin/protoc-gen-lua @@ -21,6 +21,14 @@ _packages = {} _files = {} _message = {} +''' break limitation of local-variable count by gathering all variables within a local aux table ''' +_auxtable_ = "_" +luasymbol = lambda protoName : "%s.%s" % (_auxtable_, protoName) + +''' make default enum value symbols from same or imported modules ''' +importedEnumValue = lambda typename, value : typename[:typename.rfind(".") + 1] + value +containedEnumValue = lambda typename, value: '%s_%s_ENUM.number' % (typename, value.upper()) + FDP = plugin_pb2.descriptor_pb2.FieldDescriptorProto if sys.platform == "win32": @@ -250,10 +258,10 @@ def code_gen_enum_item(index, enum_value, env): full_name = env.get_local_name() + '.' + enum_value.name obj_name = full_name.upper().replace('.', '_') + '_ENUM' env.descriptor.append( - "local %s = protobuf.EnumValueDescriptor();\n"% obj_name + "%s = protobuf.EnumValueDescriptor();\n"% luasymbol(obj_name) ) - context = Writer(obj_name) + context = Writer(luasymbol(obj_name)) context('.name = "%s"\n' % enum_value.name) context('.index = %d\n' % index) context('.number = %d\n' % enum_value.number) @@ -266,30 +274,30 @@ def code_gen_enum(enum_desc, env): full_name = env.get_local_name() obj_name = full_name.upper().replace('.', '_') env.descriptor.append( - "local %s = protobuf.EnumDescriptor();\n"% obj_name + "%s = protobuf.EnumDescriptor();\n"% luasymbol(obj_name) ) - context = Writer(obj_name) + context = Writer(luasymbol(obj_name)) context('.name = "%s"\n' % enum_desc.name) context('.full_name = "%s"\n' % env.get_global_name()) values = [] for i, enum_value in enumerate(enum_desc.value): - values.append(code_gen_enum_item(i, enum_value, env)) + values.append(luasymbol(code_gen_enum_item(i, enum_value, env))) context('.values = {%s}\n' % ','.join(values)) env.context.append(context.getvalue()) env.exit() return obj_name -def code_gen_field(index, field_desc, env): +def code_gen_field(index, field_desc, env,includes): full_name = env.get_local_name() + '.' + field_desc.name obj_name = full_name.upper().replace('.', '_') + '_FIELD' env.descriptor.append( - "local %s = protobuf.FieldDescriptor();\n"% obj_name + "%s = protobuf.FieldDescriptor();\n"% luasymbol(obj_name) ) - context = Writer(obj_name) + context = Writer(luasymbol(obj_name)) context('.name = "%s"\n' % field_desc.name) context('.full_name = "%s"\n' % ( @@ -298,11 +306,29 @@ def code_gen_field(index, field_desc, env): context('.index = %d\n' % index) context('.label = %d\n' % field_desc.label) + finalTypeName = None + enumValueSolver = importedEnumValue + + if field_desc.HasField('type_name'): + #type_name = env.get_ref_name(field_desc.type_name).upper().replace('.', '_') + type_name = env.get_ref_name(field_desc.type_name) + if not type_name.split('.')[0] in [filename+"_pb" for filename in includes]: + type_name = luasymbol(type_name.upper().replace(".","_")) + enumValueSolver = containedEnumValue + + finalTypeName = type_name + if field_desc.type == FDP.TYPE_MESSAGE: + context('.message_type = %s\n' % type_name) + else: + context('.enum_type = %s\n' % type_name) + if field_desc.HasField("default_value"): context('.has_default_value = true\n') value = field_desc.default_value if field_desc.type == FDP.TYPE_STRING: context('.default_value = "%s"\n'%value) + elif field_desc.type == FDP.TYPE_ENUM: + context('.default_value = %s\n'% enumValueSolver(finalTypeName, value)) else: context('.default_value = %s\n'%value) else: @@ -315,17 +341,10 @@ def code_gen_field(index, field_desc, env): default_value = DEFAULT_VALUE[field_desc.type] context('.default_value = %s\n' % default_value) - if field_desc.HasField('type_name'): - type_name = env.get_ref_name(field_desc.type_name).upper().replace('.', '_') - if field_desc.type == FDP.TYPE_MESSAGE: - context('.message_type = %s\n' % type_name) - else: - context('.enum_type = %s\n' % type_name) - if field_desc.HasField('extendee'): type_name = env.get_ref_name(field_desc.extendee) env.register.append( - "%s.RegisterExtension(%s)\n" % (type_name, obj_name) + "%s.RegisterExtension(%s)\n" % (type_name, luasymbol(obj_name)) ) context('.type = %d\n' % field_desc.type) @@ -333,32 +352,33 @@ def code_gen_field(index, field_desc, env): env.context.append(context.getvalue()) return obj_name -def code_gen_message(message_descriptor, env, containing_type = None): +def code_gen_message(message_descriptor, env,includes, containing_type = None): env.enter(message_descriptor.name) full_name = env.get_local_name() obj_name = full_name.upper().replace('.', '_') env.descriptor.append( - "local %s = protobuf.Descriptor();\n"% obj_name + "%s = protobuf.Descriptor();\n"% luasymbol(obj_name) ) - context = Writer(obj_name) + context = Writer(luasymbol(obj_name)) context('.name = "%s"\n' % message_descriptor.name) context('.full_name = "%s"\n' % env.get_global_name()) nested_types = [] for msg_desc in message_descriptor.nested_type: - msg_name = code_gen_message(msg_desc, env, obj_name) - nested_types.append(msg_name) + #msg_name = code_gen_message(msg_desc, env, obj_name) + msg_name = code_gen_message(msg_desc,env,includes,obj_name) + nested_types.append(luasymbol(msg_name)) context('.nested_types = {%s}\n' % ', '.join(nested_types)) enums = [] for enum_desc in message_descriptor.enum_type: - enums.append(code_gen_enum(enum_desc, env)) + enums.append(luasymbol(code_gen_enum(enum_desc, env))) context('.enum_types = {%s}\n' % ', '.join(enums)) fields = [] for i, field_desc in enumerate(message_descriptor.field): - fields.append(code_gen_field(i, field_desc, env)) + fields.append(luasymbol(code_gen_field(i, field_desc, env,includes))) context('.fields = {%s}\n' % ', '.join(fields)) if len(message_descriptor.extension_range) > 0: @@ -368,14 +388,14 @@ def code_gen_message(message_descriptor, env, containing_type = None): extensions = [] for i, field_desc in enumerate(message_descriptor.extension): - extensions.append(code_gen_field(i, field_desc, env)) + extensions.append(luasymbol(code_gen_field(i, field_desc, env,includes))) context('.extensions = {%s}\n' % ', '.join(extensions)) if containing_type: - context('.containing_type = %s\n' % containing_type) + context('.containing_type = %s\n' % luasymbol(containing_type)) env.message.append('%s = protobuf.Message(%s)\n' % (full_name, - obj_name)) + luasymbol(obj_name))) env.context.append(context.getvalue()) env.exit() @@ -404,7 +424,7 @@ def code_gen_file(proto_file, env, is_gen): enum_value.number)) for msg_desc in proto_file.message_type: - code_gen_message(msg_desc, env) + code_gen_message(msg_desc, env,includes) if is_gen: lua = Writer() @@ -412,7 +432,9 @@ def code_gen_file(proto_file, env, is_gen): lua('local protobuf = require "protobuf"\n') for i in includes: lua('local %s_pb = require("%s_pb")\n' % (i, i)) + lua('pcall(function() cc.exports.%s_pb={} end) -- for cocoslua\n' % env.filename) # for cocoslua lua("module('%s_pb')\n" % env.filename) + lua('local %s = {}\n' % _auxtable_) lua('\n\n') map(lua, env.descriptor) From 681014438846c3e17270d7301a5fb6ca73cf9cc2 Mon Sep 17 00:00:00 2001 From: Might Date: Mon, 4 Sep 2017 21:26:17 +0800 Subject: [PATCH 2/3] simplify local variables naming. --- plugin/protoc-gen-lua | 40 +++++++++++++++++++-------------------- plugin/protoc-gen-lua.bat | 1 + 2 files changed, 21 insertions(+), 20 deletions(-) create mode 100644 plugin/protoc-gen-lua.bat diff --git a/plugin/protoc-gen-lua b/plugin/protoc-gen-lua index fe0567b..cf1dc4a 100755 --- a/plugin/protoc-gen-lua +++ b/plugin/protoc-gen-lua @@ -256,12 +256,12 @@ DEFAULT_VALUE = { def code_gen_enum_item(index, enum_value, env): full_name = env.get_local_name() + '.' + enum_value.name - obj_name = full_name.upper().replace('.', '_') + '_ENUM' + obj_name = luasymbol(full_name.upper().replace('.', '_') + '_ENUM') env.descriptor.append( - "%s = protobuf.EnumValueDescriptor();\n"% luasymbol(obj_name) + "%s = protobuf.EnumValueDescriptor();\n"% obj_name ) - context = Writer(luasymbol(obj_name)) + context = Writer(obj_name) context('.name = "%s"\n' % enum_value.name) context('.index = %d\n' % index) context('.number = %d\n' % enum_value.number) @@ -272,18 +272,18 @@ def code_gen_enum_item(index, enum_value, env): def code_gen_enum(enum_desc, env): env.enter(enum_desc.name) full_name = env.get_local_name() - obj_name = full_name.upper().replace('.', '_') + obj_name = luasymbol(full_name.upper().replace('.', '_')) env.descriptor.append( - "%s = protobuf.EnumDescriptor();\n"% luasymbol(obj_name) + "%s = protobuf.EnumDescriptor();\n"% obj_name ) - context = Writer(luasymbol(obj_name)) + context = Writer(obj_name) context('.name = "%s"\n' % enum_desc.name) context('.full_name = "%s"\n' % env.get_global_name()) values = [] for i, enum_value in enumerate(enum_desc.value): - values.append(luasymbol(code_gen_enum_item(i, enum_value, env))) + values.append(code_gen_enum_item(i, enum_value, env)) context('.values = {%s}\n' % ','.join(values)) env.context.append(context.getvalue()) @@ -292,12 +292,12 @@ def code_gen_enum(enum_desc, env): def code_gen_field(index, field_desc, env,includes): full_name = env.get_local_name() + '.' + field_desc.name - obj_name = full_name.upper().replace('.', '_') + '_FIELD' + obj_name = luasymbol(full_name.upper().replace('.', '_') + '_FIELD') env.descriptor.append( - "%s = protobuf.FieldDescriptor();\n"% luasymbol(obj_name) + "%s = protobuf.FieldDescriptor();\n"% obj_name ) - context = Writer(luasymbol(obj_name)) + context = Writer(obj_name) context('.name = "%s"\n' % field_desc.name) context('.full_name = "%s"\n' % ( @@ -344,7 +344,7 @@ def code_gen_field(index, field_desc, env,includes): if field_desc.HasField('extendee'): type_name = env.get_ref_name(field_desc.extendee) env.register.append( - "%s.RegisterExtension(%s)\n" % (type_name, luasymbol(obj_name)) + "%s.RegisterExtension(%s)\n" % (type_name, obj_name) ) context('.type = %d\n' % field_desc.type) @@ -355,12 +355,12 @@ def code_gen_field(index, field_desc, env,includes): def code_gen_message(message_descriptor, env,includes, containing_type = None): env.enter(message_descriptor.name) full_name = env.get_local_name() - obj_name = full_name.upper().replace('.', '_') + obj_name = luasymbol(full_name.upper().replace('.', '_')) env.descriptor.append( - "%s = protobuf.Descriptor();\n"% luasymbol(obj_name) + "%s = protobuf.Descriptor();\n"% obj_name ) - context = Writer(luasymbol(obj_name)) + context = Writer(obj_name) context('.name = "%s"\n' % message_descriptor.name) context('.full_name = "%s"\n' % env.get_global_name()) @@ -368,17 +368,17 @@ def code_gen_message(message_descriptor, env,includes, containing_type = None): for msg_desc in message_descriptor.nested_type: #msg_name = code_gen_message(msg_desc, env, obj_name) msg_name = code_gen_message(msg_desc,env,includes,obj_name) - nested_types.append(luasymbol(msg_name)) + nested_types.append(msg_name) context('.nested_types = {%s}\n' % ', '.join(nested_types)) enums = [] for enum_desc in message_descriptor.enum_type: - enums.append(luasymbol(code_gen_enum(enum_desc, env))) + enums.append(code_gen_enum(enum_desc, env)) context('.enum_types = {%s}\n' % ', '.join(enums)) fields = [] for i, field_desc in enumerate(message_descriptor.field): - fields.append(luasymbol(code_gen_field(i, field_desc, env,includes))) + fields.append(code_gen_field(i, field_desc, env,includes)) context('.fields = {%s}\n' % ', '.join(fields)) if len(message_descriptor.extension_range) > 0: @@ -388,14 +388,14 @@ def code_gen_message(message_descriptor, env,includes, containing_type = None): extensions = [] for i, field_desc in enumerate(message_descriptor.extension): - extensions.append(luasymbol(code_gen_field(i, field_desc, env,includes))) + extensions.append(code_gen_field(i, field_desc, env,includes)) context('.extensions = {%s}\n' % ', '.join(extensions)) if containing_type: - context('.containing_type = %s\n' % luasymbol(containing_type)) + context('.containing_type = %s\n' % containing_type) env.message.append('%s = protobuf.Message(%s)\n' % (full_name, - luasymbol(obj_name))) + obj_name)) env.context.append(context.getvalue()) env.exit() diff --git a/plugin/protoc-gen-lua.bat b/plugin/protoc-gen-lua.bat new file mode 100644 index 0000000..f4430a5 --- /dev/null +++ b/plugin/protoc-gen-lua.bat @@ -0,0 +1 @@ +@python "%~dp0protoc-gen-lua" \ No newline at end of file From 62b2f2e3fa69b7ab390f8555ea055015e7fa2f74 Mon Sep 17 00:00:00 2001 From: Might Date: Fri, 19 Jan 2018 11:49:36 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E8=A1=A5=E5=85=85=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E5=92=8C=E4=BE=9D=E8=B5=96=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + buildc++proto.bat | 11 + buildjavaproto.bat | 11 + buildluaproto.bat | 11 + buildpythonproto.bat | 11 + protoc.exe | Bin 0 -> 4377600 bytes pythonlib/README.txt | 105 + pythonlib/build/lib/google/__init__.py | 1 + .../build/lib/google/protobuf/__init__.py | 0 .../lib/google/protobuf/compiler/__init__.py | 0 .../google/protobuf/compiler/plugin_pb2.py | 184 + .../build/lib/google/protobuf/descriptor.py | 849 +++ .../google/protobuf/descriptor_database.py | 137 + .../lib/google/protobuf/descriptor_pb2.py | 1522 +++++ .../lib/google/protobuf/descriptor_pool.py | 643 ++ .../lib/google/protobuf/internal/__init__.py | 0 .../protobuf/internal/api_implementation.py | 89 + .../google/protobuf/internal/containers.py | 269 + .../google/protobuf/internal/cpp_message.py | 663 ++ .../lib/google/protobuf/internal/decoder.py | 831 +++ .../lib/google/protobuf/internal/encoder.py | 788 +++ .../protobuf/internal/enum_type_wrapper.py | 89 + .../protobuf/internal/message_listener.py | 78 + .../protobuf/internal/python_message.py | 1247 ++++ .../google/protobuf/internal/type_checkers.py | 328 + .../google/protobuf/internal/wire_format.py | 268 + .../build/lib/google/protobuf/message.py | 284 + .../lib/google/protobuf/message_factory.py | 155 + .../build/lib/google/protobuf/reflection.py | 205 + .../build/lib/google/protobuf/service.py | 226 + .../lib/google/protobuf/service_reflection.py | 284 + .../lib/google/protobuf/symbol_database.py | 185 + .../lib/google/protobuf/text_encoding.py | 110 + .../build/lib/google/protobuf/text_format.py | 873 +++ pythonlib/dist/protobuf-2.6.0-py2.7.egg | Bin 0 -> 206800 bytes pythonlib/ez_setup.py | 284 + pythonlib/google/__init__.py | 1 + pythonlib/google/protobuf/__init__.py | 0 .../google/protobuf/compiler/__init__.py | 0 .../google/protobuf/compiler/plugin_pb2.py | 184 + pythonlib/google/protobuf/descriptor.py | 849 +++ .../google/protobuf/descriptor_database.py | 137 + pythonlib/google/protobuf/descriptor_pb2.py | 1522 +++++ pythonlib/google/protobuf/descriptor_pool.py | 643 ++ .../google/protobuf/internal/__init__.py | 0 .../protobuf/internal/api_implementation.cc | 139 + .../protobuf/internal/api_implementation.py | 89 + .../api_implementation_default_test.py | 63 + .../google/protobuf/internal/containers.py | 269 + .../google/protobuf/internal/cpp_message.py | 663 ++ pythonlib/google/protobuf/internal/decoder.py | 831 +++ .../internal/descriptor_database_test.py | 63 + .../protobuf/internal/descriptor_pool_test.py | 564 ++ .../internal/descriptor_pool_test1.proto | 94 + .../internal/descriptor_pool_test1_pb2.py | 467 ++ .../internal/descriptor_pool_test2.proto | 70 + .../internal/descriptor_pool_test2_pb2.py | 259 + .../internal/descriptor_python_test.py | 54 + .../protobuf/internal/descriptor_test.py | 669 ++ pythonlib/google/protobuf/internal/encoder.py | 788 +++ .../protobuf/internal/enum_type_wrapper.py | 89 + .../protobuf/internal/factory_test1.proto | 57 + .../protobuf/internal/factory_test1_pb2.py | 187 + .../protobuf/internal/factory_test2.proto | 92 + .../protobuf/internal/factory_test2_pb2.py | 420 ++ .../protobuf/internal/generator_test.py | 343 + .../internal/message_factory_python_test.py | 54 + .../protobuf/internal/message_factory_test.py | 131 + .../protobuf/internal/message_listener.py | 78 + .../protobuf/internal/message_python_test.py | 54 + .../google/protobuf/internal/message_test.py | 676 ++ .../internal/missing_enum_values.proto | 50 + .../internal/missing_enum_values_pb2.py | 187 + .../protobuf/internal/more_extensions.proto | 58 + .../internal/more_extensions_dynamic.proto | 49 + .../internal/more_extensions_dynamic_pb2.py | 90 + .../protobuf/internal/more_extensions_pb2.py | 179 + .../protobuf/internal/more_messages.proto | 51 + .../protobuf/internal/more_messages_pb2.py | 101 + .../protobuf/internal/python_message.py | 1247 ++++ .../protobuf/internal/reflection_test.py | 2934 ++++++++ .../internal/service_reflection_test.py | 136 + .../protobuf/internal/symbol_database_test.py | 120 + .../internal/test_bad_identifiers.proto | 52 + .../internal/test_bad_identifiers_pb2.py | 158 + .../google/protobuf/internal/test_util.py | 662 ++ .../protobuf/internal/text_encoding_test.py | 68 + .../protobuf/internal/text_format_test.py | 736 ++ .../google/protobuf/internal/type_checkers.py | 328 + .../protobuf/internal/unknown_fields_test.py | 231 + .../google/protobuf/internal/wire_format.py | 268 + .../protobuf/internal/wire_format_test.py | 253 + pythonlib/google/protobuf/message.py | 284 + pythonlib/google/protobuf/message_factory.py | 155 + pythonlib/google/protobuf/pyext/README | 6 + pythonlib/google/protobuf/pyext/__init__.py | 0 .../google/protobuf/pyext/cpp_message.py | 61 + pythonlib/google/protobuf/pyext/descriptor.cc | 357 + pythonlib/google/protobuf/pyext/descriptor.h | 96 + .../protobuf/pyext/descriptor_cpp2_test.py | 58 + .../google/protobuf/pyext/extension_dict.cc | 338 + .../google/protobuf/pyext/extension_dict.h | 123 + pythonlib/google/protobuf/pyext/message.cc | 2561 +++++++ pythonlib/google/protobuf/pyext/message.h | 305 + .../pyext/message_factory_cpp2_test.py | 56 + .../protobuf/pyext/proto2_api_test.proto | 38 + pythonlib/google/protobuf/pyext/python.proto | 66 + pythonlib/google/protobuf/pyext/python_pb2.py | 218 + .../google/protobuf/pyext/python_protobuf.h | 57 + .../pyext/reflection_cpp2_generated_test.py | 94 + .../pyext/repeated_composite_container.cc | 763 +++ .../pyext/repeated_composite_container.h | 172 + .../pyext/repeated_scalar_container.cc | 825 +++ .../pyext/repeated_scalar_container.h | 112 + .../protobuf/pyext/scoped_pyobject_ptr.h | 95 + pythonlib/google/protobuf/reflection.py | 205 + pythonlib/google/protobuf/service.py | 226 + .../google/protobuf/service_reflection.py | 284 + pythonlib/google/protobuf/symbol_database.py | 185 + pythonlib/google/protobuf/text_encoding.py | 110 + pythonlib/google/protobuf/text_format.py | 873 +++ .../protobuf/unittest_custom_options_pb2.py | 1642 +++++ .../google/protobuf/unittest_import_pb2.py | 104 + .../protobuf/unittest_import_public_pb2.py | 69 + .../google/protobuf/unittest_mset_pb2.py | 281 + .../unittest_no_generic_services_pb2.py | 99 + pythonlib/google/protobuf/unittest_pb2.py | 5926 +++++++++++++++++ .../EGG-INFO/PKG-INFO | 10 + .../EGG-INFO/SOURCES.txt | 44 + .../EGG-INFO/dependency_links.txt | 1 + .../EGG-INFO/entry_points.txt | 6 + .../EGG-INFO/namespace_packages.txt | 1 + .../EGG-INFO/not-zip-safe | 1 + .../EGG-INFO/requires.txt | 3 + .../EGG-INFO/top_level.txt | 1 + .../google/__init__.py | 7 + .../google/apputils/__init__.py | 7 + .../google/apputils/app.py | 379 ++ .../google/apputils/appcommands.py | 805 +++ .../google/apputils/basetest.py | 1644 +++++ .../google/apputils/datelib.py | 525 ++ .../google/apputils/debug.py | 63 + .../google/apputils/file_util.py | 252 + .../google/apputils/humanize.py | 507 ++ .../google/apputils/resources.py | 67 + .../google/apputils/run_script_module.py | 217 + .../google/apputils/setup_command.py | 159 + .../google/apputils/shellutil.py | 50 + .../google/apputils/stopwatch.py | 204 + pythonlib/mox.py | 1401 ++++ pythonlib/protobuf.egg-info/PKG-INFO | 10 + pythonlib/protobuf.egg-info/SOURCES.txt | 35 + .../protobuf.egg-info/dependency_links.txt | 1 + .../protobuf.egg-info/namespace_packages.txt | 1 + pythonlib/protobuf.egg-info/requires.txt | 1 + pythonlib/protobuf.egg-info/top_level.txt | 1 + pythonlib/python_dateutil-2.4.2-py2.7.egg | Bin 0 -> 234832 bytes pythonlib/python_gflags-2.0-py2.7.egg | Bin 0 -> 73738 bytes pythonlib/pytz-2015.4-py2.7.egg | Bin 0 -> 476270 bytes pythonlib/setup.py | 200 + pythonlib/setuptools-0.6c11-py2.7.egg | Bin 0 -> 332005 bytes .../six-1.9.0-py2.7.egg/EGG-INFO/PKG-INFO | 32 + .../six-1.9.0-py2.7.egg/EGG-INFO/SOURCES.txt | 15 + .../EGG-INFO/dependency_links.txt | 1 + .../six-1.9.0-py2.7.egg/EGG-INFO/not-zip-safe | 1 + .../EGG-INFO/top_level.txt | 1 + pythonlib/six-1.9.0-py2.7.egg/six.py | 838 +++ pythonlib/stubout.py | 140 + 168 files changed, 53775 insertions(+) create mode 100644 buildc++proto.bat create mode 100644 buildjavaproto.bat create mode 100644 buildluaproto.bat create mode 100644 buildpythonproto.bat create mode 100644 protoc.exe create mode 100644 pythonlib/README.txt create mode 100644 pythonlib/build/lib/google/__init__.py create mode 100644 pythonlib/build/lib/google/protobuf/__init__.py create mode 100644 pythonlib/build/lib/google/protobuf/compiler/__init__.py create mode 100644 pythonlib/build/lib/google/protobuf/compiler/plugin_pb2.py create mode 100644 pythonlib/build/lib/google/protobuf/descriptor.py create mode 100644 pythonlib/build/lib/google/protobuf/descriptor_database.py create mode 100644 pythonlib/build/lib/google/protobuf/descriptor_pb2.py create mode 100644 pythonlib/build/lib/google/protobuf/descriptor_pool.py create mode 100644 pythonlib/build/lib/google/protobuf/internal/__init__.py create mode 100644 pythonlib/build/lib/google/protobuf/internal/api_implementation.py create mode 100644 pythonlib/build/lib/google/protobuf/internal/containers.py create mode 100644 pythonlib/build/lib/google/protobuf/internal/cpp_message.py create mode 100644 pythonlib/build/lib/google/protobuf/internal/decoder.py create mode 100644 pythonlib/build/lib/google/protobuf/internal/encoder.py create mode 100644 pythonlib/build/lib/google/protobuf/internal/enum_type_wrapper.py create mode 100644 pythonlib/build/lib/google/protobuf/internal/message_listener.py create mode 100644 pythonlib/build/lib/google/protobuf/internal/python_message.py create mode 100644 pythonlib/build/lib/google/protobuf/internal/type_checkers.py create mode 100644 pythonlib/build/lib/google/protobuf/internal/wire_format.py create mode 100644 pythonlib/build/lib/google/protobuf/message.py create mode 100644 pythonlib/build/lib/google/protobuf/message_factory.py create mode 100644 pythonlib/build/lib/google/protobuf/reflection.py create mode 100644 pythonlib/build/lib/google/protobuf/service.py create mode 100644 pythonlib/build/lib/google/protobuf/service_reflection.py create mode 100644 pythonlib/build/lib/google/protobuf/symbol_database.py create mode 100644 pythonlib/build/lib/google/protobuf/text_encoding.py create mode 100644 pythonlib/build/lib/google/protobuf/text_format.py create mode 100644 pythonlib/dist/protobuf-2.6.0-py2.7.egg create mode 100644 pythonlib/ez_setup.py create mode 100644 pythonlib/google/__init__.py create mode 100644 pythonlib/google/protobuf/__init__.py create mode 100644 pythonlib/google/protobuf/compiler/__init__.py create mode 100644 pythonlib/google/protobuf/compiler/plugin_pb2.py create mode 100644 pythonlib/google/protobuf/descriptor.py create mode 100644 pythonlib/google/protobuf/descriptor_database.py create mode 100644 pythonlib/google/protobuf/descriptor_pb2.py create mode 100644 pythonlib/google/protobuf/descriptor_pool.py create mode 100644 pythonlib/google/protobuf/internal/__init__.py create mode 100644 pythonlib/google/protobuf/internal/api_implementation.cc create mode 100644 pythonlib/google/protobuf/internal/api_implementation.py create mode 100644 pythonlib/google/protobuf/internal/api_implementation_default_test.py create mode 100644 pythonlib/google/protobuf/internal/containers.py create mode 100644 pythonlib/google/protobuf/internal/cpp_message.py create mode 100644 pythonlib/google/protobuf/internal/decoder.py create mode 100644 pythonlib/google/protobuf/internal/descriptor_database_test.py create mode 100644 pythonlib/google/protobuf/internal/descriptor_pool_test.py create mode 100644 pythonlib/google/protobuf/internal/descriptor_pool_test1.proto create mode 100644 pythonlib/google/protobuf/internal/descriptor_pool_test1_pb2.py create mode 100644 pythonlib/google/protobuf/internal/descriptor_pool_test2.proto create mode 100644 pythonlib/google/protobuf/internal/descriptor_pool_test2_pb2.py create mode 100644 pythonlib/google/protobuf/internal/descriptor_python_test.py create mode 100644 pythonlib/google/protobuf/internal/descriptor_test.py create mode 100644 pythonlib/google/protobuf/internal/encoder.py create mode 100644 pythonlib/google/protobuf/internal/enum_type_wrapper.py create mode 100644 pythonlib/google/protobuf/internal/factory_test1.proto create mode 100644 pythonlib/google/protobuf/internal/factory_test1_pb2.py create mode 100644 pythonlib/google/protobuf/internal/factory_test2.proto create mode 100644 pythonlib/google/protobuf/internal/factory_test2_pb2.py create mode 100644 pythonlib/google/protobuf/internal/generator_test.py create mode 100644 pythonlib/google/protobuf/internal/message_factory_python_test.py create mode 100644 pythonlib/google/protobuf/internal/message_factory_test.py create mode 100644 pythonlib/google/protobuf/internal/message_listener.py create mode 100644 pythonlib/google/protobuf/internal/message_python_test.py create mode 100644 pythonlib/google/protobuf/internal/message_test.py create mode 100644 pythonlib/google/protobuf/internal/missing_enum_values.proto create mode 100644 pythonlib/google/protobuf/internal/missing_enum_values_pb2.py create mode 100644 pythonlib/google/protobuf/internal/more_extensions.proto create mode 100644 pythonlib/google/protobuf/internal/more_extensions_dynamic.proto create mode 100644 pythonlib/google/protobuf/internal/more_extensions_dynamic_pb2.py create mode 100644 pythonlib/google/protobuf/internal/more_extensions_pb2.py create mode 100644 pythonlib/google/protobuf/internal/more_messages.proto create mode 100644 pythonlib/google/protobuf/internal/more_messages_pb2.py create mode 100644 pythonlib/google/protobuf/internal/python_message.py create mode 100644 pythonlib/google/protobuf/internal/reflection_test.py create mode 100644 pythonlib/google/protobuf/internal/service_reflection_test.py create mode 100644 pythonlib/google/protobuf/internal/symbol_database_test.py create mode 100644 pythonlib/google/protobuf/internal/test_bad_identifiers.proto create mode 100644 pythonlib/google/protobuf/internal/test_bad_identifiers_pb2.py create mode 100644 pythonlib/google/protobuf/internal/test_util.py create mode 100644 pythonlib/google/protobuf/internal/text_encoding_test.py create mode 100644 pythonlib/google/protobuf/internal/text_format_test.py create mode 100644 pythonlib/google/protobuf/internal/type_checkers.py create mode 100644 pythonlib/google/protobuf/internal/unknown_fields_test.py create mode 100644 pythonlib/google/protobuf/internal/wire_format.py create mode 100644 pythonlib/google/protobuf/internal/wire_format_test.py create mode 100644 pythonlib/google/protobuf/message.py create mode 100644 pythonlib/google/protobuf/message_factory.py create mode 100644 pythonlib/google/protobuf/pyext/README create mode 100644 pythonlib/google/protobuf/pyext/__init__.py create mode 100644 pythonlib/google/protobuf/pyext/cpp_message.py create mode 100644 pythonlib/google/protobuf/pyext/descriptor.cc create mode 100644 pythonlib/google/protobuf/pyext/descriptor.h create mode 100644 pythonlib/google/protobuf/pyext/descriptor_cpp2_test.py create mode 100644 pythonlib/google/protobuf/pyext/extension_dict.cc create mode 100644 pythonlib/google/protobuf/pyext/extension_dict.h create mode 100644 pythonlib/google/protobuf/pyext/message.cc create mode 100644 pythonlib/google/protobuf/pyext/message.h create mode 100644 pythonlib/google/protobuf/pyext/message_factory_cpp2_test.py create mode 100644 pythonlib/google/protobuf/pyext/proto2_api_test.proto create mode 100644 pythonlib/google/protobuf/pyext/python.proto create mode 100644 pythonlib/google/protobuf/pyext/python_pb2.py create mode 100644 pythonlib/google/protobuf/pyext/python_protobuf.h create mode 100644 pythonlib/google/protobuf/pyext/reflection_cpp2_generated_test.py create mode 100644 pythonlib/google/protobuf/pyext/repeated_composite_container.cc create mode 100644 pythonlib/google/protobuf/pyext/repeated_composite_container.h create mode 100644 pythonlib/google/protobuf/pyext/repeated_scalar_container.cc create mode 100644 pythonlib/google/protobuf/pyext/repeated_scalar_container.h create mode 100644 pythonlib/google/protobuf/pyext/scoped_pyobject_ptr.h create mode 100644 pythonlib/google/protobuf/reflection.py create mode 100644 pythonlib/google/protobuf/service.py create mode 100644 pythonlib/google/protobuf/service_reflection.py create mode 100644 pythonlib/google/protobuf/symbol_database.py create mode 100644 pythonlib/google/protobuf/text_encoding.py create mode 100644 pythonlib/google/protobuf/text_format.py create mode 100644 pythonlib/google/protobuf/unittest_custom_options_pb2.py create mode 100644 pythonlib/google/protobuf/unittest_import_pb2.py create mode 100644 pythonlib/google/protobuf/unittest_import_public_pb2.py create mode 100644 pythonlib/google/protobuf/unittest_mset_pb2.py create mode 100644 pythonlib/google/protobuf/unittest_no_generic_services_pb2.py create mode 100644 pythonlib/google/protobuf/unittest_pb2.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/PKG-INFO create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/SOURCES.txt create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/dependency_links.txt create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/entry_points.txt create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/namespace_packages.txt create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/not-zip-safe create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/requires.txt create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/top_level.txt create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/__init__.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/__init__.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/app.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/appcommands.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/basetest.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/datelib.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/debug.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/file_util.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/humanize.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/resources.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/run_script_module.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/setup_command.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/shellutil.py create mode 100644 pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/stopwatch.py create mode 100644 pythonlib/mox.py create mode 100644 pythonlib/protobuf.egg-info/PKG-INFO create mode 100644 pythonlib/protobuf.egg-info/SOURCES.txt create mode 100644 pythonlib/protobuf.egg-info/dependency_links.txt create mode 100644 pythonlib/protobuf.egg-info/namespace_packages.txt create mode 100644 pythonlib/protobuf.egg-info/requires.txt create mode 100644 pythonlib/protobuf.egg-info/top_level.txt create mode 100644 pythonlib/python_dateutil-2.4.2-py2.7.egg create mode 100644 pythonlib/python_gflags-2.0-py2.7.egg create mode 100644 pythonlib/pytz-2015.4-py2.7.egg create mode 100644 pythonlib/setup.py create mode 100644 pythonlib/setuptools-0.6c11-py2.7.egg create mode 100644 pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/PKG-INFO create mode 100644 pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/SOURCES.txt create mode 100644 pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/dependency_links.txt create mode 100644 pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/not-zip-safe create mode 100644 pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/top_level.txt create mode 100644 pythonlib/six-1.9.0-py2.7.egg/six.py create mode 100644 pythonlib/stubout.py diff --git a/.gitignore b/.gitignore index a9fa24a..110ef0d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ +*.luac *.pyc *.so +*.lua diff --git a/buildc++proto.bat b/buildc++proto.bat new file mode 100644 index 0000000..ceb5f51 --- /dev/null +++ b/buildc++proto.bat @@ -0,0 +1,11 @@ +@echo off + +set protoPath=..\proto +set luascriptPath=..\luascript + +for %%i in (%protoPath%\*.proto) do ( + echo %%i + protoc.exe --proto_path=%protoPath% --cpp_out=%luascriptPath% %%i +) + +pause diff --git a/buildjavaproto.bat b/buildjavaproto.bat new file mode 100644 index 0000000..acb95e2 --- /dev/null +++ b/buildjavaproto.bat @@ -0,0 +1,11 @@ +@echo off + +set protoPath=..\proto +set luascriptPath=..\luascript + +for %%i in (%protoPath%\*.proto) do ( + echo %%i + protoc.exe --proto_path=%protoPath% --java_out=%luascriptPath% %%i +) + +pause diff --git a/buildluaproto.bat b/buildluaproto.bat new file mode 100644 index 0000000..9c1929a --- /dev/null +++ b/buildluaproto.bat @@ -0,0 +1,11 @@ +@echo off + +set protoPath=%~dp0..\proto +set luascriptPath=%~dp0..\luascript + +for %%i in (%protoPath%\*.proto) do ( + echo %%i + %~dp0protoc.exe --plugin=protoc-gen-lua="%~dp0plugin\protoc-gen-lua.bat" --proto_path=%protoPath% --lua_out=%luascriptPath% %%i +) + +pause diff --git a/buildpythonproto.bat b/buildpythonproto.bat new file mode 100644 index 0000000..7cac80d --- /dev/null +++ b/buildpythonproto.bat @@ -0,0 +1,11 @@ +@echo off + +set protoPath=..\proto +set luascriptPath=..\luascript + +for %%i in (%protoPath%\*.proto) do ( + echo %%i + protoc.exe --proto_path=%protoPath% --python_out=%luascriptPath% %%i +) + +pause diff --git a/protoc.exe b/protoc.exe new file mode 100644 index 0000000000000000000000000000000000000000..9f6cb3f3d6c5ffad60a4b2c99be0b421c14b5266 GIT binary patch literal 4377600 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

Rx*D~orkoPpA@Ey;dm78Gm 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

87HolP69nEEvbbFrJx3 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 z

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%0Dx(Bj|0AX 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%0DA>vh{*OD{f-h|puHdJ??JF%VzW7&M;!~-_J3+}t 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

^4g9Uc+S5u zl)RDwCi_B;2m4yl3_Ex}UoR5k`)LZk+aO@4+v4Jo4vaTTi+- zOOydE*!Gm~VTl|2W=a(i20!l497z41?Udh>CVnCPF-;kBIX+;or&Ubq8k_1G7cByZ z_q{z$$+Gg>`m}0g%XYwd(zl9k`d zrySTDXXQ7`3BS{rYiRQ4bSM1wTlvL0;kVt&Z%JPV`28RD-aXEy>i-{~8wL}DQBzGQ z5|JjiTq@%-8luh!QIdNTk}|F#)6B?mOi}5rn-WT@cS2=E4F)4BmEKXxC246UDHBu4 z{GPA1_S$Fd%em}xX5Np_@9};AVeGT_TCeqbK3}i(T5GSpE`?Tk!^4rc-YTz7IPz9l zEel6pX`D6wg(L5nRbFH`^7dKfy)!Zl{tB(~hKD0> zy;WYFaOAD9%G)v`47^WUUMKI;>r-AZcHN}#@t&{xKrdsls4slTaPuBeF zo#fv+%~F1*ll-qux8!f@B>!VGEcr|C3JO2QU&sEbO&HfKw^7R}#smV`5Bcvj<)7g& ze{WO%P7d>TGUfm4PPG{itpC-f{2LwSzr>V(hQs_dO!+%G%>P%J(SCmoc833FQ~r$( z^M7N?Kf_`Ek4^bIIn2M&l>e_m&hW1`<=^Nq|8u7NGaTlhZ_3}vVg4DW{D0ly4F6bD z{*4av-)YJ}!(sm3ru>~8=I><6|JOig_^&qQ-{>&^C8qo{9OkcK%HPRh{=d$e>i+;| z_Ct}6GnfzzJlfb)GtK5KJ@!n1f+VxxWUs9<^3 zDp=n8t}yvKX2g4M1?CokD27{!8@?;_iHg#2WM!c zu$yWa&qujQ2y%G72c5@}!lL>Z*Qfp7R|hFx<@jITz6GgY0&7*%sNYf{GX(t-*efRe z`uWli>*sD&=dUrHP1@@u9~;g4oxeuw*#_e933holj?C*@(y?o!$wS5_vEIGPXuXA4 zWvxxX%HB*%ts^q)iPhHZ-`M*_Y^hRQV<+EQ1%+YC7ZvR0ORMG7zrH0NewLg&y%C+s zp3=y?p$hG)igA$feT-HB|G+mpOnf`A+b`?-sD>|r;~Se67~iMwJI9y6@g?}cx8N2# zeE$v;-@xl>wjj;~&5QuHWcK*YfwA=~rX{Lmso-sw$+2bnz_tdjCNw8VsXp3%INyhf zZwGb@=lGfkeE;ql7~k*TImg$8<7?sr-(J)RdwjJ9EAvM~sDJGxz662q)6^jF9deG( zzi*yGjj+deQ<(T(rNeE=Ka&Yx2X?YY5crNb$Cu3Qm+ZrS@jmfQ2ov9h8omv4DE>{p zXKW8vGYE)Xjys09h)N)obNGd6S1K)tUWMwf8B)a0rD5Wmi}=aymn8hNRrkR5`{IOS zaOp|hen~#;=R&Qw_s>tm#CL`cdm{hT;>)ew0^{rUi*tPbK!117x+ zO~+|DIbG#xIrl?waT@I}nHGyJ-pf4QVzU`-=Um3t&ce4Z{vi8AQhMHET9m|hfPcLP z|0vck8@pZ0=g8{rZP*3Ap02W9cj{jR70tZ;jCHYN9q0f? z+TE;-m8G2*o0iqi!8VY1+rjff@f?p^bdA|k7Ujk(5Xc5KuGr4$ag%F|jijuiR2qbj#%kLJ2Hw;&f;v-n=S5+AlL zu^lfFdXG03)L0hOO%(KPGfP37RpJb+9&Bf0pCI^Le~DbJUB*`3tn-;A`FvVD55(t- zOYQi);~^8DWCtUSqpENk`!=zlD;{b`V_VyTPCiHl@$RCKud^2;~3TA$D0H5ml?zP+uY8A&z`>=+k(FL$zOty|6O~F ze3ieUZ9?TQ;W96OEY-?isn|^`5Pvt?!n!^%e>u^dzqhRT?D^Y=T??&-`qU?XO@#bU zuJ_AdgVv$)7o+bsR>op&_&X*x8Vkf9ZMbNKbyZ;go{r-Dy=cW}&tDVUfB*utu2=8ygHlwO>vA$cQ$6PalRYTq7zfIa7} z7F(TX~ zU1MY~`1W{(;*Zn1>ip%&{!EVQkI&{O;r`h_eUP}}Svwc`0@%i-mf+)0S#;MJ7kl(c z%_aF;fGaPLx`=!$lnv)Omy3FPu_pQJBBt4vH$uAP#j+r2G~Fd{69qN17NnAz-$EfZ zSbxls8>PV?=cVX;>h*h+crN|1st+pv!R}Gk+V(z&Rq9a=N6g*iB4ueQP5r1f>bicV|uYVf*mZM>%YMP5Ze38{tJrb`-|?MPmAY* z&j9{elvZp*>e^1l2LC*IoAwH0@y}J~@u8-OExPuECMJ7}U;i9rTV6Mm$6vjs%YrQa z*+mr8%vz92>BY?zN;#j$P&>u@U=qC#cEnHReK3z7qQ+mw8mxnRVKZlbzycj-#gAIx zkG75aQ=FSX!tkQBu9;Gb_Z8b&d9{3(SMNS!dEG0byz^^);v0FtvAi#@ssMZ^eV4cH zL1TF%E26xceDfKNHDugNH2a-yS^@Z4`7ZBvthrLl%l1=Vq43YV%{P#HUgvesWu+-u z5!g%!|LWw@!vp*;3N$INPv0* z8OBTKT(Ls;O4`AR*Mw)!otB4me_98d2+}59lX0OP+`alvzV8^vPJ&Ta9=lTKn(G^2 z{0!qPv2IMDOD)@p{QUE?t})N=Oy7=2bbT90eYeN!`u;W8qVLyDjQVI_5i zJq8qXj?KK8S|&sfVoL0Icwz{HHAFgY2g(3p<&AY*GGYZGk5B<$TEf&?Qt%t)$IFW^ zs{J0{c&`ix|FuX@;A4{)Oe_{&ua%gml^AP0FK&)^en5IwiPs%Cy_g%Ohv#LPIG(4? zc2{0%>8RznAK@N-%H5ZF`ZD&)RS^*#Q)4GxOg|RmM+=UcG54hN@@lS`2QX}1hf`K=w>nY&VuuD<2{-1CU1fP3}dq{*5?c@rHm`S zi04PAb!-F{xE{ZvtbD`8bq7am)8>B`SJNkgGFH}9E5^fx+J%E9$LUB^!uK3*^kdt(0R%N4-yqtIICcQSrR zeqYDil+N!EJh1RP^>@K<7YUs6d&Fbmw}Cf-#_#w)6n;NKN0#$D_j2$%y`B$#_h0Fc z-@VAjRyOj(FT+EX-~GrT`8|efE58L5!0!lXt@AqoKP11q(6`k2y#Ws_{NDSU;J2X! z&iSol<@bCO-N7|}7nCaeHkAA}1p^xnB>3QWgOp*I&yx4O#jxhrh=z4=$c?;$+&#@`3AW2A}S54{OAe)s&Y@O$WA8oy&e&xU6& z^1<&kDaDrGQ^>}0ll<^ogoi4>Wym4@l20cG&7;AOFI6vw<7UPPN9QJ>V`+rjB#&`b<@7&p2hOvH^ z7&~8&in6WWD``E8*I%+qyuD3YtYGMETDwE&CSyIz@kq>1Lk!$=ToKOWF7x!L5u06< zlF#paj#yCU?oo%{FHi}DBL>m`x5$gCV0n!ySYAcz7gNFdMgC7-SpN5aoxh6qzlxQ2 z!5oAKpC0Hu9#piv?4pXUZxt)=f(SGg70F*jRE5gRE{gT3T~PDCEb+c#`Kx&QR&f1@ zKx^rfLFe@&yQre$RYlu3-X~h_FX*5CJIwx7`!XCz@lLANzY^<_zo{9xe|6Kt&ihwb z^GOr9&_7LJBY*bUzdBtj)czI8XHA+%(tg$atkcO&J@t#|81b!uf$e4&f z<@FbIlM_92s5o?NXJR)U*|DWH5_-pWq)&ao|My|?f4pi*IlHch#(zBT-`WR2E1dd2gdv9wD9mYxXUNr z>^MJoZweFdjz54my_*5=jM%_Z&-d1<|#QPMgxA9e5zW>3#6T-yXl<*GkYQQ_c zT41~)Q_Z~xuTr$5(2_)rb& z#T$%2*9RckO{Jymy1#5fEmg$^Pn zig@wCe?JV?WnwzJ;?QA?2iaz{#=Lo-!{+HhG_vrrupO~th5-V29Y7LFE_UV85D~dn;q!VF)AnT9hU#=9;jp#7{mNNb1 znvlxJN^8AnF2Hg5|I4p@-4E(}5AR<4t-pcyhY=f*Y5SSv-~*#+KNEf{n2l+Ivv+nu zBh5{MOYeL?t`t>%0RUmXkIjA`rJmGyd~Cpx)mSZ3UjLXr-v9KOv!Vk{c`@}m2fy|H zchK^fF0Y44URzaOfc`wif4SLIuzbk_w1Q1f?`Ar_AoOwaK0^8@Ign5Duaa0lj1eP~ z{^lC>ht`GBTBhLRlaLo>lDD=r9C^*y+ESx_Bf^rG%tn~x)eTEt602*HxAk;5c$3&x z3@NDgcqmMH51Hg$5wbk~{tcf=U?0A1oG7?cei#x|@jfbKS?B)+et+j1 zQqUf4v)?rDr_$1-VX*bpX?<$Tp8VB_XYFsH`UC1SEptJ;vonQerqN8lohh;URh)hm zuU{o-S36P?Dfy0+i$yM4(Dw+>-$+l}1XnTqUNc-p@vD~FQ_lrAL}x{~)39?c%EUIW zTIn756$YFxZB~^etClM|<@JK#_}xj;NDKkRD(TeN=+roxeb<#xqrGsa#c>4!0pv+B zLIhnKX(D%~gpQBnLYUsFuEz=Ne^`fgY~VC{A?0HLY5)z653CfA?km=RlVPygQ48&- z_MWHLFfQ*Lpo;mmF*F0V3w|o=HNh$CzWaE&wnRAIQwnB1-5Qne?Oe)|em#o^hp}U6 zbn0PRnwHKE)S;tQK|F>b^Dg7ZtVXAnxKsBbW9mMnDf86f5}I)d-<%`~MV{267ODF> zrykC{T3l)g)xzFJQrteA&c4F?E|vwYiR6Am`lHQXh{r^BOoW#);KTT2lcCD@lRn5R z(5^ZUw6`m0wfVm8)Kkg|sJ?7xZV^%<9bAlgI00Cl6wlSa6ov9x37J(+yoVHRzL>Z8 zBcw)3SH`KwACAb&BU01Z)@ZJ>J9j-jT}*%7i`U?mU3&HFaH^1=Y(X;f7y%6E4 ze?t_X?$9rz$AX6=#zyDm?ZZQM4<>TEbKk_JhyQiw5+cY0!U#_uDV@D5%FQo4dGw6M zHO0VM5v$**tlX8CM~bq1EEkbFEarKRMrGE`UP+h#XeFg$$pg{=2#Vrq4oAu~=LJF* zzYBw@Jhn5o@*gBLOjP#tJ=NwDcG)jy%d-jxK|k2*aEUK_y`O9zA0p(1O7twjTe1P%4IHC}b_>d5&_j=n`b{l1gcfLux#h z5=af}k%rUqpkX8Yks3yOO}>JP8;|+ewi*hP3k_j%y3jPdSZG*RXh_Ad9az61&8ca~ zO-{LBa$ZtDXxOG;UT#C&%VP7aqXOX-%cYM4fxFMjFQS;Dwx}#f>>V zB#ZU(7Or{MPqZMx##?^HSy)+xON6(q#Scq36yxLG1&stCUtQ3strty;?c6tZR@F8I z#g`Q00~T$i!B@QUmY%)#7syI2;jx5d!8dz|(hRYLqKb$oCsqIKA^npoY<@cO`}I$X z21pZ;*LN@bbifJeT^WNYR^Z-@zi3&1oQtj};5uWN_Fy9d%DH& zF!b~ZL{Sl1@_1rZ+9AbH9VjnDD8N<$6mS>6p zau83l3SGh_UcwJ@iM(DkM>L`lvhIaw+8m@Mt{)mbY4Z3?r7;lpQy0M6`O8keKLMF2 zBc5Uf^dAl^VpmrlpZS90RBB4I3N?R85UTj_m-hE4?N3|jF9o0}zc0%1<1f@^l9R@f zwc|Y9lDIuy{Yh(dCRb}+aN=`_fX9f2328*b^r%czJNMs6Kvnr`6bLEl884I37t>~a z{n*tA)o4oHxqIj-|0`M`J?s_XLAs}YG7p(DAVuZnaWj9LK()V+=cT{yT!O_NFORO+ zYD6qVMk<@#ifiG3Jnyd;>0u}@kF;TXwjM8UT~Hjg2D|;0j&ffB#Uln&KZv&;hmMo+ zQ-twf!4KPbfc8E^Fg!sMbD=8 zdwX-g$h?$NUGrCow(n%z&RmjDen@M~=^B?2^EpfN@`~|Wclq@!wOZAP`MGpcczw)m z@cM~ATD?B2u#tef4i6Pyk3)v_VC)8zk%;U2CQO`6uFm^&1-NNHexi6u9QULlBvymX zZsV>X{F-DS4&I;@D|=KT{w)cg-^O^|4b1N+Wufu=V-+L6qg>!O{+J(rZ^uK0-|@&G z`JIOAQ29Og1H{_a;iGuMBZ$WI7nD*i6OwcX_5C-sjC(Cx_&3#LVLloXg860%q292> z{UhLb5d|DR#K!OfOwoZWs>y7w$>i@e!XJuMe;|hy{cGx^=BGgut-=kqT~CMjme+R` zYmN7J-65#?Tg7gxSrvN-tb#V!{{>=1Kl>_rwEhe^2Gzqv`dPnf)rj1J$*6=>rmTc? zjcllCbTu#c5dP|wa1|?vCMThrq7u&Q2PY{$V&^0+MI~%?l-mfeb5z7aq+g}g!545n zYV^nlMvZ>R(BK5kH(s1lIM)XIZH6{*iV*A<%bwVLTx=GSi2Z+D>?k@pCQII9mM;4@ zWffr05g5PF>?v*dE2tJWMDSe2PL)ap}J7 z3Y`0Gsvlj<(q;V^Q~~zvR-)U}NB!9Qo3x>``oYduF~qfDcffA-zVl3sWI;r|Bi*MnX~C_jG{p$ol9 zC}e#$D6b+b27$M4zqRrvdZXz8l~ougT80FH5P@3k8S^Ic7NTvScaaUaeqeGY@1P0% z8!8n4%@+Jk;ae*H_6q*)e(}Gr;vY=-zwwD5%y{wRhwvZ`Kl1AMajoFbDhafoW|?@E z(FYmdhYo!7F|KoJ$*dT>Al!+!A{ur?&x%GJjU$Tlc=CN1Y;2Kw7&&M}kuJ4_>WJdq zNQ&Df=`0&(WTX0PBZ{OU{Pre1CRF}-%>K;q(li!VOOablm8-um+2IC;<*#nyX zCENwm&@w{#>{*8+G6&g1*v@kV1>rd)6%Yzwbq=9;X7LR2^^ZpX!iQG1{-1wLZ}ybt0ZbpaSOOm>u0ZzWbkhS?fQmMCkn$ z8n!55wPD?PxiqGyhlssw{$CVb>89v477RfxdG~8;Ey*gR$OaP1@KCKAMaV(p6!eW{ zAFfAF@b()8p8ms?{zAo$SC4}-q7N2eyt=Na5TT7%rfYm8jaz2eX<*MxbHs{=d>~FmiVDY z1Yxhj%Cpx8Uj=Ee5jfNv^)EDgb+ENpIp#n+wAY)o%&>^P3;w0O1`Auj*&}?~>qo2> z2xPA{Yk1p)n#tH?8nLw*A=5cN*>Hns7Q0PnwuKijYM#-IEjjq#_sDpuIP zOtpWA@n>zRCH}mG@fb_|sd2^_e^Q1c{e?$g!0A5ds~ zp0&WtY_#aGwu%LetxYc@g%Z_$F4`7@xg)0?~@ZkAxK;_}pqm(bxPD zPqGTF+PZIwg>hWBaqO9 zp{&9Jh(rt4UX&>M?^z`WahLc1o1i51xHRgO<#xbLPagdhTXSY_Zi(xNOuii_U9z8! z(6SB6OhcvgKLm>T*CZMRZr{rx^7RjRUwB;gN4@k!WK>JHwC*@%{Ma6C6$urrwHi_( zoHEYUNxOm6A!&x)LHQm1cyc_2$MB7c4RI%{koJ#)%5|m6-e7|(#D}bsb4Ve2Br%YZ z-vvKS{l&C6e4m_7t;i2j)$j?8_VALReFru#pgKSZhEZSB_@2}I?nBa=CSC<(bO0G ze^|^6@$}v2P7`;EFfD{WE+_+R++Lc8VSiq;gUkLsxOT;KPLG`>h@%sPJW-ywdD`J_ zWPq6L0y?tD-8Dv>4cLzrY@)s1V(8@ss>_p&>I!VxTO!kOlkG;#XHynNMrhM5(qi#M zY?#gyYDEnwaVN|ZH{^4$AU2`P3|0HT ziZA(tAnaF@@U^c9d|Oaq?eXn}fqDE*Mh(uVNmW`np_jM$yXft*48D=gB5^UTGcKv6 zWy2mjhd4)hJbCI8Oz}qTb(ji-M_p^xi2IXYeP;O7XJSBo zKK$6PJ}=?1iJ`#yT~Y!v9npYI7ppRvC6IY!5Q`>S6kcly=mGdy-|uSu~EK<@rEoN3jYO*jfvBX2C^gXehQG@7W7p@U4 z$0vBK%~9puPi=C=`#W@Ac>S)Z@(-=!0o}!pzwNjD>no}JCuI5W`7i(d?UjSSi!6Vx z|MIV|r1F1VtMNb3fBEkhRu2A`Wcf|~mw$aFm4BNo{|sj6P|whp|8J`t{N?Xx{O|Bz z{`Hkq{@b$rXZ)A{{?^LDe-Dln=kaHZ|MIV|r1B4~(fDugzx?;N81bW>(cUMMr~_y^ zU&nX+jWxyJ+Do|W2+GSKoXC~R51F1S5=ZexBXk=xwhmf*FvX8POA!1_{9IH?`h2un<7bQ?ePXTpJobUg55`YR z)$!9I`glH#Pv_r(m@Y>n?N(Ia_@AA*)XpGXME0!Mh?!BvBWX4@hRx9{Ni$)+b~PhiZ7#>Nm@-&wc_6&ul1#s7||D6MH#d@ zi1mKZim#eji1jKat@x@5$|o1fB#~D5=z({fSpJUlcRTJ=b|0(aH`1Vfh8WcUGN0Sb zJJU~$qvCxB_UkrM`5r@a5yfaSP0Y@}B^dj~YxcuHXy;UxNnFWAG3V|CS1(z(ivEc# z$mfJFroV3fsa0Aqmjv>;@N^-T8nHFMc`Y~!JV>ti)b8vfd<_gGhXuJgPGMC6aYe_P z#zyy!!T2X*yBYZj4Po*($b^uWlfwI|!!l!w2zR&eJMO0-_-&6PM|FOi4uz$ zzemI6*SY_8KjxQTJO4dJ%L}y#v;y1(^50}s5evUHj|ai;dpLzu=hw~o{qi?I{2qT- z;rDg?F!9@ZRG9IB+=i-L@c#S5QNR3hm!!3fbfNk0LPT}xzdgX6&M!}F_20dyA{Kt% zI2HuI?NxqHaDLaF^26`k^$Nee@WaIKqyK$=vyV9DHyQ1dQGmbRbxYZo8(BIe5YkOS^?etBYR z`xgI$4Zp=lg5bBk%J1u(-$^I^@Vnz3g-{-eGCT2V2_Y`8TTl3o>_#LS7yNkDP zUt$`S&-ieBwZiY~_@VNfRZ@Ve&F4d;;O#O$8NZbI5I<)|M7Y?ok4yAX8%mB*?BPO= z&HNZj;8R|wsU+`dtGqg)$@_-O>tU6*<#mqJseT)$k$$DSEO;LbP2T+JByWXP-sPdm z>pg?y^|#9Vd{szzYdlQyVyyDALX-FNOp>?0$im-sp~;*7D9IaTm3QQ|knld2L-G== z@)m_AZ+X$> zHvc1Ub2Ezf%62b#+Dx~e2WjPGQSPqEG>>frO@3>U+!1wVhW_*bXz7juMuO-aDXBY|l z{bI#8|2;LMj_;{m0^hiNFTR;i0^iTe%=kJ0v9w23)i9HJN~r= z-?k4`HFbOoU1=m^d{k%@isN*}mL*UyD_m%jP76V`Jm(2K<;Eu%C1W6>mWL$@a zuc{T_51Umrb$oBa3<|z$T3hhdu*X+V!&eOVmH5sPzOhTq_%`5<#25377hgQCL&Mkf zKNkB%+vD2wzuHBdaX)~Zof9$h5c$O_zps0HvdI4zWul(@f}m}oeCLW&#x@_ z8gEk7)a_RSH5GiDyISz|en-uy!VSkwp6EUR;M} zzcKqP_`0JVwuzr{MtpDGY{55njha!%H))%|cMIHC;(K8U@O}Ke8DFA;Zv~P_d~0wW z8os$-TJViTJ8XlmCCs4M@2y@IeDmK{GwS%B+A8pkgZoN+GoJ;%pPw`1>j1>kemO`Y z@h!x4X!u_J!h$aw?XV5LJ}`rd?-mQb)&EvA>iE`e5%@fCUx{zXbHG=_f^QJ+NPMG^ zMB>(KD+_}qeTxuF}W*T3;FgM#l9EcQ0_&pv+37T=cz0^b{OUy1LA=Yj9)XU+DT zhC32p4pWn2_clslNZ#Udm;!An~_P}k@%8v9U8u>R(wAgx{*4*H(>?^-&?m@@YS%#S5L!N4EL4z&Jn(`|1#s- zfIAXj%!^)p@wg5RU(?Sl_KUX1w+Ct}_&&MKg74}#Z0*e5XRj*Yi^gzQ%@bvTnZ;sHxz)20Kfd>R<2Gw)k$}Ebz5J^_2G8v=sPOFE-;V z!ySpQ5J{we?!|Rz_8aqw1z&eVH(AFQXT*1ZKMTIGuiN6Av`OH*1@0^Hz3>w7ef+c; zU!sC<1(Ha7Yj7PJzPWoW_(mGKkvhJXFoR;h`*9GH$$s-!+2VWZ1A%WG+*jh8`7-eR z{FE7A2OyUA%Rv%}Zy~O2@oDq3^ET7WFm-yi9G`e~w~CLJ+ww7md%!t?!SF(l_p4yT zuG!7=uX<Q@smfJ5c2Vf0%WuwAD25x{(@=C;IF8>H99?bqkTD5&$mrT$xqXnT6l}-h=^$Ji_z0-a zK!ZN<+#aP^W<8(`i?O95dq|NN7V4~Miu{Z_q=?ujYM-LVVMPz=B|-Tc+kx}jR9~B` zm7&>pA3$<{rRDzln2_o9FTw9zP(AUH3_9fk7(q>`NP!L{UEVx|9s8UKqRXFaYAZ=DC;?tP9z5>FWxma3h_0ajl>WfZI_b@@8w4dvGg}+Ao_WJADfHm_Xj^} zbgt%Vfr0eb%R7xBF=KgkczG?X<>eU5%g<8)23=mZrM%Bq6TT1leHGv9rt*4)R9-zx zd5d^?w^+)%FV~3gz=BZlEyoa*k@;Y0}+x4Weyj|{4@I8eg zF(aQ_R*}E#=J!>6e?Da_Z*WNEHMW$O#ml?PQl9&1V|gd$g@SJ#hQy5cy7Kah`F$1N z2~&B~Ln^PkrMyU9-ouviUSDj)S3RWizQmB25#N^A$bK~~<#l|@|uTK-f0Yp8S!=H<+ZSsR~-j_sGYg|xuM|8wv-pi%lm-eSMk06tg*aa zPRgTK9B=PK>%URY#K-&5|I%YWtpD*N=cn;QM1uF9u{a#)lB|e~b2YLe#?oR97pslv zon4rqR+xF&-U{QtzX*AUFE+~i2+_+VuY(hL8%+8=V3o%nb)a8jl2N~gR(VUD$SX1F z_Zgy@32&Mcc|A<}Jz|wtmgNAi%cS46R(Y$O$Sb+j$loDEHxu4LPUO95@|P#9@?xFH zn`x5Q#VT*Z90&X@G~xX<*Mc|0iM&lFc`sSzB|4Ee#3b)FtGuE|9N=AH^1t#N3*Ko? zCtH5VE6YiO0X#EHDUCjLG{uruLJGt2Wi9>`mu17~O~D(3gv@e#k*u9J$*#^W%b zRNTZ+i*`Sf#xmJk@^+lOEoRP@y^nFEi8J+aByFtlL)@X(QH&!+Z19es#o_v%{$dPQ zjQl9$KR(BExxRxn9k9nHcFBXTX;P_JY@k_(M!Z-%c?+j%x$6iWUqF#;&%?To+9>lS z1|3%*ksRwDf%5G{T9qH^Y;zzc=bD`=yxhK{i>VwE5o2G5vuU_ zqr9c)H*+KOE17QAuaiN)93+zbEyQ&Q{5`9ct=o5=RL0BSWO+-`FX;p5*T zuL%-K{gQDVf_}}-`Xx$by!us6ZL42^c>TN1UnzF6bz`$yih^6U+k!<;N(^?c>ZJ}8h*0e`H_5himt1# zkD$XH5Qz{XFu6rN*Hu41ci%+LhI#uV`W_BGM&GNfPY!{PDU*Hj@qC_vk3Iquz7cai zZWKQyA186_h{DGsf*#37Bk@!6u}tLUd`!kSvw$4zeZcAw0{`-G@n;(GCwTqg`2{+D z)&*M9D-v04`MW__t%1;3v6|5LhcNZsG0CUC#U8J|Ps|H~)fp31R)v18GQ#txrY8OR zKdINRTfF*F{lboWvVJia)RpumydMO;AKh=M6hi+AVd_8TAtS$v{+{_dzodT&I>TCg zU<>h~IiM5Q6gtaQ%R=A$F!g=!L8HDoPwRYt&^gW<&*Ir0H&CfE|1pO)FE%a;gsQP{3`Ooo*KJgTHGT=Ek&w%Gf;Z7XSgP3O!&>Sd2N&gj!{|kk2^hF8l0u3eO^)?2<_@`sdj0^wC4pZML4;cAY^nLy@-QU?0n3)og z(W`}y-uXu0^FWyT{bzzvzkOc+{ji-eX&kfm1eQm~OVcbXJ z*@Ah60sVW^XgmMj8>aqa#v1KWxKM9TJ&)@ClD#F74H;D;+yCq>&De`Lx>VCYdrMpP zxcDjF4^r4?;-}~jyVx*noP)%oKRk>b!I%erQhzvm%S3imJf#DgSWi$PO?&m0AWXY* zl-0C+U_jI-*ZA=4+w(r3{EW*o@N>gR13$BH@UX(q1o2by^S1aY`AHFUNq)8nLL@(1 z#Z%5t)2tv|Wzk5Zt0;Ut9wr~{GmLy>di~|DISL=>e~r-jU=h$-S~X@{5LW$cgvF}D zo}Y%P|CD=u>i_&B2L0m{{Znw>Ucd@^snFTj-@W+$@ceJb7^A*VKc&~t-N}Y{d2lvY zU&PB~cA0P*-hLi=#7lqu!XW5(4Y$y*^>^%lePVThC!jeN z3^P^&;XnCd>fhd^|1qyUIve%xGfS~Y63fFOx>`Ko`pfF@)s7(SQE-nhdsLqgo_~!& zR0oy%_>h8UTq}b;X3jL=!6JDbPuJN&*yG$#J9~5wQ~y^HbyfX)c6f`!k2iOu0Y&TnFtX+wDFMg6+dYeEE0t2g393xxe>a4NlJVucgJ68ZU1r9G|11wv-wS=~+gZ`~ zfro=&^y53N{(Uk`{ifVwMi6x0HCUxv(|3B9`c^gR+r%4BYBn>}za*i) z9Iv}u(9ioXmqUF?|L9MHpnu^Yvvc9ROJ-$DmsrXMkTY&A=rT;`gVQGNE&w?;OZK1r?|8EUb z|M%|lssFc=4EpcE_T^IllxaZ_e%C+);UXSB8>YThP5O@V^4-FyZyzkU*7VKZ(umzC zev1D4R4@HsVQNLd@Uw7$FaJLgCZ6_p8u?f7-1U%w|Cxsjc!mB^+2OIGxcm!+tpU(4tAtinV?B|a0ibMn zDbFL1b?4EFbkAb?+mDqZs9_2cUlgJ($)02ot52fg^8ME@I+Z;4iSlwTjgn%4_mxsw zkomtd<^R#8febSLl?#pKuXLDyvMK*)hxxag@?YsNfBi*9{eQg88UE3x{3{*if7g_M zw8Q*Wo;2!zrNjIKO!HT7X_$g=OTyTFiJ!+xcr8}zPiR}cL zb$!*apw?gDUmh-gnh*l~G^>#C|3~1LTHZU}pk>*1pITmE))Ms_`kf3{KboKb{b&j@|xTh315B0~Lm z77KmhUQ+#zSH`J6F~86!+b`W>R$qHxm=v!5^nqOQhpI+@xMQq=V7ASthX3?7X(;&J z6|R2tfn4FYr;%T5fkO3F^1JFj1HT6v8~DB2xAtAk+ROLJ=*eOF2Ypah_MMf>> zjWK9>v2QI~XLl?j(Wrl~h6eqg`_QNUZ>Rdu|8%(e(+3pjFWY~uy^?Nx z?R%1yJF4ijm)`Sn;LA`wb%v{&C_m1HYYoYkyl0AN*#A zt3M6kEBtElRPtL53ganW-LQ3630tzsC%Av5 zD^lG-BMj=E_`s*S=ewEI)#Am))57!z8h};&p{mgz?iKpVc(H1@!5YVe1veXHNa zqQ0j8&~Wvq0a%6aDI(rUh3~}*CZ$1T!wh^+-{_O?$Gh6|{d&0i(tw}B_ZiV&5%H}N zyF<)6km{$2pVD2L8`a;K?^FHHQq1aWe4h+ge;Tk;_`cA{_f#=6Nh&<;9s}RieJk9+ zqOhosji-m{-!$L_ePukJEA*8Lem&HnV8#ZYjLzy}VifuX8c(J1o|Tx3gpsvu9J?Kd zp;Z@qr86H3T z&GKLAV8>5`Q03RhyjFw$-E8H5h+2WQpU(Y%v|0Yq>+SR(8mj#5X8DiW%0CaU4N3ni z(W5i)bA_$^rJ>3nZI-{ay&XR{g({!+XE5kL!dCwG@Y<00se(5OgZwC4`LjcnKfo;i zm3DUgGzeAxyJq>_Y~_E5S`ivQcw;p1bF{6U{zF5Rk6GD9`H$MlKM$`BN&k1v@~^O! zzcf_&_3tx|=MNBqwo!j8nEt`Lru_9C<{vQDSpHXVUl7I1$9VBWYX7MbdO_mr*FKEH z=ci#zN83J4u77o>o^oNUf>F!yD8k*B?aWQWs}%k4^ku9UJ{r?b$c#PG5Ff8j&59}> z*`{D#Zat*QXtw&{h>S<^-jmVf+G!DEqx16UXqrdJvDjPjAE_5-8 z&;B^l%`ZIs8C#2WhOWFklFG(lRSFX0vfRUUp^jAD?3I-7yjH~Tv^qgMJ(YQ)JOg4q zb=?W`#I5Wtk)8p}-5Y~Y>em2I-&1WqVf#^6vI=q18GVU+9zPTpOPXR zk4x$}ha|1DN^+HYC1G}`kW|Da6_KQ5JnxuVM3RcQq|Z*1B)8k5(=)etC2f+DHgQRt zNYWHM@0hxYByHl7w)ZAUhpdujLRrbv8YyWFm$Zf?4Z-t{scT5m8ZPPYM@UktRnjX8 zx)oB=3NC2{NqUr{TS1ama7mZrhKr3`U_qBwBPzmE#ExXigA^{J{H<}<#fBV>#jyl2 zLS?)iVEn?JhF69X{%@*@69Yg~31X>rCe}M~|Yd@M+Li@z0ab z8d5gwMFoJ@9xZ|<;-n+#K2r8?z-4bhy5`}w7@$KBe3KrjILjZMq>=__+tivI#2ZAByU`01 zr{wWAcmj_?`@gaA7IUqc)WXJF!i~4JbFjAy_m>=O(y#OxN1yo}NUlvaF+rF&J}*-m zqwp&}qI2(sKGH8RaDRF-arYe-`dchtq-URDVyNFG=OaNg?*EcOO=CQ>X`5=rr)=>Z#ynd|qK<~A1N{revJ8__1}->1U{@{K5%{=_^ZbNRQO z1ar%=WZ%MEgM|i;YjgjcZcb_OZ*U~uBtA6Ox!ZV4vuloxe`gv?`Xia@@n?_Pq`ah^ zw}*Tf$jxsOf3>9^vhpVJEN-~iHZ17}KG}2GnabZCcBa~O{J%bB>iAE=4Hv_4U!t$O z&z-tYyo|hs2hpkfgw&m>yzjp=)vn_njTmO=xIYBfa^Z^7bI+ z9q=MvArUJ*`3yYon5y*TtKkOXD6hDlr)D+ znnTZP;CaW?IV5Qgmz4hy>GXqDrvmsLYFtNb_N3If)x5^8|H`Ju=`oTj6ndh!HMP_@ zUf+W1Uy!a#v4N8Gg~Jky(yN}0=LX-r3^!ctvC9m;Ns^ifEcc^VreLYXv9NvquxP!; z>?82FYhnG0U%0S)G_53l(_sRo3^Oc0z=Acu|boIJ&VQv78E`3 zNXQgz2$f}Kh_~x$WW9ktG;UyOyk|N25XH=ou&sc_v*+u+$5TE(pHeQiOX=mGr~Ld!N;%FhWz)wD{f3># zDCL&vHm&)dKRJuJ=(i~>zK6Rm7O~fcMLlL~Z-dV_GO!q?|MB<1GHhFAR~zSGaYcY} zg1eE#;7>Q4AtbNPu&a&3ZdU#2cX%FJuZPjQQkXa>{P9y8Cd{>QQ9}b0;;oSL5wbst zx0F~tnsK`i#vyzzHVIn@SbS-y!0{Z4nzw03B zzYbdnSoHri$Kbb*9Ho?hPPOsdr}uh$Ep{z^CY~D{p&o9y*!@$?j==6b%k7?xEu0k2 zdf={$o!?_)cbzk>rGNG^g|krkQpZCEVOuLZ|KHm@p#Q&xBnH@lD;0g%Q9j3XUP)bE<#Wt87`=C~{(ZD}sl)gH zRQyTytiutrFQjijtdn@64CK>Sg~RT&B#etjry@PZX!%>4_P#|0D&JZ@{)GxuzO~$k z8+c#1MJuq#omxZ%7V!d$Tx^$kVk)r6oz{{Ui1hqhSGQ7b(QmO8l48-8xa(pAciH%- zZc#E9-Y$N-*v6v4`=_zD8G9vO1tMza(5F1|-2O8Sk!vOYdiEKX;ahCF8efn^?M|YM zcO5xj-VgQ|6-mcSDI->*n^WSv3Ke3+@{sAJ(Ob8dARFh zkM8tmQ!VyhmT0mmw`b_>Z8tK>AY=V}_CKV3G`1kHaMlVtR0&%O)@9H4%x@gmwdk8E zxDMm4i>=<_50}=fO1((K#qkut$q;YyHmA_%t7LDu!It){+36pl-Y6|7oT6LxaVvTU z{{l!^;roAFsLIutwC@q z?*@~+mSM^(sc+QpAbzWZ_)hhE!6a`%nDY9VGs!zwFFd@PkYDxZH^Y=S-Xw2`oxFhcb7x8nsxY0>soIjN828@*`4QsYy~Q;D zr>=wefc$@$@-KFnzg-_=`2!s0pKQus-(miDP5Hm7;}E|o|6+&v+x0c!cbI>&DSv&3 z`QJ6=|0>=gepCL%4)eFW)r8+cesf1G3pF9LH#OYl56k8_k+tc00)qu*9lOS7)}(nc zY4L30xS#13YlabR(P}5)N%pkN2rWq_ySqB?&e2NowOA>R)O0GtYx1%!d*PgRw+E{u z@AhXqUlLx+QwWf$Ol(Cr9FICq!IJ&bWtykRwOTw>VEVQ_6FMDhAdog2UN zRpOCgLjwM^p!pRsG=~dacN9wc#-}rvD6~z%KgsN9bRW;V{xIkw;i1=;cyP9~d+=A_*B;W12Tljt`1ANnoLx}*x z-&qbnXk2E>lDR1vDbkFqgyQd*C^LwFmn;pP%x*v$)zB9r5Nn1`$8bOD)rR3`b%R+?o)-l#h#h;>?q=|;V33HF;Y|?hw zt#Dj}jt(BwK?tI%xE#|OfbIo+`s4jOtt#%RuA&R7KV<}kHCxe{w^9kq6g5|Nv3SnW zQNrk*bmJtl*)myzh9-f1fMli;u8gRP7Ox+b@!bSz*-K#Z>2JfB+2Mi{bL31LDW~ST0H9pE!8rHc+0p-lu>Z0v5ZsI zjJDO=w{svsw6`(zg53o_mGL}YUJSdUjm3YpQ1KSh!;70xwyW^R&WoF*vkwrQ6fdrO zT7H*JWOHxS+`}6awv7<(vAcyg**!9uHzvG5$#`X#vF4iz-hkCgX7EObamav?!W2@L z1}QYHf-KIZbm=ZR1U83<#d}7dHPE{X# zQ(g1jztQ+!d!4uaZN(KuSH~0^(Eg4VYAEe*N0Xx6y^2l{ioOQdQ7iq|Rdhvz@IO;+ z%syPZcFqzg2))@q4|&Odr?aKbpByHP`po^_WbH6yh)?3H42<@CqOp?fj?uZ$>qo%%N&1=)g^khS ziAwvu28;Og!r?I+5nHvwQ$^toOoiWSEF201VGrW{#|OPkb?ju}eabyQdo=+K$zDy0 zJ)DN8FEY|l7%gZBqI`=#X#L-J6rEOfwCHqnsPKhv?lW4?zW+N43tn|DfnWmSrN-r8 zf#8b^jR>MN1X@Q-`!5JQTK#K{jmVAmJgn*fd;W}gs_9Tg=y0n^huKjEXA0V$c!^=H z)zW}?rnj`6bh=#;J6zw0INnlPQ2t}FUz}*ae;e=hsUNS`?3b+7zGQaA-NJtJCwY^7 zD3i6-lC@=j58=rOQ6p@o&&h4X>f=&1=Sv8c8kLs_aM31kZ6eK7a*J|%`j4j;e6wrk z&`K>dS=2+^&;fsVlND=xk8GCCVue~-aAgmSl&+e{zHF~C;%$rK1ynXK!<+0)nJh(P zB!!*0OAvQtm^WFjOx8n7)`M*o$%weuu%Us<)`N)G8e2)2Jpotvs-ETwLyEHBww-dpEU z9!{92GYZQ*b?8sGwtV3KDLhe2&!&`yrPE%24bYy*@@?>5LsB)oSv`z+>)4g(gkKxH zoB#2JcR8M@c%Pz_6^{2tlB(eyj`{a$iI>}z7$)9N&iTT-4o}q5ms83L$J>{rO1x=C zyw};47$)BD{`Q4;8=k0m*HOv}$9p$P)$l%u@49Mu(<;-gLVX!^Hc~pT6+^fF~;6FDYe(mpQ!AG9kmOuUzoOk2Fsc%qhm`fO$3eUYSUcz?Uyh&Riw#4zz* zLo#jg*25DOZ?s+MLG_1$$7g@ztutP{?+i5JT}02!H7HEHH9t}TfA-XM8(_KuJo|+ep2ei`_5fPyzkJn3dVak$+X4W9Zyue zZR|=98}E0gy?Bpc-Jn|H7J62}c<(2fws>#H6Seg2cBO}n_m|(jc&5Jj3gc0u%dRD=B^GK#G-br|(;vH#Mdf0d`AgNk=v<3St zs3rb(s^am!NHT5lX5)!k`Xsy3!^V3VNtJj<8}UZkl^AAw^wzJw@IHknD&A~LY4)zL z@m@nxHN5ZKYs6c}uEa3$Za(P??{Yj*@jgWnLS~t zpU=qbB7PRi{5K%v=3j?jO8byYH?ud>--y|@#YOb&sN$G4k;PH13$!MJe=L#TYp4`k zeb{CA#I$T?yDSmRDIK(l)wR+3n~wFV8>&8ek3pYlCVi$I)5w*0g4SoI#!pnJ`uu~X zJj)7A`mi5D)hBFw-B0?gG3hhNtWUu2V|*WuWmg&JP}dP+LipZ?^*(W$-v!mb`Y)tU ztYm%uUz7j;cf3yhv$F9z)hDdw0|W_d=x=t7=nsBl`R{^|1ZIt2zK0c z$9e{oxLq;$CEi6255T*~yzjMlk*q?k`~M%@LGy>uLGLAu5}|pb_mWav-#`rMYaLrq2Su`b6A; zqB1P{yoWnpeqt$+rcVN{o$8Z8`s~s4+3Q!Ig;do3gJyo38uVGB=(8dOefB>BeHLo^ zJndJXMuVVFnnj;yaL3C}GfJfK(-zlG`AH*v_G$VY^sCPrDr&>GW`3#~^x2^3Qy79i z8)ieFiJCr{e)UNi41Jne^qGP?UVhRjk;YGdTs!5b8R@f0)2G0%K6|OCCEu9&IgUGC zefBH*91B68C9|MUe@&kue)So4C-jN6=rhouPX;B@_{qezQ+{GepFWyCF2DMmqN1i9 zF!Qqmcf9GojBaO`kXY>N5x88QX8xr@cX+d6Y=w=jjmiVOS=&Y`vz> z2EY2m4?$6bEc(2PJ6?VgDUqg66I?sB*C5j8Wlf(Ie)V~oiYofr%+G}eeO4*@tPeq- zA}m~6#x#9O{OXf@H}vUX(Pu91c=_o-i8OwC;Myra9Y~)!nm##x^(mmDR{h7!&l%kD z>QkiXvo8dFR$-ypvL%{6FZk8RH5B?JTJ#xX&}R@O()byLYp47ql0JtueUACn=P(sD z?<+Gu|G^zEKTOf5Gz5L-VaeFCnD(MS7R&$l)gPO95A-S9XV#~uL7!=qNaH65*G~B< zn+kp6G=1Xz>Ju>xMP*p@c@KBI{KQfsO`il@JJlzH^f{&3tJJT(7E)3BzclmH)S%B2 zMV}QR=(B$c^eNNyiSWx$qv6me&7#jUxZ~xg870#AX^U$MKmOnESz=4f8}3`??wX00 z;H*MQjZvM}qKs{FWJvrU#QVBoL@9{$EU~#(eiOC)wO??I|Aq29$nq1^@>~Dc${!@l zPgcuc`}uzhf00&x)*N~n`?-a%Mph1fsR~_gr%({~g$($rX2<^n>6ygaHA#inZSQ}H zZ>M~)*sJa8$CID^AJx|>zVOo*z*B9@h-;nvEOwx-=T^xqMux?b-{_}AetVx z=a1K@k7HUF6!X&@?!1Gt9*b16(z6kiZ|Sx4Y*3WxSxpnSyjS`A-cTFbwQEMVOdcp?u33y1gI*9trGs*}MBtHYNWtfXK zv<1@92;{kdKr;6D0dfl-O6BBulmGUT*jxD$>GzS@K(w7GtxfFdiW6HS7^u@4)&skh z5`*MpWwOC|7Y4+fi9&oD?+&j9LD-M*w&Qp|GuuPr9eA4`yeB?(j<>!M?=v`|!N0TS zpb(#U@AYaBB;M^y$-alol}zFtbE_Y`f9`UQcl!-gUhVVev6d^w8V}B(O?I(4>SH|~ z{EW9*7h4fws`ES^G(gYJ#WKnjv6PR;gSyumTx$7(KonmNTs|p|(Le{u?~feNXX}f- zc-0`I)s(l36eff2f0DoEzDU3unn{uNd$o@r`*l=H4HC~{Uf$bgqGfsQ{gtD0P z^H6DR70aX(PMS&8?k)x|pAUx_BSA%M)!_Mr^8xbDg2wJ z=6cfb6KA7F;l+!2((x&od1CVt7Ge7##wMKk3uzeAAPF+!+Kp?QGgDU-objHSdM|z; zO3+M|VA?lre(-};jq_bD_e$};@i~x}Rm~{x^N)0`LXx*A)+jG4OnJ+y8|7UWro4A* z808)LFg(0laH0^ev|4MjC`@^u#~I~y4O8Bc3yku9+Z-O=-)b4<8S<*noKEsXsm{Dr6Z4vsReqtpzoHxU)M~4QhELHG5a2 zn_p-_?b}iw)JQaY0xLe`vCfNm;-fsM(It*`=0#j8R#0RYBv8PjjXV#W!&~SjWuwNA{^s^4@t!<-#=gb6Kv!NK ziDpk=MTl;HN|P<@PnWPiFXB=xw16dDtaW?-2JTKhm_6%Y#N@hYn?NJR4)gDz4cKFg zaX!F7PAnr++c0`6pBU``de9|ZhaWbK3O?7Wd{#<*8fE5_JNx&THtn!JdC=&CPhOw8 zfGeF(Vo&3fE@ge%jg<+uKAu9(c@2ib#h#KQO(FP?dRU2PmEzCC%=~j_8;Y6MZtlrJ`*TgK zN(BGhpFaY(I{!ZW`4(CkLH@k9jSqi5(ck3H83;>u{@mz&#h-t8&r6~bA_SlPR6axT z=Opwvt?{8A?rQBrj+sw_&uU?&xF3HesXRW=h1NcNfHnbql4$k-xYGILiA8*%OZYP{ z;%`(L9_jV=;XZ6uY3t!Uir2it;K50gG!O5-N_cSROAJx`g{j)}AI9=1j&TJZ#g8q} z9KCaA?&z66**p5ocNItPf*;b+H5&>0yrSAC6n{t8!^S@75KH^aG24e4YBu4hUwuX{(gF$ zg-dUH_`AwyrTF_MGoRcU8ys=$@4FGRrN2J{u5>2F|9n0RRC;d5re)gI3560RGC@)JML*G4P*|dvfmEcL-wfIk-lEg!)=BqO=(H zK{sq8h)g4!<6v!)G8PT0r-)5DW?umwUaM4qoAAR}0fhf|n;B-jCy%qnC&m9anC&I} z|B!S4N0-+n{r?BWUcUSvRgC-ph*rM*|5lU#ckt!^@2LL2#!MxTD1y%?RX!`l{}-6~ z6#kES-VWpaZp3)-$>aSa;3}a1qly{5T|1iYUh>MkBHmind-?KzR59-VYg_p8 z|679f|9`9g|CSA#lF!z&lz0+~|5I;X*T?y#L++^TPf3Kkt&8-iLQ1=7Ue( ze}4pA>Hg0XTi=IkqKcW~KX%hJ)(9>BH>Mi#cO6+HcyK>=S*afX*9Z)ol>TRd*&aL|J&t+Se*BxH^8O87 zX#U+9?JMlT+36Xs?6@o(N`A^)Zetv_Fkm@fHz30&#^?W2Fw0#(T9 z%_6?n&WX^1Z*{%9!eji#d$kxnTzdy~V?L7d4%-PGcNfL*u38(=Ji+k%>IT~LEzgNI z;?Fv=4G{9zY0p1jDV}$%Yk2;bd|n3=1*pd5*EBr;rc`@J9!}K_&!^WgJip{!?fE;H zbVASnj59o+A@%?KmGc&6_z~GxQLgT_WG>!v6=Dx@j=K0B-g4o17+&~-IaF%Uy?TR|9#DOL)w&G$VJUGbmoiTxw$t7wuK;9QyD; zzWi7XLk-P%@ORW#PaSLf3JYRs~Pd zOknIM{k44+?7C8^f-(4E<33vdajWV-l~NzqnEi*>$5xob?XW(6i#9;k$0x9CME4&b z_3=_#Izjbu#1%g3V}4gteO%?EKAu{x)W>!BVMC~hZ*?D0;#;NE$024ud42pIbEF;C zM-SRdSs%NAE1gdt^>H^XJ0QPI6!kHY4K6G;)zGgGBcM?l{d>xGc_&5WN@4YmYH3{J zj*BgmcZP{O!&t*(TAGRC&O~WCZQ|AIsc&CFU*TC3ux1b=W(DdCS;4Mg*O1)unKrY}@NvvKn{uWc4l) z$=<-?B%XalGhTZi{?fkoW-n7}Z%_OX&L;e8gz8_FQeOv|{fpPv*`GSDuPxApc4_VB zAyjwWzkJl!akPqo>T6U(AN95RO{V%f&qsYtd0DBi(fHxBzOGgItd#oN-^?ekudOgk z+hKkE7VRPUt_@m3rANR+TyB+)E^Jp`qKi&pzbpCw!`KTg6Al}N*Qem|AZQ2a6A_`?b_pM3mbDJEk3@khJyhg;BQfKNXD zP!6tiK7EWoc;NEfACrYYCbI+In`64{&&6pk9cLetXI}Ac)S&q%MFhTfG#nS6{Qt4{ zCU7=a|Nr=%F*KGjV@;CAQmLc~2}xsZ$TA}$dr?i3q#Aux_93ouON*i%)kl(qL>Y#} zR6-nlcE-}m?X|9>72XWr+$&--~^``O;_bKlGToyJYm zb2It=;>XqM!-e<}b-rKTHd3pzk*l-qFC8JP?2fTj>DSF1@8#bnt9))pss1dzb(+g4 z&nQBc8AC!Qr1yJ;lF)fa$OL);b#CViYo$n*uh(0YTeIHC)Alyb3lqxYSbR zGZj(FpSC&bU&l;Onbp(jDS4MjPe~r5Jmv5D>?xB!_V$#Sh%8e!liA}vlN*t-=vC^o z8W(s9evvflrKQ=Z)4Hp6?_A^d|-Io{BPe*X>q zC*;Zf?ckqa@!Vf@5p%C;vH8YW7DeikNsACo|XP%o>QMBelc`osr{oezHik2vEd_&K7;tj zjc`HskA?`5p5xK{q%i#>@hOXc{QRUtlF~z@JeyCo#GA7CM~VH%Zl^rC|EQW9(m%ZV zj}OpiK%U%x+zVM5{t=}A_;(Y_)6#!*+a09;;Qg?>i?laz|Izf28Tt3!;Eep+8_3B2 zItEy5+e5Io0NZ}_LvP!D>T4!%li3Fr#|HTe|<>% z<|&k8zxQ(V&(H_2pYMgN4SfWeZ`}`Vl#(*2ip%zo@24^a>%%(spYxL zD$lcG-{YO~WczN0SF%IIe=qy~4l!Tb_v4V2A*S!EP*>!*D;#^)}ouAF~+lJY=+}rM))Hvc!+GVz1+z@@0G7j@O<;j90wu z^%3-!+Fq}O>paU zi@j2B<@SHec;#uQJbAn_@%@nY%0m#x`w5q$PlG&pys{UvGUOR#ymB{O0`j!Hum8|z z&UmcWeEEIMK__%P=F!La?#hC1nkFqc`>1X7(JocpU)hC6ANqaFk(j}=p`VZ4T^Ra- z9B)G}%(fW%+sHU{B<+2ZRX=61cZv>f{aD85bDa9&@yCyN6FP*w^N@n{Ll^3Og=`E# zp&x=4*F*M(ez>xG{`x6gO2%h=?&E3icQtX?d$9L0UzugG_YufAWNG$y)u&nFM_KHh zf}>lWmig;8r#y*$@z{GI?cFOrUyD8t^5pTyACQ$H&mi&n5x5lFyD@+L_*197Ti?gI z@vydc9)EoQi#h&Se!X-2(d#@p{#cEnI9vBUc$){-UEu?7>#pjzSoh~MJv1Wi`!=gS z&We5KIrYKzefr%}+xMG@;o823LDq&og4lNfT!`&E8lT&F+PD8AhkXYdf8@@v*mo8( zLG62mRi0QY2Wc{E%FRv-_OH^*uIVZhxvK5oQ3^|;mRmu z$?6L&RIJ@x}S* z17VLm9^L`j81@)sd@*RXvd2yM+||<_|7qy3$6)&pNz*O%cx;+okZOz}<=Mw7&$D8W zg-&_0J=R}QYJ2>2ooSDgAS*+jLF}}Q78wM7s^^mJ@#sb~<|EVK1k4Odv)QF>lTIBZ+QFfnPh3)>KcfIX?N|wd$ zJ0oMYdp#tS`dVn!*IBWD;nbJ3|K+8(fAool{UiJs`U+_$1C0;;xP}I9pmdy5rZL59$!y_ ztPFW_W%qhuWw@B#{@?h}ZS8pZ!52SmD_9_lp7FCDL$gKi$yXNtau;dwzy7N4SEuUp zQcf55Azu>fv1vsm6%N=ce0{yHa0M-vqeA)pxyIMlq_^5 zCgUo9|QZ~@%^xOEcU^b-Q)WL`pSU(?WjDQ z$^AaEzn;V2@=j8R?*0NfccR7LvXJozU{an>TIE?5f1_aUmZxQW|GiV5+}|vFGo-(9 z7eex+3$^}E{W0Xpi4^!UlwHjr4yOtsRCPH(Y~EB>5IBall?&s z@6p%rXnz@AAk=%#(Vb~ZRY z`;+=hLfW_2cIb0cyvdA70sinjR!mw>Z_<75?@}1Qy34-lxnnEk55%w| zzaNt9E`_OL{X9O9%|D%RvICT6<--z$K{#uUUARLbjXZ$LXr!)eB+qDM=$E!e`Vnv{ z5;PJ;*C)}gZSW_|$@G(xLO`Oi`# zjM&>iq(&~IM%o!gvXM7X8Jt`u8>!k{Hsv0>(=n)W|N_Z2o6RG8l2Xfk>RRrAF>Iiew{uQ5lW2 zm5sz)L6MCVzr?QijRd?7NkL4(n1az69SQ4V2i8*(tK(RRu}HKwq;mQP3&Al3;|d-G z%4G#jB+9-yrX;o!>@cGsrXZ!DYr*xP&xd!0$hDrD%dVAG6f-ua;PQe?siEsnvAYz) z{Bcgi#?cfPs>H9}Iei!ER4%BP-{E9&vHY1f`Exo+@HWxrKgRLo)-w#1Vx4j@sPRpmu=X8-*8s0bOwj%}9RrAWR)2tn+@V3S>!1W}2V zm;W9?LS*0L?O5nwM8T~Y2_*8tk82%Bt9Vo*Ccr8Pkv_Ty;-gl?n1Xu>?k23^LmBJb zf?9;M@G%p~sl2Zc4=^{jDR0HUR^`Rq<5C{=I9BBqu7~o*k98{V6O>5hk?xM8lGdGX z1L;m{M*hWkCVc%ozQm;;tcm#Y2O(koY)5pUIX}mHt)B~(e&VOGTd>y3#ZSXXL3%3` zrow%1tQAV9tA!0mOSJ7st>A7%z>xmEw_Zz60_mRlp zJU(D*g~Gk^dKK;`Ua8|(-!CklS}A`cp;)}0yN)CSE4pB#49gc7MbdmG<2mqGR|bN| zFV#V%)-DTtOu_9iz?cGMICsr9Npu>{iwHDM!+GN$tKoc_;WC_S9fs3nBMhh015U$v z0wvOL)bINyp`Ny#cDN?n3Bz8}i?8?j^ble2VwcHa{O8N>gM>}ydBiw}$wX(?mnKs# z^PVYeF2ACukDs=Nlz6_6@IWyLF^s7KgGPk)CbgJ0`- zAlsBO83K;AAly0%_X>%7>L(j6zNYr&*HyR+B<@VY%|epi_CjhfR@AXTClplWmZzX+ z!EM>O^#4fPdC%`Hc3?49SVN0~s|>^~vox{M1?#DaE=ED6dk>Ui%Yx?lIMf$& zr6Q3@Pmsc>zPKaZWn>i`MmGCH7}<|woJQ94K5b;##gL=#X;jlT_6n{eicf#M<}$XM zNMl&&lE&5yG1*~kQJF#F(;gBlHrL21RD60I{iBReW7pf_6TXV~8lwgRnCx92_ergG&K-;P>$P` zwY0v&Wi427vGrwZK7zF@AMLc3(kk{*q#DkJ*3 zOr)9_hBAk9X8@h(QHBaZyX-o#g^DfsMGWZL9V&i*)D)~|s2IOdn_R;^7X1Vd70(-p zDpb@p3W9}-6vQh-gU(R#9bOepU66!dmvM%QsA~35@w5sRZ_pD)sJM2dOZoUz*RK4n zQ2xqMPUT14qm{4vqg>Q8^p9&p|9F{P%~wwXdTj^j(sRDLV}VQgZSXZzeoOi!ij-d! zVU?9nIN1S8dA`aQIh4l6&!|AP=TZjq)sx$-^VMGYT3dbJw*`p0)J!cTmH=@CqX7hn z6Ae^=_(|rM?4khi>bpb<1&C*9s{14oIe__KnrSiAZ@q^*FvjX~!W`g_yJ_0;#abHy z^9ki?B_<6$O&mKY&}F9#dym^eKO%r!B-yAS zI!@>Hc3vUKtV%`H*7t+Z*15>d?~|H=lU<8M+aq`&Ppo{p0=Z-x!f1&k1M~e@F~mW{ zEw}^bnh+72B@vbEL?jcywMep2LG*MGLC+M48TfFIh}cX-l&6w+G13JQ%_I@4V88iq zBaxHUJyY$H*o`|NqPbLY_ltGJKK!0d#j6SB9VF>Ze%31PnaMWx%!SIvu9Nw$JITh9 zS85w;L60^=BB#dv9RyG(3If_n0^ayR8~MF<0?b};OixWf)3I!0wKM_sWd5TaM8Jj> zngFvGGcXZSynT;UVXVQRRi;#lTE6eyjv9NrN@>pCH*cWt zOZ>n2#`oi2aD~() z^7YHf*D0h@yyB2bP*ZX!rP2JPHs*Ewv}ehG0(6hVEnjfeit#gkqI+|x2;p|r=L3ED zJ5U01jI~6DvAdNa$Z%sJ0g)kPs#j##gmJtP8KTH3Q!xmDQ_i2mk>M`1l0OoO9GG>Q zWGbKH?q*4Zo`)n#Gy2SGMwRjx6UHJW1m8gp0;*A26(lm87EH9`j=~)0oHr%w*7M$oLsr>m!($~C!19iE9$;&x5{8Lv2r!g}B z#-|h;7A@1UVIRy-PTYuQ@%{w6z|_PoRWa5`GS=B{5Vp}+O0dz`FblNjXskV^pmGB6 z^mbe1*+4YXDuZL<7H1%;(b(+qn)+a)vG)&I(&=rKPKt*d1>I@eX7mYB25CsDSp$AYRgU}pUlCKA9=@^uOYaN3|;#$U? zF}}Rd2Kst#ALx4x|DWAC(05AxrEB`%Z^uC2SNLyTkqTpd!Q6i+e%2Lyx|W9`Iw0ZT z(;g9roAS)%MoKBQX{-4ab%q4Pd4(2jL>SA zV^Lk*$QxU1jVvYL{~|#n1L*oDBogsu1JT&!m~9lvMs7!CaH4iOsv4X$&b2ji0|9qL zf<~x6$UlTc4i4KIh|~xV*Df)NWFtP=h#Ic7Iad$YCgFHxiwW%~;2)5nk;mxTPmORd z^W}f+vRQ^ZAiKL90N#l+Yo(TZZnYuOc11qzH36|5UDIAu26r1-4n*qFfS5YADOu|; zKPfZMNX>{6?{RQX(3_2I35f=`1+DQ!A4$VX{e-ymQyUFdjvs{UgGR?}_!*D(bT6x_!>M+~B((R1jXjOc>CkaQ&}>4h)qP}8~})m2-= zR!LVP!B#Q^8(qM=dj8DdlFmVxFgkxF>GOWJO1hwrs|UwHleQi__8Ulg#2}}n-$99O zeLn&9w5;pl+E`C1&G;Y7_cjq$%D1xX`#bId;}*}TR962V{wX}f>fl!e9{57Jiuh)+t)sey$mxqDeVQ@y+>&yL zI;Tkqs;68n^H*-94(ZZYiDFuMc^)m~KZ8Vux#R~-#nBYtFG)a0IrOcLNvaG=1MCFs zA(StWq(5yC@NUoJM8N5IMZjw^zbuysSiDFRU@RMD@Kkog{dNMzN&-?W6QNN$Aj*l* zU~0QR5?&(NG1hA$^bd{m^%6-%iiThB!vlF@P8Lsu=2EXV2Z;=%Z5>1$#vQ0ZkG~ts z@%QFD6%-{My9r|l5`xdG!xM|^sH`=TjDh4Q`|quCaQLZ`aa2@w!dD4-?8* zBHZfxb)f&1s!F=g%6#eul5Y2fTDt3~lY0+I`eZ~NqG70o2ATlW1THpC=(d_( zTq4=~#V+PQ3F$BrVlTfsvp1B=X#FUimVF7`=RjYLn?R@A3O!k(&#^T2PB!qtL zxr|O-Z2rH9nCWvA`ob}${D^iM8vvbdEA$Q${Zc!+u>wZu*PYMk3#ku#k9#`e zDADh+qfa2DaYzU~ss^JU#6$T%AxYn(&}TZ(+e>u1t%CEj>l2zwEu7|73Df-9W<%~l>7Ki&9T}}~%fJtNfe!9znG5RK>lJ0L_ z!nK|=&cn5yGwwh?l=|&J-{<&$^LJRM!vE&q5A@B!|3moSqZjA%|3SjWT@|s+FmBKFl5+7gKBd}vz2t>otm`FJcWSNmec9Ga z@1zbdF+x|+-{d5?POSDzzFXb?sdwfz1_)c)69rsdEeY&`D3*wuQ; zJu!M__{B>$0)`UGElAR1JL~0&!)xXKmnLAJ%wNg`G%^UFcSiERLL!$X+ByipYg zT{#LYtfUF(VS?eD z@k=kKRk!G^t(xB{oQ+!Arsv_B_a}bF{0{$bK7ja-{}jN(uy0%ZF2n|&!^H6}0tRPD z*u*bKP%}(i2IvNv*8Tkv`I}J}JvctP(BlKO#s7y6MRIIo3w4bu2MKkR?lhI=8S1`S zsGa8eH5R=E-{N0$helMP?i!;YSg5-l!7ym38}}s$Sdixt>gpe{hq@E!(^D_%z+7mGR_rwgB=h0X>Pt62TsavuEdt*3rs;C&|26 zLH@gcF13|lzSsA}NUb*a3d=_bDu#ZP=T+Nn74or;E+Ln5%=>-$5c1tOI)%IzCAN8g zEb3`F*Ti+1`;$pnUU$gb{yyk>1RIC51%2P@7ZNbNy=^LE(x+M(<>%X!;q^Xf^NOsD zH+@PO4P}1NJEV+${NgZmC&u_eb|<4om`b7UWG|@T?u1|e|FN82gq^m`=9(LcSj;N* zTj2aYXrh5-ybl^@6v?64WC^cczS>((N9@<$vA{bb_AR%WBswE@0Kvs+Hx=bVgmTUg zl3jM=d>^!R0qmwlH>cf9L5a<7l2K3FO%Gg$>7Tav+ymQ(4wJFR=WN6>hslH;pL^^0 z=@Fm5C?6y~XWVLv*E2r*U({Ck@(PQVET-hx^s8eas`&iuaNR_(`25lB7Ck!WZ|O9u zT9D!qpC=Z0$LCgZ9HvZQ4Ie;k8;UyPbL-z>0!cSGO<*EQqzO=bPDUj||F{lQ|K|9! zH#R?Q$~V_rpGI(WsGTCSWxaJOUhbE}o7T%MYH+Q$J~vDYTdlXAXB4>OZco{)?M3`c zcW^^Wc#mA?@*n4V>$pP@-mxxD;dSV$g{Q{xlTlC0Z#J$=Ex&lI!`tLnDgSy}2WpFi z`?p>QH-;30jo<0r19SX-M2+7$-Yv`1GS0LHq)PdT)Xe!v3fdt$#>(A^$+~t%CG1Yz zznZjSY?{!9QGPxW#N6lTdM*+fbBl&(4auPRKJJ(?ca}yKhpl?He4NBIBuE+t>)ILB zLBpYUZ8YE%GhhDgNI(N-xOj^Vi5$geI%sHxJD@?0;w!Aza+v+3t>eMUr7s`rOulsA z68#!OMLBI~e&RO_zcD!aXAMs)_AjB1=X-uTmO7rf@SyxTNaR@l*kHR5-jzK=LphC@ ztJxBj?F5*^keUVoi+gg<_s&0xfO#^1D-$qC5ny~?P|4D;vpZ>z$mQ%#y2}xfa)(iE zUG6a0IRSu4i31&-?$ErGb_a;hHyf3-FU-R=jsI)@G0-;;|LYwd=z9_W!yNyc@#PQf z@j3kCFEZRCWbw3k(+q*w-lZwpX?v%`;cBxqKrYAZ&_kcrTnj{ znO#Vr=q$RPh(ua@r9oQJv|q}f1O7cw7fA=8H!4iyqg_MUNIc#|GB%bf<=;=h_aI6C z-dO5BxrB}F-M^LY3uXTH#bkWLvWZ z*Hc+rBpFu`?v`8Z0vm=qz`aV*+gjot)?+k@+leq}t(R~c;{aUXVt3S+zn`3tzX2TW zz@=?l;Hus6BuoUQA|9M=Qv}}f_2nNx0z}iTc`Ll015vrP+9P_*c$=c-V>U$7tq&Wj zed6DfG`slrPo>%^GC%8eQtdRXQ`%-1Ee4n(a=P`M2zE}lUL+%oa_hORTyFi^N&6IT zFg!uTUGH@3K`4dNbb^J5c{Sis} zPD3NTPqDM599J5-UgnElC5;@#Hxg1K#>a&5{Y{CDR|9en&Wi!Pc7}1cn4kbwY`7sju>xg?>DJ6uU{|mg{6FL1a!rkECrV~i| ztIo9eZ)xSnCgX&&-_DH8gV#Jw#_mj6?qoeBBB2v75%e|seKw-j$TFPZ*Mc$x1E*grhY zgZ|Tz(BE48aaGCmA3G!TU*JuDGk@9R55I0Bnuftb!p<|Hf`M>0Qw1`94vm2Rj6`v7 zQpxgf^!b?}{zZ72Nj!!@lK#gcp}(_u`^u8(|M`s2{{uYDgZ}lA(2w}vtYrFE;sl4t z{r3WI`VU1yf1R>>0cHJ{Ym1=Fz9cDQ?MeZ ze+WFyL;gQTLOZK+n1J1|01057`gm^fTwxT-#!xh zQ^X%l!k{0Yfk#gN1>W?Jj)eX?;>s}S?}W3{BBy@{Jk2TpDTUZEP&4+Hm{+fDfvldf z7@Ah7G3*3Q?yT>fjxcss&Z(gDxr=)-T34 zZ0MjVo2dcJzW2gU(E6qr^AkdhUrKBr4T6f)m}}EwA7~+)k6&GF%8AK9ozPGhM9s&_ zvp>q87L&nW2TyI~Bqw2rot#uRIr9CbnpjqrD;RVt>e?=Dd6a)fpR3tbzF)#kUXOEX zu>!njuUc=sQs!sQq4mb8{K{{FmQ4-Zqi>hK<2{2aTe}pZ6<^^>WA62^zr|7onvQIy|kDon- zBW_bO%84&$8PDRa71{1?es(uKyE>Vk-L0S9&Cf=m5N9%o`R21&la|ls@w0jK>=K+9 z(56eCem0Mv?Seuar67iw&(hl%%YoLg8<&y8oPEY~e8=N8VT1BWy4zMg!t;4`Y(5erOE z=6CwTtFg6oLrrieRWv`Bmf&OAzR6%<-^G`d$-dE8KWvuEAI~({nVN)`O<*9iW-vQM zQvBntTJ72s>Cs}OS!*q}PC$4=H{mbiPO5mQwn?~h%&rFE?2q)?qqP4f6c1V<>xc)p z;}tDQuhstV#WBoe|KBV7A13oN18o2N_O4<7op6usKcKYbY5y%wyY1hPLbm^z%7#fa zjk8_$Fh$vVzA2jRr&u)S=uf;%ovy;2R57%cDH;+2bb9&4Hl2nkpD!QPRe=sB%Jt-R^~pT z*|gaUPUS}1i@(+OBJ%^X$zJ;4BMR)#Xz_KzJ+hZKWz-|m_ZdcLI86>)RkY|g&5&@0 zU#r5X_4Pr*DkpYKH)o^xFzutfU(3T# zd-U96(mtZZ*AFvY-fCac%tP%T{cWiIgk-(ITkY-QrP?!}W3`{spE#NP4#XXtzgykp zS9wB%M#1%wy9lCwx;4bD2I{ z>(8h)^%=s75tmIcYW1F_2{dX|X-dJXyofPt`Hfm#FD4+<5&pmT7=~+`)NR@umSPhkGT_ zZGd6=+n3W^`dU$N1e8aKhaWL$iZ^s`cxAn(=%>LsYIpdLQStTZ8qTOV;+o^KVmVRA zteE2t?{)jpPk#fky!him199^dQ(t`I3hS%t-K?(}Un(Owogwx2DCz4eeh1mm*M8hf z&8R45$*@mGu))pG(q{B~#Av;exKFn39c7-r%p=O|J!V9ir==!?M47KD$tZK^FIMui z_)dXG3#O8H<4&qL6lW?~MVSxk+my`uHBaoPQ}x%TxW^-}S;WUDjI;Q5bmkL2Qg$ox zZIJn*X(Ya*{3@;?zD2l4=5V9gCnQWab;751Fz5-`G92^R7Yg(@nP0@9FWN!3v)xCF zzhq4I7ImA;t{)Dt*2_e83E{{y;Lt&{9uONqgk$6_ckUm!ibOFR{7yXpU*Y*9Ew76 zl4s<&R8ExclBBNC-&vVX-kV9SXdzWO`B!x{sbSDZ;^Gll%SI=?Dx_;(iW5$ShNF=Fn%_P-mT{HZ^KeiFx@`q$8)@5}s$lL<73 zU)VK3U&1{ytJ)@LWh3Gn#<%$DLN=>}u}0I=vs@j>ex`;a^VegHisN}QAQ|Tm=9$I^ zC$M$gyF)R4hsnZ8!v9;(aAlGQ{~hQ>g|V^oFJXtk#e$=n}3*(HLNg3Hs zzP_6c$lLmU!)cmiptFC1;y^Er2gu;&aM0qwHqvBI$D%OpEN?0M9w%Djx%QgV8Q z{&LOav@UZx&FA7Yt(uL~2*-;pupsYJ-Af3&WVCnOZ&BS^_$rh#Re$DXlKL`vvG}I= z9AjZ!DdqJ9O)BeyUgekTP4#Gfx{Z52`0jH)-}Kyx7t-osMl>imFdVOxZpO|OHm~Yo z*c~ex-W=oew!(3Em{>XAy0BUUg{fl5P=bjq*g^i6`m?Q(XfessNK({4!&uy^jzoR z9`y%mzE6~QwYW2Xm&Bk6=kb!$c^cFw^B<2T&=2vwf(7(I9h$VnhIsyp;B{LNcwPkrWLf2X&}&~Z?X0_A+=y!&+M=qf+V zVdh6*R}IwH+pHvdlgw|+B<8o^!vG8O*YFNpIdP#mpzn;GD>?3}qgSkte0d5#QwbRf zmQex;eu&YwQSCAiPRERkC?0chwVUtNX!SJO2%Ik|f3gx&Rc|PFxx-A z&cWkr^#@a?!du}^sz^9#DqK184^h=cicupUz~4pKk2I>pK56Iw<}SX_#MQ>Rs3CI zz5OQp7U?&(U8Jw@lY}%bZ9j>={Gx{oKJgA?CqJRb_vuY28OEMPAw`^FecWq3seONXJWoF^_nN=CnI11M(rm4JEh+Wp$Jgn{<#zLl ze)M<+(Q%^LI$8T|*jI4OtlnmuI!D}Th{=1&=p59eB_kzcx#_%+g%m3uo@{UDlYMM# zBlP!SV~t3$9Cz^hb|=`_pc8}!>+bWEiXJ8xrhk2D^fHDkL|3OM5+zRb=bn?=gA`_u z(S~VMTzer2ELwbStJp%a@q+%O%4Fj_X5;67oNOr1c|X?5Mi~78k@cnF$~J$&a1sG3 zWxe(nnJ*em{&FVoAtM{_fM7Yvv2H4jS-o0PBzEmK z_NQ;S$*S^y?$#Q)#*MOcX`C(bwOddHVHt4Vn^vJR%6`4&vcUFtUt-@$3CUK`aX zKC9wW#`pLH-n2|XNOMSOEbgR=$Nvr@r8_EUDTV0|zud2Rw%XH%580lIK2Y}bw#+Xc zMfS9?x6PiO!acI5@3@%kiS&HMSdDAAPo*u=eV*)V75b_StstXf1CHqBM4N}KmUHr8M{H#xTEfYQVqQ7DKTbB&YhhY;PA2jx_&q>p)c-zFUI5~_4 z*fyJp{>HG0XU)LxZ4(DSHEiO|N7yD>-sIx{3ETnye>(YBp3^5LDE}poM=s*U3K}|C z?PJGAwvRn)m3?fG`I#AHA5(kU>|+t`k$rr?#o9hDxI?SGn`KM;n%;~%S>s+J^GS?* znH{$>?olWjVZ*J(OMAAV&L%d{a-wb@tt>LorT1vX8g};vk9K23l%Z9s_`uzoQlny0 z97VzMVo$0Safwl}n`L`@BAzlTj!tr@q1n8U?dRJ%rK0=ijt zxJOlGQT5ZfgJr%v;}+j&!%fCL8Yj25;XZe##x)o_m-~iT@$!RK&pUFvtKw*uX+^Qc zCV@4uZ1DO-s>?)QBAXX`jyg?Lx#-(bE)xyYKYzL1rN&L$rZYRc)8mfm%p=|C@pHrj_nD7V{H`%VJDm~cUdg4Zv7*WSx++!tWTdO& z4dp4&R}}GMbw%%a&m_c6*Sx1L2h&Po;f*>5(A?5%w>%fe^U-d(nl{PZ^2SHVVX9X#QfOieFuY^R^V=L2Q{ZOStz8i*Nv=-T=uL(p4IY`4|j zX9&Tl`yzTnu3KF!wAIZtcr)rAdEMAof6!Jp1y<>x_x65N#9Qm#ZFSqZ>3!(9>c`I) z^^LmTPVo|s_jL{Q&!e9PkdwbE4T=%3nP^r6i^XFc6`gUe^?;12ei@`L!yT}2k3 z3B$k1tUhwH-RHy+Df%dJNoT7{|8WnCZq{|9#lM}bb+2%nO5MIn^mrfHsOv4xmvR22 zOPt+5GsHQ}>|wmcxoo{5&Kf&eoG0PVju7_)Wq$EsqIaPkcMk!3JEJP-Q$qZKwQ&7+pxD? z_QxB1F1u|0sbQB}@6oIU87kLaXV~R;FlR765`ovj_(n2x@#Zg1##Pri6=BJ?wav>K z?C&I+(C??$GQy|TK8LMfea9|Q`tB|BYX*|OS6pYaqZYVF_F2HiTHn`6Zl3Ar;-(RE z^TPorH%g7Gj(Kqt_WI0gw`zS_`PuLe^V9kb#n0O^FK!`z_P4X~^Azq8Kj$0#cUl2DDme0Ae>J!%<@e|FeGH0$et;jh8=_i4WZ`}>#DiZSo+PrH_^m)#CUpeZ}8 zULUcZOJjphG9LpBFPeQQh5Q(>|hyrNw<F&AsxY9F%^EJ46<7{TA< z3gXCKrxB2z@fJYdA=3!L@KP=nvO%=EUy3z$95n@d)})` zw5c-xabFU_hx7%s`8irk+#}JR@{ZE`U-vxNTt+n=eg92mXbk|=*>N(=`HadzC#uq&` zY&Xjr0iP}AHv(!eQXP;qm;%op_`ZjN4UkzXRT#LSZHqX2jqp@4FOb<;G&=7~vU1OMcZxMeN!KIb!1&&hX-`YKrj_2%oQN zI$NsfZfWT+x+Tkao~Q^upB3|bHvZ8Xf<5^>JTcp+LGK<{<*@G zVa-%=rMrz?2ke}M&)=Hj->mvuTi3>)retffOTKU9yEyIPprS1N8pZ-fySkgm|JlN5 z82Dn(X&ZmvoM+>YxnldFA2*Pe)R?Zsa$T{Wcuij>is$rYQ+}w4QqB~fxbz`Z7i{zh+neXH#Y)d0`O|qIT$(P6~$?{JJ`KO~P z8>p%WVxl8V{;|)+Kp6JV^3kSai6=}*Gh3T`5T_h%K4Nb(jP^wOzc%~0tG4zxF;rjH z6gTNhyqSkyf(_cLzn*SV4)1lbAGUp1`8S$@ln)|aIXL!Pn+b>CarosEWG4W*wXv0Y!bw5n(Kz4H_-e_mMN|E7vS^?$J6nmp$W3hC_oke}p?3{_ zJjG(aYpZMfMd23o`qt)FBZfL;bBm=psc#=bo*Ym4=zF4MaArC0N(_(yz&<%03P-`I86<*#Wwh9bLTh+T-Hc@BZ|F<^d|Pf+e-FsDZVC z55uu%ISp4w%Cr1SkVi^27I-P;vA-awJO<#W(v&vdClC zZ$afz)3lG8Ws%2!z9~r_{ZOOq@<=iK1wY_dycREz+We(SyjvdIP%(QhrT)42RdpCS zrOIFEQf$g6c@QA^3;iX35#Lo+VD*&q)$<1q;AZw*O8s;9AkE65RDsc@80!u8m~Nz~7tOR0bEVWe3(lqxW~6ivLrI%u$_3an{3Vc|RB#U^3_!h-1rNo7&{l2S?u$qcFcwEUQ zQOgsIwYUdbjGy*8uqnXLoQ#X$cA;WCbr{)*@%&fD_?2IhGM(fyB+X39VjsgjAz33N zacHDHYIxYkHZ&M~y}{jo(8N^M$1mp;ukDJ*t^H|iWw%S0Eb@iFkUbF~>5u*b7Qe?{ zNr72hx+aN}e-SQN=iJX5Y_tZmxHNUlUfr{4>9L+*ELV~QI?Yl@L#3W8L}+#)@fW3-^~4PbYtFBb{S>IODl-=eX%9*@dbzJv6Q* zf26_VG(;<5>yg;no$D{F0QFqxUXZe!KROKArLt z1?3f3O9j?4xSgBEG2Ii4?OM$UM(l7Khn|m?5U&Slk}M&%}r16 z^PsD=7=LPvzK->$(#OTwJq!Kv?>>JDZlYkfKZU+IhU=+A+{1{E^4*#u@e_W1k%dg| zhfeYHZOoqaH25&rU*vh;PdMyfg=1hY0ba z9C$}QiHzTO{I`GmW#H;4Oi;56$;|V*z?|fWl`CZ$kD1I7^Lg0H@xe4?> zT-L^fG|_%5eTPCmot0Ztmev#x;rF1qq_He%Ebs-SENLlAT8dgHRY_-A(pfChC4FT{ zU(rFAjFcrK#RiRo#T}v`GfiykMQ>uou89G0cjx)=D-waum10xZa{hA~J_LFs#HNW= z#||2l#>l5*#LLxaV-vJjktJ1thr??0Df}v~Jd|gVTX^va^2!|Vkk$PX*(R$rF<6$C zNdNJp9`x@`aM54IP5;`hWuZTQ+GB2g_wwLDwE5Se?=-Qxdw5!@@5NO`H&?B2ijG4o zKX0*c<>=2skH??^w&zzge@&(Ko2H4OsZ2NP=n7eSMVd&ll-84_^+Y3Br(J6`9adKp z{&B?An)VuTX}r=}9f?&ZP27wVbF?2B)>%zdw*A`4k&iq$4%;5%r#-3p)s&=(iI#Rv zYVvUYjiyF>b()ykEj*oeKWy@B@N#ukm!;k&Te0@w@oo-F!QU*+pQ+EsWOQJC8k)Q7 zL>QWz_J_%ZmY29U&ZW5*aCVNCmBDTQgLchbv)RyGDfp?4xjs{_+fNhQEv=cFsbeWM zwHR$FZ7eOVahfR1HR;t7NfQrR>L$v%iD_cErPP#ZcS~s#S+_}=c-n%SBukUh#GxC) zvzgk5OlccZjH=?YnP##TtId43$&f8Yfl|n~NZX4khwU3o>6mgz>0w5N29mc1X`;EM zw4p3*m?r93N=>QPwn(RutlKC}9KO-S)shsS{vC#O9xOEFrL9AJUdd&hr*Tq^%R1No zY`4z&8!Zwnh5Tq0$zh+(Eb_D1r=?Wer}(gfqSoO2zGKc&!Z2NuEM=A~e$XYUvLsd9 zeOx^?T$T(McwSJWd81bvDQ+_fuPGwUz(p8%Hql;ERd0GRNx9BQO^i2uRat9Zf znlLQ)hKerB&CFpb=$~6lmZiz)&n>teWNC*q(Zo{PQI>X06V)xHIwFeSVZU}Q zd5juj^Gz)o-hE8_i}s*2k!az^u)Xj0+P(XO9Gl+4wy*eUtKkUDzbUKsGM;m(IX-G) zDQzbCZwCG?rCQ_S_oLzPFTD6K?}~1T@0-S`TOVz^1Kn<>L=59G61h9^6_A^A5IB-FBLIQnqCGK93kV z>lc%9gQBtJT#{e-o=ft*O*%^*&pqc`Kgu?k6K!weu0yW*R)r4XS=F)w9=y$ucJa0a z#{xL4>VdU}4m5A{H*9^xPxG*^L(&_VKf}I027h)fdBn&AKbxFr9g7|OA~xpprhT2n z*)%Tudhc7ieLcIz;4N%^oc-^IzdNb+u&rhmstwyZPg7k*#!jq4bd^+Fz53XD290Hu z|0~XTCW`ZwCF#Cb{H{xqBrO=j541?Ir7UfkCOXSfyPiBaZnxjmlfm&N{6e{H-K8(i z-*H%6lo!Wg>nDENK^MOp3LX5WiSe>swm@^F@cQ+7V3?I_N@8Dov$VC8MC&wBw~bk9 zjuaYOa68Moozp~BSz4mhD*WUjwIlo*v`uRDSGuJ3>AN;N30q#S^{U$>wk`IgiFQ&l zC34Vtp9cq5x;YrU!o@*FD+f$}E;Nb#i9k*=ZBNj9=4yK)y9@aYmiJyeR*ufmW{08L z*bdmViUpzGL(@JJ8ZT=?tZzcaHI;y%e|J`Vg15c1Hpf_@?=+zqZ!_vMeeH<8tB_Ol z#joxXi=$bpY@JSbF#h$?-X>k+66dT}Nz0x~xjtefzCq9o5F8kYGF#Eqt9YA>3PI$N zkctmYNFpCX)_76T-vv7|390d`(U$0qrgS5Ofks|fX_r!H`4Ch_G~JajWyQ zcN`KaiQZWFPZd$SoKG$_DsCS&U`l#k@q0A@9Q<}PFih($h5eQbi{BrXmy%x^E5PgM z$EKe+LFQ`H@?%c8673cCB>n9sy!6lh#`cumGXafM=_5wDP3cl=BcbJ+5gXvs2e8%B zZyCRM3=hOdWL78m_HC;O7_Y?jZ|ac5eSem-tuH?zfjst4L->=@e=YpF74#3>1o049 zwi4LJN?>SyDZUu`Ia1`(&mjoG@-j^r{$uE8=fhZe0zYoi`BEq2g zo8^^{+ogQDMAuRdEf0pS&AlAMiyt_|Rw<}nfCiQ9FJ;bbHnHU`EvGQ(=dH9lV%LYi z+P2fD8W=ABEy2Ecb5N|nVSa1|Y8$P2gn0WMc>9-X9?L>sJ<-R3_hf{4(GI+h5#cov zD{wxeRend`jD+7Lahn5gVMKWKM0E#Vp9t|bJz(cIIzqhr9e6921eIUV_?C4YeOlog zi{ID1+UHw98Ea%4=7uc6pRcQ<@K)h-mj#ru;>DL9k3MxE`bH8SWvqA`-f*#85`C=| zeKiS>GFH5MOOHpN9uR$-TL6zTR=f*KkC&wQ%_Ka^Sn+l&E;YaOjy%!VnD8iL#hX-m zyvB;(-OYhV87tnErN^VUzlpwSghv@G-roO~n%^dhzLtbX87to7rN>KF^c}#gX8~ob zc-NO6@1(+en(!!N#rxy+Qu9kM_>%lO6CP!(crTY8FHg~T9J9~`l(FLVEKA^u-V!WvqC^N{`o6;jOw7c$Bf?#g`tho#J;S z;Zeqlx8c=N%de@ztI6~^@a`==UOk1kxf$rAjFr9%gW#1gzUopmEBOlG&`3C(@g3Fg zSjzg%N?E^YB=v*#zv2`Qgk3P)VJ2dssn*c_naH8%(;d$*4*&TH^!!Z6^XcI~e;qx) z&GCGb@Si``8PCsgJTDf6&p$oC+wuJ3@SmSR&yR6DpC116*U|Iq9M3li|M^p$@O)p# z^Wv58`KRZ5IG$e|{__*)`NfXs)5CxMI(mMUrExdTVgfGww@KMxy16?k0=2TUsNR9`q!O4{k=vK z*4oz6$qAP4HO#%4qU_FPF$3wjk&lm%dqirDR3xDBPcx3O{RKRM_Zc z!;e18_-C8`*t1IiMZTD`tlyZkO8?onpR=mp*sOhL+dh-eru@$~{bw7$X4by5?OzC* zVQZi)@$+o^S3=m-mmxkwzh|5Nvx@(}f&Q}{fBqkSi182f`~T$g|6%zc{-4$U_iXoH zXB!{#N&LS&{-0I-*1X6UeKz~|{|)iy?2doRU_T|zXN~#xV>h0#&5^4H$}-=kbCr`z zGv7yj%X&gaar#TyV|^nR(1bX3N}+k$N)?)2TTicAkQp__*W#npK$qhq7g2RO454SC zxEV(hi7A_Y#o-Z!I6PwP;EZ}=$xM1-C&teQ?rrUIlB(;Y_-e@G_e9mAgE-TInxRQK z{iRyjeC3}`XMW&8q=c&uAWG|;-K8))xpQ{U<0JiXRQ(oSWjKy2ywA5S+guw`^Lg;M zJwpCkJ#ea6EZC^{Ys&n6GNWYvn*CjR{%}An_-h)3zrtBw{GE=FznfE_zm2(yzsAhp zZ;zJDU$4JP&mWE@27ir%@K?o?zh<)|v(GIzfWMzM*z{K^4E{#{S$h6L>#wQbOMgQn zy=478cD(fbC9?h!gXpgZyx#hT8s>xWzsDlv?;!ElV7=0x&WBp}hmCWCEoF7nH{_3&*>IKo?YpI0>67x4}YRUW^!ubKEl%2oJCYG$f$9_N4{Plp>yZNj7ScLKAZs@PUdp7-bpHMP?%WzJ@ znbqGYc)gpy_7U>;dItFGu-e97#`u!?+m6!*&Mbek;T3NFMn}kBZQ}3NcWwO5dZc9j z4&l6lGt1vnc!it4mm=iv;$-yiQ&!pdTk>$p{8c^U{B46*xcS>2A%C?gelA$4_^ZkN z`zH^T%wIE{WKdfD;rki%?=^$;?}hLR2Y*uvOImNhe7{uh1E7ABQm!W?n)NZ>KOLdG zE08^1wL-}|ndLojT*>lYk5dCmEAM2McXAMUkB65!}P+I<4GJh?D@b?0|)WKg^_C()<(sR7u7l!?v?fRv)@6yuqe>?u!=J)@} z=jQ%tft;3Dt6YmuDXi}!;S9#C+|tVb|FrroOX=^WwTDvS8|&xwlTH+8%U8-N2GRQO zSdM4L8*AajC;7hGZCK+4lg7JmQzer7eKo}Y2j^Jg|2piS@Ym?AaXjbRw@u}{R?Fj8 zm+y>s8SzDY`TUP!eZDQ6jY>c8>?6MP!_U{3iHOB<9Qc$r{nlzeUwY!aM|@&SC;kdN z-M43uFFmREIG>0~C{G_8XC#V__o;rP2bwq5*(u}8#5y}&h`*|xM!!My(KS)~GFQ--nWLVOoeCOhSW5}Pvq zxB-M+Pkb<1$>g}Kat>othOy~F+&OQsHf8*A^r2NoXYt>A zluX*mDs-+!Rt{wtn=Zt6A$=!FJ}9v%ySP_PCh8HDdUf$4>f^(jmCaKR;kL^lwoYT5Q8d&qI-^fP-0UCx|H(%?rtTM zRkBJvV^fB)=|b$N9SVD~d{AOj#vhj=u_tNlZL&%NV^fB)=|VKB9tt~GJ}9v%=e;RV;_)J(5FD&lwoYT5MS2~g}p~UD6uKykE5@|5M#GyD4Cp;RjM;KWf+?-#CPY1 z!agh?l-QK<$I(Y(@XNb3w%P@*!Pt~xY`PG8L&}?e{Kx3lCFLm((YTjq~Y}x)4#}IW7e?;&QG) z0a_%yNTn1{MJ=vC;ZMxsONv(FLaso;MU3PoC>Dr+7=c_@)aO$2G|`Al$uUG7Mj$&D z0lp-&6Ac-RtVG<&kC9Tv3tUP%5F7cDL?$lgOX5)6h|BbS-wg7JckqEfHu#+r%RKbr z7>IR(FIp#-v>A_oazF6c6PEE)J9N!Fep-XA{szl%`DpsFvp;XrZL1mVk! zE=X^YJ9GM0w4T0Zz&I$eNAwh5*2eN_JTS{B7YO7L{#EnoS5(%aTJ~H@{d0+6fYOjC zo9W8Ri}LeDc7X1Q9~b>uoEiuaw0IIovMOt(vHhZzSkE6(L^j zkzc%sKHNfB8-Ay9v+sce2suomj4!h%TqR{>d0(p7|MAJ<)QsYcm^Iuz<|gPf-~*i# z4yUHKe*6(-o@v>&2)IvnfFMMrHWhr5EgBmVV+VNF8xCpw2qI%{Y;tH|Mo9J^75ggH+9dm9lsH!q|xM=_D))gY39K_o$l zoNGc6>61-LA}QmK8%b0_F$5y^5}oOi&bx0{@@y<0lH)+i5S?|zO-$$SFs%?upUreq z$N`-M3_1xy)Cx&w9oeL$lQRCeQAAZa5@x0DAaaZ(a?40XWIOqU98gk*h-@jA-Ackt z2~FhFQkXylkpv7P2||o%6-t;%vPnrKW&ClOL=}WdAfivr--;KFqmn39l1wGzsRThw zhz{Mr$YjbUiBlsKBYh>R9KBM87^x|K8BUB$+7eRQYnTxV!3aT!|6U!6krdga zWP~#QxM@UHc_Q+K6c9O65;;HjL=rHFBnS~5 zlE~q*Nl7GS{Bg61stQEp-#38BIg-egw<$?ZlTXO;G-Zg$dgA$EB+08o6Pd?EQuhZU z2^d5Ygc#B?lqAQ=CMA)S@y9()RGmXa_8}tYNg}IiB43bC$bmU!q$K|uN<_}t98!|I znMmrGK_mf#NP-Y+T7)8Uj%-pANg03K3q%!u4M>Q$x`N18B$0RBswBBeJ|Rc=lp!J$ zMH&-X@L@jJV@Q8r1$X|fMU3^@y-43V8A{v1qXKfZ}%8LlFrGpNl7PV@Om{cGOCdSyXQCUte9Gn&Oqeiju7Zqp+RXbGxggy0yxa82dDswWO;)t>VLpM9cQB|vuySGa zRxCCDo>CYTPXs`zShEUqXFfF~RTTamL;DP(FPHU2OQ~XyD$9L`>J8_z&8qAqm!)&r za#c2NCDj|lWiP0*1MgDVWGB@cx1|{VvH)2{F3dZiovqXs^)KC z=7yTtURGgJ%l6U(KTWpw3an4)6&2do@lPL4zgQNa)F0@JG%JTvU#9#8*}0U-j>g=D z{w5Ufy7ssji#Ghz362&C=r2snw;&a?`=^hidI3uPfl)}aaws+6C_`}kSHfNF4Y!Bk z=1~0rrT)M)q*xtBYQRy3;P|hE`}!77>IO61VyYjY)E{^OX;u!U1{`Gwj{i!ynci?T z-SYD zlUbVN`==kK`Tr9qYT0EUkUfTH{2+uE*1+Z_!V_pP6?c3I7$sT$`Bm? zm2f@0;aW0WBEwON->5~Jl|!ikM;U_SzY^|Le@|vJ8LlIW$G2Qran;1C;s$uOiLLq11q*48ieV3D?LQ?rEkjkLm{~^#|4=&B~$FfTIk- z@m~qIyPqesG&}cC-$(TWl==g^k!IykYQRy3;P|hEo9+$w0#jE+^#hdp1BFPlaws+6 zC_`}kSHiXOhNEe@e|iFDR~S>!94iomG%JTv1CBBT$A2Z$ja$q zg`*6?@m~pd;wDdKPcqyXhNILU7>QKBnV@E(ySax4LHgW9RHPYao%vbOx+r)AE4A9Sc+7?a-f){ zB7)<;5^jATPubD58cX{ON2x!snc*lksG|(Q@m~pduQ%LIrcO}(0HyxG_eisHC^g_H zLvZ|8!Xgggpkzly z1jm0R+*EJ46oyM;I7-hdI?50n|CMlaz2OQOZXDGQP>S&#QjG7A8gP^$IQ}c) zx_ZOW)Y(6M4%H7(it!y%z5B12r6PjkzY^~6-k!`JXX+L+9HkiFF&w1^b(A4E{wv`Y zd&AL$8RI*uAD|TDJER!jAvNGALvZ|8!rkHxM{{TY^gUERKq1p63!%=EbM;U_S zzY=bgHyq86<(J-SJ3LSmpcvmFHQ*>iaQs)oUEmEzQ)RrbM)d=fVtj`b<2$4V9AyZO z|4O*+J-wLa$r8cbO|YEb%m28h^zVP;dwF_avM{?_XVL6=QEXp=n6g=Y zIR8`+7L4)YBrO);AI~RCc)z=6k$4R|e|XPzR?pa(DRfky@fKw}2W%PeF0tYj-e@N? z96azZI^RjZQWX=wI&b>NV=vCGl|ozmo1(Ih_eu91eb|>i4zFMq*P7iCrJJi@!aI%H z0b`>iWBAD&e@ZkO@Xr*sd z{Pdiw;U%SmS}SEWfP0*fUCB9GxE<6tOJ&hzW}Je}??d zs6E5qj5iI>kiR+bBJ?*`JctYr{5t$2viNeQ@er@hw0~g#D5ypMpWq)3eMF|;Gam0< z{t+>KXEeUR{v3Fb+4Gr}ALw($tH|gBp2I&P!vnu(+Wr!QdRy80k26Z&8Ml`>I)5@K z$EA)hpwA({$n<*_?8QN!Gag_*b11^`{l)*_HI5@=Z1b7A*OWZIpZI#|$M@Fx%=Vc< z$M-GT1{>dl-}+BQwx0HAL(JczG{5qEj>}q=%sZf$z4VIE zUY>z?#pn0f{NqH6lI>;aqSD)o)jyU^4{9$p9E{r5Hzr2N?_c;-O8hiR@hi_4tP}>n zqZgK*Uz{(f{G*;&KP@P~jo_YE#hUzv;~!(ekoJ#@t@g6*YCCM0{$a&yV8t8n#)JJW zi%=golRnb!R{D_VAwGOn$@cf-E2Y;5&O=oCND|Gmg6iX`mUh9FP9IKUT1a~UCJ;Tb#o_U)g z2|t|fPi<+n!oQkJ@K|4%_N?%DKgPDduv8(%V6B+`g@XtF#nZj)`zM_p`zJof{z+$Q z2OZhT<0fNGtSmKh5F*J@--lLxI?Rj@+s2qYj_1RJU2l_A&9r(%VNJ!#?VW z?URDqM+>-j+3lme6eH_1(JIF8Vf9wnaP$eaC_J{eCTwpuuYFXZhHYoae91Een-HatcGXf_oWE=J$M29_o|VKUpZbGcv;E( zuAg6eey!t`s=@hv;EG`UhBIFI@`%|#HnRFhJqK(!{>%Eo@AV~$`oI3;JpTw@U{y;v zcy#_zqPXoc$N5JR$$kD&iTu)eSF~3SI>I|2j_eIIV7!P|psdn44I8&|6J~!^=Jwk= z+MihF_NlKcE&ol#`Wqbl!{*Dze^MFRPZI4N?N2Oo`(@OBR|o%>mX-gqwcp;+{>1;q z-n+nAJ+1%ad!{M7+RVsA2qPhK3873V3`xUGnj_>?RCX6h?a`ppm^SUUO&sIS3Ar3X zhos!j#GIPwP>kyd-DHhDhmd33&ivl*XRXg|UuJgYeE;9q|Ml(lYR|ep>silwo@YJl zS(nfMaQm+nCG@|?j`sh5+xv0Y+%*OzBrQ;aTCi{@f*Nhp2x0;glfH zwbg`c%5#pbiRZ-MSd`_SLtpAHI>gN5Xdm|XTW%AT)5dbTz#q+zs9ni~7=JK6+JI>%-P04t0KbkgX4uxKf4$KqyMI4+bN4R;`%8~b!M+X^LwEwANgV|w;-9;@ z<9-d=w({Kknf^Uf4ZnX9{I|O&!tb{e@YlPzK;u6t3I4hR-Q1n2eQ5A^je>^1TN3=~ zI{|-W68vWlN~BNMoq%7nw~ViQIR8=LB}ZodohD5WpB_&)ycs(KZ&otABXW|%gzC~HkdD+L-xY1s5fJKJw;pb%d|2Z%<{INR(zd(;y?hyc~GC(f4g6wPI`gZe6MdT3YzH) zHv_7cAEAaKWd)wH<74qW>pn~Zpw@5%R`wswnOs6aJ2cURR`j2&vqE-Og&mr1g=Wn{ z2#tVLjVor&wv*>DgnyEJGXg|m#jKb~TiL(B4na8^BzjmO{>7sTjcWE0wrPR-UW=i! z_9K*no$&0wLeJNEP}<|KitYqGEjku8R#kvq_Cxbfr#-@}LY;`oKtD_$kT{?QbZsEf zg$6oh{~tHON$&lQp+PlAqnerjq-mwE?t^JQunt`gR@dZjCi;(3kfUz<_a=|;<%WHd zm=6%Oef7r9(JPCC#!+gFmIMn+C(b;~j`b{^h&vfVxM9(<#%NY_(6DHUUmhXYy7v#{ zQI0oR_CQe5p{MFZ-bzi(7g5nrCKGyy)g9eE!kr(y+^(HdIqIs_q9!07(b9rQNr9*l zgu6#daE6_GH__4_k&+$>y5J<;xVe##N&DNh2ev6%S^-KlMF)mTqh(Fe(}qJ|Mf0L( z509Rf)4T?kR6g(WgJ;OzLEP&u((^xgO5TGI1#tpm#=tl0jg>`>Nb^D6T|W&>>&LnS zNgSnyxA0Rr!{3YxOVhCa@E=@*(DL=!yUwbi;Q6aIoZ4}@F3)Ev8}2jZ@jk?~V_Dv} zmF07Goi%Gc%U5ow!Fy24H)MBQ9xd}%Z9KK(>$*1Ii;RzCQ_TnXruCPqzOJa+4pnDu zm8!n2ZBR8ws#b0kKpV3=zV1aMhk*7%{gPnCGkBn@I8dtgyn?>tK)f5sS)#g()1G9I zwy3crR{U$v;zkH*K;@26%|oL9D2a6*xZiM}D%k6X=3y6!LN-!42`OZxXfugZf!Q3xRTE*C*aN@mTrWszQS!1ORU0D7#|SFJEaWbolb|H4NAr@+rsa+SWKGufR_o1{73pQZp+tW z=@Y1I@U8RtIxcUE2?jjj*138?`9^0hxP}7Oeif=2!H9(^2|~MJKid^)i-V(5i;Fz(W$O z`bl`GNxcFE5&xV#)TAb3;4Cbg)N>enx1e-Nz(kudTA!|S%gbb7uKiWBL91oMLAX}@ zRV#`<2lE#B@!^f$<15HRUw}l~XSVzJVN9sE5<;DV!KXNFD7ENc&CLzH(3+_`fr%Gy zZEn_rfazGNBfcS#l{&*t?jM|o`Z4|DS`Y(cGuX`*Q~ZeIXGX=Ea{2$FC8*SluhHbI z=n0Nveyx;(W!8X56}S>z&w#vjE{fsJ#(Dt0n6$1t;vm07;~_#!5J2YPG7k6`KX zM>6qKE3v%8_?}Eyjf7yGA;3Fvn(Oe%&6y39pgIm2KbD0aw`=V_{!Av^X(fbmEKI6E z7~R}C8U$^7fH*nWDCCiO6p@*aa5~B+kCgi%4*9zg0Bk`%s{C4z=yQ}8;_c% z<-p1?IWPxR_$n5|tR9t6D#;s>OUawAC9fMIlswmB#I~=8+~u+#7TWwi5G^d5fF@eu zcU$rI1U?|y+<_zK$mhUd<{7hoIS2jPMxPm+C0P*D8^oweDQ zDMAz+@pQ&V%9VYE@p%oE^-y#1hHKU*2PX=s5JCM>gVICI6an=woNKX%TFP}GsHp@6 zzM6?=IU7cq$W@3i@i6eX=B&02-Avx`Hn+8H*bQk~%9{^Nkn*psgwS9@I@N+y-Y0m! zpn5k^eI6(PDS!bhFhx*3&5f#*8_@t%=c7mC%L(l^8~8PhZiM#GXo{r0XGiyEZmk`a z2Q^=?qQIn1FnNWT9HueROvx0%WGPOA*hG_Z?<-)kCow4_@LeoSa%ZnXC&u?;;&%m> z{Lj=08|;KDbix`d0V?AdR{5Ki5ITp^JPXNCKSs0csC4kVMytQl!A*8lI#_Q-(ZOG( zgJP%+1PRdDZbGmVP7q$yR4f5nvirMn1j+9wS6lTjwh`49VO#RI(`X8Qhb#Cg{ zpcAq}=#PFZ>xGyR@Z8t10&VIwy^{{~y}rE!RIhknoifVGy4K3NAilrO8enBzWM!Qg zZ&Ovr1*0}?Eqk=p{REyDgDV?TI~Sm(6Q5K;=Om{;uui$B zg@f(>IkA0_iFGYrVThE$1080(L_KwYtSBOI4`6|Tr9RibL)2pNJqARe%HhiMH{1lU zfYhd_Q9uTw{!;bFc4j$359?Uu=Dy~y`e}Ii#S$EtRrOPO`FXLT^?1}-e1F-c>S7Bp zs~i_ao_YdHTzk<~z$7dnqPq`K2Y|cq7$#y7c&V^M*G~6FuNkNJ#G0|uZ?73i1@O#C z?KOGynsGJ?tw%@6@$(Q4O&K+A;)to`Q>I*b`KZvCjQoY@mUb|euv<$89*$|1E8D6* zzR>Q17YWxCZLj`wzFCtT?u+lsoQfPD-BLhZ7dbmeJ^4M)cr~d`&?@d>y#YOOF^V?F zGT%?21B?z=?v6@;7Qa#15{GpRSz=v4hv*=K)NiXkIk)P@UC_Da`6Sv$M_` z5rTa{fB+}<0mD!uzPXZW#4wZgdrb#Ow%_-91Cn59a#-L!Ak9eWKbgQE6&kDIUmChZ zcVcX4sP4q1&^bD5O6WA56$%;Eb9Jbf&Ke#94cPTlLq_!+8ZroX%ZLVUgfqccXf5=Z z2^83}j1b3T>`b7*EEyqYojEg;VX#riq{v2KRWJp~nOMI<8HZ zm7;^KtjAz|(mLg)1>RiIOX`7>!>e+`M{IzQmu?;RRT##~)ji)zDcl`7lGG0eollEwe&89ae|7o;n(17~?f1 z_^YgdWfAepr>?~wQ;4%V2MF6^Cgpr}~QL;CqqVBz!)0?+BbdxnquYYc89-pP@alNza-Y`Gn*{vuXN-GET43Lze36J-B|2E>=!#$3zNu^cZ{%sqy3O8t=Rc=Eh$>0_JvKlC9k7I98 z!n4C3ft}4|#=w!7-pXlX!!uvCJPV7K$e<9SEBjZVwl99VU95dMw+P|4uiSuz#;j}F zo?W%7X~0WX64ISU+y1=S{6(TR+r`I3o+rNJ54@nR<0jh;3d zzjJf^b50u>_tONw9G|ywo7<1$R+i~0`iJ?Z%iS)26Um`_OOLpF!z%rLL>@*vfPwc9 zi4`wamxF=96zn&~0Lzl{U75TFKGFuNaE|Kpp9n{*m*Lfki0>V5Mx(tpxi>Yio+LGQ z50?}U_p$OOaDgbKiyClx5DD*MG1l-JiZU|B%DsP!20Iks_0Gl5*l!f>FYm>YJxzgw z;FzBieikiS+6|dsLto65#D*2XljSF%nfOI3!Y`v_maFI+Qk1C;_o1k6>lVAM9_-`a za19?H7WB3;S1K~G;ZjtzeRXFV!rc3@?!m)=l|Y#NS;QjDNJE%6fuIm(fC9*03_*rk zsnIVqxYGevBiTTA$9pKZBK%%Lr@sD-{by>!3KY=gm!Z5?ADu~%i*S{Nf3u-P8tBwz zPv6Hr=$xXb;23=h^LS}+{kCgm=&^gQmi>wkE!O(=(~Bnr`wYM*7Qq$FdeEJ9DcjkfOzCNhB7=nKU!e=0S*_9I~j=3y!%`YFCWPr-2aBj@*2ytqY!vFWBc1G?<(PUBvd22vXS%b?*Yzxi zF7>PH>NhnPZY{^j2+S8Sn~#KrK^v3%(m$d*+u6n2qk&B26HCj!VX{7oN z{939(x+b5@WFPSkHmd~-xM|<{SGixh#}IpKdp?a)g+sN}*(f{63}OdaTDqf$y~h^Scjy0))p* z8f_m?()_c{%|8Sp{4)zkEV~4iTI3&^-Y6sdbJSqrpOr=Ha8g;To(Xk67%;i7<#d3f zv3!82qvh)<)VZ(aXI1@N5z0?W8&=*4AfULlAZLRm(*0;W<{)ejCi^O98yJX&nO735fejPgwTTS1e9uywp~!9O5*)LR=>3{%?%zbJ zNmPrWWHE#HeIgRT*B4l&11~<-sXf3TU?}3KUOd!csF>ieK^TfbFqE`(`XLTO$#SS_ zqa3SX888%ksCHWm6R4=>o`_%`sg`~Uix(Ea`-IG;YEmug`xTPgnL}} z#T<)&Cj#=aOUa0IzkL5xy7g?kHJhmQ__5yHFim@YuJ=QtRqQW~Rnz7iqS`!Qn4^Lj zVg5$KA^cj*A)o3h4JuJDIXpS@dRs@m$k3jL!`PAVWC6h6NSG+fu}FE{T zj3vgND5#gAl6WXBrnzG{?j@i_NOQ9}E7SKK?9JQ>0~w>G3K3~jq#{M@82fyn!o`kt zSL4(M6?#CuwuQb}zq%0_B06g*MQd~r0q9&x(Lh3z7@XU=;h#WIM@CU7KP&uh?(B^s zYp%)^x|^}^u-5*$vloa6uMu&af`y)lqilBI*bERxPJY%9b%9k0mrO#~OG$v)N7sy& z)y8txM2eE@@6~esCYWSs*{%;OqE^Upz=x{2VQ<|HnQkg_!?y$Fl|@VO>*=%L`8Tam zw6OwPJOR&nx}8YTQa81vX4qZxAg5;e(&bxlURYD8MAvV#HB!D5I4%_&ulqnX$6=Xs zY_Pq+2~-Em%Fl`wEkv0$rD}`R#NNmJXwm$_qBZ4k(+f-vdS61=Tkm!(ELDR(A~mqZ zF~3UT2GANh?sfZlm>~4n4Pm`3)+?0edU2KLS69BUr5R`xep}wz-9zDr@@y_A>_%(f z2WcOIBS_C)gU`V1)oW|I+3PXnRMy^sk-+RV4iU<>*hWK9aiN*JMj~83Y20O3jvnKl zzwG^`XO49u+djaJ&_re-t*Ry%-GV6QGRaI`R< z7!~$HGz$w+&1Un@1e>kGrvEU{vC6&Bl*=A^0;S;Z5PN7b!lOrpMp+D%*?4KDLXYSo z=zF%%h5a)w0$Db5ACu>H%?V%i9fZNXNWKAR$`s~dn9SN|TUeIMaD{pbZJ5yV_}zAr z9>4z64W;!+f)F0OzG`&iCHT~$f>?yy4@%s>ipVYzJ|2R+s)la(zz74c@^>iC*;X@< zyX1zO2M+gPxjh_z7VQ#0e33tX$RZq=UDP4I|Ds*v`z&f7-*ZvNc&A0f2jc%3_}?G@yW@Wk{67N!d*Od?{O^PR{qVm8|9u_tFN;4Z z{$-~~vy<8|l+zYJ?M&J(`0MZ3zGDZ^Xl1%TPyY?KA8$f!%Xg7Cq2uNlLmA>+D#Wvot1;YT zk6LE*j1J5%EcQtzmkLCTXA#u3O{e__09^GbP&$XTV`fDnC zbY+;%O4NXJXpK6zY>RDQ7U!u;fC6SLDAhIU`*jLb#1RHY?)-@ZlPBSm5RQq>?N|Gk zB3*9GR;|jy*S`STG9FQ@xt7ZTzgC@F&w=W^MWvgebI?`$zUWF6bLrD2R9yqmU4eDZ z;NiXz113#PrB9RRXLCP*hc;n99EDx2?q}bgGi}caMgBe|s&4Z(Z80`g&1mwK=SH_R zcb+_;(ubP~MZ~~+C+b*(ls(iEXqkVc;RE1U2JK+-lm-{PI}M-dn2kpCXF5Lpa+_9; zHRu~`lYb!YQQ9rT7sDbDIuGj`z|Rv0rWyxQ0lJeG7^2Fov_N5zf2v@lYXtirSK-0v zoCJ&ty%@RqJDJ`wai0{Tu~O9u))wr*xp}!uUI%jdKrRncKhJHzj_)oAd7g$`yCtFT zByh{^+2D9;8jZ~fv+dj^)%=6T9Jj7I2n4RG<+XiVyhf&Iuw{B1o34*#(*2Lm~&F_A3E@sa3(KdB}hOw5V5MZi<=?e*_0#!z!&=) z^BjF&TG?o$Lm_hS<`{)v5-Zv^`VoNlMaFCmE&&3;yh3`WjqLULmB{7=UvzTvO4PAn zCs7-D@KqS6L%b7uSXBdl&x6!fE$H<8;NOb1@XY|HUC-g-Qg4w9vK8)U@_^y@XamFNW~W&jv|PAPXls6|b@<6X?TFR_ z##Zb8N2rA;^1`K3LjN?m`NiQ*@eV+1TMp3F{DRxfXQGVZ5v;P+1wAvk?ELy?sR)qC z_-w=IG*;u)#m%KRHU8tkGj#Si&fwTFCIwl8Z!_D=Xz z#=_zshXc}_Cs^q#c@~=%VnCaY7ylTh%$L zBf23TZ$|Ug#DTKHK_dE;?q2-`>#Xi&BCq5eU*KDA5cAQ5RQ;Q}GyRi!wNc#;4R7@k zGV{j%xUkFnzS7U`>X9`+N4E*n_&o7D z;D5vE&f1cW(5@Quu4Jg=k_xB)x*Efe_Fm@ueoaV^C&>;L0J!PQJYfSC!tdcLdB z^Ia4W+|$r?UWfuup;g$Un12#4xETL_)UUr-8?8P9Octr80cRO^`cu7P_Tj*w*mluu zdCnmZO+~^4NehpE(T?sOTf{u_^#=*v%cy^#Q}tn*UJqEd8z&6_d>|2ECiJ5I)-wjY zj`?cXbK-#G=8H33fAp5B*rN6Z~)Sz1G_OIyE_VZ=<>d4JWRE%pCmO z`-!w8%VpAEI#;`@tNyC}jN|av-M5Q8a5I5N`hBz$@3pYLXgKZl{b-R!Z0$1dM#1v> z6dleKKkBcf$yw72PHm;S?w&|G3c%y$`{0RPm z6@^1w+;lBbo!%DTwKhR*=(i+5&s0CCzvDEi2mW*aNCp3>9fe;e^QjB}At~X%y~azO zjPVaA!vAh{D*Pw?Zt!nU34ga8g+C?{|6^0af99PXq|c*?@ZWta6@AX#A^6-wFYtwq zcJ?`V>J6-Ewx;pi6e7`1Q5di0<)<&ezDR>1>v`+-Z6=E+SCosTUp7Oiwf^c#{nZ!I z1pPHIr|KHnZ$!R$a-yX<(bKpW z$AB+7$ZtJVaw^c#p69#A!t=ZaJZn79#0cic{s!NCx$-d|g&Kh%G>GqS2(LHcr3mB9 zZTS_Gd=tk_a?Y06`m+`Nrm^H2@9WpS+WtXccNw_35ZSJ+}YW*On`|RghT&wiU&t4LcD!-3>K=gi)#*y^?uU6 zhodi9$q`wC)dfI${}8oD+b`)q6zJs#z`lk*4JR`7`5@fu!el{wi3ukohB-0Km5@F@ zXIcI+!mipN#}OICaYUY}Q`bMi%URVt=7zh`MD<4L1eqdVZQO@v)$-L#ICi43=)jHa zd^PT`JjX!J$X7G=QrJjuI2ZLA&XUT;hdwmNppQFfxwDU87F>&6(PDHfDc1=h95n8t zSukI1o4JL6xKGvaAM|5o5l*|)*bJyIAKygBi(gH~0k7QGd{s?Hf6T%j;Va@)NF5!hge{xiQBxC%$zloF4;lYSTWBiT82I3bGbE4G@ z4T*&dK>89Dzl-Ng^CRIiq%40UvHrSj+h{dILv$a*XGn#8aEK8b3pj=&75H0>E~Ewvff`H)dk4@t3Vey$&FY*(2*LHnYl*8Uh4H%icIM%ti*0PA;lYT; zir1;mr)*)5{NuAUTJWnuBuZ86B#v$#vf7(NoZRwSDpIa_ zj&KCjTTxqS93LyXqh$QivDi?Kky`tyZ0H%Ts3u8pyXg*f%{3$j%cx5pVRr*+$%z)! z0Wow{E$OIL!)tYTSgrg>*7}oOWPdiJ{^Twag6d?UNgwiT$Q{rEewBSR&xTNXPm(~EB$!qgiKUxx4Zmh<;iPo?bQxh_zk15(OPGK$%{kBC<&%9%OS#X`y z=j5u&bbU@EQT@ImFBlMum`ucadS7hShw)H;5LQg@4bc6Qi|c zoZe^{jB_p`WE^LVv^_P_JwE3C6TD|P15ft_C~N=A^CBj`H-M`pXuY|rv1@d73{xdovm%qfV4& zSSa3er96#@vUcGoy@fkS;W`x7dP_}#-nw&nI=vM@|Ll8J@1PjXdEDD0I$Ke7DY`@( zCwHpWRa{&65uO^FGG^2jE-f{B+|&sp#*UllU0!75A2i?T-7}SoCj)&aPuCM|ZX{`W zS?-pXe%juGye!2Wu#6*Rt=>|tK=^$QtkP(IC=&eGOVp0_Yd7^+f;}3BQ5@(HMUtF`|j7Dhp^-Gdu*R zR?Lb37(s3XBfo{w-T;8&uwB@SYJWc_x9~~?9adeZ@F7_!A*MFufr|-)FKf$%CR!Z6ZFFw8di&s`w77@~#hGu(Z)<#(OB5*KgghFM+9O8(W5mGQ5o zla=+zsjTJYA*kv{5YbFGk228}RjFhdo`Uc~gnJ--3Bn}fJcQ3jm^2)W@L+^7u}>W{ z#TUAA!k9_pu0@FAGhz&$vYIl&xg$Gn(&TbES|^jj_Q*p(%R_7XL5cEH+1T=a{mL*m zWzYu5LZYyo>JX$8M986qo&=g$EXO7Qi zt!gQgSM~GJp-wub%7Qbzyjyfv+C!z|Ph!zQ_y#LI%@DeN7)49y80MJUPi4W{MHG^7 z&&$#&ZL~;#YLFrQ>5oe8^X!CQahKyo_|NtD5R=~NVjTb*>;`7rr|lke*{4H+5}-q$ z&xbH&^4_yCe7Xu#V(!2EAR0cLw_~xT_$^gsG!aypdN zI;5-bKSvQUOrq5bq&Tq=wH;;%WyJvMh{r>;c9v?ZVFg$kNZM8x-U(h#VHi$%iP~l) zIt#KKkBBwJ*}TX=2K)#v(H=Z?DuB5+13q7t$c|?IJjG3K^L`TO&AYbl2b3&((|bNo zOew6ta>bNdWSde~p|wcS`l=c0eKYcT)_o4Lz^NA^y{b=6Xa#eoPafZ2J^O+ zM$C*r)vJv7LVI&6#EXJ4M%5KZwZWl2;>C%9f5Aq+s9YkB#C}EG5Id@0U@EJp6xFMP zp{Juo_5AY9aW!7*+pi=oUz$W6%f6WFrq6tvABU1YK_JkIeX&xm^b=FVnITlBZO)`UFD_0o>|@N+YoJB9#Pu4AYoG(jyJ}ZF zYvFcr5@X^)>M@M2K*AZC6P|!yi+V9>M7uZ{go~3*ukQboc$HWb)An9LB?=mhpRbOc zu%#Inarinp)*sRcRuR^N30gQ#!7>;Zcyp`vMJbxPCqpvPCeh%EAzHl7GUlg3aO4mV zpY_(YM~S*|qV$G$!{5)-E#^`a;Lc7ia<+a6oMs$5Sl}BjH(2 zM~Oq-?VMbg*l;Hxxj6ONCFImy%ZC$0upf5bVli6UrRvdT#!1DYi&pbjW0|k!2I=l# zF*OO0SIT{KlEcuJO_oWMT+YQ0aV4LE6Q9ua6QF&Z@n6=?gu${5(vtd7j-!EZ zW$i*x6Ds686w@k%)Lo65mTmtL!l5x&OdgTKhR;C1aBoEp&g`K5Zq+wOKkcna(R16; zKF=PrgB}ATv-))c*!9@{% z@uc4kK56&LjMQy(2zxjNnCn=;-3cwGBO&7Zx@0#Yk3SKjXV$ zlXdM^ZOR%W)l7>@j=YTA$ZKfrFn8#f;Kf$KMsF_CBc|1e^luGvG(NqEPm1#^#s0#9 z{;7L`NwF#i>}f!QWhpY8TNy?$`7Ddp2ibpi*|*!P54PdUHO1?jI}g*0&;j^E=GhuK zq_Mg4V4d;pv$VhJt7g>uLg&Kx;d94l;xA;Y)L&TUpMn=;7%2-BminjSu>(ZZ%{P9@ zN_<3t(N`~ov`T0yGGIwX^CG*)pEEiJo(>{1RJT`&_B5-F4ujP?A(}W%*?Oi7nI1he z5ml`H>k5QN48HQR3ATTyz@ZoJBl$sPJv<6?<+9VzbBkS)73i3)@&Q&pv&6kXniuLs z7zxojMQ1%ck{0pwBT=9Y_UYj*$&sQ9S7DAmQXACkN@LZ(00w7z_5H5`<9@)9OGa-z zgL6LpZcKH_2&Id#iH)}@#EF6@r3Xq2^vB>SL|&><>M}Vofk&fMw11%IfSh}l^+CUW z{0YugDHDtB0-h3_DsTTVEWT3LUL4TGrptd-85~g;!y2T!`*LVTv1!Vk@mS!U@h)sF_5v zOPQElRsh+XR2E05PCdy^K((g7;32&*>UAPpb$R$R(Vq@Fev1nLQbWn4{x(Dbs4QIRgMXyiQbFXtY)h;6*NC5|)nhY@`{E~-n zyXa*bSjp$3pMFxygnefrBYdzz+4z_&Y2EZ1l?cn8|64wf6PyX<5v*Iw?Oi~=KMa2g zuUjL0-Hi;BleLLLHXSrxdF1G;zqq@Q5&lhbFHv|Tv+{HMcQ+KztbBwFBb zYii-G{tKBFC-Tcc0 ze+(htPXO_p^S8G@Ecyhng)~NC?glLbF?Fe6z{h&?9LHX&Y|O`mrMYiC&7~q2_odkn z<9l&5mV*B0u!+8_pO3#S&ngYpfhhcJViWSz5S;vugf}A?t>$l}n&2&CN`F^yH{3}C zXAzcq9k(@%-Dn_;#4U%^?+lN9l#Yx7APxaN3=wuxbZ{p0qh{P3r7w(MEuqEAHMAOa zho~H##Em`=Dc@M&YQ-8Y%l|jWO;1N#_rNH*@586|j}o2tb=y!HjX01bz90+(L>qWr z_|_L1)yBDbb4ml2ZJqY^;NEUb^>{DcS^UPdfZwt=w-3K-9&u4p+bO_$zmx+KE`gte}jHNE2>1!B^ zP{F?AO>^9xGxOPhwY{Go(%o~l=WuMw`wV2z*?qtE$O|q|Vvg8NlRb^d%rh;y7YrH6 zr@6*Twe`QEyq>TIU{I~GGy3(J`I?qa4>Q77!{hgs6X5-EXW(Te!`m$tJm~)}^IiT0 zXY@1ISC8K2$Xnm}UVZf!_?kquW~i^m{n;yTz;EEr;&*%t__g0o{8l}fgkQzZ;`jG? z>FGD_@7qVe!xHdo-Tr_)=kNM02dP9w0}`+%LVX2p&!-(VWmx@<2Q(G(L`~TfV21pz z7U*V5)V`_O`}e}6_Rde+9{A&VH~o$M5_>h#d`WWl$Pts`%`js9>hzzpxZ}cEHfDXF z(ytzPKMVVZVzk7>Xc0R_c5%gg!GYDys%eGKrwt&zkt^oT8+b?;8lR>NA9ZzJ6tQd? zRQxl_MD>#+hY-+}YrzFIIr@&OtK2jxM_;-2m(9By{<4ktrSg{<8|dKsWpuQ!`)(A+ zR#`>X%gX`>j3$`qibR-wPSg4`tl+yB?0%l=PEw4*k~L z1NuFDZwvJM0-0RT${Va7p}0lA%?Kyc@3@Ct`f~^Q?}t?MoAGW2^b5X`g8$kqcGIr_ zM<4a$HZHbW|Gbxc^WRQQzNJ#mAz$8oAm3&8v_QVckV*3CJ&i6XZ_%$i!pZcjaMRDM zeq*oZfM=Jv7QadIi@w0*$EHg@Ho5$&1lt$-?C5xT=nWEe#lv#CBAeN3@d_-Z?816< z8&b^JCKB#?Sqr*70|zq87CcEWQe4l3MJ`87OVhssv%~ySg>3=-2fqDE^89pd@}@;~p>% z37%2a7>L$J9_0Zjn81FuVlCOIJEF|N8Q(q#irO1o#~i{@S3yuzW(!x?Y#+yY`_1Yt_(WU^_=tBh5P)53QwYH8 z_-=xufG;BKXEAq0`y2h5YUuUb0rKQiG+Q%4G*7+>UVo>xdL=7xDnKWE4TC^9d(=0p zbJ3>Idu5h2`VV6CPekS9tqr59uSKRKD`%j*J^l!fa}T~=4?tfB9(L)Q#d^IC?-j6G zb_LKf+>mOup5|yteu>&|DsE`WgY2;w-A<)y*3n!O7ewSbOSC!&@R91#_(hM|`)HVv z5_3jn7Q%c&Q62W5FRU{v`aA9FL<^9dQHjYJ6*-5ZC(>c4ImAHW83$SA-ZF*g@T7@# z(&gKu3_2w&Q_bH<^!>;2p_U+Oae>fIEkFwVG2WdMeW3rP zJLs#Z(Y}fqh;Z<|_LJGKh`lNX_zBL4f-?GJtg*qq>_~BAyaR6gn=nFn&~C=4;F&mO z8(cb{59;y7lGxD7U$H|a!Td_BLUF-Vy?{+o+_KWz631>De)u@Kbe_P(CuQYEYksL(qYGh&stE|0i;5kG3nt>F zGVajepB$pN?aAc#4ZZKD_QLzAVBAxu;Z~!6`TA^}`?*yg6vGZr;tQ&6*ofDqv-NhT zU28zLr+vQP`s9;Oc98d5L1cgW*28Sd+xnCgt$Y31t@WSnue_@3F4BJY5;fk+V`h#Kg`Aw`oGidoAE!ujDH)9e=IEp+9YGJbzU+Bw0+#)(YM%7Zh}B+ z2PrN6Wv4junZlu`_mi<<`|b?PWY}oMwz2v{WfpfcVE0P&%R8*7rCIqd;9qg-9)2Q@kOiywh08fBq|0C z4ob3WsXqTWL3+-4N!HsJYvZf|7!Y<{2l1qZKgxtLuOe76`H*GCoAfvZ|Mt(^u6`hMEXAP*F^fh z{BUae{^{0?=(}!=hrYW`cGLHrn4#}ukesC#KDJ%-Jr;G+(RY@IzQ(}Dfn5&0+rn;% ze=ohpq3>AG+Qq*=;weoXwdo6&!ZFuNS1tZsSE>$p$k2}b8>=R7%Grn)(eH?S1u7~> zdcl1xQL4@zZBdJus_Q4XskLFQp;iT?eCbV(XGSfb=EfY;XSHE2CVLapR@if!(_V~Z- z;}~k87pv~jfdyDwi_@n7+LFF9wer%hv9_kqOZzw?a#@DUT~m^dBVmOHq$DR}F4fgc z=~Z`x;YstWQ}6JMX)i<*$JDsEs>7!5Ez{Rt6&_zKgSma*OXy`aVi6aATbAE6`YsFIi^`m>^O}n&)VDHb2w-+Y$4D09F9o=UiaT{6zrK)=ZRK^ z^D({p6LD zH#`WcS8A>@1pxasr`l!OHioAKZWUskZMBO}5|&>nHE(rlZk{5bSNL#kZ@?WFF zlKBO`+034!k0)8J0#g8e%gL!RK@hF8RY+HV%qeuAU5E`ljj?JdvM71IQ!Hc`Qw>qw zwoS>US4o2Yw4J78kyGWTv0u1>+-ohHUwg*3W9-fQ=^(FF56l>ERcaE`&w zMaiXBu8WejUNy+P0u1iWjBju@898^yWS z1cB}$Rw0eJ-}DE<{Qm2i~;x&6yZp>YH<|${u~ArnjbV&b)4i_02gO(5Ym7GZa#nsBhL^ zYxK>R zjP%=5a)Z^bqi=GZnxl2DrEkhyQ84Ki?a(Fq|1?2h*2^lSS#h~jXo*$GBPH{l0!0Qp zmz3OK<+`NgZ3vS{$rvlMRJ}A#h+yfPbDW(1CJ5B3twOr`Ax@!v?Lw527zD%7H_f+e z`l6fLOc1cfRq0fll6^FAx4!wiQ*$4yX{~QMx}u=u{Z7H#oF=y54KZjT*`Gk6X-=Vu zRv`~1|KJpO>jsUTi;{h;To)x5P$;Nx_O&wczN*zKFhx$5lk@M}G*I;Z9IKG7zRu); zL~HFrq~t*m5?kMJexknF&8qCtH(jo2P2YTQwM*Y%y?);#_WnEegXUvRp!b7HU{5W3 z0ydF#T_fqp3ch&82iL;C!k>b2_K`EZIkCK4pDkHY^cK&U;LJ)u{bMk$SB7t79lW@Ue!;WglM}v=*psO8e&Cl`K0NC%jte;TZ@ueaAQgATb`N1%7Z-8h z1%4maI+<5F1UY#zf>`Rse!cn*4`acB1mmxnm~BE7R$#+fyW<$dt$F-teD3UX{5-rd zAE048Ds}Xu^y>@uG5$tkbMOm*ZKBl-;q+WUz4T`u-na?Tx$-+Fe3veSy>~)Vedp0- z8)GUz&Q1ruUX?0!?sZlJgfwyvV+0(PhGgHX@LDGFb;nrsi};mpwwuPpS%?O2wNXFRtA)z%mWPDOCtM~Iut5cgbr!^As1vD-NdY$o4L@J; zeOi9*hPzTOe%=F7(s|l$;OCjRK5p^YSJGJ$n8W)krsgCb`%u_P^Vm1iFQE8v$nO20 z?cNI&Q}9@Lo~QSQ$8y6kR^YDXb4FUNS;hp1-_-~~j(AvH3_MPi1789!bFj?h4#>CjbrhFqs{icB{iqza_FkN zS}=z`L6{tHJ?xQi2w`Z9wo!RDscKcWem_Z`H^#_px|7T}nH6IERh^z;!bE|;aa88TcTDPjJ>bctsfIERB4@+^WWlw(xrJ}Nq-fzA0T3d5FT=@Ugs;Ztx^%+#;M`Qg7t)Fc zADq<#Peh2;yz4We^4!L>R6g}a50!f%N-E#63lz^fAR7yZ&<&yQ=mlx$yNipyxsY+M zsm6!BG<^w4-GUY<)d<^Wgq;4v`6H1|p)rVC1}|vBTtJ%B|7e*JQ46&TuVA96x0OIz z%-*Ol0cIwShTDwj7x7Tom=R_=`Q{=Qh1uTQb8R$QG$Rg)Q~ij*^F2uh&}*6M{yE!2 zy$a3 z-dkqGY?=|4J+qIrVt5R1DAlVTwPW3_s#z_C8S#(Vh72Avf?pDA$&7dwZ6%lyIeZnKdgYf` zjMP)7SBe?IqBJ9pG-kwfS!lUbiMmKT3lp@d`jd8s88J?>tT&f=L?WOL62NKL(-w*S zwxngxcdz$|#2biGBn}1Q#*CQkZL?lI>#QRa)vs%<{1-evokk4*=xy^n(tNPALrJ9Yus_PIJWoesS>>%Nyvo@jb)pn+l&ijj6-F|UsZ6K zP36}8RqxI8P}%FRT2kVoGBJ1|{esEkuR4;tE=h$5KR8!1TyhzPzmcvSD1DGkjl zz#=Ueny;Pf8h08ZzsahnwORGVO=)MiS1LTC{xqT-b(g}%Te_^Y}*%Q<5rV(1PK0n)wIOPb##MRS_%uUb07=Cs!RRTHjD&1nh#sxz?J zoYK%t=dY^5Ld|1n4tanH6Tul#@pW1Ls>9(ANoiYV@^+3>OFo|Bn8ueWr<_ndq-NU6!YAkvI@5i4<$Ei$=C65>K7u z5s85MN|qet7f8|6#lBmW!>T$8%{9~i&VLVZx%+zQuDUIs&Ke1 ze69PdzMhs!_>8}5?b!(Th>vFrSw-#nBt-Fa70OCkH6|HapENK*J+oqTWhq96*K0=D{;FJQ)1f&Pip7xMtEw zmc2ON`bk>JDxd5b^|6R@)Ls6nHr_S^>a>>Hw554^`Zlw?ZGMMCn`|@5U-dDFq3uMj zN8XYpl0z;r;8%!9X*0t1S6y|1HORr%{Z-wkrslK+f7Nd>!X!H+YkfD!F#|<(}HC^`gD&-1k@wWnl4clx^{v;{V=Ua zT#A=6T$9cDh>|^B{;I8~dD^U3N4M0bEfV9>xB2x%Pn(}3$~L|Js#Rwif7SdU@K=r4 z*pk1hSfiNauPTEt$i4QmPu{rwRcqj7NuDLLjKAu3%nX*l>I5&|hibgFzp7vp{8eS8 zE%>YMMyA_e)dMvwe^qaUll@f-JpL+phRpe@uJDE~gH6=>`Krw*iE9Nci$70K}?K#IN4Z8N$Twhz6T&_p;!F1qaJwQ;WHB^k~u~ zBd!NYN{oMS^a$={QbJsqc#Vc(c5<$4-_I#qNq?)pvH!23Y)vDTC#v)<7gDFAq9C=R z)JCceHV3uOI~`IVU*SS(uHZDMcqK@(5*Kv3@sm7iEEJUpv$R|-zx)U*+KU%Ri4ZJu zDZ#$#9!E_HO$Llj!$joqSlOS@xfS8_5YuNEe>}wqrtVliNXF2RXwe!-Lh(wxyDx9b za9DnM6X(vPWqg1Yg*5Hyw~WOI(U2Qt@T+g0A#ad%U9bduF4duiH92k-bDC<}CPji@rG;iW_yoNM5qIWk+s6PNBp%l;`gfPkU4A_%T zIxSK??slYP@c9-)GH0f&P}p;e_c3C9Z3&50KZ`8k(C+84UIC)PE=e4!v8-mUh|P%; z42K>dDKY*brS2C>(SXpDdbVGBN*O+?MPWhU`8u0eUOs9YixHxmj~-u`ijP1nLQ{ub z?htD~gh{MQU>3*6Hh6_usmD*v!iaK5$`_MAB_Ngz!vl|}8V2|W7pZs03aEHrYao^* zfp2$cnCAnge0XBeV9Y8ns1&ayXnnpFSt@)^Dt*2gLyFrzb;zVX&olcEO{lTR>_6l* zK%ZX_95cmy=T+}Np!hXB;`4xhK^ck-RlUL3WG&NGTK0m}ks&#$d-i=gheZB(I zh(p6v`n(=y`wr{#3;MPyhqgYy&rw=lIZUC?|Mr(ua_Ea`eZJu`Eqf{T`RGBJ=<{=B zJ>H5w{}_f;i~4*R5CJo!)8~Erq^FKYpU-ksRIB=Y!4s(ziKWk1Tq^Cxa+ zine-I7h6(79rT$jP!ja{GMgD)`h51;+o8`dACs9r&&8LZ95%%(9m#fqtyTH=t_l$Cg6+<{#pI?4bI(>cxKAxOBt%^QBO@ngu`7uav^!XluDf;}{ zGojDJU#HdQHONvg6t$qwn~>?&=XI!I>GOJollA%N|As!Vl+{(M`ur+>n+ zSe$C<^T~sllAzD`J&TF7C^E3m-@bGw_4&U<4BYzsEf-R@KEDx5LW5N6`n<0jsnq)X z5YL>LN}u<(Ho8cO?X}NeJg!wawDozRqqJJp=eI6MC5M(iFa2W+`n-2hCi?udDK?L! zx6k*6r=vxEUUx~0`uv__(^JQz&kGzC)v7)ZJ(5b1So-_~U}Twvha>FO=RM@=gVyJR z2U--MK0n1?EV}J;TS8p=eDmq7m!W-r*NDvY`IX0{r&OYS{yjbllc_#Gi&{6WK5swV zA=Ymfr_$$#9-mI1pZq|oVGw=(oCf9S^M{b&==1k_8-4y{f9UhFZE5xSJY=aaPHjP- z_W%U9KEE3^EPcKJ;RJnd-`7um9t32w#GJi4-r?;GGQp)>xm#@)l3-623KdEN-RBLt=Ow1kVk~)1Y`fu3q5a zTfDdkc(;LB?3b?zj*)w;^>KWjv0j?3uTpsCtUkEHZmzh#G*-5rZ=K?8j8)H@=IX+$ zLY+~mM4f3tY!rw~q?uzpi4C2wqR}g&Z9jnGQ%@nq-H#qDM+(TS-w6K|Ww2%0j02!P z|Gz=wKa85lhYnkQ-vu-+Q6F~`lF@Sklb#<2Vd`bjyZB_WG*|WKg8qvQyg;J+H}r+j}2aJ}&J ze+2x2Dd2ZSh6TR|!aE2*MEI&-GXB$D@aH7LC;igA7iT`|Yd?wB>UbqQ8MH&?H(U55 zem(~83-!d)wN2St((dW``dUg>)r>~p%z+dXl_eZ+ztTJ71}$#53%p*qol>SQ*Qw^A z-A4EnaA)gb7_qp<7=KQ4LR}Lm`Cy^V)Wiuq)`%3cMHZrKP{iWtbqHHLoy31NR)6|~ zgWT`&1wXb$Qr-g$Py^sKu@j(t_5d_ z&QpC&t^#&YH|Y=nZ=D&{Fh zb)hr!kSWlYZ^*_Y+&$M0QI~p(HrW}PZdT)}P#25uZJKteAkOBN3L*)>9{=c@K%!Rp zANuWj&7;M6RJLeFzo4j=>vV8wpl6wX`On!yaD$JkuL))z#@RhIWmdZxv=`YgL7%F} z_thx^{azDM2ck<>_iA+azV4IIy;k*W0CNxSSI^X4ga@ig8fiPpg+mOJntD$cDFOLe z1^iysfKSHqy}hMEXI!M^ccMrB3b||tJj`Tc2tU+dM!5{4NRydsLI}I%Qs|SGU*{J6 zqFZ@|t;|0$S&!Bt!_w1h2;0m9mP}*_zw2*+-#-QX?#Qs<_devb;qn;=x^#uo=E`VbB5?3Vygz<`s{rkp#u9b9RX~BH4d*ik1ZN)MK}pT%L3H?L zJO@tWshSR##Q46bku|fkH}gKcSb!Rut>-s`?N;@+g@=TK*4pcMJvheJd4i>YfFHSw z5gt)IZnX6%b<5+y_xLEj=z>k^D&VviaN_#OAbbHh95}__b*r%3ffh&Hk|h0C+WQEI z=m#Wv0Ig-N2mddGLb1LtUx`(R4!d;pU~~d>H{JJL;!|%PXLp})(fuyEWxTwt?+ZME zV&9-4>XO9>yT38N9rz4Lg%7W7+W7R!0zM}t;WGy*poEQ29~86jIRoJ&d}=g(QhcA) zmLrR*EsvigcdqidA91(i&#G*+wWkaQTp5;hB|YY0HkbJnW=Kvc@!d@OOo3k=FaQr? zhMAc7ET$Qmna3vbgy8ST$cTJ5VP7|KnIoG!PqER~tsDHhl4o@Rp$&q7ccT>p{{obrr|7+{&Yu9{HQpG zNMK`CKq!5S8;J?q6N;!V29pXhVo@FD$npYB#PTj&`NqsUeQIPXoIo~gACh0IBom;rfa_&8Q$XMmcu@$?F9)4A&09( zOr_9icXon6*T;KNPL-5b2tdn(U}7rLUOnFhMK;Keiyz%w`r|H__}(zOUhWZMXdyjl z$NTjQV}jgqgeFbP;}QJ8>5}Q}FAGGC2S0Rj(AgIrGMx?dwCp`tviRmrbQ`dxrpp`B z-1+{~DltTX!fmQEn};cpGsn#@%{^0%m+M9G#Pz&BOpsTq#$f${O&G4-hNxjygp0Rx zOhjcvz%c(nyP*6R+Ze%jgxnUI`H*)~!1O2h(3vfC*3DNY=)nO`zRE^J3U2-;2g0aVg zN=Cg_y~>C$)SW9Ib=97NVzioxc*hza&|^q{T#@Dyn?qxGI)|Z%yeMomXrk8Sh6Co{ zKOUOcqt?b7y0M|NMJg=EV4D8~E6uHT+H0VCAtvxLpnt6mG(G(n9g>Kx^?jq>kJ;y+ zc9i~iXSYWG12u}jC;dM=II%|=(EpzNmgyhSK(~+nAsc9V`u9r0)}nuC=jq=it2O$s z-Q)M?|L!|L|Fbn7P!(zTUjyAf`gga1rl3?_g##Z!CC5$+z$lsO! zyCwE01OESM_g45{1KmFQ4^5>1LC}z}?L7KF3ES59AE7UQ(sZ-=3)pG@jyuv9s z1Ab|5;gLpOFVujygZ_9TKXj&ixK3NkFUn(g##(>#G?OFipQci^H&zzbb_-`h%)46- z(0$3{d;YK=dOz-(zkDdKy_MVOp6ZV(t=bRy>Z4!Gc=$nK+kRlg7doGdTeZCCi)MbC zI3H;x>ic~6`r zUbm-5RyQf_wPufCeD65JY80!X52IG2SPgyE-)fZW+tlOR&hDrl-_XvFZ_`h$jqirj z-Q&B*t!8}p0rDJnJ-&@cnejbHcf&Kj-(0(M;)SM)UAVZDZ>1 z9vNWf--y`w9!)B`H4>(Hrx8PA^#}LW!-UT(W}-i@fhSv!PilK-Zw+oc^e5L_iS$n~ z-`4Eo;Att0*7ODD+hqy(jyu;o-;UE@w-4WKHqi9^l9w7^t`B#fUz&bsjbBPNioZX< z^x4}PhYaYyszb~C($K{vwHfJSqiFHy4;WE@7>6nxGs*)Rmh+j>4B%mg;O?0IGHGl5 z(TWESQP0G3h~0$@+T#LWCW;jJf4Y|@t^JwQ4B-6^_>a}iLIg5suOX zXeaT%L<9Pt=ASK{cLaaj_fO(~4QRXYmv_8Xn=wAU3Ney&ej+57y;OsSQ~F=cmVvr4 zK|b33Uj2JDfBWS__pfTSw|`R;A?-~64$;7NUVc8^WBdE}d&s|TR^yNPsmBwp^+%H) zZTK(wz)35gUoUQSK5uAN9nqqK5;e51Wz=;oRd>mYc{J*};CoufTRDyDKb0^zvDqk_ zpEy`~%OP_2q{MtCldBiLf3C)2$!~T+MVU6L`unUUM>Ix@r)pJJL;}Y2;Zqm$kKjHl zK6~ihG0M@4kxM&i(s%W2C_acjdYsY6>NV(b)AiPR0`$1Ix0TbV&b`4)k7o`} zO^-8^=n=yGVZ8)PPmeV{TcXF1-P6#c#r>-P+fTvw_*&49|3{zyqYw0{ao|83Y3;2S zADDu~e)(_nk2wzyjh=WQp6B0I%9az5loJ5z6DWPX+-p+%Ur&96EviOXusEFZT7lL_ zm}2DvFimRV%h-z&0P>`RY)wfgD{IY(_n!k=uW+^5T7QH0I44WR@-9^`H+}_l@`CqT zIWgWjDTktz!w6=7o`(bn&`?$Jtt_uM^3-PotYgCFWQY3oYghI+CZblnLvWrG(Wh&) z?SazfLaXBi+#+&1kr==U+W4K_o?0`OCm8hlg+q?@%cmWMI8G~i{<+UR{}_K@?A1hf zV5;+SnA?28^Rc*=^SSPM6em8_QR-iqC487K^>H1277I7mtPfLjDwPjY=SWE&yFzZ3 zdSNyRR1h3$L5^{f|7Mnq0uE;u;244*4|U|L_=P^7HGh*EV!V&A=hX=oEr^nbeAGF3VEyBC^cZN48 z5gyh9b&fuE&evf&O*~+CVUkML-y`HhB0RWjt&k9XBo4|HD>!tiU|HbXFL45Hf1HQI zgIV(QNDVZ<9Ekg|Ee^!_kJbm`AY1xjeFiK?FDfOha?H87>8R>>yM({cpQhiTKexl( z=<3fKjfwr)kl3F!R(}pVLqu|I1Q`?KEa z&jmng=@Y$nWPH}ON$QV%fD;VXlKvcp1Aqy#bxQ)Y?b0V3lHr}QGw?=n#`eno|6}j# zey{!_9M-5Q@4& zm}(H>hAu-7Dr?M86o%6L-tW&^YoEQ(!_1kPzW@Dty*jh@+Mo4VpQrU%pY^zZZ0hGW zP5RjWtJQ`?e2*G@+Lxs5KU3m6e-Go^-9+vS&i8A!i^opC ze+0k7nkV$LcWFEg=Qlsm9~@(7YcRjLi8#O9U0;4p{FsEkdkn5UNnhWF()U;*uRs2& zd2KL#k0j#!r@@)Ny%_nu#BaCC@yuv`Fp`Ij`@T4BU;?eizjA&w*57)2tM~(5Nx~uQ zcg?L*ccW?>J79VtHy9a&>gkrN)Iaas;;vuwoqzJy9PD~(m)B@WnE98Ef3Wsb2mhvu zn66j_@Pq&2M)H4nZT#Pn4*xqF!9V=PQ$LIDR}R2&!UWGTNFx`|Q4e`Org1`>N$u(9 zKjLjaCeOu+viS&3WsBL`k63+bA z;@_`Kg&*=C)JT5sM%7mS@&5fkx2Dk^m;b7nZ%})*^Gk{2h4BV$%%`W*UOe&h*NHd} z@R6DhK41I$>X(%5W90x$86XG5DG%;%nL%e1(blUf$kN`AJ-7OeP(B`Ty`}b+yf3Gfwu( zbCV07Y<^1E>HMp(699&BaHa_I~>YX{fz!y1iJ($R5h+? zrDnKr(>5#Edf>xQOYr@ki0^PezB>6^8JPLg>;9EG6KOQD9))YZi~Y zsPm7lmN_5spU8j7k{;^~l8I%z- zgdopH)F~gzMH9v_*`!PpO}9KOjQU9yX0Jduj8`iLwAO$2(SNe^A6(MTcWv~aefcNm z9nzcMgnkRh$Xd?IK;}ZxuMCNeAY4T+_(2ryZ5~G7uQo>C4A8RK{P4G(h#!d#G9s_y zh@9#_0aCRF!CNOdROfDRylkhst==uG#DXChDSlF92_&5&#q)G}MsDZg;`uh+wYd0s zo9uu6vB_48Z819-nN`mXoc1T(Prm9l9Gr*O$; zyLpw>ewWHzf|=hbqp5(~%eEFlEKGTHW(4njP5QvQGbfG{evS z_;~bb@gKv#4RBE~etqq5^XB^TA7B2dMwTB_ z&+_r|Kdh1EH*cyR|MB%dRnPLv(VKehXG|l@AJ)k7o4>6G|9ZY?^64@k{2WSpIeExp zNwq*ESr#QU2umX37Fv;G^l-$%Fj}cOGvCS;qV9&g9m#DE;%Yldmqi3F@EPQs(U-*VY-+;6$?tL?Z^Jbrqi9XNwo{)U&-oVg#l3Q51$#N0nceIJ+A~q7`JS<&%j3*(yUVhKIro~uRb|+^vu5Y!eeds zk=SV>JuNd6^~Iz{Ii3s7QM0SqY;`1J zLqCZpLANPL>=8$zmRHC54WD1J^2({odUa51T>E_V$cLwqpjm9$rSr2?o67hYr zR>*1?zBW*69DVmR2Hzox_)cvMzT;@V^Itz%?g{WLX6^p3au}_4F|4Tu##B<-44)A$e`X|mly1pALM7H z$q#VL?bb{q8JHot5_OPq^cO2Xb44Tau3H|>!MT;k@6TCzY(*+9d0dDJ8z7H^Q7oxE zCclwH9zU&Vs61X{NquEUn)3MN*_b>kkkC40Hhk2}2{3Y9CJ?-(N2Gw^Q7G3m3_GugbN1wWknSdl6ecSy$^{?-;#?*Hs z{AWG+`|*=T@Ye>hY(49nnyfy=cZJ?~B?O10Yxb z=?kt;KVt&NDV^|JgeCq*KZQw`slVO5EhZTPk zuy4^*Bw@GXkZyHUCF^$x%5R$Ah2oC$0pD!Hb#r+K9%=41oJ|9C!%Mm z%H%a`>+!}Jwswem`6KWvygT74WD3E~Qf89ZsE8uskT3|OX;es*q01aI@Ni^YqyB-7 z7L>$e*yE3piax(<0#@eV!i^Yms8^3i^2T61()HtH(T^lf9DJ%QqN?*VkUYNBHiwmkq{Ve*SL~dqGbMd%0-(9<-Of6{+lH z8LqGM*~`{`wb;wV50lu-^{=O4FN=TC165-$|5n;w-fouMULtt!wU;}ufxYZlRg1lx z^r6pQic!GY%WS0M?4{2A8i?7#r#1=n%L!)v&4g-?VWBIu_NSWzq0v9z>p^ z3yY12lkUF-f16K9m%pz*Xb^u-qF7S?Rxe4y-%Wt_@b`(Azf1V8zWgnM-^f!RpD5Qs zc(G+_Z0@O}bjAyi*BGn==c%_6@hyE{sH-o&_OSgt^DJ-u(Zf_XAMgNlc85=gLITcZ`KL=WKk%_-J-O(>EBP(p0 zE|+LR3wEMKRyXmFvI3~Pwx;`|E$MH%@0IyX+l30<@L>|uehAQF+W5-L!C2*q=bx|L z-O}leU%~34N0af7%zE*Ux*Nj($`t&E-buzkpe_Fwe3i&QUpIjNN0RZ6%zE*Ux*Nj( ziWK}WSdol>KwJLr_%e}yzOFz2pJ6QFZAK?pG->*?5{wPJ<$qaj$VjvNFhqsk@{8(O z{+EYDf5+PPdpO(gdStr#o7k3FADS!~5Z*im(;9IMVdJn)NMAnm`Wpgf+-(1(X>ZH_A@$fFNv|t12m0yE1`(tUwJJ?>$}e$)%V(EDfRsZUZvJ|R=G#t)f1ubDR0-J z?`3%D)puZ0Oy8MEH$vZ^{XK=gmoBfDz7GV64bbcs+@}7Xw=KjUXpZ-;eNB zqP|0WR^M->);C_I*7xOKdi0G?SO%2yRxSEojh9}1Z$k;&zIP$r2z_rZNulpu@77D- zM}x!$==;|1GMNHgMv7HKhIZj`c7xO`3v?-#G$$}9+kMvH2q}>;)6JR z`=-WM`}q~%i4H>a+UA{@Dhirc%!bpqub$R{Z4`InSH5kaFd!~G)B=QK0DV6e00=O0 zdayFzLcH>Y&d!ctEs-A#e%vAoV$Jao$vVwo(J_8DKR}ArmMRcemM zr48lxK1)C%zlX=zxz0lQ_-!5o=$oA1Uh(`MY7xcweM`s3Fb$63($jCh*Aw}zd;X*F zKJho5U@S6zlwfldGFf*l*c_vS%>`%qgUyxy@q3y0VDsuE!R7-f;|Vr3NT}NvN&HI) zpfu+}_+lj{e5xbonzLu_I`>(G5I2*iKiJF}U4JOj)Wu`FS@6`@^4!Q zXRc)ZoRz=k1dL3U7WT>Kn;5`$JvxY&Pk*#!5wVp| zcZ(<{pE(9gZSvW%C_VY~cqxf|>hLFa|4Ex4eRG-{76>ZO=06)B)wSO#sM=qtWKU0~ zYK2t4ZBx?TVsf3S)!ZzTW_-8&WBS7&w+m#VMdhjc=ffkzwEaGEp9GfD#J?yW|M5xj zzwlzb$kN1L@<|;1pFWq2{_`7(zc3#E#H9Ftd|^+~zi(3f_cRp$qEF-G^YXLFFKfb%Y_%Pr7w0A!2OvKoj?{?l; zfI-WWeDn)uy4ze{9Ld?1=j7}d{RG|wilzhuh0QB+QHDD#r=YcEy}B&CENl9M@;0+3 zD?AgaUdxKZ-7&jOpl)MSOdETQ51 zETPl?W(ei}Ap+eo+9h*Ipz9F_VRr7=QQ4Kk8ggi=5#;KSp-6}f4>#;P~~}{ zU9UoyxaB_-#2qA#-mav2yzm_g;5z^5l&Sni!gnI=>X8rmj_7uX8oAhj-!9<%jf5xT zSN4QCOaYd=tA?nzUo)@;c#MYm8wuZlU)e6@Fa=mjbckwh@s7h|G|b;fnBo9zv#7(A zT&X?srhptRaU9Xa$h$X6&3Z$ZI$u9xzn2)_X?S!s$9-DrXyhEftg^Kc;J@bWu33O9 zD!g|}XjPs7_c5(>j#g#$zeSbO(P{l%{DNowX|}7sQK(}HzROjY{#N9y3xtOEpA14v zN!B}>P!tR}VdlW!D3xE#6EOTHs>_5xhr%1V!HqA%?-k(s@pVncHe-R+Ck1e?1{!z4 zNn>lq);Kw<1kcIGFuM$}O)Fa*zpP>f=#36r9nD>(F4^4*wh{a}t4*NdUSyBWAf93u zPY)xgo4yuH%Tv#zR_Qi_Uw1I?E_r5mO~nuv#t8?d&a;KHrZ-_l+Eh<42%Ow`>c}>m z$q`;+nQdO4`o{_KiH*?EUAO9t;B)dRalI+5Lnse+D}dXcjpY~YudcWhF+@&`kWZf8 zT~m2SXp}|swjaFdT|0f?j}tsEq=?-aO*Qm`U}>99n2#d6A0~;tH8BuB6agaqI^Np* z2+7bF$ekg%mDgKUA$u9JEBl)Yidn&z)5Rb$=7gS^BXvYjhb`s^+}$V%GwqB^Qr1D6 z`-zIO16OBV)O`J4Cqt&xSd#@!^nSsa4)=dOowzWeO?m7yH08MvH@wo(cz{=eDdQ{? zrso5*QFs;nF|Px83F&!AcS3qT(gkBC7X+>yUohsHF%vJp>56fMV*(s6!hh}ilE?mc zp{!nit^O7Ee;Ux%;lEafdr*Y<2hMON1_xM!(Sc{mv6v_rp+|#zpY{6pNUnBr=c_UM zip{Xd%AC3UV+^YtQ=-uUog+E3O~wb3(KV7&92$zdcpRq(c4MkhR2 zZrW>ZGMq3Ug_a|*g|j%^3S)X*Sm549VQ|A-aXpaP{z!Xe_9#GRNN&Y3pbDQ(D4LuR zDCiO00b+1yit!e|rVt&bqD`XbW<>KcYCgrujBB1`hu#&{S9SrcD5yNzCYoCwy{iKZ zT?}cU3lwz-8p)koG-YleD?A(q3cOjb$|XjSbQs&rOh1{sTKzNh9ipG%v>hN06^jvZ zOK-ladD`@7#1}0QtRXK2I^K(aA zB5*L<&9|+klWi^S9;4fxTe+_bvRd`bsb*dUw~OdTwpuMcL-N>?3P&>2akz(84FyrK z*49p#k9n%}XzA3=BMG@HR~$icFI;hUqo7PhNd=~)IJ>)YWH!%e9Tk( zS!(5x)NVRm_|!B>nV)XcG}Y=rSVw3!Tn2IEjb@veFAiieECk=YV93|<#_%U$_8y&0!Z1>ZduGMvZIE)-(#v@$y*!$iEm2jQhqi+{nHzc@fT1di zoc=6x5##6ridOAbBU)v_*1Oe6_Thj)*=e?c$rH&6q0HEqn|Y zfkkiVcolMINN&aUy)>iwqqm}8%zzAw-r#Q_Yx+KHN9gtV7{_xb;rYOSx;$@$g`|M( zDzHEOgAI)H4th>SUrBN45Y9n$g@~ehPU3sSiFu(jDKiQ$B*I%N0(tA<)WSQ^72bM* z-EL#eB=O@xt|QC9I$yrJ$igOZWCy#Btee0-WMPvyvd+elA-)mV8XLJ~ps7Sl_!}t+ z;1^!y5F9~53jO~L0(*wVy9=I|*N+Dxh^3)it{-726tBwTWBA@UL+Oj$8IoJ^K4LSrh~PlQ zz@xCYac8rM`_w`qq>B^gqma5<0>Bd%@V#H zLJ@ZW-FhAkLZpDvi z>1LD~z$jNufIOjr!<{f6MKw(d=|H~#v{sG4brkj-=89^r3!S-DdR^vILN_H|Z&_ZZV+s1FYe_h2V&YrrjWj z00PfS3oqKx*}|+dRE`7;1$g!Om zN4ZXTp}>x}k!KPo+}+cIU3jH9wWARAk@OW4M0k)Tt5mPykv%gHVjUgLDTX1<&Uc(_ z@T4Ao65cW|V@Q;Tr01gHsOUg^1^I-_xSX4fK{$Y#K%VHpBs91VxG)GuuAclWehia; zzuli|^6&ZwIQbWBDU*La@t`OFqBSs#z$}!V54@c33p_qDFxsSdB7Zp2XuN?Rk>-$$ zFkd6hp%BxnkRCVTW=srTeeIZWqc0zS#r0znGt9ff>#rO$F>u2b6AJUzxTLMJ;x17y2m6J?- z%XJR5ZM;|jrjq$67@KaP=fGsS!6ij8#r4os7y z(tS}WF8)@}o@L{^=?_3uX0~7{;GLYsdHDX&CPXcR@ECRY8*$FWFPLh^J5ZwXU2WbM zl*#$C%;;V1P>0N)HN6kx12WGpr3BM+#o;qh68#weSZaB&-b?KV<47%YE3hLWATG|3 zv<8_%QnyqjWh5tQ77z(Z6J~ixYMPX!gI0vUjU%a#ki^`|!)PhF<=7CtBD@tDv6i)1 zwGlAp>XxeG-qve2h1efOv`3s z+MedJ&FbdA_iV4J#D4aqU<1dA{$2!3#rv69DhhCUs!ZBN-}e5>=i@yq|MUz`yCBbX ziAVuDaI(N1Mj{5F5+`Sl5YY8oa|?r6Bs|;@FxVyFn4hyQ$(a+~k-t5wO-5JkV>yV- z#WR0&GF4MxO6yPFe%c(9O#Yf}?|gmnT<0#L;!a2k5pL+sa4AF%^G z#J=Nw)iLz2huCL4uQah^PW2KSNTkChwzAj|n*_)ub_IYcP9m|~ePU!3nhO#rnKBp` z=EWr@f0(ADo{pNBTzat*{zgg$;TQ2o(`cBfJjYokuwRxK*fa4ME#YsZWB`68rU^3z z*iHD8uTHhF{qYzr;cuj*4}Jlg5e+j1*r3GvcUjop0?Xe>343I~VsVctv92%wDzScs zE~mb{N+LaMiei=O1O3=kQ>&KhN9-RUqw0A+h9@8ya~Wcgv+-hvyr`Iu(A;g&^73Z9 ztat#~j+{hR!?%moV{9zqJhC_Ye||w{Wq1c;AN z4(v7`H9X<0_7ZCNqT(P{YsxyTL;a^eRz{?viunUm`F-0x) zpMRyyRS=ZZ6OT|3CejISf@FmK_tD@z-r)h(>B?K!Zviwj!hBJ2Fk-W4SV>ujDDs_> zJHgBl^+bMCj4iNnN=#OMVM)!ju6~zG_>Xx=CWy)-=f~fj#^F)J+nrwx&sDLsR+c zx%&)kk|v2&Thkg-V>O03$lO4Ua{V%3(^sw4Fy zq)JBB0elSiLo!aPP4Hrdyr}pK1Q~N@lwI@w$z?ZO=>FpF)Us>s%I*_8_HD;741?67?3%I+a;WLU^!Io0ZNk=;Iy!z$IT%jB`Oz)BxpRAA$mc&TQ6Y!8D7C@TH~MjjslaZiDS4Abw@ z5l~9VnZPTMmjKe=e$Phjl~;2|>&>7b)EQPCS_Kul>t#Dg{6_4RHmz4&OvIs00~10b zjF$MI9>p0zv}&SJLvTLDtw%6y!&w8n2`d|;Dm7tRs?p+RyqQ+I8r}q>#d&zpqs3?q z!t6i?lwFGk2*(sCN4m_UKS!G5Nan9bntQXDejn*MCS8hju}Qy)w4K9Qj5MP>!oQ3( zI}*;@%txAyo$05MrcWcx!$@PRm)Yi}H+wbgH(GP|QzHXKPmc`jh5xOd85!7r-pIf# z{JrkqBLk;AKQizXp2xn7eP{Z-0QQr;?i~+vM5V{W>~EHwg2y_>!@9To1e+*yz;z_L z8g7t%YazTL?gqzdm+IAv(!fH z^PQ4lYD%WT=DZdvsIq!+|X|Iai@ znIXBwGF<~~d>wTJ+Xh)*WfJSFM5xZc#1(h6L|}A`z$9V>Vdp5oU_FELJcx_>=)t^F zUB8G8JTZsFd*|K$AU9L(xR?%&xs^jJzQG?yJ}RtK4;(zO(FDr1Kuz9qOQjrhD?6kp znW2t4J|;)U1V2#o+m~_7)nH&7=f0!XJ`ZVy{ zmw1c>@!ERb>5JiYf4?o2*PU=XCCJmvXgtT`AvQ-h6D3zc@brCikS-iQ>Dp_?j~Q+E zx!MM%<@>rruD%bsb##k z7J<7?*J6eC^-ZaSHfb`2)>RAbL_BDrX?ZR1%8Lhfw7l3sEE!t2yjF&3k(9{T4r*Y5 zoHWxrLyRF8y+I8J3fh`IA%`PGi^#Rg9NNw^g`<*+$nC-?2&S<{Q-zmU$#P_p8D^fT zT0V`OoYh5BRtGRS8)96`4ka{Gjy!dUKby4_2vqZ@7~Ha=XbFEKCFIQrI4a~zPfk9f zx?_A9@o=8w5Vg7*Cth5N2vf8{_Jc8rj#R4n8Ak~mv;^*SJnLJAQssK#q|=*l%A;>e z<&?j~n`xyZv|=8?gLX9L+bUgAxEv%PQV#S)`r7f63a%J`6;2-Lf6(8ws%3ZyjX7@& z0OXRMcrqOv`W?^{RQrKWIa^Lh`2G`hHMoUT>tA{G&)`bypX25w17hgx_ip0PU#*m8 z4LB^sm8$nP#HNXJN@=(GDtrQcQP7d+pnCP|O%O9}LU!RXVZ=)Wf6wRoFgCk?nCG+~ z{uZQncws8(J&ZTgN;y#swl2qmmfkF61V*7~DI~(!ejL)H$6Q%>&E=B{CSE)K8lU{u z0zh-zjRHIok2XS(?>p)9iR#Xkptm$wG$p&H5F2Z;P6CES!qxfe+qKfOMDVSXDOG_2 zG{`FT;+8<*UPP9pmy0#kXh->K+vkZSFWpR%Gbd*BT2_hppP2ByAGElr{xB7* zhNOR)q-is!j*T(mkJ#fX0BL!0seDNVk%BHFCQDyReUFyzce58sBOc zABSxT-_J1Tv0rLi%@7uGGofezbS_LIndGY!#~B_ntSyiWp}$nu=e*IM)g6Z?+n%7u zFS~JbO4Er0`6c6^iehpr>&-w>b@dj$RC)iLu(#iR9R2^`=Wov|3a z2Gz!MH&Q1-b=_xMpf#K=9kSH@LIC+h7PMNWxCyd2+)Oiu-x|VRxU2~r7BjV?hOU63 z4jG@QsA;7cT0NujQmaSbr8)v7IG*bOYC}k0JN|~k0``4luDCwV-*LXl%Ws4AHR_JK z_4RNHeXY5#4t*6}UyHtWd+8tSwogWSORzi@udn#{McZAr%0iT-2QWMryb}d=3(e$O z!T0jWeI7WTnHe3JEwimv6`quWV{(6xNo(@}9Xa z(em_R+5^GxZ-f9<462)*i=_ z$CYkx97ip|II&LsaafhDmVLEFuP_(ldUwegaW?lu!lm~3WMjW~CdpXgU{Dll2eF1a zLEY{gxQOYSIUFWzLbXv@-HJFQ!Sy&YuKVW`GA4!}V*&Qiz?k5Ff&W$1iF5+~$?fJXb!0DW9=v$R{UewwYqKC$JXj zefGs16*_&Q0wTTCh&1ZJ*$(DLa4bR~>+Zj}$14|dotdc})Sz3bMc)Y13QO)y_O#>pSRJcHM!GS8`aGp&>xC}Ezb z<3YPfGq$=Dg^87Y*i58tAEqNMPrOxo{JEI2Lf|=^!Bn-n1g8M>OkNM%j)KL;1$_Np z?NLZ&M-vsP=iZJ@pmHLxY308pDk2SF;`Wec!UnC{K3@0Q$2LGVsK1?iOWpo^oOD<0 zS6#()qB`5ntiyl5dyUVot&Bncw5oDVF>d_m3S3KYV}je_<@D8^!;DK6$bMXBc@#$~XW&jZbR=PP<0 z^d|!Q;Eb3(0=~}#*R$8iC=|gzXoyaWC7B2j&y%Iy&{D5(x2lEgL< zh}6+0UL2j!CN%xSz4SLI{=9O4F_y~rP5k-kOCDqK#Gg1TnGk<|j_=`krd5e{RA{?Ob)=Uyc&1jNTN|J|%hDh~_uy<+nci(lZ@KSL+L0U8Ni^q>4X>{;dvO zHPZ|xA1^HS($Do3-M&|`eV?1yzGEXEUb~ra<;R>W5ryQeN262+=6>&nA3O98VRonM zxyN*UG_Swx(+mL~_g$m?2ho`i=7i{1s2Lj(`6r(ra$6I5ict+d$5y8Pax%{auErzZ zlt!M~h9t%#W$J>1_=Z%gGcV-aQKywTOF@2s_b)ER3RWa%DdE0|eqVEP&eBQPK28NJ z&1dGui@vYH&4|&Q^~mCgwMu=w7m6;|q_sd7h+WfwhvWA0ps%oa@(S_bRchy;6qwvyegQHM_z9SnPj6+(^T9~-gnxM8n<<(yYSAXS@ zL^|sQHp5#T3uBQ@&H^J0r9MT^$=8>>ZkH9%yRZgSC%p^P6!r{SOa;q9+fB$9hn#5jXU3e79O-@SlMKhTmZTBM0z^X*NhoIX5tkE z6Jq=EJ1+M4Pvd`_H+G?J@9;Na^sCJwh_0d?{oE<_ zpz0L^GMiMs3jG1p3pWLDA{CN^IOk8Wr41<--_#Yq;dUc%L0S=JW$GDP#!uX2Y@;gf z;l;Hy$OU;p^>$y3+e%nWzNpCrnDPc(1@VM<=~;`qwEViEWc+-7j2^fmabR>u)pV)2 z%e}L>)b>O#bjz}kmjEJ%B({%;lY}M!{$yHJ+V$Jop^+oXX8EeyF+Dcar;V#h13%-;WGOj`1B`M(Q4Z7kgq-mvCp~{YIPiz zQ#B`TWY8PU-G$5jx*&gADQku>wp=R0Kx3>I|K{LAra8EPW^?_avWpZ498saZp#cf2 zdn1U+x;C6Hs%L#>8@GDxT`oV>Rz-VH6}D;0U)^6^==F~UZhvtn9pp%e#I{!BA>-qD zJ)YhRo%LCax~sG7RzO_ulC5sZ;8>?6??cE|>7Z1tRr3_Iuz!!U1iDkZO-nD>d7Fv2LW#LZHPAo})$wgAz?SS)pwv)fpi zvznFA;j9*ivl@whIptZ-xgddcAM4iL3ag+IXFBA;7S6x?7cF5bGORQiGcRKY43XU0 zOon<{;eVl0nK{W+D-eZ5WLtvSoZyHgRM9)QiuvDfav3WV*IDN*CW3$OW5tQ@EPxJh zAAd+`8TgQSkfSf=gpbgPqe>hc#qGcxI9lMEyKqtAN>2<$OE@DG88)9{!_=AS)Y(rJ@6S3a%x?ZJibu?Z$SCC49haNjr5MB6GJ>oQYgDwKu1;+Nr;9 zVw<2n%!j*F>ShdBng3!H{-z*>(}|$WlG0m9IVKe;)OR#S%G1>zQiw@y?}a_3d7*Zn zb1AQ#+6(|qQK=EPj?78jIaI6`4=g?_)cHwX+1F0Jgff+_LwyG5$H(zl@fd<6e}}K5 znMD`T+uRAV;B6-3ft^rxz1u%(y)@HUN7nRr$t1GY2IRE#W7+cO+>5sw!@rR)D=)^R zYjvx_(R_IH{XfjRVSJp>93{3fHLTBfxV0G@d3Z4#GtNXtv`mfc$jf_p@g96wo*KVQ z_Io7yo{AFCQrXKb{@GsKPwkdFF;%(BQI(gmx*VZ$@4{pFPcG?tPcSQkI+#&eHOS&0!rE zu>r4z?DCv2XR7nm2M4l8z=bvt0h~5}BeLPbZ7{4w8cYCpYPbzX=DBl^<4F-wGiG2j z)zroGBkasfSLpR4SNzBIBjwgF>KRGLe(>5{6E?7iw4QB4*^raarCX0nR|w71rK<|m zszp87kQ1+2{RkMRm7b~1{60KbGk5zS-T&OW#1o(QLHjcD#;oa*kLs59N^zxtgQ=pw zX=z$S;jKke+SL>k^m?z@c?e{NI`P}Wn=n-#ZQq02YTjuw#GNl+jk?qe*ts1E^V~pG zek0*hq^)M;tK!m$bL&{t;X8FH4i%zd48@;3N2*c5yWLszsN9unZd+n0?5>fTW=}^k zPNQe4C9hJ6PvRxchTs=NS2}Io89cn$qeL**5?u5Ke{mRiGqyZNLS&9n0p7+X1m9%h)G>`49vYf`2pvTx3DbqB2~#) zm}^-$+^sTFLa|`(GzlYmuJw<6vP<$btjkWcgqcHdIS6QhN3o4XFO7IQSEpe!9=Tct$Ed>+>D-fX^`zx0PpTAtk}779i2EoP z%H_l<8RS=tUNi}~oX05!4G=82ikbYAhXrC%%X@%@+c6tL7FxP2q*Tm2%Yu{V7j|;R z3>HSNh=X<6aTUYKdyit;Y5t{H62)Zr74!Hu4_Cybwsr?sPdC?G^+I1*hhpYiu3o!f zd(HnINv)VXA?!XEN)B0Pi-(cJ*0@Im^`lMN3%fcITAb!Mzi9@ z9=9x!^>pq`r+VIRYFRpt_u}#nf_A8yGxr?F+vE48WQzxd&lM`f*m#0mZaIi|(IKI? zvkR#mbVROAkIGf=4DwO=*B3AvY*}~-8W%3oahzR#<>}djF9wrwR_W~)v0l3v1Ky2sWBNeGUEB!YjxDd>F-$9c&2G(CM6 z+~)IK0z82L2x#Tucoc>w$O6a2p%xq=TbwyCq?#YYW5savag_6BgyePDEhnZ$ZP&VW zCvStJ1nLYI$|yH?E^kWega#saY0Onk(C!g-7JxR7lk6s?o5zXDlJ^nI?)$!{_Z~Pj9&UO6CLGF@E zfW40KLM(noz{*YF1#Bg}WGA$g8#|t4$lAJ_>;!KbYbtZ7kDb{190|{&h)Vbykqr~?VXKAVGtETx&eVeva7uJJtg_#MT2wqt)8=fIj#6)&pKTw667l(T0$A zmXOBNGs;8H4IkWssLNfSIHXQ`)|{yYla!uKu6#PdUgOty5+_HiRS7~QcEE8_j+xHA z29@F9L1-=g9z4!Po7ouFqn3o_p{gmz6-`+mnA%#lBNF&10P8B(!|QOS)K1-1t9uY# zR=z3QmmP!y|L5Gu zl7YZbr~j`8B-xWI4M{O>M1?5x)yyj10FUXSZGecD@HbLIyw+XlsT^Gn0i*hAzMhhk z5AVoo6LGt)gjm&H2gCe$9y4*qrV|*QR@zQG&~*d7Oi^UVi(#`dtjDm-%+y`=nLE%`_aBg|t9}`8rj-uTmR5)dcGW?Cw+2~(!6fuQHd*xUY z)b`l@bx;4yH9YB`cYze|;$f2hS-S?)!_NIH`{ml#_p8t^CtKg&F}jZR{Rd7H4wJ6$ zb2?f_jCHK<8ds*S4(g7&*8cMlT_a=~6IUbp&xx(l=s%x7RqN5)f5JcB;?)l~#%XSQ zQb9L@`MUh0UJm3+UAe5($>)PUxq`cPuv|AE(LK-Xa&4f~%s+UTl7|-G-u(ycAER1z z(Ox1h+i37^46gr(gnOg@qBr=Pk@dGB#3ETWUBj#X7>T{@^MNu`-SQ3Esa_b$RIBhn zgVfb(>c0YkJQey$`V1ky6W%7P zBEw(BFThxl=c!`4w~8xxz{u^sd zr=F=UBHAQ&avJhI((S2Hz`8_)`Ij^cRNi4F{mNH<99B9zk?)aC6~Vw;2F`}+$Z54w z|3pLL2#r@zdFin7c};Mz*qP(y!vXK^D=*Y_ZiRn;Mb9Xk-v=$EW`gJsz(Oy`+X$8{|SG#*z3<4yT9)D zT(>`WJp1e3!JYTqU-t*r`()~fJMP(EvwP&Yf@vgE?XPQkxqpA%>Yb4H^LU3bHvMx2<+pgzSLH@+*ugD<}8fxw|Rd@!f4+{WRFV zmYq|#eWi-;+Fe?QeZ6vmaG1otrq!{3lSl3y*`uKDc^O!4RWxwA#cZ>KH`A=Vhw z6~TcV!M=cxd7Tl;RjV$*AvF>iMEgoFU1Qt^SlwT|>b2kc-$#Nzcg3Atqr>49Rn!OH zIJ^$BqBgQ-vU<)Iw*@CyX~@@+>aa}N+`!K{fgNs^H4&_eMxI0oHTyU06ApF2MxM~V zz@@iAAoy4SL8@o4y*labA}EPzBW_YqS6v5w%hWiyFZ>y%pC0A0p)z&0ewwA9PS#HY z0SR|SI@OlZuDdc-PRDTs+1Wx~4)*h+qBDf%^}o6_@9(8~J?Ytw{mq7EbL|SrgioYZ z8Jb@lE95Ok?V$28{q!uJKo{#&=X>cAv{g8Zpl|(-O(jAJxaUH?S-Cf^yO346g~tJB zlKGTX$ail;xtBl~<+`Jz`r6}1V|@1b79UgCV;56bQhWTh(e}7!tZ<)SsL|fE!Y-~x zamH7y@DOY%ugeO*W}jB3wm?hx^Ra&Fp!NH`K< zFWKSJ%#$&?<$z`}m+P_5x-Kg`Qd4rgrn#ej>Z<7yD=fpg50@@Mdo}2)-3o(Zg~uG5 z+zQV^zH5ao31qFXKK?LMy@@M#y-x4VV>GImk)?&NdPZ)rcu)o~k&akl?Vk~k^?$N|ggN%$Zp;V&DTq5gK1xw?rfHIOLXSCK5+$kk2ERUJ=d548inf-yD!5-RF2 z6>)aq*Qf&DykeI0Ta_b#{YZRXT$PEE~KtML6K7J50j5trB8)RXC_k;XnX1UaQ@>9$S! zdYR6J?f5*y^R8!br@<9eqi1tV`x;<(H{98^!AQQDL_zWXD2@(Jk0=)gFAJy-x~B?A zPw&A-&=Y*1yUxIaHa@*JxD;hep)rmr%aNXI(rb{u0T(Rs>mDiYTY|hFdedXCyoy%K zyBosjC9k9-Z|-yf90XjdF2;6fW31-8V9W4UO#!PSf-oNup(vHLH}6I1g-5)=uwUSg zY$4Y*GM68ky%_u&1*r+o+JnIIxvtXy61y*F$ikTwrJ9{~inxRahYq2$UFtzh@_@PzN6-4<8wK`F=F zin~$Hd}6K#se1+_gF0M5PZN-td?s)$4&KV7)KOTjPW;Md9t)4v;*u>?raW$7)#V8w z<@>%ydGkv4LFSuC1uRQhfi>B>WXj?Tow_Umr0nijZCT7c(3j_Ko~^)BCu6*mb@_3e+2wps8{uNhdV>6avZpEjd z#(X<%4n?;e=%6!vja#@V!|EIpdYgpE?IsAq|LwG;EchSI9U6}1t}NS@C4kl!%0iUf zq+mrLAMIlm_-LOX$^mhJ0SJ03AwqxDlu3NlRH!@zFe}2(At!bvZK-M{Y%y2+%uTJ~ zGyi^gDxcZ<2>Q&mFk1M`)c}Lfd>2oFDwMPSvgJN8f0==F(hq^LbHYD89y~;1}AwZIQdVnMEkNHde8Cfy6T=LKDBz6asQtMzQ#o_%?7BAp01@8AI zVouD3IoXeXm8$#yw<-3~FOlfZrh*YpkdNX?THi`f(#6FnaL;Ir%(b56SfsrcIUOLl z(jU1Mw}O51(XUcH`U z%fdD2vILN_2fJm_yeWL!yqTtWXGm^wxF4Q@4L%t5CfM|zIwsL{rN);6F`FzA7(G~L z5=~dwaR7tMnTZY|nl#jkx># zK^m3*a>oKxq6UCr<1ie#9aOCMV?Y(>tiucRnJ_8=t=PSxMqd~^%Hl6Pa%=`&<^^s> z2Yn^`scr@@m^uXL5Ph%Xw>cQJYnTHpOxE=6v>zUNXs0s3Hm{83PRZ&Su>g~wvRfxAm}Cxq`6-4~=lI2+mj8 zhnf4Q9)^gbCH#$)P$%#XxPQuR+hD9f@xH^8wzgJjH57ps?%ix0daw-UDu zXn}&ahmdVpZqu1}*=mCu(G~{R`H)lw_aNR(D-A)0Fu05HK!cNe>PDmBViTL*fONr_ z$ps1PyJ^pFO&zASpmKhr$b-5;wK3COqYfs)l^K;yk6-2;^_6wDv9tB(>%8{e*zv~2 zGh^m}pl)x>(NQ6Kyixv>>jGrFG2$Eh98^7vQ;r#iAu1G~kNzUK3o5Z=2Gx%J-@&OA z(Hg9}V}{iL^Nty|p{#BD+3jO}U=Zn4V+I)?m%~bRkJlBdOt>G2w=4~6jjp44MGu$& z=UWS#OY71*mvDVs!Abg%JDQWsv!1bY13M&1zZb>?1*a%y0l6-rk*#C%%c;g1K)*r3 zta~0ZkAt|)978C)!GTXT_&^StGX*f%jGx^M>O$R_W`5DKAhsAgJbG`BnP*2^MhEI$ z^3NV*Zjj@875M`T?mjpq@lDEVec@2?z}CQKcx_sFhE!7(8I)0h%Q`^0*|&u{24>`` zg`Hfw24yq@A;YR8=i;teP#x@U9?d{--hNQ(JK$sZC1SUfHyTnlD5L&@0qwgN01R8W zWsPtt(l<@GcJ$?DB~XGD9j{EQ+JW*WLIL;^?-wgDKkkG%rzsNu@j$G3pQ=l5xO5pYFonW(kB0Fuga~Qop$Zr-SpVfo>eB`)( zU>snunN5T{8R^SUA9usV36pQ}`U2Dc)Pw%1mi`=<{*H0Hq9DEB{Nc^vnNHKmEH7NTh!g=`ZRSPyZ*#ap|w} z&|h5_{mQkU4z!=Xc(gq}?FVMCeCj4+FV9`!r*~qtPu_!*&^!Atp!dHAxb(6**vlba zdLIUimG?ZPYn6B1^tN~D-8srn?>oQw=zaJviSj-30MOedf!-UD9^Yk>9+V`j3Xz9T6UN0XO zE?o(hmy%+M`mwCqX0Y_?DtG6}c1du-3u_XqnYqb2OevR`t2 z-;1))_n^T>-^cC`eXl++mA>a*eB!Bl&kL>lVWM*$5Mq# zr8T|M+lR%~clV@NmRI^{c^X)fwC}CBUj_P}hb!EqeV^7I`d)T$Dt)iVRGmlPH^Mu( zk6PayIz!(Vx2r|p596iPcV|FbefK~*wZ3oIlls26op3#IK!U#CI>;wuSKmjVgx0ql z!^gF+#-;DB@QL{}NL`fm>(M?$uFAh@n*z}yKcZj1H;6|1eTA#_l2nMs`4K%2L`f8X zA&NusS%Zw?&uRduc^wXuPm#tn|k;Vx%!%#3egFEL@TVmzV^3uS6?TjLR9sgkD@8b_4O;hQ3!p# zh!8{?>Vs{duWP&1OJ9eg3|pSnl>V#rwO~)`>mQofmrqI1*IT-WNQjrNL5ZaL+P%dm zopn~szaEubUk9Z^w8)R>L5pbQu|7nuzCO!NLD4urqTJ;AdJx5-uM2XFzP4mRUw=8Q zUizAdGD-DS>wYin?a9>Z=vvV-zpxAe6awI6-_O}2@O8{DVd|m%=FObp#l_*(swL9A zRR~v*Y}$-lg|epK4f>)xLfh~swDzZ)1EFnwZ^0#P(@)2pETx$^<9_u%kl)&j$-IU- zqt|Iwb)^@ zxW!~tGE1P_0lEpGz0+DhwH5^=>_@2UJf)MfRR;eX_Tfq^)B2Vjm0e70#<^FXQ|^BR zy2@ivg&7pD1q+OSO{I2D;!J?qaZeu7828{aov~59=$B>n00*1y67B=E^gI?%PiHSZ zt4PnInep^gAqQ6I&XKI~(6c@jJ)2y5I+31}@#q=fVy-Pub?qz-FHhZuaTa_yh8 zkfmBJ&Xm^k$uAtU6WVc(weKF*?}nZ3zqb*mR)tL8-Vu5@kxv@*lpbv8>6l2*WL;;I zUz5-?LcePtN6(^GjihI^rRQ}la>U7}kFGO689kl!yUzyr<#SlA^swP+`^l!h`X}fM zhc7Gl!acVU91_F@nrgo+kruAt#I3i5lJ&}wlEvHb(Z-(w9?2eu5EJA_F;$3rIHCCN zI>yRVcWtnY?QfO)7WOZ|ZLZxO6SQj-Pw00e5Cv3BL;-23Bpi+A?7dxSi@xj4&rN6= zpwi1v+vNPLLMZ6tC#qwRJhc(4URqHuKc{J$%aZZaMZYUQH3>gAw`?RopSMonXHqvq zxL-d#;`yo6qxL*CFp;0PFu+f#AN_7bGJc*3`uVB7Jvw13U0mo3K{J0^cntz#T-j7z z)4l+`0=)HKiPN1nU5;r}`ig2Zje6K5%tGZk(TIq7wpyYe<2^jFC7(7VY)@3w~1 z`&lTS-bt*-wdc*4Huch*lSuE(V?poN8S(UX_tQHYP*%QkkxnY#U1%D*Kgd8!TmqMy z(0|X?JwTq?`K5Jxyv$mhOLd0szh!g(p*G1e^o_fNCb-RGM z8uk{zQWn0rV7h*H3StfE8OQ=!_tB6C!xuL$koKDff17lVkf+Xb>2UcA>AGIBH21Om z9qhuo{PowcVGFxdPa)>1?f=5i z^0!vkb)TiV*miLfTv(SsIcr;{##q=)%ikF;tjph>8t=);_#3U?9T>;o^-UYd-wwn< z?2Xl>n48z#vdiD_rXtJZFjXQU$spV19qYon{PobV%`NPz&IWHY7uMx3pke=qxq$@x z#Hml}?~xPz`g58zkiRo6f6sl9z+aiJtBs|3jvjX7J{K3(XR#>+-iAJ_C6Fk&M4m{cg$$e*Jw|^K%mavI@Z3e3>QMr=X-BwZqFg`FMnr&o`{Z{74P$Aq?_=hi(;&x~CO^sIK})06Q>Z#??u z53pq=h%GCV_UC?+ff?ZSW{8EbXzjAMglQzPVUa1YZ-W5g_x~FIGSrOrpJKkPwI(O+ z`MJi!*Wo`nET3)S0b1N*kS`WvJd^q(rlEBF5%Cq&f^SX(@C~g6-=GHI+p$!-O)r~G zJZQwX@h4q=*CgV5>Gzn}>WyzMDTGX&f}c_ClBeG zd5`NtM`O4eTCh{jh+_PW{ao}vfXQ=8*rUop*Jp7L!3^x{EX!Bx_S=f$?POgRjFc=`D!HiR2~CbUc7=V8zMqR-y` zS{pz6)t8@NAhsm@jEC(&XnNi-Mf*7*j-U5`bNTsK+XQ~R^NT)yiqKM0>gTLqeEL}i z*i`+GxAU?7?f)9SuKq`FG(8<21{``_^7tLXmuJl~Eq|=>9g>LepvK^9l8Eo4?MdmY zGk(ld)3G3I)hYh*3~c*i#x}$@`D%=LyvA4JD znO|(+Wl40z*O?69t;$y;%@gs$w@>9h0K`(k!Yn>ckjJV>uyVMRJ=Q>@R^C5K@`eTb zWfvYKZ`;J)-fiDjMY1bF6YAZbX&B5`bFeBaW${+%U9Tnb!|E#9r>@nZF0JB)?H*Ynz(P|w&%VVz{K}7!CGCY6(Oyo~^~L+k+Uq;g zV$4_L6YFbb-zKZ?qaTy{zuN1oi203U66^cGzD-u&Weuti0R(LZ^1KWm-*9bD%ku;K zHd%c?{?Gva{%tYltAi5ji`uuz>YLh-`mVJY^VK&v4HL)TdG>9x`u0g)-zr#BE%R3x zLJXkUaTz4d{7L~gY}CW@gkD5rfABV0KOZAM4v#x1^COeAyv`SgZ&0( z6ttDgm(b%fH$T{KSY|<%Jg8>xY-VYGcpdLl?-Fdfk<|BZBbB=*njL9V`ER>@8y}hg zMMHJP)!+YY&q1DpHKhn16ZdO#j0TUh3NJagV)v`;K#BDb1C~7kfpf9GGQ*TuH0 znDf5-zU}VMZ?yc*1qF6fzE6I~;YGvc_wF*E{B}HG<@YRJ)Goip6;^&d&V&5U!DCAK z&BRNu{CcB=mEQoQlgn@59+cnSpdhLIeo~E*U(s7W`7ONP%5N-Q)Goits93Mrj~fj6 zwZvme`3=TPulx#7!piSXq?5~U;vSUW```KGSLL?fm+->c-}z{JY`dWC7j$LRPh!*WFFd2o&IGC~Dw2RmHQQ#CO%_TwzkAATP6f ze#YB>G_`a%CEV95wdU$tS8%!worQ9@6J?-!PzfTPcGG|-l82M6t38hxr~-L8PNT-} zhv$8-=n3EXR-1^s)xgFhkpKEUEB`MxiR|X4A^-j_rjY*w8pke3Lgar2$X~oPKZX34 z53Ni7lRk@=f3qa=KTy|tcY^$bP%{GatWT+|DJl zQ~AL2PaMbM`w)K(1iEkQR~VcG%cxctU~Iy_HzT{5m~^%34vt`e)#`o>x@9cJ=o$9# z@`gsx^OTpKpi9rGetNPDJx3&?=PpcmcO0f3v2M?wv znJ+wby~sR%{F@%WB=dzou4@FoB=d!jHU{5gnApeQ&a2b&8-s6JBEH?Eff82{Fdo-weVAKgFpc7z!YyYowSe2n&v z`O#C%YdgP$-pV__B#*KAr7SzP&Q}ZV3|(w~^d~)0%XxI z{QTY11~`6x>HM$beN4LZqxcq_o)oe2?PBVL96<2q@APXc-{$5mUY)xkLB8L`=I?qK zN?rMOG#OgHt<95>FV`PE^5s=?P=h=FyiQNWQi9X%3|&mVZ^zzVZQsV^`$X(*2g8gj z-;)fuJ3o4p0gjjNk6$%ZzH1O7$)uB&?{+h1sO7uJyteZF%)AAs2Oz9;=Ww+Bz7~7C zOV6Ih=JzX2hL-Qw=E=zSRH)4(U%9W}Bi|PdG-@4cs_@K@-WPj&qJ0~a@1)pUg`kSO zy7Fydz+L&CWq{-5d(W3i&QR|iHNpJ z?TwA@=BwBx%kVlPpW)$+GzMd}l*jr#J_PaxcF{$`i;;Gm4#WVsX2dePEwPXx{X%uw zv0L9rBQ>dZcr>Ft$00+iDRSaN&%rwMJo|sH+t%Z?EB1{1F0ZHjCJ486$dC6IrY*k% zQ^~J4_N4mdheH-}qmPjv9^>SPoD}kFu{KVAkL?-xy~O~%9`<)|I`TUgd-Btk--p=c znAHB(93C&fpZ)T~W1ReulR|zgKljS7uJdu&)h>g$N&XG`cM%D9r*K#&SNt%lo>_** zh}_(2@32l5c%71C^{}p5-Sh>Z%G6dY!vJ{Y0GWN16pYQ}A)+?hnizf{KyMSHT80X- z@j_kkNmBaX`79azBNFK6uqdAXy)^w3u-276{rRjg{y?wv|8>W^^_`E0_y=TmKRx(% zbyM$XAkFWUk>FJBt{OlXpoP%dq4(ae8hp%NEzTf{_Pkd%1 zcm|uOu_AtJ;KNY#{F@A4sAU=Fb7!p*Up2{75dU=!$ z0xkaFM2ue-gw0Ya;%4KTeQM{pgS8<6aTS z<^UX=fdPAEb4?6)8urER#rW%tM*3@%ufM-$d(j&C7(;Ptet(=eiw499X1=SlGMEJ_ z^E32Lq&5HZKkvXDo9=sd>C%yVg)-zL5x8frCrx?B=$r7ZCT1nSKC9_lYUo?YEDwFt zUI5)n)o6mmszneh8W5F2qNrS5qFL9qc!@== ztrxtOR)*n=dr>p;9T<#FtJ2ouaRK0f;L3x@; zAIWG5i^~594J;PqT>USz@r`j{D40=xb8#j(>7pbZrE4-Cy9lppMN+$V5#E)%8Qwv= z8Q$x!?M!>2opgA03vDJ|fi@=@7C9m#`T^cEucW{`dRO3Gk_vBqT~b@ygJ1Vlc(?Bg zyq9WH+BjIj znDOSxVk3XCPM21YErkQupE-NqrCZ1#x-l9j$0m z`7o86XCmb>aBbv4jW}k5JNX6JYaOBzh{+S-BjW`_csA~G0 zOap99^pODSpU8VFLaJ&9?O!ByJRU-{Sa9c~w6>t>Nc9+CC!V5fdaNK%7AS9{i0zW> zsPv7+>-i6Sc>N8Zz$@)CEt%Gr))<9hED5s@Lf(Oyu;$FY? z=}TL7u;52;gXzKz42}X}afpkZC^X#wnD~x{m&L-%3RT(bdP@L13!lAe>cM#h9uh<9 z&3X%ohs5d=1rk+iql(nh)B-=Z;8>uS)Gw&$$_CrANCmJV;f9>@Bf*u#PhGLjU=l5; zgTGawy3m5>-9>v#)afQqK^@K`fGaQOx&{6K4Llanq|TRROg*-xaLamKp_;$afE-fL zP=*#Es@y~sFc*L#>Y)ami&2EK1z9xEp;GCZR}5W%N9kU%;<{)h_b3wGB{lyoNj27E z6#plS>s<^1_ZGl=!9`jHSH3z4++8egz%|}xiS^=tG|uR@fmrRzrp_`ty@QYsnY7KZ zf@MYOF7qWDSV(>LBb~iq84i=|gl$Z+`=oa_y=UOsPI$XUBJ{y2-3c$5Jkkjy z;L)ZEAs{g*G<9eUhMO;o!7=6=xL<2P6%%*R?oSS_q(3Y8S+GoRGXm}ii(QebTA>lm z9a7xDV=hSjg`4_UlS;Te=7Q9aoBH&Jx~$a7w9QzPk%SuGkIk2Z?;=Sp6mlMBKGeEK zd7?sK=juohDY7jK51m7_lefUbcN zS>Jn2VO+f$(dC6Z-BzTWxM+dsf-;Qtxjqv?BGxKMWj6K0uO{j(e32 z7r0fH?|$YMeA!nJewe8CO&I6dL8x|tg@KD@kWy(sg@4(!Q%Pd7F6TA!)$3+R{bpXithJ-@ieI#(O}N#y{F_>2FcA-SYk4T|$~}Q986V+pnS#uRTIN&m>P{|L?m~kQ(&XasnK6f zw>)bhX~3`ONr9YjuO~%!%Ls5$qEq9IKah$TS<^f@Fw8G_Q;;fDi|(*jvAhpKF4N-Y zFQ81F+T#&@B}_wMJdO)rb=qp3cFSghZHi0_2Cjh~x*96QP} zc?nXq#LWPM34RCuaX!p{Thx$bO~bry`12RErjcvjtFQ6u7wz0%Z%w~F`?L1zw<|VS z{mrZ2!X0yG^xGK%Y&Yq*tLodzZ=bu(qu-W5ae%(E%!szO_1n%sl!NG(C}{NCOF>vp!Vvv3kWYJ^o$Bbf zujuKF^5O(rkE`Fl17%p|6<5Elu~9{8&(s3fSa6Phy8tt(Ri-O!*>w8t3tF?INZ0!9 zlMpMY+^bss$>g#6?K|9VcJzlZ{Idi9{qL;G;lW3>bIAm4PJ%x z5Dy-y`t7rNUUT)^Ls{IT-=4|^h2S_;gzj6xj*wkZmwuR$I%qtxc=n9%q0#op6{3TeHaMZt^(#?Hp5uqu)MI@5SH_^JOu( z(R_pDYW0j0v-)jkhgPEBHUn3$emmb}N6D_HPLFwzg?Ob{dTmQnq?4hC^poj zX^I_Vz8riX5nvcWST2;A5B0-`u6}#5j6* zG$KjAJykELT-E2}1yY9|CtAOKQ%6}vs@i@!iquT-k0?^#tZ@+3iqxPbE;L7xa`fA~ zUo_c^)D^Z`k0SM$g@)I*e92mo8tlb`ij~TwNYkL-ZnU4G z=uy9YnIxvddVqy#6{)2OKoeD^lyMI4V+eJSkd{ItAR9q~A`jN+RT$ zx|FwD2KxZ1BkZTsEuAgyMYZ&roo)$%o26UMwJ>eB9HR4@ZpqVMPPb%RNE&bt zTN?J52VG9k-BO34;ni>JJUO7>K2akD3RR#YMZdl1X`ol9Hr<;>za6I2wr^w$+SYG7 zJVTX)YHd3GcJ2z!$FO{Cy)=qb4}ri1vUOtg+g~s8>$jyf|0DbDNA1^dx8qXKRQv4$ zwNv`--v!ui(r*WVrdUE?wb!!!HiSG$`t9-S*`Zp$t@;pQV{J~d-*$h^rzdvAXIlOC zgmsoaY4qC<@NQAt_S?$=+ppgiFCsJb*+FJX(r>TF{*JS7>Zz{K+dZy+d!ax5Or|Gs zozZVs{k>#$sJ38uiJsTCetS3&rG7gL1&w}N3c`Bz+XXMP zQyu-bhn~(T`fjoHxccqkE2V1ArPh9%XQPVL1*rvI{g;Gsk5q;9G(GjY3hA9J?$K}m3GiNUhqemt5iP%6aHTAsqTi0u(;d6*tyeV39c^v6 zNz>ZeAoFFlwNb{jncjYTlL6-Fw`EVIbiySjkE7qNeokZH=(n4Vl}}^vvH7wXtTErf zeLpYm&`qv&XeIhB*LPn1R_O_ft-i?A>CtajxT&X@RMN!gw+r3WB7=ZKv3Vv<<9nm| za`3%Zny2;KSImd%RqyJzi*#ff{q{IptFhnSO}lB5{dS7Kw4>i%|Ewh|%)PGt_ReHO z;W18m$9~&eM_K(g*M2&R)K6qmDuLl-Xpa3)?^Yz)Z#Vr@gxWo9z8&;Mqq?d=vvzn$e;HS=w?o^Banp%tl4zGU4kU;Rm7yWQgGx8G?A&jGhm zXENQbyCvvW`*#aNcgtVwr_(LBVn|BU9=0%Tw@lG_O}AXCznpFvWg%(6<85i!V>~Ik zTSj1XdG*_#o*d9`w=I=+Vt;8yihle0qd*V(?YuPl?bAAK;`?kt+xqQGk5MIQNx$9j zZ_dXp>9?0X;?Zy0JkK0%zGbMrG#36F@Mk#r6^}kV8Va92T{|DjcDncGllGHCP@|}F z^9AO3!CGw(gFmL-UzYuK$iXJ{;W}!y(7iA>@i!V@h+piCXT>TBMKpT`V&zOAH1+)J zM*qtxkD`*2{r522&`iAYU&uwsgPvfZI5aX|PUE`7^+5;Rf;Y-nk5t7keF0?%H<3a$ zE(;UMc%0|3)QJyKfqWdnSS5d>l?(6-%*C^zT#%~k5S2hI&a`O!0sJOTjaR~!%v%GR zRA*_{pYa(h=WkTrf(H=oY#~5igZe8ilNaNol>`zi=dX6nh{bsd473ZX#~&moNU0UU zs0927HDs4|k37N*-vM$B?ETtn)}uY3Ltk**tK^s6qAW$7LSn zcdhyYpWr%u3&z^paSO(uA4+!%hIx7ZBP7xW5p=NnL9Es*5NnkIzD{-0j~{I?!^3Z_d8cc=1SmCggE!GdJ1`UgH8{yYCJ@L#V7TH(L3 zNc8aE#VBC;ZxX^S^WT_Pcenh@hOsjfc}ey4`KQ0W z#Gg?g4nhpW{c?O+(y4L{6RaD*c3#iaU%5HPgK|<>{7YLuZ&@oI|I)2;t^}_sq6Hlx zd@(YD>dAY_P5sfOqFpe6E)`78LC?M#Q*pN6>H2$~v&w(47QpJfx{zr8c|bq#V6ld@4qEaKKW#q_T;bqL$A*N%lyE< zw-0_bgm3!$p&&0l!@2^w=hQG44%t3`x0h@(9$GE`UQ+q%+gTp!ldt|0+FAbjr1IM< z+lT*?N#&nUE#JEQ_sExj+^yx+52i_G0=wJ=**^JV;C+__Z@(mXE%y($dDOdCh*`wj z$N#;{(x{F8W%<`q%irCe@=H_8pVyx9_e@B^f8X|$kEWLY@15;v|8=S5@AjA9jFF=) zGPxLgY2M$(d&v{EZHlwnT5yS8vCf@?lF)VvRklt?a=&3b^(*f_>1#8BLyAIWUGO3u zihhn=2JdN2?&3A8PoFfgyu&A+eLEw0k7K-iKRc7=-6fp)!Bte4c}YiPIWjlHM=>$R z9P}*oRx~$lMKh%$sZ_&1)WU!EPJ#d9)hY0W??@rYmN9n--91+f2>)e5zY>>z&6R2B zr_(L{I<`Q+lhQWp9Y6h6r=efIZeQ0jw|%(Axn=s*V}m8NqpoU^el>Rp{f@jQ1-_Sl zKf66G{glIhJ;{G3;M3l)6a^>n953F8;3d?}*z=2vifsk5;cDwFeG({^ zt9ONC9d@k3qUF(fxZ1Uxzg-PQbw!AR{tB@1r~^r;YLzeRp4v!BDk;!|(O&af-KWd2}{Mh<@k7nOe5Ui+}i<0OZZ)-C=@2ShjcfLHy zUQx00gqpm=6X$#eGP4XEyVqcUtaMQE&ZrhC~%*gAGMAkXbSC zI_mn8Po!r=FVt7M$X{PDQjNz~Kh!VdYAjN!oOi2#taDY7QGG<*3>)N!d|2X@5ANve zO93$u?X%J>MMB8!d_cd_JmE`g|M5R}OnXANZO@pdHQkb1Q4}&#fu8zFZXrfnTN=~N z3i4QAM(xqFa2Bvl>XfStC@T#OybWlQ))#uQg?RJWX(8lwZMX>$fyAENm8#CNGg%W} zOq|i1GFRRYz$`EK*`6AuR3E9%heSpu;T2X4UU}yhhc~_Li&qUw zB6w}MnW#i&1OsIq5(DPU2qHtywLPJ-EN?))-`*s!qqq@lMsonC?Y8ddFe6ZM~B>hDmfu4%dcucImTH!vz`NNWCTaQP4SYxC5l?w+k!8!SBqpDi=s z_{~vVS&i`tnGD00QY)^<>D2H#XYR@^RJHm6-)Q*{fX92ZRT#n-of0i?MvUiv>#jHQ zXe+CYN#??s>k8xXeb6gX_Z!eBVK2G%&*oC-qtN0d ztN)hnQt0ryWcCli$^zzizCx(mYVlY& zSLmk7aVaA%2dO9@LIzu0$v?Pfjj1pfa>759d|1P`LL3WbuEx|(4Q_qax&za`-#H{4 zD#gLTP()=%!yzCZX~c7ixpD&un~{}x5B2JX0J7lUB0L!wy>X$6!L($-nrnS0Z?C-B z+;v6}Anrx@_OW2=@G;Ja?>Vt>9w?EkDKP=GiPYeFa~l`J{;7=%@fK{sNT-$z9q2y` z{62<^5Yb@tAAEZ-YQ4YWSgOS1?3^Ms9QPQa%WlcdS^N@^!@29?Ty&Wp2r6F?%JX*D zIDbuA1hihC18%&otbP2kx!l*Z4ETdGmor}!JNcUQ-SC&BS6}C0#I5&I?)Eg`+u)Z} z_~^!53iM#KOX3rU>ojfn+XjEYDe%1qjd9d;==QnZR<}`J^R2oJjq^5bu>+&6@_B_S zs-L9P3<`v{;l(L0un7*Zw%Y@qR@;)`?Vsz1w|^2m=nwnWI{Sl=--{r~wEP|lS-Er) zhF%-;ySAJcA|M|Q+pkj7`uG)yCAf}Kgmoe1a-6>+ZRgFPus(~CmHdqsuha7Qe4AtD zH0F?EmGX;qJsv@z%)Zp-**?{u2lqUzQpF6;82?Sm(pNf2lS`{syj!-Pl-=cVB1^&RfL#YcR4mE_*x<}}<5|6WN zk?tJ1JLI-+073dXQkNB#fL!|!Cp0zrS7MB5JOOlWJP$E^e2G(#Qt*G!&n&E)gBkVE zf2N&L^=zengR6l->B4w%jUc$R8I^`>qTwa+f+ecoIRRd6u}V$(bpWsM(iMDgEWE^Q z&lc1~0AJUr9i6cQOdK)E+USF-~PXyW6bZ1JA(e zTHD{cLb+pt8fEeoG*Iz@7uu;N0zP%~0UQhvD{hEteTDd-#TU=gEtZ9a5%GerS@ERP zkAk-pd|$!I$h-{n9LTz4Cdq0h3;X^L621qWK-<6)gvXvbuGCq-RBL*q)rXSioYwKV zCH%d{qyJ*yF(3^dgOFhH7>cmP!!)<8`HUWPA&)Al->2ikO!ud(2*GELK!^Sr4}U2g zb?~)dTM1K93ZVnBFq|Y33BCDxVZ6s?VtxG#L%lgQX2Dm77|n?>p#Rn@W;*eVe+x9lsf^h=!F}P4IFNXs%cjLUW}F7mot+ z1-WYwuQh2XVyY*UrNn;|1E_5%(PpqfQBVv^q0K1JDo-62qBbKB$8RWibCF)aqB-iZ`zE^5`WZDhrk(-yM>k%l6Nk$9PDcLAPHNLI>AWjfb zJzyD4-ybgs+4&|@l16`wbfK?5{&>BI6P*5N_5CcpDpAi#{ip@wR6TA#IAHHHAL=2g zFBfxVZjsXO&j!Ws#M!CLO|8C-@j0+MX?V7gAAOiqKHaG)48^v5a#(~+P5HDI5~JyZCjGJrpzCHQ2l7UU23aT_KZu0MnyVLF=_P{(bS z8O_U;Z-n4S1*MO@DJu6w{w+ z;8#ygd*h63E*tN zWB^ak_+|&YEqaN{sBnc2HrtC0k8f2Sp<>!@@Jy%dqw60S6ixNE-y8IoR`EO=Q)sszHQhm#DAJB zu71K2mmVCV@o-m!CP5jiA~Gb;c8pcQ+E^VvyUIHRTIc7IlcDyNjClK6cQKUsREEA@ z$-$2Jy-X$4+)@1(=0kPDQHP`^U)D&HBl7MKv{{N5a+oVVf^Yw07U$o9YUjKV& z_9uWBwRmq0mzz9W6ik3T7z{`#{Z&87_Ko|;o*n5=w~W-{+m zKn98Q_bS`|0Vuh25Wb8(zJ#{@k|hst@l7EJ{<@)if{X8*#j9}LEN(OmMax+VwhZ{Z z#2JiL@;6#JnBj8%3cIrsu-*4p_y(!e-fI_R>B*rR9g=Q9rs5!OubF^UoC=wIl2=X&)$*ZSBCytdS9eQas{N;ec3fsGVxQjg+cFtdiG zl_?&l-=uor1B^ZiV#qZ`mWR}BAsFs?+BV$ubxv-l#~+>+_&R6rq4^VG7Hv|wmkJaV zMO#w5SIkKKzQi{YGvimy;+&;3$}jqgn)B%=$uym5DtFYajNqYvDpO${qhY0+KiV44 z8o%|MQtRM3H$Ax=oS?(a&}cp0?|9Ci{CT%oXFk1EwAAJzB=0 z&k1j)fz>|#GInR;cVsHeU$h@T?Ut+U+081dHYAVJ|6Xd_oKbsS`Rm+HdcLOVH956(Ps>>Mmx}`wi$HwTu0;3B%I%54z-6BR!HTWuh}((p_WVE-j@? zGNGTSn$7CzZLRX-GvjoZr{l+-uX*f2t~AS-A8$g{w!P#zFF$tKm;pcbFvz9Xw_S|V z_P1$2-oQ)d#TPG5ZgWQTbou*(RG1SDOpR(L@O=E(kHypTW9`ro=d`5pw0*4ROg%y~ zsSo1`3!h{-&-mc9XS}C}cge26gL6SLe%*H(o_OVQ@S;(f(C2@hAM`pbwSC8oN#;fN zf#6G3SNj8qMxNw9ZM5q{FqJ~n=2>F(?TSWyp!lGzF3%f)Y{93QTqalXxpUZ{_UZsdYY&4Uvjw<16Pl`-8f;@)%>e*>il#3~u6 zh5G`AW;w&SCkDUV{o-G#?G6hU?kIqGG9X6F>ya9hUqb(*gh_T;h5~qNC(eMH zFs%a$5u_J1Ji-tYjW5G5eb{tGk?V4Iluodf!tDi>zIHk*ZAQMB{1#3OsRL}KO}co8 zNEJg;DFdqhh|aB4+Mr8e&aRVY!qKEoh+0RY&d=KfqSocaFT&0oF9&1fsfd&dBl+1B z`%QLac^`Gv!N{PoJd{|57vWw&H8}qZ9=_?2c!FPDvOhJHjR_Ix{-Og_q`;mzH-Ck_ zBTbGS`SFz>kHI==nL0J+Q+OHjI;r2q!iz}gpC4zsF&9=ZkgQ{*ilG49!I{4kECg{z z;2p|J`CFMnbE!94o~;1{5@!qOkowQD26SJYk{zjHNXW^6di#^@Y1qT|VJ`!(@o=^T z$lTP;B9FtFKt8A@*cyiFyqzLd3|M6;qer&B4x7V#fs>T~el%R)b2 zr|c1_Vo303Kt1w#I`+2spJm`RUXCp+;`3@(i@zoQ6N3zeChNSNBUKC;;$J5CGlImI zzbztvsj19C{%i}nLZ<{HRSXI845;QrYsgPG@EV`Qz7&z)(?Q-6ziFUB{sEnL&qx(R zhWPJxB=H$xh%dnw@xRN|=iq;vg}y|mbcs|kB=|F+rZu&O|3U+=@iQ0{B77Ll*f09?*reT*TE(kY=x6+?nN1M0w5iNDUk zYdq2*f9qa;*)H6pL@(j>1sQm7H>_0GtwkKFRuCTluu7#blm_xlg2uA=6QJv#oJPu#xh& z#YWCGNF_@2)Mw|q8xKI;;#N$ZOB_QbFH*&jkdp!RQ<0rZ)2R}4F{dig_<)dUncC6W^7E+% z$B&OPI94NXq>8^(h2$B`T66+hRLRIxK6a4&s|B%ESJxv_#gHJ$fI0%ZO)U>P`mzg> z(eGSuu2j3t`52N=$UiT#3Ml-fpL=giV9NVr0>`X_e=q(&^}(3Hqz}ggj`(OyU=#j7 z*)S%sZT%SS=xY{yT3FR^oLPEzd(1k|q{s$nGg@hu9XtL+EL(zL&JD5O4ECfsBQ@aS1>5a92~-d+N1+u|d@z3^HGE}#(X z3Rp7u&ESRr&z)lyg_*6tY6G*SN6o=zj}0z^@_5f4E8w>_6Ca;7d4NU2@S<7&V*PZV zw?DYn()^f_{fX6q6Z)ueUpYo76PK^zhyzt>hxRocQ#-UjLoE}`SmWlNtqCUWWt;~i z?~a+A7j5?6LNQW3d#-y%*#I190D9VP+CQhM-S9`H!hZ{6&DcP^RqP!8TSungKXrG) zzbh5~KD!hCpj7z(#8BLA^r?p!hR=bR22B5++X{S_qtn_iF>?W4ydXY2m? z0D6KK&ixjSoij4Tr$IJSN*&eP5$a@(f)WU2LPdZp*P;noI+H)_P+^kwZ_gpWB|zp zJ2&Xryh)p=bLQ3xx$4wGz{xaG;EJ)E6~J7IUl_aRGiRJ1Fm{jndJK-G#|jpy{5&*k zmJZK{^h`|E;Yp0YT!$MN|2rMdWB42$ew=wu)!|kdaVKpRlhfbu4=hO?0iAU`JtZ#l~#{58OK`cDqdm=t6 zwhL>@(0wf?j2O<7(UcL(-LVE&;5|GnZC^hE0bv(MsI}nvEOdu|Ny)bsAPX-60LsGH zj)%S)6Zi-IKac;f;{O`_{}BH_!~bvbzr&U>fkW}15?srdgI9X&4}Bc@QV;Z&jsVTu zlrJASy$wdbN)8le4TAvF~u!SG%-2w zAC0qqm=>_#zz{C3SgZO&tF9>jL??8N$9Z3X+7COWxW|IAlqz$H1@dkVqWYoPu@U`? z__>~+5NVJJ=lxbLNm#31XIx=+Y*P$qMMx znEU@gFefWT;kCzOt#;xjhs{%+G>2m0D`pr}_b z>11j${BoX`UlgiqhrJ4H0_^p~)7N{Im_9%msiJYoxh#?&l#23KOU3I>=15_mkmCFc za2j6!BK6t{vJ`X(oUbnM81l4b;#2OdCyk=5fPqoe3&6b^h3FG)%;#pm{;RDi{-AH1 zB+xt??(Km02WgehVl#7B;LRZ^{T863b_L#g@H*hN84qB((XL5q#}mF%JDH*9Ny)&72z3kS{RU{B^dYKKk>vv%Z<>>Vtm# z7q2`Tfez5zwGb^@3SYlA<}chiW?rrO%ejsnIqtq%Rfok|ORom83YnM=#R{yV9M9m0 zY&Xv-&BQeyn3xy~PQ0|XTp>iBh)W0)V6Z5zZ?`#hA>D~8w-O%bfyheCIr^z0`Hjkp zSe#N~@@SS!X+L2ZN=X;jxAwgW>nbOl??3_G8X>~bXb+745=XaU5~*jHh2LX_Sur@> z3^NKKAP&18Z#&q`G0&oionxvIPQD^11Np{F?PeT|5qT`sg_6GCUmGY1Oy$sWA2GQb zIALf-1_#QR@i-@AZc@f8bw;`23>Q;-r>v1o@;f_WOk{u`WzKWwqxs=r&do;DJdKTn zlC@s})l0YdZ{SP(3Zmu#M0!L`9X_q7dB&FXi<)Oq%p+=?TqUzVf~cAQEh}+F%}vNn zQG<=W;$TucCo;`xXNK*oME4e|ob%*#pO*_zUmvA%)pF<)-V_V7Td7qOhlb zmKcEQTkAS{ib+X-*KIr2*L6;=lIjoAblrcDTe=RnqC7P?h29I9>>)uW^hQ(PhM4en z+jt8mlk#9BAah76GQBMn+Z!2=mvYE*FFtP%GR*=$v|o7Ta}&s_<#Uj;{}6n(w!ZMG zc$Czt=Nrz(5+!960Q90GsD9*AzWM>E*Ru4h*!?gkLit zLipwCM&LdGeQ(nul(4dI8Ny>nT{(Ft_3OjBq~YIOM5glZCLp8vwv4ZEeLlo zBc#V;^KKoF>P>e%^7J8w=p&q8pxvmINNagOzKFx$&VU@8jRAS$fK~?NEF^NOGw(|d zMFBe=&q8^3n+4C%^WAuxok|AaS52XBN-F9|-q#>&mH`L-isqX#IT-<5s$N09Lh5zZfO-#Bt7>63#0mLt;Pf7Nb-e@9yQ-F6%NW75L^NB`YLpEZ5c(dX=) zg&#f!j(%SLoRSv)7vNg|h{}-v%aZxCds_In?JWFPHYW4`;pyme)K0_Knv^@fMy7@T z21dnB(WevcYx2>5%g@u{f7Q;yFMb$ybZ`IOkrsZporPZs-&h~~W75L^2S&wC(WfjK z{+h$m(dX>+@T)Q9Km$*`Ul8{IK-jDOkZvzJVqWON*&33*|B-QN%j+|*SX_Jq13Dn& zJQdbAni(iBg3HlfXLV`y5%s!f|6wz92Z5fA31{ha)Mb_jDTmq9ykr5Dzsv2%5bmMxm^UX{jGfGSwQ@B#)QD+Jeq}?ApOGs5Vnb~V;l}xa4YkR8k3}VQ zJTCHGN8{?+6G>R45KZeJjuRvGYVWsDU7V?O3YNc>1Vh^*|FVFt6owuR19j|Z{9N{2 zQAbeSY3mrE(?MC(!4ElGP_I5%!#WsY&K5|p#cJ|B)!byO$yWVsH6wI7w}Gs;xHM&x zRKrv@MgF!}$BCXg4zYCvRb2;|%?m(SdL^jF z*=nZgbaWo7;fJ_t*Q>-TQj8Hi&A`9W7VDU#VMwq1*4B}&e#|mWnWxjSrG+~9Ve0r) z>R<#99q@0iuAztWB@b&sv%ah<-0)WHu^$JcMN9gN`F0RC;c4(?f-Wpv{o zZ5`R_SX&3TF_DhLMQ8^<#D%|JeaSlN)Z-tpD#o+-f2^>yL6lxP>%)-S=VY95J5nPAEwCzgshAp9`d(EJXX4RU^icn*s!f&vrfde zB`V-Yp!7i1;S?TJ;1{9G-xi^7@IW7Cpntlf0UB^nKjIRp`a!_L^_>Ch`p$4_H#PQw z8Mv`|J7iGOrWSYFAiPgMREu5MaK8?X4g9w2*uabUe@M5nfhhiej{ikDV*}6Of1lj3 zfsPPTcG0NUi^sg-k*(WBlM}y#?F!dm;#j4s-lvbt68)*nDMW<>2jZQf)ctt7 zA{t&8!$tkiBtGY+Kp)mh|CbtEDz0K@$o}+VmN>hAM|c%T-pl@@Jr8g&W{G+YGm<`e zxGz87>#&JukJl;Q?-(ms7|m)N1!>@Cg;>Gnfv>Bp58kq4PECnsievEMpNrY&qQCO4 z7MX$NJ{j04YzIR-h{}yvvG`!rp`ZGTRP{&L?%2w^fAno&r15R2?Zf^fFwR~43y|6p z%&Nelk06I2BlVjd<#<(3Wc9j}nfIdD6V1{S+*y?*~RLshN&@=DH4`2wQ$skt4#I(LOczOb!9*0y8(TH;vjC({3z7&l8zNSZeDz zj?9Y76J6?#v$yORSeV{H_`ewctMPvY{@3IG zhxoq*{}uih?29=8|Ht9~75HC<|FiHvivM@w|6}-nKmI%Np^g0+*k6a*dk4Mp1ou%V z3lwv|n-#SR;~L?}@_hBlKuSv9*3Da~_#|Bvemd58e|}G(p4*GILK%uijEq4H8V`R9 z_U6UR1Y(jGCLw&~_|kEgjw>DKOm14qO2w;~4Z4@8F_n9lOK8RgNdGGyAY7 zqDTYKBMXi|c+%Cszk==3@}t|Ep849Wr$GH|u$*^6W#?<}WDSZp5Z$bM@H!bB2xNs5+uQsdo-OaXzHz{o9gRaVFY#e7 zEUb7g;>k}ShU(O*z@FkZ+<;x)(ysW6P26F98@nU-!~yDuePulhiR%s%yE?+f1&mdN z{{aYD3bnB$f&m)&qXqS>rJ$ZyVPHXrOL2Okv5{%nfimnL2GwMUNnrNG&_)Y31e{|< z*;?gdA!%iF1Rf{^fTrk(JeCXATL+b+uw?7FdEjfYSD$CceD`tAyyf4$yH{P2%Cqgs z2PUy{{?Zp#E-$F3OWMoWj;jqXqu7PNXrVe6=e1xEl`9QU*Rtq{?1_C?+r4jX+)=3R zg4Yi_^NRR<;|8g=Xx*$vKP!1Gu{sJH`YSIFkoZ)~OR0)8B1LlkgaKHo$ z0DnZp>eN3!rutJ>Xrm*DE>u4@8#Ly}!}AMEN}&a+{oxsbrqYMEc-csGy;P2tqqTJL zL}WB?4iM}J$II}t#GG0_eyH)dRq(i#)!vDP`tjjgXAGc?18o@SfPp(pF?BGmyR8jgms@N8a{@#WV> z?>`Yd0U<%j6{+HfY-`sS#p3)>hrE!M+hvUrmBZae!oI^T&Ge zmw1JRnPxO)2}546O3}ZT>WnucW3>D<0m9!xwHa%C@}y{-arreYvB#4ROH{HEBh{t2 zKtfhe{EWp3Kvmb0%j;s2g*+k+?kIqw5^g*R`5O0R5&14ubGvIh8l=Rq{-hq9MGf@jd-1;b8Bk~KLVxarbn9Z{{TN66d+DK4<=~tC1|n%eRYOjBV%y_Qo}w;i>3(d zX!*q+H05}|2AHpY0W>wws#!cODtxTx$r*8CSR z#ZbN3d!*`{YlH!2Jrf6sz{kBd_cRirffC_^FO5XV1AKHPDu6`b2hYOGj076x zM>_E!EATHf$0QUj58~Uhf_x-XjcO9Ki^KQPIwP7b`r1ms&@CJU2;LW@jK0>y^VhSiZ;VRG$x8UpWktl|#>@mBSfuy>4se zu*Vth%Heq&8Zn)2Ru1P6Z)xQ)24cWjIUI}+t{mpwe8||q?f8Em{y&2MPvQSk{C^q$ zU&sIT`2P<6v&S>*Z_FalJoI|k&oWZptoNazCNKEOZ}EaJ)!S1)*)cJTp%>1RP53BY zU+e|uR5yO!0P}~qd@y-*jyPdMmn?3M?ybef+6jt)84l6ExXF%`+bog-!)A>e9!8ZitnJqfbYN*eCHs>!S_Vu zvG|TaxK(`H8qb`1npIXWNDj~qPsKu`mt_?TLOyiXHS=MV4Emd|z7gKRDC~u@yqhCs zw5%}n#CTuij(6N=oQn?8;)fQxrKbT-%K}#JGX`sve~G+khf=s%jHgZxL38j zU2C1Zxr<*u&<==3|3)R@WsAS-6 z0B+K_XGnxXJhNt49{ifv&9kHNK(5Ij4 zz~TJ@fz=AuxT#Q;n^rf-VxL=c&FW_MApXwkZa9btqdl`iDI6s2S?jc?FWUnzHHTp+ zKg|1$<2rF2%C{WNliv;S>Vh7wg~YGFM3o_3rQ-wmEV9{gSBnC zk2En=tlT5jmkX#JtV2v(j<2HWxR1CGfe@8=oZ?o!TkU8G@i^;JwTMYp75ZwH`k{+v zDSL%v2K?lC0OBVM6it8h?(NuS28VBlH>ZA$VIMIhAmtroLpX6*0xM80obs3%=J2LC znsEAB;0F!~VyDGggeLt0{rA(JPX8H}Im_T{eK<>ztqE<+MlZ}pc5u)DzpbXVw$O%=)e zZznI`Kaji}e8}4adD$O)UjCOhjoL5Lo;c7*8DnePU$;o>DMDY)7aCs4iF?1&5Up&Xy#qkg_yrK_AFltFvr?)ys8q8$oGGXkiUzG1 z&FWR`MoC0sLR=;o4PghP>r{yY0ez(lY;+0?)~0M-V5Tncuhn3tIu&@$*6ftKNM|^1 zjX54+I(TtM-QZ9F^o9Pr&nm}W5B+x<d2gjLzT++i-r8!{q$3e+%cYX^rE<@Y{)HC^5@4?kw4g!<&<7PDbkF4t zxCODIU!8E_LpW~@Fmg`DSJQ7$Q!HHJ)Kt-LH45hyssYzZHSzFWOmo@?1RkBIQ_AV5 zg+%ZJ$4L2fe8%GZjfzVe21ln@@j8IR6eKZfuQ!;5;z3+w7|8mu>)(Z4Krp7Ok$n|B9m` zs=qLJ1>0nxioiDO-&Wse_hr`l1?Inz?)*2WX@jl})<9Vuw7LJj6@Fp`4Lf?AuN9pO zfB4E8%_-i3J9?a@6NVuHp1hG6^?}mgViSY=&bXTg8#GYEV#9(%hG&=V6PXbTltN2k zEY6V@he~tgL%p>I7sG_>69?+g>__?N5pt>Lk-(ji-00qkCyZ?-wpB11r7N!c{ws)l z4yj(pV@O?q&(sZ!&1f}-)Sr>aA!XOA`6$s~#?b(T$DU<2`i+*R^@kgGBmE8l21bh@ z{hA#5Wg)@R4;Rx5{eCSp5K0B7U=v@68Ny`$*B4l_MUY_0_Dou`-M-zD zZPW=M+adUDk!<6UsL5vhBSxc$rCSNYmTn?%TIXk8BkAX7y4GlgjMkN(qoLkhtyWOEgqal`L$M~Ge` zb7~;#R2;7Cp)oY8Yq)V(r)Kf$uU6mo z5uD9@aj?bNG+q8=fWNgbW}#9Y#^Ruu`=nUwubj@AI~Qgwh@yBlt~8?@=y?))s^~kX zrwj&vMGUz(6qpB&3-m!QYy0VsaI&qD2nv2}thdd2^k9GlPTp=h%2a5rc^Sgvtc7Ft z*&|g~=#nsH#AMZ{&bc#XmR$L*Zj!BG*YKU01g*XJa!P;ljua#hcfn@T-vzmL>Y%-F#2F`GTse zr2fjL!mtnrHs5_m91b?IKr5&=NK`iy)h&vvw?gVoiQH!T4Eb`^GKtz`qD;QWByzQh zgrAdU8pEaAwpuRL{D=Ab@m-jIoE2+O<@|>$)}}J<7GPD66{}qT@mCn`^$GYTV$qn3 zX%*@?uHd-}sIav^2g2H!44ld1J5B0gM9JRzL;scg7oWBlm^G+HvQ zH%U6PLN`OQ(Wy~&8 zQxT@v#{(!Zuj{z6CJyT48QGNjI$FVe#H?<#dEYI89Ra;B4GG+Y>8P|fW+t4EHE>|( zYG4F=8(z6P601bs5M8j&>d&RKJ%?R0)Yp9biZMbVqO|lmYH+9Zx}~Cq;jLS*oV&nV zuh74Z{S)vj&ZA!bS_9=rRIKavOwWNl?}~?E`h)J#Tz#k~8t1l2ODB2WZ_+Go224i% z&n;eU)wwcBX2<=|GMw*PhIi6#hWB~G*V+v6gS0+GeMO%0_S=KWusES)L_fe=^Jxma zqFsR3g8cgFGu>RP&1Z<8BfltL&VbiNl6-m01&j7#J_)XN_Cw}0WkV9{)i;mNEFA_G zv8(UY?T~_|TG73b$?k=4qNs^J!iDq1Kq2+u%VFk>mTyG_HO1p$pEt9NKEBC8O$Db( z{e)p==9wUPo_j^=UTg~3!erVe^?1SoP??8pVvuCO&N8TS&|jt1$+HaSN{EU_8#P^X z&3@1jZ~NQnZ|a%){tCqv2PA+A4ldwV-(hR!&zM|jt75Qh`Y#I9ULi041*PP!z+{|_ z)94m(utyOU?I%-yXtzC*ikwuY`J=>3pC)v*<`4E!2KR~eK{gM6a5o9|_9D~K?6^3V z?`rRxEM>s1!Vc$bU<_-~H^hrYozOfT{WsE$hnD=8G&iF{baWMlDcS*xxtCt6oE8iK zu$22yWtxf=^&L{&T#D@+h|6+#2nz>%RFP48;*h<&+OXMrL|gGF913qWm_g88%~SIIb_f zX7SUp5;vEZ%N6GOUQlNovpvF!!kLweK!s@KLi{Gqg+*2?#Id+S1e9w^J=n;a)Qy`6 zl)FH9_Y}X;a*_`~$wRTY2HGJifmkKeG|-q_L>euxW63ywL6o36bQV4m}0;p zC?h7)(4n+@Tiu1Q_fAupf7=|NVCA9t91I*Y z@5-+cSW>>N^(F4V;#~(x`oQgILyCaS6drBAN$`g43Or82N$|eapPy!s75cSY9*lefsuKZZN_O!zv+eS~NGiW# zy_ZZY$PVsE)dk`nz;zzK-Eoetq}}HS zocgfomsDS-FVXCQs#9Nr@gZpr6|DP6DB&O}^k`%JqoeU!hR;@2sln{zer+4|k^bD` z?KiB2^>zm3gR*?CwGS*dJ1?Rm6hdP#88*KgoNxvBJ-+2!r#n4;`X` zUeN#dTI13G-Q71i4&dE=Gy1>p1_azU08$p4RuLvS~c3-y4HVoJ&F@ zOHSN$L*T)oJa$vPM`1|-UpPsi597ZDS8(HN9j6^j-!5XOG<^Wzk2ute;kgzEXP_St zusRWkN{|Ub?A6gKrQYMQ2cI^mFXQ<5gRgM*#(3&Kf)A_Twj~ciS>Aa(6CPaTKw}ty z=SedjO4u_tJSa!6&jmy;jZd{T7{$}8f3_}<*muQ^JWAQzaabQ1AvzAv#l}MfuKhDF zBo1N#ft3KrbjP;2L14`~Gzmoy@D`1o5$ab55YaQ>S|n_U)76Ev#MBP$W7r1Ai5c<= zyqgG%?hBdtR{+?YX*3kgD(e)f+mXm47IOj7xM2?M)z9y4+1G)d>H1~PG-|yDes{vp z2YmdE73KF^6?@4`_!aM4+)45b<-x{JJ@nQ@TkZu~W`PR4*7Xx?6bG?Ud?e8`owSwR zlqY=B50FGPwaW>N7iT$vU;w?PUofZ`zPF&j+AwIhyeI8)B%Nlc4BOWU?ZfHseMq`S zcxUSSY_gB3#_J{A1`LIxJe1{VwMh#1WpEqvWu_!CSjb(gm<5@1;IlVM0^df2qNg!PX1C7p&Gi6*v7rYSyzL437^7XLW-d$FW{yhL<+4b$~<` zA!JdtUjNR~%(e=>a@p4nd11;tH*1btU2xy(eZ{ zpPUaM&GZ{19DqF$Eem~`bFdkF4$#BMTa=}-Uj$s#3vVZ5zo&z}@hw_{eAb7i2H{Jt zD;;kS5efd)x<69=<$$EDU_(W!N4*)(@SyYQ()R)Zx1R-GlZJ=!lVZPdG@u`%1=u&( zs{V#+DQ;3w;z5~UJiGyo->O~)Odn-7M8j(}c591NF;YF0sUHi< zJP3@%vnW>Z11=Lg1bEJ=A!_L1jY!iyY-qF&C15R+yLS}AmPT#R2ZDut1NwZk#-)#M zC3n59%519$yteh1$_5+>hf_hg39@&_8TgA@Tq#@ORMwFk0xUup7C0+vGO8XZPyRXy z9!2hSad_h4WO;qEg`~yw2Om*Pi-PBb*)tHjOEJ1bmQF8n%Qk_pS$O9vfqyzUAbV+;!tqT`q`+XY=DuN;vh8|JKGpY z#&5DLdth~96lE6f7r~_v;fBPo6Q>bg8Lys?OzRV%AQr{A5N?#c%6dCr{fhb^Jftvx z2HayfL1qCK<+U1tTD1h5{CkYkZL1s!X4-uEYAsUC*qnx3R{qXKxOCj*)*P+*r4@N2 z=kqjv*?jZrG9qv|9Q1XM$Pyd<$m0in%+4!!PV=W9V;j8i#4m@CKMD0Ee4% z7W3>ZST*ueRul|t=E0`JW`hQ0T^jqLp2nZ!2P}Cc<7AplQ*3!d=Z@SHZvY5e_zUE3 zY{U->2Zpv*xLZo$r&)NREgb06O3giz3TG#-O_WKUfdE#dKq)Q4y;6z|O`M$iZY=~+ zrx`R!rP4|_G&>PY?2&jA?1lk|wLycJK+rp6ET6n>eZM^(R>H#L&}erChQ_5Jdb!Tg zoP6Tt;N&A;cQ~0qA-`@wjOGC0<C|&P_`oy;|bwobr3cYe(x}O@^Sg;X2^So6PtJOd`~5fV-S<9%f)L4}^b% zWu9CBY1~U7)f>)3a++eod6*Bph2P3T;WzMu`NMEtONGICNrmrb;oEKD06DLv!r;85 z!WXdcD5o&_FMVOT<;`g=A0BKxNQ%{&*4DM$+B$#Xji6{_gOIh(w6>+fXl+vA$65Gc zTR6bhwp19c^%c%eT$PxFtLlzKX|ywaF}aV;v@<(#Qep@$JTooCMQtth=Q4k>JrWd# zMZ$zl{p6CVW_1tlyN#9A58N?u4Ul-cmpZ>!m%v_|_u9_yWls-QBg{9Y-GJz{BoT@e z&{~9Y6kq_Iu)+=?XMDIj>>&&#-;GX~@9f;8YQr3Zfyj(?T|{VKX9tVSgt#oWS+Q$f z-Q@hl2h1`eJ7@9U(c)D&TNi1VHE_)p1?xJiI}b!7!fG%0k>aFXaT88(qx|1-bt~pF zIl8zG`45|o3d`bX84s=TpbBomGztx|Mtdf{meQU!^kJgJBfuTc=mYe4B_LD}kE-|h zXuZm_u2Y=ALo;v{1ImT^$uts`qQDrELMtY);+a)rAK>MiwCd^vLy?h?M_8}F>0Pfc z1I_g6bugvV)hKPXQ)hLPe4q4b$jNGW6mDs~*phgeG|anv1i0kHPqB{gIzsMK$|}-^ zU0fzzh%~kR8`|nh=7>^UQ`W;T1nAJP3 znPX&%z&QRy}gIteH%N4y20-h%`sn`8V#JxVJ2}KEgjl^|Sl=N|3 zq~s%?wqfswQvksd%c?3;7zZHOTSco9xX9VvjcB3Lp?5PndI zQN53A<(|#fe7@BohTJk3l?J1Is0y3F()uTMp!@3779O#wQ}^Kuv|uIb9Gon1EEyW! zcgPf0wL|+N9sV*k*brX@$2Aq}P^f0>JM(1D%bD9%w+6RnizbXClGz;#YItJu4A{bI z0@F>0@=l(T3gvcazT2VP>Q+a%ZSZ#}CY3_WKj+!j`3u`HF+=t^8_u{Y`TvyOc)kpH|Rq_GYg>9 znLq5HA+KkG{qF3iAVlpna7?vU21Z|vX}-@ZR0h%+ita|roSHgN6awJ_e2A{g_FsyE zt58=q!W9VDnDBIjFDbk1vhh>&1$ft7J>k-^I>K2CIP$Sgd4fZLv90K8xZXp#bhje( zEwFVp*2H`;Wr(P`T9}9sqWFo92!RN_69*ye5CI_}0^+chlx1l#YBFe%2bkuVlUZ0_ zf*3YiztuMynXHYb1mRt2ALMcvIu_P{Jp0d9svegoXtQN&VF=6Tig!AfWwca}=xYQa zH+N;ldii$xT=3ve?jL~r`7bBq{wQLo)CK8V73hgf7WaIFe_u9b%J{2F$4V(n> zS6}7rAg}&!PfVT&7*>K}{*w1rJ41d@Pv<04Avc{v6$|39#VoA7^;+X-L@&x}r2dAM zPFj6?xhI+;cAaC~dU znS5>k3H?^0$$AD#XP*}OQ7<_`&4aVovm#Jm?s6^Y=Oj(#PO06$nvC6pd=1X^wue}Jt=!Kg|xy^MweDX zpH+y_{6YVobpCk-A#lYE*j(M+nC|F~My_tbDzaaDI(e09`Lw9OdO296CZjZjt|=GN7XKIC*tR3l&9(U7hx)Xvoqi2uZBvyaYmL5q!i#qJ z5wp3-WM%Cq1Rum!JUEXlmA93u^uajr42*^hVQg^)B*&Q$9wT<`m+&4%s&V zJB~Mnu%)ZCpVFdbd8-G>kb=;RunuCp;7SS(9h~d<;CVx5&b1;3P7#xcQDE!^CW{#VcHUT`@e zBY0}TpLj_qY}rR1!dua=1tHN@GA^q@J5amSzyv(3rw(~5)n6uFmFzC#@RnyaRV!Bw z0wy$rpz4o$Bh5RmHLAC)Bo>M4U6{O;*E)Sl-Ai@`wBS>ZvMkiG zG<&EwpjVtd)RXbyjzy<`bHTBiA2$O~x)W>Busa?*O&@6Y))aJh_EVAZ-vm-v$*t=L zJzrmL#4)x13XG}W)rOxXQ80_ny5?{UI=p>4tLtpU#0s9RIIU}StoT{6kUa~sC>)lL&K7lD$N`@Y8hAUQgbSgvn z+$qrT&=0)?6S)wGb)dbG>Q0RdkR#F87)Cn+a?axHF6d8#wt*y>vlG`Rel9szH=u%? z#d%qgk7v0N6?wSL3P3w1MjD9A8`x}bMjc~wc1ZL!5U;3X)BSZDk_k-iJ0|yl$RF3E zF6BN8M@G2(-eo$B6?!k(@VmH&j8p^A9S}?Dc>b_j@cb3E;YFYncpf?<^~YJ)9PQ`) zMd18pvEoI-`4H4l>O)U=R;PFE0`p`rS{zEe?2Liryo)dfmdO}+99yAg%Abibun$-I0k}t49rD|Wf%ig`sN{=JO>@};d3?+G0K3`7an;H8o^#@DAh|H6e6V{bA)n(Rag056`8RrkW;=;XumE{ z1`Sz>LVg$mvk^PB8{RZSwSmUZ@teSv$Tgy=zsj#enL7Xtote0%X#A7S#PvkuWPTOR znX%4-TsIrhlADsG@dTTj`g!9%`~t{z4oE8Jji2C0>ZO9vxQt(Y=FC_%8v%i|C!_z! z=skf2dna)Pja&Z#jm$$!XUUXwoNEn|0|N)bT{~J{jcoR*L6X%@Npgroy@OMLn1cvQ z&X<@u$Q(I1Vk0^&yb40tD<1a5g#?gANN{79ugBm=Eabwv<;o{bI@|0>@W`PnR`20S z@Kw;sN$^&Ho5*wpDyaep8I2DTJQYyTIR!lMMNFCm7ruyC4F*a}4c`616g&$MIu_Sd zoB=8@Hr=dx*grX_PD9^fP^o8JE^lkR1l^-wGR;W-w)H`Md1JE{XkITcDc{EW3`*X3 z@G;cH+Q0^CGomkw)sadh4B(L&xq+Fm-{eMR8HD%c5FO`Yj}{(@iw@U|v0SjCfEt=- zLNe(Q1(4!{r?q?uSsP7;_!SS3Yv5}GKm2d;J1Gr*&>!b}<&jIxd=S95+BFi%|6UZ% z672!$VTV|_sWxz0BdLr#JmA&`FNdaAVaSs|d-9KQ@U7Jp#PMxD4AoP8^&^xxOcm^i zP||aOeL!<;Jjk`J(V|`g1aa&MfXipdDw3?$fA$WdNA#aXx^H|gqv#*Bzit=XfA>+J zI3kAaFWIT~LzQcH``c{wnK%@$XS|HZ8^+5kM;d(Tg=->HA-|Fy( zze}4Pu!3&}@MK&AUaus03wILUAoNQL@zBGXpF7rj)`OVL&FY307VmSKExrGy2QXL* z@|`2hya!i^AlBefx#>Sv*$2>~`oOb!oaV6DR%~PHyKi#!3pKG0VupHUA!lW=@Zh8> z{{k}aamSC(eseuQxjI#*^dH?Sy-wX#dU3#8dI9}Sy>=7b z;(u#{ZYv=)tPDWKRoN}lZ8$)=bQ58q`DIR9_q%c46gdF?9gPaSGN9>6KUC=tcLr(6 zUWzM-gLDF8I+@ICk<_ORG;@2W`u51L9v};p;z&bQDW~m1^~|FpArSUrf0V}FQ%ffN z1Tu6=hCebb{5PHu>a-vJH}Kc?;lJgPbogJjv+&5ynv_Rj# zqHlubU53nBi>$)7W^TJySIbFA__g)=s9*`0i_s{tiAzn2IUfUBThm5Es4u+?!#l;g?OD;{yk4!mA;TE~_O!^fyui#3iBi4{E_?r5AzMr8 z@DuAXic7wivPPE7#wVW#FX0ldFFeBagK{x>Rt_&0>e)mf$}>@NJiZqvmpIeZ+dOet zr{2IHECj_5;KsGCF|v|bBl?wa24Repn!51}1~>Gv379vlL*nv*Ybq)`BST65&){Pr z=v8+tbkLj6x}xyRHt5MicTqvX&KA0=6&<1yFz6kp@gijP8S1nWUg%^_(i1QECrB07 z;D`eE=d91fK1AtapcLyWI4#dEa&W36PV}xfI8|PZh-jrD8O;DOT}>TcUi6UcAsiqC ztq5A3=fO$ScYQWb?lb%Mak&&geT?$~q}7Pre%!2uTL=9gjMDF)+x3CS)fi%PY8L1< zc7s z^;w)+;ogkMbX-n+an`b2q`}Kjio9c+Wc|`JJ{5&W)rto0p z8xD?{^5Afd;}DIbu;Q1f-{RO3E8YNZH>_An1EGk%20>5c-~VCnZQ!h$*7)%=HR+U- zIWaNlG6+$KLT+3YhtMz+5f{}}?kOZSqv&-^hdCXGyv$Xu2<7G8uGelFuTzEwaR(s` zO*OH`3utiAVI&wAe0v!1oqv({q#*6!i9 ze~6-Pqdq=@{sBDvJN{@hc!7amGPV4ib{;Sfqa*rwnZ3^*GSqM>9vo^Y?cJ>(?loQbo8s08RjAJySuw!MD6~2Y@lB6IRyX(lTGkC z4-4*-m+63$V)+s2BKyW_>^R_ImzwYN-Ov1WuqYLHm@oLqbw2*Tmncvu4}W&}Cx(5` zw%QvhMd^sPv^Qu^(M zDP}I4Y=$-Rz17A3lPtIlujTPGFBc&yFNpn)b0+8~iszQs&e->#;Xv#>F}a_NMUkPw znUo)EAhg>8;~zim8I$KqWa4}a`WEDGlrK60Cr!xRf1rSumrf{S1ytkydG|3p^xjpg zeePEL|A7OnD3<1bfd6ZM^Txl``EyJ_cZ5Xqon7^jjG*v15f{5v{j>ycJty8WZMXF(O@(Wa+c_1^YJD$ z28g0k##HU=QP$?}k_2X@ZjUL7l>I3_VdWC6#M{BirvVpHj=dQ8OZ9i-`sLX^{wS{B z!fFqS_vU>)0jZ^Uk=Hw#o9#sL`+E~ml=f_vY0p%A1ESMkCVOTCIOz2UkMo<*X2gS2 zs}XdM;0D?oB8GocgZ{c|I{44eC*V1k97no`;=~vD43*mT5UL1++$H_iz2AiFb7zq| z$*%4ybnfB#JSZ5){znhxPU2V(cGap8nB7|Fzys7pSBMh)ff3}1qjO+Gl@U~czAooj z^+_^pGf0XSs=^J&ksw@38P}EP^P69g7ThcOVHPa%=%o7K!qsR2lU<9t_ zhIp9zTdpVnpo-S1v18QBklu0+8B(=GAHoB<29C8)Wk1mWd|=9}BmIx*@3BWE{k<`6 ze~){HsbyB@Q$k%(lux|WosV+gt?>nSK7T-mqdTAX!DZd~c=&r<#TB%%!k%?fBMq|M zr;PT`-J6(6T=!$64qEL#b#hlvkhd4mjFmTQkG$LHqrSOIvevpkVNE6uG!hrWR!gtB z9+s*!gwUA;ubE=3)<>$by9+9UX*Wt?S42jfg5uXlcA=mT+7stgu2}XZS!T@2HIVJY z?t?fL!10&(jhE2NQSk^p;Itqt-IEc=K~K=Mdb~pbZ6gdC4hc~P?F8VB?jE0tUZG## zJio*Mn{XJD&ioN~OygtiSSYJ}EhDXJ9z~?por@fiRzW~Sq!p;g;_!#~CY{km=*xZe z$WLexJxxeYE|_u+#Yjkdap)$)|DnELa*kSM>3Jxfz&ZE)F|{S+qwq>=64V%PTqckyWp`_oj)GCJ-!vVCgoQyZ5 z*#!^op#_VUI#2RsKTCFy`~xkK+FJF11wRl9xw&aD|c z$7IL+I!^gk-jwQKj|V`fbD1(db`TT$k7d9b8k-m&%Uc2y#~&&9Yst>X{0626Hh?>6 zzw>;|@o^6sF@CN1S8xYHUqZ!coj33;1`Ff?sCW+a*2sP7Gc;`*+o!HH3yj1(fN@pt!GlIC#i234tJi6F)LLr`n3|K1eqH!E(6*^Ex5 zKH@9IYoJ1hE~MIiz^@WAK?LVz7rrK5;|#nAHvN|het>_XmPbts@O|xsPk2-OMH2eq ze_UnSe_LDmblibJ&1L@+;?HiyiQL+5Q~cFzrh<0nAhHZsTOhJb-WyE&1?Uy*4ac1Q zwuuXZyI^lZ;FubA`4?*K*8SC^9mMx)zcXHJnG@fWlj586X$ts`iMsLK)bFtZ%{1#Bn5n*D0btU^{L?xv_l_mlx%|LKN5w-O7BhW^4ct?fV{+etY);x#*7DG`%9; z<$1pAebiG}I!GRsAIIr0SWF^T_aXBTHzN|kD;o6C?j=Z+{QJPD=3dthr(5IFackUQ z;Fuep4V`#+COL+*dNmkNlQ9r%LLu?V^W+%TPW^6cD)f0aE`Bik)PM_Ss_ldOQNX(#4bX)5a*-29Dc^lQ>wvw}9Ug>B-o5JC ze)>pW^ey{4kq;B0jTqttM_27~>0@EJ>g^72U?}msvZMG>2Z!o;%}e&Yuj51oZc*|v zAAHB7#6Ddh{L@7DtIw07d(ABlhDvbyuI$wfFDXy2PcE&V|<%R(Mh-A4^K+kf5O6iLd{t2G&pPJK7{`7Lk?|yKT7k|!gFZ|JN_|rV$e+R8~P79@||8KbA@9hcy z4lnrdCx@8!rd|FdpU5$orl0(|rL?V)w!+a|TzV|CJD;0EyKC`cXga3a0%>}xZ5Q-h z?nET7CA^Xb7Cr9e=|#j?vKNW4RCZzRLhy9*&GFKa%voi7Kxt1|##cdjXeHR|F*Wx% zkg&X-$#}43kP82qXu0^qYh78|{2vTZrg_V7fMyHYA^5MM5t#6w#52< z<3H8~|AHj&?H+dkgy`7eCeOE(+W=#{1CTq^v#CR+%-o@#0=SjN|>>f zN4iu(r&Z4AFn=^JfMr3=d!EIm`!eiV+=uP#orn4N0bp8gq;kwNLK=gFS(M8TjBT4d zT>Lr?uuORz?1W7MNd>+<-=?4k@Qn=%#_}@hpdzac$<@?A+Kb%E)?v$fQ*2av?D*KO zSRfcXi;k(;C05J?RYt%@VY!;5y`4T75df*+!^@hOY>MS(f#1XBK{#gskV)%67hu-D z)aZ4=m&Z+Qo8g52A)Zad+X$ay18{nrg@2I?{`3~$w_U%7I`sPlVjj(jG`Z$Pe!o$P zNvUVQVZj3-?j!3CPgY`sEFm+Rdi*?nFa+Cv{z(2`1$d@>FH8y_{m0#A|IwcHPBQS) z`BrN?h`8a+0DS!9BAQy5%|l~c9ick~o)?&n4HqilCeCY~yiTNDdA`S*uMedPVsZ`X zDD(>$CG+W%Utkl4cF_4UY}(<3z>17nTN zy^1jvf_abu1td*@Bi-`?SefbMz1aCj`B4eb&9+}cro_J(QoZ)+HA|zuL=-pViY- z;paEVW%2W0RK#orsoJ-6aRNr5ro#Wl4T@V7!=o{qF~U3t*(TGbqk%fkSzi zhY2xZ-(Rl}*Q1r~(G=R{Bfl_qgCB9M!vY7cBk|whj}D_vs0mKxp=PDiGp*vv`x_mI z!X&e-lvZ6-+2%<@&U5%8;~m&r{5@tYFYgy!DahS2^FL93v4>X_EZ%{8GWug$D8<{`2)gleD$d+q$Yv615 za3@DSE0*dO*5R{Dd8PhBziu)0Ybd%H*;}oGluC1Mr@rc_W3cIvng6oMchnvhCn)^pIxIl*A-EwhqW1x z`%xZ;>_>(^S8-7#uNj zl3_7;K8Gi3xI9L=ijp@3a%Fa1e5R~fbS8-?nb@hL^nv8Eb-9O;y>bu}Q zb@eaPmw7m@8sE(hfBQu6+a5~yK&OwB)8I7J-Qqo}u0esq@?2@$9;edM)#vuun*W;E z{|nXs6Cm#W)#+ud?bO55+@{jHyD4y#fBZ0H%@bc^dk~_f7Y2(<_QQ*e)e-swHIWBhVhLSb zgiR9KP$vcf?E;GEq&8n=$sB*NlpQUMtLRGmK5{a}^{>`I-GaH|{PDc{gp(=lhKJ)hE5x@$ z>IfPr_SO06#V-HPC=%e0xi2>=9}@@a(!~lD;xy}3H*P{WN4JXJ|4h5ZD#Y!7s&2+c z2x?c)DJ1FZ*VoqpC|wMfDfYaWZvP`_tHkxPc8WTn+E7zYbOjO&ew=)cR`5oYOfe4m>K0pgtr8aiFBvZ1`$L4wj{}#y z@9+2+Ukb~|No%kK57Z$|$Av-F$p+!@O}ewFERBt5ut=nx5~`ftolZ;4i2R1{l1peMIeu~X zF#;{0MoG;D*Gz^C1lkuVAb-7R{B~&NOgzR)=r>wI*nn45O)NqWxs!eI_)R)X4OXA*j=9{ckL(%k5HKCgZ`jps?4Ff1WA-BU(5Fk7E!u0ONp*mvyO>fkYB2cpGkE*>^ zf^|bel^F}@E(oMEUiD|ZI=XJi+XcApQeAgddx!jn{?~d(cOvCf=A${^8V#)}nzN=kV?kGZiiOqy5!ndhM^htMSu|&*Y6NS{ zMsUHEq?8^w5*uR?3&*g=ajrz}Z24yqj@Pwtq?RSFI|VovG22%5V>H&7jbQT?R()J+ zl&b&;R!F|9iW>p72DF->*h^OQ2`U0lvd#Lq5&Slo8o^47+%FGeUeuCr=B22=Urvhp z49G+8xE2q#qT2oi^mV?iuX%;_wmY8%_LrLOd}4<`u>k?1;q!35Yq;Y58Cptt;&oJ7 zR323Qk-Rokom;&aAJM6r{?KpvajIsQX4dh8k37fit&rR zuLbb<wGQm3Zj&za4B%sOc)b9eL#Ay8vcL4jR zGe+`jc<8{H4vhYJnG>VGDS*8#aqAQ!}@H+4e*Emstk z(^&x4((>`nnxsOu%wI)+|8Ol-C_LgL(l>vu_$$;O90-47zYXMyJo%PK9hkuhcE((P zFxtsv|5KMbhy@C%(|ZCWXwXZ-2!LLoGni?W*SM%<^pLKoW%ww*Fz44|Qhuqot3HR` zJ~2jb^MhBS?hbev9}vUC%Rv=Lk3C~N-=J&4$BtjG`;-{RLC=4~`w>n1Kf2FH0gsebelgKA|QUHXuWpA@gSq7J)0k2{4_Lf$5?1V2)Owa`wD zpCDYd!PN4{a9n^tieu2}1_+X!wa*ykVc%Nf)_)D&b zxcvkS+|nb|UGgdTB3HaLN)A0DH1?123_xByr%Jpo19T}X5Bta+#p_ein?MKwF$|zM z@%GDb-_`vcS#Wge?0lS~H<89!eA;|P1I2hfL(>^+yX0Aet!mUK{#9g6XOyhMi)aZE zg}BvDF+NFy_m2_^aO;C(rjR=8+a*C|9P{?I)BSBQ1u%^j2s^sFG1H#3n6Z z>=$dwwgMhyE20BuC_$mqL|zY2Z8hFSo6&gdE=uflatzpu)~3;g*K~kA-b}IH)ZR~p)$7EJ)9j2lw3sp9&N!mQjECA8 z4{kBzk#@!%U|n(?ZLDkGMMhkZ(HnssdlTnY`wM@WPw(PO83em7!as=3LdNRK$Oric zAwONaHBaWx6X%*=Cuy;yOR?M|E673ttp5}L*Pu1f`ah-1sAc4!lAc(Pk`jS}Vhx}^ zuen$H8QSTnKoeaU$|??hf+Zo`j)lc2y6uuggVGCo7Q?;Adw5;-3qzk2hql$e&1x(a zByA2aC&68lvIJ-3x)Nz2T$ss#PMRBQez1D1ZzTQ|;NN=uYrwz#w~X}-$3I`%9(#1! z!{fis^e)}wL#wa4kdonSAOe~{=7O+J=2Vn6P;{b*!eYS%yjx@mr&X*68iilEFW4S&f> zV%EJ&ZL!S%rjI~bLl+vdh-ZxA1y|`Z`IjOE6P=K~(9BMKxvT<>7D{`qR2x*l^XGhr zAvV=LV9lIwJ74+n%JKLR&%_|xmEn~12Wm|Ho(Y}f)-xL&S?QIar-k{6^^s-Bg*-lS zL)ur(Uo53UKV}3&{;M;NjnKnGJIc?z`M~f+yKW{Mnk%wbbR$0*>DrO#Wa@4fgUy0m z23LG{slITg4}fwAP=x|AMg#eLxdo&v0Xea#-p{rEn9(!6kN9eD_Qhq$(Ej0Zy4Z5N zSS1<%Mn|#98R4=YFmsztcsBRiz`V@DD#U$YHvF3++`}^$caw~KlAite;0qLJo92AmyZji8nO0&2vbR9{JIk>!`Pe_+J+WMkdLh&6HDe5Ld3 zp+Ij*Db^r-JAWx!Hvr>FI8un^B-F{e>u(yxO5^~Fwf{tk+Q+1XcFa8rId^W76JAAS z0{{Rtj&3UYCM}9}Y}~x_Q3Gqr6VqVF(Jyf8QhnCJBb>s~{#^_81zB+9jR0s{m<7rduEErY^vv3xVdn zI-4QQSgj=31G-e}#}B?X&mO_`?6{HiVdo|y_3_y@&6WC$th&8Qu*;%F#xqZ=E z7JC@(?LMG5ies^Gh#DkEoIYA|ditTTo2)%S)*hHq2WuO-g^^`#!n9lCC=tQ@GiCr; znW#3j^bbNN9@-6JeAIkY{1x|flo~eERhDnxKP2Op4CpAT9{542Z_CeJcK#qOK|B!3 z{%)2J<6FJ{@*;G>cMa{W3B(HO7Y6n!4s_B>HtGgT{VjbDeUD`)+@Lxs)I^Y>nf)sG zxGAb@=YtZM?8^gpQUno!dOqoUm|BQ|7EgFtNtH+lbr z>3vvn$r&fD{VMB|$qQ*AjIy;y zp}$5c5*HU=c550HKgTL=iY>ADT;wAihGuc``F~qX#UGTDQ!WilEdHUD&(!+Fe5WIy zvv<(r=UYtwh303t^^^NrItohA;`o9h9FPYqZ4|gl&5u{VD+j(6jSvJGu@ozz^pMg1 zg6vp?=KQc&RDk>6$tG0h3A%p>olEU%G~mg;Ftui@2l(YavSww`(OBlB?By^aWuwG! z@Ej&28VXtkXo0gVPZXm7D;Pi=xGtK5j=T~~B(9P=(>P&*9wEF0RKgGN2%&;U2m#wu zuEaO-D+Mz%#xb6&j4~nC2!W{Q5dtM*(&K*u+X8draRMza$1W4gQ|8R_&^tGs=t!=+m#%9P&i2XhMG-qUC(Y)=7X=>~o$&<$rH^efh*(me%0 zc1RpR@#B#NNXAO&H_8(MRs$#Yas#JCjHwmtvBeJ!oIs0N*#BWQaLz0nI3>}*xr(l^ zA$mn!+x>%J4im*wrM9Di-WL>$G%|Ft$g z#GH60H`q)$jGzbxHKL#x%-Q|XfAJU=v+_-`Udyauth_NgU3`9*_O0vQK(jZ8LqUbE z_Fd^O<5Lc{a*ui{`m9pS5bGArQ)1TS&nzq%P!5s;Eg4W6No*OUl)LAawX_UB<5f`8 zG+=hOj8}8~MZcUfcL1V@{6+trn17`F6vFxjf9jXtOMW_r7A|zn8Vkb68w=DA`*qS5 zWB#KFnVH&M(1+4L;mK*g?9&Kke;&wFXFH?M77z6N7OLq7y)picMkt6?x5hXjs) zEKipzcXmJ=uZ%L5w|B5A3(#8)47q9akZDHHv59n=o)^e$#9$<4fW%JsnR@jdJjtohK{} zWW{qf!Ba$VO$E+w2gXvB>as{6Fh@&9Ar6;LbA}JeN*0saMReVe3A*GWDs4t_NM+@3 zpzDp39CV!pQVPonP0-cNq-zy&YnhZG?Uu>zpl?%yN#FiVUrvChME}re63Ap?Z5(_7 zk!#8n@%oqVWklXc{w-S<{$}w3|kzuci4|n1d!k=fB2r?Jr#bqk=xSLA%gz z%ARO3q4fUo3MFgm@L+|A^3RqbR}(BW#bB;PdXkR6Y_xQg7vomVH zFroH`@y2SWy^%-P-4|)9TeVO4Ct=e+X#{%Qn~=j`M&nq$pK)5gypjSX5H3_H4qCcZ z`yz2f8D*@_$wC*Ci7-OBY9!*wh_FfeNUHq%Vp>V3UW@xjN+`#fpluF7(RF7ZOb3xu z1`vy#u80gis==4Sa$g$vFpuMbC|7*XLQzPoxi>2BgY>kCR``+Z?>FHCQ|z8U1;53M z%WANzqzpYKLd&UJ&l0!ILfG!?^_c6#fAEi`TtLr34HT+gkBE{XT>>A^pnH>Wwo`pS z&O%eW@LW*-K9rX%$r3{-jcU?BECN_C+lPRfOkCvqI5Fsz?b~rJ2P$9)SS3g4OHqQ| zYC;?RY3Xs2S}jj2;5l(Vm_T-q5RSCMK$s%5mmDn$u<@Ni0XDSs`d2`tpqgy!GiI$F zIYKf=(VTi;K0$|C`&uY+d$Tl*90yMggMSsoH_6|?o}pmD zA>j!$NCg3ndqOSvGmkqd9|Ti39SwxG34|zn{!j|}r-cyg8weC_$)E{|tsIGhh0xm; z&;(f3!bJkp-o?11BY@A(ri+6kGzS}eSCuQ1M48Zu0k3%$#O!OKV|s9`Z$#MGXPJ@pR;xi zfMoTWjuO6$&(~L}=-i!umwre{{x-1=IGRCQZdC^C6fsBTeC$GFp(ODsrm0 zSXJ#XnU`Nf&rqmmlqoHGh3K7`aoY`DXu^OV5L(zbV;qGR*6%e=Zghc3QTM9-2N}ZY z6#dqVS-CE#ma%by^de$H3F564D;XMgec(0N0)vNWPi70nZW^o{j-8O;A%PYt zrU>=B?)n`LcGK^6pfBV)y4mlx>UVqE@7~kz5Ui-n(&-Ca_H_H*WBMJUA9cRF^*e-4 z>UVSb9ZR`(Kyl88dU1<|n3-1e-vP6aO?Y?myaNo~A!%ch;KTUHb(OmX0%%#7^C5!e zM+=@i6}6i>qvex?*H)9g%2=J5HcEVh`CLpGahH@4nSsw{7PXn`0TklbwvG*fti#!c zj`g#3Y!fNT@s}jgG1v=B$I=}-_9eC!LdOWSxckouI>uLul8)gHZ?57XSOi`l*0^=4 zC69ov7NnUoUUpo&6;cJQ0dj-!w^MHTRKi*rnPZfZLCf${wX-g^uyz_5@D5FnTSf&O zY@=oLr45l4q7Vq<&&~J)8hGaJJ>aL?iELC`{Q5YwovOmi&=hO`1fHx9m7@wm7TdQ> z8L*hn!2UlirhFV{XW1N()N_;=ggtsR?Uz%&c1wC^EJBpmy<9k_oGfj|t%qx&LV8_l z|ATkLAwJqBpI9-v3JTJ1^cwh8v>z;=`0&%+v|o)ZO)O5oQ8uU`2Ab}Rse|Bf!yxm4 ztw(OS@@ZJ`u)*AuZRVayKo1&C%*`dBCG;CDp*{mZ(UdLbW^3lsH}MW_AFL4N^3S_q z7M@n)35fC$I+O8AqosJ9t$DmT9_M;@Kozwdl)Vb-Jl`vV*LEWB5KX4sY%(i=m{zV% zbvF{<=%72TNec{OueFJ#nOSlCMM*RXR^B3Zs3w-Xt1qu)@=gXxAdgSfi;b~SSL6-V zsJ|vRu!{Xao~04B^Z9IL+wgk1w_T1PcVZQ^4*h(^;V6!N{&D{}-+tZ4`8wlYKm7Z? z+c@9*`1?8jUVwjB;ol7Wi{alx`1d^it;fG~bU?nnTKg}JGIY|pI;;QGbGm--{@VpF z_Mn$t{rKrdDg4(R|MuJ~uvd@0ILO&>P~h)i{PBtDpIEbRJezeY36u)_^iSoV*z=?I zBpi9ruVI1=U2(2x%2pxC_B1I*arMHt!Rj)xRTnSjp>5<+(H%EY407cT9#lm`)iKQJ zQHCpJ2EQn|lLjh|i9ESQqF#LS4%ADJQdS1x+EpBuI7+bwr+fC1!c$|DRVaYz8y*vu zAzd(K;`FP=Pn|eHd4wJD2bTd4Z-4OUZH7PC#&~dAzJN^F6(8BWS+YEGuo(r;duPBv zA>wb_4j;yV^r|}yGnnodg)@oifBso99Xq`PbRdDfQDzx8)|KpAcD8*>vS4BXf~P$L zzteE595V3GfD&q>%phsyX#is}4St8nZg9<5y%e#s=k7ROv${(jNMN z_VQ#0^op_CFybE8?11(s=$JpxSEOi!vdb zI%vB06vTL#9ZRfz@IYcEY!;(jm6GXlq?5(-C)piXu@ zDiG0sM6B0xV)eSt*i#es(U@&2ewusT&XLx1NX<-;L?tmRfHl5T=JJwXSvNUJfW2r_A*Wkl^EgJ6CTDI3Tfh6|-c?+6`+*L`C!POmTbdswm zkM=Fh_8o){F?Vawa!b!diKP9ZGHRhd>ye9=roM*(Ly+id^kW=MfHn1kL*9(gxopafq-0+_7<-fRQB6Llv5q@!~TfNwVus`Roh!+8BX zUQ6TKKMSoi)H|`27MAx0C&BGveAI1o5OQOAf!CCWB0Xi|U&rT9y3x5_PNteAK+y`N z7XeEp0ZajQ$CC=P6g1X`_fRya+Bf^~hs&thmEjP?T-ofh5JhD+yELFNune<%r-Z8K z9ue!o`PX*AiC;2*e^>tZ4+Pqw>LokpV4e%{;hc(mK+Sa{PeE)XhM#u}P487u@~NGh zF{M}$4ZTdO_!XR|0*N7^moti15fx;e_;8L2K5pZA2>$sZF(4XR9t$lW5^9=*IN{~K zIf!2EgE_*e|INq?-~fClzZeeS3;D73RzRUC&(Ov>2XoG9%K5s^nZ-Hjv2HA~Wjrls z9z)fgL(5MI)thDhqs!FnAn5d1*N>+cmt#J%_GAdkM&)ySO(RrZ;LP;MmP&Q3j~t-e zl;Lj5`QB9JdHwB{Jm($$@XIcF3b-exJddXeL)FAKNRx9L(%j|B-C5>V(j+qOnr}(2 z@#p`cA#f{mC8oPMya>x~&Wh^DA1y8t`j8o5z4 z)_sbknGFL*VPq3Ll`M3&X>>;4Q;r6tfF48l;u4nBvM4%)(n!Kv4lFF82cB-mb~<#; znF%=cqmWO9lf-BmodkRqysdtrMs`-NnM>;hjr}U};w3ad;xLc1vglwI0w3dF&iO1( zu#uO8i;|xV|<{L2{t@O`oIfO`=%Ki~8 zhm1i5Tw$54aD=LmbdcdCUq7sYeYCT*K*E2M;>0Nu{ib? z-V_Z!v>>Yxt1s|B3NqLY;mzB%yieP%b*akR3wgoOc?E$r^r!Y=6s*fPP|4?vzJena z&^ZSgA1}ej^}a(0ASa?1RElnS``eJ9>&optiN!Q%Hd$m8VqrFcX9?t#^==7O#`U7&7! z-5`UG!JNTYkWCqGJiz#J5LZZyqf#dA>8gxLd&557v~QyKpxx59r2fCXBncx}bZVh5 z{~)aMAsq`8iif)bji%;&m_6FJ1y!v37)j=`^6sY?HBoIk{ynS4m@lwa@7lgT{QF#M zeK-~x1S>TFbG-dAjoBCJK1gRH-5Y7=vT=NL3f(88q*2X%Ap5Uc09GM3EtQSSU^vQ_aX}?)L zA`RzP@^Ar53>YqCEVv51(D_HC71a)i<~$G!JrEliDHA!E2!>8&L=KXfa^vyaX%;va z{D*f=XwVewJkS`v_m`V}I3N$7N5v!0;7_hN_C=Z{!0bHDrphJ2Xq+aRIYN=AoJWNN zKh45OrYu+Z@Bss--0&`534S0iTuzBz8+m*iz;Xs2C*!)T%aKw11@Yw32+c{y_%|9M zc>pj@FQt??gtksrh{_{?-fl`wTv95uNftZ zME`oG8%l$&mpO3&-qaq4IWNt!1HjzQp;gh)DoZ@I0Vj)p=~IC1hO1b1My{{GO$Y** zq!T9fvMyTZARhBxZpmZ%3?BEzpIq@aEPgT`r^{*mQQ=d;dNwm@D>wmmzJn)V$lJf?N#>--;|wW#DDw&eBFu!Z&fpbO^xZe$ zRc9z8sjecwmM*U@nzPD>vk3&T3EtgD$QKPQiiH+|k-2!2Cl(z43sK1f?7@3&Cq3yL zS`-Z}SRa`QVUQx$WyCm5Y~=(gH78WV*edyJz2mm=wBsc=j|!l{^D7jgKF)wLA}w}r zoUCHB8gWwt#xy1$jD$764xtj&%bZ@PSeRO!|U1 zeHf4};AQB968l>vkOgPZBEDe(tI~qnU%_``;1T(7A`2GaQVBfVR=c@*NCTGk!?d-U z_OFMpg*wD~us*Ck1v9UzU5zBMbss|dzzvqy^KmdDB!tE;mr2N+@#HHdV%(U;3)s2{ zogmQSn$yt-hjxK6_{y2(egH~h@|COD36+yBUwU7d?wMef_mtar_)=KD2F!zt@GKrI zKQMrTWvHV+#FvHi_-TKgK6d=HY2$CQLM^oYF03y{Cbrn#^H&4({M9M#oWD~2bzA56 zTF5_?rjIOts7&KO6cn5BB4X*Q+a0cJd{4^hZe_&N_@!LilIUlo3Ir5fS|bOsuF;DjLbgucZ+55bZJU zq(Zdw#tG3Ll<`vbPy|vC@`mnC0$TRx#dS4JPWoNNrT^Zld=_FWBy0yt4l`DGw?FasK9a zL6!U%V)7#sHWRHAt)Ut=BBlG?Db6D(d|1_!k$cyXW&0kb!ptj_2|Q3$_SQN_D73<3c{aG!EK%gaF|I@99Ofs zxkz-%RgWKRYjW{cx}Qgb1=i)8-=aA=xGedx+~h}%#g8DcD7`6BKcXSS!{l=(u+iwh zU1UoQRjI?6Rr~_=wdLGDVE<@2E(pP4UofcDiG<2I461tpl&ZWRpWF;;0-doV6-0?# z#4zZxm6)O+t*^b@EX%VforY9oL_++UfS3^WazQ|KeBnW$GdzBC2>#I?5Dg!a>nq?0 zw1YuDq@rOu_lEuZ3uWxNGj`Wk? z5Dh~B#1;2$h060=#EwiOwLcHb8FoZqb$|Gh{~Nf(Bc;JEE-XjrpLH? z(TFZNRv~@^Pk=wc6b~a!?sPoPAcmv$)D2R|MGkAg!f<9OVJ#;v3yo6qjqRbzkh(qZs z#A~a!(pR6#{Pbp6Z=9qX=bNp>25^hyL!;?<$p&5aep$B2DobC)bS~Q)WgF;mku2Le zmXnRL^or}fQkFg2D$AKq=CXb)HEm?OFal?}SyJ05PI+Lf^5!-k57GRiQ!>$HcP7zX zE=98q*+?|K<@v=`D7sO}Lm&-NOearH+Q;+1GWyT{mVK-M-lgY3g0BA4i~rMQD@JBA zeVT{GAkF5##lwpSG5=5hx8^_d@VGBE|Cuc#Wm(04i-!luvYoB6ocX6OsI1MybX@pt z@bKsRH4n1}f`?b9CF5ZgzF60QJ%k71VW#9^Hi~K<_D5Rt(CE$;KkqU5>9_be6Q>b1+zB^V8zV9s`-5-#@SU$(c7-IeF61{CgHTlSWGK>Zo=E+A&*X>g?WE+NJv~bIq%awDsy19XgO7{WZ!g?FS zL1;1#50Va=K__$1=dj9@=zTRC;wDi9WX!3+t1OVFdZg$tO9vFeJQ#~&#e3dwOcYfJ z1JNY*bJevIM3YQ#LNnv9Mj)`DeF*=PkzKc7J}3uUB*?)qvB0Ld{!pdY2_eNh?R?v2PYc;wDYozih_b))zW zjFPuAVL60o2ThLKQBh1@kXk(a7{IgmduLgYLuz3x-PxT#Fhf;}k7q9tIpRrBv4&K{06s`-<^+<`1H) zuAr{QY%&89uvOzDqK4-ehN6CRd=7A^JE~5(CNi16PbR zPg`hj2HuMPje=0-~PoAEom1^muwBYxdn__b=Up^RiT zk4Nu|W^QWStG`H6?OO~}lAnavGZEetFL>bJRVM$`csy}9o-jMXj#N$!k8~dW!IEk` zLc?w94Mfg&IC)(Tx#K+K=213#2t4?P*I6TGPV@QX@EsrE?DAm!jL8(I#DjW_bPlo4 z6Hxj=1rJ6Zd5m=35%m1@3_K6TWEIUk8TocjqI~pH`V&)6g$?Y~L^jZ^V{~{W+FA%7 zsjcyv^Gsx~LE!+};R2-f-b$#S@~0l{IR8Fu@Z#SU-=@I75uW@5&8_l}`4RwWl7Fw= zn1p{}C;y%~4g6cTqXqtT*=g`^4YF(gl_TxqU#sl{Msad8jkWDg4^DSeY!L~IFP8ip za53A>t#~E_=1<9AlJIf=Y*P3qx!@ns4)}Yt0RQ8ko%p|r=eFYCr3Lsmy5L{k4*2La zlk#U@7yLci0iTY@A)CRjlS{s<8=d@l49{)l4=zDX3jbmk{Ii_!E79<|e@}>)QTv`T zJA+0fP9I0BKNLlII7+~`V4bAWFeyL&B%1_T4f{W~=QQ`t@X17#{t-{g9VV3Hahfz| z8#|V*0cDDn(C@H-X~}-v=z@QBJK(ouKlXLO z-@_Ar;&?{I^Uwjr7{?628JN)Zj2SrH&A+xfJy#r2&jV{cp2?ulqp9*b)pv{9{^0JZ|8zxvC(xg~{ztz{q@P}OoPMMJ$G%BUe`5VX z@A~0iSK9s|?yIArk6iF-qzSjvZF{dLknJVdDBo9SbzPVVKLE262oJJGP&i?J20-v4 zEk}srreaZ2rrwY*9WUt$wL&1N5T~sqi%Zq&KvMR$^F(7`H9(8gN3o(m<|X=(&sBvE zhz>`G!4~58f5H*05IZ-^OOnKu-!?R_dHC#ciPzYnpxd>kAQ*H<-$19SZ3k$2SNYEk zyOBSW6Zv!7pWOUe@tQY(t^gm z_gi*@?(j6ReUFp)8Ag@gwR*qhJ6}5~ehJS8#Vyn8iO;9HZUdh;^t)E^8REjHp9elk z{R{KH%@6iv6J&8+FqaTmqjlud9>Mn zRBultux0sDEC()VfaM@-PpYTRtO|+?Pe6~fh3%|rD}^55<@|F}d0F(Vkj!hFJq&tO z*lv2ZCD8M1O(MHmnNLsT7glM4>h{UHZI+c)#sq)bif_l@VR1m5i($Gcwzs#LWVVct z>Y>DA1Dr5!wP3VXJ~LM=!99`i9x?ZV6Ip;zw>-l&b+tqU1 za-MikXW?p@WK=>AT*(Do$=R|J`h!aLCP+K}itsSHuD*5wexz0kkzIn=sK|8W!>h_D z-z+CDSwl=tF<$eKZ6PAm6*rjEQX;g35|2~aJSiOBCwM-l+4Y%7>fklGq(aa{LoWN` zwSNSkYcIx|x&t*TCHJZk-R+w(VwpbLbHt*~czhC#iR?vubU7n<=})LMRE{9Jc+MKJ zCrHH#c%``I&$IwR=PC|Ha9uR=04l_BNKp=aijA&}@`a8uevk0^CnPDL}KeaX!j<6NrmW#p&5Mzo&(Ez;#G z{T0${RJt1JvFA^mneQ8$d+j9Lp*!}H@Wg43a5S=aum@M~R(miQ!((eY0rntkFQXwC z_Mq}Xs~IM-2gjCJEKh0=CdZt4*dDxbX$$sX#MM>_Hcn#wSPKzl4<`0dC{tTxdvKwC z<82Slyi~Mi4|-|{WZ6igbM0!CJ@_tQR-0fCHjkl7JnX?q6TIxffV)$%2jB1%1zX!z z?ZKDT2|8`qgY2B7_F%_Pcuum?|n+JZg!5g+BW2ib!S z$gl0eZ%AuXDkg013NO|rHDRZJmcTuy3H$OaW}tLw zipRo))o*OUgdO*hHerj%hAlz?ZNt_gt!>zgNNXFm3h9~bNw_g(<2jR+ol^!95 z#rA9VzxcthU;p^puwOmyBLZQ+E>ig{`*ntT0sGYi;BaVTZu>P9ydaC6XurPNt@djT z2AGfwI0{^0pckhzJ_+_Km%Xc&#$!)G=~c0${?|8!&OGdYg)lTo7>{ZDRdKmhLfWsh zFQylah_YYXp%1(QW!bL}^&4;dReph&|K+e>cWDUPepQaPs#W%Diq68-CfKjBT#1MM zS`AC+VZY{aBW!IzHi?JDsX1U*e3H-t4g2-b8QlCl?blDYDf{)`_hG-fT-Boedh9S} zzh%E3`^vOm6_+aeHTL`t*{|H^30JqOn*}Qb@0at+;iHm zE3sJt6QR<6jhF!Y)xWX@`*l4&N*9dnS1t-@`&EdvwqG|Rt?gGn(yiLB4QRO>zvB+a z2W|^uW4(3+T|hrcaB&-36G}#j#K`~7e54}96Irj z=V@`T6O<}f^zKS6UtLo&^sk`u=yw$tt=%It@kXk>jO`zRZ2C;Ri;x~W>{{F*$IJ0@ zJ~cIbw!qseMv&KC{%f0e#0 zOvScBUzhzY`VJuawzq-4C*O9`XT?Xfus&XZHtw-LhX(X{y6if^b<8u;Fjz*3ibKIo zoN&uC{iG4#>~Utz(gI2T=C+@|;ngtt;oy*&?E8_5h$prZvcd2R_7?>CJcqd)UP2B! z^$l0vLW6>qzCj^rVGtTe+W=@uCsUl&1MJ?IsBuACrU{Da>yuo6W_z66P`7*n=+}Bxu zJmx!=+xD~&^SatwrJY0Ob_I{{RUAnJEuNe%20yf!T8wob5PTGKytw38$r zFpSv#i@Eb(FtNyNDw9Bul0Ys0%JM&2;{TZz(B%BDT7=*7!d@_&?%*(7W_+DyKXX_fDhz$I5S z^w#3}XjCqinDAlmZ^Fue3HcNgGRrT8{x;psj|Cc4{ zbUXBCe-l3RXNk*S_@$JQZd-dD6wpW~Z?DTFV7I@PQhVLFXY25XCWGH{d%ej5Essw@ zd;J?G@?HGiw#MK}o7(ICCVcSw9K>~)?KNsbPPM%*uz)6SPXi?2cJaGU3h*mmaBH{r zKWaMOUf0~yT6-<*&ML7x+w1SE-4vzJUVo9{8>YQ~Y-57{JSsuAqrEOM;d`{#b4k+!7<@pp3EV2H1#?oU zPfo%#dE$TC{~7$>T&0ae2l1aH0V!s}%%lKsH}HRt-G%=v&;K9MpR;7OZPcG-9{T@W z+wr&b(F5MU+5xZa^2|e*RrDU29LH%@17zh6lapHeyx7$~zk0Sk`t8Awr4mq^^t&bg z=ClJ|`}liCB7ZBN(OgO0ACUIX&EH!sNM?IaTpt=(mcRe{$Y4kZs_Tn$Dpx!qmmp|! zV*crqec@f*3w_};1BFIHIbGU2 z&0RG!xy|*@a@CK!6;YF_AJ>2IgZOu1{XahCB0YurCHJhwOl`l*AgmBpXU%9vSDa2gIvb)~7&Mge3ly5$y8BqceR!W%L}{XEJv1*Nf^Y3PlcY(|KX;m_3QNJD-X_NwGVjL|9v&Oll8XqetR*SKkEu?vOBT zcOX^#RwTk2-ckI1I5Gjh@1BstZZrS7B;xmogyrzYQu6PW|0D7e@jJi0_)ScN)hQW% zus@6K_KN+Swz%B^M;;4m@;n$sTz=rUZ4Mr+nq#=g}WU?a?Xo8}wA{273PDq-Ps~ zeVz2Y@21D6>G|X_(9`#h_Rw=Vin{1A1>z3qyp+!;R`vn&e6ACi_HsdMlRiG12=CPu zPVCwQZ%ZdK=w$mW`!%I~@MJ_3*|BdEVIH7h$|(7i?6KtE`*5>e_`SEhUG&=ceUS+B zW(Bj&_}!H#k7GNEUpx`!XOBvncL#oVC|GT?uWD#P^7X*)k8Q_~@6kcfGs&e%EIDGE zyPbUXh^9FueQ8=xMoKA*?aR>sBBk{mrwlPZKWb;nJhka|Z z?VD*GI9higFw@bxp8g^{yN?mBqbw|Yc77b>t$nS39KOwpVo3D*$T@}A_wR=_!w4zk zzm({A%A*@9bkTmX1wJ)+yG0&7!IT!{v2K~$77*FM5Ax_+Z}{(a_nERhzS@yo9tZSE zK^})I_Qwbn~3#8;Yes>VfB3Zs3}~ZHTan}eCX$x z4(jK=AV%8@n2+1eZE0YrOvK$wled@R4&t)|-Kv4lw2OE%fG*Z(~@1^duNA=f_pp!~~L=>L0i`b7un-=ih^4@!l8gIl(`?!8+ zz{66WE9+BsITijo>f5ue^?kOO>1#uM=cyBESE?<%hl=o~RFZmq=%ZylZELR{_-?(oWB3j?@O>;zNPNFd#P?=d zPaE*X8XwXA!?!l=G{(R%?AQdHQ_|0*@V>mq&4ZNSu}{vQ|GvAsUGyq{=;s7@4|>6a|9$MY9UCA14a#Nvf9ri4ciP&Afux3y_-Kf;{2PlTds3R;0aHp`6Vz+5=!kGG9} zclk(L%1i%!rkqbX4<$`ZhGs;;lG!3VX{28tIlY+ioOxN`Jc`r!*BE)srN@zzIS5_i<+YrMYW_GUdh~H-U!fQ}dbFW35I}^F@LT(-r`eV8NA$k4++%Zh_kW$db zQA#6;8`UVqt&IrBu=WxvDYqQ3JX+^R$)9b0M3I*Kn1@tK{P=1?yZG@mih1&5aI*(L z3X!{g{5YFRrp^z!rW_p7vsI2OpxT(=Zz}x$pTn2q>z>dG>vHPU6z8BKi&2WEl<1N5 zrM11jr*84A&t3ucTu(xqEr~5|T-nu%hDYFfF%W722)!i#rMC3aK&s!*!t2pl@;kEh>dc71QtH|PGJ*6I8C z_EhP+2H@L4-yjt8q_52HLEj!N(D%*!cF`l>3Y#Z2*I*O@yiNA<88Iqfx5mBo50c@`9C33Tzy+q}_mPPZS zF6mUgB`9Wy#>y40^m&Np8ssLcNEg~)kBBP6E*eZK{tekDOlF(q-32`|LK*hw>rqv5+dlV_9L8$9(T%(|@i<7U|9T zQL1zZ9$SjfGR~F3LBa8yO=2;2E9==`ILI&(IOlK^)&%@w4nD>BK$@br(&WiBYO0qC zX7GxEI_h)N8XSJObQT?c=#Hgrl0;PFBUyUCPoB$IjS`!HasZ#}ksf=|byIz|=s1;% z{J^iD^E}#PHC`sR$FESEv`1mT(;f{4el2wsU+a=id(;iZjP_{d3eOLCw8zhH1{0J$ zI{kcB;n?UV9RD-i9iaCtT9Q9L zI^>TMmi&?Ki2N_`l0ROyN&djEJ@Q8}Px(*X%S-+W$cwHuzKck2Z$@UNE! z-Uj})1n-R-74fOS^QQL}4Z>kT+Yj%AWbj~rns%%G*@R>Jb^n9dCF)uJjQ~9EfL_M8 z#I3kGN`K1u_$h$acfp@6nO*CL(7{(#=T-x=$x9qw<76Y1@x z>Aki^dJi(`9Z?2)`{%bn@Add-(3^__n%>KiPC{?1_67PEIhXD2NwO!SLEWIcU~0v6 zct2!n`m{gL!#F%h`wLehp1JUpTz^K98WlW5eJKw}H}!M&!Y@v5*$OYyC7r!+5sDdB z*vb_i(S*4Y_keUXa@)A46YkMr?hbeWWwJ)5vRS3ro+h5-&7T~+xA-#@4{hhq{nOgT zpQ}*JlRpjr_2AEm$lWS`f|RKp{88~HcO}LqzIuZjVk-Pr@Wv;`5>9CsJgDwy+0crr z)ADiSWmB%W`#P`>y{WSs-K)LuPyB`rmks{}Pxwzw_2dV|R7j7XcL10>czM4T@J&Cc z6ZQUdhe#t`2ts<+lYWK|ZLY-R=|u!NRL^5D6{0arR%T5t82;wHru`cU+bL^*0vs>B z5XiX38_`gMaie>VSRbiCPUORu7J>72u;3+P!-I^-JJ&bJS-AWzwcjAezz>Q`UL#31 z#v|z%8~}4cn4>@@7q}ki(mIYASj=Ey{^lgudm5&qO>6K!_;| zzHW|Hh_46M;N<|k3|HQPFFizOOhK4lFZ2^jX}e&B_?!Im(8K&xET8VeQ*Jy?#EBD;)+omr8lhmFjq_KXQfYzc3Xf!P! zCIx%}gRGDhFO2?rtEsR3Eqx^>mcor~U0__bQGSTXM~w}_d#2S;tXgD>kuWO zLtOo(v~hvY;m52>ZQ=s4tCoV+eZiDx>IP6ohuYI7?8(Pw+N zurq*dVYyFoV-JZs+CXab$A;2DJEZKXc4Em}JuPrPvhnG@U`QCT#n(wBc2 z-~X!YHZvPVd;Yx!m$}l*T0f?%wHWYa=l%GCM)rNycGB~{i_q2@#KRRkvHF(ZbzoWT zCWwJDyeBj4Hxl_PM8m7w(5_wvz&QU(Y|`_@&g&I6nt;`AUE%1+>(zjLdkD#Xc1 zYx3j`Qy(p9Xa*fYqC+!tjo5r2GZW0fgq+RHnNt<|D~sl=^c9>)C~w@4S@Q>=44d6N zx*VN9y7}wE4b5iJ(;P)JB87@_ZN}d1Pb3c}mpL6jn(l0y?)gN($B2neq#IG8ofXj~ z%b=VU;tu)eJ{UM{k%k~m;iK_5L#kSgjG>j%xM`l?THSQ$QH(8~yfA0zyBO@8{@298 zj_mLLjW31eFN1yP?`Gmb+NM}D@ooglRzb_KlI5F-^cs~OhxE1AUv-WAkzEeA$Cmx8 z^^yJn09a7DCUM|wHvISY1LH^#v;MOMh*J)>*_6;{A}K%X)2lUlsoBdD%8VXPw%4c3 z_DUxez#hh5$wFPFC*w((!-UIqV**uXcH!ZxRXOl@! z12RkdPA*RAsd#kRchkA7Umu}qZ)Cz<+8f2l&$rn2XCow1FG>-!6F&3xnP@}w0-f9^ z**^fwK&*sHva?7DOZzs8i}#?TJk-SIGyef$}w@T3Tod!&KkiYZ`tg*djWPlo?d2~_kTu%KQ; z>MH%F2ye86_niyg`QGqS@ZZuAW&uH)9a35XFo_@fmqQzj{=1|8*po9Yf9yddz5THT z_yPw0cBJW#ea}xTZGWuV(;sU>FmxOJu@$iBsO~}e=W*IHQXv+}rzLpO*6%c=m7c|t z`D1V0gVNd`o9!c?#M2*Ji>7S(V+-)m0e_5}Meb=_mnqX@++bPXTG0>0?%;o1_N4Yz zV|k+!4LuiS!#+2EfNtsI@y;>Cn|LPd1LQwJU&fgF(g&raJ*Y(AQ+kfwTs)48$w6^C z@Ft$KT$Fum?P`dJma{GBF~3QTHnS+lT`4Zm0~$FgE3kG&+iWyKlL3$!P};ZjMj_qEHZ2Oz5o-{2NJ z5Wf=k!=b&*G5K-1#gE0PuJn@D`LRAi69tTQj$cgLlZP6Q(2PfeIPfJJg%xzF%h%H( z;V~F7g?&71YUB>qm{?&ZM1)72-7f z(S7L;;ELi?jAt^67&j&=|D8mD2Xgi3o7LFPodn`-c@-nSme;*Vn^Z}8jWFqH zx4atuW6&ez6)#f#alt`vvV`nuA;=g0os?T$KSP{RyoL)H^TWgGoCoJ7_I7ixGv#it zD?qh$P>R0*6TZ9HiwR1|$0M&~g1WPK5sGLzKY+BCoKx|Sc`ApNV`$?~Y?v^^ru z$oBOp%gFW&UL^HuzFPwo!1L!$G=DzDR0vOyCnChhT8AV3kQic*hIVjt#!IA%pIkt-QC=2-qHrZY110`n=x3Z>LM|2p0uKzHz&qGr$AIOH+$*wvb^)D=S8d^7 zJup(RQ!IUTYs17WdV2UFUUUv+MIvp1fEah;mykOSd7MR?TR%ypK+m7#yA~(L?ZNT@+VkduJ!WRQy zKk{gN^YFZ%`0iP(@x5uD9pB=fHvXvg_1EO|YIt+A z?C_pQ01x*4Vskve`MLoVlKq9%kPmHyKD7$9PuqNY&H?8rfKa!80oe#c-?L@?fJj>7D|kKmksIsGXV?ZRYk zgM41x&YL981aX(~h-q z%Ha1xz;N^X%aDyzgEYTSIo<}v;P)5{6qDZ%+M)awpWhuN6>SGAe)kyxey{%~BYyw8 zARfO{o##V+uWzBpv*l45w{gxqkKg!;qvrW0Ht_&_hFcz`;f_+(e_p%D=~;C{0RhNG z*gS$|%4WvkaP>?*6tOW?wN3CPN_!ybJd&29Jf4lBe|~H#`ax`CErr&|z#4Hx04)e0 zImf9UyB+-ldTHl*E)Br?iIQapC0tgZqglsmg0v99qWeWp35@ydb$ujj(DU<{!Z4nMTgQdCOyl0(!@REdG;-h41XO4l`GCQ1{Hz{7B0dU z*#+gEfm~$M<6wI{V;sC;>?G65VE(3uPYWkL8?5*|LioIYjuW4@4ty3^@L8M)pXB-; zV+K(u&#?mj(C5FK`lT$Ep??o!W2l0hA7M7Jiz1a?G)gh8g!Md%v_t}jRC&xFULRV> zJ{Pv?i^VMqXd#eh-4R~=L(|2?bAt#7rpyhI2$`EA^e@vBETfX9;fqtHDz9G6aM_;v z)UGtf>p1-B_LF7)eBk(V%aNJ!r{SqM{F&qA&$F*N`SSq2B;e2M!{YEKxxR?7lH)Gc z0|Tk-U+BGKd-AyQr!}GkP0ul?Mbv8_72qtnmE|Uo7};x8S?0@%VOL z;KX+-)niO+D=)U=+jo%*-#d2#-_M6S@$F{EcOG(S{yvW9M)J4xDJQ;fqGl7{uSeVQ zt$5yr@4#Ka_XHQdHxV3D9)=>9#SiM%B56oA)L!?{PMg^d-07Xu0U4 zXIS>F)Bhg_IY99M$oy&)yeIbuUggs+{E81SyzIpAYQStM|D8zwEe>10Uj`~<&j~zT zA#L*9*^q{U*v7hURRb{DLKp%S0t8RAd3aQ8QxAeZk#F1% zR4YVw;u+RDE{Np3%omL$fM4M$K~L4C);ZJ9_MY0!Q^L2MeV zIy|=BSceS^;7_-Wp;0t3WfrJ0_ZqWGra!&2qus56?2IwCSLv#Wy;cE!D zNC?9W2HSh-x7>hW(EFBAz(#L#S>V;xOmCr^-tXEoLp}yW ztO9lNsTO+SkGRsDZ^OS#_J~yH)8PeJaRv0OHWw54m)CLpJ@V;WH6jImF*ty|koltY za0EMs3vvex^G<==4Y#-X1{CB@rK@KDc97mAI@_^Hw6Z^G11i>Sn78WJ>`(z5)p;Il z%$eSVL`8@*+d=#1=jD|D3~cGcZPdkg(bKTO9#6NmNQ5U3uUm)*_&*jIn&ju9y@bd| z%rG`9V4Ff=BytC+WPkMC^~}d%;A$v;jlKTm>+%;7fqYVOe%nIv;Z$kJg$wc!NVGhh zzb4|phr!V4jEH$JUzHWgUxe?dF_&VE!b9L1N9CI*q8c-OIgkn$tcm276-)LYZ!Y{f zLcEBK(Z6C7K-SG*;&LMsK?FT9Ab<@5Hy>-Hh4b?w{@Wbr^hZ7-6vc}omG^;I2L9wP zOzfq9QV!j5{ov4jbZ?wX=cuwyXEO6bKo$EJrh7dlXBx;FgnbaDn$T(@Tk2N>PQixOYRdfhDb(m2B$J2zkK5 zP^e-CUc(Xk8;X#wK<8*09#sQyFlqRUc>dp%<#i@NqW8 z!+wDNd+NWU{|?;`{dZC-{a22m$EN>QW7;Y8-~53#{nxcE63}E%AcNL_A0hD7t^dCK z3GA;H^HCtR{>z?B(n1=|ssCoTAOTCP|AJRjD;w#F_1_uDm{|Y)@GTHXL;t;vd~x*O zk3TZ8&*Lfw?z`jqkp9aW>v>ZxfEt&G67#M)Jq`UghHFZt|8A5O_eRAI{nz_{q5pPV zWzm0^U#A-}iT+!jlS2Pp^NrSjpkVpd?07s(rT;n}oLK)Ie;Z+$q5jJTopJTw3LlAQ z9R2s_v$>i$`tKiQGR4$?CC8+x{~o5bl7#y2goQT!_t*jwRjvQLW1;_gCDVUMwCX<; zF!Udu4gH7bB>FFvy=&PI$F@1fEX-D$&;ZP#R=mNgJI&Yg<&;es)f;}&zcY0OXK z*LP*g`o<=#Z#@PCY0#boG*|S&t2Ss6KZPk5lo%{D_<8mr_JC~H*5IQihe~6x$yVS4 z=3*o!p&8OcHDPrWHQk4rlJjqFk3{@SpPu&=Jr#d<(bHRjKS1kCB z^-eGTr#?K0B#{cF;~&73d;j3ClJXT<>E7?>D_^BiG5v!FGQVbwa)>a!$>6*5!~WT3 z+CSE43|=j;MlZOhe+4*y1P5vq)HbvpEgdDOo)UOL=qt_{9px{{;TJJ78=JlJH$~gX*I6IY z4o>6}ry?O-uqhk}wTM2eqEB(S2w`-AtaunImL}yR2ScT9`BOZVsum;KA}^^_z23P1 zC2Ex&xfsu5&Z7;*+WVyAy<6_KtXFRb5<95G9)yff331?{2RJS z^Y1rLD*pLUvE*OPA>iMGU6b&y28mYwZAS^szg>8a&%YrDkbjo|0}KCRhWrgig67`{ z$PUThSu8^=X}&3k$(K=n95y~xiCs;@Hmlej_8-l*H<6&lZb@9R+t@|3E!PjWjl-*Z zCZoh|Ard9q)H-il6w!R^f@jS)^l$XnDF={We?rx9`PBjm8S`t=A2xn{zESh*J|raP z*AvHUehobg{OXO@g#0Q+qK#kYp@`+F_c1f=v7?!C;`m>1ZRF{N3)|#WbeJRIoSGHXJRWz zE?Yxr!?5Xk9P{!`o#WL{Tna2$=F+iGP`)W#P~2v!e5tK`a(^}KTXxt@wFjv5CJ?;f z0{0QNF3?OK_gicxLlJ8b^;Q=imSxC=M=Sa8h}Da$ze28R(GH8+$QUHuiR>oP) z2dX+Mn$6KOE&DkE{!<8?3;&u=(!u}dZH)hm?5Ir_|Exyhuj3<6M5Xc>ixr~~e@n3x z-7lq?C2l_SW2ldK;R1fIFw(kTOGxU8#~PBVICu-bkk<3db0`KO*G@DEy0PaxJUe40 ziO(!w$>l@iw{>eA{QPn8+f4Y)?cl`kOMJ25S8Ks9mJGiX{YR~jQvAJRPIjHDP)8do zdeehf=7x7n_Ar=czkd_xd#T4XPOrh>~BIGVBTk8<%37YNZdW?wl_m;GG2y zmz()on)%?bQTcr0P|nxa%(nv{41RqFeOV}u(5Z@FpYYc#^_BUxhChA3$HuQ0`QsM# zk@@uqe_CtLcL#rbNquzkYeic-zhKYL-w%6U+3wWHAN;rtE3UCp+TDOPbga0R(lYDc zVR*?C@t1SNg?W!t51>K?|M5L72h@^fiO?LFrZMpqXrOoTH$0Hc>I1{SyMM@#f8QS^`M37F#Qd8G-kSV-1WPRR2DTKb1kJxPl_dGsN2MZTP$i_v zzi+`JGrO7X!32(gv-i$`T+Z`NqgeB6d zKR{UL5?v)o%ltP5{~Yk@j2g5pUoJ45yLiVB5e$(*S-qgk8XHl z_6Odv$GPy!*&letZg~IBjYluW|KF|Sm$|){c5K%Di%GbVHm3rc#fF+!5(T(KnRtH+z-}&wmDwQ z{b0xAi*vB1U0ZN2t#2hs){B7Xzo56<9*e)c5%iuMpWZLQs!ZrTBObkfbJ82S!%6Qn zd`UoWO-mQOsmCMR{N^_x<(M?yp@5>Fq^19C@Xnd;f_F-$@WO-It6@LA`ZLb2>;vz9 z+7}7RZ--pS6`6SZaY>&r$HdO<#42`niE=!%p~m6X^4nzf4eqjYykzyt&-3eKR`c_^ zL5MLx&;%mZ$H3u(@Nfx$DKt?;+M@1CM`%F1pU#0E<$b z^FY$2XUx|oJzv3P=cMNY_02?_{CuKbWJu2)3XYYYH(m5p3Q zy(uYWH%zF|Hp&dQ)|-y}+Uh$rZhfUm>f6%XLMPW(W5{18%ynG*BQQEn^onnHd_m)* zJh@k&XwwGa0ys#BBgjJmd8AD!LQoQ&V{@sjT^|#de*M=RnEF3EjH$QPpQ3#&Q6+~t zY`};eTAKDBMUcxV6(_vY4lum${5ER$8^1>nFuZ~T3~wLYD`c_h;XJ+Z2-aV3A0HfT zweMeY!pgwD7u%Y-;EmlMc=x*Dwb&ncL)`GH4sq}<1A1wMh~rPaPJuKH=ydd3Vt@KE zje}>iH(nd>vNzTpEGci4{c_0FE_l;y@L*4lw%U`lwNZ}tWcjWb4CR~5eqP7ECS=lk z7sxPP6Iw_MsS`bg#4EsUJQ z64U>F9Qt1yXBL+9_e+ERP10&jL_d0$L4PCT7vU659)H(DRbuEmqrWC!4~QSX*rZvi z`kpu_k$zYO;ezB$X9-h%`7FnY=pTuAG*IRS#m z_D7=o4(gg(@ZRtG{&Hff`fha8hyK6ZD*rLbt)j?E>Vs+Am)joMP)7HEY_b3c@`_YP zrj8lGa;<0)BtiD$mHZjhk^lV;eW6<9O$ofifuI@gY`+M{7vy@`UjOt;-sM^1DL{|- zU(hqyMbFOnQ`7UioSr&6rlRNbCT@DlVrGjFGi@zG@wbq&uMeY{doQH^nDZz8ALhSR zqTP=u>Vv3Mx-cAX}uWj?2HN%jc=`^dDzM zu_gUe&K1=F6d~NU@L<4J3L%Xib*Q9B_b8U{)bxznPkJh`X!YNrXFxW$kcA$|+XX*c z{4s^b__=__&kMkZ$1aAgM%d3#>Oj0J0so5a6D)PE4c#4+)l zSic;La+KEYW)%mNGiw}>AdeP(4$h)QyJLIvtdu+6veiGyQ_6EHPC`b?bS7uo2kn7b zE)Kk;IY3NAbjFhWNF^PYjPMnlCy13kb;TTCG#BDqiIiU~93gtRE7L=`axsd9_=33T zNJI!q2U$2mZZgEgkX67ymuw)Qw5uu1e?t|-J^%%RI4@cP%?|NHxRTN&&@kUXr*E07 z#&MiUk%Np>XQd%Qyv_cP2`K$kq7E4 z+OcjjUbP~-0ZWw{MXy3pZ$sE{5@J0THtdWOjCUDGLl+T9l#>E^hSz44*n~Rar1NaY z^O%c*yj^0wx{%3Bq9DOWEc2`o|{{Zq@^!{n>8%iHKzwY<%UD{uX7BYE4_ z)0DSwZu-_KZ>>1fN}Wl`+e)3$CU4j5Cee6>7=8fdjg|EQledwV0K3fOZSmyP@^&Zk zxaI9a+GwV_gj3!IodS95yDy2nO-G_t-iD!smbVM=?2xxK&hN!gFsKs^CNu(V;lEaY z=LQI}oKaAEob!KElwWU@KZ(l6*?%HRuz?YZ%Q`=vyO+t-nwqT7H2n*7|Dqe-;QfJj zfg9crzwZZrL*4M6*dKT&x#1P<54=upcv+2vhtaJeM~PE9{*uPzKO;l<_WY})e7ffs zG(KQkbF;%q6-uWn<%Q1Q{i|$zwue%c|JGgpmGsI}JP6b#cMDbX-&9FUe@I+E%Fl6> zKQ+Vhe{+=ot==m3Dduv=q5XUzKAIM{7vRWanySE3#eT}870=Y_&wa8A>)N=X|I@DTvBdR_>|n32W0Lw3 z@;4ZG|IeP_Z1@bso2|Yk9lpi78baB}AauZ#X-DpSq?dZFHvNf&QzN=72Tz?f;+z$H?_!u95 zQE|A?Imhn!>hr2!lTvJ)u>@Lq_~cph`+Sl*+QynW{6|E@NM65Lggeka@o7PyNoa3%K2 z9#1Imz#9ywNC7gQ2wlb}#rUkw)2`}H`=#hSZOeXf8S-!-*H})A&w-(*4d3aTxt9+fDGje z<;sY*gv8=3GTb@jwkymm11oG&%-kCitqE z5-1eKzbUmyJhik(fVmtn+5-(n9UCph9UJbITyYj$JJC(m=CLUHV;z_PE0FPz>_oZ`_`1ss`vNfxuFg_l0iG!3! zN{>69>Z{%z@|!R}_@(raCNmX%JUofRPqZ&H{T$Vpa(UH0SaESS5TE~vF-}|siILp` zYk;Hbi~0NzjLO#T@VJC(1{VNHz(;==YW9b+7#$}oy)m>Fv*J{|Ci72|j7$uO+3Qqz zjar{UDO`+AFP@T{p zdvqjz*xMuEz?Ebs4Sb(9G@!)y#-4WJSy88jN5e})er6d!6U)z^C18WM3SY?2to@gt zVQ;09pRH_j{g>ruhR9fchD*E>%1>7bG6VUcfdCiT6|%_KV(mWvR-$JFq@*E_QX{E} zZYueb`sg3%V5~V-$zFA}tQI7sDxazTJ0ST}$v5*;%pH$20Bii#Tt3ld{W*^~|mAd3> zCv6HJ!=Ow!o=AQ@0X;~Opg1nL$cLCu2k(j#!G}H&`$_K&s9MuY1meJ6R4;JqBFD~&*x7)ihw?&5Z9Abc-#jS3YSmeQ$4)F#ZvOx(X zNeiPvHKDmLG|)(sp2}t08gN)lPvB5K-RCJej)=PzAMu|~M=JDAX+@u|Ri6rdI3sD= zOq~5SEV%iHX`W!e7B|}5W}CjmobT};r+EO?+vn}l6R;1t8n40jKTV_aHivVuiP;UU zgF|q)`kK4}yT#)uQ(m7{nzbHqb(Y}cff=6Q{GZ8Bcn@dIMb=VeC4RBrwQP-&sxkD{ zP#xT$Y0{4ylx^+UT0=s4j2C(J#(dlw%|zZ)TQrl~;ZYE?%o6DEpMuRI4>NCL^q>%z z&0-G*P$&2o#!Ds0jsSd!JQ{@`VL2g!jk)MZAUbdMO6yBN6<7L3|J3 zd#*=;%>d}f^9(%4ISx0i@d9!%{uP#&lf$LHs&Bk#i6+;>(^W4D@O{Ab-YG}Z%OJdf zrmC%8%=ns|`M|iIRlM9-<9^sOYX7sjT$G!bmTMN z_seD;S#Ck&S+&h%7r1oWuQmJ+pufB}s|1d5#0%WJnLYn_wpP&GRe|geBdqw^aPt@2*#WRa!#n{GwV)|K zy&fzII?*s1!!dzZ;=oocou20-#cj9A)YQDgXU@if29fmMY^B$Oz9d_pqOMj9f-ofa zKN$2L|A|~);Q%g!UeY2ST;9gw*h-kDw;)JFF| zBfhRBQS8S}qmlegiVJ6BalqONPY-1$q)UP@?foA`G=DbZ*}@;I$2zY451SiDk@5(CxyWE15a6MaKw9Sk7{cZB z(K;c>m-zDe$*^aiw6<4wLmyG_@rrZZ`Y4pYt1yzk`>Ll%m4ph!I==avUT9GcxMxR$ zecqlO`2^*IGhnZWTkmZGtA2G>ac~e`aX@f{P8bk3XW>ZEiuHI5^IsYDtTdUtHJr^} zy4O4$A#_AH>|iX6Flg~5c7AA;!dKXqZ_6raS-z06Bfy!f_zQMatjniWBoD0_*6=MX zHNX=#z?gmCH1yA}nR*1>C5}`5VIXuL^bDbv z(@!d--4Im>0IlbOpD`;xNkpW5Ab{73Gl5A``v4BJgFgQSe4*^+E9q~OlIHTkTQafk zV*r4L*zvyV9IB%eh2<;h#Zz(=**J8Wh&=xDlT%4i5Fio^`cIj|mGl&0ccymsmo3VFxW1`>YG zX}|_2Wn--Q@}6ICKA5lc5PEr%#3LX1aAH`=NoM||kROMAjfx>&gg_ob?{xIkh2Bu1 zH#~xUofrD~a-JC19jm(mXronCjd{45gsCOEKyCF0Qd!bGO7@rDzgfoTp+z|$Ys`QV?>(D>1BTf8)5a=X<_ym>p4qz1}cd*+R%;95v5#L(xyk`iIl%Jqge$3wEb@rZk^G`ZD`Gy^a{VWe! zMhHRnx-9sieDWOP0fbTet=kbhwF(}r?lM@C#BdKH<;#13t+bF+_f-5%2c=N~ZjnjoNJniBy57zHKr4_El>} zlW~F{$%?y7*rFaCuMun4Szy%rgo zO*aQe;m)BX@dG+Ull&Ncx&wnOt3>7MJb5kiT*phK(69ORIm?E%fL5buP3lF60jw9> zn*PxcrGv|jFYOQh!=`vQyd_)KWiOZ><9PGoNWo6=b(gKUKc1f6#VvZME|e9Cw59HU z?~~M%iN{5hJZViWBol9RWpE3rFH0svU;ea)^d%Eb)j>%Pmgv06Yaug`N5{m@#xr7K zub(n``i&TJY(G5ykQpM|zYDeh$@ccw=cm(olk!=GSQmbXrdxx9-pR-1zaB_kVIoB^ zfz%>=k)xm-*K?6gvIaEFFBnmW9V7mc(|B)tOY0!M3HFYr$Xhy*0ET-lXF| zBK$fb{LeQHE-Hk7#}^>1<>ks88FNTzXM;ifGOBC zSOk<;TLknBAg~DN$)eZ*pZqn}@nySFTY#i7)BBlD1^&?YR2xZ%c|T4EBxHQw%j@%P z_q}}g7k%H$Q%FdD-^)u?JGJ>c6{0o-uWo;vnnG3}QFasU|3wkQ{>8KHzL(_v6>=um z{jjjzZG%4EkHQKu<%Ph6$nHQ-;mcX&r=NMb48u+gUJDjd)f>KBWfcb5Kha*R%=SY3 zwhyf=#g!Z|D~5pcdiZcpP{!|qgNaJg}#v@YM41&qE?jy!ki-S-r37dJ>?<@ZX%M8|wrfDCk8X~x7iS z6T&-xdEj6P$3CE>0Z*Mb{A4wa=C&bf=j*N}m-_l=v;UXH0!H_z z)wY!9`NHgxhwn!Ca9#9j%?q6ltETPqFE7+;p3B2kMIHXJR!?=?q@v-~8tXV>v2-vFeM)iTF$;gHq) z;~e*SoZNg+43Xm_w+h9_&~mhSk;B45d;qg`v4{JwvTw&aaWm}26!sDZ3j||a6Az&i zu<1YsqlL3V+2O(7&=4=KYNSiWhxom!MB9S<0&?R)u|{6IR;r)Om*(cwxFegk?W8tQGPn%MB?>i(bUv zTmV8bjk7|TE1_hpkC&qj?B`9a0&o~0an5%D{?8#hS4+9jTu0feW&D$mUzYO;n(yXu zhlYO!sjQ@RuQES~k~HAa;QDpbua)byBf`J-VEmH7Vlm9nth;ls1?1>3t3L3R3)-Vs zFIE#StSHLs0m;-!JJuT$Vys3Tp-hdsMLxySy96}LM#2HhhTOFB2GXwkc~Pf z?OUQCKc=JCXxkYK1lnp$o@bt&&%!b}h`b!tC?cx@lE~;4@hV!Q6et_L42-J3nJZ#- z2xGZ8Qqd9c8HG*~e&k&jd~SGUw!e>FXSdP7KiJ3Z_Zt33*vF=Lu{*#zy-s8w!$iIJ zOLCt0rXESwZ3SMsvC%8UuRyx)abh$QCLsZaUQYSl_z=ne637d24OSTF|M^Hn7w%Tg zrgIg-S=5lKGxjhuj1t6QF=-vo>7z$b`F3C$8`H;u&gENfNnlKiFH|)g2`LZ>3ELJE z2|3U1bt@)6`LD#A{3yjf8;O#O(nrt_CB8&MU^w;+#k18%!1B2P339?gv&lH;6@`c8 z4k+-IraKAM!jJz9U+G)-cE1Q8r0x^?UJ~B641}Ne zvf*G*X4*seLgt>NwG%Scg9x%83L<&~r z$r2q6aL-FTy5b}9oQOP&v!czTn2AUWa&pZ+n~C4BL^p)N5w3r`eIfSj1OKvU@o4F2^1D}8%Ft|R}ca{ z1<1(72EQy65IJ*xYKXq17u3qY>BU)+*RyW}uWLcAa)}Yf(DgkeLEtr<-=2GrN%Q&z zJnQ-OGkCsX?4;81F7Br*54YD@=|9>k5C8gPAIQKW2@{#E5$;zGgnOC@E8&=lFC-lI zkn9ga9*ysLcy`JLHBvhAq4chouKhi0IYItQwMV*Ya+djhWxw8vPcyr_Q&^$qN=^OK z>oRg@P;T__XfDaq6JP9O&*k7;61hRP-Ns87OFGiUk7oD!%E;kpE5}aFt0g$B%%(-J zblHmbAj@Ij9&G?p63+0*S;Y1OFR-40H#OXmsU{wL4}A-VhEz~$`AYiRH0O>(z{fDp zC>lCNuDX3Jl<#gR0iW10>sO^4n)O~)_ceem&Z_$Y|04O@Im2*UhBY$7O3pxG&_2=c zTP;ll;VGnq^JU8SSUHn=hf+ea=xvk%#eM*uyqwFDHkpUv2=oeYH+9u$%6a_S?G2Kz1dI-m1jq&!w^=3NWy;2@2mx{3Pv|mytiyH;$pJCqXHsEx)Z1m~ zs84jW6~4hz_(U#Dfq-Mu+REz~na#x!v@(lG{VMcS^ba z64sKM=iSDOTs!>( zDP?PhfzJ@~D!j1n#>o(#y(p;Vx)8E~NfgWbIe3Pnh2{E8JTJg=TjW0-&-2yyet4F` zT{8aK>$Tdq3VpaChCb2t4#Z*N*N?hx#qTWqrllWE17RPkcBshTo?|ks`<0bFl*s-d zd%qI{vd!;avH`N{TV)VORyvoPcnCr~%DL3q9pDPoCpCG|C@0gfDh{odeG#!XGh^OT zN>Jl177KeoaoLQD?C2uvMC}-fl4Z)t{7Q+>rG(F1h>sPYvlyS7*4gmUwxB5I-Wly6 zrK}#q8|<;`pgA$LnOZtK`iK?3o1ay~rs7tb<2y-zeR#N6G)JYV@WEnUK^*24-$Ayy z0%czuEh{iXoYIgNl!sWWBAkB}8aw`c8z(Tqw?ik$^!fEyB9+c$%2`IoPaJCzH3EPh zbN4e&a;3enM#CS79*em!bRHQ zCHP1y3Kz-sQn*NVQSi@rHDZR(L7ckWxDc)+KW2y{f3@$EtK)DH>MLOx{_)F~J1Ja* zK#S+MSi&19j|vx|M;$YK3hm|qawh;eR&(D#&1v;_&Yx%@%erGo>b7H_Cf(Lv>b9@{ zp;}7vZ`*<8U$b8f{>`~9G5_-7^6wCYerL$PSFvwU^Y1U<4VVpXfx8L#_Y3V70RO%# zQ~dh}>@fOJBR}}Xct1zk1jL5pq>~LusmcStrp({+ z-G;sb#G-ik)js8BK`QtXzkh7EGxL4}QmXQ1`~PILKbnVUOQId~P@XZQC?9A*maUWu zzK(7Qh#_Cwas2T~H??X!qPh~utHIAc8s9)+5sr_}_v83!$Qao=+Tc(qhpZJP$Cn}b zB&2bFB58$h5bb}~S9aV_Hb5qaN2AlkCbIp1l>F6aH{w<@EDa3l)UW}*h;N<%FDNe@ zDd>wA$-GvHTSGa}rBNTom)`pf|6f_GpB`T*etN|SFd)f%V;#>jkq6eYf!nt~sJ8cq z1GLNxyt*@9BT%b6F^>D}-u$NCn^Q&p$d8_^}R17X6^?d$+%nWl-8USME$8gYP^>GDuN^EQ4XFy7_7CM+YVI!k+?t2Z3kP_*?*cd?g&Q_jQa;rBl>yd%W3tc^^X$uN&8ZJ z?n})aeQ6}3wlnNY9+)AzFTH|2C)#XD)RzXKyC&*OxxhP~ozflOjh?gf5myVPl0Q@b zf2ZUn@pyla8@#mtS3z|p7+>Ugdg14GeSek#DHVRkczRz<;g`Js#U8e^AQgN||8wB@ zqyv(r|0SUp{FM6Qt7uAo4vJGlDts|@fA$-5Abqda&e-oBvXh^(eGL89N8_8Ezjrz+ zNQJL*?e=Aym8t4;jQ;&BFaZzx+Aaa)P6KkR*nTEgz4Ad`(l-8lulIwN8Oomds@*03 zj{U=8&+I?{j;J&E_fSb<{srRl?r+oGW2Eo z5R)JLqV$h#lCzI&j6dJo{(yy>Pva%c`JU0=fBH6Me=jt_>ftkG|CIXk8@=#Hng=G* zK?bB${m`}d;z4bmCMRPasx+51boDjMg2WYM3g{F5@A5bIz5(vGxNHOx=D zc4!Uju(iLSW8e!8XUpiBB)*C6z+)QprA=fJD#H z`DuY|CSp^`y(;sgP_ZvuS|2_+?42F*-p^^4s&X73Y-N3++}ZMj#?9tlEv{tF+Qa>1 z`={cE9FqBh2JoP3cT5zj#ga)s+03&a=Slc}b1@n$=l07C{samCwxB)K>D~hc|5*wD zNeBGi2MT_jgumJW|HJzd^2ZGLAcvB3KZR7pa+AqnI6IbC$YWylv+77YDvdrlMZvf3 zE@>41-;U4!mWlCS4-8;`CG_{(<>%lNr2IJev*g}{{K*Xda0!2#1AcL0_^IPVsC#pF zr9}m!yZUE`A{0?Vop%WKHc^ODXfRH^rH{p;_G0e&QExPx52h|#LlvQ^*3D&74S!zp z_K&k)m=sQIz%cL3c7zW0`ozNCxrJh~tgul0Tq0|J56LRpnP*Z;RL*wPUt_diCz3zc z{t@g)xim`W;kAQ1L)jlid=1)mAY@i`|`e4Y(w&Y#jzCV#dJOv<0vC^-}U9N7qbzP`Z3XLxda{*);` zp*flJXOsn>6$6s;=OIeYgg?KAGRNnwktTn-CdcQHO!1k}2z>fl@Okjmr2P3CC1=8) zEweM{&%$DpKL;nrXGi}G@fqF-d|F%ZxsfVNtPd~A6rUA$WX_+8B9lLL{gUGI4kc&O zUR@pdz#lfx>d(1Mu1~?*pO4j?6&JyZ)6xF%A|UvDG+OsTKE7#fMt1Z{IvC?=d<$OI zbGj#3itSv%PI#gq2VT}0{|Y&69zl+9g#LyiRF_^ksw8mb?_`DeA$n#<7&sxhfdYd&wnd(Q#yy;%~=#=9!3J_*#zwE^!(U6b9zRUIhrS3dRoV!XYk{$ z_IZDoZlCSvFatC_drsB#yo&_T<8{$CoCNIc?NfYW=I!&sEsdn76j;DNW25JZ$6WM`Fz6X73+VP4)nB(yH%ZS`z}`;J zZM`z5=Zl*gNzcMzZhAI8>Y}H)K~IS+py{dTr|G#A36QsWz}`;JlAf8<)4Z|td~~*( zo-8*#Sb$ghZGkMH=~;S;rYDR9(6a{E+v(ZXBXfFApV`RvX&Q%~6CZK44?Hu9o=s=j z^ugCBYkK~L1kke^*xTu8*$8^Bo6$&m`bzX{{b%gME_y~7^my&`v^MC8<}*E=T=Wb% zA@lZm?50N2Gagtt^}*bST=XY7e<_0~x2QvdSJxvXIK0^ZN$#v1wyKCm{bJw&+(lbh; zXVY(G_q*tM|2y4(I@#&zd!lZiLnS>!fxW$b#&yY@o;Pl2Bs~>_-17EPrHh`s40AX5Q|3L!i zSpe+q^sGKEb9#m52m9bs>P5VyY2B0Qzh*Ej(@mO!e4#0eX4%%fr4Kr;kR_GkM}-M@Gqt_I;zFE z33mKHoN|Ep^R|S)WTGAZlmi97Klbeb|LjS2_$?0<{AVTn;%n{jm;Chr@#jc760KSs z8{Te{&*DVz;otQ(SmN~#ynpv*t0$HHyA>2jotb~PH?|@cMk4Ir{RaCrQu%kM&<+du zcVC;Fz`uKo6)SeW?xf)CcvvO&?>>T!g20OXyM=D7T>jk}-jiVQ@BRzX7KjRq=il8h z+2Y^54=?fkyJ)|X{cXRtaErm^W%JL|sYTL1Z)?8=K{dTRb{aPW5^v~Pck50Q5JriLi+fQNz z|GWjO8f;VqRs>btgSK&C#qCGg;h*O!+7eb)|NOb<)KXMmy!H!RXKBCxT$`x<%3>+v zkKnwlJcY;8wpRaWi??v^1)q;fOh@3pIuL^#rIjnKY1UHRw8vY;A`MV@DUUq+_fzB3 zG!8yx*gKmDpQZ`%8Q{R@`AL#bR(w+XTT4%7{%G^z_T#kqa2XPy3@eXunh!4@ow@mt zW5Y@vA(^#=n1b()^o&1n_Suu(9*+KW#F{uV71U)@;#^|j-7mVsYeiQgy}ep8RgoPQsT zZ!CV5J#GB^M?1~G8Au@g2W;&8`_JK-;rl4{@N&6%)*&F69ugeNW_?}Ljdn&K$#KF%v z>%WD33;S;?61$G)sXR_p;6gqW3Xc*vN0(mdUI5-ff;k*r#Do-V5W}BhZ@5&L8@_P( zzxyn;@#h6JF$-A^Jt12 zhyOg;X8zB$@}CYq5~~q59je%j$8aV64OLQgU@60?Ac)L=dXN`WiOJYDs3+SU!CQm> zoLTap9>IUE;zinNVDg{qBK~uA2LJgp@&EecnE!?1m%#~rDl@JiPLha%lV{+?;3UnK zcs>Vt9`}F1&nXDA&XAw&u*FgH^FQEKDt?YZm&t^m{n@oqC?2?;&n$~4ncXk9@N?&7 z@%WjJe`D!!tRGLc>Y}YT>Gh9}6u)&ZvV?czpfcK$T2BXkVAEB5KA>b8)ypAba+lmX zENh2H1;U5mmQIu$ErHvdC!1bQ?5r5Q$ePCSV9Ht2ToQ6HFkjJAKV0eK?dW z8z*VuyavB`1*KuY*l6tal9dj78@}?aHO<HB50 zoxZ1Wa=7k)#e7RHDE#nPH-#e>TdA;9_~A3wG%JO(sX9ern)Hp5mD}hmn`Wc0H?ky< z&m$c4T@#PKA3M0|yY59R4R-o|eA=33rSF-GGN!LoR&Jy3i5qP66(dUm`c9z=E&B6# zN#C49X0!gxi$mGG7p&OZDa%Vp+4~oolt~TB?U#K0HIi>08K6%hUxUrYF3AjHTDzxjcJ-x+};z`qAV%&hQV7$y0$-}sN0@NY&)o)!KG z1wVIx`Lj^M{{kV5R`}mvAo1UC_+Lx-rz0fS3jeMH1-~n~C6@dfN9<%lkf_YNL$V9k20& zy18tO62TK@QSoPbAH2ShF?+l!mm_%XMv7)QY76^cWhT0f1PIAZG2;1_j0sD%npH0^GI?Uvhw;x>0}e%EVGDxdn_V#ga+R~J zlK!C%^PmOs6y&3PO~BfF3N7{6?AL_+j{ssM(i6ao#Og!1$~l3YWvg-aH?A9%wTcP2 zP!hPz!DbCy95O0k(n@!Xfa_LT*B6?!5)P^8^>@Ric=b)>fpJx}O=tu|-Be9O>qmy* z)WJ1=9Jp9YVChtZK*U>RrTMbP)klDGt3uc|2M&lkS`i(5bR=rVxy%=0rpt#F*IVn_ zb-tapbm*fNLwoiOFb^|p&s!7KmsWcgquWrkx!Utrm5^3@?j2#L`2e-&LINAFJ@0H> zefIYJmU~ai_H6H{E1mZA4S)uiMH51pDv;VJlubQuR%QYA@dIos-+%(-!ZgJb+~qU0 z7f)=9a+X21#RA!N_~h>ry7TD=oiBLnQ`2pCKHXS=WBV>cbyn!5-sp(v*}>hqlro$Y z^s}tcJJ5|%I-d)A8$hq?2Mu7A^n>sb7C1&7Ztqn9m*D(8^q#l-NX<&U)?X}MQ?DLU zB4T|zGE(VgoP%)meqr=HQk3F;OA#>R4qK52brBp#f^$EmvJF0tEt}Sxu&z9BCr;*P zqzOF?l|}d>k*0=JKgsb&aYu>d`O9beJf)14)WpFBA5ODj_1?MaOiP8+O1#@@*iZP^ zI^bV^fZ-qJfWPmY1B?GZ0ngfIk7foRQjY#ta(>vDGC)~BtCh7mjS!Xko1bny~pzoo<{JlxKqoA7RtAjU_{cii?v1kSTagp7qE zu>>AnL;sV#VjH^WF+#RGdRo|Pk{u}h`kqW$-z)C=o)~7M%u?Sjt#8O#zhWTXjQe+_ z{@smF;JvgOl=dyCXQjJ^lj_;{!}Sm|?o!GrR8Sjy1D1@kB*CYGTBR-X_!b5jkE`IJ z=?!y`A;Q3nfoEje;ZV%07!Kb&CAuh>1-@_~)FL{b4arT>gK!T$SG%cPU_96qTx(Q^ z8(JcxYROiGzI>K1rBJqNYZSt*ml0*0#u(xb{}%kvd0iF@k4?L|m{Sn!<^ z%kezs%&{c~{}T2;7kuwdy8kE+d_NL2{5(8268=>LzkaA2|4A13(;E+e4Z)uu2mX2s z{LN1I+aVupFVJF-^?o=E{@uvl&z3#+!EUQJQcuOrEuNc)QO9%6+E&hy9Rr8r)pGBl zUMrrKU)97bCQa;nvDX@tk?0b21KciP{>7O_Cn22BNxFj;YGy1DdG0|L-A5k5v+g6x zbl`u<`%7?((ZzY$!cQ6{w^*!22tH3oNuvZH6+jVp2)y_dQR54KW|pE^V?dR<$6D$v zIim~|i5pd^FU(RBo~-KZQ#5;$cjVDZir2fZTL}r7fC^O-b#8LI|sgPu>E))@| zWmGm&KQb|ZM223q6^p8YZX1imI9t|wBSG>_S1ty~Y|$evF#S@ex3{P?VgbbCuptf> zC2xPUtV4YU*&i78h^J@zN+7{>Dpx)+eX6~r>F6&Bp;d% zR(wcFPoe1F*)d*-i#p0L4E-GSB02!H_E@ND9vkFfcWQqD#@0gdkJ}}QK7IY{(ozc! z5e(X*TxP*~qMwSO|CQI#rGhXRmvg)4NjNWt_=Hf*uFj<5`abS_h>Ge-gppb-H^TD6zo5HDmb9 zyey@r>v7HoG1GX5E`T*YvnY6|>7ipKpgKMbh`b{4n$*jD(gz)204I+0$Zee^8xa># z7#=x{2L9-SWZsL_u4L9_s(r2kt;9y=PYoJ|#~bJImcUnPD~vbgGwa*u+=V@!*aQ*q z`FC;_=RJVdy)vwtDs%Cbu=oX>u zMaT<;olQeuw4EgbDW6!OI8$d3Ah~WNy#c|SyW3C_Cp4ozLq11hti)3cV+W2u+6E=E zZf&&NIKma}h&jLJ;DVT7TUO-6R z|H=D7-3ufbtS$#mM*t^_ukuw$IH-tzXdR871X|9~C=L7c|7-d-9zH&34VK4xXqpv6 zz*b}ag3;3t`-g=K4GPyZoRF#o15!gtXR;UvmBSJw=Q46qQVTW@$d64e4E|wS17rZj zsH`*yhD&uWFO`E=I~E?c7Xls&XJgKjD^6{$Ju-)~#f8R;MW4Y{yYRM8JujH;H|9tL zm*+^ZXm(@4Oj|Ui2t%$7le#6eSF8P%6B<9Ga!Ex*`T!&ST_j_@3NTy z$Y5Q0l{Zwd3C$X+WF8tb;Rx}zD9m4rh2V7$U-Tx0M7~5e1Tt9;>ExwR)dNPws9NR? z>_1tCswH(%OOl0(ip9eUSPu&jv>`X64keKSiu*5<9Mdq)2exIHWm+Xc5+I@@R z`)|F@e-dh3(Fbov|0n-NX)_Ej(J9gEgGJ<)9rn>Q*kOJ&5A5W&+<61RVlxFUgR7&g zKvAqvJhY3Ry?QA@dV92QN3>;COM(MnIqF6H{56%aEf#eI!`$jOrTvu(|MlE)li`0< zQvB~^=ZM1p7WEYE6E#3w#)jZgIG(PTH& z)rvtVuB1tw##o4(rmv#qK)RQgR9kSQR!!wGe|UXpp$}q6Q5NF+7Ilb08U3x%VemFy?V*fiYy46t^f<}M^yKzU@D(i;MhA_ylJc@tr?9+KvVfAECe0pk0gDyn zn3#FCdJ&ItKeS{!!J4hT&US~i;jGqDNgs)M^7#Nu=x{c;y|`r0gPZYSZo8HZk!F;5iO{=>MCo{ht;aG5X*47th)|YCIHrm_p&u= z7V<UK8HGQNPa9cK1zaVG38U59;ZbX9>Z^@=4G9VOt5_+e1pP z>fW~glMtUkRc$r~NHtw;bHYy2_^i#8KKX})ia6x7@Uz2vx4R48g&D(ZV&Zp`8{R>g z!6SEUfL)sJFj(<30xTUQzYH#*X)K}F%+j>zcfr5VGC(Mnj@%FUmZ|!6-CWH575p(U zXMD{b*$bV1g;gW*d9OavG@v&?{hsqx!+>2gG4rClGt7Ya??`Ou3$!JZgC<$HNyu9) zo*KvAe~b!Z^cP<>l-D;w&c*R^-e~5$0$|JQo0S|jv6&0tZC4rqr+xkvf+T6J?M$jt zE?lFc^S1%3YSHE4Z;`yAnCkX-ttmfmi10#mDEO*{a3eZM~joE*bQC@B;SY z;!1mPRNe7TeV9r=;Xe3{PX26aW9Lu#Sc9B?AjiTVXU>bwoTme9d3{sxr)kicZJf!* zi)u7~&L#e+TiyeF%R4dU_^r$*&qKtgYA80p*xps~X}}@$fLRQ&;)QdVPiMD_$ETO> zwezX!ILRk7*cy_}@}%MyVL!yZ4-M7#-QeWcZihUL{IkI?AIP)t%bByQnX@^-me>2h zFJI7^t+!@tKs4)xTL5@cRLe^F#r*&;At`cwTb1i_b7I&DC1(p zyc@%`p+nN_zi++oh?pwr%B4e-P<1y-;h@DZt9cyJ&n(|b--pQW@4*uMCnZci7 zAjiTVXU+*`&Jh4xUY`yAWCxwurkHHJ<`c~y6-A+f-_URap({XoYdCB$VlZod#bG}D zP}r0ou+9Kg_hvrxDAqL|k8Z!q&ZCbzXjRAj*=5+P0kV$=;#JSs*G!c_7nW!3 zW8cc5%!R9$H1*Wo1v2VF_#pcNwI+Kt7W@DLy8E9HE(Y868q zK8MWxTAnu$voUWNi5zbAmsWpfnsaI8Nd|^c^Iy=@OI>8v_MYt+&&n@0+PmLJw)S@Byx7cnI>46KAB^@sIOxna?h*swMVoX3 z_q6H@4^BB^!M_NNV~p|dV7(HQzX?xkv==qq!BAiLP`qOY1|uTSDI|Gee5)24H`YpC z5j)T#Rma3>ku>#3-)bknb~*IN$k7IQK9FbWAI_Xz&792vmU137u}RRGt+&b6-pmA5{1I$L8}_y{=fP&q@7EH4yx@;F=*-sAWMeY`l=ikuzt%vPfJaO3HudX+I4p>H zw5x$H$(D-a%0bMdwteF9==PAEM>n+9-H!RQO7^$N%0blKdg0AnUz3W%7arng#W4^i zSxrzG2xWH($-bX1h5c^5V-+gKC`&3Jo%Z_w%dZ>`cy z35GcYAGV|5!=@4c?dq0Zq^v|r=XM^?tv5CuR$g5@=(Q|V8?OG(wqHIBv+n8`2=kS` zp%zxB)8R)+`SMABWDJF*KBx7t6$9|<7{4puboRd(rm|AG%K7fgBaQyI8CJ0DE*%K_ zy1mp56j7I*#@(RrSzb@wYDCae1|xq?#bw#@Q|VVb==cCci_2w88lwJ+J&$#FQ5nm} zJ5Q$2f(;cP=FDnCWi3f_X$1}74+ie)q9oqHNBuxM5&=ur2d$3 zjMbDiAbFP+;Gjhqt$WqIOt}HKOlJ7anq}rv$`YFHt&6B!@4CP|D8Wop89t2z=3@iQ zSt{2n)Bq-NTOK9U#rFWUg=yK6SJy^m?P|~Z`J>dR;>v$EG<;q`kDuq&?II}w3Gc7| zs$tG%3tX`mHP6ng`#@zlj9^uZwKP4o@#3WCnHLn(LV!M^`F^!H2F<2e&A8T!MbQ4V z@)fgIG7Y#;Oaw*M3_$cp4+3!;#wsZ_t?Bhj)C{RX4k5;GYoML7^jtFq&nH=dy#rua z(BnPIVde#^M7|SCYsKS^z^1Q}ia)=uN+l0nDJKJfJhX2&&L&pBQGL~-yh(jS9W7N` zak*kKr(J|NggOeqwx*4Hfzxin8h>52BWask;}bFR=#2w3?_`g?FmbNO&cNwDtU#B^l(fqVwl;?!E=6y<_M z0+!^|g6HrKDdadJUgZx}>|%KI*HhAZVpcdpkK&=uTUB{l7$7)+@1YHkCbXXwH0rKl z?zEu_AD+us(q9k4N_P`Hdcna#@_)7*|8wcoC4y>&Zf&~fPQ_XwRVhy*AYP*7yeLQ0 z3F9I|tG%DfUNCj^zTQe5V~;0<>xIvE$XO7r=-AIVy04WoR0uc_D93vo1h~D)<0IR< z3n*Rzm2Yit+9X3;x-rc{h?Shu$W7h?S2;^-h#;VnV^k%M^MD!+AD1H8;J?vQ5^3;@nr6+-O-J_(ykn0rS5~|n^?8E$*EgE_)UrB#q(HulMBlLn1tnG2u5lo0YIIaPA z>tVk%)SW{a4TUMhKsf)Aw&zJy*Ta#vSe6@3X)PUTn`F7~DD7u()Cx0i9>e@ArG4s1 z>wX`nb*8j89BGC3bK2XKhF=@Z3+8g#(L}@Tj@_B!-gWsm#_7wqcup7^vmoha8H{DJ~{6faWCAr^ghr*WPI_+5qH8vNGdH@EXR zPcQtQhu@(3)ngz1XMMOA1WSGB1vV=%PcS5y{B4N+pWeQqv{|23bssTnr1l-&Mf7-{ zhCJSXR+2{!sFkmhRMR?EDTT+>E#&;PSSF^>l)GBA2}EI*VMBY)EXijBScg}6{3QQZ z$#v`UH=(FUg+1fkkWDmXzW*<}>tNGNY+&XJ~{CBi_FhPP^0bs=+38-fIb4DO#A-m53%zP z^2+y%+>YHNIzB1U{n0IHlLYRknE05-6Zih;2d!99q@=jJe*&x^>xIxbd;+v`qj5Cm4-UW43Nx!P+z1T{r_ zy?wByz3#+|yS?W9uiNV_L|4b<3@J5z6T1C=_9++xbbB3#wn)`pOVC-ke?6Rbd-Y6& zRpR!l!9G6SUiY9a99X&9t1V$=^skNa`qz;@OMBHci`QP>CjaC9)f&;{8MfDIjL^Eh zZUEH|&bazlHtnZ?KHTwO+U<12c_FCb!wAT#0xZ7*{{`*Cuwg2^{@MF?ZroQ&mgR9_Qoc{ zs$C+iWP3@h?Dt`mjGSRFs+%r*p` zcQrjd1*W%jwRWfJWHn0RwUC|%er;K^dXb#%)#8}}v}P4WD5&Y^S#UE>HIW`9WhbxB zlFYDskkYZoQElJno&1>R;KxX;N+|SwKp(4`njg-bUCo@$0anM0IkWXP*>?Og%@6iO z3n~@!ecqN=^8d8mn3C6vM_~hlBWq7{bEJ3%TKVn@4bqDT>;N7p!67Q^@iFw9ayYx&P0hgcR-TI|=-Z^r9*WbwbA;9X` zF(<&EO@Pr?H1AF%`Kfu1XN{E*S(c~RHiLUYi~*(K-f}oJaH&AlvbrNg$G>5269|o} z3Fp^v$syE5s>NqZX_mR6eC7sENz=M_Ks4#DcR_zJ_j7C{M4fpuXVHtOGq{QoB95P^0#qm z0&zYZp_UTY(^yJ8HU6`$a9uov#H2)DkIxtL{gk=-CO5pAt5v5>b)R8XA;7YQtLkskgZ zd+!2gWA*)y9}GsFn!zY)LZVcZP>4!$a>-?8LMnwBGUOIBs3>DhIgV4p6s3|>lu9Bq zMY&9jQVpq8BjZx`=?p1iDw*GVt-beip0m$6GlS3P`+t3Z|KGe`&z$G7_S$Q|_u6}} zz4lEVVsRDP3V=ea#ZO4E1qu^OQ0Nw*a1S!ZPe(br6e|o65~;}|C{_G1a=&c;uXt5 zZQa4HAfA0+Gx4lz%x@Wgy_Ni?NWQIpHz~UXD6auqJ%7+7OA5f=WrfD`N~#*>BNw=e z>HU)p%#9}*%tvnx1@p;td<>c^d8i5)+Rh1|BI`Wuo+}F2uLtVN$jWP}T=q zJzvly>lA>k4eCbO{$E9Ss??!>Zk-Tp&-8y+U*l>y50!B)=?G|5^@*uu;Ytox3J zr@5N?CHnqAz(COWLcWoMeotfE6$s6kQ`O}yT0DNUym(R>76 z%i(Y;NEvx*U@EIbA{Q7qQf0Iv_^I+)mls1i#lzGDW57Ks!ydzBDu!V5O!`a9EB^tr zZxl>rm+|7nbEJoWb%l;c#T>Ae#n+E6k7EMRW(im4ArjQaPs>nwdJVXM~~Z80h9 z1t?D~B7KnSD@?LR7`jvncA+$gF#)BqR)EG*0c7SrhZVQT_d#7zGU}2KId~Fj&UDi@ ze*L)4-U`;2O(3ZB%j^EZax?vy2ByR7PH%w1i*()0TetV|Uo?lQXe@Y21VD6X?ocFA-LD`*){RcPRV! zS_`XfC>*Fe^jaK~^3XLF19C8EtS)|uHo!Dw_Tm z%=EV~?2r9dTjI`#xVAE5QsxFIUjkcgkC|i}12C=wZn$T6~8kc4f}-0BOiSo)H#=?s>w2x zT=a^s`z<^kXn)SFYV*I)(7Z&4`rZ{gUyypDvi*q_56>s;?CnoyZhy!qknPWNO%-;r zq6b^(7Ir4(r~qXW*y^CBaOE(w;_kEAl_-F{97*t1v2S5{YX{OsQreMx;dKH-70ACk#>q*?Q zm|H$()oN}YFd{e2euPyMFD6mzv*Fyp#0wrl?s+k_J{(1uLl@<#l{L_aBzV2VORQ^P zwH{tCbGR3)F2n=T2c$gf`i7GyTtjl(A!|x9B^j4nCF+L7l-HJ4n3Q(~C_8|y)(Vqs&=nTLzAz1>R$Qem*yOLQ5+%ephgd64 z-HEA1izw?cD9LU!C+a$Czt>RK(^Qz?%14Oy@YDInQs({^$lS?cGk0t~%3Nj=aaK(; zH1)__;w6f(GDMjMDsvx;N9MY#9YFaCb;W1+DF>CI**~DV_2F!A^{`ZTY>wiJ%4{Z;x^Jx%lDk00a$6mhAy8fSImh`%2{ohDohx(s;71r2= zNjWM&nFO}Fq?=?DG{mU?U)0!jr>eUdG!8X$tQh|}0mvgZLi~d5-2mXV15_jMYyzrD zcBis!udD6vs3zFKH9@SXj5-Nn?sz}Y2&ir@8i3U)V2G2EdPa-x#H&J0z*w#&oJJGS z9dpLZYXYiav7>GRK18h&Tubz?i&`S3vT6c8>>W;?a1}_$gSIB13LcEU1gVYGm(T6` za%SzpowH3XX>7Cy4>hz(*yY@hu(ZUa>=K}C2DVyDOtOSaEru=_=CXucOJ1yM&@E_* zQ}o=*T0(RBgjkPF-H_uo?m?q~Nnj2iWiG|_)tFS*V+iT)+(!k^WODyqI+3L6OFe%*u%F$q}+Xs_u zP5`ziVG2t;*k8T$Y3;9mYO@WHO4w`=TKeXF0L1WDzfORJ`m1C1hoHjxQJz0kj)%lY z91kf#xsg4Ju-#(<8%nFvs{?oyc46OTaUZAE*qqf09l1*W z>hcELO3^cCIK>TnsP(>(q;V@)QT_Lr`8~jz?JoWCn=ZEUd(v~P)p|VMq+Af7{211& z%*ck6$glEj+1F`5XJ7k)$i9~T7W940Tf7Po+w|$`rbLjT>aXRGwZD53)}vk9+w8Rx z&*?2MKLXsnq7>^6CscU%t}lwLn52^Fa<)|uy0i@JzZD#FK`Fwgl&dWEC! zWkxUk`LR}ymR20)b_Qg6MuFOop-yGmI+^qsCv~P*eV101yQ`%frI&sZX-n6gaw}QhNNLk*YW$Aj6Me~Z zzea1bxK{q_dHTX@yRKP=&w253Z_)UE*dMdUPlxrfMU*Qjna|@5HA~SBJUbeL2tt%b z;l2g#9~eG#UWB6g~XThc6N);h{Nh?zR4SwGn{J!5U6L6;ddFh!EeE7^OM!Y-jTs_B`Q98s=Kb=;lF59&F0_w@67+0P4?Z! zkog~&&V9P`Kd|yJLC^odN)BsqAkzE~Ck+miKmX%LG6nVg4?Iwri<0ZzE7rb8p6@_& zf@J$nqZYZh;L%pUh8a=b42wm!dwP%vt~9yD*d3@*V6_Z+1Ut?g1|y#j|Ll$1uVdw6 zX;hd4mvA+Sedq%%mgg^31JWKen7;>-2&bZ7`U60)g(Q9ARoGlRiaB>c5DZO+*^TDl z_Xydu$XzM8*>%8!i^@2&ts}jes$)eD#Rc0T=F6=q@;z!#n^!a!gb5l0Cpb|tX3+QG z(HvF(RV=@(@o%V)s-PT;OYP+?mM9AB%3Epn)nc7U4IVH{!GwU7F3NRl@&Iar^^6IY$8JAw!pGK}Y zTI7>jfbgmFiOG30xbsyl(9`B&wW6w2IC&9KHvM;J&&Pk1H}H0N@Q<2ivc%Jbkd_lC^H-i##!nN#XIVy5d20^)LM1y@}yFwJ*Qt&53d zsRwKVM+XFE-|n@M1g4f#3tTx!;KCRd_#6B{V4ha*MxCT96(w-UH0?SNnBcu+mM*C6 zq((c%uia@WT0WfVPVuoE1$T-%ACl$DMOcU#avDgb$*^2$Isgcp%pm(286Hbhr<~I~ z8^SptKKYjFD7A8F8Xidf182=sgn{tu+`%?CfOeWh6iVA)U5de$8rcDwK#ql>L@5}!Q%iZ%y`z)hxqfYLxS74hrT(x z`XF-utPtvh`de)PwW-pWlxYXH+#c-yNhcCS`7b@+Gj<`eKr8Jl|rt2BpK+4b1<*)(vbg=a$TS zEwmRubqwpt-Q$Awq}$h0Pq=31^dFG2l zT5MKq0v3w>-FB;F%Jy@gz5Q%x^*$>;o=W)y-l(xK-#E(g7%fr3d}CU+kvfQ)iCp{Q zQ?d+2t1S(nqd~&|D;qxdSLh#vfw)mWZ{;d3` zOnk!W&p<3T)cR8!x?$lHL4RJRbqnR|&-^cJ_}q(!5PTX%|Ie4NIhX=ohW>=Z=N8zr z8lR&`dwKXgjv`zEd?szP;nN-uA^42@{{WwHf1Nfy4Y2r8wCP(;h1^#vAU$T0~`!Msu&kntxzYUKyb5 z^_aG-cqhVv%Wa0{4mqjf;>8&4)LX;-G>$BL8nltSC-TNR^q9Gh{$pbuxiuU;U}K%Q zQTB~>O2nRl2$(MfjJA-i;ciRjZ#}|o4cBE5e=C6L8?rUrTQXehlVP@o>rF$i`C=Ek zS0P)&&6PYC!rBYo8t!k&u*$#q5VSSirBeEpb%_8=Z%3*(-i8OnBp!v(;$F{|I4{>D4=YW$dzjy$sE9b zPV%Rv{ArJB5-%Ier{?nM0{PTHK1Iu?ns`F#=ULRNQF*A+@Aa|(chYK$FteoY-Asj> z<}4r+>f^yy`APo*@NHki)_$HTzKN;x87YisrW2+b#db3-6#K>|F^aDw5Qyt5C0J`P zISsd9KDPpq_sVlKZowe_Lv3QdI3|A%$)Dqt_T|Rw=9}U}M_!10TJgv+K z16$)yZLl58vtX0<{GI#MBTWNMI56!T! z#BO&=Bm0Ea$UiVAx;%}1hZ@j)@rL|aB!89>B>7^Fe0o7XO_xtoU$lO^emTDVYD)O`(8Kihe)S7 zdU?~t1kvRIfnm95oM=&dvO~0!PjIPVfmUL4tF0c4Q+A5}kcQw+?2DPb;l%gn<|m3y zpB$zWmE64jBE{jQ5kGe{?IoFZ9ScDNiN!poDAxt`K7iuyDt2cz1f|DI{}V;seCEUb zXG$1~;d2`~(X@v0zmnd&hT7BHO+J;E-lUIDJH1$k7n5UG~-{f_to!*#m>1~TT)kyD}_5a=UPE4_T~RX{ z>D_{&f~eI3N)@vI%q&`o0G9~ucL&cb zRtARO^lmyzvo&3wexKAi@HK)e(`1< zq4~wge1qA}W#kt-uRg(q$ zV*Yhlq$1akwa{AV{M!r^45UKp$0QUU%D)@CRXG2?!u;p3Qbo?c$!Ikp73W`zP^m)l zZ!HwpmVcfW?$+Bq9i!Zxw}%}{dwaDl3&-NY%tD!ejh+9)!I_n z8uF&R{F_6|6_9^#cBydw#YB=Sa{jGF&8_oqEb_*XDkT3-(!v2-eOXTa9eUrEe=G11 zKL6&OZT_9EJ^3>xN|%v;(sD!nNjIv!n}gN_NU=S6JMzXtiitz*$sH(6lz$i99+ZD& z*^|8^NhR}7N)>ERo)ePs9X}!{xaVOrh zGLHQd$DrlXAL9h;Tx=v5Jf9*~q~B}$@1uD>1+5s9>jmceX=-#VEluk>ENDK3NjW?~ z*$Zs-dPI34Lt>CLf6BF>}ye#PNZ-yUEP=a{y^qyg3ZGOY$A*td=?+ki23x(ykV!U2!-)FpgX5~?G{4(+J~M}~ozGkV_p=hA zFG`r4VW-Z@!g}7JY8ByM?gjPbp10^@oCGTRx)i;NZ__6-YWtH!Dz9$5({9_x+z>eV6( zkNyzfhKEV{aDeiDu+{CQNj5D2+eDbfvOHd^+R8X`idd8HC%Rb)Wi$EfR>mb|IdHi& z9J#d=X;4CN(LC~+#K*oOp@R4f?QP<7z|fb>Jr+J~*~+){#iYDDKzTFR>h{tkOV%*P zi8k-*_VQmSSop%&m?SZ`nvKB#-wDM)LI~TGJ|sUz1)Yerbk&-S(3ud_<~A)g)^afcZi&l={`2+rqe`cI~S7qz#W*TNsbND}YCXP+|*_B?cn%Ue$T{E_ zTY&N!u+{sgm}E%-*t)=4j!-^(WZ25*CmR@(=rv`P&%X^^K6~+u%4b|+%m=pGFisZI zfBnIQbd+Llb=rY9<|7o^{l|2yuk=m|D0}X0Fm&~5Y&9b^!RtCUwTf>sALe=BTPr&jaHqgp{$)~r7@&L^Y<2N9$u@mwG0cHcBD157y*oAdWy%T^ zo}9-mJuMbjujf3W!AsvTq|}$pK1-)aCYMCMcxxDyXG%E*z3BmRWX4RF^WyZvu3|Ct zBeftbCX4oFB+^g~O#I;zj@YYKF;4aEGIr0L)xR5013j z9xvU9wbhGM^g-thvp{n8q4rR-;YDlSv3{&Mq?I!~X_A97u8PGccyFypFBW6rk;Jld zPtEqR>4PCp{&Th&FJKEGAdhr%VhS>>HFj=_oGM{u@)AgLa-f!}Z;^+m2)Zj{WhXZq zMV=aBl5a2KwQo3>kyjUyq5HJ^d8zDHqfycF-`OnxYmNGFJiMc-|J0Ow0hYpcf<;E%EEJ)oAx4gpfG7QnQm0G z`1)GLq?9VgFqm}d7>vmp6dW4(LaoJktcRkahVrfhU1@F$JgEu_{N*MI(Vk8nxadtr zQ0}i&7%1FG$x1ILl>A5;Z8aVSoHRpT--@}aT^mzPhn;wM>kum3nBp46F;PEFCXy;Mo z66S$z+cl4`4T@VYW{MG5ZlYp&&!Fgi5mSgjEOG=Vkd{$0mfNjZ{A2AxjIPTJ4nlev zg&!S_onjbyAFv>H%e_TspUSVa+VbX{w4uHwVCH*Sar}h50Qn+1teoR&f*nrCz)m3) zUx~=5h8LK~y%t-Cw0Esd!?_Ci3F0GO&4bAT#oj)Z;&GsczcVSH+_{-bbEOVl%3TwJmjO-jkc+VpTf9@@K#$5+Ef z1?Tv2AS1pXR6PVW@^pueNfscE?+9X$?PDxO*dY+1Y9HIXqOlWAKdMNql_OES;Q=in z;XRP3it*H>!Fs++jB+PL>HBDR0_;|ZQ|y+%MeeTnh!;EEU1{80)*>X)|C5Jc`G5HQ zU!*_ie|J95Hvet~tP@$Uy`9ce3V;Z|h2dx|Z5Dj?`!aYeUxIk5rdU^Meof?{E` zqTqGv%(m)i?_rdGf$yt9Ogn<`bkr7gX|0^_bdM5+urw1=1ux%>7QGh#Oa{jmewl}t zsk89!l_9*^Ferw8YiFb#Z!WsAQ^*Kx~s`aR@2&vBc@5S6fe+P3rzIqggbS@(`T6p{{&%D zZ3*9>5Jn$Rz5u}pOW!}gp-`&0=zO3&NI`9BW9+t6pLxm0{1wCcwhx}{0pToK#05e zv4G~Sb&V2k*S^xs^$p|(xtK8IcI9nx<&gIHYj|8a+#$)qO?y|~l=}Gf^ephkWnftz z?h5HnT=Bsk^sS@)+qbxu>u}3C+;SC16U5QZwR{R@ODu;mDm>ky#P-hAiCN_7xk&ud zhfL%2IFD-)zT#jFwe#2EY7pZ6Ev|W*>pbQ=kPDkpteSXMke~aCAj`ozoIU$0y)D$dmKl)NuKs83rI{ z!++8HtcEPP;_v-W@-OIv8Y@`-=4Zu!yA7X>iDJ$ zHiZ9qXUe~d8b_{-bHWqEv!R^df5Je zaMGl#7ofZul+y8ar8Ojp*t!fSUzeJ{^C9*yMtyMjqK}RK^cYml_o7@OE?j^-i+ml6R9Gx8fR#%Z=-8Twmh)4Oc86r|WF$ zr-H=&fR%ysl1yRW>=T1F4hvbGDC9t>Dtfqf}nEXC=;@Z&LAmYkWk>4UQ_>31DbeF>&8bn-2`bT@M z0(7q#oc}U83(0xI%HyT}M`^GON2UuC6>`QfIWFM?w@I9{-=|aR?wj%vW(0Y|3 z4Kfs|f1H6v7kVKs#b!ciUVW`878`hO6OT#sLNuzut&Oj$LH@kS-Ob!H-`d06zcn)b zbCdgr%sowUf5RXzG`WAy+*e~#1<5|iAn#enNNNXqAwH-qW$$K?|6~gD1q<_>66PX< zJf^n6{ZuXDzKeFrgfMmDQPn^tI}!k>x0rw?+2KIzKM@%MPa^JBY)OYrsRud@@b`fdO=n*B&X<& zS1KPpoMhF1Cywa9vlKtlvVxHQ`|8PN!kl}}1R-ST|y2 z&ZhDK`Y4Z=?!<~&zm(3%dO^Odq86C@vAhE`mAzhySQO$h<^v`|zqYDxA709MXl542 zvtYolrCu*RipOT+SQeyVLT8@Dt!G9E@hQRD)Zfkz;l@$TN^Xx}G;naV#( z$uO{$XOiT9h%-rY9;P!%!c|AtJVMpcFKIB&gUT+hupSgeb{!Qi(I9Z=%OaX|=~j0=vQ;<3>@Umn66K^BA!GX9thvWiw$yK;P< z(13%&2K@UE8E~nue`t{AVT0VI;+oHKE%Y@A4R{RQ-_UgZgt(4k2|wl&yJq>Q;W5&- zE^M$92&Pv4XH5o@zIQ@HW`+&`P@O_UU8q7G z8-bBlQUsZC+VM7fKD3K{Z|_Vv3~eGUg*NpkZnU1#kYQ_cIEKm1 zH-O!I_k*9(H`b{{rPckK7NH8EAmYZP-KD;#5DOXNkK&CH+r26_slbOC1WceoY@s&` zm_WOT-&>fdt)k2(HFjrHDMbxe$>XIvF+w&U?_(WLg4atiiVK$_*(hXQFSE#b9SNLL zfWmeZih_gP0T&mxPwHWtd$mC~I!UGCeuz_cd1^x(ba~20d6N74fFrpEg($?afe9X7 z$8GfkyJ8lFj|(ElWzlv-Hk-5y(WUZrr$~ZncZT6xKz!?m(zXr5w=vS^`vaYe49gQkA$IhqQB^SK9n{pj0{srhS8z4OAm+Q5O*PHN%i4WR!E$LwtFd?lut*g z<}}v!g7zoH`teW!uEMO6K#p-P2}|(J_XnN={E%bb>}a%9A!_%QfoiAmNlUv!{QxBMT6R*i_s1lMRi4ntQcfb z?F4ztE*o9#W#dR_TQf-V^SbgdQ7yESkpUDWlEsA!4srQ+47ljlV=ffh;C6}P zCROs?dS($C9VkLwsW{O5?Xax}EGTY0nxUyc5lTlnK@p-D#rIg4Aqy|Fcw~{i2$Aut z$G2n=>JE{$tt)N3Hh1h+=I*Lbf#cTEk<8s&5Hur?Of2-iE8{_$yETB~T7=94UYJGa z$Utta!acTXa7@7cQuTfW?&qub_v3z+dVeSGC#&~ea8LS!On2Obdr}MH*&6qhAMvVoulU3WJhOQQ*f=o)o@+1!-wB{@H-n<+{ej|&G;SsNwUL> zD;L+#xNcgX?5K%rIIe8E-;nIsfZr(_lO6Bk+Ka39rew!NTrOP8aqY!5E-%?}0WOqCC2a zsZ+SP-_N=yWmvncx()8KKjC!qtkPlq0)!e#dADfs)@+^ZjdHTCG}#m2#KVI1>N zdyHBBn9LPRd^*)-!}T@r@qa??APsu!)dq6x+Kq3h0y;gu-zvvoS9{>kst}Leib5O( zBD2q$kw^VF6x}Yw0m^}XDwVTI2(S~_U|`)b9rt{u=6I=ctUv4V0X@#J^Ra0U4i@>1@<&C zE-Y{f6gST6hF_X8V0)hmWN19XgwN1@bCsK>DlpWUdI-57=j6gGvA#BqGoBNZ^%K%g zZi)sl*VWwaC+HQVBnJhlfL0@U^6TrvDH$uaxM+GX`-hgWe`txvwWPgk#guLobP0m4 z4c4A%#UN(|8bTbh2tkjR|JOtidDp2eQ*;7_|8?wKPrWizj@h$`5gkH%ae$FzM-y*? z82y!sHgGRu(ya=x%^IM!@#N>w#t9$^)yBpE4l0q0kED&WNf)EG1#~eM_jX+*oss_7 zD`RZ_SelE$+S!)$Wek`ocSyL|R6twwpYk)%6``g5T1bLvHCtRXqR6lpFzf}?Q)=0W zro0qj?moV$PMO$!DfSV_7a#N`uT_55)|lyX#yWS|#3%Iin9AWoswfIQ39$@o-mt?` z71A+CDyg55ygs8YCUwue*`1M~B(ZGNPbgJRcUA|=P5$rBqO>Z%jK@n4=*`87^KUwC z<$|1nb??%kWI`4;qADK-WzdR;06C7yb554>c zIZYbBi01u#8LKp&JoNOUIgD_n@tWD1!guu z>dq$oxVOZx!sH`sBvH(Ubp_z@rIHLT&g%p;2jipvF`d}z%|c8G;))<4yetG~BBFwGmBc}Zjlw60bL~P16xm%lz>#^rAj zWXkP}z`^A&FqBP&@5hI!@L>^++0?EaLK;xC#YILrYrsy{fSqXn#OnG~_;yZ7l*<>2 z#Spwe!MiC*6}&X8OxlUeC>Gu6i!O9UROpIyq3ew(SR2!;w_NXA54rsdyr`GA^a^ST zbe*gN%W_c*fw#C;XyI0{a4RVIE-#gf6)~Afr1j(!$IJc55h@o;JUy3)56)BN;%cJ6 zi#q5DsB*!JU{rNZs-$C;lDkSrY$JA_Da7L&NmQZVB#e70CmP%@e$0Pnf%sARh#co zy!Q{2+D|QzU1X{KzGN#x87;RM_6WCtLPl7BbJiLo!tNX)z4c$}n}?sxS)1^`l1-*7 zn1tR+Fa4k$(D_{SKO~v4u~ArM!ZM!!}B*>`$e6xV#y39!}=-)R{+qLplk179K}n9E7TQG5%>n z?HHo)@P8}@#l2OrZIBlOO>q@A2=YWwJY_8m_-ia~P# z0=0h=Wc!DSN60KCFQL0{i%1Tu>rOlnKQiW`RYmZZvZ=FcXsp?J(B=f~>@~4CRaUpql zd5wH(BcB@L3F)WV6JjUQrqdth&{`H|5G{QOsdsK11QB^It+f5EImMUqhXQKkUhmEo z1Qel+hV%D7>3Fv&#XIZwH2Z`MiZ4nQxY05HRH zG}nUztWwYV<>vZ|jT`u*sg%Pe(=)>hsEID{%%*J#*m_!q&}5Byy~JNEXbW?P1dfEx zS{?0J1PrU5u{tHaK;eHdV7ifaOvg`0K5_h42BeQrAlB;`Pu(kHAXVzYP z^bJ6j>}#XSUy7|EYgDE5z)j+z`gGf7A0fFc;e zVl01eNGu+Wz@jUY{CkfCAcR92fBp%deeEJ}=)oi(F^6zMOych^5R2nV`OI`AFv%ol z!G$bDj>$~XkC?m{fk_`GX~j%b(K6Z0o=Q1R-C-wjqJ1Su8%=TgGl}nR!UWb`nEGhC z)|@;L`5FZA@n$zfONNr6x;1JH^LbFJiafY5ML~o}g^7AmEX)9emW7F!iyqgbFi}+( zPW(X};wlzDR4HbY1p(?CRyI_z!3Ag$KKkA- zfkgzY$q%L~8nrM#1D|;fhpiN=H5?BRTde<>c}g1v+<(18caj#OWQo0Zg&K^qlXMq? zXXM2~Z(%xKM7-dh@UTyM2}0^V(hA%w+i~{fZ;~DPxaxch-!HCzalM19*LTT|i+3eE zUc~PZ{KkHt>`20ujq5vH1Aj<%T!d>GuGAkf2Mxb(;y2ho)+*NK?`R0EVS98Zax}Lq z058)XC9fxFV0WMw+_OM@_Q@X0tc1(pUZ=7=(we6p`EH_vNZKr+4LxGT!0K>C(2IVH z_m;9zNDuY!)sGrKRy2rF-*3S8%qelDX@gVyta_Ar9DNl$Fkjv4ErOVdqIQFS(V318 zJ;4*&S;><{Y2m2+uk2N$85B;u&~kTaYTH{UG0&I5Gc|6v6mkw8yzDxO785?+gWe6L zlx<|XvAPQd;x6!j0?EF@{GX8Zzx0ii^#l4**3(R4WPJlX*!std5VQcSaYN zK7C}Gl~tT&>@VF00?r|FyyUjRlgc5ls|0EsEuQca=^zmB*lfoeT4y=6Qj zg}-6e{-E#=1cxs-KQ=G2r(fnrORQBRXLe8L_w_Uo>x%%yvO7&6PT-9#Kk`AP^J6FO zL-M0Qr>6zs(Hc*dez4<0^lMsT%a2&jk7HOn-M0j*sjtaXnY)md%G;kpOaBst~|E~$#W6uE2hIGikp+z!OuGDPP8ODK$1;MvS3n@72plQ zMEX)}ldHrgSH<+@hAT>f@_T~fto_5O_WF_xJJuemP;y-Xv_r=eP&C^Qi{PKCg*XEK zDRPa>?oa`@(T|Cd+(xfF%5J0am&wL$1tvGH70bJzR~VZl;-VPYDz2T_7skJZ99uQd z<$2s6-uWwZV?Aa^Uai|jZ23e!AJr}nM~n&LRkU7EU&Y|c@T500=_Ej6k;0AU=DE98 z1-e$O=?tOxrL2|;_9K56Cxq6a8F|z=K?#4xN6KpU>F)x$_O~3sz2R@kC>9WabEqzr zhZ_Sqw8cdoIJl#V>4)aY7PI$@cRr|@M)(!Sc)f@dU$|x+@De7Wx{3gY*l^Er7*518 za~=JUih1&WqU2Yljk5}WPIh4E1C-yz;-Fjc`&gdyo**VIpc_C}LYpn%dz+2_lqMyJ zqNh$$6DHsDf~*l$>GOOJzETHo7ZeYYe3g>>?;TNv*zS#?RR1$ZrFxnf z@Va;Z#P@qqXe=;BpgJrPOF7_19k81{pzm(bqkiDpobnaQu&b9;hA{_V6XE&^*ZBZ{ zC@wDVM?lBbPVym(hl4&MJe9!`f2K|qNsClfR;kjKn*1%hy+ug}tM6SUvK%=M zq8#1RQ`M7Jd5Okr-G0R3zVV$cb#orHKZbXmi5E2#mW4K2|+}HRL7dq{D3yEmC#B^g61+P834`7_CV;3@}vjB+{ES zY1(DF#v$vxg!=d;o&@Q`%I`rk75kfoBay>nuYp8Xa@D~drIyWC#E>YS#{(IXDCDjp z-ZTsLluX3HPiQoNs>W8CQ;HmqT|J@(2{r#(xGzQJlww(WsYa!}x5Vshr3GBaa#GLh zO;hO+W(bG*GMU4~yz45K6)6;iHCySxsXL@*2Xp}WkMZmm?CsAYh|k*HhuWW1h+l@i z9-4#CBMyvKZgCYNB&w@uvCE+|G6-Zn%}0Wq!odoILDnP^8~z5-H=9 z4JS%Bi?oQdZV{XvBogDKyYgXi@^|G_58)^(gj22z(b68mmj(NWGOzewEfjE?r-ib% zjhJWQG%pNJOF+;1)DKZ4h()(m04M3!YQh1=*aP_fU@u;@xZ4s5`ZPm}WFM|pIFbLG zhR5tUE!84z>LT@NPKm6Q%F-w4DSJkSm}w8;yN`r|$B6gvaQ7|n^{~CzKrhCkEOoMoju?9j?}r?!T*LxF`2k|fcSO~KI)7}+~Jj}k*(*JnGU z4diCXk4}%CnQIoVPN`hjhg-z5b#i+LP%D;A|J~U%HCRm$7EimC0YHUM_jlx+*vlHi zQHr$A`{PLK2%UWQmR@|Gh@VH^GeGBW36AAA==k|!u0$vJ@g@hRg5 zr=_Gi+=r4KlW_I^HQDiUG5Sb8%>Bf3Yh2IcTJ#&{&f>SnVR`Qa%@N%9!@FU)4j|k_ zf52C0_2-qp1N+aI4k*3fX~(uOV@N`~y;>H1>i|9Mn?LOKjq*n#^iCjbcSznHZUz?b zXB7`PNQr1Xxn56ctJ6q1mK_8LFrSc0KS=K8!0B5%)LBPPPbU3%2CjI2r^5$MvE)!!+98H zC334yHb>#{TeTg?c&>*eZ1IKqs{*rL8nUvkMM$Znl(vX3*0PXnKY;E^Dz(Fs<0G^aTuPXUz~hB=~<_V*1nZT|AQXw5h` z3Qs~kHv{J~?eAEb>{yT5Q|%%|1pAxM8?2$MaQ^_Rti-!?a1UIBN6;#X9kd8roV>$F zui76;Ct9+p{VnM0ye7JT1@9Sxrpcfja>J;La7h0xYPgOLn$_(DPYSt~l zLz)$FN#Zf=4T%|QzVmBhW=?hd!`hh2F0O^6jU#crQgZFaYhrLThUogX z!L@xH?h2X$^HTo4J>)5O3sH(dFv?7^xc%#n)}e7 zxW4Q2D6U%vF$zguIm3`ePB$}dEv6`vnURJJPw;rjA_^loRk@sne|A6=i+xR16c5NK z?(k|e1*rVN=kwWg<8Bp&vScEPzkqlz^KD~`E>4_diQk81Bg8lJS&=s0|DGqsC&L2b z6J=TA-yp>wuA+EjAR`3vyIN7m^9pTIJg=fqB&PV5cK^_x#XnE+zC-c``fV-V2Tf>h zR=hh%@rg2w_?DVaq$n2q-eh|+PKf(;1~;>!IQEO7lRr8MAv%F5i>TCzMNa4u?Lnn_ z*Rvg9$rf0gjG~K*B1=Zm$IGp(RL+{qjAA;8qmV~vF`YVe%Z!BQt&o}b?u|&tBHun} z6{&wi8A%T>+XONa=bJ_(wK)=O89;VJm{MTPVo4(AOMO|2`KJ3Aq_N(tC<~;o-Y}Sd z056wE6F9}5U)W_f>Bt|bElXfnWUizCj4IbU#(Y_Y+@sfy9Yl zq0hcM=mjcbZ-??K;!BBASHw{@QXJl_Vi_^Y!Bejr3Hb9I$@jIx+U&lHL{%Xo>g?qt zYLm#6oknu0FKvqf`q_xW%S!`f4n1#z_>hv}QcH&Gh%*^lD4K=%DNDCsKpgDEDmy@@ zu`JOjlITNSQ3R%2~Vj|@wI^rkFX5uEg9w= zFv{P(N``YS85os3i3$ZQ3zaOyAyFwafI{Uil1M}oDyuAs7MrMS1p%S*aB&bSDujuO z)w=wBgGMDhWv4XGnXf_S8^SUyv1B;)nxU^QCBvV7Ed!&nRH8xw!=PfdLSsl2@+$K- zM^LWt0Xj`$iEbr{c2p-+=35f=;8O!_y7E2<2$d8|A}&EHL_|~$T(40HPpME@2QptT zmSKh^Ly4I)*D4wI{2GJ`FDCGKDPUQs+)bh|DrE*xs9a4Ft%d8E>z2>ZbX+et67 zZx!>0Er}Qv6~aWtY74(?tx*Y2sY=irAoI0l8Ae(%Y%DTlsHbGu>I*_;EQjz?z%Zy- zZRTwx3ZqhH09AtOkVLPOS)Db=l4y~M%9CUyLs#0^CE_NQ0+rXqzSl}hR8D{dIi)QV z)V?^DD8Z8GsaK5h^e5Y>PVt)17`5^oQ!O$DE3ZYqgk(YyEI-IpG6ks-|FtCqdld0{ zv$|M<^<8WTHb4pHv;>1=2d%gYVrr1piq8UfKSr}7lTIf=Xl?dj5`>(#Ftsc}ieEMa z;px_zz$s4t#7%s*peDW2w zbPPLS93`mOo_G#l#MDPf&{zVl2|mi9CIDv%VCFJU0j8{by@doWBIOJX++|G-Z5dUsOFyD#LF;{_Cf-pG{Sh8oD8@}og1=a3D+X=WCE@V(7;uT$Ljb5J@I zyNK!d=~|tR2$WVjR)Nw=2gm-(xkyJV74Odnbi6IeGQOY~J#|bK;)S+$d)=DEJOupQ zS@}pV`5)rM0e^%Lvk6Hmw=Jy@9uCJavBJ%#Q$F*e;O~I#33mf$BzNzhMPObQM0tE` zu#Dp(#c0X6{u+{TttDf}NFgj4pRz(=?TD3?IV_fHvuQ$IWj#e|dbJdX_^Wv&pY0g1 z%gAetDgvIjmUxgp+XhJ0EQBmT#{kuoV-?&TIqLo$+%LsF>=egR+%Ht`7vrAxGobei zaX(ePe-`)Dd8YTXaZjCH;yDxd)GMX;({WF|NP7Pm?y0*+?i8JG0FEAGi=Bl=FbCu@n`cfdVa zE%g2d+>?Pp?_1y=rH0>Mh5M1}ePi5H14s1raZe2k(bvU2)#oHOdtBc?ElE2qlcxXI%dE6SF)ocuF^j-ulEGz^y0UE3HFx6ee~bS zj{U|}1Mi38T?S}&byFQ$^9!-ql4?XAVfIl>X zlk(tIb|+=GCelgy6>?Z^KaI*Fu1HmA>E}`1k=>l;o1B~W5RCxrhn}P^t@0>F02cBH zz&VMj^JxSCOF~G$MVJ0maqPmaC!7Aevv=aZ9s!Up|0-D2nBesiFR=zII;_f-IrPQS z22>Qc_-~@haSNOyVXITC;;Dla@glK8*?PEOk)!npH!yG!NUa&fyRS4{;L<<6$DSXw z4H5gNm!lly&H+kg`lrnqK93-Z!2A$3gTvc%xk${mn*1Cpf^^PhKX%YXi$5oxLZC&N zQx-XB(dQb(Y&H7`+N3JAeDv1WibA*+xwA;R%ysnN88dwqWR?%HX|?3dMKROcAR6Bq zGCKJDhG_B9AnklcB(&qVJ(BfN6bZfceMyFeYaSsCqlSj^mDhV(JXo?dH@7Jzvw#vN z=I@opL`>Ftq-zA$sV)~8;Fdr)=R6JD!|P2$r6>-kpQOp;mAulA>E#XA#nKy&%QX>v z>K7uT_8X&ouEGSd4Xr(F7CAZlmd#mTkw6d^4nKNo-FldQQ|aR>9Qh9W0VROE3v^i zA2AaTJ*uH*K%S|LP04Nw3=*phyZ9elhG9AJQA&yph*HmF+DBN|^q1stXhAq2MPLLxicDjba7`r~{rLTPMK9;~GIQ;Ld#{qb;< zNcP8X_>z&=2g(ooV{XuP~6CsxaDry(s#r-_oQ``9l?n(3N;{HY4lTvlS{aoA= zOho?_?n!Bg{z=>un#A*A+*3}(;eI6UQ^pLTT}RW?#-^t^T6AK&6bG2{`@a#7+C3n1 zN{J(8`UbqfFlK`I4hLw$fOWg_<#xIyB0V4dJJ-(4DLWnM_v)96R{V`3fmIo4T`AtZ za5&%)n?_V6<)Z+qU3dajl7j`_>Bop3eJ|m1^%g>T@>NU3E9JGd-Ga29(Y`mvNdt%Ah950i5N zQ?xkQodz|FDHSXar2>;-Wh#0j`T(0NiN41T_SEAD&0=QL7gZ5`Zr*NxsqRdyt%bt8 z{8BYrHzSXv2H1b&O<=A^9*9a**(<=kDo84|<*#P}n%zbnC2dU*M@F#P+5z;c$STZ_ zvJ%R5J@bsl1jdUo+2~$tX`^OyYX6^bKCop}D3CA6%0e|cU zl8z?rM~lm<&~$+N#?tgYr&Y*zf6axQhTVDiCsufdk_C|iRC&6k{dg`+q-sI~f#8;o z&4=7si;w{x{?7yS^q9Gh{$qgtIE{mO=>Y@uOB&GteYALIrv{wn&i2e<)TA)lz*>li zxrn!HfP7-+{>DUX%v|i$k*S;(m5j{YbGbsGmdu&uiK6K!p3~@8d9|GD#oCn#kGCHq zuZz>ym86A$=UD>6FBx9IMOwgT>XU$^gzjugr=NUqA!5pd@P-<+9xsRMxzNKw-F+7+ zsZrudpJ)$)g-PN|DV`rE00-WZoP8^i^u76WtZycb!QpN1uPYAk*OycT-nT6(4e#t= zcxNYyyQi_|O2a#w;a%k*0e{Mn@cMYj4f(%A3s^q9Ejj9n!CTFs)$mT$@JR?2{JaevtE*G!Gn0w;&w~Yh&V6Rl74n^Mbx+l%lnc+t8n&` z7fC^#or-&v0wpZH!K6weN)jJQQTzsz%=ajnY$@)66D6r`9VQ zd0AuMV^L}3I|Srb$kUrdu|m4U{VFm1k|gbal8|r7U!6WL54%N+BumnW$XiwSw{pZ;y@Dxw2Kzgz9<*@ z<+==4gN)z5$c<3gwlaZBZ_$OCie}jmHHHAQ8XB_ma38(o@j-EQx>SEIufg9)_HBQY z?60TEdcKm9eebpXDE7QO)!c z?F?`Afb87p$9%xA5=HJPi8wd<`YlN{=r6+hM*i&dWh>X&J)f70^?EJqPj##kdO5FP z2r*ZNu(Tgobh?Z#h0Hu%GK=oGPqH0{dt*H&dc$NvRa4@84m(-es1Yj+OPtgx1OBo7`i>rlQpYc)FS<1BQ-mZCw7&GQzO7N!KAbMsQ$mp1f;q1x8fgCLqC&Jm*|EMJjn=N9Uru77HHvM09%MSzEMoO1kH|{8otb z5+Jxbf~V=@oOqzYS@>{%P~w*`$FdWDyjF1HDNMw~Z?%YZ;AyRBK7z`m&>bgb z*PoP>aU+70LUD-6hbbvI&rhz=NJGCz)Bt~TBS5)E<8ge+$QvU4ZJqES`|WskOh!n` zvUuDt#65AR`+2z6>oxRm%S$j$6`$hp*GX}#tefKKj^Ab%r8uV5OL6>xZ(|##I9{rs z;%MF=#WCvA6h|~@*5dvoXkNcK#j)%Hgt;&!;4h2l|3FvGSkF7FCXjZOj5wF}U+I0< z$C}u1-lh1!yhK0Zz?q_* zV4WH>$*I`Gr6aIcNUX>M4f_<7SL6V`5W4K&DFl%0L1>IRIJXU+lm|hr@1`Z9SSDXd zEmUsXnih7K#CRVk51?}FWZqAUyRo35Scr>gVL$Q8Tu1-0us?w)`4txSFKLp(3;S_C za{(=3uX|m>eNsIZ5#pfL4=N5q=zP>WZ;Bo&D9!?RR zh!C`=GcD&Y77IAU`?e5kREU=mLPk<22|?bXAaD*8iw8K!R9legD#)zqyq5ocf1!+P zqt$q?u_+(5LT zzgT?t6}|fX+CZBB>;rj+frj&x@(-S_*ch3oT^px39>w)Gt|DAF18?n+I+OhF+EV2= z4fg2#o;$$G?~=M9`F#iyS^3@i3V1tI>Sj%qkYjy5C#vv1@vI2 zMd6o}^vmInK%+`jb8S?6Kt=h7{b!l%T_z)D{xO={MqXFVuUPC7n6MOI8TqXCOi_dwxtkPv%G4%TpW!ab@9JhHD#L z>aT47YWVV((}MG3N{Y^l>i1fCG4evppTfopE~2!)~45yfbxBe&Xb;b&(OplhGe$Pbyl53Sd&EmY2j^W$xvC^>g0-1&f zIfKp>Gy1XOYy4xy#Gn_P|Jx{|2Hq7!c#-H8LU4=O61f2xjLe{R_H zVtw5scK_=DlnSmrsX@%W3u!9D|GFh>1*ky7P5J1Ca;MjjO;25jnnqhub3cOZE~>bo zl?Aj%+S)%4&`=gLI2LJ(@ahO1x@w(*f5BDv^6}F8V(Vvl5`Ea|z!ox&1hJ4;YB>E{ zY31K7d2HYar}q3_$&HNi>gf%_qu9Qhdk$J7(Hu4cii-b=$b=)9aJn2#p#&~?c0cyG zEx;)SJiFix;FB8L5F6JPU`~POyhS|4pthP~fWgPLAP@&IWg5;#+KZn4miqxs^-z{~`o)a%~^%981D zH7uE1YDBVRR^v-XUMe&L_3|V_hfv<)AjQDv<6>>8!) zR*Xl~12w8GE~yj}F;YB^mrdiy}0{wDmAnR4wX0YhF|um@7bMc z^ju4I94RK1q;E6|7%Q?`&=Fw}zgcTN%ubBH03n1V+nYX)0ThABbkswqw52<@FgAE} z_~BKj`YTp!f{=32iR|t`dJKTvN0QN?AvQhXz2rs{---3*&>YY%Y|P*%h}t;37nCg2 z!6f?_UHcW4{B1Dw*UIZ!&!2Pdw119gywSa&k1};9t|q|zm0PZtX7|qKP}VustdTL& z2WUwV-jH6>ICLSAKrd+=x&g9xm%6Wq`)#-;<ROP~QUo*j)K*!zYYM3Oh zBJy(U#*G-aZn8Q1v^}yUUwnBz|E!TuE9B2I`LkI5ydZz(;U~fCCCNlrgaR+5j3e`5 z4S{w*AU#`uDpY#cuqE{F-pY~Mxb662wQ=+Cpxd~n2$u(4r2ctp+&`2)CJhr=xTzaB zdhn>Bmi1e{K2bqLZZ|=FuIqvIU<;jUq++yNqvi9%@GrWN;JBYBO~b5`jv16bF%~i# zk*upElVwH1<%uNV_Ov5H1n-v#ACDgV9-PQs4SP8lZL*X0a~b^N$g@Q9w$k#VWsO55 zG^^a1Bu28#vhgQ20H%gLlJew@-Y&o%md}arTWx@-l!sPgaZ_%1Nbz1J_&2IiiwQoS zbZ6!-juYQ!e(N~#Q>zWFz70yh!+=xm2T)?K4+5=2Q-asFJ*(cYB5-1f8x9Ye;quKM zYA2$AOR;dL27HCC=*;!;3F7ws{25<8vF^lprS0TW3EDZrnlrMw^bps0QPf_czG_$418e{>sSE1xjYbDvh_qJou&`=1c}x}L3keQokB zO9__muOCmZa`XKiBHyI5m2dSW0sLwh^0}3K(VhfUD#h-u@$Q6%<(A^x>{13Q9F&)g za?jU9{Wg8K0!7ttXa_K3?`A2cto1^wxPreVFtTSMDlrZHPKcW zmHx*iCL$F|pX4WJ#|AYbqtAxlcG#|leD%+U-+Q6_zB~~oy=ecJo^|<zrl%{LK%6_RYla z%F~q3_h*QFZO>M|p=HSDjz7Kjt(zfVMllUybAO`)ifHb2c(VELxOXu0-`&)8k;@^j z)5GBKSK3~mkJsp&coO2S5A51@RydA~RA_+}U389nX;BBxO$ z$BeAs@F;t+ui(Cje}X`{A}TC?tOGpFMuH z+lIq$O7#lhHzO>5=a-KkNbLBf?rIgluYXwl&MO~3kl68ScqQQ%AF6*$7r<}PZRGzuQU-n({BFl@Dd;tR zt8gERU#kmj_3@dN-?=x2!|$ew;MX)Pe%M@~yz&bYJAN&iM!=8h0{9hm27YsYD+9l8 z@iCx(0`wZcW4Jf)E8{!_>PLIMG|7?cxZm27HjyBnZ2CX5lXFJaWw?SzkP8&oA1Ji(7*usOxfXMW8aq8+jZK9x1Ok8qtWG{=q)_S;r92 zlTH6|-Xs2NYeX&*mMmlZpVu1A2r6}CdQAT^kmb2H*2AVA8|DBt76BGd9;Ia z&CH_r;qYq@=`-?B0}y_v{I;a%@>KEiJFq-1bN%epg>;t8dS+{GJ3hV%=Y- zTYiJ|k9o9%c@tUx{`u8bem}-Ti2k9!G0C2uBf2z4AxrG1gM^&lgM3E5IJ|W17zX58 zG^8q@)^kqr!Y4^4*}ugOTFqUVK38g62}3gnL=7~P9<9e-sxsWX1Uqvbse>a8JHEk3 zo=p!p#)3b2gkX;n49(HQz{y(IR6CRrt3|tc#w*hN8*|;)0(Kkt1X3!^8>l?8HQI{}SZ}@zO`})w}4tUrbR_sEnnRFs*ikLv%$c%~{hs#j#1%W;EP= z5&=*^F{SL-5cheg794kT4MD9rYKWcCZRD1kRS{HPf!F%~0A7ve+3;GR0g`yF(vLxS z0ZyuHYwWzggx9Abcx?%f*Tgp?;k7sjuQ5S*?R`V(mq0npxiIOp@Jd6N$ap#GTK3Tym&Zog zHvM`|10?ZUsUL&zf`iM@ug&4{dTv=Hyj}^y>lT~|7tpU~G+sG-fmfG1PYbWk2oo8v zhW`P)I?V~-bsX5)>aXW8+fP2)@fsY0SMN{5<8>iQR@nOM)XPD5Jsn(sy{7bQMiKCu z*yptHibIл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 *sECtr3Q2y;xVPR-!Wt#zW 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

Ng{l^Ug1s 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 cN5#LUS`sC*2OzRfBQO-8TQNMor8ql_+ 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 T6$ljw6$ljw6$lmhmsjBb#3}FE literal 0 HcmV?d00001 diff --git a/pythonlib/README.txt b/pythonlib/README.txt new file mode 100644 index 0000000..adfa46b --- /dev/null +++ b/pythonlib/README.txt @@ -0,0 +1,105 @@ +Protocol Buffers - Google's data interchange format +Copyright 2008 Google Inc. + +This directory contains the Python Protocol Buffers runtime library. + +Normally, this directory comes as part of the protobuf package, available +from: + + http://code.google.com/p/protobuf + +The complete package includes the C++ source code, which includes the +Protocol Compiler (protoc). If you downloaded this package from PyPI +or some other Python-specific source, you may have received only the +Python part of the code. In this case, you will need to obtain the +Protocol Compiler from some other source before you can use this +package. + +Development Warning +=================== + +The Python implementation of Protocol Buffers is not as mature as the C++ +and Java implementations. It may be more buggy, and it is known to be +pretty slow at this time. If you would like to help fix these issues, +join the Protocol Buffers discussion list and let us know! + +Installation +============ + +1) Make sure you have Python 2.4 or newer. If in doubt, run: + + $ python -V + +2) If you do not have setuptools installed, note that it will be + downloaded and installed automatically as soon as you run setup.py. + If you would rather install it manually, you may do so by following + the instructions on this page: + + http://peak.telecommunity.com/DevCenter/EasyInstall#installation-instructions + +3) Build the C++ code, or install a binary distribution of protoc. If + you install a binary distribution, make sure that it is the same + version as this package. If in doubt, run: + + $ protoc --version + +4) Build and run the tests: + + $ python setup.py build + $ python setup.py google_test + + If you want to test c++ implementation, run: + $ python setup.py test --cpp_implementation + + If some tests fail, this library may not work correctly on your + system. Continue at your own risk. + + Please note that there is a known problem with some versions of + Python on Cygwin which causes the tests to fail after printing the + error: "sem_init: Resource temporarily unavailable". This appears + to be a bug either in Cygwin or in Python: + http://www.cygwin.com/ml/cygwin/2005-07/msg01378.html + We do not know if or when it might me fixed. We also do not know + how likely it is that this bug will affect users in practice. + +5) Install: + + $ python setup.py install + or: + $ python setup.py install --cpp_implementation + + This step may require superuser privileges. + NOTE: To use C++ implementation, you need to install C++ protobuf runtime + library of the same version and export the environment variable before this + step. See the "C++ Implementation" section below for more details. + +Usage +===== + +The complete documentation for Protocol Buffers is available via the +web at: + + http://code.google.com/apis/protocolbuffers/ + +C++ Implementation +================== + +The C++ implementation for Python messages is built as a Python extension to +improve the overall protobuf Python performance. + +To use the C++ implementation, you need to: +1) Install the C++ protobuf runtime library, please see instructions in the + parent directory. +2) Export an environment variable: + + $ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp + $ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION=2 + +You need to export this variable before running setup.py script to build and +install the extension. You must also set the variable at runtime, otherwise +the pure-Python implementation will be used. In a future release, we will +change the default so that C++ implementation is used whenever it is available. +It is strongly recommended to run `python setup.py test` after setting the +variable to "cpp", so the tests will be against C++ implemented Python +messages. + diff --git a/pythonlib/build/lib/google/__init__.py b/pythonlib/build/lib/google/__init__.py new file mode 100644 index 0000000..de40ea7 --- /dev/null +++ b/pythonlib/build/lib/google/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/pythonlib/build/lib/google/protobuf/__init__.py b/pythonlib/build/lib/google/protobuf/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pythonlib/build/lib/google/protobuf/compiler/__init__.py b/pythonlib/build/lib/google/protobuf/compiler/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pythonlib/build/lib/google/protobuf/compiler/plugin_pb2.py b/pythonlib/build/lib/google/protobuf/compiler/plugin_pb2.py new file mode 100644 index 0000000..20ab06d --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/compiler/plugin_pb2.py @@ -0,0 +1,184 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/compiler/plugin.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import google.protobuf.descriptor_pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/compiler/plugin.proto', + package='google.protobuf.compiler', + serialized_pb=_b('\n%google/protobuf/compiler/plugin.proto\x12\x18google.protobuf.compiler\x1a google/protobuf/descriptor.proto\"}\n\x14\x43odeGeneratorRequest\x12\x18\n\x10\x66ile_to_generate\x18\x01 \x03(\t\x12\x11\n\tparameter\x18\x02 \x01(\t\x12\x38\n\nproto_file\x18\x0f \x03(\x0b\x32$.google.protobuf.FileDescriptorProto\"\xaa\x01\n\x15\x43odeGeneratorResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\x12\x42\n\x04\x66ile\x18\x0f \x03(\x0b\x32\x34.google.protobuf.compiler.CodeGeneratorResponse.File\x1a>\n\x04\x46ile\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x17\n\x0finsertion_point\x18\x02 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x0f \x01(\tB,\n\x1c\x63om.google.protobuf.compilerB\x0cPluginProtos') + , + dependencies=[google.protobuf.descriptor_pb2.DESCRIPTOR,]) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + + + +_CODEGENERATORREQUEST = _descriptor.Descriptor( + name='CodeGeneratorRequest', + full_name='google.protobuf.compiler.CodeGeneratorRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='file_to_generate', full_name='google.protobuf.compiler.CodeGeneratorRequest.file_to_generate', index=0, + number=1, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='parameter', full_name='google.protobuf.compiler.CodeGeneratorRequest.parameter', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='proto_file', full_name='google.protobuf.compiler.CodeGeneratorRequest.proto_file', index=2, + number=15, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=101, + serialized_end=226, +) + + +_CODEGENERATORRESPONSE_FILE = _descriptor.Descriptor( + name='File', + full_name='google.protobuf.compiler.CodeGeneratorResponse.File', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.compiler.CodeGeneratorResponse.File.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='insertion_point', full_name='google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='content', full_name='google.protobuf.compiler.CodeGeneratorResponse.File.content', index=2, + number=15, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=337, + serialized_end=399, +) + +_CODEGENERATORRESPONSE = _descriptor.Descriptor( + name='CodeGeneratorResponse', + full_name='google.protobuf.compiler.CodeGeneratorResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='error', full_name='google.protobuf.compiler.CodeGeneratorResponse.error', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='file', full_name='google.protobuf.compiler.CodeGeneratorResponse.file', index=1, + number=15, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_CODEGENERATORRESPONSE_FILE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=229, + serialized_end=399, +) + +_CODEGENERATORREQUEST.fields_by_name['proto_file'].message_type = google.protobuf.descriptor_pb2._FILEDESCRIPTORPROTO +_CODEGENERATORRESPONSE_FILE.containing_type = _CODEGENERATORRESPONSE +_CODEGENERATORRESPONSE.fields_by_name['file'].message_type = _CODEGENERATORRESPONSE_FILE +DESCRIPTOR.message_types_by_name['CodeGeneratorRequest'] = _CODEGENERATORREQUEST +DESCRIPTOR.message_types_by_name['CodeGeneratorResponse'] = _CODEGENERATORRESPONSE + +CodeGeneratorRequest = _reflection.GeneratedProtocolMessageType('CodeGeneratorRequest', (_message.Message,), dict( + DESCRIPTOR = _CODEGENERATORREQUEST, + __module__ = 'google.protobuf.compiler.plugin_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorRequest) + )) +_sym_db.RegisterMessage(CodeGeneratorRequest) + +CodeGeneratorResponse = _reflection.GeneratedProtocolMessageType('CodeGeneratorResponse', (_message.Message,), dict( + + File = _reflection.GeneratedProtocolMessageType('File', (_message.Message,), dict( + DESCRIPTOR = _CODEGENERATORRESPONSE_FILE, + __module__ = 'google.protobuf.compiler.plugin_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse.File) + )) + , + DESCRIPTOR = _CODEGENERATORRESPONSE, + __module__ = 'google.protobuf.compiler.plugin_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse) + )) +_sym_db.RegisterMessage(CodeGeneratorResponse) +_sym_db.RegisterMessage(CodeGeneratorResponse.File) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\034com.google.protobuf.compilerB\014PluginProtos')) +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/build/lib/google/protobuf/descriptor.py b/pythonlib/build/lib/google/protobuf/descriptor.py new file mode 100644 index 0000000..555498d --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/descriptor.py @@ -0,0 +1,849 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +# Needs to stay compatible with Python 2.5 due to GAE. +# +# Copyright 2007 Google Inc. All Rights Reserved. + +"""Descriptors essentially contain exactly the information found in a .proto +file, in types that make this information accessible in Python. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +from google.protobuf.internal import api_implementation + + +if api_implementation.Type() == 'cpp': + # Used by MakeDescriptor in cpp mode + import os + import uuid + + if api_implementation.Version() == 2: + from google.protobuf.pyext import _message + else: + from google.protobuf.internal import cpp_message + + +class Error(Exception): + """Base error for this module.""" + + +class TypeTransformationError(Error): + """Error transforming between python proto type and corresponding C++ type.""" + + +class DescriptorBase(object): + + """Descriptors base class. + + This class is the base of all descriptor classes. It provides common options + related functionaility. + + Attributes: + has_options: True if the descriptor has non-default options. Usually it + is not necessary to read this -- just call GetOptions() which will + happily return the default instance. However, it's sometimes useful + for efficiency, and also useful inside the protobuf implementation to + avoid some bootstrapping issues. + """ + + def __init__(self, options, options_class_name): + """Initialize the descriptor given its options message and the name of the + class of the options message. The name of the class is required in case + the options message is None and has to be created. + """ + self._options = options + self._options_class_name = options_class_name + + # Does this descriptor have non-default options? + self.has_options = options is not None + + def _SetOptions(self, options, options_class_name): + """Sets the descriptor's options + + This function is used in generated proto2 files to update descriptor + options. It must not be used outside proto2. + """ + self._options = options + self._options_class_name = options_class_name + + # Does this descriptor have non-default options? + self.has_options = options is not None + + def GetOptions(self): + """Retrieves descriptor options. + + This method returns the options set or creates the default options for the + descriptor. + """ + if self._options: + return self._options + from google.protobuf import descriptor_pb2 + try: + options_class = getattr(descriptor_pb2, self._options_class_name) + except AttributeError: + raise RuntimeError('Unknown options class name %s!' % + (self._options_class_name)) + self._options = options_class() + return self._options + + +class _NestedDescriptorBase(DescriptorBase): + """Common class for descriptors that can be nested.""" + + def __init__(self, options, options_class_name, name, full_name, + file, containing_type, serialized_start=None, + serialized_end=None): + """Constructor. + + Args: + options: Protocol message options or None + to use default message options. + options_class_name: (str) The class name of the above options. + + name: (str) Name of this protocol message type. + full_name: (str) Fully-qualified name of this protocol message type, + which will include protocol "package" name and the name of any + enclosing types. + file: (FileDescriptor) Reference to file info. + containing_type: if provided, this is a nested descriptor, with this + descriptor as parent, otherwise None. + serialized_start: The start index (inclusive) in block in the + file.serialized_pb that describes this descriptor. + serialized_end: The end index (exclusive) in block in the + file.serialized_pb that describes this descriptor. + """ + super(_NestedDescriptorBase, self).__init__( + options, options_class_name) + + self.name = name + # TODO(falk): Add function to calculate full_name instead of having it in + # memory? + self.full_name = full_name + self.file = file + self.containing_type = containing_type + + self._serialized_start = serialized_start + self._serialized_end = serialized_end + + def GetTopLevelContainingType(self): + """Returns the root if this is a nested type, or itself if its the root.""" + desc = self + while desc.containing_type is not None: + desc = desc.containing_type + return desc + + def CopyToProto(self, proto): + """Copies this to the matching proto in descriptor_pb2. + + Args: + proto: An empty proto instance from descriptor_pb2. + + Raises: + Error: If self couldnt be serialized, due to to few constructor arguments. + """ + if (self.file is not None and + self._serialized_start is not None and + self._serialized_end is not None): + proto.ParseFromString(self.file.serialized_pb[ + self._serialized_start:self._serialized_end]) + else: + raise Error('Descriptor does not contain serialization.') + + +class Descriptor(_NestedDescriptorBase): + + """Descriptor for a protocol message type. + + A Descriptor instance has the following attributes: + + name: (str) Name of this protocol message type. + full_name: (str) Fully-qualified name of this protocol message type, + which will include protocol "package" name and the name of any + enclosing types. + + containing_type: (Descriptor) Reference to the descriptor of the + type containing us, or None if this is top-level. + + fields: (list of FieldDescriptors) Field descriptors for all + fields in this type. + fields_by_number: (dict int -> FieldDescriptor) Same FieldDescriptor + objects as in |fields|, but indexed by "number" attribute in each + FieldDescriptor. + fields_by_name: (dict str -> FieldDescriptor) Same FieldDescriptor + objects as in |fields|, but indexed by "name" attribute in each + FieldDescriptor. + + nested_types: (list of Descriptors) Descriptor references + for all protocol message types nested within this one. + nested_types_by_name: (dict str -> Descriptor) Same Descriptor + objects as in |nested_types|, but indexed by "name" attribute + in each Descriptor. + + enum_types: (list of EnumDescriptors) EnumDescriptor references + for all enums contained within this type. + enum_types_by_name: (dict str ->EnumDescriptor) Same EnumDescriptor + objects as in |enum_types|, but indexed by "name" attribute + in each EnumDescriptor. + enum_values_by_name: (dict str -> EnumValueDescriptor) Dict mapping + from enum value name to EnumValueDescriptor for that value. + + extensions: (list of FieldDescriptor) All extensions defined directly + within this message type (NOT within a nested type). + extensions_by_name: (dict, string -> FieldDescriptor) Same FieldDescriptor + objects as |extensions|, but indexed by "name" attribute of each + FieldDescriptor. + + is_extendable: Does this type define any extension ranges? + + options: (descriptor_pb2.MessageOptions) Protocol message options or None + to use default message options. + + oneofs: (list of OneofDescriptor) The list of descriptors for oneof fields + in this message. + oneofs_by_name: (dict str -> OneofDescriptor) Same objects as in |oneofs|, + but indexed by "name" attribute. + + file: (FileDescriptor) Reference to file descriptor. + """ + + # NOTE(tmarek): The file argument redefining a builtin is nothing we can + # fix right now since we don't know how many clients already rely on the + # name of the argument. + def __init__(self, name, full_name, filename, containing_type, fields, + nested_types, enum_types, extensions, options=None, + is_extendable=True, extension_ranges=None, oneofs=None, + file=None, serialized_start=None, serialized_end=None): # pylint:disable=redefined-builtin + """Arguments to __init__() are as described in the description + of Descriptor fields above. + + Note that filename is an obsolete argument, that is not used anymore. + Please use file.name to access this as an attribute. + """ + super(Descriptor, self).__init__( + options, 'MessageOptions', name, full_name, file, + containing_type, serialized_start=serialized_start, + serialized_end=serialized_end) + + # We have fields in addition to fields_by_name and fields_by_number, + # so that: + # 1. Clients can index fields by "order in which they're listed." + # 2. Clients can easily iterate over all fields with the terse + # syntax: for f in descriptor.fields: ... + self.fields = fields + for field in self.fields: + field.containing_type = self + self.fields_by_number = dict((f.number, f) for f in fields) + self.fields_by_name = dict((f.name, f) for f in fields) + + self.nested_types = nested_types + for nested_type in nested_types: + nested_type.containing_type = self + self.nested_types_by_name = dict((t.name, t) for t in nested_types) + + self.enum_types = enum_types + for enum_type in self.enum_types: + enum_type.containing_type = self + self.enum_types_by_name = dict((t.name, t) for t in enum_types) + self.enum_values_by_name = dict( + (v.name, v) for t in enum_types for v in t.values) + + self.extensions = extensions + for extension in self.extensions: + extension.extension_scope = self + self.extensions_by_name = dict((f.name, f) for f in extensions) + self.is_extendable = is_extendable + self.extension_ranges = extension_ranges + self.oneofs = oneofs if oneofs is not None else [] + self.oneofs_by_name = dict((o.name, o) for o in self.oneofs) + for oneof in self.oneofs: + oneof.containing_type = self + + def EnumValueName(self, enum, value): + """Returns the string name of an enum value. + + This is just a small helper method to simplify a common operation. + + Args: + enum: string name of the Enum. + value: int, value of the enum. + + Returns: + string name of the enum value. + + Raises: + KeyError if either the Enum doesn't exist or the value is not a valid + value for the enum. + """ + return self.enum_types_by_name[enum].values_by_number[value].name + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.DescriptorProto. + + Args: + proto: An empty descriptor_pb2.DescriptorProto. + """ + # This function is overriden to give a better doc comment. + super(Descriptor, self).CopyToProto(proto) + + +# TODO(robinson): We should have aggressive checking here, +# for example: +# * If you specify a repeated field, you should not be allowed +# to specify a default value. +# * [Other examples here as needed]. +# +# TODO(robinson): for this and other *Descriptor classes, we +# might also want to lock things down aggressively (e.g., +# prevent clients from setting the attributes). Having +# stronger invariants here in general will reduce the number +# of runtime checks we must do in reflection.py... +class FieldDescriptor(DescriptorBase): + + """Descriptor for a single field in a .proto file. + + A FieldDescriptor instance has the following attributes: + + name: (str) Name of this field, exactly as it appears in .proto. + full_name: (str) Name of this field, including containing scope. This is + particularly relevant for extensions. + index: (int) Dense, 0-indexed index giving the order that this + field textually appears within its message in the .proto file. + number: (int) Tag number declared for this field in the .proto file. + + type: (One of the TYPE_* constants below) Declared type. + cpp_type: (One of the CPPTYPE_* constants below) C++ type used to + represent this field. + + label: (One of the LABEL_* constants below) Tells whether this + field is optional, required, or repeated. + has_default_value: (bool) True if this field has a default value defined, + otherwise false. + default_value: (Varies) Default value of this field. Only + meaningful for non-repeated scalar fields. Repeated fields + should always set this to [], and non-repeated composite + fields should always set this to None. + + containing_type: (Descriptor) Descriptor of the protocol message + type that contains this field. Set by the Descriptor constructor + if we're passed into one. + Somewhat confusingly, for extension fields, this is the + descriptor of the EXTENDED message, not the descriptor + of the message containing this field. (See is_extension and + extension_scope below). + message_type: (Descriptor) If a composite field, a descriptor + of the message type contained in this field. Otherwise, this is None. + enum_type: (EnumDescriptor) If this field contains an enum, a + descriptor of that enum. Otherwise, this is None. + + is_extension: True iff this describes an extension field. + extension_scope: (Descriptor) Only meaningful if is_extension is True. + Gives the message that immediately contains this extension field. + Will be None iff we're a top-level (file-level) extension field. + + options: (descriptor_pb2.FieldOptions) Protocol message field options or + None to use default field options. + + containing_oneof: (OneofDescriptor) If the field is a member of a oneof + union, contains its descriptor. Otherwise, None. + """ + + # Must be consistent with C++ FieldDescriptor::Type enum in + # descriptor.h. + # + # TODO(robinson): Find a way to eliminate this repetition. + TYPE_DOUBLE = 1 + TYPE_FLOAT = 2 + TYPE_INT64 = 3 + TYPE_UINT64 = 4 + TYPE_INT32 = 5 + TYPE_FIXED64 = 6 + TYPE_FIXED32 = 7 + TYPE_BOOL = 8 + TYPE_STRING = 9 + TYPE_GROUP = 10 + TYPE_MESSAGE = 11 + TYPE_BYTES = 12 + TYPE_UINT32 = 13 + TYPE_ENUM = 14 + TYPE_SFIXED32 = 15 + TYPE_SFIXED64 = 16 + TYPE_SINT32 = 17 + TYPE_SINT64 = 18 + MAX_TYPE = 18 + + # Must be consistent with C++ FieldDescriptor::CppType enum in + # descriptor.h. + # + # TODO(robinson): Find a way to eliminate this repetition. + CPPTYPE_INT32 = 1 + CPPTYPE_INT64 = 2 + CPPTYPE_UINT32 = 3 + CPPTYPE_UINT64 = 4 + CPPTYPE_DOUBLE = 5 + CPPTYPE_FLOAT = 6 + CPPTYPE_BOOL = 7 + CPPTYPE_ENUM = 8 + CPPTYPE_STRING = 9 + CPPTYPE_MESSAGE = 10 + MAX_CPPTYPE = 10 + + _PYTHON_TO_CPP_PROTO_TYPE_MAP = { + TYPE_DOUBLE: CPPTYPE_DOUBLE, + TYPE_FLOAT: CPPTYPE_FLOAT, + TYPE_ENUM: CPPTYPE_ENUM, + TYPE_INT64: CPPTYPE_INT64, + TYPE_SINT64: CPPTYPE_INT64, + TYPE_SFIXED64: CPPTYPE_INT64, + TYPE_UINT64: CPPTYPE_UINT64, + TYPE_FIXED64: CPPTYPE_UINT64, + TYPE_INT32: CPPTYPE_INT32, + TYPE_SFIXED32: CPPTYPE_INT32, + TYPE_SINT32: CPPTYPE_INT32, + TYPE_UINT32: CPPTYPE_UINT32, + TYPE_FIXED32: CPPTYPE_UINT32, + TYPE_BYTES: CPPTYPE_STRING, + TYPE_STRING: CPPTYPE_STRING, + TYPE_BOOL: CPPTYPE_BOOL, + TYPE_MESSAGE: CPPTYPE_MESSAGE, + TYPE_GROUP: CPPTYPE_MESSAGE + } + + # Must be consistent with C++ FieldDescriptor::Label enum in + # descriptor.h. + # + # TODO(robinson): Find a way to eliminate this repetition. + LABEL_OPTIONAL = 1 + LABEL_REQUIRED = 2 + LABEL_REPEATED = 3 + MAX_LABEL = 3 + + # Must be consistent with C++ constants kMaxNumber, kFirstReservedNumber, + # and kLastReservedNumber in descriptor.h + MAX_FIELD_NUMBER = (1 << 29) - 1 + FIRST_RESERVED_FIELD_NUMBER = 19000 + LAST_RESERVED_FIELD_NUMBER = 19999 + + def __init__(self, name, full_name, index, number, type, cpp_type, label, + default_value, message_type, enum_type, containing_type, + is_extension, extension_scope, options=None, + has_default_value=True, containing_oneof=None): + """The arguments are as described in the description of FieldDescriptor + attributes above. + + Note that containing_type may be None, and may be set later if necessary + (to deal with circular references between message types, for example). + Likewise for extension_scope. + """ + super(FieldDescriptor, self).__init__(options, 'FieldOptions') + self.name = name + self.full_name = full_name + self.index = index + self.number = number + self.type = type + self.cpp_type = cpp_type + self.label = label + self.has_default_value = has_default_value + self.default_value = default_value + self.containing_type = containing_type + self.message_type = message_type + self.enum_type = enum_type + self.is_extension = is_extension + self.extension_scope = extension_scope + self.containing_oneof = containing_oneof + if api_implementation.Type() == 'cpp': + if is_extension: + if api_implementation.Version() == 2: + # pylint: disable=protected-access + self._cdescriptor = ( + _message.Message._GetExtensionDescriptor(full_name)) + # pylint: enable=protected-access + else: + self._cdescriptor = cpp_message.GetExtensionDescriptor(full_name) + else: + if api_implementation.Version() == 2: + # pylint: disable=protected-access + self._cdescriptor = _message.Message._GetFieldDescriptor(full_name) + # pylint: enable=protected-access + else: + self._cdescriptor = cpp_message.GetFieldDescriptor(full_name) + else: + self._cdescriptor = None + + @staticmethod + def ProtoTypeToCppProtoType(proto_type): + """Converts from a Python proto type to a C++ Proto Type. + + The Python ProtocolBuffer classes specify both the 'Python' datatype and the + 'C++' datatype - and they're not the same. This helper method should + translate from one to another. + + Args: + proto_type: the Python proto type (descriptor.FieldDescriptor.TYPE_*) + Returns: + descriptor.FieldDescriptor.CPPTYPE_*, the C++ type. + Raises: + TypeTransformationError: when the Python proto type isn't known. + """ + try: + return FieldDescriptor._PYTHON_TO_CPP_PROTO_TYPE_MAP[proto_type] + except KeyError: + raise TypeTransformationError('Unknown proto_type: %s' % proto_type) + + +class EnumDescriptor(_NestedDescriptorBase): + + """Descriptor for an enum defined in a .proto file. + + An EnumDescriptor instance has the following attributes: + + name: (str) Name of the enum type. + full_name: (str) Full name of the type, including package name + and any enclosing type(s). + + values: (list of EnumValueDescriptors) List of the values + in this enum. + values_by_name: (dict str -> EnumValueDescriptor) Same as |values|, + but indexed by the "name" field of each EnumValueDescriptor. + values_by_number: (dict int -> EnumValueDescriptor) Same as |values|, + but indexed by the "number" field of each EnumValueDescriptor. + containing_type: (Descriptor) Descriptor of the immediate containing + type of this enum, or None if this is an enum defined at the + top level in a .proto file. Set by Descriptor's constructor + if we're passed into one. + file: (FileDescriptor) Reference to file descriptor. + options: (descriptor_pb2.EnumOptions) Enum options message or + None to use default enum options. + """ + + def __init__(self, name, full_name, filename, values, + containing_type=None, options=None, file=None, + serialized_start=None, serialized_end=None): + """Arguments are as described in the attribute description above. + + Note that filename is an obsolete argument, that is not used anymore. + Please use file.name to access this as an attribute. + """ + super(EnumDescriptor, self).__init__( + options, 'EnumOptions', name, full_name, file, + containing_type, serialized_start=serialized_start, + serialized_end=serialized_end) + + self.values = values + for value in self.values: + value.type = self + self.values_by_name = dict((v.name, v) for v in values) + self.values_by_number = dict((v.number, v) for v in values) + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.EnumDescriptorProto. + + Args: + proto: An empty descriptor_pb2.EnumDescriptorProto. + """ + # This function is overriden to give a better doc comment. + super(EnumDescriptor, self).CopyToProto(proto) + + +class EnumValueDescriptor(DescriptorBase): + + """Descriptor for a single value within an enum. + + name: (str) Name of this value. + index: (int) Dense, 0-indexed index giving the order that this + value appears textually within its enum in the .proto file. + number: (int) Actual number assigned to this enum value. + type: (EnumDescriptor) EnumDescriptor to which this value + belongs. Set by EnumDescriptor's constructor if we're + passed into one. + options: (descriptor_pb2.EnumValueOptions) Enum value options message or + None to use default enum value options options. + """ + + def __init__(self, name, index, number, type=None, options=None): + """Arguments are as described in the attribute description above.""" + super(EnumValueDescriptor, self).__init__(options, 'EnumValueOptions') + self.name = name + self.index = index + self.number = number + self.type = type + + +class OneofDescriptor(object): + """Descriptor for a oneof field. + + name: (str) Name of the oneof field. + full_name: (str) Full name of the oneof field, including package name. + index: (int) 0-based index giving the order of the oneof field inside + its containing type. + containing_type: (Descriptor) Descriptor of the protocol message + type that contains this field. Set by the Descriptor constructor + if we're passed into one. + fields: (list of FieldDescriptor) The list of field descriptors this + oneof can contain. + """ + + def __init__(self, name, full_name, index, containing_type, fields): + """Arguments are as described in the attribute description above.""" + self.name = name + self.full_name = full_name + self.index = index + self.containing_type = containing_type + self.fields = fields + + +class ServiceDescriptor(_NestedDescriptorBase): + + """Descriptor for a service. + + name: (str) Name of the service. + full_name: (str) Full name of the service, including package name. + index: (int) 0-indexed index giving the order that this services + definition appears withing the .proto file. + methods: (list of MethodDescriptor) List of methods provided by this + service. + options: (descriptor_pb2.ServiceOptions) Service options message or + None to use default service options. + file: (FileDescriptor) Reference to file info. + """ + + def __init__(self, name, full_name, index, methods, options=None, file=None, + serialized_start=None, serialized_end=None): + super(ServiceDescriptor, self).__init__( + options, 'ServiceOptions', name, full_name, file, + None, serialized_start=serialized_start, + serialized_end=serialized_end) + self.index = index + self.methods = methods + # Set the containing service for each method in this service. + for method in self.methods: + method.containing_service = self + + def FindMethodByName(self, name): + """Searches for the specified method, and returns its descriptor.""" + for method in self.methods: + if name == method.name: + return method + return None + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.ServiceDescriptorProto. + + Args: + proto: An empty descriptor_pb2.ServiceDescriptorProto. + """ + # This function is overriden to give a better doc comment. + super(ServiceDescriptor, self).CopyToProto(proto) + + +class MethodDescriptor(DescriptorBase): + + """Descriptor for a method in a service. + + name: (str) Name of the method within the service. + full_name: (str) Full name of method. + index: (int) 0-indexed index of the method inside the service. + containing_service: (ServiceDescriptor) The service that contains this + method. + input_type: The descriptor of the message that this method accepts. + output_type: The descriptor of the message that this method returns. + options: (descriptor_pb2.MethodOptions) Method options message or + None to use default method options. + """ + + def __init__(self, name, full_name, index, containing_service, + input_type, output_type, options=None): + """The arguments are as described in the description of MethodDescriptor + attributes above. + + Note that containing_service may be None, and may be set later if necessary. + """ + super(MethodDescriptor, self).__init__(options, 'MethodOptions') + self.name = name + self.full_name = full_name + self.index = index + self.containing_service = containing_service + self.input_type = input_type + self.output_type = output_type + + +class FileDescriptor(DescriptorBase): + """Descriptor for a file. Mimics the descriptor_pb2.FileDescriptorProto. + + Note that enum_types_by_name, extensions_by_name, and dependencies + fields are only set by the message_factory module, and not by the + generated proto code. + + name: name of file, relative to root of source tree. + package: name of the package + serialized_pb: (str) Byte string of serialized + descriptor_pb2.FileDescriptorProto. + dependencies: List of other FileDescriptors this FileDescriptor depends on. + message_types_by_name: Dict of message names of their descriptors. + enum_types_by_name: Dict of enum names and their descriptors. + extensions_by_name: Dict of extension names and their descriptors. + """ + + def __init__(self, name, package, options=None, serialized_pb=None, + dependencies=None): + """Constructor.""" + super(FileDescriptor, self).__init__(options, 'FileOptions') + + self.message_types_by_name = {} + self.name = name + self.package = package + self.serialized_pb = serialized_pb + + self.enum_types_by_name = {} + self.extensions_by_name = {} + self.dependencies = (dependencies or []) + + if (api_implementation.Type() == 'cpp' and + self.serialized_pb is not None): + if api_implementation.Version() == 2: + # pylint: disable=protected-access + _message.Message._BuildFile(self.serialized_pb) + # pylint: enable=protected-access + else: + cpp_message.BuildFile(self.serialized_pb) + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.FileDescriptorProto. + + Args: + proto: An empty descriptor_pb2.FileDescriptorProto. + """ + proto.ParseFromString(self.serialized_pb) + + +def _ParseOptions(message, string): + """Parses serialized options. + + This helper function is used to parse serialized options in generated + proto2 files. It must not be used outside proto2. + """ + message.ParseFromString(string) + return message + + +def MakeDescriptor(desc_proto, package='', build_file_if_cpp=True): + """Make a protobuf Descriptor given a DescriptorProto protobuf. + + Handles nested descriptors. Note that this is limited to the scope of defining + a message inside of another message. Composite fields can currently only be + resolved if the message is defined in the same scope as the field. + + Args: + desc_proto: The descriptor_pb2.DescriptorProto protobuf message. + package: Optional package name for the new message Descriptor (string). + build_file_if_cpp: Update the C++ descriptor pool if api matches. + Set to False on recursion, so no duplicates are created. + Returns: + A Descriptor for protobuf messages. + """ + if api_implementation.Type() == 'cpp' and build_file_if_cpp: + # The C++ implementation requires all descriptors to be backed by the same + # definition in the C++ descriptor pool. To do this, we build a + # FileDescriptorProto with the same definition as this descriptor and build + # it into the pool. + from google.protobuf import descriptor_pb2 + file_descriptor_proto = descriptor_pb2.FileDescriptorProto() + file_descriptor_proto.message_type.add().MergeFrom(desc_proto) + + # Generate a random name for this proto file to prevent conflicts with + # any imported ones. We need to specify a file name so BuildFile accepts + # our FileDescriptorProto, but it is not important what that file name + # is actually set to. + proto_name = str(uuid.uuid4()) + + if package: + file_descriptor_proto.name = os.path.join(package.replace('.', '/'), + proto_name + '.proto') + file_descriptor_proto.package = package + else: + file_descriptor_proto.name = proto_name + '.proto' + + if api_implementation.Version() == 2: + # pylint: disable=protected-access + _message.Message._BuildFile(file_descriptor_proto.SerializeToString()) + # pylint: enable=protected-access + else: + cpp_message.BuildFile(file_descriptor_proto.SerializeToString()) + + full_message_name = [desc_proto.name] + if package: full_message_name.insert(0, package) + + # Create Descriptors for enum types + enum_types = {} + for enum_proto in desc_proto.enum_type: + full_name = '.'.join(full_message_name + [enum_proto.name]) + enum_desc = EnumDescriptor( + enum_proto.name, full_name, None, [ + EnumValueDescriptor(enum_val.name, ii, enum_val.number) + for ii, enum_val in enumerate(enum_proto.value)]) + enum_types[full_name] = enum_desc + + # Create Descriptors for nested types + nested_types = {} + for nested_proto in desc_proto.nested_type: + full_name = '.'.join(full_message_name + [nested_proto.name]) + # Nested types are just those defined inside of the message, not all types + # used by fields in the message, so no loops are possible here. + nested_desc = MakeDescriptor(nested_proto, + package='.'.join(full_message_name), + build_file_if_cpp=False) + nested_types[full_name] = nested_desc + + fields = [] + for field_proto in desc_proto.field: + full_name = '.'.join(full_message_name + [field_proto.name]) + enum_desc = None + nested_desc = None + if field_proto.HasField('type_name'): + type_name = field_proto.type_name + full_type_name = '.'.join(full_message_name + + [type_name[type_name.rfind('.')+1:]]) + if full_type_name in nested_types: + nested_desc = nested_types[full_type_name] + elif full_type_name in enum_types: + enum_desc = enum_types[full_type_name] + # Else type_name references a non-local type, which isn't implemented + field = FieldDescriptor( + field_proto.name, full_name, field_proto.number - 1, + field_proto.number, field_proto.type, + FieldDescriptor.ProtoTypeToCppProtoType(field_proto.type), + field_proto.label, None, nested_desc, enum_desc, None, False, None, + has_default_value=False) + fields.append(field) + + desc_name = '.'.join(full_message_name) + return Descriptor(desc_proto.name, desc_name, None, None, fields, + nested_types.values(), enum_types.values(), []) diff --git a/pythonlib/build/lib/google/protobuf/descriptor_database.py b/pythonlib/build/lib/google/protobuf/descriptor_database.py new file mode 100644 index 0000000..9f5a117 --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/descriptor_database.py @@ -0,0 +1,137 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Provides a container for DescriptorProtos.""" + +__author__ = 'matthewtoia@google.com (Matt Toia)' + + +class Error(Exception): + pass + + +class DescriptorDatabaseConflictingDefinitionError(Error): + """Raised when a proto is added with the same name & different descriptor.""" + + +class DescriptorDatabase(object): + """A container accepting FileDescriptorProtos and maps DescriptorProtos.""" + + def __init__(self): + self._file_desc_protos_by_file = {} + self._file_desc_protos_by_symbol = {} + + def Add(self, file_desc_proto): + """Adds the FileDescriptorProto and its types to this database. + + Args: + file_desc_proto: The FileDescriptorProto to add. + Raises: + DescriptorDatabaseException: if an attempt is made to add a proto + with the same name but different definition than an exisiting + proto in the database. + """ + proto_name = file_desc_proto.name + if proto_name not in self._file_desc_protos_by_file: + self._file_desc_protos_by_file[proto_name] = file_desc_proto + elif self._file_desc_protos_by_file[proto_name] != file_desc_proto: + raise DescriptorDatabaseConflictingDefinitionError( + '%s already added, but with different descriptor.' % proto_name) + + package = file_desc_proto.package + for message in file_desc_proto.message_type: + self._file_desc_protos_by_symbol.update( + (name, file_desc_proto) for name in _ExtractSymbols(message, package)) + for enum in file_desc_proto.enum_type: + self._file_desc_protos_by_symbol[ + '.'.join((package, enum.name))] = file_desc_proto + + def FindFileByName(self, name): + """Finds the file descriptor proto by file name. + + Typically the file name is a relative path ending to a .proto file. The + proto with the given name will have to have been added to this database + using the Add method or else an error will be raised. + + Args: + name: The file name to find. + + Returns: + The file descriptor proto matching the name. + + Raises: + KeyError if no file by the given name was added. + """ + + return self._file_desc_protos_by_file[name] + + def FindFileContainingSymbol(self, symbol): + """Finds the file descriptor proto containing the specified symbol. + + The symbol should be a fully qualified name including the file descriptor's + package and any containing messages. Some examples: + + 'some.package.name.Message' + 'some.package.name.Message.NestedEnum' + + The file descriptor proto containing the specified symbol must be added to + this database using the Add method or else an error will be raised. + + Args: + symbol: The fully qualified symbol name. + + Returns: + The file descriptor proto containing the symbol. + + Raises: + KeyError if no file contains the specified symbol. + """ + + return self._file_desc_protos_by_symbol[symbol] + + +def _ExtractSymbols(desc_proto, package): + """Pulls out all the symbols from a descriptor proto. + + Args: + desc_proto: The proto to extract symbols from. + package: The package containing the descriptor type. + + Yields: + The fully qualified name found in the descriptor. + """ + + message_name = '.'.join((package, desc_proto.name)) + yield message_name + for nested_type in desc_proto.nested_type: + for symbol in _ExtractSymbols(nested_type, message_name): + yield symbol + for enum_type in desc_proto.enum_type: + yield '.'.join((message_name, enum_type.name)) diff --git a/pythonlib/build/lib/google/protobuf/descriptor_pb2.py b/pythonlib/build/lib/google/protobuf/descriptor_pb2.py new file mode 100644 index 0000000..808fd17 --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/descriptor_pb2.py @@ -0,0 +1,1522 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/descriptor.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/descriptor.proto', + package='google.protobuf', + serialized_pb=_b('\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"G\n\x11\x46ileDescriptorSet\x12\x32\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProto\"\xcb\x03\n\x13\x46ileDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07package\x18\x02 \x01(\t\x12\x12\n\ndependency\x18\x03 \x03(\t\x12\x19\n\x11public_dependency\x18\n \x03(\x05\x12\x17\n\x0fweak_dependency\x18\x0b \x03(\x05\x12\x36\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProto\x12\x37\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProto\x12\x38\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProto\x12\x38\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProto\x12-\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptions\x12\x39\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfo\"\xe4\x03\n\x0f\x44\x65scriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x34\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProto\x12\x38\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProto\x12\x35\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProto\x12\x37\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProto\x12H\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRange\x12\x39\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProto\x12\x30\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptions\x1a,\n\x0e\x45xtensionRange\x12\r\n\x05start\x18\x01 \x01(\x05\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x05\"\xa9\x05\n\x14\x46ieldDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x03 \x01(\x05\x12:\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.Label\x12\x38\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.Type\x12\x11\n\ttype_name\x18\x06 \x01(\t\x12\x10\n\x08\x65xtendee\x18\x02 \x01(\t\x12\x15\n\rdefault_value\x18\x07 \x01(\t\x12\x13\n\x0boneof_index\x18\t \x01(\x05\x12.\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptions\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\x12\x12\n\x0eLABEL_REPEATED\x10\x03\"$\n\x14OneofDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x8c\x01\n\x13\x45numDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x38\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProto\x12-\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptions\"l\n\x18\x45numValueDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x02 \x01(\x05\x12\x32\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptions\"\x90\x01\n\x16ServiceDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x36\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProto\x12\x30\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptions\"\x7f\n\x15MethodDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\ninput_type\x18\x02 \x01(\t\x12\x13\n\x0boutput_type\x18\x03 \x01(\t\x12/\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptions\"\xab\x04\n\x0b\x46ileOptions\x12\x14\n\x0cjava_package\x18\x01 \x01(\t\x12\x1c\n\x14java_outer_classname\x18\x08 \x01(\t\x12\"\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lse\x12,\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08:\x05\x66\x61lse\x12%\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lse\x12\x46\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEED\x12\x12\n\ngo_package\x18\x0b \x01(\t\x12\"\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lse\x12$\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lse\x12\"\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd3\x01\n\x0eMessageOptions\x12&\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lse\x12.\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xbe\x02\n\x0c\x46ieldOptions\x12:\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRING\x12\x0e\n\x06packed\x18\x02 \x01(\x08\x12\x13\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x1c\n\x14\x65xperimental_map_key\x18\t \x01(\t\x12\x13\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x8d\x01\n\x0b\x45numOptions\x12\x13\n\x0b\x61llow_alias\x18\x02 \x01(\x08\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"}\n\x10\x45numValueOptions\x12\x19\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"{\n\x0eServiceOptions\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"z\n\rMethodOptions\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9e\x02\n\x13UninterpretedOption\x12;\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePart\x12\x18\n\x10identifier_value\x18\x03 \x01(\t\x12\x1a\n\x12positive_int_value\x18\x04 \x01(\x04\x12\x1a\n\x12negative_int_value\x18\x05 \x01(\x03\x12\x14\n\x0c\x64ouble_value\x18\x06 \x01(\x01\x12\x14\n\x0cstring_value\x18\x07 \x01(\x0c\x12\x17\n\x0f\x61ggregate_value\x18\x08 \x01(\t\x1a\x33\n\x08NamePart\x12\x11\n\tname_part\x18\x01 \x02(\t\x12\x14\n\x0cis_extension\x18\x02 \x02(\x08\"\xb1\x01\n\x0eSourceCodeInfo\x12:\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.Location\x1a\x63\n\x08Location\x12\x10\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01\x12\x10\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01\x12\x18\n\x10leading_comments\x18\x03 \x01(\t\x12\x19\n\x11trailing_comments\x18\x04 \x01(\tB)\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + + +_FIELDDESCRIPTORPROTO_TYPE = _descriptor.EnumDescriptor( + name='Type', + full_name='google.protobuf.FieldDescriptorProto.Type', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='TYPE_DOUBLE', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_FLOAT', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_INT64', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_UINT64', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_INT32', index=4, number=5, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_FIXED64', index=5, number=6, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_FIXED32', index=6, number=7, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_BOOL', index=7, number=8, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_STRING', index=8, number=9, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_GROUP', index=9, number=10, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_MESSAGE', index=10, number=11, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_BYTES', index=11, number=12, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_UINT32', index=12, number=13, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_ENUM', index=13, number=14, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_SFIXED32', index=14, number=15, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_SFIXED64', index=15, number=16, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_SINT32', index=16, number=17, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_SINT64', index=17, number=18, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1378, + serialized_end=1688, +) +_sym_db.RegisterEnumDescriptor(_FIELDDESCRIPTORPROTO_TYPE) + +_FIELDDESCRIPTORPROTO_LABEL = _descriptor.EnumDescriptor( + name='Label', + full_name='google.protobuf.FieldDescriptorProto.Label', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LABEL_OPTIONAL', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LABEL_REQUIRED', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LABEL_REPEATED', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1690, + serialized_end=1757, +) +_sym_db.RegisterEnumDescriptor(_FIELDDESCRIPTORPROTO_LABEL) + +_FILEOPTIONS_OPTIMIZEMODE = _descriptor.EnumDescriptor( + name='OptimizeMode', + full_name='google.protobuf.FileOptions.OptimizeMode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SPEED', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CODE_SIZE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LITE_RUNTIME', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2813, + serialized_end=2871, +) +_sym_db.RegisterEnumDescriptor(_FILEOPTIONS_OPTIMIZEMODE) + +_FIELDOPTIONS_CTYPE = _descriptor.EnumDescriptor( + name='CType', + full_name='google.protobuf.FieldOptions.CType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='STRING', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CORD', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STRING_PIECE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3359, + serialized_end=3406, +) +_sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_CTYPE) + + +_FILEDESCRIPTORSET = _descriptor.Descriptor( + name='FileDescriptorSet', + full_name='google.protobuf.FileDescriptorSet', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='file', full_name='google.protobuf.FileDescriptorSet.file', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=53, + serialized_end=124, +) + + +_FILEDESCRIPTORPROTO = _descriptor.Descriptor( + name='FileDescriptorProto', + full_name='google.protobuf.FileDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.FileDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='package', full_name='google.protobuf.FileDescriptorProto.package', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dependency', full_name='google.protobuf.FileDescriptorProto.dependency', index=2, + number=3, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='public_dependency', full_name='google.protobuf.FileDescriptorProto.public_dependency', index=3, + number=10, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='weak_dependency', full_name='google.protobuf.FileDescriptorProto.weak_dependency', index=4, + number=11, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message_type', full_name='google.protobuf.FileDescriptorProto.message_type', index=5, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='enum_type', full_name='google.protobuf.FileDescriptorProto.enum_type', index=6, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='service', full_name='google.protobuf.FileDescriptorProto.service', index=7, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='extension', full_name='google.protobuf.FileDescriptorProto.extension', index=8, + number=7, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.FileDescriptorProto.options', index=9, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='source_code_info', full_name='google.protobuf.FileDescriptorProto.source_code_info', index=10, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=127, + serialized_end=586, +) + + +_DESCRIPTORPROTO_EXTENSIONRANGE = _descriptor.Descriptor( + name='ExtensionRange', + full_name='google.protobuf.DescriptorProto.ExtensionRange', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='start', full_name='google.protobuf.DescriptorProto.ExtensionRange.start', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='end', full_name='google.protobuf.DescriptorProto.ExtensionRange.end', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1029, + serialized_end=1073, +) + +_DESCRIPTORPROTO = _descriptor.Descriptor( + name='DescriptorProto', + full_name='google.protobuf.DescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.DescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='field', full_name='google.protobuf.DescriptorProto.field', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='extension', full_name='google.protobuf.DescriptorProto.extension', index=2, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_type', full_name='google.protobuf.DescriptorProto.nested_type', index=3, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='enum_type', full_name='google.protobuf.DescriptorProto.enum_type', index=4, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='extension_range', full_name='google.protobuf.DescriptorProto.extension_range', index=5, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='oneof_decl', full_name='google.protobuf.DescriptorProto.oneof_decl', index=6, + number=8, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.DescriptorProto.options', index=7, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_DESCRIPTORPROTO_EXTENSIONRANGE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=589, + serialized_end=1073, +) + + +_FIELDDESCRIPTORPROTO = _descriptor.Descriptor( + name='FieldDescriptorProto', + full_name='google.protobuf.FieldDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.FieldDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='number', full_name='google.protobuf.FieldDescriptorProto.number', index=1, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='label', full_name='google.protobuf.FieldDescriptorProto.label', index=2, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='google.protobuf.FieldDescriptorProto.type', index=3, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type_name', full_name='google.protobuf.FieldDescriptorProto.type_name', index=4, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='extendee', full_name='google.protobuf.FieldDescriptorProto.extendee', index=5, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_value', full_name='google.protobuf.FieldDescriptorProto.default_value', index=6, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='oneof_index', full_name='google.protobuf.FieldDescriptorProto.oneof_index', index=7, + number=9, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.FieldDescriptorProto.options', index=8, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _FIELDDESCRIPTORPROTO_TYPE, + _FIELDDESCRIPTORPROTO_LABEL, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1076, + serialized_end=1757, +) + + +_ONEOFDESCRIPTORPROTO = _descriptor.Descriptor( + name='OneofDescriptorProto', + full_name='google.protobuf.OneofDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.OneofDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1759, + serialized_end=1795, +) + + +_ENUMDESCRIPTORPROTO = _descriptor.Descriptor( + name='EnumDescriptorProto', + full_name='google.protobuf.EnumDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.EnumDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='google.protobuf.EnumDescriptorProto.value', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.EnumDescriptorProto.options', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1798, + serialized_end=1938, +) + + +_ENUMVALUEDESCRIPTORPROTO = _descriptor.Descriptor( + name='EnumValueDescriptorProto', + full_name='google.protobuf.EnumValueDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.EnumValueDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='number', full_name='google.protobuf.EnumValueDescriptorProto.number', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.EnumValueDescriptorProto.options', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1940, + serialized_end=2048, +) + + +_SERVICEDESCRIPTORPROTO = _descriptor.Descriptor( + name='ServiceDescriptorProto', + full_name='google.protobuf.ServiceDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.ServiceDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='method', full_name='google.protobuf.ServiceDescriptorProto.method', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.ServiceDescriptorProto.options', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=2051, + serialized_end=2195, +) + + +_METHODDESCRIPTORPROTO = _descriptor.Descriptor( + name='MethodDescriptorProto', + full_name='google.protobuf.MethodDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.MethodDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='input_type', full_name='google.protobuf.MethodDescriptorProto.input_type', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='output_type', full_name='google.protobuf.MethodDescriptorProto.output_type', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.MethodDescriptorProto.options', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=2197, + serialized_end=2324, +) + + +_FILEOPTIONS = _descriptor.Descriptor( + name='FileOptions', + full_name='google.protobuf.FileOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='java_package', full_name='google.protobuf.FileOptions.java_package', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='java_outer_classname', full_name='google.protobuf.FileOptions.java_outer_classname', index=1, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='java_multiple_files', full_name='google.protobuf.FileOptions.java_multiple_files', index=2, + number=10, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='java_generate_equals_and_hash', full_name='google.protobuf.FileOptions.java_generate_equals_and_hash', index=3, + number=20, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='java_string_check_utf8', full_name='google.protobuf.FileOptions.java_string_check_utf8', index=4, + number=27, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optimize_for', full_name='google.protobuf.FileOptions.optimize_for', index=5, + number=9, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='go_package', full_name='google.protobuf.FileOptions.go_package', index=6, + number=11, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='cc_generic_services', full_name='google.protobuf.FileOptions.cc_generic_services', index=7, + number=16, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='java_generic_services', full_name='google.protobuf.FileOptions.java_generic_services', index=8, + number=17, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='py_generic_services', full_name='google.protobuf.FileOptions.py_generic_services', index=9, + number=18, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.FileOptions.deprecated', index=10, + number=23, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.FileOptions.uninterpreted_option', index=11, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _FILEOPTIONS_OPTIMIZEMODE, + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=2327, + serialized_end=2882, +) + + +_MESSAGEOPTIONS = _descriptor.Descriptor( + name='MessageOptions', + full_name='google.protobuf.MessageOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message_set_wire_format', full_name='google.protobuf.MessageOptions.message_set_wire_format', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='no_standard_descriptor_accessor', full_name='google.protobuf.MessageOptions.no_standard_descriptor_accessor', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.MessageOptions.deprecated', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.MessageOptions.uninterpreted_option', index=3, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=2885, + serialized_end=3096, +) + + +_FIELDOPTIONS = _descriptor.Descriptor( + name='FieldOptions', + full_name='google.protobuf.FieldOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ctype', full_name='google.protobuf.FieldOptions.ctype', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='packed', full_name='google.protobuf.FieldOptions.packed', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='lazy', full_name='google.protobuf.FieldOptions.lazy', index=2, + number=5, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.FieldOptions.deprecated', index=3, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='experimental_map_key', full_name='google.protobuf.FieldOptions.experimental_map_key', index=4, + number=9, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='weak', full_name='google.protobuf.FieldOptions.weak', index=5, + number=10, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.FieldOptions.uninterpreted_option', index=6, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _FIELDOPTIONS_CTYPE, + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=3099, + serialized_end=3417, +) + + +_ENUMOPTIONS = _descriptor.Descriptor( + name='EnumOptions', + full_name='google.protobuf.EnumOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='allow_alias', full_name='google.protobuf.EnumOptions.allow_alias', index=0, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.EnumOptions.deprecated', index=1, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.EnumOptions.uninterpreted_option', index=2, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=3420, + serialized_end=3561, +) + + +_ENUMVALUEOPTIONS = _descriptor.Descriptor( + name='EnumValueOptions', + full_name='google.protobuf.EnumValueOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.EnumValueOptions.deprecated', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.EnumValueOptions.uninterpreted_option', index=1, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=3563, + serialized_end=3688, +) + + +_SERVICEOPTIONS = _descriptor.Descriptor( + name='ServiceOptions', + full_name='google.protobuf.ServiceOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.ServiceOptions.deprecated', index=0, + number=33, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.ServiceOptions.uninterpreted_option', index=1, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=3690, + serialized_end=3813, +) + + +_METHODOPTIONS = _descriptor.Descriptor( + name='MethodOptions', + full_name='google.protobuf.MethodOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.MethodOptions.deprecated', index=0, + number=33, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.MethodOptions.uninterpreted_option', index=1, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=3815, + serialized_end=3937, +) + + +_UNINTERPRETEDOPTION_NAMEPART = _descriptor.Descriptor( + name='NamePart', + full_name='google.protobuf.UninterpretedOption.NamePart', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name_part', full_name='google.protobuf.UninterpretedOption.NamePart.name_part', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='is_extension', full_name='google.protobuf.UninterpretedOption.NamePart.is_extension', index=1, + number=2, type=8, cpp_type=7, label=2, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=4175, + serialized_end=4226, +) + +_UNINTERPRETEDOPTION = _descriptor.Descriptor( + name='UninterpretedOption', + full_name='google.protobuf.UninterpretedOption', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.UninterpretedOption.name', index=0, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='identifier_value', full_name='google.protobuf.UninterpretedOption.identifier_value', index=1, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='positive_int_value', full_name='google.protobuf.UninterpretedOption.positive_int_value', index=2, + number=4, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='negative_int_value', full_name='google.protobuf.UninterpretedOption.negative_int_value', index=3, + number=5, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='double_value', full_name='google.protobuf.UninterpretedOption.double_value', index=4, + number=6, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='string_value', full_name='google.protobuf.UninterpretedOption.string_value', index=5, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='aggregate_value', full_name='google.protobuf.UninterpretedOption.aggregate_value', index=6, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_UNINTERPRETEDOPTION_NAMEPART, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=3940, + serialized_end=4226, +) + + +_SOURCECODEINFO_LOCATION = _descriptor.Descriptor( + name='Location', + full_name='google.protobuf.SourceCodeInfo.Location', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='path', full_name='google.protobuf.SourceCodeInfo.Location.path', index=0, + number=1, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='span', full_name='google.protobuf.SourceCodeInfo.Location.span', index=1, + number=2, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='leading_comments', full_name='google.protobuf.SourceCodeInfo.Location.leading_comments', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='trailing_comments', full_name='google.protobuf.SourceCodeInfo.Location.trailing_comments', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=4307, + serialized_end=4406, +) + +_SOURCECODEINFO = _descriptor.Descriptor( + name='SourceCodeInfo', + full_name='google.protobuf.SourceCodeInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='location', full_name='google.protobuf.SourceCodeInfo.location', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_SOURCECODEINFO_LOCATION, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=4229, + serialized_end=4406, +) + +_FILEDESCRIPTORSET.fields_by_name['file'].message_type = _FILEDESCRIPTORPROTO +_FILEDESCRIPTORPROTO.fields_by_name['message_type'].message_type = _DESCRIPTORPROTO +_FILEDESCRIPTORPROTO.fields_by_name['enum_type'].message_type = _ENUMDESCRIPTORPROTO +_FILEDESCRIPTORPROTO.fields_by_name['service'].message_type = _SERVICEDESCRIPTORPROTO +_FILEDESCRIPTORPROTO.fields_by_name['extension'].message_type = _FIELDDESCRIPTORPROTO +_FILEDESCRIPTORPROTO.fields_by_name['options'].message_type = _FILEOPTIONS +_FILEDESCRIPTORPROTO.fields_by_name['source_code_info'].message_type = _SOURCECODEINFO +_DESCRIPTORPROTO_EXTENSIONRANGE.containing_type = _DESCRIPTORPROTO +_DESCRIPTORPROTO.fields_by_name['field'].message_type = _FIELDDESCRIPTORPROTO +_DESCRIPTORPROTO.fields_by_name['extension'].message_type = _FIELDDESCRIPTORPROTO +_DESCRIPTORPROTO.fields_by_name['nested_type'].message_type = _DESCRIPTORPROTO +_DESCRIPTORPROTO.fields_by_name['enum_type'].message_type = _ENUMDESCRIPTORPROTO +_DESCRIPTORPROTO.fields_by_name['extension_range'].message_type = _DESCRIPTORPROTO_EXTENSIONRANGE +_DESCRIPTORPROTO.fields_by_name['oneof_decl'].message_type = _ONEOFDESCRIPTORPROTO +_DESCRIPTORPROTO.fields_by_name['options'].message_type = _MESSAGEOPTIONS +_FIELDDESCRIPTORPROTO.fields_by_name['label'].enum_type = _FIELDDESCRIPTORPROTO_LABEL +_FIELDDESCRIPTORPROTO.fields_by_name['type'].enum_type = _FIELDDESCRIPTORPROTO_TYPE +_FIELDDESCRIPTORPROTO.fields_by_name['options'].message_type = _FIELDOPTIONS +_FIELDDESCRIPTORPROTO_TYPE.containing_type = _FIELDDESCRIPTORPROTO +_FIELDDESCRIPTORPROTO_LABEL.containing_type = _FIELDDESCRIPTORPROTO +_ENUMDESCRIPTORPROTO.fields_by_name['value'].message_type = _ENUMVALUEDESCRIPTORPROTO +_ENUMDESCRIPTORPROTO.fields_by_name['options'].message_type = _ENUMOPTIONS +_ENUMVALUEDESCRIPTORPROTO.fields_by_name['options'].message_type = _ENUMVALUEOPTIONS +_SERVICEDESCRIPTORPROTO.fields_by_name['method'].message_type = _METHODDESCRIPTORPROTO +_SERVICEDESCRIPTORPROTO.fields_by_name['options'].message_type = _SERVICEOPTIONS +_METHODDESCRIPTORPROTO.fields_by_name['options'].message_type = _METHODOPTIONS +_FILEOPTIONS.fields_by_name['optimize_for'].enum_type = _FILEOPTIONS_OPTIMIZEMODE +_FILEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_FILEOPTIONS_OPTIMIZEMODE.containing_type = _FILEOPTIONS +_MESSAGEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_FIELDOPTIONS.fields_by_name['ctype'].enum_type = _FIELDOPTIONS_CTYPE +_FIELDOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_FIELDOPTIONS_CTYPE.containing_type = _FIELDOPTIONS +_ENUMOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_ENUMVALUEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_SERVICEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_METHODOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_UNINTERPRETEDOPTION_NAMEPART.containing_type = _UNINTERPRETEDOPTION +_UNINTERPRETEDOPTION.fields_by_name['name'].message_type = _UNINTERPRETEDOPTION_NAMEPART +_SOURCECODEINFO_LOCATION.containing_type = _SOURCECODEINFO +_SOURCECODEINFO.fields_by_name['location'].message_type = _SOURCECODEINFO_LOCATION +DESCRIPTOR.message_types_by_name['FileDescriptorSet'] = _FILEDESCRIPTORSET +DESCRIPTOR.message_types_by_name['FileDescriptorProto'] = _FILEDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['DescriptorProto'] = _DESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['FieldDescriptorProto'] = _FIELDDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['OneofDescriptorProto'] = _ONEOFDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['EnumDescriptorProto'] = _ENUMDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['EnumValueDescriptorProto'] = _ENUMVALUEDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['ServiceDescriptorProto'] = _SERVICEDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['MethodDescriptorProto'] = _METHODDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['FileOptions'] = _FILEOPTIONS +DESCRIPTOR.message_types_by_name['MessageOptions'] = _MESSAGEOPTIONS +DESCRIPTOR.message_types_by_name['FieldOptions'] = _FIELDOPTIONS +DESCRIPTOR.message_types_by_name['EnumOptions'] = _ENUMOPTIONS +DESCRIPTOR.message_types_by_name['EnumValueOptions'] = _ENUMVALUEOPTIONS +DESCRIPTOR.message_types_by_name['ServiceOptions'] = _SERVICEOPTIONS +DESCRIPTOR.message_types_by_name['MethodOptions'] = _METHODOPTIONS +DESCRIPTOR.message_types_by_name['UninterpretedOption'] = _UNINTERPRETEDOPTION +DESCRIPTOR.message_types_by_name['SourceCodeInfo'] = _SOURCECODEINFO + +FileDescriptorSet = _reflection.GeneratedProtocolMessageType('FileDescriptorSet', (_message.Message,), dict( + DESCRIPTOR = _FILEDESCRIPTORSET, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorSet) + )) +_sym_db.RegisterMessage(FileDescriptorSet) + +FileDescriptorProto = _reflection.GeneratedProtocolMessageType('FileDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _FILEDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorProto) + )) +_sym_db.RegisterMessage(FileDescriptorProto) + +DescriptorProto = _reflection.GeneratedProtocolMessageType('DescriptorProto', (_message.Message,), dict( + + ExtensionRange = _reflection.GeneratedProtocolMessageType('ExtensionRange', (_message.Message,), dict( + DESCRIPTOR = _DESCRIPTORPROTO_EXTENSIONRANGE, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto.ExtensionRange) + )) + , + DESCRIPTOR = _DESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto) + )) +_sym_db.RegisterMessage(DescriptorProto) +_sym_db.RegisterMessage(DescriptorProto.ExtensionRange) + +FieldDescriptorProto = _reflection.GeneratedProtocolMessageType('FieldDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _FIELDDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.FieldDescriptorProto) + )) +_sym_db.RegisterMessage(FieldDescriptorProto) + +OneofDescriptorProto = _reflection.GeneratedProtocolMessageType('OneofDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _ONEOFDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.OneofDescriptorProto) + )) +_sym_db.RegisterMessage(OneofDescriptorProto) + +EnumDescriptorProto = _reflection.GeneratedProtocolMessageType('EnumDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _ENUMDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.EnumDescriptorProto) + )) +_sym_db.RegisterMessage(EnumDescriptorProto) + +EnumValueDescriptorProto = _reflection.GeneratedProtocolMessageType('EnumValueDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _ENUMVALUEDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.EnumValueDescriptorProto) + )) +_sym_db.RegisterMessage(EnumValueDescriptorProto) + +ServiceDescriptorProto = _reflection.GeneratedProtocolMessageType('ServiceDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _SERVICEDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.ServiceDescriptorProto) + )) +_sym_db.RegisterMessage(ServiceDescriptorProto) + +MethodDescriptorProto = _reflection.GeneratedProtocolMessageType('MethodDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _METHODDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.MethodDescriptorProto) + )) +_sym_db.RegisterMessage(MethodDescriptorProto) + +FileOptions = _reflection.GeneratedProtocolMessageType('FileOptions', (_message.Message,), dict( + DESCRIPTOR = _FILEOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.FileOptions) + )) +_sym_db.RegisterMessage(FileOptions) + +MessageOptions = _reflection.GeneratedProtocolMessageType('MessageOptions', (_message.Message,), dict( + DESCRIPTOR = _MESSAGEOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.MessageOptions) + )) +_sym_db.RegisterMessage(MessageOptions) + +FieldOptions = _reflection.GeneratedProtocolMessageType('FieldOptions', (_message.Message,), dict( + DESCRIPTOR = _FIELDOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.FieldOptions) + )) +_sym_db.RegisterMessage(FieldOptions) + +EnumOptions = _reflection.GeneratedProtocolMessageType('EnumOptions', (_message.Message,), dict( + DESCRIPTOR = _ENUMOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.EnumOptions) + )) +_sym_db.RegisterMessage(EnumOptions) + +EnumValueOptions = _reflection.GeneratedProtocolMessageType('EnumValueOptions', (_message.Message,), dict( + DESCRIPTOR = _ENUMVALUEOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.EnumValueOptions) + )) +_sym_db.RegisterMessage(EnumValueOptions) + +ServiceOptions = _reflection.GeneratedProtocolMessageType('ServiceOptions', (_message.Message,), dict( + DESCRIPTOR = _SERVICEOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.ServiceOptions) + )) +_sym_db.RegisterMessage(ServiceOptions) + +MethodOptions = _reflection.GeneratedProtocolMessageType('MethodOptions', (_message.Message,), dict( + DESCRIPTOR = _METHODOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.MethodOptions) + )) +_sym_db.RegisterMessage(MethodOptions) + +UninterpretedOption = _reflection.GeneratedProtocolMessageType('UninterpretedOption', (_message.Message,), dict( + + NamePart = _reflection.GeneratedProtocolMessageType('NamePart', (_message.Message,), dict( + DESCRIPTOR = _UNINTERPRETEDOPTION_NAMEPART, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption.NamePart) + )) + , + DESCRIPTOR = _UNINTERPRETEDOPTION, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption) + )) +_sym_db.RegisterMessage(UninterpretedOption) +_sym_db.RegisterMessage(UninterpretedOption.NamePart) + +SourceCodeInfo = _reflection.GeneratedProtocolMessageType('SourceCodeInfo', (_message.Message,), dict( + + Location = _reflection.GeneratedProtocolMessageType('Location', (_message.Message,), dict( + DESCRIPTOR = _SOURCECODEINFO_LOCATION, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo.Location) + )) + , + DESCRIPTOR = _SOURCECODEINFO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo) + )) +_sym_db.RegisterMessage(SourceCodeInfo) +_sym_db.RegisterMessage(SourceCodeInfo.Location) + + +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/build/lib/google/protobuf/descriptor_pool.py b/pythonlib/build/lib/google/protobuf/descriptor_pool.py new file mode 100644 index 0000000..372f458 --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/descriptor_pool.py @@ -0,0 +1,643 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Provides DescriptorPool to use as a container for proto2 descriptors. + +The DescriptorPool is used in conjection with a DescriptorDatabase to maintain +a collection of protocol buffer descriptors for use when dynamically creating +message types at runtime. + +For most applications protocol buffers should be used via modules generated by +the protocol buffer compiler tool. This should only be used when the type of +protocol buffers used in an application or library cannot be predetermined. + +Below is a straightforward example on how to use this class: + + pool = DescriptorPool() + file_descriptor_protos = [ ... ] + for file_descriptor_proto in file_descriptor_protos: + pool.Add(file_descriptor_proto) + my_message_descriptor = pool.FindMessageTypeByName('some.package.MessageType') + +The message descriptor can be used in conjunction with the message_factory +module in order to create a protocol buffer class that can be encoded and +decoded. + +If you want to get a Python class for the specified proto, use the +helper functions inside google.protobuf.message_factory +directly instead of this class. +""" + +__author__ = 'matthewtoia@google.com (Matt Toia)' + +import sys + +from google.protobuf import descriptor +from google.protobuf import descriptor_database +from google.protobuf import text_encoding + + +def _NormalizeFullyQualifiedName(name): + """Remove leading period from fully-qualified type name. + + Due to b/13860351 in descriptor_database.py, types in the root namespace are + generated with a leading period. This function removes that prefix. + + Args: + name: A str, the fully-qualified symbol name. + + Returns: + A str, the normalized fully-qualified symbol name. + """ + return name.lstrip('.') + + +class DescriptorPool(object): + """A collection of protobufs dynamically constructed by descriptor protos.""" + + def __init__(self, descriptor_db=None): + """Initializes a Pool of proto buffs. + + The descriptor_db argument to the constructor is provided to allow + specialized file descriptor proto lookup code to be triggered on demand. An + example would be an implementation which will read and compile a file + specified in a call to FindFileByName() and not require the call to Add() + at all. Results from this database will be cached internally here as well. + + Args: + descriptor_db: A secondary source of file descriptors. + """ + + self._internal_db = descriptor_database.DescriptorDatabase() + self._descriptor_db = descriptor_db + self._descriptors = {} + self._enum_descriptors = {} + self._file_descriptors = {} + + def Add(self, file_desc_proto): + """Adds the FileDescriptorProto and its types to this pool. + + Args: + file_desc_proto: The FileDescriptorProto to add. + """ + + self._internal_db.Add(file_desc_proto) + + def AddDescriptor(self, desc): + """Adds a Descriptor to the pool, non-recursively. + + If the Descriptor contains nested messages or enums, the caller must + explicitly register them. This method also registers the FileDescriptor + associated with the message. + + Args: + desc: A Descriptor. + """ + if not isinstance(desc, descriptor.Descriptor): + raise TypeError('Expected instance of descriptor.Descriptor.') + + self._descriptors[desc.full_name] = desc + self.AddFileDescriptor(desc.file) + + def AddEnumDescriptor(self, enum_desc): + """Adds an EnumDescriptor to the pool. + + This method also registers the FileDescriptor associated with the message. + + Args: + enum_desc: An EnumDescriptor. + """ + + if not isinstance(enum_desc, descriptor.EnumDescriptor): + raise TypeError('Expected instance of descriptor.EnumDescriptor.') + + self._enum_descriptors[enum_desc.full_name] = enum_desc + self.AddFileDescriptor(enum_desc.file) + + def AddFileDescriptor(self, file_desc): + """Adds a FileDescriptor to the pool, non-recursively. + + If the FileDescriptor contains messages or enums, the caller must explicitly + register them. + + Args: + file_desc: A FileDescriptor. + """ + + if not isinstance(file_desc, descriptor.FileDescriptor): + raise TypeError('Expected instance of descriptor.FileDescriptor.') + self._file_descriptors[file_desc.name] = file_desc + + def FindFileByName(self, file_name): + """Gets a FileDescriptor by file name. + + Args: + file_name: The path to the file to get a descriptor for. + + Returns: + A FileDescriptor for the named file. + + Raises: + KeyError: if the file can not be found in the pool. + """ + + try: + return self._file_descriptors[file_name] + except KeyError: + pass + + try: + file_proto = self._internal_db.FindFileByName(file_name) + except KeyError: + _, error, _ = sys.exc_info() #PY25 compatible for GAE. + if self._descriptor_db: + file_proto = self._descriptor_db.FindFileByName(file_name) + else: + raise error + if not file_proto: + raise KeyError('Cannot find a file named %s' % file_name) + return self._ConvertFileProtoToFileDescriptor(file_proto) + + def FindFileContainingSymbol(self, symbol): + """Gets the FileDescriptor for the file containing the specified symbol. + + Args: + symbol: The name of the symbol to search for. + + Returns: + A FileDescriptor that contains the specified symbol. + + Raises: + KeyError: if the file can not be found in the pool. + """ + + symbol = _NormalizeFullyQualifiedName(symbol) + try: + return self._descriptors[symbol].file + except KeyError: + pass + + try: + return self._enum_descriptors[symbol].file + except KeyError: + pass + + try: + file_proto = self._internal_db.FindFileContainingSymbol(symbol) + except KeyError: + _, error, _ = sys.exc_info() #PY25 compatible for GAE. + if self._descriptor_db: + file_proto = self._descriptor_db.FindFileContainingSymbol(symbol) + else: + raise error + if not file_proto: + raise KeyError('Cannot find a file containing %s' % symbol) + return self._ConvertFileProtoToFileDescriptor(file_proto) + + def FindMessageTypeByName(self, full_name): + """Loads the named descriptor from the pool. + + Args: + full_name: The full name of the descriptor to load. + + Returns: + The descriptor for the named type. + """ + + full_name = _NormalizeFullyQualifiedName(full_name) + if full_name not in self._descriptors: + self.FindFileContainingSymbol(full_name) + return self._descriptors[full_name] + + def FindEnumTypeByName(self, full_name): + """Loads the named enum descriptor from the pool. + + Args: + full_name: The full name of the enum descriptor to load. + + Returns: + The enum descriptor for the named type. + """ + + full_name = _NormalizeFullyQualifiedName(full_name) + if full_name not in self._enum_descriptors: + self.FindFileContainingSymbol(full_name) + return self._enum_descriptors[full_name] + + def _ConvertFileProtoToFileDescriptor(self, file_proto): + """Creates a FileDescriptor from a proto or returns a cached copy. + + This method also has the side effect of loading all the symbols found in + the file into the appropriate dictionaries in the pool. + + Args: + file_proto: The proto to convert. + + Returns: + A FileDescriptor matching the passed in proto. + """ + + if file_proto.name not in self._file_descriptors: + built_deps = list(self._GetDeps(file_proto.dependency)) + direct_deps = [self.FindFileByName(n) for n in file_proto.dependency] + + file_descriptor = descriptor.FileDescriptor( + name=file_proto.name, + package=file_proto.package, + options=file_proto.options, + serialized_pb=file_proto.SerializeToString(), + dependencies=direct_deps) + scope = {} + + # This loop extracts all the message and enum types from all the + # dependencoes of the file_proto. This is necessary to create the + # scope of available message types when defining the passed in + # file proto. + for dependency in built_deps: + scope.update(self._ExtractSymbols( + dependency.message_types_by_name.values())) + scope.update((_PrefixWithDot(enum.full_name), enum) + for enum in dependency.enum_types_by_name.values()) + + for message_type in file_proto.message_type: + message_desc = self._ConvertMessageDescriptor( + message_type, file_proto.package, file_descriptor, scope) + file_descriptor.message_types_by_name[message_desc.name] = message_desc + + for enum_type in file_proto.enum_type: + file_descriptor.enum_types_by_name[enum_type.name] = ( + self._ConvertEnumDescriptor(enum_type, file_proto.package, + file_descriptor, None, scope)) + + for index, extension_proto in enumerate(file_proto.extension): + extension_desc = self.MakeFieldDescriptor( + extension_proto, file_proto.package, index, is_extension=True) + extension_desc.containing_type = self._GetTypeFromScope( + file_descriptor.package, extension_proto.extendee, scope) + self.SetFieldType(extension_proto, extension_desc, + file_descriptor.package, scope) + file_descriptor.extensions_by_name[extension_desc.name] = extension_desc + + for desc_proto in file_proto.message_type: + self.SetAllFieldTypes(file_proto.package, desc_proto, scope) + + if file_proto.package: + desc_proto_prefix = _PrefixWithDot(file_proto.package) + else: + desc_proto_prefix = '' + + for desc_proto in file_proto.message_type: + desc = self._GetTypeFromScope(desc_proto_prefix, desc_proto.name, scope) + file_descriptor.message_types_by_name[desc_proto.name] = desc + self.Add(file_proto) + self._file_descriptors[file_proto.name] = file_descriptor + + return self._file_descriptors[file_proto.name] + + def _ConvertMessageDescriptor(self, desc_proto, package=None, file_desc=None, + scope=None): + """Adds the proto to the pool in the specified package. + + Args: + desc_proto: The descriptor_pb2.DescriptorProto protobuf message. + package: The package the proto should be located in. + file_desc: The file containing this message. + scope: Dict mapping short and full symbols to message and enum types. + + Returns: + The added descriptor. + """ + + if package: + desc_name = '.'.join((package, desc_proto.name)) + else: + desc_name = desc_proto.name + + if file_desc is None: + file_name = None + else: + file_name = file_desc.name + + if scope is None: + scope = {} + + nested = [ + self._ConvertMessageDescriptor(nested, desc_name, file_desc, scope) + for nested in desc_proto.nested_type] + enums = [ + self._ConvertEnumDescriptor(enum, desc_name, file_desc, None, scope) + for enum in desc_proto.enum_type] + fields = [self.MakeFieldDescriptor(field, desc_name, index) + for index, field in enumerate(desc_proto.field)] + extensions = [ + self.MakeFieldDescriptor(extension, desc_name, index, is_extension=True) + for index, extension in enumerate(desc_proto.extension)] + oneofs = [ + descriptor.OneofDescriptor(desc.name, '.'.join((desc_name, desc.name)), + index, None, []) + for index, desc in enumerate(desc_proto.oneof_decl)] + extension_ranges = [(r.start, r.end) for r in desc_proto.extension_range] + if extension_ranges: + is_extendable = True + else: + is_extendable = False + desc = descriptor.Descriptor( + name=desc_proto.name, + full_name=desc_name, + filename=file_name, + containing_type=None, + fields=fields, + oneofs=oneofs, + nested_types=nested, + enum_types=enums, + extensions=extensions, + options=desc_proto.options, + is_extendable=is_extendable, + extension_ranges=extension_ranges, + file=file_desc, + serialized_start=None, + serialized_end=None) + for nested in desc.nested_types: + nested.containing_type = desc + for enum in desc.enum_types: + enum.containing_type = desc + for field_index, field_desc in enumerate(desc_proto.field): + if field_desc.HasField('oneof_index'): + oneof_index = field_desc.oneof_index + oneofs[oneof_index].fields.append(fields[field_index]) + fields[field_index].containing_oneof = oneofs[oneof_index] + + scope[_PrefixWithDot(desc_name)] = desc + self._descriptors[desc_name] = desc + return desc + + def _ConvertEnumDescriptor(self, enum_proto, package=None, file_desc=None, + containing_type=None, scope=None): + """Make a protobuf EnumDescriptor given an EnumDescriptorProto protobuf. + + Args: + enum_proto: The descriptor_pb2.EnumDescriptorProto protobuf message. + package: Optional package name for the new message EnumDescriptor. + file_desc: The file containing the enum descriptor. + containing_type: The type containing this enum. + scope: Scope containing available types. + + Returns: + The added descriptor + """ + + if package: + enum_name = '.'.join((package, enum_proto.name)) + else: + enum_name = enum_proto.name + + if file_desc is None: + file_name = None + else: + file_name = file_desc.name + + values = [self._MakeEnumValueDescriptor(value, index) + for index, value in enumerate(enum_proto.value)] + desc = descriptor.EnumDescriptor(name=enum_proto.name, + full_name=enum_name, + filename=file_name, + file=file_desc, + values=values, + containing_type=containing_type, + options=enum_proto.options) + scope['.%s' % enum_name] = desc + self._enum_descriptors[enum_name] = desc + return desc + + def MakeFieldDescriptor(self, field_proto, message_name, index, + is_extension=False): + """Creates a field descriptor from a FieldDescriptorProto. + + For message and enum type fields, this method will do a look up + in the pool for the appropriate descriptor for that type. If it + is unavailable, it will fall back to the _source function to + create it. If this type is still unavailable, construction will + fail. + + Args: + field_proto: The proto describing the field. + message_name: The name of the containing message. + index: Index of the field + is_extension: Indication that this field is for an extension. + + Returns: + An initialized FieldDescriptor object + """ + + if message_name: + full_name = '.'.join((message_name, field_proto.name)) + else: + full_name = field_proto.name + + return descriptor.FieldDescriptor( + name=field_proto.name, + full_name=full_name, + index=index, + number=field_proto.number, + type=field_proto.type, + cpp_type=None, + message_type=None, + enum_type=None, + containing_type=None, + label=field_proto.label, + has_default_value=False, + default_value=None, + is_extension=is_extension, + extension_scope=None, + options=field_proto.options) + + def SetAllFieldTypes(self, package, desc_proto, scope): + """Sets all the descriptor's fields's types. + + This method also sets the containing types on any extensions. + + Args: + package: The current package of desc_proto. + desc_proto: The message descriptor to update. + scope: Enclosing scope of available types. + """ + + package = _PrefixWithDot(package) + + main_desc = self._GetTypeFromScope(package, desc_proto.name, scope) + + if package == '.': + nested_package = _PrefixWithDot(desc_proto.name) + else: + nested_package = '.'.join([package, desc_proto.name]) + + for field_proto, field_desc in zip(desc_proto.field, main_desc.fields): + self.SetFieldType(field_proto, field_desc, nested_package, scope) + + for extension_proto, extension_desc in ( + zip(desc_proto.extension, main_desc.extensions)): + extension_desc.containing_type = self._GetTypeFromScope( + nested_package, extension_proto.extendee, scope) + self.SetFieldType(extension_proto, extension_desc, nested_package, scope) + + for nested_type in desc_proto.nested_type: + self.SetAllFieldTypes(nested_package, nested_type, scope) + + def SetFieldType(self, field_proto, field_desc, package, scope): + """Sets the field's type, cpp_type, message_type and enum_type. + + Args: + field_proto: Data about the field in proto format. + field_desc: The descriptor to modiy. + package: The package the field's container is in. + scope: Enclosing scope of available types. + """ + if field_proto.type_name: + desc = self._GetTypeFromScope(package, field_proto.type_name, scope) + else: + desc = None + + if not field_proto.HasField('type'): + if isinstance(desc, descriptor.Descriptor): + field_proto.type = descriptor.FieldDescriptor.TYPE_MESSAGE + else: + field_proto.type = descriptor.FieldDescriptor.TYPE_ENUM + + field_desc.cpp_type = descriptor.FieldDescriptor.ProtoTypeToCppProtoType( + field_proto.type) + + if (field_proto.type == descriptor.FieldDescriptor.TYPE_MESSAGE + or field_proto.type == descriptor.FieldDescriptor.TYPE_GROUP): + field_desc.message_type = desc + + if field_proto.type == descriptor.FieldDescriptor.TYPE_ENUM: + field_desc.enum_type = desc + + if field_proto.label == descriptor.FieldDescriptor.LABEL_REPEATED: + field_desc.has_default_value = False + field_desc.default_value = [] + elif field_proto.HasField('default_value'): + field_desc.has_default_value = True + if (field_proto.type == descriptor.FieldDescriptor.TYPE_DOUBLE or + field_proto.type == descriptor.FieldDescriptor.TYPE_FLOAT): + field_desc.default_value = float(field_proto.default_value) + elif field_proto.type == descriptor.FieldDescriptor.TYPE_STRING: + field_desc.default_value = field_proto.default_value + elif field_proto.type == descriptor.FieldDescriptor.TYPE_BOOL: + field_desc.default_value = field_proto.default_value.lower() == 'true' + elif field_proto.type == descriptor.FieldDescriptor.TYPE_ENUM: + field_desc.default_value = field_desc.enum_type.values_by_name[ + field_proto.default_value].index + elif field_proto.type == descriptor.FieldDescriptor.TYPE_BYTES: + field_desc.default_value = text_encoding.CUnescape( + field_proto.default_value) + else: + field_desc.default_value = int(field_proto.default_value) + else: + field_desc.has_default_value = False + field_desc.default_value = None + + field_desc.type = field_proto.type + + def _MakeEnumValueDescriptor(self, value_proto, index): + """Creates a enum value descriptor object from a enum value proto. + + Args: + value_proto: The proto describing the enum value. + index: The index of the enum value. + + Returns: + An initialized EnumValueDescriptor object. + """ + + return descriptor.EnumValueDescriptor( + name=value_proto.name, + index=index, + number=value_proto.number, + options=value_proto.options, + type=None) + + def _ExtractSymbols(self, descriptors): + """Pulls out all the symbols from descriptor protos. + + Args: + descriptors: The messages to extract descriptors from. + Yields: + A two element tuple of the type name and descriptor object. + """ + + for desc in descriptors: + yield (_PrefixWithDot(desc.full_name), desc) + for symbol in self._ExtractSymbols(desc.nested_types): + yield symbol + for enum in desc.enum_types: + yield (_PrefixWithDot(enum.full_name), enum) + + def _GetDeps(self, dependencies): + """Recursively finds dependencies for file protos. + + Args: + dependencies: The names of the files being depended on. + + Yields: + Each direct and indirect dependency. + """ + + for dependency in dependencies: + dep_desc = self.FindFileByName(dependency) + yield dep_desc + for parent_dep in dep_desc.dependencies: + yield parent_dep + + def _GetTypeFromScope(self, package, type_name, scope): + """Finds a given type name in the current scope. + + Args: + package: The package the proto should be located in. + type_name: The name of the type to be found in the scope. + scope: Dict mapping short and full symbols to message and enum types. + + Returns: + The descriptor for the requested type. + """ + if type_name not in scope: + components = _PrefixWithDot(package).split('.') + while components: + possible_match = '.'.join(components + [type_name]) + if possible_match in scope: + type_name = possible_match + break + else: + components.pop(-1) + return scope[type_name] + + +def _PrefixWithDot(name): + return name if name.startswith('.') else '.%s' % name diff --git a/pythonlib/build/lib/google/protobuf/internal/__init__.py b/pythonlib/build/lib/google/protobuf/internal/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pythonlib/build/lib/google/protobuf/internal/api_implementation.py b/pythonlib/build/lib/google/protobuf/internal/api_implementation.py new file mode 100644 index 0000000..cbb8574 --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/internal/api_implementation.py @@ -0,0 +1,89 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Determine which implementation of the protobuf API is used in this process. +""" + +import os +import sys + +try: + # pylint: disable=g-import-not-at-top + from google.protobuf.internal import _api_implementation + # The compile-time constants in the _api_implementation module can be used to + # switch to a certain implementation of the Python API at build time. + _api_version = _api_implementation.api_version + del _api_implementation +except ImportError: + _api_version = 0 + +_default_implementation_type = ( + 'python' if _api_version == 0 else 'cpp') +_default_version_str = ( + '1' if _api_version <= 1 else '2') + +# This environment variable can be used to switch to a certain implementation +# of the Python API, overriding the compile-time constants in the +# _api_implementation module. Right now only 'python' and 'cpp' are valid +# values. Any other value will be ignored. +_implementation_type = os.getenv('PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION', + _default_implementation_type) + +if _implementation_type != 'python': + _implementation_type = 'cpp' + +# This environment variable can be used to switch between the two +# 'cpp' implementations, overriding the compile-time constants in the +# _api_implementation module. Right now only 1 and 2 are valid values. Any other +# value will be ignored. +_implementation_version_str = os.getenv( + 'PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION', + _default_version_str) + +if _implementation_version_str not in ('1', '2'): + raise ValueError( + "unsupported PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION: '" + + _implementation_version_str + "' (supported versions: 1, 2)" + ) + +_implementation_version = int(_implementation_version_str) + + +# Usage of this function is discouraged. Clients shouldn't care which +# implementation of the API is in use. Note that there is no guarantee +# that differences between APIs will be maintained. +# Please don't use this function if possible. +def Type(): + return _implementation_type + + +# See comment on 'Type' above. +def Version(): + return _implementation_version diff --git a/pythonlib/build/lib/google/protobuf/internal/containers.py b/pythonlib/build/lib/google/protobuf/internal/containers.py new file mode 100644 index 0000000..5797e81 --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/internal/containers.py @@ -0,0 +1,269 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Contains container classes to represent different protocol buffer types. + +This file defines container classes which represent categories of protocol +buffer field types which need extra maintenance. Currently these categories +are: + - Repeated scalar fields - These are all repeated fields which aren't + composite (e.g. they are of simple types like int32, string, etc). + - Repeated composite fields - Repeated fields which are composite. This + includes groups and nested messages. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + + +class BaseContainer(object): + + """Base container class.""" + + # Minimizes memory usage and disallows assignment to other attributes. + __slots__ = ['_message_listener', '_values'] + + def __init__(self, message_listener): + """ + Args: + message_listener: A MessageListener implementation. + The RepeatedScalarFieldContainer will call this object's + Modified() method when it is modified. + """ + self._message_listener = message_listener + self._values = [] + + def __getitem__(self, key): + """Retrieves item by the specified key.""" + return self._values[key] + + def __len__(self): + """Returns the number of elements in the container.""" + return len(self._values) + + def __ne__(self, other): + """Checks if another instance isn't equal to this one.""" + # The concrete classes should define __eq__. + return not self == other + + def __hash__(self): + raise TypeError('unhashable object') + + def __repr__(self): + return repr(self._values) + + def sort(self, *args, **kwargs): + # Continue to support the old sort_function keyword argument. + # This is expected to be a rare occurrence, so use LBYL to avoid + # the overhead of actually catching KeyError. + if 'sort_function' in kwargs: + kwargs['cmp'] = kwargs.pop('sort_function') + self._values.sort(*args, **kwargs) + + +class RepeatedScalarFieldContainer(BaseContainer): + + """Simple, type-checked, list-like container for holding repeated scalars.""" + + # Disallows assignment to other attributes. + __slots__ = ['_type_checker'] + + def __init__(self, message_listener, type_checker): + """ + Args: + message_listener: A MessageListener implementation. + The RepeatedScalarFieldContainer will call this object's + Modified() method when it is modified. + type_checker: A type_checkers.ValueChecker instance to run on elements + inserted into this container. + """ + super(RepeatedScalarFieldContainer, self).__init__(message_listener) + self._type_checker = type_checker + + def append(self, value): + """Appends an item to the list. Similar to list.append().""" + self._values.append(self._type_checker.CheckValue(value)) + if not self._message_listener.dirty: + self._message_listener.Modified() + + def insert(self, key, value): + """Inserts the item at the specified position. Similar to list.insert().""" + self._values.insert(key, self._type_checker.CheckValue(value)) + if not self._message_listener.dirty: + self._message_listener.Modified() + + def extend(self, elem_seq): + """Extends by appending the given sequence. Similar to list.extend().""" + if not elem_seq: + return + + new_values = [] + for elem in elem_seq: + new_values.append(self._type_checker.CheckValue(elem)) + self._values.extend(new_values) + self._message_listener.Modified() + + def MergeFrom(self, other): + """Appends the contents of another repeated field of the same type to this + one. We do not check the types of the individual fields. + """ + self._values.extend(other._values) + self._message_listener.Modified() + + def remove(self, elem): + """Removes an item from the list. Similar to list.remove().""" + self._values.remove(elem) + self._message_listener.Modified() + + def __setitem__(self, key, value): + """Sets the item on the specified position.""" + if isinstance(key, slice): # PY3 + if key.step is not None: + raise ValueError('Extended slices not supported') + self.__setslice__(key.start, key.stop, value) + else: + self._values[key] = self._type_checker.CheckValue(value) + self._message_listener.Modified() + + def __getslice__(self, start, stop): + """Retrieves the subset of items from between the specified indices.""" + return self._values[start:stop] + + def __setslice__(self, start, stop, values): + """Sets the subset of items from between the specified indices.""" + new_values = [] + for value in values: + new_values.append(self._type_checker.CheckValue(value)) + self._values[start:stop] = new_values + self._message_listener.Modified() + + def __delitem__(self, key): + """Deletes the item at the specified position.""" + del self._values[key] + self._message_listener.Modified() + + def __delslice__(self, start, stop): + """Deletes the subset of items from between the specified indices.""" + del self._values[start:stop] + self._message_listener.Modified() + + def __eq__(self, other): + """Compares the current instance with another one.""" + if self is other: + return True + # Special case for the same type which should be common and fast. + if isinstance(other, self.__class__): + return other._values == self._values + # We are presumably comparing against some other sequence type. + return other == self._values + + +class RepeatedCompositeFieldContainer(BaseContainer): + + """Simple, list-like container for holding repeated composite fields.""" + + # Disallows assignment to other attributes. + __slots__ = ['_message_descriptor'] + + def __init__(self, message_listener, message_descriptor): + """ + Note that we pass in a descriptor instead of the generated directly, + since at the time we construct a _RepeatedCompositeFieldContainer we + haven't yet necessarily initialized the type that will be contained in the + container. + + Args: + message_listener: A MessageListener implementation. + The RepeatedCompositeFieldContainer will call this object's + Modified() method when it is modified. + message_descriptor: A Descriptor instance describing the protocol type + that should be present in this container. We'll use the + _concrete_class field of this descriptor when the client calls add(). + """ + super(RepeatedCompositeFieldContainer, self).__init__(message_listener) + self._message_descriptor = message_descriptor + + def add(self, **kwargs): + """Adds a new element at the end of the list and returns it. Keyword + arguments may be used to initialize the element. + """ + new_element = self._message_descriptor._concrete_class(**kwargs) + new_element._SetListener(self._message_listener) + self._values.append(new_element) + if not self._message_listener.dirty: + self._message_listener.Modified() + return new_element + + def extend(self, elem_seq): + """Extends by appending the given sequence of elements of the same type + as this one, copying each individual message. + """ + message_class = self._message_descriptor._concrete_class + listener = self._message_listener + values = self._values + for message in elem_seq: + new_element = message_class() + new_element._SetListener(listener) + new_element.MergeFrom(message) + values.append(new_element) + listener.Modified() + + def MergeFrom(self, other): + """Appends the contents of another repeated field of the same type to this + one, copying each individual message. + """ + self.extend(other._values) + + def remove(self, elem): + """Removes an item from the list. Similar to list.remove().""" + self._values.remove(elem) + self._message_listener.Modified() + + def __getslice__(self, start, stop): + """Retrieves the subset of items from between the specified indices.""" + return self._values[start:stop] + + def __delitem__(self, key): + """Deletes the item at the specified position.""" + del self._values[key] + self._message_listener.Modified() + + def __delslice__(self, start, stop): + """Deletes the subset of items from between the specified indices.""" + del self._values[start:stop] + self._message_listener.Modified() + + def __eq__(self, other): + """Compares the current instance with another one.""" + if self is other: + return True + if not isinstance(other, self.__class__): + raise TypeError('Can only compare repeated composite fields against ' + 'other repeated composite fields.') + return self._values == other._values diff --git a/pythonlib/build/lib/google/protobuf/internal/cpp_message.py b/pythonlib/build/lib/google/protobuf/internal/cpp_message.py new file mode 100644 index 0000000..8eb38ca --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/internal/cpp_message.py @@ -0,0 +1,663 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Contains helper functions used to create protocol message classes from +Descriptor objects at runtime backed by the protocol buffer C++ API. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + +import copy_reg +import operator +from google.protobuf.internal import _net_proto2___python +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import message + + +_LABEL_REPEATED = _net_proto2___python.LABEL_REPEATED +_LABEL_OPTIONAL = _net_proto2___python.LABEL_OPTIONAL +_CPPTYPE_MESSAGE = _net_proto2___python.CPPTYPE_MESSAGE +_TYPE_MESSAGE = _net_proto2___python.TYPE_MESSAGE + + +def GetDescriptorPool(): + """Creates a new DescriptorPool C++ object.""" + return _net_proto2___python.NewCDescriptorPool() + + +_pool = GetDescriptorPool() + + +def GetFieldDescriptor(full_field_name): + """Searches for a field descriptor given a full field name.""" + return _pool.FindFieldByName(full_field_name) + + +def BuildFile(content): + """Registers a new proto file in the underlying C++ descriptor pool.""" + _net_proto2___python.BuildFile(content) + + +def GetExtensionDescriptor(full_extension_name): + """Searches for extension descriptor given a full field name.""" + return _pool.FindExtensionByName(full_extension_name) + + +def NewCMessage(full_message_name): + """Creates a new C++ protocol message by its name.""" + return _net_proto2___python.NewCMessage(full_message_name) + + +def ScalarProperty(cdescriptor): + """Returns a scalar property for the given descriptor.""" + + def Getter(self): + return self._cmsg.GetScalar(cdescriptor) + + def Setter(self, value): + self._cmsg.SetScalar(cdescriptor, value) + + return property(Getter, Setter) + + +def CompositeProperty(cdescriptor, message_type): + """Returns a Python property the given composite field.""" + + def Getter(self): + sub_message = self._composite_fields.get(cdescriptor.name, None) + if sub_message is None: + cmessage = self._cmsg.NewSubMessage(cdescriptor) + sub_message = message_type._concrete_class(__cmessage=cmessage) + self._composite_fields[cdescriptor.name] = sub_message + return sub_message + + return property(Getter) + + +class RepeatedScalarContainer(object): + """Container for repeated scalar fields.""" + + __slots__ = ['_message', '_cfield_descriptor', '_cmsg'] + + def __init__(self, msg, cfield_descriptor): + self._message = msg + self._cmsg = msg._cmsg + self._cfield_descriptor = cfield_descriptor + + def append(self, value): + self._cmsg.AddRepeatedScalar( + self._cfield_descriptor, value) + + def extend(self, sequence): + for element in sequence: + self.append(element) + + def insert(self, key, value): + values = self[slice(None, None, None)] + values.insert(key, value) + self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values) + + def remove(self, value): + values = self[slice(None, None, None)] + values.remove(value) + self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values) + + def __setitem__(self, key, value): + values = self[slice(None, None, None)] + values[key] = value + self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values) + + def __getitem__(self, key): + return self._cmsg.GetRepeatedScalar(self._cfield_descriptor, key) + + def __delitem__(self, key): + self._cmsg.DeleteRepeatedField(self._cfield_descriptor, key) + + def __len__(self): + return len(self[slice(None, None, None)]) + + def __eq__(self, other): + if self is other: + return True + if not operator.isSequenceType(other): + raise TypeError( + 'Can only compare repeated scalar fields against sequences.') + # We are presumably comparing against some other sequence type. + return other == self[slice(None, None, None)] + + def __ne__(self, other): + return not self == other + + def __hash__(self): + raise TypeError('unhashable object') + + def sort(self, *args, **kwargs): + # Maintain compatibility with the previous interface. + if 'sort_function' in kwargs: + kwargs['cmp'] = kwargs.pop('sort_function') + self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, + sorted(self, *args, **kwargs)) + + +def RepeatedScalarProperty(cdescriptor): + """Returns a Python property the given repeated scalar field.""" + + def Getter(self): + container = self._composite_fields.get(cdescriptor.name, None) + if container is None: + container = RepeatedScalarContainer(self, cdescriptor) + self._composite_fields[cdescriptor.name] = container + return container + + def Setter(self, new_value): + raise AttributeError('Assignment not allowed to repeated field ' + '"%s" in protocol message object.' % cdescriptor.name) + + doc = 'Magic attribute generated for "%s" proto field.' % cdescriptor.name + return property(Getter, Setter, doc=doc) + + +class RepeatedCompositeContainer(object): + """Container for repeated composite fields.""" + + __slots__ = ['_message', '_subclass', '_cfield_descriptor', '_cmsg'] + + def __init__(self, msg, cfield_descriptor, subclass): + self._message = msg + self._cmsg = msg._cmsg + self._subclass = subclass + self._cfield_descriptor = cfield_descriptor + + def add(self, **kwargs): + cmessage = self._cmsg.AddMessage(self._cfield_descriptor) + return self._subclass(__cmessage=cmessage, __owner=self._message, **kwargs) + + def extend(self, elem_seq): + """Extends by appending the given sequence of elements of the same type + as this one, copying each individual message. + """ + for message in elem_seq: + self.add().MergeFrom(message) + + def remove(self, value): + # TODO(protocol-devel): This is inefficient as it needs to generate a + # message pointer for each message only to do index(). Move this to a C++ + # extension function. + self.__delitem__(self[slice(None, None, None)].index(value)) + + def MergeFrom(self, other): + for message in other[:]: + self.add().MergeFrom(message) + + def __getitem__(self, key): + cmessages = self._cmsg.GetRepeatedMessage( + self._cfield_descriptor, key) + subclass = self._subclass + if not isinstance(cmessages, list): + return subclass(__cmessage=cmessages, __owner=self._message) + + return [subclass(__cmessage=m, __owner=self._message) for m in cmessages] + + def __delitem__(self, key): + self._cmsg.DeleteRepeatedField( + self._cfield_descriptor, key) + + def __len__(self): + return self._cmsg.FieldLength(self._cfield_descriptor) + + def __eq__(self, other): + """Compares the current instance with another one.""" + if self is other: + return True + if not isinstance(other, self.__class__): + raise TypeError('Can only compare repeated composite fields against ' + 'other repeated composite fields.') + messages = self[slice(None, None, None)] + other_messages = other[slice(None, None, None)] + return messages == other_messages + + def __hash__(self): + raise TypeError('unhashable object') + + def sort(self, cmp=None, key=None, reverse=False, **kwargs): + # Maintain compatibility with the old interface. + if cmp is None and 'sort_function' in kwargs: + cmp = kwargs.pop('sort_function') + + # The cmp function, if provided, is passed the results of the key function, + # so we only need to wrap one of them. + if key is None: + index_key = self.__getitem__ + else: + index_key = lambda i: key(self[i]) + + # Sort the list of current indexes by the underlying object. + indexes = range(len(self)) + indexes.sort(cmp=cmp, key=index_key, reverse=reverse) + + # Apply the transposition. + for dest, src in enumerate(indexes): + if dest == src: + continue + self._cmsg.SwapRepeatedFieldElements(self._cfield_descriptor, dest, src) + # Don't swap the same value twice. + indexes[src] = src + + +def RepeatedCompositeProperty(cdescriptor, message_type): + """Returns a Python property for the given repeated composite field.""" + + def Getter(self): + container = self._composite_fields.get(cdescriptor.name, None) + if container is None: + container = RepeatedCompositeContainer( + self, cdescriptor, message_type._concrete_class) + self._composite_fields[cdescriptor.name] = container + return container + + def Setter(self, new_value): + raise AttributeError('Assignment not allowed to repeated field ' + '"%s" in protocol message object.' % cdescriptor.name) + + doc = 'Magic attribute generated for "%s" proto field.' % cdescriptor.name + return property(Getter, Setter, doc=doc) + + +class ExtensionDict(object): + """Extension dictionary added to each protocol message.""" + + def __init__(self, msg): + self._message = msg + self._cmsg = msg._cmsg + self._values = {} + + def __setitem__(self, extension, value): + from google.protobuf import descriptor + if not isinstance(extension, descriptor.FieldDescriptor): + raise KeyError('Bad extension %r.' % (extension,)) + cdescriptor = extension._cdescriptor + if (cdescriptor.label != _LABEL_OPTIONAL or + cdescriptor.cpp_type == _CPPTYPE_MESSAGE): + raise TypeError('Extension %r is repeated and/or a composite type.' % ( + extension.full_name,)) + self._cmsg.SetScalar(cdescriptor, value) + self._values[extension] = value + + def __getitem__(self, extension): + from google.protobuf import descriptor + if not isinstance(extension, descriptor.FieldDescriptor): + raise KeyError('Bad extension %r.' % (extension,)) + + cdescriptor = extension._cdescriptor + if (cdescriptor.label != _LABEL_REPEATED and + cdescriptor.cpp_type != _CPPTYPE_MESSAGE): + return self._cmsg.GetScalar(cdescriptor) + + ext = self._values.get(extension, None) + if ext is not None: + return ext + + ext = self._CreateNewHandle(extension) + self._values[extension] = ext + return ext + + def ClearExtension(self, extension): + from google.protobuf import descriptor + if not isinstance(extension, descriptor.FieldDescriptor): + raise KeyError('Bad extension %r.' % (extension,)) + self._cmsg.ClearFieldByDescriptor(extension._cdescriptor) + if extension in self._values: + del self._values[extension] + + def HasExtension(self, extension): + from google.protobuf import descriptor + if not isinstance(extension, descriptor.FieldDescriptor): + raise KeyError('Bad extension %r.' % (extension,)) + return self._cmsg.HasFieldByDescriptor(extension._cdescriptor) + + def _FindExtensionByName(self, name): + """Tries to find a known extension with the specified name. + + Args: + name: Extension full name. + + Returns: + Extension field descriptor. + """ + return self._message._extensions_by_name.get(name, None) + + def _CreateNewHandle(self, extension): + cdescriptor = extension._cdescriptor + if (cdescriptor.label != _LABEL_REPEATED and + cdescriptor.cpp_type == _CPPTYPE_MESSAGE): + cmessage = self._cmsg.NewSubMessage(cdescriptor) + return extension.message_type._concrete_class(__cmessage=cmessage) + + if cdescriptor.label == _LABEL_REPEATED: + if cdescriptor.cpp_type == _CPPTYPE_MESSAGE: + return RepeatedCompositeContainer( + self._message, cdescriptor, extension.message_type._concrete_class) + else: + return RepeatedScalarContainer(self._message, cdescriptor) + # This shouldn't happen! + assert False + return None + + +def NewMessage(bases, message_descriptor, dictionary): + """Creates a new protocol message *class*.""" + _AddClassAttributesForNestedExtensions(message_descriptor, dictionary) + _AddEnumValues(message_descriptor, dictionary) + _AddDescriptors(message_descriptor, dictionary) + return bases + + +def InitMessage(message_descriptor, cls): + """Constructs a new message instance (called before instance's __init__).""" + cls._extensions_by_name = {} + _AddInitMethod(message_descriptor, cls) + _AddMessageMethods(message_descriptor, cls) + _AddPropertiesForExtensions(message_descriptor, cls) + copy_reg.pickle(cls, lambda obj: (cls, (), obj.__getstate__())) + + +def _AddDescriptors(message_descriptor, dictionary): + """Sets up a new protocol message class dictionary. + + Args: + message_descriptor: A Descriptor instance describing this message type. + dictionary: Class dictionary to which we'll add a '__slots__' entry. + """ + dictionary['__descriptors'] = {} + for field in message_descriptor.fields: + dictionary['__descriptors'][field.name] = GetFieldDescriptor( + field.full_name) + + dictionary['__slots__'] = list(dictionary['__descriptors'].iterkeys()) + [ + '_cmsg', '_owner', '_composite_fields', 'Extensions', '_HACK_REFCOUNTS'] + + +def _AddEnumValues(message_descriptor, dictionary): + """Sets class-level attributes for all enum fields defined in this message. + + Args: + message_descriptor: Descriptor object for this message type. + dictionary: Class dictionary that should be populated. + """ + for enum_type in message_descriptor.enum_types: + dictionary[enum_type.name] = enum_type_wrapper.EnumTypeWrapper(enum_type) + for enum_value in enum_type.values: + dictionary[enum_value.name] = enum_value.number + + +def _AddClassAttributesForNestedExtensions(message_descriptor, dictionary): + """Adds class attributes for the nested extensions.""" + extension_dict = message_descriptor.extensions_by_name + for extension_name, extension_field in extension_dict.iteritems(): + assert extension_name not in dictionary + dictionary[extension_name] = extension_field + + +def _AddInitMethod(message_descriptor, cls): + """Adds an __init__ method to cls.""" + + # Create and attach message field properties to the message class. + # This can be done just once per message class, since property setters and + # getters are passed the message instance. + # This makes message instantiation extremely fast, and at the same time it + # doesn't require the creation of property objects for each message instance, + # which saves a lot of memory. + for field in message_descriptor.fields: + field_cdescriptor = cls.__descriptors[field.name] + if field.label == _LABEL_REPEATED: + if field.cpp_type == _CPPTYPE_MESSAGE: + value = RepeatedCompositeProperty(field_cdescriptor, field.message_type) + else: + value = RepeatedScalarProperty(field_cdescriptor) + elif field.cpp_type == _CPPTYPE_MESSAGE: + value = CompositeProperty(field_cdescriptor, field.message_type) + else: + value = ScalarProperty(field_cdescriptor) + setattr(cls, field.name, value) + + # Attach a constant with the field number. + constant_name = field.name.upper() + '_FIELD_NUMBER' + setattr(cls, constant_name, field.number) + + def Init(self, **kwargs): + """Message constructor.""" + cmessage = kwargs.pop('__cmessage', None) + if cmessage: + self._cmsg = cmessage + else: + self._cmsg = NewCMessage(message_descriptor.full_name) + + # Keep a reference to the owner, as the owner keeps a reference to the + # underlying protocol buffer message. + owner = kwargs.pop('__owner', None) + if owner: + self._owner = owner + + if message_descriptor.is_extendable: + self.Extensions = ExtensionDict(self) + else: + # Reference counting in the C++ code is broken and depends on + # the Extensions reference to keep this object alive during unit + # tests (see b/4856052). Remove this once b/4945904 is fixed. + self._HACK_REFCOUNTS = self + self._composite_fields = {} + + for field_name, field_value in kwargs.iteritems(): + field_cdescriptor = self.__descriptors.get(field_name, None) + if not field_cdescriptor: + raise ValueError('Protocol message has no "%s" field.' % field_name) + if field_cdescriptor.label == _LABEL_REPEATED: + if field_cdescriptor.cpp_type == _CPPTYPE_MESSAGE: + field_name = getattr(self, field_name) + for val in field_value: + field_name.add().MergeFrom(val) + else: + getattr(self, field_name).extend(field_value) + elif field_cdescriptor.cpp_type == _CPPTYPE_MESSAGE: + getattr(self, field_name).MergeFrom(field_value) + else: + setattr(self, field_name, field_value) + + Init.__module__ = None + Init.__doc__ = None + cls.__init__ = Init + + +def _IsMessageSetExtension(field): + """Checks if a field is a message set extension.""" + return (field.is_extension and + field.containing_type.has_options and + field.containing_type.GetOptions().message_set_wire_format and + field.type == _TYPE_MESSAGE and + field.message_type == field.extension_scope and + field.label == _LABEL_OPTIONAL) + + +def _AddMessageMethods(message_descriptor, cls): + """Adds the methods to a protocol message class.""" + if message_descriptor.is_extendable: + + def ClearExtension(self, extension): + self.Extensions.ClearExtension(extension) + + def HasExtension(self, extension): + return self.Extensions.HasExtension(extension) + + def HasField(self, field_name): + return self._cmsg.HasField(field_name) + + def ClearField(self, field_name): + child_cmessage = None + if field_name in self._composite_fields: + child_field = self._composite_fields[field_name] + del self._composite_fields[field_name] + + child_cdescriptor = self.__descriptors[field_name] + # TODO(anuraag): Support clearing repeated message fields as well. + if (child_cdescriptor.label != _LABEL_REPEATED and + child_cdescriptor.cpp_type == _CPPTYPE_MESSAGE): + child_field._owner = None + child_cmessage = child_field._cmsg + + if child_cmessage is not None: + self._cmsg.ClearField(field_name, child_cmessage) + else: + self._cmsg.ClearField(field_name) + + def Clear(self): + cmessages_to_release = [] + for field_name, child_field in self._composite_fields.iteritems(): + child_cdescriptor = self.__descriptors[field_name] + # TODO(anuraag): Support clearing repeated message fields as well. + if (child_cdescriptor.label != _LABEL_REPEATED and + child_cdescriptor.cpp_type == _CPPTYPE_MESSAGE): + child_field._owner = None + cmessages_to_release.append((child_cdescriptor, child_field._cmsg)) + self._composite_fields.clear() + self._cmsg.Clear(cmessages_to_release) + + def IsInitialized(self, errors=None): + if self._cmsg.IsInitialized(): + return True + if errors is not None: + errors.extend(self.FindInitializationErrors()); + return False + + def SerializeToString(self): + if not self.IsInitialized(): + raise message.EncodeError( + 'Message %s is missing required fields: %s' % ( + self._cmsg.full_name, ','.join(self.FindInitializationErrors()))) + return self._cmsg.SerializeToString() + + def SerializePartialToString(self): + return self._cmsg.SerializePartialToString() + + def ParseFromString(self, serialized): + self.Clear() + self.MergeFromString(serialized) + + def MergeFromString(self, serialized): + byte_size = self._cmsg.MergeFromString(serialized) + if byte_size < 0: + raise message.DecodeError('Unable to merge from string.') + return byte_size + + def MergeFrom(self, msg): + if not isinstance(msg, cls): + raise TypeError( + "Parameter to MergeFrom() must be instance of same class: " + "expected %s got %s." % (cls.__name__, type(msg).__name__)) + self._cmsg.MergeFrom(msg._cmsg) + + def CopyFrom(self, msg): + self._cmsg.CopyFrom(msg._cmsg) + + def ByteSize(self): + return self._cmsg.ByteSize() + + def SetInParent(self): + return self._cmsg.SetInParent() + + def ListFields(self): + all_fields = [] + field_list = self._cmsg.ListFields() + fields_by_name = cls.DESCRIPTOR.fields_by_name + for is_extension, field_name in field_list: + if is_extension: + extension = cls._extensions_by_name[field_name] + all_fields.append((extension, self.Extensions[extension])) + else: + field_descriptor = fields_by_name[field_name] + all_fields.append( + (field_descriptor, getattr(self, field_name))) + all_fields.sort(key=lambda item: item[0].number) + return all_fields + + def FindInitializationErrors(self): + return self._cmsg.FindInitializationErrors() + + def __str__(self): + return str(self._cmsg) + + def __eq__(self, other): + if self is other: + return True + if not isinstance(other, self.__class__): + return False + return self.ListFields() == other.ListFields() + + def __ne__(self, other): + return not self == other + + def __hash__(self): + raise TypeError('unhashable object') + + def __unicode__(self): + # Lazy import to prevent circular import when text_format imports this file. + from google.protobuf import text_format + return text_format.MessageToString(self, as_utf8=True).decode('utf-8') + + # Attach the local methods to the message class. + for key, value in locals().copy().iteritems(): + if key not in ('key', 'value', '__builtins__', '__name__', '__doc__'): + setattr(cls, key, value) + + # Static methods: + + def RegisterExtension(extension_handle): + extension_handle.containing_type = cls.DESCRIPTOR + cls._extensions_by_name[extension_handle.full_name] = extension_handle + + if _IsMessageSetExtension(extension_handle): + # MessageSet extension. Also register under type name. + cls._extensions_by_name[ + extension_handle.message_type.full_name] = extension_handle + cls.RegisterExtension = staticmethod(RegisterExtension) + + def FromString(string): + msg = cls() + msg.MergeFromString(string) + return msg + cls.FromString = staticmethod(FromString) + + + +def _AddPropertiesForExtensions(message_descriptor, cls): + """Adds properties for all fields in this protocol message type.""" + extension_dict = message_descriptor.extensions_by_name + for extension_name, extension_field in extension_dict.iteritems(): + constant_name = extension_name.upper() + '_FIELD_NUMBER' + setattr(cls, constant_name, extension_field.number) diff --git a/pythonlib/build/lib/google/protobuf/internal/decoder.py b/pythonlib/build/lib/google/protobuf/internal/decoder.py new file mode 100644 index 0000000..651ee0d --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/internal/decoder.py @@ -0,0 +1,831 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +#PY25 compatible for GAE. +# +# Copyright 2009 Google Inc. All Rights Reserved. + +"""Code for decoding protocol buffer primitives. + +This code is very similar to encoder.py -- read the docs for that module first. + +A "decoder" is a function with the signature: + Decode(buffer, pos, end, message, field_dict) +The arguments are: + buffer: The string containing the encoded message. + pos: The current position in the string. + end: The position in the string where the current message ends. May be + less than len(buffer) if we're reading a sub-message. + message: The message object into which we're parsing. + field_dict: message._fields (avoids a hashtable lookup). +The decoder reads the field and stores it into field_dict, returning the new +buffer position. A decoder for a repeated field may proactively decode all of +the elements of that field, if they appear consecutively. + +Note that decoders may throw any of the following: + IndexError: Indicates a truncated message. + struct.error: Unpacking of a fixed-width field failed. + message.DecodeError: Other errors. + +Decoders are expected to raise an exception if they are called with pos > end. +This allows callers to be lax about bounds checking: it's fineto read past +"end" as long as you are sure that someone else will notice and throw an +exception later on. + +Something up the call stack is expected to catch IndexError and struct.error +and convert them to message.DecodeError. + +Decoders are constructed using decoder constructors with the signature: + MakeDecoder(field_number, is_repeated, is_packed, key, new_default) +The arguments are: + field_number: The field number of the field we want to decode. + is_repeated: Is the field a repeated field? (bool) + is_packed: Is the field a packed field? (bool) + key: The key to use when looking up the field within field_dict. + (This is actually the FieldDescriptor but nothing in this + file should depend on that.) + new_default: A function which takes a message object as a parameter and + returns a new instance of the default value for this field. + (This is called for repeated fields and sub-messages, when an + instance does not already exist.) + +As with encoders, we define a decoder constructor for every type of field. +Then, for every field of every message class we construct an actual decoder. +That decoder goes into a dict indexed by tag, so when we decode a message +we repeatedly read a tag, look up the corresponding decoder, and invoke it. +""" + +__author__ = 'kenton@google.com (Kenton Varda)' + +import struct +import sys ##PY25 +_PY2 = sys.version_info[0] < 3 ##PY25 +from google.protobuf.internal import encoder +from google.protobuf.internal import wire_format +from google.protobuf import message + + +# This will overflow and thus become IEEE-754 "infinity". We would use +# "float('inf')" but it doesn't work on Windows pre-Python-2.6. +_POS_INF = 1e10000 +_NEG_INF = -_POS_INF +_NAN = _POS_INF * 0 + + +# This is not for optimization, but rather to avoid conflicts with local +# variables named "message". +_DecodeError = message.DecodeError + + +def _VarintDecoder(mask, result_type): + """Return an encoder for a basic varint value (does not include tag). + + Decoded values will be bitwise-anded with the given mask before being + returned, e.g. to limit them to 32 bits. The returned decoder does not + take the usual "end" parameter -- the caller is expected to do bounds checking + after the fact (often the caller can defer such checking until later). The + decoder returns a (value, new_pos) pair. + """ + + local_ord = ord + py2 = _PY2 ##PY25 +##!PY25 py2 = str is bytes + def DecodeVarint(buffer, pos): + result = 0 + shift = 0 + while 1: + b = local_ord(buffer[pos]) if py2 else buffer[pos] + result |= ((b & 0x7f) << shift) + pos += 1 + if not (b & 0x80): + result &= mask + result = result_type(result) + return (result, pos) + shift += 7 + if shift >= 64: + raise _DecodeError('Too many bytes when decoding varint.') + return DecodeVarint + + +def _SignedVarintDecoder(mask, result_type): + """Like _VarintDecoder() but decodes signed values.""" + + local_ord = ord + py2 = _PY2 ##PY25 +##!PY25 py2 = str is bytes + def DecodeVarint(buffer, pos): + result = 0 + shift = 0 + while 1: + b = local_ord(buffer[pos]) if py2 else buffer[pos] + result |= ((b & 0x7f) << shift) + pos += 1 + if not (b & 0x80): + if result > 0x7fffffffffffffff: + result -= (1 << 64) + result |= ~mask + else: + result &= mask + result = result_type(result) + return (result, pos) + shift += 7 + if shift >= 64: + raise _DecodeError('Too many bytes when decoding varint.') + return DecodeVarint + +# We force 32-bit values to int and 64-bit values to long to make +# alternate implementations where the distinction is more significant +# (e.g. the C++ implementation) simpler. + +_DecodeVarint = _VarintDecoder((1 << 64) - 1, long) +_DecodeSignedVarint = _SignedVarintDecoder((1 << 64) - 1, long) + +# Use these versions for values which must be limited to 32 bits. +_DecodeVarint32 = _VarintDecoder((1 << 32) - 1, int) +_DecodeSignedVarint32 = _SignedVarintDecoder((1 << 32) - 1, int) + + +def ReadTag(buffer, pos): + """Read a tag from the buffer, and return a (tag_bytes, new_pos) tuple. + + We return the raw bytes of the tag rather than decoding them. The raw + bytes can then be used to look up the proper decoder. This effectively allows + us to trade some work that would be done in pure-python (decoding a varint) + for work that is done in C (searching for a byte string in a hash table). + In a low-level language it would be much cheaper to decode the varint and + use that, but not in Python. + """ + + py2 = _PY2 ##PY25 +##!PY25 py2 = str is bytes + start = pos + while (ord(buffer[pos]) if py2 else buffer[pos]) & 0x80: + pos += 1 + pos += 1 + return (buffer[start:pos], pos) + + +# -------------------------------------------------------------------- + + +def _SimpleDecoder(wire_type, decode_value): + """Return a constructor for a decoder for fields of a particular type. + + Args: + wire_type: The field's wire type. + decode_value: A function which decodes an individual value, e.g. + _DecodeVarint() + """ + + def SpecificDecoder(field_number, is_repeated, is_packed, key, new_default): + if is_packed: + local_DecodeVarint = _DecodeVarint + def DecodePackedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + (endpoint, pos) = local_DecodeVarint(buffer, pos) + endpoint += pos + if endpoint > end: + raise _DecodeError('Truncated message.') + while pos < endpoint: + (element, pos) = decode_value(buffer, pos) + value.append(element) + if pos > endpoint: + del value[-1] # Discard corrupt value. + raise _DecodeError('Packed element was truncated.') + return pos + return DecodePackedField + elif is_repeated: + tag_bytes = encoder.TagBytes(field_number, wire_type) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + (element, new_pos) = decode_value(buffer, pos) + value.append(element) + # Predict that the next tag is another copy of the same repeated + # field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos >= end: + # Prediction failed. Return. + if new_pos > end: + raise _DecodeError('Truncated message.') + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + (field_dict[key], pos) = decode_value(buffer, pos) + if pos > end: + del field_dict[key] # Discard corrupt value. + raise _DecodeError('Truncated message.') + return pos + return DecodeField + + return SpecificDecoder + + +def _ModifiedDecoder(wire_type, decode_value, modify_value): + """Like SimpleDecoder but additionally invokes modify_value on every value + before storing it. Usually modify_value is ZigZagDecode. + """ + + # Reusing _SimpleDecoder is slightly slower than copying a bunch of code, but + # not enough to make a significant difference. + + def InnerDecode(buffer, pos): + (result, new_pos) = decode_value(buffer, pos) + return (modify_value(result), new_pos) + return _SimpleDecoder(wire_type, InnerDecode) + + +def _StructPackDecoder(wire_type, format): + """Return a constructor for a decoder for a fixed-width field. + + Args: + wire_type: The field's wire type. + format: The format string to pass to struct.unpack(). + """ + + value_size = struct.calcsize(format) + local_unpack = struct.unpack + + # Reusing _SimpleDecoder is slightly slower than copying a bunch of code, but + # not enough to make a significant difference. + + # Note that we expect someone up-stack to catch struct.error and convert + # it to _DecodeError -- this way we don't have to set up exception- + # handling blocks every time we parse one value. + + def InnerDecode(buffer, pos): + new_pos = pos + value_size + result = local_unpack(format, buffer[pos:new_pos])[0] + return (result, new_pos) + return _SimpleDecoder(wire_type, InnerDecode) + + +def _FloatDecoder(): + """Returns a decoder for a float field. + + This code works around a bug in struct.unpack for non-finite 32-bit + floating-point values. + """ + + local_unpack = struct.unpack + b = (lambda x:x) if _PY2 else lambda x:x.encode('latin1') ##PY25 + + def InnerDecode(buffer, pos): + # We expect a 32-bit value in little-endian byte order. Bit 1 is the sign + # bit, bits 2-9 represent the exponent, and bits 10-32 are the significand. + new_pos = pos + 4 + float_bytes = buffer[pos:new_pos] + + # If this value has all its exponent bits set, then it's non-finite. + # In Python 2.4, struct.unpack will convert it to a finite 64-bit value. + # To avoid that, we parse it specially. + if ((float_bytes[3:4] in b('\x7F\xFF')) ##PY25 +##!PY25 if ((float_bytes[3:4] in b'\x7F\xFF') + and (float_bytes[2:3] >= b('\x80'))): ##PY25 +##!PY25 and (float_bytes[2:3] >= b'\x80')): + # If at least one significand bit is set... + if float_bytes[0:3] != b('\x00\x00\x80'): ##PY25 +##!PY25 if float_bytes[0:3] != b'\x00\x00\x80': + return (_NAN, new_pos) + # If sign bit is set... + if float_bytes[3:4] == b('\xFF'): ##PY25 +##!PY25 if float_bytes[3:4] == b'\xFF': + return (_NEG_INF, new_pos) + return (_POS_INF, new_pos) + + # Note that we expect someone up-stack to catch struct.error and convert + # it to _DecodeError -- this way we don't have to set up exception- + # handling blocks every time we parse one value. + result = local_unpack('= b'\xF0') +##!PY25 and (double_bytes[0:7] != b'\x00\x00\x00\x00\x00\x00\xF0')): + if ((double_bytes[7:8] in b('\x7F\xFF')) ##PY25 + and (double_bytes[6:7] >= b('\xF0')) ##PY25 + and (double_bytes[0:7] != b('\x00\x00\x00\x00\x00\x00\xF0'))): ##PY25 + return (_NAN, new_pos) + + # Note that we expect someone up-stack to catch struct.error and convert + # it to _DecodeError -- this way we don't have to set up exception- + # handling blocks every time we parse one value. + result = local_unpack(' end: + raise _DecodeError('Truncated message.') + while pos < endpoint: + value_start_pos = pos + (element, pos) = _DecodeSignedVarint32(buffer, pos) + if element in enum_type.values_by_number: + value.append(element) + else: + if not message._unknown_fields: + message._unknown_fields = [] + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_VARINT) + message._unknown_fields.append( + (tag_bytes, buffer[value_start_pos:pos])) + if pos > endpoint: + if element in enum_type.values_by_number: + del value[-1] # Discard corrupt value. + else: + del message._unknown_fields[-1] + raise _DecodeError('Packed element was truncated.') + return pos + return DecodePackedField + elif is_repeated: + tag_bytes = encoder.TagBytes(field_number, wire_format.WIRETYPE_VARINT) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + (element, new_pos) = _DecodeSignedVarint32(buffer, pos) + if element in enum_type.values_by_number: + value.append(element) + else: + if not message._unknown_fields: + message._unknown_fields = [] + message._unknown_fields.append( + (tag_bytes, buffer[pos:new_pos])) + # Predict that the next tag is another copy of the same repeated + # field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos >= end: + # Prediction failed. Return. + if new_pos > end: + raise _DecodeError('Truncated message.') + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + value_start_pos = pos + (enum_value, pos) = _DecodeSignedVarint32(buffer, pos) + if pos > end: + raise _DecodeError('Truncated message.') + if enum_value in enum_type.values_by_number: + field_dict[key] = enum_value + else: + if not message._unknown_fields: + message._unknown_fields = [] + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_VARINT) + message._unknown_fields.append( + (tag_bytes, buffer[value_start_pos:pos])) + return pos + return DecodeField + + +# -------------------------------------------------------------------- + + +Int32Decoder = _SimpleDecoder( + wire_format.WIRETYPE_VARINT, _DecodeSignedVarint32) + +Int64Decoder = _SimpleDecoder( + wire_format.WIRETYPE_VARINT, _DecodeSignedVarint) + +UInt32Decoder = _SimpleDecoder(wire_format.WIRETYPE_VARINT, _DecodeVarint32) +UInt64Decoder = _SimpleDecoder(wire_format.WIRETYPE_VARINT, _DecodeVarint) + +SInt32Decoder = _ModifiedDecoder( + wire_format.WIRETYPE_VARINT, _DecodeVarint32, wire_format.ZigZagDecode) +SInt64Decoder = _ModifiedDecoder( + wire_format.WIRETYPE_VARINT, _DecodeVarint, wire_format.ZigZagDecode) + +# Note that Python conveniently guarantees that when using the '<' prefix on +# formats, they will also have the same size across all platforms (as opposed +# to without the prefix, where their sizes depend on the C compiler's basic +# type sizes). +Fixed32Decoder = _StructPackDecoder(wire_format.WIRETYPE_FIXED32, ' end: + raise _DecodeError('Truncated string.') + value.append(_ConvertToUnicode(buffer[pos:new_pos])) + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated string.') + field_dict[key] = _ConvertToUnicode(buffer[pos:new_pos]) + return new_pos + return DecodeField + + +def BytesDecoder(field_number, is_repeated, is_packed, key, new_default): + """Returns a decoder for a bytes field.""" + + local_DecodeVarint = _DecodeVarint + + assert not is_packed + if is_repeated: + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_LENGTH_DELIMITED) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated string.') + value.append(buffer[pos:new_pos]) + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated string.') + field_dict[key] = buffer[pos:new_pos] + return new_pos + return DecodeField + + +def GroupDecoder(field_number, is_repeated, is_packed, key, new_default): + """Returns a decoder for a group field.""" + + end_tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_END_GROUP) + end_tag_len = len(end_tag_bytes) + + assert not is_packed + if is_repeated: + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_START_GROUP) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read sub-message. + pos = value.add()._InternalParse(buffer, pos, end) + # Read end tag. + new_pos = pos+end_tag_len + if buffer[pos:new_pos] != end_tag_bytes or new_pos > end: + raise _DecodeError('Missing group end tag.') + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read sub-message. + pos = value._InternalParse(buffer, pos, end) + # Read end tag. + new_pos = pos+end_tag_len + if buffer[pos:new_pos] != end_tag_bytes or new_pos > end: + raise _DecodeError('Missing group end tag.') + return new_pos + return DecodeField + + +def MessageDecoder(field_number, is_repeated, is_packed, key, new_default): + """Returns a decoder for a message field.""" + + local_DecodeVarint = _DecodeVarint + + assert not is_packed + if is_repeated: + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_LENGTH_DELIMITED) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read length. + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated message.') + # Read sub-message. + if value.add()._InternalParse(buffer, pos, new_pos) != new_pos: + # The only reason _InternalParse would return early is if it + # encountered an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read length. + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated message.') + # Read sub-message. + if value._InternalParse(buffer, pos, new_pos) != new_pos: + # The only reason _InternalParse would return early is if it encountered + # an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + return new_pos + return DecodeField + + +# -------------------------------------------------------------------- + +MESSAGE_SET_ITEM_TAG = encoder.TagBytes(1, wire_format.WIRETYPE_START_GROUP) + +def MessageSetItemDecoder(extensions_by_number): + """Returns a decoder for a MessageSet item. + + The parameter is the _extensions_by_number map for the message class. + + The message set message looks like this: + message MessageSet { + repeated group Item = 1 { + required int32 type_id = 2; + required string message = 3; + } + } + """ + + type_id_tag_bytes = encoder.TagBytes(2, wire_format.WIRETYPE_VARINT) + message_tag_bytes = encoder.TagBytes(3, wire_format.WIRETYPE_LENGTH_DELIMITED) + item_end_tag_bytes = encoder.TagBytes(1, wire_format.WIRETYPE_END_GROUP) + + local_ReadTag = ReadTag + local_DecodeVarint = _DecodeVarint + local_SkipField = SkipField + + def DecodeItem(buffer, pos, end, message, field_dict): + message_set_item_start = pos + type_id = -1 + message_start = -1 + message_end = -1 + + # Technically, type_id and message can appear in any order, so we need + # a little loop here. + while 1: + (tag_bytes, pos) = local_ReadTag(buffer, pos) + if tag_bytes == type_id_tag_bytes: + (type_id, pos) = local_DecodeVarint(buffer, pos) + elif tag_bytes == message_tag_bytes: + (size, message_start) = local_DecodeVarint(buffer, pos) + pos = message_end = message_start + size + elif tag_bytes == item_end_tag_bytes: + break + else: + pos = SkipField(buffer, pos, end, tag_bytes) + if pos == -1: + raise _DecodeError('Missing group end tag.') + + if pos > end: + raise _DecodeError('Truncated message.') + + if type_id == -1: + raise _DecodeError('MessageSet item missing type_id.') + if message_start == -1: + raise _DecodeError('MessageSet item missing message.') + + extension = extensions_by_number.get(type_id) + if extension is not None: + value = field_dict.get(extension) + if value is None: + value = field_dict.setdefault( + extension, extension.message_type._concrete_class()) + if value._InternalParse(buffer, message_start,message_end) != message_end: + # The only reason _InternalParse would return early is if it encountered + # an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + else: + if not message._unknown_fields: + message._unknown_fields = [] + message._unknown_fields.append((MESSAGE_SET_ITEM_TAG, + buffer[message_set_item_start:pos])) + + return pos + + return DecodeItem + +# -------------------------------------------------------------------- +# Optimization is not as heavy here because calls to SkipField() are rare, +# except for handling end-group tags. + +def _SkipVarint(buffer, pos, end): + """Skip a varint value. Returns the new position.""" + # Previously ord(buffer[pos]) raised IndexError when pos is out of range. + # With this code, ord(b'') raises TypeError. Both are handled in + # python_message.py to generate a 'Truncated message' error. + while ord(buffer[pos:pos+1]) & 0x80: + pos += 1 + pos += 1 + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _SkipFixed64(buffer, pos, end): + """Skip a fixed64 value. Returns the new position.""" + + pos += 8 + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _SkipLengthDelimited(buffer, pos, end): + """Skip a length-delimited value. Returns the new position.""" + + (size, pos) = _DecodeVarint(buffer, pos) + pos += size + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _SkipGroup(buffer, pos, end): + """Skip sub-group. Returns the new position.""" + + while 1: + (tag_bytes, pos) = ReadTag(buffer, pos) + new_pos = SkipField(buffer, pos, end, tag_bytes) + if new_pos == -1: + return pos + pos = new_pos + +def _EndGroup(buffer, pos, end): + """Skipping an END_GROUP tag returns -1 to tell the parent loop to break.""" + + return -1 + +def _SkipFixed32(buffer, pos, end): + """Skip a fixed32 value. Returns the new position.""" + + pos += 4 + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _RaiseInvalidWireType(buffer, pos, end): + """Skip function for unknown wire types. Raises an exception.""" + + raise _DecodeError('Tag had invalid wire type.') + +def _FieldSkipper(): + """Constructs the SkipField function.""" + + WIRETYPE_TO_SKIPPER = [ + _SkipVarint, + _SkipFixed64, + _SkipLengthDelimited, + _SkipGroup, + _EndGroup, + _SkipFixed32, + _RaiseInvalidWireType, + _RaiseInvalidWireType, + ] + + wiretype_mask = wire_format.TAG_TYPE_MASK + + def SkipField(buffer, pos, end, tag_bytes): + """Skips a field with the specified tag. + + |pos| should point to the byte immediately after the tag. + + Returns: + The new position (after the tag value), or -1 if the tag is an end-group + tag (in which case the calling loop should break). + """ + + # The wire type is always in the first byte since varints are little-endian. + wire_type = ord(tag_bytes[0:1]) & wiretype_mask + return WIRETYPE_TO_SKIPPER[wire_type](buffer, pos, end) + + return SkipField + +SkipField = _FieldSkipper() diff --git a/pythonlib/build/lib/google/protobuf/internal/encoder.py b/pythonlib/build/lib/google/protobuf/internal/encoder.py new file mode 100644 index 0000000..0a7c041 --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/internal/encoder.py @@ -0,0 +1,788 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +#PY25 compatible for GAE. +# +# Copyright 2009 Google Inc. All Rights Reserved. + +"""Code for encoding protocol message primitives. + +Contains the logic for encoding every logical protocol field type +into one of the 5 physical wire types. + +This code is designed to push the Python interpreter's performance to the +limits. + +The basic idea is that at startup time, for every field (i.e. every +FieldDescriptor) we construct two functions: a "sizer" and an "encoder". The +sizer takes a value of this field's type and computes its byte size. The +encoder takes a writer function and a value. It encodes the value into byte +strings and invokes the writer function to write those strings. Typically the +writer function is the write() method of a cStringIO. + +We try to do as much work as possible when constructing the writer and the +sizer rather than when calling them. In particular: +* We copy any needed global functions to local variables, so that we do not need + to do costly global table lookups at runtime. +* Similarly, we try to do any attribute lookups at startup time if possible. +* Every field's tag is encoded to bytes at startup, since it can't change at + runtime. +* Whatever component of the field size we can compute at startup, we do. +* We *avoid* sharing code if doing so would make the code slower and not sharing + does not burden us too much. For example, encoders for repeated fields do + not just call the encoders for singular fields in a loop because this would + add an extra function call overhead for every loop iteration; instead, we + manually inline the single-value encoder into the loop. +* If a Python function lacks a return statement, Python actually generates + instructions to pop the result of the last statement off the stack, push + None onto the stack, and then return that. If we really don't care what + value is returned, then we can save two instructions by returning the + result of the last statement. It looks funny but it helps. +* We assume that type and bounds checking has happened at a higher level. +""" + +__author__ = 'kenton@google.com (Kenton Varda)' + +import struct +import sys ##PY25 +_PY2 = sys.version_info[0] < 3 ##PY25 +from google.protobuf.internal import wire_format + + +# This will overflow and thus become IEEE-754 "infinity". We would use +# "float('inf')" but it doesn't work on Windows pre-Python-2.6. +_POS_INF = 1e10000 +_NEG_INF = -_POS_INF + + +def _VarintSize(value): + """Compute the size of a varint value.""" + if value <= 0x7f: return 1 + if value <= 0x3fff: return 2 + if value <= 0x1fffff: return 3 + if value <= 0xfffffff: return 4 + if value <= 0x7ffffffff: return 5 + if value <= 0x3ffffffffff: return 6 + if value <= 0x1ffffffffffff: return 7 + if value <= 0xffffffffffffff: return 8 + if value <= 0x7fffffffffffffff: return 9 + return 10 + + +def _SignedVarintSize(value): + """Compute the size of a signed varint value.""" + if value < 0: return 10 + if value <= 0x7f: return 1 + if value <= 0x3fff: return 2 + if value <= 0x1fffff: return 3 + if value <= 0xfffffff: return 4 + if value <= 0x7ffffffff: return 5 + if value <= 0x3ffffffffff: return 6 + if value <= 0x1ffffffffffff: return 7 + if value <= 0xffffffffffffff: return 8 + if value <= 0x7fffffffffffffff: return 9 + return 10 + + +def _TagSize(field_number): + """Returns the number of bytes required to serialize a tag with this field + number.""" + # Just pass in type 0, since the type won't affect the tag+type size. + return _VarintSize(wire_format.PackTag(field_number, 0)) + + +# -------------------------------------------------------------------- +# In this section we define some generic sizers. Each of these functions +# takes parameters specific to a particular field type, e.g. int32 or fixed64. +# It returns another function which in turn takes parameters specific to a +# particular field, e.g. the field number and whether it is repeated or packed. +# Look at the next section to see how these are used. + + +def _SimpleSizer(compute_value_size): + """A sizer which uses the function compute_value_size to compute the size of + each value. Typically compute_value_size is _VarintSize.""" + + def SpecificSizer(field_number, is_repeated, is_packed): + tag_size = _TagSize(field_number) + if is_packed: + local_VarintSize = _VarintSize + def PackedFieldSize(value): + result = 0 + for element in value: + result += compute_value_size(element) + return result + local_VarintSize(result) + tag_size + return PackedFieldSize + elif is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + result += compute_value_size(element) + return result + return RepeatedFieldSize + else: + def FieldSize(value): + return tag_size + compute_value_size(value) + return FieldSize + + return SpecificSizer + + +def _ModifiedSizer(compute_value_size, modify_value): + """Like SimpleSizer, but modify_value is invoked on each value before it is + passed to compute_value_size. modify_value is typically ZigZagEncode.""" + + def SpecificSizer(field_number, is_repeated, is_packed): + tag_size = _TagSize(field_number) + if is_packed: + local_VarintSize = _VarintSize + def PackedFieldSize(value): + result = 0 + for element in value: + result += compute_value_size(modify_value(element)) + return result + local_VarintSize(result) + tag_size + return PackedFieldSize + elif is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + result += compute_value_size(modify_value(element)) + return result + return RepeatedFieldSize + else: + def FieldSize(value): + return tag_size + compute_value_size(modify_value(value)) + return FieldSize + + return SpecificSizer + + +def _FixedSizer(value_size): + """Like _SimpleSizer except for a fixed-size field. The input is the size + of one value.""" + + def SpecificSizer(field_number, is_repeated, is_packed): + tag_size = _TagSize(field_number) + if is_packed: + local_VarintSize = _VarintSize + def PackedFieldSize(value): + result = len(value) * value_size + return result + local_VarintSize(result) + tag_size + return PackedFieldSize + elif is_repeated: + element_size = value_size + tag_size + def RepeatedFieldSize(value): + return len(value) * element_size + return RepeatedFieldSize + else: + field_size = value_size + tag_size + def FieldSize(value): + return field_size + return FieldSize + + return SpecificSizer + + +# ==================================================================== +# Here we declare a sizer constructor for each field type. Each "sizer +# constructor" is a function that takes (field_number, is_repeated, is_packed) +# as parameters and returns a sizer, which in turn takes a field value as +# a parameter and returns its encoded size. + + +Int32Sizer = Int64Sizer = EnumSizer = _SimpleSizer(_SignedVarintSize) + +UInt32Sizer = UInt64Sizer = _SimpleSizer(_VarintSize) + +SInt32Sizer = SInt64Sizer = _ModifiedSizer( + _SignedVarintSize, wire_format.ZigZagEncode) + +Fixed32Sizer = SFixed32Sizer = FloatSizer = _FixedSizer(4) +Fixed64Sizer = SFixed64Sizer = DoubleSizer = _FixedSizer(8) + +BoolSizer = _FixedSizer(1) + + +def StringSizer(field_number, is_repeated, is_packed): + """Returns a sizer for a string field.""" + + tag_size = _TagSize(field_number) + local_VarintSize = _VarintSize + local_len = len + assert not is_packed + if is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + l = local_len(element.encode('utf-8')) + result += local_VarintSize(l) + l + return result + return RepeatedFieldSize + else: + def FieldSize(value): + l = local_len(value.encode('utf-8')) + return tag_size + local_VarintSize(l) + l + return FieldSize + + +def BytesSizer(field_number, is_repeated, is_packed): + """Returns a sizer for a bytes field.""" + + tag_size = _TagSize(field_number) + local_VarintSize = _VarintSize + local_len = len + assert not is_packed + if is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + l = local_len(element) + result += local_VarintSize(l) + l + return result + return RepeatedFieldSize + else: + def FieldSize(value): + l = local_len(value) + return tag_size + local_VarintSize(l) + l + return FieldSize + + +def GroupSizer(field_number, is_repeated, is_packed): + """Returns a sizer for a group field.""" + + tag_size = _TagSize(field_number) * 2 + assert not is_packed + if is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + result += element.ByteSize() + return result + return RepeatedFieldSize + else: + def FieldSize(value): + return tag_size + value.ByteSize() + return FieldSize + + +def MessageSizer(field_number, is_repeated, is_packed): + """Returns a sizer for a message field.""" + + tag_size = _TagSize(field_number) + local_VarintSize = _VarintSize + assert not is_packed + if is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + l = element.ByteSize() + result += local_VarintSize(l) + l + return result + return RepeatedFieldSize + else: + def FieldSize(value): + l = value.ByteSize() + return tag_size + local_VarintSize(l) + l + return FieldSize + + +# -------------------------------------------------------------------- +# MessageSet is special. + + +def MessageSetItemSizer(field_number): + """Returns a sizer for extensions of MessageSet. + + The message set message looks like this: + message MessageSet { + repeated group Item = 1 { + required int32 type_id = 2; + required string message = 3; + } + } + """ + static_size = (_TagSize(1) * 2 + _TagSize(2) + _VarintSize(field_number) + + _TagSize(3)) + local_VarintSize = _VarintSize + + def FieldSize(value): + l = value.ByteSize() + return static_size + local_VarintSize(l) + l + + return FieldSize + + +# ==================================================================== +# Encoders! + + +def _VarintEncoder(): + """Return an encoder for a basic varint value (does not include tag).""" + + local_chr = _PY2 and chr or (lambda x: bytes((x,))) ##PY25 +##!PY25 local_chr = chr if bytes is str else lambda x: bytes((x,)) + def EncodeVarint(write, value): + bits = value & 0x7f + value >>= 7 + while value: + write(local_chr(0x80|bits)) + bits = value & 0x7f + value >>= 7 + return write(local_chr(bits)) + + return EncodeVarint + + +def _SignedVarintEncoder(): + """Return an encoder for a basic signed varint value (does not include + tag).""" + + local_chr = _PY2 and chr or (lambda x: bytes((x,))) ##PY25 +##!PY25 local_chr = chr if bytes is str else lambda x: bytes((x,)) + def EncodeSignedVarint(write, value): + if value < 0: + value += (1 << 64) + bits = value & 0x7f + value >>= 7 + while value: + write(local_chr(0x80|bits)) + bits = value & 0x7f + value >>= 7 + return write(local_chr(bits)) + + return EncodeSignedVarint + + +_EncodeVarint = _VarintEncoder() +_EncodeSignedVarint = _SignedVarintEncoder() + + +def _VarintBytes(value): + """Encode the given integer as a varint and return the bytes. This is only + called at startup time so it doesn't need to be fast.""" + + pieces = [] + _EncodeVarint(pieces.append, value) + return "".encode("latin1").join(pieces) ##PY25 +##!PY25 return b"".join(pieces) + + +def TagBytes(field_number, wire_type): + """Encode the given tag and return the bytes. Only called at startup.""" + + return _VarintBytes(wire_format.PackTag(field_number, wire_type)) + +# -------------------------------------------------------------------- +# As with sizers (see above), we have a number of common encoder +# implementations. + + +def _SimpleEncoder(wire_type, encode_value, compute_value_size): + """Return a constructor for an encoder for fields of a particular type. + + Args: + wire_type: The field's wire type, for encoding tags. + encode_value: A function which encodes an individual value, e.g. + _EncodeVarint(). + compute_value_size: A function which computes the size of an individual + value, e.g. _VarintSize(). + """ + + def SpecificEncoder(field_number, is_repeated, is_packed): + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value): + write(tag_bytes) + size = 0 + for element in value: + size += compute_value_size(element) + local_EncodeVarint(write, size) + for element in value: + encode_value(write, element) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value): + for element in value: + write(tag_bytes) + encode_value(write, element) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value): + write(tag_bytes) + return encode_value(write, value) + return EncodeField + + return SpecificEncoder + + +def _ModifiedEncoder(wire_type, encode_value, compute_value_size, modify_value): + """Like SimpleEncoder but additionally invokes modify_value on every value + before passing it to encode_value. Usually modify_value is ZigZagEncode.""" + + def SpecificEncoder(field_number, is_repeated, is_packed): + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value): + write(tag_bytes) + size = 0 + for element in value: + size += compute_value_size(modify_value(element)) + local_EncodeVarint(write, size) + for element in value: + encode_value(write, modify_value(element)) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value): + for element in value: + write(tag_bytes) + encode_value(write, modify_value(element)) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value): + write(tag_bytes) + return encode_value(write, modify_value(value)) + return EncodeField + + return SpecificEncoder + + +def _StructPackEncoder(wire_type, format): + """Return a constructor for an encoder for a fixed-width field. + + Args: + wire_type: The field's wire type, for encoding tags. + format: The format string to pass to struct.pack(). + """ + + value_size = struct.calcsize(format) + + def SpecificEncoder(field_number, is_repeated, is_packed): + local_struct_pack = struct.pack + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value): + write(tag_bytes) + local_EncodeVarint(write, len(value) * value_size) + for element in value: + write(local_struct_pack(format, element)) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value): + for element in value: + write(tag_bytes) + write(local_struct_pack(format, element)) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value): + write(tag_bytes) + return write(local_struct_pack(format, value)) + return EncodeField + + return SpecificEncoder + + +def _FloatingPointEncoder(wire_type, format): + """Return a constructor for an encoder for float fields. + + This is like StructPackEncoder, but catches errors that may be due to + passing non-finite floating-point values to struct.pack, and makes a + second attempt to encode those values. + + Args: + wire_type: The field's wire type, for encoding tags. + format: The format string to pass to struct.pack(). + """ + + b = _PY2 and (lambda x:x) or (lambda x:x.encode('latin1')) ##PY25 + value_size = struct.calcsize(format) + if value_size == 4: + def EncodeNonFiniteOrRaise(write, value): + # Remember that the serialized form uses little-endian byte order. + if value == _POS_INF: + write(b('\x00\x00\x80\x7F')) ##PY25 +##!PY25 write(b'\x00\x00\x80\x7F') + elif value == _NEG_INF: + write(b('\x00\x00\x80\xFF')) ##PY25 +##!PY25 write(b'\x00\x00\x80\xFF') + elif value != value: # NaN + write(b('\x00\x00\xC0\x7F')) ##PY25 +##!PY25 write(b'\x00\x00\xC0\x7F') + else: + raise + elif value_size == 8: + def EncodeNonFiniteOrRaise(write, value): + if value == _POS_INF: + write(b('\x00\x00\x00\x00\x00\x00\xF0\x7F')) ##PY25 +##!PY25 write(b'\x00\x00\x00\x00\x00\x00\xF0\x7F') + elif value == _NEG_INF: + write(b('\x00\x00\x00\x00\x00\x00\xF0\xFF')) ##PY25 +##!PY25 write(b'\x00\x00\x00\x00\x00\x00\xF0\xFF') + elif value != value: # NaN + write(b('\x00\x00\x00\x00\x00\x00\xF8\x7F')) ##PY25 +##!PY25 write(b'\x00\x00\x00\x00\x00\x00\xF8\x7F') + else: + raise + else: + raise ValueError('Can\'t encode floating-point values that are ' + '%d bytes long (only 4 or 8)' % value_size) + + def SpecificEncoder(field_number, is_repeated, is_packed): + local_struct_pack = struct.pack + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value): + write(tag_bytes) + local_EncodeVarint(write, len(value) * value_size) + for element in value: + # This try/except block is going to be faster than any code that + # we could write to check whether element is finite. + try: + write(local_struct_pack(format, element)) + except SystemError: + EncodeNonFiniteOrRaise(write, element) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value): + for element in value: + write(tag_bytes) + try: + write(local_struct_pack(format, element)) + except SystemError: + EncodeNonFiniteOrRaise(write, element) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value): + write(tag_bytes) + try: + write(local_struct_pack(format, value)) + except SystemError: + EncodeNonFiniteOrRaise(write, value) + return EncodeField + + return SpecificEncoder + + +# ==================================================================== +# Here we declare an encoder constructor for each field type. These work +# very similarly to sizer constructors, described earlier. + + +Int32Encoder = Int64Encoder = EnumEncoder = _SimpleEncoder( + wire_format.WIRETYPE_VARINT, _EncodeSignedVarint, _SignedVarintSize) + +UInt32Encoder = UInt64Encoder = _SimpleEncoder( + wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize) + +SInt32Encoder = SInt64Encoder = _ModifiedEncoder( + wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize, + wire_format.ZigZagEncode) + +# Note that Python conveniently guarantees that when using the '<' prefix on +# formats, they will also have the same size across all platforms (as opposed +# to without the prefix, where their sizes depend on the C compiler's basic +# type sizes). +Fixed32Encoder = _StructPackEncoder(wire_format.WIRETYPE_FIXED32, ' 0 + self._fields = {} + # Contains a mapping from oneof field descriptors to the descriptor + # of the currently set field in that oneof field. + self._oneofs = {} + + # _unknown_fields is () when empty for efficiency, and will be turned into + # a list if fields are added. + self._unknown_fields = () + self._is_present_in_parent = False + self._listener = message_listener_mod.NullMessageListener() + self._listener_for_children = _Listener(self) + for field_name, field_value in kwargs.iteritems(): + field = _GetFieldByName(message_descriptor, field_name) + if field is None: + raise TypeError("%s() got an unexpected keyword argument '%s'" % + (message_descriptor.name, field_name)) + if field.label == _FieldDescriptor.LABEL_REPEATED: + copy = field._default_constructor(self) + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite + for val in field_value: + copy.add().MergeFrom(val) + else: # Scalar + copy.extend(field_value) + self._fields[field] = copy + elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + copy = field._default_constructor(self) + copy.MergeFrom(field_value) + self._fields[field] = copy + else: + setattr(self, field_name, field_value) + + init.__module__ = None + init.__doc__ = None + cls.__init__ = init + + +def _GetFieldByName(message_descriptor, field_name): + """Returns a field descriptor by field name. + + Args: + message_descriptor: A Descriptor describing all fields in message. + field_name: The name of the field to retrieve. + Returns: + The field descriptor associated with the field name. + """ + try: + return message_descriptor.fields_by_name[field_name] + except KeyError: + raise ValueError('Protocol message has no "%s" field.' % field_name) + + +def _AddPropertiesForFields(descriptor, cls): + """Adds properties for all fields in this protocol message type.""" + for field in descriptor.fields: + _AddPropertiesForField(field, cls) + + if descriptor.is_extendable: + # _ExtensionDict is just an adaptor with no state so we allocate a new one + # every time it is accessed. + cls.Extensions = property(lambda self: _ExtensionDict(self)) + + +def _AddPropertiesForField(field, cls): + """Adds a public property for a protocol message field. + Clients can use this property to get and (in the case + of non-repeated scalar fields) directly set the value + of a protocol message field. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + # Catch it if we add other types that we should + # handle specially here. + assert _FieldDescriptor.MAX_CPPTYPE == 10 + + constant_name = field.name.upper() + "_FIELD_NUMBER" + setattr(cls, constant_name, field.number) + + if field.label == _FieldDescriptor.LABEL_REPEATED: + _AddPropertiesForRepeatedField(field, cls) + elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + _AddPropertiesForNonRepeatedCompositeField(field, cls) + else: + _AddPropertiesForNonRepeatedScalarField(field, cls) + + +def _AddPropertiesForRepeatedField(field, cls): + """Adds a public property for a "repeated" protocol message field. Clients + can use this property to get the value of the field, which will be either a + _RepeatedScalarFieldContainer or _RepeatedCompositeFieldContainer (see + below). + + Note that when clients add values to these containers, we perform + type-checking in the case of repeated scalar fields, and we also set any + necessary "has" bits as a side-effect. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + proto_field_name = field.name + property_name = _PropertyName(proto_field_name) + + def getter(self): + field_value = self._fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + + # Atomically check if another thread has preempted us and, if not, swap + # in the new object we just created. If someone has preempted us, we + # take that object and discard ours. + # WARNING: We are relying on setdefault() being atomic. This is true + # in CPython but we haven't investigated others. This warning appears + # in several other locations in this file. + field_value = self._fields.setdefault(field, field_value) + return field_value + getter.__module__ = None + getter.__doc__ = 'Getter for %s.' % proto_field_name + + # We define a setter just so we can throw an exception with a more + # helpful error message. + def setter(self, new_value): + raise AttributeError('Assignment not allowed to repeated field ' + '"%s" in protocol message object.' % proto_field_name) + + doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name + setattr(cls, property_name, property(getter, setter, doc=doc)) + + +def _AddPropertiesForNonRepeatedScalarField(field, cls): + """Adds a public property for a nonrepeated, scalar protocol message field. + Clients can use this property to get and directly set the value of the field. + Note that when the client sets the value of a field by using this property, + all necessary "has" bits are set as a side-effect, and we also perform + type-checking. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + proto_field_name = field.name + property_name = _PropertyName(proto_field_name) + type_checker = type_checkers.GetTypeChecker(field) + default_value = field.default_value + valid_values = set() + + def getter(self): + # TODO(protobuf-team): This may be broken since there may not be + # default_value. Combine with has_default_value somehow. + return self._fields.get(field, default_value) + getter.__module__ = None + getter.__doc__ = 'Getter for %s.' % proto_field_name + def field_setter(self, new_value): + # pylint: disable=protected-access + self._fields[field] = type_checker.CheckValue(new_value) + # Check _cached_byte_size_dirty inline to improve performance, since scalar + # setters are called frequently. + if not self._cached_byte_size_dirty: + self._Modified() + + if field.containing_oneof is not None: + def setter(self, new_value): + field_setter(self, new_value) + self._UpdateOneofState(field) + else: + setter = field_setter + + setter.__module__ = None + setter.__doc__ = 'Setter for %s.' % proto_field_name + + # Add a property to encapsulate the getter/setter. + doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name + setattr(cls, property_name, property(getter, setter, doc=doc)) + + +def _AddPropertiesForNonRepeatedCompositeField(field, cls): + """Adds a public property for a nonrepeated, composite protocol message field. + A composite field is a "group" or "message" field. + + Clients can use this property to get the value of the field, but cannot + assign to the property directly. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + # TODO(robinson): Remove duplication with similar method + # for non-repeated scalars. + proto_field_name = field.name + property_name = _PropertyName(proto_field_name) + + # TODO(komarek): Can anyone explain to me why we cache the message_type this + # way, instead of referring to field.message_type inside of getter(self)? + # What if someone sets message_type later on (which makes for simpler + # dyanmic proto descriptor and class creation code). + message_type = field.message_type + + def getter(self): + field_value = self._fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = message_type._concrete_class() # use field.message_type? + field_value._SetListener( + _OneofListener(self, field) + if field.containing_oneof is not None + else self._listener_for_children) + + # Atomically check if another thread has preempted us and, if not, swap + # in the new object we just created. If someone has preempted us, we + # take that object and discard ours. + # WARNING: We are relying on setdefault() being atomic. This is true + # in CPython but we haven't investigated others. This warning appears + # in several other locations in this file. + field_value = self._fields.setdefault(field, field_value) + return field_value + getter.__module__ = None + getter.__doc__ = 'Getter for %s.' % proto_field_name + + # We define a setter just so we can throw an exception with a more + # helpful error message. + def setter(self, new_value): + raise AttributeError('Assignment not allowed to composite field ' + '"%s" in protocol message object.' % proto_field_name) + + # Add a property to encapsulate the getter. + doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name + setattr(cls, property_name, property(getter, setter, doc=doc)) + + +def _AddPropertiesForExtensions(descriptor, cls): + """Adds properties for all fields in this protocol message type.""" + extension_dict = descriptor.extensions_by_name + for extension_name, extension_field in extension_dict.iteritems(): + constant_name = extension_name.upper() + "_FIELD_NUMBER" + setattr(cls, constant_name, extension_field.number) + + +def _AddStaticMethods(cls): + # TODO(robinson): This probably needs to be thread-safe(?) + def RegisterExtension(extension_handle): + extension_handle.containing_type = cls.DESCRIPTOR + _AttachFieldHelpers(cls, extension_handle) + + # Try to insert our extension, failing if an extension with the same number + # already exists. + actual_handle = cls._extensions_by_number.setdefault( + extension_handle.number, extension_handle) + if actual_handle is not extension_handle: + raise AssertionError( + 'Extensions "%s" and "%s" both try to extend message type "%s" with ' + 'field number %d.' % + (extension_handle.full_name, actual_handle.full_name, + cls.DESCRIPTOR.full_name, extension_handle.number)) + + cls._extensions_by_name[extension_handle.full_name] = extension_handle + + handle = extension_handle # avoid line wrapping + if _IsMessageSetExtension(handle): + # MessageSet extension. Also register under type name. + cls._extensions_by_name[ + extension_handle.message_type.full_name] = extension_handle + + cls.RegisterExtension = staticmethod(RegisterExtension) + + def FromString(s): + message = cls() + message.MergeFromString(s) + return message + cls.FromString = staticmethod(FromString) + + +def _IsPresent(item): + """Given a (FieldDescriptor, value) tuple from _fields, return true if the + value should be included in the list returned by ListFields().""" + + if item[0].label == _FieldDescriptor.LABEL_REPEATED: + return bool(item[1]) + elif item[0].cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + return item[1]._is_present_in_parent + else: + return True + + +def _AddListFieldsMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def ListFields(self): + all_fields = [item for item in self._fields.iteritems() if _IsPresent(item)] + all_fields.sort(key = lambda item: item[0].number) + return all_fields + + cls.ListFields = ListFields + + +def _AddHasFieldMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + singular_fields = {} + for field in message_descriptor.fields: + if field.label != _FieldDescriptor.LABEL_REPEATED: + singular_fields[field.name] = field + # Fields inside oneofs are never repeated (enforced by the compiler). + for field in message_descriptor.oneofs: + singular_fields[field.name] = field + + def HasField(self, field_name): + try: + field = singular_fields[field_name] + except KeyError: + raise ValueError( + 'Protocol message has no singular "%s" field.' % field_name) + + if isinstance(field, descriptor_mod.OneofDescriptor): + try: + return HasField(self, self._oneofs[field].name) + except KeyError: + return False + else: + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + value = self._fields.get(field) + return value is not None and value._is_present_in_parent + else: + return field in self._fields + + cls.HasField = HasField + + +def _AddClearFieldMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def ClearField(self, field_name): + try: + field = message_descriptor.fields_by_name[field_name] + except KeyError: + try: + field = message_descriptor.oneofs_by_name[field_name] + if field in self._oneofs: + field = self._oneofs[field] + else: + return + except KeyError: + raise ValueError('Protocol message has no "%s" field.' % field_name) + + if field in self._fields: + # Note: If the field is a sub-message, its listener will still point + # at us. That's fine, because the worst than can happen is that it + # will call _Modified() and invalidate our byte size. Big deal. + del self._fields[field] + + if self._oneofs.get(field.containing_oneof, None) is field: + del self._oneofs[field.containing_oneof] + + # Always call _Modified() -- even if nothing was changed, this is + # a mutating method, and thus calling it should cause the field to become + # present in the parent message. + self._Modified() + + cls.ClearField = ClearField + + +def _AddClearExtensionMethod(cls): + """Helper for _AddMessageMethods().""" + def ClearExtension(self, extension_handle): + _VerifyExtensionHandle(self, extension_handle) + + # Similar to ClearField(), above. + if extension_handle in self._fields: + del self._fields[extension_handle] + self._Modified() + cls.ClearExtension = ClearExtension + + +def _AddClearMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def Clear(self): + # Clear fields. + self._fields = {} + self._unknown_fields = () + self._Modified() + cls.Clear = Clear + + +def _AddHasExtensionMethod(cls): + """Helper for _AddMessageMethods().""" + def HasExtension(self, extension_handle): + _VerifyExtensionHandle(self, extension_handle) + if extension_handle.label == _FieldDescriptor.LABEL_REPEATED: + raise KeyError('"%s" is repeated.' % extension_handle.full_name) + + if extension_handle.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + value = self._fields.get(extension_handle) + return value is not None and value._is_present_in_parent + else: + return extension_handle in self._fields + cls.HasExtension = HasExtension + + +def _AddEqualsMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def __eq__(self, other): + if (not isinstance(other, message_mod.Message) or + other.DESCRIPTOR != self.DESCRIPTOR): + return False + + if self is other: + return True + + if not self.ListFields() == other.ListFields(): + return False + + # Sort unknown fields because their order shouldn't affect equality test. + unknown_fields = list(self._unknown_fields) + unknown_fields.sort() + other_unknown_fields = list(other._unknown_fields) + other_unknown_fields.sort() + + return unknown_fields == other_unknown_fields + + cls.__eq__ = __eq__ + + +def _AddStrMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def __str__(self): + return text_format.MessageToString(self) + cls.__str__ = __str__ + + +def _AddUnicodeMethod(unused_message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def __unicode__(self): + return text_format.MessageToString(self, as_utf8=True).decode('utf-8') + cls.__unicode__ = __unicode__ + + +def _AddSetListenerMethod(cls): + """Helper for _AddMessageMethods().""" + def SetListener(self, listener): + if listener is None: + self._listener = message_listener_mod.NullMessageListener() + else: + self._listener = listener + cls._SetListener = SetListener + + +def _BytesForNonRepeatedElement(value, field_number, field_type): + """Returns the number of bytes needed to serialize a non-repeated element. + The returned byte count includes space for tag information and any + other additional space associated with serializing value. + + Args: + value: Value we're serializing. + field_number: Field number of this value. (Since the field number + is stored as part of a varint-encoded tag, this has an impact + on the total bytes required to serialize the value). + field_type: The type of the field. One of the TYPE_* constants + within FieldDescriptor. + """ + try: + fn = type_checkers.TYPE_TO_BYTE_SIZE_FN[field_type] + return fn(field_number, value) + except KeyError: + raise message_mod.EncodeError('Unrecognized field type: %d' % field_type) + + +def _AddByteSizeMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def ByteSize(self): + if not self._cached_byte_size_dirty: + return self._cached_byte_size + + size = 0 + for field_descriptor, field_value in self.ListFields(): + size += field_descriptor._sizer(field_value) + + for tag_bytes, value_bytes in self._unknown_fields: + size += len(tag_bytes) + len(value_bytes) + + self._cached_byte_size = size + self._cached_byte_size_dirty = False + self._listener_for_children.dirty = False + return size + + cls.ByteSize = ByteSize + + +def _AddSerializeToStringMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def SerializeToString(self): + # Check if the message has all of its required fields set. + errors = [] + if not self.IsInitialized(): + raise message_mod.EncodeError( + 'Message %s is missing required fields: %s' % ( + self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) + return self.SerializePartialToString() + cls.SerializeToString = SerializeToString + + +def _AddSerializePartialToStringMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def SerializePartialToString(self): + out = BytesIO() + self._InternalSerialize(out.write) + return out.getvalue() + cls.SerializePartialToString = SerializePartialToString + + def InternalSerialize(self, write_bytes): + for field_descriptor, field_value in self.ListFields(): + field_descriptor._encoder(write_bytes, field_value) + for tag_bytes, value_bytes in self._unknown_fields: + write_bytes(tag_bytes) + write_bytes(value_bytes) + cls._InternalSerialize = InternalSerialize + + +def _AddMergeFromStringMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def MergeFromString(self, serialized): + length = len(serialized) + try: + if self._InternalParse(serialized, 0, length) != length: + # The only reason _InternalParse would return early is if it + # encountered an end-group tag. + raise message_mod.DecodeError('Unexpected end-group tag.') + except (IndexError, TypeError): + # Now ord(buf[p:p+1]) == ord('') gets TypeError. + raise message_mod.DecodeError('Truncated message.') + except struct.error, e: + raise message_mod.DecodeError(e) + return length # Return this for legacy reasons. + cls.MergeFromString = MergeFromString + + local_ReadTag = decoder.ReadTag + local_SkipField = decoder.SkipField + decoders_by_tag = cls._decoders_by_tag + + def InternalParse(self, buffer, pos, end): + self._Modified() + field_dict = self._fields + unknown_field_list = self._unknown_fields + while pos != end: + (tag_bytes, new_pos) = local_ReadTag(buffer, pos) + field_decoder = decoders_by_tag.get(tag_bytes) + if field_decoder is None: + value_start_pos = new_pos + new_pos = local_SkipField(buffer, new_pos, end, tag_bytes) + if new_pos == -1: + return pos + if not unknown_field_list: + unknown_field_list = self._unknown_fields = [] + unknown_field_list.append((tag_bytes, buffer[value_start_pos:new_pos])) + pos = new_pos + else: + pos = field_decoder(buffer, new_pos, end, self, field_dict) + return pos + cls._InternalParse = InternalParse + + +def _AddIsInitializedMethod(message_descriptor, cls): + """Adds the IsInitialized and FindInitializationError methods to the + protocol message class.""" + + required_fields = [field for field in message_descriptor.fields + if field.label == _FieldDescriptor.LABEL_REQUIRED] + + def IsInitialized(self, errors=None): + """Checks if all required fields of a message are set. + + Args: + errors: A list which, if provided, will be populated with the field + paths of all missing required fields. + + Returns: + True iff the specified message has all required fields set. + """ + + # Performance is critical so we avoid HasField() and ListFields(). + + for field in required_fields: + if (field not in self._fields or + (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and + not self._fields[field]._is_present_in_parent)): + if errors is not None: + errors.extend(self.FindInitializationErrors()) + return False + + for field, value in list(self._fields.items()): # dict can change size! + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + if field.label == _FieldDescriptor.LABEL_REPEATED: + for element in value: + if not element.IsInitialized(): + if errors is not None: + errors.extend(self.FindInitializationErrors()) + return False + elif value._is_present_in_parent and not value.IsInitialized(): + if errors is not None: + errors.extend(self.FindInitializationErrors()) + return False + + return True + + cls.IsInitialized = IsInitialized + + def FindInitializationErrors(self): + """Finds required fields which are not initialized. + + Returns: + A list of strings. Each string is a path to an uninitialized field from + the top-level message, e.g. "foo.bar[5].baz". + """ + + errors = [] # simplify things + + for field in required_fields: + if not self.HasField(field.name): + errors.append(field.name) + + for field, value in self.ListFields(): + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + if field.is_extension: + name = "(%s)" % field.full_name + else: + name = field.name + + if field.label == _FieldDescriptor.LABEL_REPEATED: + for i in xrange(len(value)): + element = value[i] + prefix = "%s[%d]." % (name, i) + sub_errors = element.FindInitializationErrors() + errors += [ prefix + error for error in sub_errors ] + else: + prefix = name + "." + sub_errors = value.FindInitializationErrors() + errors += [ prefix + error for error in sub_errors ] + + return errors + + cls.FindInitializationErrors = FindInitializationErrors + + +def _AddMergeFromMethod(cls): + LABEL_REPEATED = _FieldDescriptor.LABEL_REPEATED + CPPTYPE_MESSAGE = _FieldDescriptor.CPPTYPE_MESSAGE + + def MergeFrom(self, msg): + if not isinstance(msg, cls): + raise TypeError( + "Parameter to MergeFrom() must be instance of same class: " + "expected %s got %s." % (cls.__name__, type(msg).__name__)) + + assert msg is not self + self._Modified() + + fields = self._fields + + for field, value in msg._fields.iteritems(): + if field.label == LABEL_REPEATED: + field_value = fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + fields[field] = field_value + field_value.MergeFrom(value) + elif field.cpp_type == CPPTYPE_MESSAGE: + if value._is_present_in_parent: + field_value = fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + fields[field] = field_value + field_value.MergeFrom(value) + else: + self._fields[field] = value + + if msg._unknown_fields: + if not self._unknown_fields: + self._unknown_fields = [] + self._unknown_fields.extend(msg._unknown_fields) + + cls.MergeFrom = MergeFrom + + +def _AddWhichOneofMethod(message_descriptor, cls): + def WhichOneof(self, oneof_name): + """Returns the name of the currently set field inside a oneof, or None.""" + try: + field = message_descriptor.oneofs_by_name[oneof_name] + except KeyError: + raise ValueError( + 'Protocol message has no oneof "%s" field.' % oneof_name) + + nested_field = self._oneofs.get(field, None) + if nested_field is not None and self.HasField(nested_field.name): + return nested_field.name + else: + return None + + cls.WhichOneof = WhichOneof + + +def _AddMessageMethods(message_descriptor, cls): + """Adds implementations of all Message methods to cls.""" + _AddListFieldsMethod(message_descriptor, cls) + _AddHasFieldMethod(message_descriptor, cls) + _AddClearFieldMethod(message_descriptor, cls) + if message_descriptor.is_extendable: + _AddClearExtensionMethod(cls) + _AddHasExtensionMethod(cls) + _AddClearMethod(message_descriptor, cls) + _AddEqualsMethod(message_descriptor, cls) + _AddStrMethod(message_descriptor, cls) + _AddUnicodeMethod(message_descriptor, cls) + _AddSetListenerMethod(cls) + _AddByteSizeMethod(message_descriptor, cls) + _AddSerializeToStringMethod(message_descriptor, cls) + _AddSerializePartialToStringMethod(message_descriptor, cls) + _AddMergeFromStringMethod(message_descriptor, cls) + _AddIsInitializedMethod(message_descriptor, cls) + _AddMergeFromMethod(cls) + _AddWhichOneofMethod(message_descriptor, cls) + +def _AddPrivateHelperMethods(message_descriptor, cls): + """Adds implementation of private helper methods to cls.""" + + def Modified(self): + """Sets the _cached_byte_size_dirty bit to true, + and propagates this to our listener iff this was a state change. + """ + + # Note: Some callers check _cached_byte_size_dirty before calling + # _Modified() as an extra optimization. So, if this method is ever + # changed such that it does stuff even when _cached_byte_size_dirty is + # already true, the callers need to be updated. + if not self._cached_byte_size_dirty: + self._cached_byte_size_dirty = True + self._listener_for_children.dirty = True + self._is_present_in_parent = True + self._listener.Modified() + + def _UpdateOneofState(self, field): + """Sets field as the active field in its containing oneof. + + Will also delete currently active field in the oneof, if it is different + from the argument. Does not mark the message as modified. + """ + other_field = self._oneofs.setdefault(field.containing_oneof, field) + if other_field is not field: + del self._fields[other_field] + self._oneofs[field.containing_oneof] = field + + cls._Modified = Modified + cls.SetInParent = Modified + cls._UpdateOneofState = _UpdateOneofState + + +class _Listener(object): + + """MessageListener implementation that a parent message registers with its + child message. + + In order to support semantics like: + + foo.bar.baz.qux = 23 + assert foo.HasField('bar') + + ...child objects must have back references to their parents. + This helper class is at the heart of this support. + """ + + def __init__(self, parent_message): + """Args: + parent_message: The message whose _Modified() method we should call when + we receive Modified() messages. + """ + # This listener establishes a back reference from a child (contained) object + # to its parent (containing) object. We make this a weak reference to avoid + # creating cyclic garbage when the client finishes with the 'parent' object + # in the tree. + if isinstance(parent_message, weakref.ProxyType): + self._parent_message_weakref = parent_message + else: + self._parent_message_weakref = weakref.proxy(parent_message) + + # As an optimization, we also indicate directly on the listener whether + # or not the parent message is dirty. This way we can avoid traversing + # up the tree in the common case. + self.dirty = False + + def Modified(self): + if self.dirty: + return + try: + # Propagate the signal to our parents iff this is the first field set. + self._parent_message_weakref._Modified() + except ReferenceError: + # We can get here if a client has kept a reference to a child object, + # and is now setting a field on it, but the child's parent has been + # garbage-collected. This is not an error. + pass + + +class _OneofListener(_Listener): + """Special listener implementation for setting composite oneof fields.""" + + def __init__(self, parent_message, field): + """Args: + parent_message: The message whose _Modified() method we should call when + we receive Modified() messages. + field: The descriptor of the field being set in the parent message. + """ + super(_OneofListener, self).__init__(parent_message) + self._field = field + + def Modified(self): + """Also updates the state of the containing oneof in the parent message.""" + try: + self._parent_message_weakref._UpdateOneofState(self._field) + super(_OneofListener, self).Modified() + except ReferenceError: + pass + + +# TODO(robinson): Move elsewhere? This file is getting pretty ridiculous... +# TODO(robinson): Unify error handling of "unknown extension" crap. +# TODO(robinson): Support iteritems()-style iteration over all +# extensions with the "has" bits turned on? +class _ExtensionDict(object): + + """Dict-like container for supporting an indexable "Extensions" + field on proto instances. + + Note that in all cases we expect extension handles to be + FieldDescriptors. + """ + + def __init__(self, extended_message): + """extended_message: Message instance for which we are the Extensions dict. + """ + + self._extended_message = extended_message + + def __getitem__(self, extension_handle): + """Returns the current value of the given extension handle.""" + + _VerifyExtensionHandle(self._extended_message, extension_handle) + + result = self._extended_message._fields.get(extension_handle) + if result is not None: + return result + + if extension_handle.label == _FieldDescriptor.LABEL_REPEATED: + result = extension_handle._default_constructor(self._extended_message) + elif extension_handle.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + result = extension_handle.message_type._concrete_class() + try: + result._SetListener(self._extended_message._listener_for_children) + except ReferenceError: + pass + else: + # Singular scalar -- just return the default without inserting into the + # dict. + return extension_handle.default_value + + # Atomically check if another thread has preempted us and, if not, swap + # in the new object we just created. If someone has preempted us, we + # take that object and discard ours. + # WARNING: We are relying on setdefault() being atomic. This is true + # in CPython but we haven't investigated others. This warning appears + # in several other locations in this file. + result = self._extended_message._fields.setdefault( + extension_handle, result) + + return result + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + + my_fields = self._extended_message.ListFields() + other_fields = other._extended_message.ListFields() + + # Get rid of non-extension fields. + my_fields = [ field for field in my_fields if field.is_extension ] + other_fields = [ field for field in other_fields if field.is_extension ] + + return my_fields == other_fields + + def __ne__(self, other): + return not self == other + + def __hash__(self): + raise TypeError('unhashable object') + + # Note that this is only meaningful for non-repeated, scalar extension + # fields. Note also that we may have to call _Modified() when we do + # successfully set a field this way, to set any necssary "has" bits in the + # ancestors of the extended message. + def __setitem__(self, extension_handle, value): + """If extension_handle specifies a non-repeated, scalar extension + field, sets the value of that field. + """ + + _VerifyExtensionHandle(self._extended_message, extension_handle) + + if (extension_handle.label == _FieldDescriptor.LABEL_REPEATED or + extension_handle.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE): + raise TypeError( + 'Cannot assign to extension "%s" because it is a repeated or ' + 'composite type.' % extension_handle.full_name) + + # It's slightly wasteful to lookup the type checker each time, + # but we expect this to be a vanishingly uncommon case anyway. + type_checker = type_checkers.GetTypeChecker( + extension_handle) + # pylint: disable=protected-access + self._extended_message._fields[extension_handle] = ( + type_checker.CheckValue(value)) + self._extended_message._Modified() + + def _FindExtensionByName(self, name): + """Tries to find a known extension with the specified name. + + Args: + name: Extension full name. + + Returns: + Extension field descriptor. + """ + return self._extended_message._extensions_by_name.get(name, None) diff --git a/pythonlib/build/lib/google/protobuf/internal/type_checkers.py b/pythonlib/build/lib/google/protobuf/internal/type_checkers.py new file mode 100644 index 0000000..8e1b3cc --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/internal/type_checkers.py @@ -0,0 +1,328 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +#PY25 compatible for GAE. +# +# Copyright 2008 Google Inc. All Rights Reserved. + +"""Provides type checking routines. + +This module defines type checking utilities in the forms of dictionaries: + +VALUE_CHECKERS: A dictionary of field types and a value validation object. +TYPE_TO_BYTE_SIZE_FN: A dictionary with field types and a size computing + function. +TYPE_TO_SERIALIZE_METHOD: A dictionary with field types and serialization + function. +FIELD_TYPE_TO_WIRE_TYPE: A dictionary with field typed and their + coresponding wire types. +TYPE_TO_DESERIALIZE_METHOD: A dictionary with field types and deserialization + function. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import sys ##PY25 +if sys.version < '2.6': bytes = str ##PY25 +from google.protobuf.internal import api_implementation +from google.protobuf.internal import decoder +from google.protobuf.internal import encoder +from google.protobuf.internal import wire_format +from google.protobuf import descriptor + +_FieldDescriptor = descriptor.FieldDescriptor + + +def GetTypeChecker(field): + """Returns a type checker for a message field of the specified types. + + Args: + field: FieldDescriptor object for this field. + + Returns: + An instance of TypeChecker which can be used to verify the types + of values assigned to a field of the specified type. + """ + if (field.cpp_type == _FieldDescriptor.CPPTYPE_STRING and + field.type == _FieldDescriptor.TYPE_STRING): + return UnicodeValueChecker() + if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: + return EnumValueChecker(field.enum_type) + return _VALUE_CHECKERS[field.cpp_type] + + +# None of the typecheckers below make any attempt to guard against people +# subclassing builtin types and doing weird things. We're not trying to +# protect against malicious clients here, just people accidentally shooting +# themselves in the foot in obvious ways. + +class TypeChecker(object): + + """Type checker used to catch type errors as early as possible + when the client is setting scalar fields in protocol messages. + """ + + def __init__(self, *acceptable_types): + self._acceptable_types = acceptable_types + + def CheckValue(self, proposed_value): + """Type check the provided value and return it. + + The returned value might have been normalized to another type. + """ + if not isinstance(proposed_value, self._acceptable_types): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), self._acceptable_types)) + raise TypeError(message) + return proposed_value + + +# IntValueChecker and its subclasses perform integer type-checks +# and bounds-checks. +class IntValueChecker(object): + + """Checker used for integer fields. Performs type-check and range check.""" + + def CheckValue(self, proposed_value): + if not isinstance(proposed_value, (int, long)): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), (int, long))) + raise TypeError(message) + if not self._MIN <= proposed_value <= self._MAX: + raise ValueError('Value out of range: %d' % proposed_value) + # We force 32-bit values to int and 64-bit values to long to make + # alternate implementations where the distinction is more significant + # (e.g. the C++ implementation) simpler. + proposed_value = self._TYPE(proposed_value) + return proposed_value + + +class EnumValueChecker(object): + + """Checker used for enum fields. Performs type-check and range check.""" + + def __init__(self, enum_type): + self._enum_type = enum_type + + def CheckValue(self, proposed_value): + if not isinstance(proposed_value, (int, long)): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), (int, long))) + raise TypeError(message) + if proposed_value not in self._enum_type.values_by_number: + raise ValueError('Unknown enum value: %d' % proposed_value) + return proposed_value + + +class UnicodeValueChecker(object): + + """Checker used for string fields. + + Always returns a unicode value, even if the input is of type str. + """ + + def CheckValue(self, proposed_value): + if not isinstance(proposed_value, (bytes, unicode)): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), (bytes, unicode))) + raise TypeError(message) + + # If the value is of type 'bytes' make sure that it is in 7-bit ASCII + # encoding. + if isinstance(proposed_value, bytes): + try: + proposed_value = proposed_value.decode('ascii') + except UnicodeDecodeError: + raise ValueError('%.1024r has type bytes, but isn\'t in 7-bit ASCII ' + 'encoding. Non-ASCII strings must be converted to ' + 'unicode objects before being added.' % + (proposed_value)) + return proposed_value + + +class Int32ValueChecker(IntValueChecker): + # We're sure to use ints instead of longs here since comparison may be more + # efficient. + _MIN = -2147483648 + _MAX = 2147483647 + _TYPE = int + + +class Uint32ValueChecker(IntValueChecker): + _MIN = 0 + _MAX = (1 << 32) - 1 + _TYPE = int + + +class Int64ValueChecker(IntValueChecker): + _MIN = -(1 << 63) + _MAX = (1 << 63) - 1 + _TYPE = long + + +class Uint64ValueChecker(IntValueChecker): + _MIN = 0 + _MAX = (1 << 64) - 1 + _TYPE = long + + +# Type-checkers for all scalar CPPTYPEs. +_VALUE_CHECKERS = { + _FieldDescriptor.CPPTYPE_INT32: Int32ValueChecker(), + _FieldDescriptor.CPPTYPE_INT64: Int64ValueChecker(), + _FieldDescriptor.CPPTYPE_UINT32: Uint32ValueChecker(), + _FieldDescriptor.CPPTYPE_UINT64: Uint64ValueChecker(), + _FieldDescriptor.CPPTYPE_DOUBLE: TypeChecker( + float, int, long), + _FieldDescriptor.CPPTYPE_FLOAT: TypeChecker( + float, int, long), + _FieldDescriptor.CPPTYPE_BOOL: TypeChecker(bool, int), + _FieldDescriptor.CPPTYPE_STRING: TypeChecker(bytes), + } + + +# Map from field type to a function F, such that F(field_num, value) +# gives the total byte size for a value of the given type. This +# byte size includes tag information and any other additional space +# associated with serializing "value". +TYPE_TO_BYTE_SIZE_FN = { + _FieldDescriptor.TYPE_DOUBLE: wire_format.DoubleByteSize, + _FieldDescriptor.TYPE_FLOAT: wire_format.FloatByteSize, + _FieldDescriptor.TYPE_INT64: wire_format.Int64ByteSize, + _FieldDescriptor.TYPE_UINT64: wire_format.UInt64ByteSize, + _FieldDescriptor.TYPE_INT32: wire_format.Int32ByteSize, + _FieldDescriptor.TYPE_FIXED64: wire_format.Fixed64ByteSize, + _FieldDescriptor.TYPE_FIXED32: wire_format.Fixed32ByteSize, + _FieldDescriptor.TYPE_BOOL: wire_format.BoolByteSize, + _FieldDescriptor.TYPE_STRING: wire_format.StringByteSize, + _FieldDescriptor.TYPE_GROUP: wire_format.GroupByteSize, + _FieldDescriptor.TYPE_MESSAGE: wire_format.MessageByteSize, + _FieldDescriptor.TYPE_BYTES: wire_format.BytesByteSize, + _FieldDescriptor.TYPE_UINT32: wire_format.UInt32ByteSize, + _FieldDescriptor.TYPE_ENUM: wire_format.EnumByteSize, + _FieldDescriptor.TYPE_SFIXED32: wire_format.SFixed32ByteSize, + _FieldDescriptor.TYPE_SFIXED64: wire_format.SFixed64ByteSize, + _FieldDescriptor.TYPE_SINT32: wire_format.SInt32ByteSize, + _FieldDescriptor.TYPE_SINT64: wire_format.SInt64ByteSize + } + + +# Maps from field types to encoder constructors. +TYPE_TO_ENCODER = { + _FieldDescriptor.TYPE_DOUBLE: encoder.DoubleEncoder, + _FieldDescriptor.TYPE_FLOAT: encoder.FloatEncoder, + _FieldDescriptor.TYPE_INT64: encoder.Int64Encoder, + _FieldDescriptor.TYPE_UINT64: encoder.UInt64Encoder, + _FieldDescriptor.TYPE_INT32: encoder.Int32Encoder, + _FieldDescriptor.TYPE_FIXED64: encoder.Fixed64Encoder, + _FieldDescriptor.TYPE_FIXED32: encoder.Fixed32Encoder, + _FieldDescriptor.TYPE_BOOL: encoder.BoolEncoder, + _FieldDescriptor.TYPE_STRING: encoder.StringEncoder, + _FieldDescriptor.TYPE_GROUP: encoder.GroupEncoder, + _FieldDescriptor.TYPE_MESSAGE: encoder.MessageEncoder, + _FieldDescriptor.TYPE_BYTES: encoder.BytesEncoder, + _FieldDescriptor.TYPE_UINT32: encoder.UInt32Encoder, + _FieldDescriptor.TYPE_ENUM: encoder.EnumEncoder, + _FieldDescriptor.TYPE_SFIXED32: encoder.SFixed32Encoder, + _FieldDescriptor.TYPE_SFIXED64: encoder.SFixed64Encoder, + _FieldDescriptor.TYPE_SINT32: encoder.SInt32Encoder, + _FieldDescriptor.TYPE_SINT64: encoder.SInt64Encoder, + } + + +# Maps from field types to sizer constructors. +TYPE_TO_SIZER = { + _FieldDescriptor.TYPE_DOUBLE: encoder.DoubleSizer, + _FieldDescriptor.TYPE_FLOAT: encoder.FloatSizer, + _FieldDescriptor.TYPE_INT64: encoder.Int64Sizer, + _FieldDescriptor.TYPE_UINT64: encoder.UInt64Sizer, + _FieldDescriptor.TYPE_INT32: encoder.Int32Sizer, + _FieldDescriptor.TYPE_FIXED64: encoder.Fixed64Sizer, + _FieldDescriptor.TYPE_FIXED32: encoder.Fixed32Sizer, + _FieldDescriptor.TYPE_BOOL: encoder.BoolSizer, + _FieldDescriptor.TYPE_STRING: encoder.StringSizer, + _FieldDescriptor.TYPE_GROUP: encoder.GroupSizer, + _FieldDescriptor.TYPE_MESSAGE: encoder.MessageSizer, + _FieldDescriptor.TYPE_BYTES: encoder.BytesSizer, + _FieldDescriptor.TYPE_UINT32: encoder.UInt32Sizer, + _FieldDescriptor.TYPE_ENUM: encoder.EnumSizer, + _FieldDescriptor.TYPE_SFIXED32: encoder.SFixed32Sizer, + _FieldDescriptor.TYPE_SFIXED64: encoder.SFixed64Sizer, + _FieldDescriptor.TYPE_SINT32: encoder.SInt32Sizer, + _FieldDescriptor.TYPE_SINT64: encoder.SInt64Sizer, + } + + +# Maps from field type to a decoder constructor. +TYPE_TO_DECODER = { + _FieldDescriptor.TYPE_DOUBLE: decoder.DoubleDecoder, + _FieldDescriptor.TYPE_FLOAT: decoder.FloatDecoder, + _FieldDescriptor.TYPE_INT64: decoder.Int64Decoder, + _FieldDescriptor.TYPE_UINT64: decoder.UInt64Decoder, + _FieldDescriptor.TYPE_INT32: decoder.Int32Decoder, + _FieldDescriptor.TYPE_FIXED64: decoder.Fixed64Decoder, + _FieldDescriptor.TYPE_FIXED32: decoder.Fixed32Decoder, + _FieldDescriptor.TYPE_BOOL: decoder.BoolDecoder, + _FieldDescriptor.TYPE_STRING: decoder.StringDecoder, + _FieldDescriptor.TYPE_GROUP: decoder.GroupDecoder, + _FieldDescriptor.TYPE_MESSAGE: decoder.MessageDecoder, + _FieldDescriptor.TYPE_BYTES: decoder.BytesDecoder, + _FieldDescriptor.TYPE_UINT32: decoder.UInt32Decoder, + _FieldDescriptor.TYPE_ENUM: decoder.EnumDecoder, + _FieldDescriptor.TYPE_SFIXED32: decoder.SFixed32Decoder, + _FieldDescriptor.TYPE_SFIXED64: decoder.SFixed64Decoder, + _FieldDescriptor.TYPE_SINT32: decoder.SInt32Decoder, + _FieldDescriptor.TYPE_SINT64: decoder.SInt64Decoder, + } + +# Maps from field type to expected wiretype. +FIELD_TYPE_TO_WIRE_TYPE = { + _FieldDescriptor.TYPE_DOUBLE: wire_format.WIRETYPE_FIXED64, + _FieldDescriptor.TYPE_FLOAT: wire_format.WIRETYPE_FIXED32, + _FieldDescriptor.TYPE_INT64: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_UINT64: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_INT32: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_FIXED64: wire_format.WIRETYPE_FIXED64, + _FieldDescriptor.TYPE_FIXED32: wire_format.WIRETYPE_FIXED32, + _FieldDescriptor.TYPE_BOOL: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_STRING: + wire_format.WIRETYPE_LENGTH_DELIMITED, + _FieldDescriptor.TYPE_GROUP: wire_format.WIRETYPE_START_GROUP, + _FieldDescriptor.TYPE_MESSAGE: + wire_format.WIRETYPE_LENGTH_DELIMITED, + _FieldDescriptor.TYPE_BYTES: + wire_format.WIRETYPE_LENGTH_DELIMITED, + _FieldDescriptor.TYPE_UINT32: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_ENUM: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_SFIXED32: wire_format.WIRETYPE_FIXED32, + _FieldDescriptor.TYPE_SFIXED64: wire_format.WIRETYPE_FIXED64, + _FieldDescriptor.TYPE_SINT32: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_SINT64: wire_format.WIRETYPE_VARINT, + } diff --git a/pythonlib/build/lib/google/protobuf/internal/wire_format.py b/pythonlib/build/lib/google/protobuf/internal/wire_format.py new file mode 100644 index 0000000..c941fe1 --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/internal/wire_format.py @@ -0,0 +1,268 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Constants and static functions to support protocol buffer wire format.""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import struct +from google.protobuf import descriptor +from google.protobuf import message + + +TAG_TYPE_BITS = 3 # Number of bits used to hold type info in a proto tag. +TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1 # 0x7 + +# These numbers identify the wire type of a protocol buffer value. +# We use the least-significant TAG_TYPE_BITS bits of the varint-encoded +# tag-and-type to store one of these WIRETYPE_* constants. +# These values must match WireType enum in google/protobuf/wire_format.h. +WIRETYPE_VARINT = 0 +WIRETYPE_FIXED64 = 1 +WIRETYPE_LENGTH_DELIMITED = 2 +WIRETYPE_START_GROUP = 3 +WIRETYPE_END_GROUP = 4 +WIRETYPE_FIXED32 = 5 +_WIRETYPE_MAX = 5 + + +# Bounds for various integer types. +INT32_MAX = int((1 << 31) - 1) +INT32_MIN = int(-(1 << 31)) +UINT32_MAX = (1 << 32) - 1 + +INT64_MAX = (1 << 63) - 1 +INT64_MIN = -(1 << 63) +UINT64_MAX = (1 << 64) - 1 + +# "struct" format strings that will encode/decode the specified formats. +FORMAT_UINT32_LITTLE_ENDIAN = '> TAG_TYPE_BITS), (tag & TAG_TYPE_MASK) + + +def ZigZagEncode(value): + """ZigZag Transform: Encodes signed integers so that they can be + effectively used with varint encoding. See wire_format.h for + more details. + """ + if value >= 0: + return value << 1 + return (value << 1) ^ (~0) + + +def ZigZagDecode(value): + """Inverse of ZigZagEncode().""" + if not value & 0x1: + return value >> 1 + return (value >> 1) ^ (~0) + + + +# The *ByteSize() functions below return the number of bytes required to +# serialize "field number + type" information and then serialize the value. + + +def Int32ByteSize(field_number, int32): + return Int64ByteSize(field_number, int32) + + +def Int32ByteSizeNoTag(int32): + return _VarUInt64ByteSizeNoTag(0xffffffffffffffff & int32) + + +def Int64ByteSize(field_number, int64): + # Have to convert to uint before calling UInt64ByteSize(). + return UInt64ByteSize(field_number, 0xffffffffffffffff & int64) + + +def UInt32ByteSize(field_number, uint32): + return UInt64ByteSize(field_number, uint32) + + +def UInt64ByteSize(field_number, uint64): + return TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(uint64) + + +def SInt32ByteSize(field_number, int32): + return UInt32ByteSize(field_number, ZigZagEncode(int32)) + + +def SInt64ByteSize(field_number, int64): + return UInt64ByteSize(field_number, ZigZagEncode(int64)) + + +def Fixed32ByteSize(field_number, fixed32): + return TagByteSize(field_number) + 4 + + +def Fixed64ByteSize(field_number, fixed64): + return TagByteSize(field_number) + 8 + + +def SFixed32ByteSize(field_number, sfixed32): + return TagByteSize(field_number) + 4 + + +def SFixed64ByteSize(field_number, sfixed64): + return TagByteSize(field_number) + 8 + + +def FloatByteSize(field_number, flt): + return TagByteSize(field_number) + 4 + + +def DoubleByteSize(field_number, double): + return TagByteSize(field_number) + 8 + + +def BoolByteSize(field_number, b): + return TagByteSize(field_number) + 1 + + +def EnumByteSize(field_number, enum): + return UInt32ByteSize(field_number, enum) + + +def StringByteSize(field_number, string): + return BytesByteSize(field_number, string.encode('utf-8')) + + +def BytesByteSize(field_number, b): + return (TagByteSize(field_number) + + _VarUInt64ByteSizeNoTag(len(b)) + + len(b)) + + +def GroupByteSize(field_number, message): + return (2 * TagByteSize(field_number) # START and END group. + + message.ByteSize()) + + +def MessageByteSize(field_number, message): + return (TagByteSize(field_number) + + _VarUInt64ByteSizeNoTag(message.ByteSize()) + + message.ByteSize()) + + +def MessageSetItemByteSize(field_number, msg): + # First compute the sizes of the tags. + # There are 2 tags for the beginning and ending of the repeated group, that + # is field number 1, one with field number 2 (type_id) and one with field + # number 3 (message). + total_size = (2 * TagByteSize(1) + TagByteSize(2) + TagByteSize(3)) + + # Add the number of bytes for type_id. + total_size += _VarUInt64ByteSizeNoTag(field_number) + + message_size = msg.ByteSize() + + # The number of bytes for encoding the length of the message. + total_size += _VarUInt64ByteSizeNoTag(message_size) + + # The size of the message. + total_size += message_size + return total_size + + +def TagByteSize(field_number): + """Returns the bytes required to serialize a tag with this field number.""" + # Just pass in type 0, since the type won't affect the tag+type size. + return _VarUInt64ByteSizeNoTag(PackTag(field_number, 0)) + + +# Private helper function for the *ByteSize() functions above. + +def _VarUInt64ByteSizeNoTag(uint64): + """Returns the number of bytes required to serialize a single varint + using boundary value comparisons. (unrolled loop optimization -WPierce) + uint64 must be unsigned. + """ + if uint64 <= 0x7f: return 1 + if uint64 <= 0x3fff: return 2 + if uint64 <= 0x1fffff: return 3 + if uint64 <= 0xfffffff: return 4 + if uint64 <= 0x7ffffffff: return 5 + if uint64 <= 0x3ffffffffff: return 6 + if uint64 <= 0x1ffffffffffff: return 7 + if uint64 <= 0xffffffffffffff: return 8 + if uint64 <= 0x7fffffffffffffff: return 9 + if uint64 > UINT64_MAX: + raise message.EncodeError('Value out of range: %d' % uint64) + return 10 + + +NON_PACKABLE_TYPES = ( + descriptor.FieldDescriptor.TYPE_STRING, + descriptor.FieldDescriptor.TYPE_GROUP, + descriptor.FieldDescriptor.TYPE_MESSAGE, + descriptor.FieldDescriptor.TYPE_BYTES +) + + +def IsTypePackable(field_type): + """Return true iff packable = true is valid for fields of this type. + + Args: + field_type: a FieldDescriptor::Type value. + + Returns: + True iff fields of this type are packable. + """ + return field_type not in NON_PACKABLE_TYPES diff --git a/pythonlib/build/lib/google/protobuf/message.py b/pythonlib/build/lib/google/protobuf/message.py new file mode 100644 index 0000000..37b0af1 --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/message.py @@ -0,0 +1,284 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +# TODO(robinson): We should just make these methods all "pure-virtual" and move +# all implementation out, into reflection.py for now. + + +"""Contains an abstract base class for protocol messages.""" + +__author__ = 'robinson@google.com (Will Robinson)' + + +class Error(Exception): pass +class DecodeError(Error): pass +class EncodeError(Error): pass + + +class Message(object): + + """Abstract base class for protocol messages. + + Protocol message classes are almost always generated by the protocol + compiler. These generated types subclass Message and implement the methods + shown below. + + TODO(robinson): Link to an HTML document here. + + TODO(robinson): Document that instances of this class will also + have an Extensions attribute with __getitem__ and __setitem__. + Again, not sure how to best convey this. + + TODO(robinson): Document that the class must also have a static + RegisterExtension(extension_field) method. + Not sure how to best express at this point. + """ + + # TODO(robinson): Document these fields and methods. + + __slots__ = [] + + DESCRIPTOR = None + + def __deepcopy__(self, memo=None): + clone = type(self)() + clone.MergeFrom(self) + return clone + + def __eq__(self, other_msg): + """Recursively compares two messages by value and structure.""" + raise NotImplementedError + + def __ne__(self, other_msg): + # Can't just say self != other_msg, since that would infinitely recurse. :) + return not self == other_msg + + def __hash__(self): + raise TypeError('unhashable object') + + def __str__(self): + """Outputs a human-readable representation of the message.""" + raise NotImplementedError + + def __unicode__(self): + """Outputs a human-readable representation of the message.""" + raise NotImplementedError + + def MergeFrom(self, other_msg): + """Merges the contents of the specified message into current message. + + This method merges the contents of the specified message into the current + message. Singular fields that are set in the specified message overwrite + the corresponding fields in the current message. Repeated fields are + appended. Singular sub-messages and groups are recursively merged. + + Args: + other_msg: Message to merge into the current message. + """ + raise NotImplementedError + + def CopyFrom(self, other_msg): + """Copies the content of the specified message into the current message. + + The method clears the current message and then merges the specified + message using MergeFrom. + + Args: + other_msg: Message to copy into the current one. + """ + if self is other_msg: + return + self.Clear() + self.MergeFrom(other_msg) + + def Clear(self): + """Clears all data that was set in the message.""" + raise NotImplementedError + + def SetInParent(self): + """Mark this as present in the parent. + + This normally happens automatically when you assign a field of a + sub-message, but sometimes you want to make the sub-message + present while keeping it empty. If you find yourself using this, + you may want to reconsider your design.""" + raise NotImplementedError + + def IsInitialized(self): + """Checks if the message is initialized. + + Returns: + The method returns True if the message is initialized (i.e. all of its + required fields are set). + """ + raise NotImplementedError + + # TODO(robinson): MergeFromString() should probably return None and be + # implemented in terms of a helper that returns the # of bytes read. Our + # deserialization routines would use the helper when recursively + # deserializing, but the end user would almost always just want the no-return + # MergeFromString(). + + def MergeFromString(self, serialized): + """Merges serialized protocol buffer data into this message. + + When we find a field in |serialized| that is already present + in this message: + - If it's a "repeated" field, we append to the end of our list. + - Else, if it's a scalar, we overwrite our field. + - Else, (it's a nonrepeated composite), we recursively merge + into the existing composite. + + TODO(robinson): Document handling of unknown fields. + + Args: + serialized: Any object that allows us to call buffer(serialized) + to access a string of bytes using the buffer interface. + + TODO(robinson): When we switch to a helper, this will return None. + + Returns: + The number of bytes read from |serialized|. + For non-group messages, this will always be len(serialized), + but for messages which are actually groups, this will + generally be less than len(serialized), since we must + stop when we reach an END_GROUP tag. Note that if + we *do* stop because of an END_GROUP tag, the number + of bytes returned does not include the bytes + for the END_GROUP tag information. + """ + raise NotImplementedError + + def ParseFromString(self, serialized): + """Parse serialized protocol buffer data into this message. + + Like MergeFromString(), except we clear the object first and + do not return the value that MergeFromString returns. + """ + self.Clear() + self.MergeFromString(serialized) + + def SerializeToString(self): + """Serializes the protocol message to a binary string. + + Returns: + A binary string representation of the message if all of the required + fields in the message are set (i.e. the message is initialized). + + Raises: + message.EncodeError if the message isn't initialized. + """ + raise NotImplementedError + + def SerializePartialToString(self): + """Serializes the protocol message to a binary string. + + This method is similar to SerializeToString but doesn't check if the + message is initialized. + + Returns: + A string representation of the partial message. + """ + raise NotImplementedError + + # TODO(robinson): Decide whether we like these better + # than auto-generated has_foo() and clear_foo() methods + # on the instances themselves. This way is less consistent + # with C++, but it makes reflection-type access easier and + # reduces the number of magically autogenerated things. + # + # TODO(robinson): Be sure to document (and test) exactly + # which field names are accepted here. Are we case-sensitive? + # What do we do with fields that share names with Python keywords + # like 'lambda' and 'yield'? + # + # nnorwitz says: + # """ + # Typically (in python), an underscore is appended to names that are + # keywords. So they would become lambda_ or yield_. + # """ + def ListFields(self): + """Returns a list of (FieldDescriptor, value) tuples for all + fields in the message which are not empty. A singular field is non-empty + if HasField() would return true, and a repeated field is non-empty if + it contains at least one element. The fields are ordered by field + number""" + raise NotImplementedError + + def HasField(self, field_name): + """Checks if a certain field is set for the message. Note if the + field_name is not defined in the message descriptor, ValueError will be + raised.""" + raise NotImplementedError + + def ClearField(self, field_name): + raise NotImplementedError + + def HasExtension(self, extension_handle): + raise NotImplementedError + + def ClearExtension(self, extension_handle): + raise NotImplementedError + + def ByteSize(self): + """Returns the serialized size of this message. + Recursively calls ByteSize() on all contained messages. + """ + raise NotImplementedError + + def _SetListener(self, message_listener): + """Internal method used by the protocol message implementation. + Clients should not call this directly. + + Sets a listener that this message will call on certain state transitions. + + The purpose of this method is to register back-edges from children to + parents at runtime, for the purpose of setting "has" bits and + byte-size-dirty bits in the parent and ancestor objects whenever a child or + descendant object is modified. + + If the client wants to disconnect this Message from the object tree, she + explicitly sets callback to None. + + If message_listener is None, unregisters any existing listener. Otherwise, + message_listener must implement the MessageListener interface in + internal/message_listener.py, and we discard any listener registered + via a previous _SetListener() call. + """ + raise NotImplementedError + + def __getstate__(self): + """Support the pickle protocol.""" + return dict(serialized=self.SerializePartialToString()) + + def __setstate__(self, state): + """Support the pickle protocol.""" + self.__init__() + self.ParseFromString(state['serialized']) diff --git a/pythonlib/build/lib/google/protobuf/message_factory.py b/pythonlib/build/lib/google/protobuf/message_factory.py new file mode 100644 index 0000000..9004ffd --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/message_factory.py @@ -0,0 +1,155 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +#PY25 compatible for GAE. +# +# Copyright 2012 Google Inc. All Rights Reserved. + +"""Provides a factory class for generating dynamic messages. + +The easiest way to use this class is if you have access to the FileDescriptor +protos containing the messages you want to create you can just do the following: + +message_classes = message_factory.GetMessages(iterable_of_file_descriptors) +my_proto_instance = message_classes['some.proto.package.MessageName']() +""" + +__author__ = 'matthewtoia@google.com (Matt Toia)' + +import sys ##PY25 +from google.protobuf import descriptor_database +from google.protobuf import descriptor_pool +from google.protobuf import message +from google.protobuf import reflection + + +class MessageFactory(object): + """Factory for creating Proto2 messages from descriptors in a pool.""" + + def __init__(self, pool=None): + """Initializes a new factory.""" + self.pool = (pool or descriptor_pool.DescriptorPool( + descriptor_database.DescriptorDatabase())) + + # local cache of all classes built from protobuf descriptors + self._classes = {} + + def GetPrototype(self, descriptor): + """Builds a proto2 message class based on the passed in descriptor. + + Passing a descriptor with a fully qualified name matching a previous + invocation will cause the same class to be returned. + + Args: + descriptor: The descriptor to build from. + + Returns: + A class describing the passed in descriptor. + """ + if descriptor.full_name not in self._classes: + descriptor_name = descriptor.name + if sys.version_info[0] < 3: ##PY25 +##!PY25 if str is bytes: # PY2 + descriptor_name = descriptor.name.encode('ascii', 'ignore') + result_class = reflection.GeneratedProtocolMessageType( + descriptor_name, + (message.Message,), + {'DESCRIPTOR': descriptor, '__module__': None}) + # If module not set, it wrongly points to the reflection.py module. + self._classes[descriptor.full_name] = result_class + for field in descriptor.fields: + if field.message_type: + self.GetPrototype(field.message_type) + for extension in result_class.DESCRIPTOR.extensions: + if extension.containing_type.full_name not in self._classes: + self.GetPrototype(extension.containing_type) + extended_class = self._classes[extension.containing_type.full_name] + extended_class.RegisterExtension(extension) + return self._classes[descriptor.full_name] + + def GetMessages(self, files): + """Gets all the messages from a specified file. + + This will find and resolve dependencies, failing if the descriptor + pool cannot satisfy them. + + Args: + files: The file names to extract messages from. + + Returns: + A dictionary mapping proto names to the message classes. This will include + any dependent messages as well as any messages defined in the same file as + a specified message. + """ + result = {} + for file_name in files: + file_desc = self.pool.FindFileByName(file_name) + for name, msg in file_desc.message_types_by_name.iteritems(): + if file_desc.package: + full_name = '.'.join([file_desc.package, name]) + else: + full_name = msg.name + result[full_name] = self.GetPrototype( + self.pool.FindMessageTypeByName(full_name)) + + # While the extension FieldDescriptors are created by the descriptor pool, + # the python classes created in the factory need them to be registered + # explicitly, which is done below. + # + # The call to RegisterExtension will specifically check if the + # extension was already registered on the object and either + # ignore the registration if the original was the same, or raise + # an error if they were different. + + for name, extension in file_desc.extensions_by_name.iteritems(): + if extension.containing_type.full_name not in self._classes: + self.GetPrototype(extension.containing_type) + extended_class = self._classes[extension.containing_type.full_name] + extended_class.RegisterExtension(extension) + return result + + +_FACTORY = MessageFactory() + + +def GetMessages(file_protos): + """Builds a dictionary of all the messages available in a set of files. + + Args: + file_protos: A sequence of file protos to build messages out of. + + Returns: + A dictionary mapping proto names to the message classes. This will include + any dependent messages as well as any messages defined in the same file as + a specified message. + """ + for file_proto in file_protos: + _FACTORY.pool.Add(file_proto) + return _FACTORY.GetMessages([file_proto.name for file_proto in file_protos]) diff --git a/pythonlib/build/lib/google/protobuf/reflection.py b/pythonlib/build/lib/google/protobuf/reflection.py new file mode 100644 index 0000000..7aac623 --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/reflection.py @@ -0,0 +1,205 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +# This code is meant to work on Python 2.4 and above only. + +"""Contains a metaclass and helper functions used to create +protocol message classes from Descriptor objects at runtime. + +Recall that a metaclass is the "type" of a class. +(A class is to a metaclass what an instance is to a class.) + +In this case, we use the GeneratedProtocolMessageType metaclass +to inject all the useful functionality into the classes +output by the protocol compiler at compile-time. + +The upshot of all this is that the real implementation +details for ALL pure-Python protocol buffers are *here in +this file*. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + + +from google.protobuf.internal import api_implementation +from google.protobuf import descriptor as descriptor_mod +from google.protobuf import message + +_FieldDescriptor = descriptor_mod.FieldDescriptor + + +if api_implementation.Type() == 'cpp': + if api_implementation.Version() == 2: + from google.protobuf.pyext import cpp_message + _NewMessage = cpp_message.NewMessage + _InitMessage = cpp_message.InitMessage + else: + from google.protobuf.internal import cpp_message + _NewMessage = cpp_message.NewMessage + _InitMessage = cpp_message.InitMessage +else: + from google.protobuf.internal import python_message + _NewMessage = python_message.NewMessage + _InitMessage = python_message.InitMessage + + +class GeneratedProtocolMessageType(type): + + """Metaclass for protocol message classes created at runtime from Descriptors. + + We add implementations for all methods described in the Message class. We + also create properties to allow getting/setting all fields in the protocol + message. Finally, we create slots to prevent users from accidentally + "setting" nonexistent fields in the protocol message, which then wouldn't get + serialized / deserialized properly. + + The protocol compiler currently uses this metaclass to create protocol + message classes at runtime. Clients can also manually create their own + classes at runtime, as in this example: + + mydescriptor = Descriptor(.....) + class MyProtoClass(Message): + __metaclass__ = GeneratedProtocolMessageType + DESCRIPTOR = mydescriptor + myproto_instance = MyProtoClass() + myproto.foo_field = 23 + ... + + The above example will not work for nested types. If you wish to include them, + use reflection.MakeClass() instead of manually instantiating the class in + order to create the appropriate class structure. + """ + + # Must be consistent with the protocol-compiler code in + # proto2/compiler/internal/generator.*. + _DESCRIPTOR_KEY = 'DESCRIPTOR' + + def __new__(cls, name, bases, dictionary): + """Custom allocation for runtime-generated class types. + + We override __new__ because this is apparently the only place + where we can meaningfully set __slots__ on the class we're creating(?). + (The interplay between metaclasses and slots is not very well-documented). + + Args: + name: Name of the class (ignored, but required by the + metaclass protocol). + bases: Base classes of the class we're constructing. + (Should be message.Message). We ignore this field, but + it's required by the metaclass protocol + dictionary: The class dictionary of the class we're + constructing. dictionary[_DESCRIPTOR_KEY] must contain + a Descriptor object describing this protocol message + type. + + Returns: + Newly-allocated class. + """ + descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY] + bases = _NewMessage(bases, descriptor, dictionary) + superclass = super(GeneratedProtocolMessageType, cls) + + new_class = superclass.__new__(cls, name, bases, dictionary) + setattr(descriptor, '_concrete_class', new_class) + return new_class + + def __init__(cls, name, bases, dictionary): + """Here we perform the majority of our work on the class. + We add enum getters, an __init__ method, implementations + of all Message methods, and properties for all fields + in the protocol type. + + Args: + name: Name of the class (ignored, but required by the + metaclass protocol). + bases: Base classes of the class we're constructing. + (Should be message.Message). We ignore this field, but + it's required by the metaclass protocol + dictionary: The class dictionary of the class we're + constructing. dictionary[_DESCRIPTOR_KEY] must contain + a Descriptor object describing this protocol message + type. + """ + descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY] + _InitMessage(descriptor, cls) + superclass = super(GeneratedProtocolMessageType, cls) + superclass.__init__(name, bases, dictionary) + + +def ParseMessage(descriptor, byte_str): + """Generate a new Message instance from this Descriptor and a byte string. + + Args: + descriptor: Protobuf Descriptor object + byte_str: Serialized protocol buffer byte string + + Returns: + Newly created protobuf Message object. + """ + result_class = MakeClass(descriptor) + new_msg = result_class() + new_msg.ParseFromString(byte_str) + return new_msg + + +def MakeClass(descriptor): + """Construct a class object for a protobuf described by descriptor. + + Composite descriptors are handled by defining the new class as a member of the + parent class, recursing as deep as necessary. + This is the dynamic equivalent to: + + class Parent(message.Message): + __metaclass__ = GeneratedProtocolMessageType + DESCRIPTOR = descriptor + class Child(message.Message): + __metaclass__ = GeneratedProtocolMessageType + DESCRIPTOR = descriptor.nested_types[0] + + Sample usage: + file_descriptor = descriptor_pb2.FileDescriptorProto() + file_descriptor.ParseFromString(proto2_string) + msg_descriptor = descriptor.MakeDescriptor(file_descriptor.message_type[0]) + msg_class = reflection.MakeClass(msg_descriptor) + msg = msg_class() + + Args: + descriptor: A descriptor.Descriptor object describing the protobuf. + Returns: + The Message class object described by the descriptor. + """ + attributes = {} + for name, nested_type in descriptor.nested_types_by_name.items(): + attributes[name] = MakeClass(nested_type) + + attributes[GeneratedProtocolMessageType._DESCRIPTOR_KEY] = descriptor + + return GeneratedProtocolMessageType(str(descriptor.name), (message.Message,), + attributes) diff --git a/pythonlib/build/lib/google/protobuf/service.py b/pythonlib/build/lib/google/protobuf/service.py new file mode 100644 index 0000000..180b70e --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/service.py @@ -0,0 +1,226 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""DEPRECATED: Declares the RPC service interfaces. + +This module declares the abstract interfaces underlying proto2 RPC +services. These are intended to be independent of any particular RPC +implementation, so that proto2 services can be used on top of a variety +of implementations. Starting with version 2.3.0, RPC implementations should +not try to build on these, but should instead provide code generator plugins +which generate code specific to the particular RPC implementation. This way +the generated code can be more appropriate for the implementation in use +and can avoid unnecessary layers of indirection. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + + +class RpcException(Exception): + """Exception raised on failed blocking RPC method call.""" + pass + + +class Service(object): + + """Abstract base interface for protocol-buffer-based RPC services. + + Services themselves are abstract classes (implemented either by servers or as + stubs), but they subclass this base interface. The methods of this + interface can be used to call the methods of the service without knowing + its exact type at compile time (analogous to the Message interface). + """ + + def GetDescriptor(): + """Retrieves this service's descriptor.""" + raise NotImplementedError + + def CallMethod(self, method_descriptor, rpc_controller, + request, done): + """Calls a method of the service specified by method_descriptor. + + If "done" is None then the call is blocking and the response + message will be returned directly. Otherwise the call is asynchronous + and "done" will later be called with the response value. + + In the blocking case, RpcException will be raised on error. + + Preconditions: + * method_descriptor.service == GetDescriptor + * request is of the exact same classes as returned by + GetRequestClass(method). + * After the call has started, the request must not be modified. + * "rpc_controller" is of the correct type for the RPC implementation being + used by this Service. For stubs, the "correct type" depends on the + RpcChannel which the stub is using. + + Postconditions: + * "done" will be called when the method is complete. This may be + before CallMethod() returns or it may be at some point in the future. + * If the RPC failed, the response value passed to "done" will be None. + Further details about the failure can be found by querying the + RpcController. + """ + raise NotImplementedError + + def GetRequestClass(self, method_descriptor): + """Returns the class of the request message for the specified method. + + CallMethod() requires that the request is of a particular subclass of + Message. GetRequestClass() gets the default instance of this required + type. + + Example: + method = service.GetDescriptor().FindMethodByName("Foo") + request = stub.GetRequestClass(method)() + request.ParseFromString(input) + service.CallMethod(method, request, callback) + """ + raise NotImplementedError + + def GetResponseClass(self, method_descriptor): + """Returns the class of the response message for the specified method. + + This method isn't really needed, as the RpcChannel's CallMethod constructs + the response protocol message. It's provided anyway in case it is useful + for the caller to know the response type in advance. + """ + raise NotImplementedError + + +class RpcController(object): + + """An RpcController mediates a single method call. + + The primary purpose of the controller is to provide a way to manipulate + settings specific to the RPC implementation and to find out about RPC-level + errors. The methods provided by the RpcController interface are intended + to be a "least common denominator" set of features which we expect all + implementations to support. Specific implementations may provide more + advanced features (e.g. deadline propagation). + """ + + # Client-side methods below + + def Reset(self): + """Resets the RpcController to its initial state. + + After the RpcController has been reset, it may be reused in + a new call. Must not be called while an RPC is in progress. + """ + raise NotImplementedError + + def Failed(self): + """Returns true if the call failed. + + After a call has finished, returns true if the call failed. The possible + reasons for failure depend on the RPC implementation. Failed() must not + be called before a call has finished. If Failed() returns true, the + contents of the response message are undefined. + """ + raise NotImplementedError + + def ErrorText(self): + """If Failed is true, returns a human-readable description of the error.""" + raise NotImplementedError + + def StartCancel(self): + """Initiate cancellation. + + Advises the RPC system that the caller desires that the RPC call be + canceled. The RPC system may cancel it immediately, may wait awhile and + then cancel it, or may not even cancel the call at all. If the call is + canceled, the "done" callback will still be called and the RpcController + will indicate that the call failed at that time. + """ + raise NotImplementedError + + # Server-side methods below + + def SetFailed(self, reason): + """Sets a failure reason. + + Causes Failed() to return true on the client side. "reason" will be + incorporated into the message returned by ErrorText(). If you find + you need to return machine-readable information about failures, you + should incorporate it into your response protocol buffer and should + NOT call SetFailed(). + """ + raise NotImplementedError + + def IsCanceled(self): + """Checks if the client cancelled the RPC. + + If true, indicates that the client canceled the RPC, so the server may + as well give up on replying to it. The server should still call the + final "done" callback. + """ + raise NotImplementedError + + def NotifyOnCancel(self, callback): + """Sets a callback to invoke on cancel. + + Asks that the given callback be called when the RPC is canceled. The + callback will always be called exactly once. If the RPC completes without + being canceled, the callback will be called after completion. If the RPC + has already been canceled when NotifyOnCancel() is called, the callback + will be called immediately. + + NotifyOnCancel() must be called no more than once per request. + """ + raise NotImplementedError + + +class RpcChannel(object): + + """Abstract interface for an RPC channel. + + An RpcChannel represents a communication line to a service which can be used + to call that service's methods. The service may be running on another + machine. Normally, you should not use an RpcChannel directly, but instead + construct a stub {@link Service} wrapping it. Example: + + Example: + RpcChannel channel = rpcImpl.Channel("remotehost.example.com:1234") + RpcController controller = rpcImpl.Controller() + MyService service = MyService_Stub(channel) + service.MyMethod(controller, request, callback) + """ + + def CallMethod(self, method_descriptor, rpc_controller, + request, response_class, done): + """Calls the method identified by the descriptor. + + Call the given method of the remote service. The signature of this + procedure looks the same as Service.CallMethod(), but the requirements + are less strict in one important way: the request object doesn't have to + be of any specific class as long as its descriptor is method.input_type. + """ + raise NotImplementedError diff --git a/pythonlib/build/lib/google/protobuf/service_reflection.py b/pythonlib/build/lib/google/protobuf/service_reflection.py new file mode 100644 index 0000000..851e83e --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/service_reflection.py @@ -0,0 +1,284 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Contains metaclasses used to create protocol service and service stub +classes from ServiceDescriptor objects at runtime. + +The GeneratedServiceType and GeneratedServiceStubType metaclasses are used to +inject all useful functionality into the classes output by the protocol +compiler at compile-time. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + + +class GeneratedServiceType(type): + + """Metaclass for service classes created at runtime from ServiceDescriptors. + + Implementations for all methods described in the Service class are added here + by this class. We also create properties to allow getting/setting all fields + in the protocol message. + + The protocol compiler currently uses this metaclass to create protocol service + classes at runtime. Clients can also manually create their own classes at + runtime, as in this example: + + mydescriptor = ServiceDescriptor(.....) + class MyProtoService(service.Service): + __metaclass__ = GeneratedServiceType + DESCRIPTOR = mydescriptor + myservice_instance = MyProtoService() + ... + """ + + _DESCRIPTOR_KEY = 'DESCRIPTOR' + + def __init__(cls, name, bases, dictionary): + """Creates a message service class. + + Args: + name: Name of the class (ignored, but required by the metaclass + protocol). + bases: Base classes of the class being constructed. + dictionary: The class dictionary of the class being constructed. + dictionary[_DESCRIPTOR_KEY] must contain a ServiceDescriptor object + describing this protocol service type. + """ + # Don't do anything if this class doesn't have a descriptor. This happens + # when a service class is subclassed. + if GeneratedServiceType._DESCRIPTOR_KEY not in dictionary: + return + descriptor = dictionary[GeneratedServiceType._DESCRIPTOR_KEY] + service_builder = _ServiceBuilder(descriptor) + service_builder.BuildService(cls) + + +class GeneratedServiceStubType(GeneratedServiceType): + + """Metaclass for service stubs created at runtime from ServiceDescriptors. + + This class has similar responsibilities as GeneratedServiceType, except that + it creates the service stub classes. + """ + + _DESCRIPTOR_KEY = 'DESCRIPTOR' + + def __init__(cls, name, bases, dictionary): + """Creates a message service stub class. + + Args: + name: Name of the class (ignored, here). + bases: Base classes of the class being constructed. + dictionary: The class dictionary of the class being constructed. + dictionary[_DESCRIPTOR_KEY] must contain a ServiceDescriptor object + describing this protocol service type. + """ + super(GeneratedServiceStubType, cls).__init__(name, bases, dictionary) + # Don't do anything if this class doesn't have a descriptor. This happens + # when a service stub is subclassed. + if GeneratedServiceStubType._DESCRIPTOR_KEY not in dictionary: + return + descriptor = dictionary[GeneratedServiceStubType._DESCRIPTOR_KEY] + service_stub_builder = _ServiceStubBuilder(descriptor) + service_stub_builder.BuildServiceStub(cls) + + +class _ServiceBuilder(object): + + """This class constructs a protocol service class using a service descriptor. + + Given a service descriptor, this class constructs a class that represents + the specified service descriptor. One service builder instance constructs + exactly one service class. That means all instances of that class share the + same builder. + """ + + def __init__(self, service_descriptor): + """Initializes an instance of the service class builder. + + Args: + service_descriptor: ServiceDescriptor to use when constructing the + service class. + """ + self.descriptor = service_descriptor + + def BuildService(self, cls): + """Constructs the service class. + + Args: + cls: The class that will be constructed. + """ + + # CallMethod needs to operate with an instance of the Service class. This + # internal wrapper function exists only to be able to pass the service + # instance to the method that does the real CallMethod work. + def _WrapCallMethod(srvc, method_descriptor, + rpc_controller, request, callback): + return self._CallMethod(srvc, method_descriptor, + rpc_controller, request, callback) + self.cls = cls + cls.CallMethod = _WrapCallMethod + cls.GetDescriptor = staticmethod(lambda: self.descriptor) + cls.GetDescriptor.__doc__ = "Returns the service descriptor." + cls.GetRequestClass = self._GetRequestClass + cls.GetResponseClass = self._GetResponseClass + for method in self.descriptor.methods: + setattr(cls, method.name, self._GenerateNonImplementedMethod(method)) + + def _CallMethod(self, srvc, method_descriptor, + rpc_controller, request, callback): + """Calls the method described by a given method descriptor. + + Args: + srvc: Instance of the service for which this method is called. + method_descriptor: Descriptor that represent the method to call. + rpc_controller: RPC controller to use for this method's execution. + request: Request protocol message. + callback: A callback to invoke after the method has completed. + """ + if method_descriptor.containing_service != self.descriptor: + raise RuntimeError( + 'CallMethod() given method descriptor for wrong service type.') + method = getattr(srvc, method_descriptor.name) + return method(rpc_controller, request, callback) + + def _GetRequestClass(self, method_descriptor): + """Returns the class of the request protocol message. + + Args: + method_descriptor: Descriptor of the method for which to return the + request protocol message class. + + Returns: + A class that represents the input protocol message of the specified + method. + """ + if method_descriptor.containing_service != self.descriptor: + raise RuntimeError( + 'GetRequestClass() given method descriptor for wrong service type.') + return method_descriptor.input_type._concrete_class + + def _GetResponseClass(self, method_descriptor): + """Returns the class of the response protocol message. + + Args: + method_descriptor: Descriptor of the method for which to return the + response protocol message class. + + Returns: + A class that represents the output protocol message of the specified + method. + """ + if method_descriptor.containing_service != self.descriptor: + raise RuntimeError( + 'GetResponseClass() given method descriptor for wrong service type.') + return method_descriptor.output_type._concrete_class + + def _GenerateNonImplementedMethod(self, method): + """Generates and returns a method that can be set for a service methods. + + Args: + method: Descriptor of the service method for which a method is to be + generated. + + Returns: + A method that can be added to the service class. + """ + return lambda inst, rpc_controller, request, callback: ( + self._NonImplementedMethod(method.name, rpc_controller, callback)) + + def _NonImplementedMethod(self, method_name, rpc_controller, callback): + """The body of all methods in the generated service class. + + Args: + method_name: Name of the method being executed. + rpc_controller: RPC controller used to execute this method. + callback: A callback which will be invoked when the method finishes. + """ + rpc_controller.SetFailed('Method %s not implemented.' % method_name) + callback(None) + + +class _ServiceStubBuilder(object): + + """Constructs a protocol service stub class using a service descriptor. + + Given a service descriptor, this class constructs a suitable stub class. + A stub is just a type-safe wrapper around an RpcChannel which emulates a + local implementation of the service. + + One service stub builder instance constructs exactly one class. It means all + instances of that class share the same service stub builder. + """ + + def __init__(self, service_descriptor): + """Initializes an instance of the service stub class builder. + + Args: + service_descriptor: ServiceDescriptor to use when constructing the + stub class. + """ + self.descriptor = service_descriptor + + def BuildServiceStub(self, cls): + """Constructs the stub class. + + Args: + cls: The class that will be constructed. + """ + + def _ServiceStubInit(stub, rpc_channel): + stub.rpc_channel = rpc_channel + self.cls = cls + cls.__init__ = _ServiceStubInit + for method in self.descriptor.methods: + setattr(cls, method.name, self._GenerateStubMethod(method)) + + def _GenerateStubMethod(self, method): + return (lambda inst, rpc_controller, request, callback=None: + self._StubMethod(inst, method, rpc_controller, request, callback)) + + def _StubMethod(self, stub, method_descriptor, + rpc_controller, request, callback): + """The body of all service methods in the generated stub class. + + Args: + stub: Stub instance. + method_descriptor: Descriptor of the invoked method. + rpc_controller: Rpc controller to execute the method. + request: Request protocol message. + callback: A callback to execute when the method finishes. + Returns: + Response message (in case of blocking call). + """ + return stub.rpc_channel.CallMethod( + method_descriptor, rpc_controller, request, + method_descriptor.output_type._concrete_class, callback) diff --git a/pythonlib/build/lib/google/protobuf/symbol_database.py b/pythonlib/build/lib/google/protobuf/symbol_database.py new file mode 100644 index 0000000..7466fec --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/symbol_database.py @@ -0,0 +1,185 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""A database of Python protocol buffer generated symbols. + +SymbolDatabase makes it easy to create new instances of a registered type, given +only the type's protocol buffer symbol name. Once all symbols are registered, +they can be accessed using either the MessageFactory interface which +SymbolDatabase exposes, or the DescriptorPool interface of the underlying +pool. + +Example usage: + + db = symbol_database.SymbolDatabase() + + # Register symbols of interest, from one or multiple files. + db.RegisterFileDescriptor(my_proto_pb2.DESCRIPTOR) + db.RegisterMessage(my_proto_pb2.MyMessage) + db.RegisterEnumDescriptor(my_proto_pb2.MyEnum.DESCRIPTOR) + + # The database can be used as a MessageFactory, to generate types based on + # their name: + types = db.GetMessages(['my_proto.proto']) + my_message_instance = types['MyMessage']() + + # The database's underlying descriptor pool can be queried, so it's not + # necessary to know a type's filename to be able to generate it: + filename = db.pool.FindFileContainingSymbol('MyMessage') + my_message_instance = db.GetMessages([filename])['MyMessage']() + + # This functionality is also provided directly via a convenience method: + my_message_instance = db.GetSymbol('MyMessage')() +""" + + +from google.protobuf import descriptor_pool + + +class SymbolDatabase(object): + """A database of Python generated symbols. + + SymbolDatabase also models message_factory.MessageFactory. + + The symbol database can be used to keep a global registry of all protocol + buffer types used within a program. + """ + + def __init__(self): + """Constructor.""" + + self._symbols = {} + self._symbols_by_file = {} + self.pool = descriptor_pool.DescriptorPool() + + def RegisterMessage(self, message): + """Registers the given message type in the local database. + + Args: + message: a message.Message, to be registered. + + Returns: + The provided message. + """ + + desc = message.DESCRIPTOR + self._symbols[desc.full_name] = message + if desc.file.name not in self._symbols_by_file: + self._symbols_by_file[desc.file.name] = {} + self._symbols_by_file[desc.file.name][desc.full_name] = message + self.pool.AddDescriptor(desc) + return message + + def RegisterEnumDescriptor(self, enum_descriptor): + """Registers the given enum descriptor in the local database. + + Args: + enum_descriptor: a descriptor.EnumDescriptor. + + Returns: + The provided descriptor. + """ + self.pool.AddEnumDescriptor(enum_descriptor) + return enum_descriptor + + def RegisterFileDescriptor(self, file_descriptor): + """Registers the given file descriptor in the local database. + + Args: + file_descriptor: a descriptor.FileDescriptor. + + Returns: + The provided descriptor. + """ + self.pool.AddFileDescriptor(file_descriptor) + + def GetSymbol(self, symbol): + """Tries to find a symbol in the local database. + + Currently, this method only returns message.Message instances, however, if + may be extended in future to support other symbol types. + + Args: + symbol: A str, a protocol buffer symbol. + + Returns: + A Python class corresponding to the symbol. + + Raises: + KeyError: if the symbol could not be found. + """ + + return self._symbols[symbol] + + def GetPrototype(self, descriptor): + """Builds a proto2 message class based on the passed in descriptor. + + Passing a descriptor with a fully qualified name matching a previous + invocation will cause the same class to be returned. + + Args: + descriptor: The descriptor to build from. + + Returns: + A class describing the passed in descriptor. + """ + + return self.GetSymbol(descriptor.full_name) + + def GetMessages(self, files): + """Gets all the messages from a specified file. + + This will find and resolve dependencies, failing if they are not registered + in the symbol database. + + + Args: + files: The file names to extract messages from. + + Returns: + A dictionary mapping proto names to the message classes. This will include + any dependent messages as well as any messages defined in the same file as + a specified message. + + Raises: + KeyError: if a file could not be found. + """ + + result = {} + for f in files: + result.update(self._symbols_by_file[f]) + return result + +_DEFAULT = SymbolDatabase() + + +def Default(): + """Returns the default SymbolDatabase.""" + return _DEFAULT diff --git a/pythonlib/build/lib/google/protobuf/text_encoding.py b/pythonlib/build/lib/google/protobuf/text_encoding.py new file mode 100644 index 0000000..ed0aabf --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/text_encoding.py @@ -0,0 +1,110 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +#PY25 compatible for GAE. +# +"""Encoding related utilities.""" + +import re +import sys ##PY25 + +# Lookup table for utf8 +_cescape_utf8_to_str = [chr(i) for i in xrange(0, 256)] +_cescape_utf8_to_str[9] = r'\t' # optional escape +_cescape_utf8_to_str[10] = r'\n' # optional escape +_cescape_utf8_to_str[13] = r'\r' # optional escape +_cescape_utf8_to_str[39] = r"\'" # optional escape + +_cescape_utf8_to_str[34] = r'\"' # necessary escape +_cescape_utf8_to_str[92] = r'\\' # necessary escape + +# Lookup table for non-utf8, with necessary escapes at (o >= 127 or o < 32) +_cescape_byte_to_str = ([r'\%03o' % i for i in xrange(0, 32)] + + [chr(i) for i in xrange(32, 127)] + + [r'\%03o' % i for i in xrange(127, 256)]) +_cescape_byte_to_str[9] = r'\t' # optional escape +_cescape_byte_to_str[10] = r'\n' # optional escape +_cescape_byte_to_str[13] = r'\r' # optional escape +_cescape_byte_to_str[39] = r"\'" # optional escape + +_cescape_byte_to_str[34] = r'\"' # necessary escape +_cescape_byte_to_str[92] = r'\\' # necessary escape + + +def CEscape(text, as_utf8): + """Escape a bytes string for use in an ascii protocol buffer. + + text.encode('string_escape') does not seem to satisfy our needs as it + encodes unprintable characters using two-digit hex escapes whereas our + C++ unescaping function allows hex escapes to be any length. So, + "\0011".encode('string_escape') ends up being "\\x011", which will be + decoded in C++ as a single-character string with char code 0x11. + + Args: + text: A byte string to be escaped + as_utf8: Specifies if result should be returned in UTF-8 encoding + Returns: + Escaped string + """ + # PY3 hack: make Ord work for str and bytes: + # //platforms/networking/data uses unicode here, hence basestring. + Ord = ord if isinstance(text, basestring) else lambda x: x + if as_utf8: + return ''.join(_cescape_utf8_to_str[Ord(c)] for c in text) + return ''.join(_cescape_byte_to_str[Ord(c)] for c in text) + + +_CUNESCAPE_HEX = re.compile(r'(\\+)x([0-9a-fA-F])(?![0-9a-fA-F])') +_cescape_highbit_to_str = ([chr(i) for i in range(0, 127)] + + [r'\%03o' % i for i in range(127, 256)]) + + +def CUnescape(text): + """Unescape a text string with C-style escape sequences to UTF-8 bytes.""" + + def ReplaceHex(m): + # Only replace the match if the number of leading back slashes is odd. i.e. + # the slash itself is not escaped. + if len(m.group(1)) & 1: + return m.group(1) + 'x0' + m.group(2) + return m.group(0) + + # This is required because the 'string_escape' encoding doesn't + # allow single-digit hex escapes (like '\xf'). + result = _CUNESCAPE_HEX.sub(ReplaceHex, text) + + if sys.version_info[0] < 3: ##PY25 +##!PY25 if str is bytes: # PY2 + return result.decode('string_escape') + result = ''.join(_cescape_highbit_to_str[ord(c)] for c in result) + return (result.encode('ascii') # Make it bytes to allow decode. + .decode('unicode_escape') + # Make it bytes again to return the proper type. + .encode('raw_unicode_escape')) diff --git a/pythonlib/build/lib/google/protobuf/text_format.py b/pythonlib/build/lib/google/protobuf/text_format.py new file mode 100644 index 0000000..50f76f2 --- /dev/null +++ b/pythonlib/build/lib/google/protobuf/text_format.py @@ -0,0 +1,873 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +#PY25 compatible for GAE. +# +# Copyright 2007 Google Inc. All Rights Reserved. + +"""Contains routines for printing protocol messages in text format.""" + +__author__ = 'kenton@google.com (Kenton Varda)' + +import cStringIO +import re + +from google.protobuf.internal import type_checkers +from google.protobuf import descriptor +from google.protobuf import text_encoding + +__all__ = ['MessageToString', 'PrintMessage', 'PrintField', + 'PrintFieldValue', 'Merge'] + + +_INTEGER_CHECKERS = (type_checkers.Uint32ValueChecker(), + type_checkers.Int32ValueChecker(), + type_checkers.Uint64ValueChecker(), + type_checkers.Int64ValueChecker()) +_FLOAT_INFINITY = re.compile('-?inf(?:inity)?f?', re.IGNORECASE) +_FLOAT_NAN = re.compile('nanf?', re.IGNORECASE) +_FLOAT_TYPES = frozenset([descriptor.FieldDescriptor.CPPTYPE_FLOAT, + descriptor.FieldDescriptor.CPPTYPE_DOUBLE]) + + +class Error(Exception): + """Top-level module error for text_format.""" + + +class ParseError(Error): + """Thrown in case of ASCII parsing error.""" + + +def MessageToString(message, as_utf8=False, as_one_line=False, + pointy_brackets=False, use_index_order=False, + float_format=None): + """Convert protobuf message to text format. + + Floating point values can be formatted compactly with 15 digits of + precision (which is the most that IEEE 754 "double" can guarantee) + using float_format='.15g'. + + Args: + message: The protocol buffers message. + as_utf8: Produce text output in UTF8 format. + as_one_line: Don't introduce newlines between fields. + pointy_brackets: If True, use angle brackets instead of curly braces for + nesting. + use_index_order: If True, print fields of a proto message using the order + defined in source code instead of the field number. By default, use the + field number order. + float_format: If set, use this to specify floating point number formatting + (per the "Format Specification Mini-Language"); otherwise, str() is used. + + Returns: + A string of the text formatted protocol buffer message. + """ + out = cStringIO.StringIO() + PrintMessage(message, out, as_utf8=as_utf8, as_one_line=as_one_line, + pointy_brackets=pointy_brackets, + use_index_order=use_index_order, + float_format=float_format) + result = out.getvalue() + out.close() + if as_one_line: + return result.rstrip() + return result + + +def PrintMessage(message, out, indent=0, as_utf8=False, as_one_line=False, + pointy_brackets=False, use_index_order=False, + float_format=None): + fields = message.ListFields() + if use_index_order: + fields.sort(key=lambda x: x[0].index) + for field, value in fields: + if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + for element in value: + PrintField(field, element, out, indent, as_utf8, as_one_line, + pointy_brackets=pointy_brackets, + float_format=float_format) + else: + PrintField(field, value, out, indent, as_utf8, as_one_line, + pointy_brackets=pointy_brackets, + float_format=float_format) + + +def PrintField(field, value, out, indent=0, as_utf8=False, as_one_line=False, + pointy_brackets=False, float_format=None): + """Print a single field name/value pair. For repeated fields, the value + should be a single element.""" + + out.write(' ' * indent) + if field.is_extension: + out.write('[') + if (field.containing_type.GetOptions().message_set_wire_format and + field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and + field.message_type == field.extension_scope and + field.label == descriptor.FieldDescriptor.LABEL_OPTIONAL): + out.write(field.message_type.full_name) + else: + out.write(field.full_name) + out.write(']') + elif field.type == descriptor.FieldDescriptor.TYPE_GROUP: + # For groups, use the capitalized name. + out.write(field.message_type.name) + else: + out.write(field.name) + + if field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + # The colon is optional in this case, but our cross-language golden files + # don't include it. + out.write(': ') + + PrintFieldValue(field, value, out, indent, as_utf8, as_one_line, + pointy_brackets=pointy_brackets, + float_format=float_format) + if as_one_line: + out.write(' ') + else: + out.write('\n') + + +def PrintFieldValue(field, value, out, indent=0, as_utf8=False, + as_one_line=False, pointy_brackets=False, + float_format=None): + """Print a single field value (not including name). For repeated fields, + the value should be a single element.""" + + if pointy_brackets: + openb = '<' + closeb = '>' + else: + openb = '{' + closeb = '}' + + if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + if as_one_line: + out.write(' %s ' % openb) + PrintMessage(value, out, indent, as_utf8, as_one_line, + pointy_brackets=pointy_brackets, + float_format=float_format) + out.write(closeb) + else: + out.write(' %s\n' % openb) + PrintMessage(value, out, indent + 2, as_utf8, as_one_line, + pointy_brackets=pointy_brackets, + float_format=float_format) + out.write(' ' * indent + closeb) + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM: + enum_value = field.enum_type.values_by_number.get(value, None) + if enum_value is not None: + out.write(enum_value.name) + else: + out.write(str(value)) + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_STRING: + out.write('\"') + if isinstance(value, unicode): + out_value = value.encode('utf-8') + else: + out_value = value + if field.type == descriptor.FieldDescriptor.TYPE_BYTES: + # We need to escape non-UTF8 chars in TYPE_BYTES field. + out_as_utf8 = False + else: + out_as_utf8 = as_utf8 + out.write(text_encoding.CEscape(out_value, out_as_utf8)) + out.write('\"') + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_BOOL: + if value: + out.write('true') + else: + out.write('false') + elif field.cpp_type in _FLOAT_TYPES and float_format is not None: + out.write('{1:{0}}'.format(float_format, value)) + else: + out.write(str(value)) + + +def _ParseOrMerge(lines, message, allow_multiple_scalars): + """Converts an ASCII representation of a protocol message into a message. + + Args: + lines: Lines of a message's ASCII representation. + message: A protocol buffer message to merge into. + allow_multiple_scalars: Determines if repeated values for a non-repeated + field are permitted, e.g., the string "foo: 1 foo: 2" for a + required/optional field named "foo". + + Raises: + ParseError: On ASCII parsing problems. + """ + tokenizer = _Tokenizer(lines) + while not tokenizer.AtEnd(): + _MergeField(tokenizer, message, allow_multiple_scalars) + + +def Parse(text, message): + """Parses an ASCII representation of a protocol message into a message. + + Args: + text: Message ASCII representation. + message: A protocol buffer message to merge into. + + Returns: + The same message passed as argument. + + Raises: + ParseError: On ASCII parsing problems. + """ + if not isinstance(text, str): text = text.decode('utf-8') + return ParseLines(text.split('\n'), message) + + +def Merge(text, message): + """Parses an ASCII representation of a protocol message into a message. + + Like Parse(), but allows repeated values for a non-repeated field, and uses + the last one. + + Args: + text: Message ASCII representation. + message: A protocol buffer message to merge into. + + Returns: + The same message passed as argument. + + Raises: + ParseError: On ASCII parsing problems. + """ + return MergeLines(text.split('\n'), message) + + +def ParseLines(lines, message): + """Parses an ASCII representation of a protocol message into a message. + + Args: + lines: An iterable of lines of a message's ASCII representation. + message: A protocol buffer message to merge into. + + Returns: + The same message passed as argument. + + Raises: + ParseError: On ASCII parsing problems. + """ + _ParseOrMerge(lines, message, False) + return message + + +def MergeLines(lines, message): + """Parses an ASCII representation of a protocol message into a message. + + Args: + lines: An iterable of lines of a message's ASCII representation. + message: A protocol buffer message to merge into. + + Returns: + The same message passed as argument. + + Raises: + ParseError: On ASCII parsing problems. + """ + _ParseOrMerge(lines, message, True) + return message + + +def _MergeField(tokenizer, message, allow_multiple_scalars): + """Merges a single protocol message field into a message. + + Args: + tokenizer: A tokenizer to parse the field name and values. + message: A protocol message to record the data. + allow_multiple_scalars: Determines if repeated values for a non-repeated + field are permitted, e.g., the string "foo: 1 foo: 2" for a + required/optional field named "foo". + + Raises: + ParseError: In case of ASCII parsing problems. + """ + message_descriptor = message.DESCRIPTOR + if tokenizer.TryConsume('['): + name = [tokenizer.ConsumeIdentifier()] + while tokenizer.TryConsume('.'): + name.append(tokenizer.ConsumeIdentifier()) + name = '.'.join(name) + + if not message_descriptor.is_extendable: + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" does not have extensions.' % + message_descriptor.full_name) + # pylint: disable=protected-access + field = message.Extensions._FindExtensionByName(name) + # pylint: enable=protected-access + if not field: + raise tokenizer.ParseErrorPreviousToken( + 'Extension "%s" not registered.' % name) + elif message_descriptor != field.containing_type: + raise tokenizer.ParseErrorPreviousToken( + 'Extension "%s" does not extend message type "%s".' % ( + name, message_descriptor.full_name)) + tokenizer.Consume(']') + else: + name = tokenizer.ConsumeIdentifier() + field = message_descriptor.fields_by_name.get(name, None) + + # Group names are expected to be capitalized as they appear in the + # .proto file, which actually matches their type names, not their field + # names. + if not field: + field = message_descriptor.fields_by_name.get(name.lower(), None) + if field and field.type != descriptor.FieldDescriptor.TYPE_GROUP: + field = None + + if (field and field.type == descriptor.FieldDescriptor.TYPE_GROUP and + field.message_type.name != name): + field = None + + if not field: + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" has no field named "%s".' % ( + message_descriptor.full_name, name)) + + if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + tokenizer.TryConsume(':') + + if tokenizer.TryConsume('<'): + end_token = '>' + else: + tokenizer.Consume('{') + end_token = '}' + + if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + if field.is_extension: + sub_message = message.Extensions[field].add() + else: + sub_message = getattr(message, field.name).add() + else: + if field.is_extension: + sub_message = message.Extensions[field] + else: + sub_message = getattr(message, field.name) + sub_message.SetInParent() + + while not tokenizer.TryConsume(end_token): + if tokenizer.AtEnd(): + raise tokenizer.ParseErrorPreviousToken('Expected "%s".' % (end_token)) + _MergeField(tokenizer, sub_message, allow_multiple_scalars) + else: + _MergeScalarField(tokenizer, message, field, allow_multiple_scalars) + + # For historical reasons, fields may optionally be separated by commas or + # semicolons. + if not tokenizer.TryConsume(','): + tokenizer.TryConsume(';') + + +def _MergeScalarField(tokenizer, message, field, allow_multiple_scalars): + """Merges a single protocol message scalar field into a message. + + Args: + tokenizer: A tokenizer to parse the field value. + message: A protocol message to record the data. + field: The descriptor of the field to be merged. + allow_multiple_scalars: Determines if repeated values for a non-repeated + field are permitted, e.g., the string "foo: 1 foo: 2" for a + required/optional field named "foo". + + Raises: + ParseError: In case of ASCII parsing problems. + RuntimeError: On runtime errors. + """ + tokenizer.Consume(':') + value = None + + if field.type in (descriptor.FieldDescriptor.TYPE_INT32, + descriptor.FieldDescriptor.TYPE_SINT32, + descriptor.FieldDescriptor.TYPE_SFIXED32): + value = tokenizer.ConsumeInt32() + elif field.type in (descriptor.FieldDescriptor.TYPE_INT64, + descriptor.FieldDescriptor.TYPE_SINT64, + descriptor.FieldDescriptor.TYPE_SFIXED64): + value = tokenizer.ConsumeInt64() + elif field.type in (descriptor.FieldDescriptor.TYPE_UINT32, + descriptor.FieldDescriptor.TYPE_FIXED32): + value = tokenizer.ConsumeUint32() + elif field.type in (descriptor.FieldDescriptor.TYPE_UINT64, + descriptor.FieldDescriptor.TYPE_FIXED64): + value = tokenizer.ConsumeUint64() + elif field.type in (descriptor.FieldDescriptor.TYPE_FLOAT, + descriptor.FieldDescriptor.TYPE_DOUBLE): + value = tokenizer.ConsumeFloat() + elif field.type == descriptor.FieldDescriptor.TYPE_BOOL: + value = tokenizer.ConsumeBool() + elif field.type == descriptor.FieldDescriptor.TYPE_STRING: + value = tokenizer.ConsumeString() + elif field.type == descriptor.FieldDescriptor.TYPE_BYTES: + value = tokenizer.ConsumeByteString() + elif field.type == descriptor.FieldDescriptor.TYPE_ENUM: + value = tokenizer.ConsumeEnum(field) + else: + raise RuntimeError('Unknown field type %d' % field.type) + + if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + if field.is_extension: + message.Extensions[field].append(value) + else: + getattr(message, field.name).append(value) + else: + if field.is_extension: + if not allow_multiple_scalars and message.HasExtension(field): + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" should not have multiple "%s" extensions.' % + (message.DESCRIPTOR.full_name, field.full_name)) + else: + message.Extensions[field] = value + else: + if not allow_multiple_scalars and message.HasField(field.name): + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" should not have multiple "%s" fields.' % + (message.DESCRIPTOR.full_name, field.name)) + else: + setattr(message, field.name, value) + + +class _Tokenizer(object): + """Protocol buffer ASCII representation tokenizer. + + This class handles the lower level string parsing by splitting it into + meaningful tokens. + + It was directly ported from the Java protocol buffer API. + """ + + _WHITESPACE = re.compile('(\\s|(#.*$))+', re.MULTILINE) + _TOKEN = re.compile( + '[a-zA-Z_][0-9a-zA-Z_+-]*|' # an identifier + '[0-9+-][0-9a-zA-Z_.+-]*|' # a number + '\"([^\"\n\\\\]|\\\\.)*(\"|\\\\?$)|' # a double-quoted string + '\'([^\'\n\\\\]|\\\\.)*(\'|\\\\?$)') # a single-quoted string + _IDENTIFIER = re.compile(r'\w+') + + def __init__(self, lines): + self._position = 0 + self._line = -1 + self._column = 0 + self._token_start = None + self.token = '' + self._lines = iter(lines) + self._current_line = '' + self._previous_line = 0 + self._previous_column = 0 + self._more_lines = True + self._SkipWhitespace() + self.NextToken() + + def AtEnd(self): + """Checks the end of the text was reached. + + Returns: + True iff the end was reached. + """ + return not self.token + + def _PopLine(self): + while len(self._current_line) <= self._column: + try: + self._current_line = self._lines.next() + except StopIteration: + self._current_line = '' + self._more_lines = False + return + else: + self._line += 1 + self._column = 0 + + def _SkipWhitespace(self): + while True: + self._PopLine() + match = self._WHITESPACE.match(self._current_line, self._column) + if not match: + break + length = len(match.group(0)) + self._column += length + + def TryConsume(self, token): + """Tries to consume a given piece of text. + + Args: + token: Text to consume. + + Returns: + True iff the text was consumed. + """ + if self.token == token: + self.NextToken() + return True + return False + + def Consume(self, token): + """Consumes a piece of text. + + Args: + token: Text to consume. + + Raises: + ParseError: If the text couldn't be consumed. + """ + if not self.TryConsume(token): + raise self._ParseError('Expected "%s".' % token) + + def ConsumeIdentifier(self): + """Consumes protocol message field identifier. + + Returns: + Identifier string. + + Raises: + ParseError: If an identifier couldn't be consumed. + """ + result = self.token + if not self._IDENTIFIER.match(result): + raise self._ParseError('Expected identifier.') + self.NextToken() + return result + + def ConsumeInt32(self): + """Consumes a signed 32bit integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If a signed 32bit integer couldn't be consumed. + """ + try: + result = ParseInteger(self.token, is_signed=True, is_long=False) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeUint32(self): + """Consumes an unsigned 32bit integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If an unsigned 32bit integer couldn't be consumed. + """ + try: + result = ParseInteger(self.token, is_signed=False, is_long=False) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeInt64(self): + """Consumes a signed 64bit integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If a signed 64bit integer couldn't be consumed. + """ + try: + result = ParseInteger(self.token, is_signed=True, is_long=True) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeUint64(self): + """Consumes an unsigned 64bit integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If an unsigned 64bit integer couldn't be consumed. + """ + try: + result = ParseInteger(self.token, is_signed=False, is_long=True) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeFloat(self): + """Consumes an floating point number. + + Returns: + The number parsed. + + Raises: + ParseError: If a floating point number couldn't be consumed. + """ + try: + result = ParseFloat(self.token) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeBool(self): + """Consumes a boolean value. + + Returns: + The bool parsed. + + Raises: + ParseError: If a boolean value couldn't be consumed. + """ + try: + result = ParseBool(self.token) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeString(self): + """Consumes a string value. + + Returns: + The string parsed. + + Raises: + ParseError: If a string value couldn't be consumed. + """ + the_bytes = self.ConsumeByteString() + try: + return unicode(the_bytes, 'utf-8') + except UnicodeDecodeError, e: + raise self._StringParseError(e) + + def ConsumeByteString(self): + """Consumes a byte array value. + + Returns: + The array parsed (as a string). + + Raises: + ParseError: If a byte array value couldn't be consumed. + """ + the_list = [self._ConsumeSingleByteString()] + while self.token and self.token[0] in ('\'', '"'): + the_list.append(self._ConsumeSingleByteString()) + return ''.encode('latin1').join(the_list) ##PY25 +##!PY25 return b''.join(the_list) + + def _ConsumeSingleByteString(self): + """Consume one token of a string literal. + + String literals (whether bytes or text) can come in multiple adjacent + tokens which are automatically concatenated, like in C or Python. This + method only consumes one token. + """ + text = self.token + if len(text) < 1 or text[0] not in ('\'', '"'): + raise self._ParseError('Expected string.') + + if len(text) < 2 or text[-1] != text[0]: + raise self._ParseError('String missing ending quote.') + + try: + result = text_encoding.CUnescape(text[1:-1]) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeEnum(self, field): + try: + result = ParseEnum(field, self.token) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ParseErrorPreviousToken(self, message): + """Creates and *returns* a ParseError for the previously read token. + + Args: + message: A message to set for the exception. + + Returns: + A ParseError instance. + """ + return ParseError('%d:%d : %s' % ( + self._previous_line + 1, self._previous_column + 1, message)) + + def _ParseError(self, message): + """Creates and *returns* a ParseError for the current token.""" + return ParseError('%d:%d : %s' % ( + self._line + 1, self._column + 1, message)) + + def _StringParseError(self, e): + return self._ParseError('Couldn\'t parse string: ' + str(e)) + + def NextToken(self): + """Reads the next meaningful token.""" + self._previous_line = self._line + self._previous_column = self._column + + self._column += len(self.token) + self._SkipWhitespace() + + if not self._more_lines: + self.token = '' + return + + match = self._TOKEN.match(self._current_line, self._column) + if match: + token = match.group(0) + self.token = token + else: + self.token = self._current_line[self._column] + + +def ParseInteger(text, is_signed=False, is_long=False): + """Parses an integer. + + Args: + text: The text to parse. + is_signed: True if a signed integer must be parsed. + is_long: True if a long integer must be parsed. + + Returns: + The integer value. + + Raises: + ValueError: Thrown Iff the text is not a valid integer. + """ + # Do the actual parsing. Exception handling is propagated to caller. + try: + # We force 32-bit values to int and 64-bit values to long to make + # alternate implementations where the distinction is more significant + # (e.g. the C++ implementation) simpler. + if is_long: + result = long(text, 0) + else: + result = int(text, 0) + except ValueError: + raise ValueError('Couldn\'t parse integer: %s' % text) + + # Check if the integer is sane. Exceptions handled by callers. + checker = _INTEGER_CHECKERS[2 * int(is_long) + int(is_signed)] + checker.CheckValue(result) + return result + + +def ParseFloat(text): + """Parse a floating point number. + + Args: + text: Text to parse. + + Returns: + The number parsed. + + Raises: + ValueError: If a floating point number couldn't be parsed. + """ + try: + # Assume Python compatible syntax. + return float(text) + except ValueError: + # Check alternative spellings. + if _FLOAT_INFINITY.match(text): + if text[0] == '-': + return float('-inf') + else: + return float('inf') + elif _FLOAT_NAN.match(text): + return float('nan') + else: + # assume '1.0f' format + try: + return float(text.rstrip('f')) + except ValueError: + raise ValueError('Couldn\'t parse float: %s' % text) + + +def ParseBool(text): + """Parse a boolean value. + + Args: + text: Text to parse. + + Returns: + Boolean values parsed + + Raises: + ValueError: If text is not a valid boolean. + """ + if text in ('true', 't', '1'): + return True + elif text in ('false', 'f', '0'): + return False + else: + raise ValueError('Expected "true" or "false".') + + +def ParseEnum(field, value): + """Parse an enum value. + + The value can be specified by a number (the enum value), or by + a string literal (the enum name). + + Args: + field: Enum field descriptor. + value: String value. + + Returns: + Enum value number. + + Raises: + ValueError: If the enum value could not be parsed. + """ + enum_descriptor = field.enum_type + try: + number = int(value, 0) + except ValueError: + # Identifier. + enum_value = enum_descriptor.values_by_name.get(value, None) + if enum_value is None: + raise ValueError( + 'Enum type "%s" has no value named %s.' % ( + enum_descriptor.full_name, value)) + else: + # Numeric value. + enum_value = enum_descriptor.values_by_number.get(number, None) + if enum_value is None: + raise ValueError( + 'Enum type "%s" has no value with number %d.' % ( + enum_descriptor.full_name, number)) + return enum_value.number diff --git a/pythonlib/dist/protobuf-2.6.0-py2.7.egg b/pythonlib/dist/protobuf-2.6.0-py2.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..a9c4e0a05ba7c64eec07a1b20fa8284c9c794765 GIT binary patch literal 206800 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

YNu;R!@m@ z!yMA{!{zW8*Qa5tz}j+FRwgO^4j~*V96gOy6}xCf3MA(Y)Xa4}G)Qn;M7^r`uoRBI zq`yFVL&Zsq`EWL!H>M*7^W3XK=vWjg2ohY^gc}l>Vp5^vc6&iL;+#oVAA{B;Dr(P8 zEecBN(AF2O-~XsZB)%Y6KHheqNQ8q@D5!)T1{FyONw!iZH0j|Kgoc9R%YP!TFd$KO z0^}#8xYbt*SWu-(CWNWh15jlq5!&Vo>J*V?4sH$T?MXkyQ{}w>xHIhbrB2~1a@nB% zs6F_}ORUogNbXqDnz^v@-k5Jpu@Ghu`g$^zkiayi)?k_Nx7fMXxHN2*kgQUbDzf5* zY-3+q7;Z=RcQy9vICKY-zzkxQsgA*EwTTsIrWr12*0-)B|jRLU5>HShu`ClFV z(c)u58k(*XE{ywU8dKCvxd#HU6(eKeC9z77?8GOCuZXd)d|>b+`GEjR*@yrdZ6z%@!(2N?J!JM%U+Vln)|+bqQhw-&W*FlgMMw;wPVv{sy#j+oOog#CkF zfE>(eQJEI2?XRCN-%m@P<(y#|t4F%Fr&A}WLR$b+7l{b#&fW;DUXRaSq#6&H$?gaHxXdu%+Wt z5_;b+7_7im=k6%djylve9iEh=Bk#a;s({zLsw>LbYz8i5DpK~I6Owbz`O|9qSQU

>P0QZv~po!6#>Le@UKJgyc@AC5rc3oiV&+%|YS@ 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 =j5*K3s`j1dVFpbiPxxwqJ$BPJq9P5 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

x49wlQIuavS)J+(`!$cg3DM@S zM%A)p(a2Ioq$EaRMR)?e8-C?3%Jsz2Fi9fz~KG*UwCXNIW~A1f769v1otbnwp+~+Pxb|g<(dh4@o@*fq`;5g?Ju0-7J%5b6nQ5c8#Eo9ZBG zk7-4l;1?}z3Q89rZR?M0!6Zw-UmlqvKJkU6fQDbJ z@abGW!8cLjgC$QA}mX;sSw0DsWjowU~$P4#)ADJes#@ z7jLQR)zws!1tq1~1)iB|YAKberKG|5msBRF`z$R!EZ%@U&4(-N#1)OEWj|%uXQGv3 zAUE0P>tzxqqE2tC(|yy$Xr~p3^;4Vd{bUB_+*L4JYcZUk4t)Kza*Q6;G)$kN4Xcn| z;7{M36I+%FxTNjO07NIzaICm~!Kci4zJl<3XCnXvJg0bP!X&1uw9VP`y;eZmG|TFk zDy2;dkpx^xOMdf;1DLyn#64bRF+V|Pf;#zuy`FBE-&<6Zd-RtB$EZIniek>+f9xdc zjMu3rRAD`aol%DN`9UzRiCnegtuWriPP9Y2ew}HC^;LN_i^;`K+)+Ki9rk!=qsP6T z-bYSz-91|lb38OSDc+|yvJp4U7OT4GkjhCw|Kd^B2^-xtuJHzE?)!mY`U0CVT8MNu zc&D@Wv4MW6koPfKk0DONa0O2S3nV35pWM2%MbyTu~8hKNmzY7EJbAN)d{WmJBx4W@$xBjR7Ify;4^euM#(vs3` zqY_J{lw|cl4_h>%AE*_DORFZv*7{x!BD%HSZPpn5(2+(nB+AsfGEvNx`WZ2eYXF^d z)c%pexie@rAmbv%G!31s1%*XuoOsa&@eFx3Y)Zwdty(bE4WyR4eF*?$~DOA;BqvDuK zeOFP|t&GLL+&|UQ{DDL<_*?``ZpT>&FE7Fe zTm9qh@%|$?UBMrq6?ec9JK@;1qhRd90~=$Vd0*Ee1K<>TR3T}_B#U4+z#Xw{C663N z78~GzBsywx0EYA|6q05&WXraD=bhs$_e@NTvjKkO@QJ7noRhC#PH*z2C?r^}8!7Kzi?ysHvof(sH0;7n_fA!Wi)NDza9h}eYEmJvdR|s?Y zk|npvmuqQzjo=BEbM~38Fcq3Y;{mG#lkJVR-WI0A%~2UT#ZBMan|AmO-2N#9P!qwu z2wT_K@qOVWZk#A5$~rTDZQjhdW3nx(V#^AqMy!?6G4H|{x_ByjE}7ub4sdFsNajxD zA&Z3tC7x2tA<4nWr=}F2N+Q)QZLO0GUVr#Qn7Q}LBjq<#po-WXhMK-(a!*Xuxor~> z)aBKb9AL8PrWZtPKVmoiH6^Cg2>dd4Gi6)5#%8Ra(dV>5Rv!$D zkXspA=*#9ek^3XcGrx%wTcSi-x4F$D62^mcdOxreaWNC=+6B=^s)1}B2#6MI05 z?4(yE#_^rk2!}oV;7xIw>UWhK7E=>Ahf0&Ubvx^xz|81gl0g9GPX&itNm z?7<5|ZZnggR?idkR=Z)PRTtDy(v=cvUFEi{IK62T4{zSNKoIYqO|M14meY3c@Nn4& zKK0eVZ3*M%2W30Tyw`SZ+Rm*->qJ1ITJhcFF`82{yB+b#X`Fox);M*@SuFkpHzeYa%U^2^NMQJ-G6m!{)_Mql~*1rt>{)Gipe2!@*0uZK<09p#p<1tw+6J ziwZQ)Gb=`R`>p?1mM5XCKwvLDG=_xnC-Ek!e*mhU9wVfMyj=aK9+gY#{$RMP9;4Wd zv|Mvq#e{Rxq?7KLOQI}Z2R312<;~g(?@7*i8XcIqL^7QWZhNeO-0EZ{VgQM8aA4$^ zw8z?Sc>;0SyY)*aWz#MW7I+(tW+T0Aqw1fmo^=eT2TX#mBqLTC7Taaa?bcsVyTiyY ziJ+zAIlW|$XhAxIh*Koym_S89x9t}_iX^92v>H2RiwQ;3t(d6AA242myYko84>Dd- ztZ{N%#I(h;q|^_>@}oY69hWF_gH4(<>h_6UjZS6CBq_zo)QDB&TW_`61$#cKJir$2 zqQo{*ZzeIwvsF@lR8dqABR1EV z61npP4_#{C3Tkd44$aqD=xS#M{G89dbrj}$7_C|OkNJH7cFYEUc(^_~umXC1kQQI1 zISc7!3|4Zo)bT_Q>JA$NMF#0>`2*N3r$mL)7*RLn3*slf6oqIED}by6OBgqrvM-0X zE^TKq1chbHY^s~L)vih1FPvX+0s;}e<{}F+WLjAWBvkia=_yII@$6#xK9A|Ga(`YE zc`rVE2Sv!^e*#AgQx*ln>>&nbMg)5Tj>oP}pnHqYwXDVsrin|lg_^?op*)=N&3$q) zE)n!&xza8_qb^={hZbJGhrDNn4qbej`2O3+qr->tAN2ngBL2r_RF?OlNdNCyle`B2 z0P+7-h%hlVwl^_#`k&dNuDA2nc;a7vzL8oL>;#SE)q%%b$@J}A8*>^LkV74c?5 z^rlB>kTLZp`a$c~ExL3)U2jl4nqDPswTmshG+#7R8agmy^HYD>VsQS z`34@?0paT}Qqzy%XRVkZ?SLJWVu%*vE0l+DArfTXGH5-27z1{Sh!_W>%1Z0ZC80RW z@ft`6^hBSB*;#4<%3zcZNU%AuOALcFK!k8xouexZ1{6o4>r8dDBEZ6&DGV0`Mt(9E zm@x|aM^Bj>0ttA9`LSf_PBFYp8}SZtiF6=CGepGz+b5ZzoP`d`KD(1A$X<(pZKn%_ z@3xZU=>`a>*da}*#6@Jz(-M$HN5%?`C`cB~i=Pc-+vz{c!-Lsx^~CkRHSb=? z@BGa6di=n#a~s_~U+dO;znc;4=HT79d-*Q#ZH%q_mwbMG`Z#P}0Z(fEi|@7esrG%8 zbNTgKy?XvSY$5L&GZ)tl0RGndGMT@5#xC-1a(C(7)YDnwsMc>{-QMqP!v5YpPdkR-fM}EdvpfPSZXKF#gpyNt@79b%)40=$Hj^%@7lX@ zeFbAFzuv-wfIx}I3RvR5x^{g)Ww|gAyV?C07Pfi!eSa6ATPt5eD}D z``Nu`dg&?;maBL7Z8OiyTWQ?57sS=y96S3ZbGn3_#qcC^*76nyfK2Owi*}v`hJhGTqG{@kN}fAZd~0}SQZM`_4>`MK*QY$zT=7Gfb4$`UfcrbQkZ)r zy;@}B3K4SoZ%8W_qO68eC~_9Rt5;tym8dD4dHQfAn1 zmvI7T2_gfOm^#+{ax^k;eoPy88iR0eMnsl7GAJMIL29~ADPH3lNfh5~ z*$Wzdh@QC^jpAv%R}-U*fv$lI5U&rLT(Hb9P1_XGa0{dOnvU4kG*^c&Ad*dD`f{uh^C*Z3D!#rS#?N*}*cl zFNqZZO9|;a$_A_z(AtF9d`Ew)s#HLSS8aWG+Sw34hLxz|80?9H;I{*8Tby1#3%IQo4hiub>p8M3@-BJGdi^?+?Wt7Kwnc zeq7InNur-i;0*<8p@y_>6VJ?=ouE5B6g0A02l5#wL_*rdX-N-3jz4N^G)303Dtl2q4}ETQkl4nsw*C~U<50(>>+BMD z<-CeKSPx)8Yd391pxf&Fu(pUH0}XrJ2NKo_jeZ!3ex_P_I!NC(9RW%MVklF!?fdaW|A-^)yt3R{W2o_laoVdc9hepesv|nNl)q{~c1Hn&vT0%tLyE z110E^q7EC3kfZaTQSb*Tn=LbxOGw@XNuCyt5yT)DtUA5%6|6n5Mx4uG2~F^&+4&}+ zIQ~Y8|3ZV42aiFqfaw96KtdqEePnm8+|xIIFS=ER|E%1L9jxw%_IY%gf_WSix}xgz z)hY|6+WN+fA$~$R*y?_oDE=gfz7eJ5*6h(HPdD(U@R{1xXfz48O?)?bIDt0V&dxx2 z(+CJ5eXFdkj&;5P(5>%yBjRk)f{-8$wjj`daKE+9bRja=l@53^;(6$eR~|?T=QBXe zkp#s6E=MDPoW_vgue};eEn2{FakfBkq-f9;0;|IaH9@6}r>C3Jd`ZS>0?sg!QLAHbs=_@f_XKo7&uDy-$k7)i z+{2_fjS2`-79j`o3PK`OVo!-D$+c5xh*m;{F|G4k+91i_)=gMtt*BPP1O$nnCj(}X zlz=ChCSK?ZaSsId)%(2fiVH`80`@tVGSe7QqRT~$rMx%<#PbL#W9=qjKlWWwni*io zCu7T~hXHAxt70o_8E%uCL%h|%8w7ThqC`l{&M?L6V@*f&pzQA2(_siM#Isjddk)=| zcY?h0+jO`4wT}hHJxWoW+Ziz*f);RsYp}nWI-p0_=rGtaho^CEQ0N_ojf)Mtz{}up zmJq;hk2%<=#(N$K`R<~%ZiK%CY<#}_bkPswOkSV@=81d z!|G+jVAoPLS}R?qAKP6Rh_^$YDZf!cJ}3bP&`SE|wZ$H^hWg8s7FX2TJ7a1crGmfx z4UhRXxwxH?iR_mB=yO+3?tyE6C-2E+ia;mq!=qOw1%>+ubawWvg`Kg10ZF9)gv5SF zo(5s#a4E5Z!N5W62Y*3}+&JK≈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 H4d4C`Gz=V8 literal 0 HcmV?d00001 diff --git a/pythonlib/ez_setup.py b/pythonlib/ez_setup.py new file mode 100644 index 0000000..3aec98e --- /dev/null +++ b/pythonlib/ez_setup.py @@ -0,0 +1,284 @@ +#!python + +# This file was obtained from: +# http://peak.telecommunity.com/dist/ez_setup.py +# on 2011/1/21. + +"""Bootstrap setuptools installation + +If you want to use setuptools in your package's setup.py, just include this +file in the same directory with it, and add this to the top of your setup.py:: + + from ez_setup import use_setuptools + use_setuptools() + +If you want to require a specific version of setuptools, set a download +mirror, or use an alternate download directory, you can do so by supplying +the appropriate options to ``use_setuptools()``. + +This file can also be run as a script to install or upgrade setuptools. +""" +import sys +DEFAULT_VERSION = "0.6c11" +DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3] + +md5_data = { + 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', + 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb', + 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b', + 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a', + 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618', + 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac', + 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5', + 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4', + 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c', + 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b', + 'setuptools-0.6c10-py2.3.egg': 'ce1e2ab5d3a0256456d9fc13800a7090', + 'setuptools-0.6c10-py2.4.egg': '57d6d9d6e9b80772c59a53a8433a5dd4', + 'setuptools-0.6c10-py2.5.egg': 'de46ac8b1c97c895572e5e8596aeb8c7', + 'setuptools-0.6c10-py2.6.egg': '58ea40aef06da02ce641495523a0b7f5', + 'setuptools-0.6c11-py2.3.egg': '2baeac6e13d414a9d28e7ba5b5a596de', + 'setuptools-0.6c11-py2.4.egg': 'bd639f9b0eac4c42497034dec2ec0c2b', + 'setuptools-0.6c11-py2.5.egg': '64c94f3bf7a72a13ec83e0b24f2749b2', + 'setuptools-0.6c11-py2.6.egg': 'bfa92100bd772d5a213eedd356d64086', + 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27', + 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277', + 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa', + 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e', + 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e', + 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f', + 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2', + 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc', + 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167', + 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64', + 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d', + 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20', + 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab', + 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53', + 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2', + 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e', + 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372', + 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902', + 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de', + 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b', + 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03', + 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a', + 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6', + 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a', +} + +import sys, os +try: from hashlib import md5 +except ImportError: from md5 import md5 + +def _validate_md5(egg_name, data): + if egg_name in md5_data: + digest = md5(data).hexdigest() + if digest != md5_data[egg_name]: + print >>sys.stderr, ( + "md5 validation of %s failed! (Possible download problem?)" + % egg_name + ) + sys.exit(2) + return data + +def use_setuptools( + version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, + download_delay=15 +): + """Automatically find/download setuptools and make it available on sys.path + + `version` should be a valid setuptools version number that is available + as an egg for download under the `download_base` URL (which should end with + a '/'). `to_dir` is the directory where setuptools will be downloaded, if + it is not already available. If `download_delay` is specified, it should + be the number of seconds that will be paused before initiating a download, + should one be required. If an older version of setuptools is installed, + this routine will print a message to ``sys.stderr`` and raise SystemExit in + an attempt to abort the calling script. + """ + was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules + def do_download(): + egg = download_setuptools(version, download_base, to_dir, download_delay) + sys.path.insert(0, egg) + import setuptools; setuptools.bootstrap_install_from = egg + try: + import pkg_resources + except ImportError: + return do_download() + try: + return do_download() + pkg_resources.require("setuptools>="+version); return + except pkg_resources.VersionConflict, e: + if was_imported: + print >>sys.stderr, ( + "The required version of setuptools (>=%s) is not available, and\n" + "can't be installed while this script is running. Please install\n" + " a more recent version first, using 'easy_install -U setuptools'." + "\n\n(Currently using %r)" + ) % (version, e.args[0]) + sys.exit(2) + except pkg_resources.DistributionNotFound: + pass + + del pkg_resources, sys.modules['pkg_resources'] # reload ok + return do_download() + +def download_setuptools( + version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, + delay = 15 +): + """Download setuptools from a specified location and return its filename + + `version` should be a valid setuptools version number that is available + as an egg for download under the `download_base` URL (which should end + with a '/'). `to_dir` is the directory where the egg will be downloaded. + `delay` is the number of seconds to pause before an actual download attempt. + """ + import urllib2, shutil + egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) + url = download_base + egg_name + saveto = os.path.join(to_dir, egg_name) + src = dst = None + if not os.path.exists(saveto): # Avoid repeated downloads + try: + from distutils import log + if delay: + log.warn(""" +--------------------------------------------------------------------------- +This script requires setuptools version %s to run (even to display +help). I will attempt to download it for you (from +%s), but +you may need to enable firewall access for this script first. +I will start the download in %d seconds. + +(Note: if this machine does not have network access, please obtain the file + + %s + +and place it in this directory before rerunning this script.) +---------------------------------------------------------------------------""", + version, download_base, delay, url + ); from time import sleep; sleep(delay) + log.warn("Downloading %s", url) + src = urllib2.urlopen(url) + # Read/write all in one block, so we don't create a corrupt file + # if the download is interrupted. + data = _validate_md5(egg_name, src.read()) + dst = open(saveto,"wb"); dst.write(data) + finally: + if src: src.close() + if dst: dst.close() + return os.path.realpath(saveto) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +def main(argv, version=DEFAULT_VERSION): + """Install or upgrade setuptools and EasyInstall""" + try: + import setuptools + except ImportError: + egg = None + try: + egg = download_setuptools(version, delay=0) + sys.path.insert(0,egg) + from setuptools.command.easy_install import main + return main(list(argv)+[egg]) # we're done here + finally: + if egg and os.path.exists(egg): + os.unlink(egg) + else: + if setuptools.__version__ == '0.0.1': + print >>sys.stderr, ( + "You have an obsolete version of setuptools installed. Please\n" + "remove it from your system entirely before rerunning this script." + ) + sys.exit(2) + + req = "setuptools>="+version + import pkg_resources + try: + pkg_resources.require(req) + except pkg_resources.VersionConflict: + try: + from setuptools.command.easy_install import main + except ImportError: + from easy_install import main + main(list(argv)+[download_setuptools(delay=0)]) + sys.exit(0) # try to force an exit + else: + if argv: + from setuptools.command.easy_install import main + main(argv) + else: + print "Setuptools version",version,"or greater has been installed." + print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' + +def update_md5(filenames): + """Update our built-in md5 registry""" + + import re + + for name in filenames: + base = os.path.basename(name) + f = open(name,'rb') + md5_data[base] = md5(f.read()).hexdigest() + f.close() + + data = [" %r: %r,\n" % it for it in md5_data.items()] + data.sort() + repl = "".join(data) + + import inspect + srcfile = inspect.getsourcefile(sys.modules[__name__]) + f = open(srcfile, 'rb'); src = f.read(); f.close() + + match = re.search("\nmd5_data = {\n([^}]+)}", src) + if not match: + print >>sys.stderr, "Internal error!" + sys.exit(2) + + src = src[:match.start(1)] + repl + src[match.end(1):] + f = open(srcfile,'w') + f.write(src) + f.close() + + +if __name__=='__main__': + if len(sys.argv)>2 and sys.argv[1]=='--md5update': + update_md5(sys.argv[2:]) + else: + main(sys.argv[1:]) diff --git a/pythonlib/google/__init__.py b/pythonlib/google/__init__.py new file mode 100644 index 0000000..de40ea7 --- /dev/null +++ b/pythonlib/google/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/pythonlib/google/protobuf/__init__.py b/pythonlib/google/protobuf/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pythonlib/google/protobuf/compiler/__init__.py b/pythonlib/google/protobuf/compiler/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pythonlib/google/protobuf/compiler/plugin_pb2.py b/pythonlib/google/protobuf/compiler/plugin_pb2.py new file mode 100644 index 0000000..20ab06d --- /dev/null +++ b/pythonlib/google/protobuf/compiler/plugin_pb2.py @@ -0,0 +1,184 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/compiler/plugin.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import google.protobuf.descriptor_pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/compiler/plugin.proto', + package='google.protobuf.compiler', + serialized_pb=_b('\n%google/protobuf/compiler/plugin.proto\x12\x18google.protobuf.compiler\x1a google/protobuf/descriptor.proto\"}\n\x14\x43odeGeneratorRequest\x12\x18\n\x10\x66ile_to_generate\x18\x01 \x03(\t\x12\x11\n\tparameter\x18\x02 \x01(\t\x12\x38\n\nproto_file\x18\x0f \x03(\x0b\x32$.google.protobuf.FileDescriptorProto\"\xaa\x01\n\x15\x43odeGeneratorResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\x12\x42\n\x04\x66ile\x18\x0f \x03(\x0b\x32\x34.google.protobuf.compiler.CodeGeneratorResponse.File\x1a>\n\x04\x46ile\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x17\n\x0finsertion_point\x18\x02 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x0f \x01(\tB,\n\x1c\x63om.google.protobuf.compilerB\x0cPluginProtos') + , + dependencies=[google.protobuf.descriptor_pb2.DESCRIPTOR,]) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + + + +_CODEGENERATORREQUEST = _descriptor.Descriptor( + name='CodeGeneratorRequest', + full_name='google.protobuf.compiler.CodeGeneratorRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='file_to_generate', full_name='google.protobuf.compiler.CodeGeneratorRequest.file_to_generate', index=0, + number=1, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='parameter', full_name='google.protobuf.compiler.CodeGeneratorRequest.parameter', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='proto_file', full_name='google.protobuf.compiler.CodeGeneratorRequest.proto_file', index=2, + number=15, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=101, + serialized_end=226, +) + + +_CODEGENERATORRESPONSE_FILE = _descriptor.Descriptor( + name='File', + full_name='google.protobuf.compiler.CodeGeneratorResponse.File', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.compiler.CodeGeneratorResponse.File.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='insertion_point', full_name='google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='content', full_name='google.protobuf.compiler.CodeGeneratorResponse.File.content', index=2, + number=15, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=337, + serialized_end=399, +) + +_CODEGENERATORRESPONSE = _descriptor.Descriptor( + name='CodeGeneratorResponse', + full_name='google.protobuf.compiler.CodeGeneratorResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='error', full_name='google.protobuf.compiler.CodeGeneratorResponse.error', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='file', full_name='google.protobuf.compiler.CodeGeneratorResponse.file', index=1, + number=15, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_CODEGENERATORRESPONSE_FILE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=229, + serialized_end=399, +) + +_CODEGENERATORREQUEST.fields_by_name['proto_file'].message_type = google.protobuf.descriptor_pb2._FILEDESCRIPTORPROTO +_CODEGENERATORRESPONSE_FILE.containing_type = _CODEGENERATORRESPONSE +_CODEGENERATORRESPONSE.fields_by_name['file'].message_type = _CODEGENERATORRESPONSE_FILE +DESCRIPTOR.message_types_by_name['CodeGeneratorRequest'] = _CODEGENERATORREQUEST +DESCRIPTOR.message_types_by_name['CodeGeneratorResponse'] = _CODEGENERATORRESPONSE + +CodeGeneratorRequest = _reflection.GeneratedProtocolMessageType('CodeGeneratorRequest', (_message.Message,), dict( + DESCRIPTOR = _CODEGENERATORREQUEST, + __module__ = 'google.protobuf.compiler.plugin_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorRequest) + )) +_sym_db.RegisterMessage(CodeGeneratorRequest) + +CodeGeneratorResponse = _reflection.GeneratedProtocolMessageType('CodeGeneratorResponse', (_message.Message,), dict( + + File = _reflection.GeneratedProtocolMessageType('File', (_message.Message,), dict( + DESCRIPTOR = _CODEGENERATORRESPONSE_FILE, + __module__ = 'google.protobuf.compiler.plugin_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse.File) + )) + , + DESCRIPTOR = _CODEGENERATORRESPONSE, + __module__ = 'google.protobuf.compiler.plugin_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse) + )) +_sym_db.RegisterMessage(CodeGeneratorResponse) +_sym_db.RegisterMessage(CodeGeneratorResponse.File) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\034com.google.protobuf.compilerB\014PluginProtos')) +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/descriptor.py b/pythonlib/google/protobuf/descriptor.py new file mode 100644 index 0000000..555498d --- /dev/null +++ b/pythonlib/google/protobuf/descriptor.py @@ -0,0 +1,849 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +# Needs to stay compatible with Python 2.5 due to GAE. +# +# Copyright 2007 Google Inc. All Rights Reserved. + +"""Descriptors essentially contain exactly the information found in a .proto +file, in types that make this information accessible in Python. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +from google.protobuf.internal import api_implementation + + +if api_implementation.Type() == 'cpp': + # Used by MakeDescriptor in cpp mode + import os + import uuid + + if api_implementation.Version() == 2: + from google.protobuf.pyext import _message + else: + from google.protobuf.internal import cpp_message + + +class Error(Exception): + """Base error for this module.""" + + +class TypeTransformationError(Error): + """Error transforming between python proto type and corresponding C++ type.""" + + +class DescriptorBase(object): + + """Descriptors base class. + + This class is the base of all descriptor classes. It provides common options + related functionaility. + + Attributes: + has_options: True if the descriptor has non-default options. Usually it + is not necessary to read this -- just call GetOptions() which will + happily return the default instance. However, it's sometimes useful + for efficiency, and also useful inside the protobuf implementation to + avoid some bootstrapping issues. + """ + + def __init__(self, options, options_class_name): + """Initialize the descriptor given its options message and the name of the + class of the options message. The name of the class is required in case + the options message is None and has to be created. + """ + self._options = options + self._options_class_name = options_class_name + + # Does this descriptor have non-default options? + self.has_options = options is not None + + def _SetOptions(self, options, options_class_name): + """Sets the descriptor's options + + This function is used in generated proto2 files to update descriptor + options. It must not be used outside proto2. + """ + self._options = options + self._options_class_name = options_class_name + + # Does this descriptor have non-default options? + self.has_options = options is not None + + def GetOptions(self): + """Retrieves descriptor options. + + This method returns the options set or creates the default options for the + descriptor. + """ + if self._options: + return self._options + from google.protobuf import descriptor_pb2 + try: + options_class = getattr(descriptor_pb2, self._options_class_name) + except AttributeError: + raise RuntimeError('Unknown options class name %s!' % + (self._options_class_name)) + self._options = options_class() + return self._options + + +class _NestedDescriptorBase(DescriptorBase): + """Common class for descriptors that can be nested.""" + + def __init__(self, options, options_class_name, name, full_name, + file, containing_type, serialized_start=None, + serialized_end=None): + """Constructor. + + Args: + options: Protocol message options or None + to use default message options. + options_class_name: (str) The class name of the above options. + + name: (str) Name of this protocol message type. + full_name: (str) Fully-qualified name of this protocol message type, + which will include protocol "package" name and the name of any + enclosing types. + file: (FileDescriptor) Reference to file info. + containing_type: if provided, this is a nested descriptor, with this + descriptor as parent, otherwise None. + serialized_start: The start index (inclusive) in block in the + file.serialized_pb that describes this descriptor. + serialized_end: The end index (exclusive) in block in the + file.serialized_pb that describes this descriptor. + """ + super(_NestedDescriptorBase, self).__init__( + options, options_class_name) + + self.name = name + # TODO(falk): Add function to calculate full_name instead of having it in + # memory? + self.full_name = full_name + self.file = file + self.containing_type = containing_type + + self._serialized_start = serialized_start + self._serialized_end = serialized_end + + def GetTopLevelContainingType(self): + """Returns the root if this is a nested type, or itself if its the root.""" + desc = self + while desc.containing_type is not None: + desc = desc.containing_type + return desc + + def CopyToProto(self, proto): + """Copies this to the matching proto in descriptor_pb2. + + Args: + proto: An empty proto instance from descriptor_pb2. + + Raises: + Error: If self couldnt be serialized, due to to few constructor arguments. + """ + if (self.file is not None and + self._serialized_start is not None and + self._serialized_end is not None): + proto.ParseFromString(self.file.serialized_pb[ + self._serialized_start:self._serialized_end]) + else: + raise Error('Descriptor does not contain serialization.') + + +class Descriptor(_NestedDescriptorBase): + + """Descriptor for a protocol message type. + + A Descriptor instance has the following attributes: + + name: (str) Name of this protocol message type. + full_name: (str) Fully-qualified name of this protocol message type, + which will include protocol "package" name and the name of any + enclosing types. + + containing_type: (Descriptor) Reference to the descriptor of the + type containing us, or None if this is top-level. + + fields: (list of FieldDescriptors) Field descriptors for all + fields in this type. + fields_by_number: (dict int -> FieldDescriptor) Same FieldDescriptor + objects as in |fields|, but indexed by "number" attribute in each + FieldDescriptor. + fields_by_name: (dict str -> FieldDescriptor) Same FieldDescriptor + objects as in |fields|, but indexed by "name" attribute in each + FieldDescriptor. + + nested_types: (list of Descriptors) Descriptor references + for all protocol message types nested within this one. + nested_types_by_name: (dict str -> Descriptor) Same Descriptor + objects as in |nested_types|, but indexed by "name" attribute + in each Descriptor. + + enum_types: (list of EnumDescriptors) EnumDescriptor references + for all enums contained within this type. + enum_types_by_name: (dict str ->EnumDescriptor) Same EnumDescriptor + objects as in |enum_types|, but indexed by "name" attribute + in each EnumDescriptor. + enum_values_by_name: (dict str -> EnumValueDescriptor) Dict mapping + from enum value name to EnumValueDescriptor for that value. + + extensions: (list of FieldDescriptor) All extensions defined directly + within this message type (NOT within a nested type). + extensions_by_name: (dict, string -> FieldDescriptor) Same FieldDescriptor + objects as |extensions|, but indexed by "name" attribute of each + FieldDescriptor. + + is_extendable: Does this type define any extension ranges? + + options: (descriptor_pb2.MessageOptions) Protocol message options or None + to use default message options. + + oneofs: (list of OneofDescriptor) The list of descriptors for oneof fields + in this message. + oneofs_by_name: (dict str -> OneofDescriptor) Same objects as in |oneofs|, + but indexed by "name" attribute. + + file: (FileDescriptor) Reference to file descriptor. + """ + + # NOTE(tmarek): The file argument redefining a builtin is nothing we can + # fix right now since we don't know how many clients already rely on the + # name of the argument. + def __init__(self, name, full_name, filename, containing_type, fields, + nested_types, enum_types, extensions, options=None, + is_extendable=True, extension_ranges=None, oneofs=None, + file=None, serialized_start=None, serialized_end=None): # pylint:disable=redefined-builtin + """Arguments to __init__() are as described in the description + of Descriptor fields above. + + Note that filename is an obsolete argument, that is not used anymore. + Please use file.name to access this as an attribute. + """ + super(Descriptor, self).__init__( + options, 'MessageOptions', name, full_name, file, + containing_type, serialized_start=serialized_start, + serialized_end=serialized_end) + + # We have fields in addition to fields_by_name and fields_by_number, + # so that: + # 1. Clients can index fields by "order in which they're listed." + # 2. Clients can easily iterate over all fields with the terse + # syntax: for f in descriptor.fields: ... + self.fields = fields + for field in self.fields: + field.containing_type = self + self.fields_by_number = dict((f.number, f) for f in fields) + self.fields_by_name = dict((f.name, f) for f in fields) + + self.nested_types = nested_types + for nested_type in nested_types: + nested_type.containing_type = self + self.nested_types_by_name = dict((t.name, t) for t in nested_types) + + self.enum_types = enum_types + for enum_type in self.enum_types: + enum_type.containing_type = self + self.enum_types_by_name = dict((t.name, t) for t in enum_types) + self.enum_values_by_name = dict( + (v.name, v) for t in enum_types for v in t.values) + + self.extensions = extensions + for extension in self.extensions: + extension.extension_scope = self + self.extensions_by_name = dict((f.name, f) for f in extensions) + self.is_extendable = is_extendable + self.extension_ranges = extension_ranges + self.oneofs = oneofs if oneofs is not None else [] + self.oneofs_by_name = dict((o.name, o) for o in self.oneofs) + for oneof in self.oneofs: + oneof.containing_type = self + + def EnumValueName(self, enum, value): + """Returns the string name of an enum value. + + This is just a small helper method to simplify a common operation. + + Args: + enum: string name of the Enum. + value: int, value of the enum. + + Returns: + string name of the enum value. + + Raises: + KeyError if either the Enum doesn't exist or the value is not a valid + value for the enum. + """ + return self.enum_types_by_name[enum].values_by_number[value].name + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.DescriptorProto. + + Args: + proto: An empty descriptor_pb2.DescriptorProto. + """ + # This function is overriden to give a better doc comment. + super(Descriptor, self).CopyToProto(proto) + + +# TODO(robinson): We should have aggressive checking here, +# for example: +# * If you specify a repeated field, you should not be allowed +# to specify a default value. +# * [Other examples here as needed]. +# +# TODO(robinson): for this and other *Descriptor classes, we +# might also want to lock things down aggressively (e.g., +# prevent clients from setting the attributes). Having +# stronger invariants here in general will reduce the number +# of runtime checks we must do in reflection.py... +class FieldDescriptor(DescriptorBase): + + """Descriptor for a single field in a .proto file. + + A FieldDescriptor instance has the following attributes: + + name: (str) Name of this field, exactly as it appears in .proto. + full_name: (str) Name of this field, including containing scope. This is + particularly relevant for extensions. + index: (int) Dense, 0-indexed index giving the order that this + field textually appears within its message in the .proto file. + number: (int) Tag number declared for this field in the .proto file. + + type: (One of the TYPE_* constants below) Declared type. + cpp_type: (One of the CPPTYPE_* constants below) C++ type used to + represent this field. + + label: (One of the LABEL_* constants below) Tells whether this + field is optional, required, or repeated. + has_default_value: (bool) True if this field has a default value defined, + otherwise false. + default_value: (Varies) Default value of this field. Only + meaningful for non-repeated scalar fields. Repeated fields + should always set this to [], and non-repeated composite + fields should always set this to None. + + containing_type: (Descriptor) Descriptor of the protocol message + type that contains this field. Set by the Descriptor constructor + if we're passed into one. + Somewhat confusingly, for extension fields, this is the + descriptor of the EXTENDED message, not the descriptor + of the message containing this field. (See is_extension and + extension_scope below). + message_type: (Descriptor) If a composite field, a descriptor + of the message type contained in this field. Otherwise, this is None. + enum_type: (EnumDescriptor) If this field contains an enum, a + descriptor of that enum. Otherwise, this is None. + + is_extension: True iff this describes an extension field. + extension_scope: (Descriptor) Only meaningful if is_extension is True. + Gives the message that immediately contains this extension field. + Will be None iff we're a top-level (file-level) extension field. + + options: (descriptor_pb2.FieldOptions) Protocol message field options or + None to use default field options. + + containing_oneof: (OneofDescriptor) If the field is a member of a oneof + union, contains its descriptor. Otherwise, None. + """ + + # Must be consistent with C++ FieldDescriptor::Type enum in + # descriptor.h. + # + # TODO(robinson): Find a way to eliminate this repetition. + TYPE_DOUBLE = 1 + TYPE_FLOAT = 2 + TYPE_INT64 = 3 + TYPE_UINT64 = 4 + TYPE_INT32 = 5 + TYPE_FIXED64 = 6 + TYPE_FIXED32 = 7 + TYPE_BOOL = 8 + TYPE_STRING = 9 + TYPE_GROUP = 10 + TYPE_MESSAGE = 11 + TYPE_BYTES = 12 + TYPE_UINT32 = 13 + TYPE_ENUM = 14 + TYPE_SFIXED32 = 15 + TYPE_SFIXED64 = 16 + TYPE_SINT32 = 17 + TYPE_SINT64 = 18 + MAX_TYPE = 18 + + # Must be consistent with C++ FieldDescriptor::CppType enum in + # descriptor.h. + # + # TODO(robinson): Find a way to eliminate this repetition. + CPPTYPE_INT32 = 1 + CPPTYPE_INT64 = 2 + CPPTYPE_UINT32 = 3 + CPPTYPE_UINT64 = 4 + CPPTYPE_DOUBLE = 5 + CPPTYPE_FLOAT = 6 + CPPTYPE_BOOL = 7 + CPPTYPE_ENUM = 8 + CPPTYPE_STRING = 9 + CPPTYPE_MESSAGE = 10 + MAX_CPPTYPE = 10 + + _PYTHON_TO_CPP_PROTO_TYPE_MAP = { + TYPE_DOUBLE: CPPTYPE_DOUBLE, + TYPE_FLOAT: CPPTYPE_FLOAT, + TYPE_ENUM: CPPTYPE_ENUM, + TYPE_INT64: CPPTYPE_INT64, + TYPE_SINT64: CPPTYPE_INT64, + TYPE_SFIXED64: CPPTYPE_INT64, + TYPE_UINT64: CPPTYPE_UINT64, + TYPE_FIXED64: CPPTYPE_UINT64, + TYPE_INT32: CPPTYPE_INT32, + TYPE_SFIXED32: CPPTYPE_INT32, + TYPE_SINT32: CPPTYPE_INT32, + TYPE_UINT32: CPPTYPE_UINT32, + TYPE_FIXED32: CPPTYPE_UINT32, + TYPE_BYTES: CPPTYPE_STRING, + TYPE_STRING: CPPTYPE_STRING, + TYPE_BOOL: CPPTYPE_BOOL, + TYPE_MESSAGE: CPPTYPE_MESSAGE, + TYPE_GROUP: CPPTYPE_MESSAGE + } + + # Must be consistent with C++ FieldDescriptor::Label enum in + # descriptor.h. + # + # TODO(robinson): Find a way to eliminate this repetition. + LABEL_OPTIONAL = 1 + LABEL_REQUIRED = 2 + LABEL_REPEATED = 3 + MAX_LABEL = 3 + + # Must be consistent with C++ constants kMaxNumber, kFirstReservedNumber, + # and kLastReservedNumber in descriptor.h + MAX_FIELD_NUMBER = (1 << 29) - 1 + FIRST_RESERVED_FIELD_NUMBER = 19000 + LAST_RESERVED_FIELD_NUMBER = 19999 + + def __init__(self, name, full_name, index, number, type, cpp_type, label, + default_value, message_type, enum_type, containing_type, + is_extension, extension_scope, options=None, + has_default_value=True, containing_oneof=None): + """The arguments are as described in the description of FieldDescriptor + attributes above. + + Note that containing_type may be None, and may be set later if necessary + (to deal with circular references between message types, for example). + Likewise for extension_scope. + """ + super(FieldDescriptor, self).__init__(options, 'FieldOptions') + self.name = name + self.full_name = full_name + self.index = index + self.number = number + self.type = type + self.cpp_type = cpp_type + self.label = label + self.has_default_value = has_default_value + self.default_value = default_value + self.containing_type = containing_type + self.message_type = message_type + self.enum_type = enum_type + self.is_extension = is_extension + self.extension_scope = extension_scope + self.containing_oneof = containing_oneof + if api_implementation.Type() == 'cpp': + if is_extension: + if api_implementation.Version() == 2: + # pylint: disable=protected-access + self._cdescriptor = ( + _message.Message._GetExtensionDescriptor(full_name)) + # pylint: enable=protected-access + else: + self._cdescriptor = cpp_message.GetExtensionDescriptor(full_name) + else: + if api_implementation.Version() == 2: + # pylint: disable=protected-access + self._cdescriptor = _message.Message._GetFieldDescriptor(full_name) + # pylint: enable=protected-access + else: + self._cdescriptor = cpp_message.GetFieldDescriptor(full_name) + else: + self._cdescriptor = None + + @staticmethod + def ProtoTypeToCppProtoType(proto_type): + """Converts from a Python proto type to a C++ Proto Type. + + The Python ProtocolBuffer classes specify both the 'Python' datatype and the + 'C++' datatype - and they're not the same. This helper method should + translate from one to another. + + Args: + proto_type: the Python proto type (descriptor.FieldDescriptor.TYPE_*) + Returns: + descriptor.FieldDescriptor.CPPTYPE_*, the C++ type. + Raises: + TypeTransformationError: when the Python proto type isn't known. + """ + try: + return FieldDescriptor._PYTHON_TO_CPP_PROTO_TYPE_MAP[proto_type] + except KeyError: + raise TypeTransformationError('Unknown proto_type: %s' % proto_type) + + +class EnumDescriptor(_NestedDescriptorBase): + + """Descriptor for an enum defined in a .proto file. + + An EnumDescriptor instance has the following attributes: + + name: (str) Name of the enum type. + full_name: (str) Full name of the type, including package name + and any enclosing type(s). + + values: (list of EnumValueDescriptors) List of the values + in this enum. + values_by_name: (dict str -> EnumValueDescriptor) Same as |values|, + but indexed by the "name" field of each EnumValueDescriptor. + values_by_number: (dict int -> EnumValueDescriptor) Same as |values|, + but indexed by the "number" field of each EnumValueDescriptor. + containing_type: (Descriptor) Descriptor of the immediate containing + type of this enum, or None if this is an enum defined at the + top level in a .proto file. Set by Descriptor's constructor + if we're passed into one. + file: (FileDescriptor) Reference to file descriptor. + options: (descriptor_pb2.EnumOptions) Enum options message or + None to use default enum options. + """ + + def __init__(self, name, full_name, filename, values, + containing_type=None, options=None, file=None, + serialized_start=None, serialized_end=None): + """Arguments are as described in the attribute description above. + + Note that filename is an obsolete argument, that is not used anymore. + Please use file.name to access this as an attribute. + """ + super(EnumDescriptor, self).__init__( + options, 'EnumOptions', name, full_name, file, + containing_type, serialized_start=serialized_start, + serialized_end=serialized_end) + + self.values = values + for value in self.values: + value.type = self + self.values_by_name = dict((v.name, v) for v in values) + self.values_by_number = dict((v.number, v) for v in values) + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.EnumDescriptorProto. + + Args: + proto: An empty descriptor_pb2.EnumDescriptorProto. + """ + # This function is overriden to give a better doc comment. + super(EnumDescriptor, self).CopyToProto(proto) + + +class EnumValueDescriptor(DescriptorBase): + + """Descriptor for a single value within an enum. + + name: (str) Name of this value. + index: (int) Dense, 0-indexed index giving the order that this + value appears textually within its enum in the .proto file. + number: (int) Actual number assigned to this enum value. + type: (EnumDescriptor) EnumDescriptor to which this value + belongs. Set by EnumDescriptor's constructor if we're + passed into one. + options: (descriptor_pb2.EnumValueOptions) Enum value options message or + None to use default enum value options options. + """ + + def __init__(self, name, index, number, type=None, options=None): + """Arguments are as described in the attribute description above.""" + super(EnumValueDescriptor, self).__init__(options, 'EnumValueOptions') + self.name = name + self.index = index + self.number = number + self.type = type + + +class OneofDescriptor(object): + """Descriptor for a oneof field. + + name: (str) Name of the oneof field. + full_name: (str) Full name of the oneof field, including package name. + index: (int) 0-based index giving the order of the oneof field inside + its containing type. + containing_type: (Descriptor) Descriptor of the protocol message + type that contains this field. Set by the Descriptor constructor + if we're passed into one. + fields: (list of FieldDescriptor) The list of field descriptors this + oneof can contain. + """ + + def __init__(self, name, full_name, index, containing_type, fields): + """Arguments are as described in the attribute description above.""" + self.name = name + self.full_name = full_name + self.index = index + self.containing_type = containing_type + self.fields = fields + + +class ServiceDescriptor(_NestedDescriptorBase): + + """Descriptor for a service. + + name: (str) Name of the service. + full_name: (str) Full name of the service, including package name. + index: (int) 0-indexed index giving the order that this services + definition appears withing the .proto file. + methods: (list of MethodDescriptor) List of methods provided by this + service. + options: (descriptor_pb2.ServiceOptions) Service options message or + None to use default service options. + file: (FileDescriptor) Reference to file info. + """ + + def __init__(self, name, full_name, index, methods, options=None, file=None, + serialized_start=None, serialized_end=None): + super(ServiceDescriptor, self).__init__( + options, 'ServiceOptions', name, full_name, file, + None, serialized_start=serialized_start, + serialized_end=serialized_end) + self.index = index + self.methods = methods + # Set the containing service for each method in this service. + for method in self.methods: + method.containing_service = self + + def FindMethodByName(self, name): + """Searches for the specified method, and returns its descriptor.""" + for method in self.methods: + if name == method.name: + return method + return None + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.ServiceDescriptorProto. + + Args: + proto: An empty descriptor_pb2.ServiceDescriptorProto. + """ + # This function is overriden to give a better doc comment. + super(ServiceDescriptor, self).CopyToProto(proto) + + +class MethodDescriptor(DescriptorBase): + + """Descriptor for a method in a service. + + name: (str) Name of the method within the service. + full_name: (str) Full name of method. + index: (int) 0-indexed index of the method inside the service. + containing_service: (ServiceDescriptor) The service that contains this + method. + input_type: The descriptor of the message that this method accepts. + output_type: The descriptor of the message that this method returns. + options: (descriptor_pb2.MethodOptions) Method options message or + None to use default method options. + """ + + def __init__(self, name, full_name, index, containing_service, + input_type, output_type, options=None): + """The arguments are as described in the description of MethodDescriptor + attributes above. + + Note that containing_service may be None, and may be set later if necessary. + """ + super(MethodDescriptor, self).__init__(options, 'MethodOptions') + self.name = name + self.full_name = full_name + self.index = index + self.containing_service = containing_service + self.input_type = input_type + self.output_type = output_type + + +class FileDescriptor(DescriptorBase): + """Descriptor for a file. Mimics the descriptor_pb2.FileDescriptorProto. + + Note that enum_types_by_name, extensions_by_name, and dependencies + fields are only set by the message_factory module, and not by the + generated proto code. + + name: name of file, relative to root of source tree. + package: name of the package + serialized_pb: (str) Byte string of serialized + descriptor_pb2.FileDescriptorProto. + dependencies: List of other FileDescriptors this FileDescriptor depends on. + message_types_by_name: Dict of message names of their descriptors. + enum_types_by_name: Dict of enum names and their descriptors. + extensions_by_name: Dict of extension names and their descriptors. + """ + + def __init__(self, name, package, options=None, serialized_pb=None, + dependencies=None): + """Constructor.""" + super(FileDescriptor, self).__init__(options, 'FileOptions') + + self.message_types_by_name = {} + self.name = name + self.package = package + self.serialized_pb = serialized_pb + + self.enum_types_by_name = {} + self.extensions_by_name = {} + self.dependencies = (dependencies or []) + + if (api_implementation.Type() == 'cpp' and + self.serialized_pb is not None): + if api_implementation.Version() == 2: + # pylint: disable=protected-access + _message.Message._BuildFile(self.serialized_pb) + # pylint: enable=protected-access + else: + cpp_message.BuildFile(self.serialized_pb) + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.FileDescriptorProto. + + Args: + proto: An empty descriptor_pb2.FileDescriptorProto. + """ + proto.ParseFromString(self.serialized_pb) + + +def _ParseOptions(message, string): + """Parses serialized options. + + This helper function is used to parse serialized options in generated + proto2 files. It must not be used outside proto2. + """ + message.ParseFromString(string) + return message + + +def MakeDescriptor(desc_proto, package='', build_file_if_cpp=True): + """Make a protobuf Descriptor given a DescriptorProto protobuf. + + Handles nested descriptors. Note that this is limited to the scope of defining + a message inside of another message. Composite fields can currently only be + resolved if the message is defined in the same scope as the field. + + Args: + desc_proto: The descriptor_pb2.DescriptorProto protobuf message. + package: Optional package name for the new message Descriptor (string). + build_file_if_cpp: Update the C++ descriptor pool if api matches. + Set to False on recursion, so no duplicates are created. + Returns: + A Descriptor for protobuf messages. + """ + if api_implementation.Type() == 'cpp' and build_file_if_cpp: + # The C++ implementation requires all descriptors to be backed by the same + # definition in the C++ descriptor pool. To do this, we build a + # FileDescriptorProto with the same definition as this descriptor and build + # it into the pool. + from google.protobuf import descriptor_pb2 + file_descriptor_proto = descriptor_pb2.FileDescriptorProto() + file_descriptor_proto.message_type.add().MergeFrom(desc_proto) + + # Generate a random name for this proto file to prevent conflicts with + # any imported ones. We need to specify a file name so BuildFile accepts + # our FileDescriptorProto, but it is not important what that file name + # is actually set to. + proto_name = str(uuid.uuid4()) + + if package: + file_descriptor_proto.name = os.path.join(package.replace('.', '/'), + proto_name + '.proto') + file_descriptor_proto.package = package + else: + file_descriptor_proto.name = proto_name + '.proto' + + if api_implementation.Version() == 2: + # pylint: disable=protected-access + _message.Message._BuildFile(file_descriptor_proto.SerializeToString()) + # pylint: enable=protected-access + else: + cpp_message.BuildFile(file_descriptor_proto.SerializeToString()) + + full_message_name = [desc_proto.name] + if package: full_message_name.insert(0, package) + + # Create Descriptors for enum types + enum_types = {} + for enum_proto in desc_proto.enum_type: + full_name = '.'.join(full_message_name + [enum_proto.name]) + enum_desc = EnumDescriptor( + enum_proto.name, full_name, None, [ + EnumValueDescriptor(enum_val.name, ii, enum_val.number) + for ii, enum_val in enumerate(enum_proto.value)]) + enum_types[full_name] = enum_desc + + # Create Descriptors for nested types + nested_types = {} + for nested_proto in desc_proto.nested_type: + full_name = '.'.join(full_message_name + [nested_proto.name]) + # Nested types are just those defined inside of the message, not all types + # used by fields in the message, so no loops are possible here. + nested_desc = MakeDescriptor(nested_proto, + package='.'.join(full_message_name), + build_file_if_cpp=False) + nested_types[full_name] = nested_desc + + fields = [] + for field_proto in desc_proto.field: + full_name = '.'.join(full_message_name + [field_proto.name]) + enum_desc = None + nested_desc = None + if field_proto.HasField('type_name'): + type_name = field_proto.type_name + full_type_name = '.'.join(full_message_name + + [type_name[type_name.rfind('.')+1:]]) + if full_type_name in nested_types: + nested_desc = nested_types[full_type_name] + elif full_type_name in enum_types: + enum_desc = enum_types[full_type_name] + # Else type_name references a non-local type, which isn't implemented + field = FieldDescriptor( + field_proto.name, full_name, field_proto.number - 1, + field_proto.number, field_proto.type, + FieldDescriptor.ProtoTypeToCppProtoType(field_proto.type), + field_proto.label, None, nested_desc, enum_desc, None, False, None, + has_default_value=False) + fields.append(field) + + desc_name = '.'.join(full_message_name) + return Descriptor(desc_proto.name, desc_name, None, None, fields, + nested_types.values(), enum_types.values(), []) diff --git a/pythonlib/google/protobuf/descriptor_database.py b/pythonlib/google/protobuf/descriptor_database.py new file mode 100644 index 0000000..9f5a117 --- /dev/null +++ b/pythonlib/google/protobuf/descriptor_database.py @@ -0,0 +1,137 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Provides a container for DescriptorProtos.""" + +__author__ = 'matthewtoia@google.com (Matt Toia)' + + +class Error(Exception): + pass + + +class DescriptorDatabaseConflictingDefinitionError(Error): + """Raised when a proto is added with the same name & different descriptor.""" + + +class DescriptorDatabase(object): + """A container accepting FileDescriptorProtos and maps DescriptorProtos.""" + + def __init__(self): + self._file_desc_protos_by_file = {} + self._file_desc_protos_by_symbol = {} + + def Add(self, file_desc_proto): + """Adds the FileDescriptorProto and its types to this database. + + Args: + file_desc_proto: The FileDescriptorProto to add. + Raises: + DescriptorDatabaseException: if an attempt is made to add a proto + with the same name but different definition than an exisiting + proto in the database. + """ + proto_name = file_desc_proto.name + if proto_name not in self._file_desc_protos_by_file: + self._file_desc_protos_by_file[proto_name] = file_desc_proto + elif self._file_desc_protos_by_file[proto_name] != file_desc_proto: + raise DescriptorDatabaseConflictingDefinitionError( + '%s already added, but with different descriptor.' % proto_name) + + package = file_desc_proto.package + for message in file_desc_proto.message_type: + self._file_desc_protos_by_symbol.update( + (name, file_desc_proto) for name in _ExtractSymbols(message, package)) + for enum in file_desc_proto.enum_type: + self._file_desc_protos_by_symbol[ + '.'.join((package, enum.name))] = file_desc_proto + + def FindFileByName(self, name): + """Finds the file descriptor proto by file name. + + Typically the file name is a relative path ending to a .proto file. The + proto with the given name will have to have been added to this database + using the Add method or else an error will be raised. + + Args: + name: The file name to find. + + Returns: + The file descriptor proto matching the name. + + Raises: + KeyError if no file by the given name was added. + """ + + return self._file_desc_protos_by_file[name] + + def FindFileContainingSymbol(self, symbol): + """Finds the file descriptor proto containing the specified symbol. + + The symbol should be a fully qualified name including the file descriptor's + package and any containing messages. Some examples: + + 'some.package.name.Message' + 'some.package.name.Message.NestedEnum' + + The file descriptor proto containing the specified symbol must be added to + this database using the Add method or else an error will be raised. + + Args: + symbol: The fully qualified symbol name. + + Returns: + The file descriptor proto containing the symbol. + + Raises: + KeyError if no file contains the specified symbol. + """ + + return self._file_desc_protos_by_symbol[symbol] + + +def _ExtractSymbols(desc_proto, package): + """Pulls out all the symbols from a descriptor proto. + + Args: + desc_proto: The proto to extract symbols from. + package: The package containing the descriptor type. + + Yields: + The fully qualified name found in the descriptor. + """ + + message_name = '.'.join((package, desc_proto.name)) + yield message_name + for nested_type in desc_proto.nested_type: + for symbol in _ExtractSymbols(nested_type, message_name): + yield symbol + for enum_type in desc_proto.enum_type: + yield '.'.join((message_name, enum_type.name)) diff --git a/pythonlib/google/protobuf/descriptor_pb2.py b/pythonlib/google/protobuf/descriptor_pb2.py new file mode 100644 index 0000000..808fd17 --- /dev/null +++ b/pythonlib/google/protobuf/descriptor_pb2.py @@ -0,0 +1,1522 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/descriptor.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/descriptor.proto', + package='google.protobuf', + serialized_pb=_b('\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"G\n\x11\x46ileDescriptorSet\x12\x32\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProto\"\xcb\x03\n\x13\x46ileDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07package\x18\x02 \x01(\t\x12\x12\n\ndependency\x18\x03 \x03(\t\x12\x19\n\x11public_dependency\x18\n \x03(\x05\x12\x17\n\x0fweak_dependency\x18\x0b \x03(\x05\x12\x36\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProto\x12\x37\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProto\x12\x38\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProto\x12\x38\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProto\x12-\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptions\x12\x39\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfo\"\xe4\x03\n\x0f\x44\x65scriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x34\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProto\x12\x38\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProto\x12\x35\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProto\x12\x37\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProto\x12H\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRange\x12\x39\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProto\x12\x30\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptions\x1a,\n\x0e\x45xtensionRange\x12\r\n\x05start\x18\x01 \x01(\x05\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x05\"\xa9\x05\n\x14\x46ieldDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x03 \x01(\x05\x12:\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.Label\x12\x38\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.Type\x12\x11\n\ttype_name\x18\x06 \x01(\t\x12\x10\n\x08\x65xtendee\x18\x02 \x01(\t\x12\x15\n\rdefault_value\x18\x07 \x01(\t\x12\x13\n\x0boneof_index\x18\t \x01(\x05\x12.\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptions\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\x12\x12\n\x0eLABEL_REPEATED\x10\x03\"$\n\x14OneofDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x8c\x01\n\x13\x45numDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x38\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProto\x12-\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptions\"l\n\x18\x45numValueDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x02 \x01(\x05\x12\x32\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptions\"\x90\x01\n\x16ServiceDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x36\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProto\x12\x30\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptions\"\x7f\n\x15MethodDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\ninput_type\x18\x02 \x01(\t\x12\x13\n\x0boutput_type\x18\x03 \x01(\t\x12/\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptions\"\xab\x04\n\x0b\x46ileOptions\x12\x14\n\x0cjava_package\x18\x01 \x01(\t\x12\x1c\n\x14java_outer_classname\x18\x08 \x01(\t\x12\"\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lse\x12,\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08:\x05\x66\x61lse\x12%\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lse\x12\x46\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEED\x12\x12\n\ngo_package\x18\x0b \x01(\t\x12\"\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lse\x12$\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lse\x12\"\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd3\x01\n\x0eMessageOptions\x12&\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lse\x12.\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xbe\x02\n\x0c\x46ieldOptions\x12:\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRING\x12\x0e\n\x06packed\x18\x02 \x01(\x08\x12\x13\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x1c\n\x14\x65xperimental_map_key\x18\t \x01(\t\x12\x13\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x8d\x01\n\x0b\x45numOptions\x12\x13\n\x0b\x61llow_alias\x18\x02 \x01(\x08\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"}\n\x10\x45numValueOptions\x12\x19\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"{\n\x0eServiceOptions\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"z\n\rMethodOptions\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9e\x02\n\x13UninterpretedOption\x12;\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePart\x12\x18\n\x10identifier_value\x18\x03 \x01(\t\x12\x1a\n\x12positive_int_value\x18\x04 \x01(\x04\x12\x1a\n\x12negative_int_value\x18\x05 \x01(\x03\x12\x14\n\x0c\x64ouble_value\x18\x06 \x01(\x01\x12\x14\n\x0cstring_value\x18\x07 \x01(\x0c\x12\x17\n\x0f\x61ggregate_value\x18\x08 \x01(\t\x1a\x33\n\x08NamePart\x12\x11\n\tname_part\x18\x01 \x02(\t\x12\x14\n\x0cis_extension\x18\x02 \x02(\x08\"\xb1\x01\n\x0eSourceCodeInfo\x12:\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.Location\x1a\x63\n\x08Location\x12\x10\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01\x12\x10\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01\x12\x18\n\x10leading_comments\x18\x03 \x01(\t\x12\x19\n\x11trailing_comments\x18\x04 \x01(\tB)\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + + +_FIELDDESCRIPTORPROTO_TYPE = _descriptor.EnumDescriptor( + name='Type', + full_name='google.protobuf.FieldDescriptorProto.Type', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='TYPE_DOUBLE', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_FLOAT', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_INT64', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_UINT64', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_INT32', index=4, number=5, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_FIXED64', index=5, number=6, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_FIXED32', index=6, number=7, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_BOOL', index=7, number=8, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_STRING', index=8, number=9, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_GROUP', index=9, number=10, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_MESSAGE', index=10, number=11, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_BYTES', index=11, number=12, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_UINT32', index=12, number=13, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_ENUM', index=13, number=14, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_SFIXED32', index=14, number=15, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_SFIXED64', index=15, number=16, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_SINT32', index=16, number=17, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TYPE_SINT64', index=17, number=18, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1378, + serialized_end=1688, +) +_sym_db.RegisterEnumDescriptor(_FIELDDESCRIPTORPROTO_TYPE) + +_FIELDDESCRIPTORPROTO_LABEL = _descriptor.EnumDescriptor( + name='Label', + full_name='google.protobuf.FieldDescriptorProto.Label', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LABEL_OPTIONAL', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LABEL_REQUIRED', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LABEL_REPEATED', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1690, + serialized_end=1757, +) +_sym_db.RegisterEnumDescriptor(_FIELDDESCRIPTORPROTO_LABEL) + +_FILEOPTIONS_OPTIMIZEMODE = _descriptor.EnumDescriptor( + name='OptimizeMode', + full_name='google.protobuf.FileOptions.OptimizeMode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SPEED', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CODE_SIZE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LITE_RUNTIME', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2813, + serialized_end=2871, +) +_sym_db.RegisterEnumDescriptor(_FILEOPTIONS_OPTIMIZEMODE) + +_FIELDOPTIONS_CTYPE = _descriptor.EnumDescriptor( + name='CType', + full_name='google.protobuf.FieldOptions.CType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='STRING', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CORD', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STRING_PIECE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3359, + serialized_end=3406, +) +_sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_CTYPE) + + +_FILEDESCRIPTORSET = _descriptor.Descriptor( + name='FileDescriptorSet', + full_name='google.protobuf.FileDescriptorSet', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='file', full_name='google.protobuf.FileDescriptorSet.file', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=53, + serialized_end=124, +) + + +_FILEDESCRIPTORPROTO = _descriptor.Descriptor( + name='FileDescriptorProto', + full_name='google.protobuf.FileDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.FileDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='package', full_name='google.protobuf.FileDescriptorProto.package', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dependency', full_name='google.protobuf.FileDescriptorProto.dependency', index=2, + number=3, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='public_dependency', full_name='google.protobuf.FileDescriptorProto.public_dependency', index=3, + number=10, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='weak_dependency', full_name='google.protobuf.FileDescriptorProto.weak_dependency', index=4, + number=11, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message_type', full_name='google.protobuf.FileDescriptorProto.message_type', index=5, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='enum_type', full_name='google.protobuf.FileDescriptorProto.enum_type', index=6, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='service', full_name='google.protobuf.FileDescriptorProto.service', index=7, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='extension', full_name='google.protobuf.FileDescriptorProto.extension', index=8, + number=7, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.FileDescriptorProto.options', index=9, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='source_code_info', full_name='google.protobuf.FileDescriptorProto.source_code_info', index=10, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=127, + serialized_end=586, +) + + +_DESCRIPTORPROTO_EXTENSIONRANGE = _descriptor.Descriptor( + name='ExtensionRange', + full_name='google.protobuf.DescriptorProto.ExtensionRange', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='start', full_name='google.protobuf.DescriptorProto.ExtensionRange.start', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='end', full_name='google.protobuf.DescriptorProto.ExtensionRange.end', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1029, + serialized_end=1073, +) + +_DESCRIPTORPROTO = _descriptor.Descriptor( + name='DescriptorProto', + full_name='google.protobuf.DescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.DescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='field', full_name='google.protobuf.DescriptorProto.field', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='extension', full_name='google.protobuf.DescriptorProto.extension', index=2, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_type', full_name='google.protobuf.DescriptorProto.nested_type', index=3, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='enum_type', full_name='google.protobuf.DescriptorProto.enum_type', index=4, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='extension_range', full_name='google.protobuf.DescriptorProto.extension_range', index=5, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='oneof_decl', full_name='google.protobuf.DescriptorProto.oneof_decl', index=6, + number=8, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.DescriptorProto.options', index=7, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_DESCRIPTORPROTO_EXTENSIONRANGE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=589, + serialized_end=1073, +) + + +_FIELDDESCRIPTORPROTO = _descriptor.Descriptor( + name='FieldDescriptorProto', + full_name='google.protobuf.FieldDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.FieldDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='number', full_name='google.protobuf.FieldDescriptorProto.number', index=1, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='label', full_name='google.protobuf.FieldDescriptorProto.label', index=2, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='google.protobuf.FieldDescriptorProto.type', index=3, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type_name', full_name='google.protobuf.FieldDescriptorProto.type_name', index=4, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='extendee', full_name='google.protobuf.FieldDescriptorProto.extendee', index=5, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_value', full_name='google.protobuf.FieldDescriptorProto.default_value', index=6, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='oneof_index', full_name='google.protobuf.FieldDescriptorProto.oneof_index', index=7, + number=9, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.FieldDescriptorProto.options', index=8, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _FIELDDESCRIPTORPROTO_TYPE, + _FIELDDESCRIPTORPROTO_LABEL, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1076, + serialized_end=1757, +) + + +_ONEOFDESCRIPTORPROTO = _descriptor.Descriptor( + name='OneofDescriptorProto', + full_name='google.protobuf.OneofDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.OneofDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1759, + serialized_end=1795, +) + + +_ENUMDESCRIPTORPROTO = _descriptor.Descriptor( + name='EnumDescriptorProto', + full_name='google.protobuf.EnumDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.EnumDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='google.protobuf.EnumDescriptorProto.value', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.EnumDescriptorProto.options', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1798, + serialized_end=1938, +) + + +_ENUMVALUEDESCRIPTORPROTO = _descriptor.Descriptor( + name='EnumValueDescriptorProto', + full_name='google.protobuf.EnumValueDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.EnumValueDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='number', full_name='google.protobuf.EnumValueDescriptorProto.number', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.EnumValueDescriptorProto.options', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1940, + serialized_end=2048, +) + + +_SERVICEDESCRIPTORPROTO = _descriptor.Descriptor( + name='ServiceDescriptorProto', + full_name='google.protobuf.ServiceDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.ServiceDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='method', full_name='google.protobuf.ServiceDescriptorProto.method', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.ServiceDescriptorProto.options', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=2051, + serialized_end=2195, +) + + +_METHODDESCRIPTORPROTO = _descriptor.Descriptor( + name='MethodDescriptorProto', + full_name='google.protobuf.MethodDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.MethodDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='input_type', full_name='google.protobuf.MethodDescriptorProto.input_type', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='output_type', full_name='google.protobuf.MethodDescriptorProto.output_type', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.MethodDescriptorProto.options', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=2197, + serialized_end=2324, +) + + +_FILEOPTIONS = _descriptor.Descriptor( + name='FileOptions', + full_name='google.protobuf.FileOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='java_package', full_name='google.protobuf.FileOptions.java_package', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='java_outer_classname', full_name='google.protobuf.FileOptions.java_outer_classname', index=1, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='java_multiple_files', full_name='google.protobuf.FileOptions.java_multiple_files', index=2, + number=10, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='java_generate_equals_and_hash', full_name='google.protobuf.FileOptions.java_generate_equals_and_hash', index=3, + number=20, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='java_string_check_utf8', full_name='google.protobuf.FileOptions.java_string_check_utf8', index=4, + number=27, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optimize_for', full_name='google.protobuf.FileOptions.optimize_for', index=5, + number=9, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='go_package', full_name='google.protobuf.FileOptions.go_package', index=6, + number=11, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='cc_generic_services', full_name='google.protobuf.FileOptions.cc_generic_services', index=7, + number=16, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='java_generic_services', full_name='google.protobuf.FileOptions.java_generic_services', index=8, + number=17, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='py_generic_services', full_name='google.protobuf.FileOptions.py_generic_services', index=9, + number=18, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.FileOptions.deprecated', index=10, + number=23, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.FileOptions.uninterpreted_option', index=11, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _FILEOPTIONS_OPTIMIZEMODE, + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=2327, + serialized_end=2882, +) + + +_MESSAGEOPTIONS = _descriptor.Descriptor( + name='MessageOptions', + full_name='google.protobuf.MessageOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message_set_wire_format', full_name='google.protobuf.MessageOptions.message_set_wire_format', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='no_standard_descriptor_accessor', full_name='google.protobuf.MessageOptions.no_standard_descriptor_accessor', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.MessageOptions.deprecated', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.MessageOptions.uninterpreted_option', index=3, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=2885, + serialized_end=3096, +) + + +_FIELDOPTIONS = _descriptor.Descriptor( + name='FieldOptions', + full_name='google.protobuf.FieldOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ctype', full_name='google.protobuf.FieldOptions.ctype', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='packed', full_name='google.protobuf.FieldOptions.packed', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='lazy', full_name='google.protobuf.FieldOptions.lazy', index=2, + number=5, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.FieldOptions.deprecated', index=3, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='experimental_map_key', full_name='google.protobuf.FieldOptions.experimental_map_key', index=4, + number=9, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='weak', full_name='google.protobuf.FieldOptions.weak', index=5, + number=10, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.FieldOptions.uninterpreted_option', index=6, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _FIELDOPTIONS_CTYPE, + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=3099, + serialized_end=3417, +) + + +_ENUMOPTIONS = _descriptor.Descriptor( + name='EnumOptions', + full_name='google.protobuf.EnumOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='allow_alias', full_name='google.protobuf.EnumOptions.allow_alias', index=0, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.EnumOptions.deprecated', index=1, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.EnumOptions.uninterpreted_option', index=2, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=3420, + serialized_end=3561, +) + + +_ENUMVALUEOPTIONS = _descriptor.Descriptor( + name='EnumValueOptions', + full_name='google.protobuf.EnumValueOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.EnumValueOptions.deprecated', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.EnumValueOptions.uninterpreted_option', index=1, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=3563, + serialized_end=3688, +) + + +_SERVICEOPTIONS = _descriptor.Descriptor( + name='ServiceOptions', + full_name='google.protobuf.ServiceOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.ServiceOptions.deprecated', index=0, + number=33, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.ServiceOptions.uninterpreted_option', index=1, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=3690, + serialized_end=3813, +) + + +_METHODOPTIONS = _descriptor.Descriptor( + name='MethodOptions', + full_name='google.protobuf.MethodOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.MethodOptions.deprecated', index=0, + number=33, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.MethodOptions.uninterpreted_option', index=1, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=3815, + serialized_end=3937, +) + + +_UNINTERPRETEDOPTION_NAMEPART = _descriptor.Descriptor( + name='NamePart', + full_name='google.protobuf.UninterpretedOption.NamePart', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name_part', full_name='google.protobuf.UninterpretedOption.NamePart.name_part', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='is_extension', full_name='google.protobuf.UninterpretedOption.NamePart.is_extension', index=1, + number=2, type=8, cpp_type=7, label=2, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=4175, + serialized_end=4226, +) + +_UNINTERPRETEDOPTION = _descriptor.Descriptor( + name='UninterpretedOption', + full_name='google.protobuf.UninterpretedOption', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.UninterpretedOption.name', index=0, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='identifier_value', full_name='google.protobuf.UninterpretedOption.identifier_value', index=1, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='positive_int_value', full_name='google.protobuf.UninterpretedOption.positive_int_value', index=2, + number=4, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='negative_int_value', full_name='google.protobuf.UninterpretedOption.negative_int_value', index=3, + number=5, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='double_value', full_name='google.protobuf.UninterpretedOption.double_value', index=4, + number=6, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='string_value', full_name='google.protobuf.UninterpretedOption.string_value', index=5, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='aggregate_value', full_name='google.protobuf.UninterpretedOption.aggregate_value', index=6, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_UNINTERPRETEDOPTION_NAMEPART, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=3940, + serialized_end=4226, +) + + +_SOURCECODEINFO_LOCATION = _descriptor.Descriptor( + name='Location', + full_name='google.protobuf.SourceCodeInfo.Location', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='path', full_name='google.protobuf.SourceCodeInfo.Location.path', index=0, + number=1, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='span', full_name='google.protobuf.SourceCodeInfo.Location.span', index=1, + number=2, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='leading_comments', full_name='google.protobuf.SourceCodeInfo.Location.leading_comments', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='trailing_comments', full_name='google.protobuf.SourceCodeInfo.Location.trailing_comments', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=4307, + serialized_end=4406, +) + +_SOURCECODEINFO = _descriptor.Descriptor( + name='SourceCodeInfo', + full_name='google.protobuf.SourceCodeInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='location', full_name='google.protobuf.SourceCodeInfo.location', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_SOURCECODEINFO_LOCATION, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=4229, + serialized_end=4406, +) + +_FILEDESCRIPTORSET.fields_by_name['file'].message_type = _FILEDESCRIPTORPROTO +_FILEDESCRIPTORPROTO.fields_by_name['message_type'].message_type = _DESCRIPTORPROTO +_FILEDESCRIPTORPROTO.fields_by_name['enum_type'].message_type = _ENUMDESCRIPTORPROTO +_FILEDESCRIPTORPROTO.fields_by_name['service'].message_type = _SERVICEDESCRIPTORPROTO +_FILEDESCRIPTORPROTO.fields_by_name['extension'].message_type = _FIELDDESCRIPTORPROTO +_FILEDESCRIPTORPROTO.fields_by_name['options'].message_type = _FILEOPTIONS +_FILEDESCRIPTORPROTO.fields_by_name['source_code_info'].message_type = _SOURCECODEINFO +_DESCRIPTORPROTO_EXTENSIONRANGE.containing_type = _DESCRIPTORPROTO +_DESCRIPTORPROTO.fields_by_name['field'].message_type = _FIELDDESCRIPTORPROTO +_DESCRIPTORPROTO.fields_by_name['extension'].message_type = _FIELDDESCRIPTORPROTO +_DESCRIPTORPROTO.fields_by_name['nested_type'].message_type = _DESCRIPTORPROTO +_DESCRIPTORPROTO.fields_by_name['enum_type'].message_type = _ENUMDESCRIPTORPROTO +_DESCRIPTORPROTO.fields_by_name['extension_range'].message_type = _DESCRIPTORPROTO_EXTENSIONRANGE +_DESCRIPTORPROTO.fields_by_name['oneof_decl'].message_type = _ONEOFDESCRIPTORPROTO +_DESCRIPTORPROTO.fields_by_name['options'].message_type = _MESSAGEOPTIONS +_FIELDDESCRIPTORPROTO.fields_by_name['label'].enum_type = _FIELDDESCRIPTORPROTO_LABEL +_FIELDDESCRIPTORPROTO.fields_by_name['type'].enum_type = _FIELDDESCRIPTORPROTO_TYPE +_FIELDDESCRIPTORPROTO.fields_by_name['options'].message_type = _FIELDOPTIONS +_FIELDDESCRIPTORPROTO_TYPE.containing_type = _FIELDDESCRIPTORPROTO +_FIELDDESCRIPTORPROTO_LABEL.containing_type = _FIELDDESCRIPTORPROTO +_ENUMDESCRIPTORPROTO.fields_by_name['value'].message_type = _ENUMVALUEDESCRIPTORPROTO +_ENUMDESCRIPTORPROTO.fields_by_name['options'].message_type = _ENUMOPTIONS +_ENUMVALUEDESCRIPTORPROTO.fields_by_name['options'].message_type = _ENUMVALUEOPTIONS +_SERVICEDESCRIPTORPROTO.fields_by_name['method'].message_type = _METHODDESCRIPTORPROTO +_SERVICEDESCRIPTORPROTO.fields_by_name['options'].message_type = _SERVICEOPTIONS +_METHODDESCRIPTORPROTO.fields_by_name['options'].message_type = _METHODOPTIONS +_FILEOPTIONS.fields_by_name['optimize_for'].enum_type = _FILEOPTIONS_OPTIMIZEMODE +_FILEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_FILEOPTIONS_OPTIMIZEMODE.containing_type = _FILEOPTIONS +_MESSAGEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_FIELDOPTIONS.fields_by_name['ctype'].enum_type = _FIELDOPTIONS_CTYPE +_FIELDOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_FIELDOPTIONS_CTYPE.containing_type = _FIELDOPTIONS +_ENUMOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_ENUMVALUEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_SERVICEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_METHODOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION +_UNINTERPRETEDOPTION_NAMEPART.containing_type = _UNINTERPRETEDOPTION +_UNINTERPRETEDOPTION.fields_by_name['name'].message_type = _UNINTERPRETEDOPTION_NAMEPART +_SOURCECODEINFO_LOCATION.containing_type = _SOURCECODEINFO +_SOURCECODEINFO.fields_by_name['location'].message_type = _SOURCECODEINFO_LOCATION +DESCRIPTOR.message_types_by_name['FileDescriptorSet'] = _FILEDESCRIPTORSET +DESCRIPTOR.message_types_by_name['FileDescriptorProto'] = _FILEDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['DescriptorProto'] = _DESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['FieldDescriptorProto'] = _FIELDDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['OneofDescriptorProto'] = _ONEOFDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['EnumDescriptorProto'] = _ENUMDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['EnumValueDescriptorProto'] = _ENUMVALUEDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['ServiceDescriptorProto'] = _SERVICEDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['MethodDescriptorProto'] = _METHODDESCRIPTORPROTO +DESCRIPTOR.message_types_by_name['FileOptions'] = _FILEOPTIONS +DESCRIPTOR.message_types_by_name['MessageOptions'] = _MESSAGEOPTIONS +DESCRIPTOR.message_types_by_name['FieldOptions'] = _FIELDOPTIONS +DESCRIPTOR.message_types_by_name['EnumOptions'] = _ENUMOPTIONS +DESCRIPTOR.message_types_by_name['EnumValueOptions'] = _ENUMVALUEOPTIONS +DESCRIPTOR.message_types_by_name['ServiceOptions'] = _SERVICEOPTIONS +DESCRIPTOR.message_types_by_name['MethodOptions'] = _METHODOPTIONS +DESCRIPTOR.message_types_by_name['UninterpretedOption'] = _UNINTERPRETEDOPTION +DESCRIPTOR.message_types_by_name['SourceCodeInfo'] = _SOURCECODEINFO + +FileDescriptorSet = _reflection.GeneratedProtocolMessageType('FileDescriptorSet', (_message.Message,), dict( + DESCRIPTOR = _FILEDESCRIPTORSET, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorSet) + )) +_sym_db.RegisterMessage(FileDescriptorSet) + +FileDescriptorProto = _reflection.GeneratedProtocolMessageType('FileDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _FILEDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorProto) + )) +_sym_db.RegisterMessage(FileDescriptorProto) + +DescriptorProto = _reflection.GeneratedProtocolMessageType('DescriptorProto', (_message.Message,), dict( + + ExtensionRange = _reflection.GeneratedProtocolMessageType('ExtensionRange', (_message.Message,), dict( + DESCRIPTOR = _DESCRIPTORPROTO_EXTENSIONRANGE, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto.ExtensionRange) + )) + , + DESCRIPTOR = _DESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto) + )) +_sym_db.RegisterMessage(DescriptorProto) +_sym_db.RegisterMessage(DescriptorProto.ExtensionRange) + +FieldDescriptorProto = _reflection.GeneratedProtocolMessageType('FieldDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _FIELDDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.FieldDescriptorProto) + )) +_sym_db.RegisterMessage(FieldDescriptorProto) + +OneofDescriptorProto = _reflection.GeneratedProtocolMessageType('OneofDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _ONEOFDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.OneofDescriptorProto) + )) +_sym_db.RegisterMessage(OneofDescriptorProto) + +EnumDescriptorProto = _reflection.GeneratedProtocolMessageType('EnumDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _ENUMDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.EnumDescriptorProto) + )) +_sym_db.RegisterMessage(EnumDescriptorProto) + +EnumValueDescriptorProto = _reflection.GeneratedProtocolMessageType('EnumValueDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _ENUMVALUEDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.EnumValueDescriptorProto) + )) +_sym_db.RegisterMessage(EnumValueDescriptorProto) + +ServiceDescriptorProto = _reflection.GeneratedProtocolMessageType('ServiceDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _SERVICEDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.ServiceDescriptorProto) + )) +_sym_db.RegisterMessage(ServiceDescriptorProto) + +MethodDescriptorProto = _reflection.GeneratedProtocolMessageType('MethodDescriptorProto', (_message.Message,), dict( + DESCRIPTOR = _METHODDESCRIPTORPROTO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.MethodDescriptorProto) + )) +_sym_db.RegisterMessage(MethodDescriptorProto) + +FileOptions = _reflection.GeneratedProtocolMessageType('FileOptions', (_message.Message,), dict( + DESCRIPTOR = _FILEOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.FileOptions) + )) +_sym_db.RegisterMessage(FileOptions) + +MessageOptions = _reflection.GeneratedProtocolMessageType('MessageOptions', (_message.Message,), dict( + DESCRIPTOR = _MESSAGEOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.MessageOptions) + )) +_sym_db.RegisterMessage(MessageOptions) + +FieldOptions = _reflection.GeneratedProtocolMessageType('FieldOptions', (_message.Message,), dict( + DESCRIPTOR = _FIELDOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.FieldOptions) + )) +_sym_db.RegisterMessage(FieldOptions) + +EnumOptions = _reflection.GeneratedProtocolMessageType('EnumOptions', (_message.Message,), dict( + DESCRIPTOR = _ENUMOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.EnumOptions) + )) +_sym_db.RegisterMessage(EnumOptions) + +EnumValueOptions = _reflection.GeneratedProtocolMessageType('EnumValueOptions', (_message.Message,), dict( + DESCRIPTOR = _ENUMVALUEOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.EnumValueOptions) + )) +_sym_db.RegisterMessage(EnumValueOptions) + +ServiceOptions = _reflection.GeneratedProtocolMessageType('ServiceOptions', (_message.Message,), dict( + DESCRIPTOR = _SERVICEOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.ServiceOptions) + )) +_sym_db.RegisterMessage(ServiceOptions) + +MethodOptions = _reflection.GeneratedProtocolMessageType('MethodOptions', (_message.Message,), dict( + DESCRIPTOR = _METHODOPTIONS, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.MethodOptions) + )) +_sym_db.RegisterMessage(MethodOptions) + +UninterpretedOption = _reflection.GeneratedProtocolMessageType('UninterpretedOption', (_message.Message,), dict( + + NamePart = _reflection.GeneratedProtocolMessageType('NamePart', (_message.Message,), dict( + DESCRIPTOR = _UNINTERPRETEDOPTION_NAMEPART, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption.NamePart) + )) + , + DESCRIPTOR = _UNINTERPRETEDOPTION, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption) + )) +_sym_db.RegisterMessage(UninterpretedOption) +_sym_db.RegisterMessage(UninterpretedOption.NamePart) + +SourceCodeInfo = _reflection.GeneratedProtocolMessageType('SourceCodeInfo', (_message.Message,), dict( + + Location = _reflection.GeneratedProtocolMessageType('Location', (_message.Message,), dict( + DESCRIPTOR = _SOURCECODEINFO_LOCATION, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo.Location) + )) + , + DESCRIPTOR = _SOURCECODEINFO, + __module__ = 'google.protobuf.descriptor_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo) + )) +_sym_db.RegisterMessage(SourceCodeInfo) +_sym_db.RegisterMessage(SourceCodeInfo.Location) + + +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/descriptor_pool.py b/pythonlib/google/protobuf/descriptor_pool.py new file mode 100644 index 0000000..372f458 --- /dev/null +++ b/pythonlib/google/protobuf/descriptor_pool.py @@ -0,0 +1,643 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Provides DescriptorPool to use as a container for proto2 descriptors. + +The DescriptorPool is used in conjection with a DescriptorDatabase to maintain +a collection of protocol buffer descriptors for use when dynamically creating +message types at runtime. + +For most applications protocol buffers should be used via modules generated by +the protocol buffer compiler tool. This should only be used when the type of +protocol buffers used in an application or library cannot be predetermined. + +Below is a straightforward example on how to use this class: + + pool = DescriptorPool() + file_descriptor_protos = [ ... ] + for file_descriptor_proto in file_descriptor_protos: + pool.Add(file_descriptor_proto) + my_message_descriptor = pool.FindMessageTypeByName('some.package.MessageType') + +The message descriptor can be used in conjunction with the message_factory +module in order to create a protocol buffer class that can be encoded and +decoded. + +If you want to get a Python class for the specified proto, use the +helper functions inside google.protobuf.message_factory +directly instead of this class. +""" + +__author__ = 'matthewtoia@google.com (Matt Toia)' + +import sys + +from google.protobuf import descriptor +from google.protobuf import descriptor_database +from google.protobuf import text_encoding + + +def _NormalizeFullyQualifiedName(name): + """Remove leading period from fully-qualified type name. + + Due to b/13860351 in descriptor_database.py, types in the root namespace are + generated with a leading period. This function removes that prefix. + + Args: + name: A str, the fully-qualified symbol name. + + Returns: + A str, the normalized fully-qualified symbol name. + """ + return name.lstrip('.') + + +class DescriptorPool(object): + """A collection of protobufs dynamically constructed by descriptor protos.""" + + def __init__(self, descriptor_db=None): + """Initializes a Pool of proto buffs. + + The descriptor_db argument to the constructor is provided to allow + specialized file descriptor proto lookup code to be triggered on demand. An + example would be an implementation which will read and compile a file + specified in a call to FindFileByName() and not require the call to Add() + at all. Results from this database will be cached internally here as well. + + Args: + descriptor_db: A secondary source of file descriptors. + """ + + self._internal_db = descriptor_database.DescriptorDatabase() + self._descriptor_db = descriptor_db + self._descriptors = {} + self._enum_descriptors = {} + self._file_descriptors = {} + + def Add(self, file_desc_proto): + """Adds the FileDescriptorProto and its types to this pool. + + Args: + file_desc_proto: The FileDescriptorProto to add. + """ + + self._internal_db.Add(file_desc_proto) + + def AddDescriptor(self, desc): + """Adds a Descriptor to the pool, non-recursively. + + If the Descriptor contains nested messages or enums, the caller must + explicitly register them. This method also registers the FileDescriptor + associated with the message. + + Args: + desc: A Descriptor. + """ + if not isinstance(desc, descriptor.Descriptor): + raise TypeError('Expected instance of descriptor.Descriptor.') + + self._descriptors[desc.full_name] = desc + self.AddFileDescriptor(desc.file) + + def AddEnumDescriptor(self, enum_desc): + """Adds an EnumDescriptor to the pool. + + This method also registers the FileDescriptor associated with the message. + + Args: + enum_desc: An EnumDescriptor. + """ + + if not isinstance(enum_desc, descriptor.EnumDescriptor): + raise TypeError('Expected instance of descriptor.EnumDescriptor.') + + self._enum_descriptors[enum_desc.full_name] = enum_desc + self.AddFileDescriptor(enum_desc.file) + + def AddFileDescriptor(self, file_desc): + """Adds a FileDescriptor to the pool, non-recursively. + + If the FileDescriptor contains messages or enums, the caller must explicitly + register them. + + Args: + file_desc: A FileDescriptor. + """ + + if not isinstance(file_desc, descriptor.FileDescriptor): + raise TypeError('Expected instance of descriptor.FileDescriptor.') + self._file_descriptors[file_desc.name] = file_desc + + def FindFileByName(self, file_name): + """Gets a FileDescriptor by file name. + + Args: + file_name: The path to the file to get a descriptor for. + + Returns: + A FileDescriptor for the named file. + + Raises: + KeyError: if the file can not be found in the pool. + """ + + try: + return self._file_descriptors[file_name] + except KeyError: + pass + + try: + file_proto = self._internal_db.FindFileByName(file_name) + except KeyError: + _, error, _ = sys.exc_info() #PY25 compatible for GAE. + if self._descriptor_db: + file_proto = self._descriptor_db.FindFileByName(file_name) + else: + raise error + if not file_proto: + raise KeyError('Cannot find a file named %s' % file_name) + return self._ConvertFileProtoToFileDescriptor(file_proto) + + def FindFileContainingSymbol(self, symbol): + """Gets the FileDescriptor for the file containing the specified symbol. + + Args: + symbol: The name of the symbol to search for. + + Returns: + A FileDescriptor that contains the specified symbol. + + Raises: + KeyError: if the file can not be found in the pool. + """ + + symbol = _NormalizeFullyQualifiedName(symbol) + try: + return self._descriptors[symbol].file + except KeyError: + pass + + try: + return self._enum_descriptors[symbol].file + except KeyError: + pass + + try: + file_proto = self._internal_db.FindFileContainingSymbol(symbol) + except KeyError: + _, error, _ = sys.exc_info() #PY25 compatible for GAE. + if self._descriptor_db: + file_proto = self._descriptor_db.FindFileContainingSymbol(symbol) + else: + raise error + if not file_proto: + raise KeyError('Cannot find a file containing %s' % symbol) + return self._ConvertFileProtoToFileDescriptor(file_proto) + + def FindMessageTypeByName(self, full_name): + """Loads the named descriptor from the pool. + + Args: + full_name: The full name of the descriptor to load. + + Returns: + The descriptor for the named type. + """ + + full_name = _NormalizeFullyQualifiedName(full_name) + if full_name not in self._descriptors: + self.FindFileContainingSymbol(full_name) + return self._descriptors[full_name] + + def FindEnumTypeByName(self, full_name): + """Loads the named enum descriptor from the pool. + + Args: + full_name: The full name of the enum descriptor to load. + + Returns: + The enum descriptor for the named type. + """ + + full_name = _NormalizeFullyQualifiedName(full_name) + if full_name not in self._enum_descriptors: + self.FindFileContainingSymbol(full_name) + return self._enum_descriptors[full_name] + + def _ConvertFileProtoToFileDescriptor(self, file_proto): + """Creates a FileDescriptor from a proto or returns a cached copy. + + This method also has the side effect of loading all the symbols found in + the file into the appropriate dictionaries in the pool. + + Args: + file_proto: The proto to convert. + + Returns: + A FileDescriptor matching the passed in proto. + """ + + if file_proto.name not in self._file_descriptors: + built_deps = list(self._GetDeps(file_proto.dependency)) + direct_deps = [self.FindFileByName(n) for n in file_proto.dependency] + + file_descriptor = descriptor.FileDescriptor( + name=file_proto.name, + package=file_proto.package, + options=file_proto.options, + serialized_pb=file_proto.SerializeToString(), + dependencies=direct_deps) + scope = {} + + # This loop extracts all the message and enum types from all the + # dependencoes of the file_proto. This is necessary to create the + # scope of available message types when defining the passed in + # file proto. + for dependency in built_deps: + scope.update(self._ExtractSymbols( + dependency.message_types_by_name.values())) + scope.update((_PrefixWithDot(enum.full_name), enum) + for enum in dependency.enum_types_by_name.values()) + + for message_type in file_proto.message_type: + message_desc = self._ConvertMessageDescriptor( + message_type, file_proto.package, file_descriptor, scope) + file_descriptor.message_types_by_name[message_desc.name] = message_desc + + for enum_type in file_proto.enum_type: + file_descriptor.enum_types_by_name[enum_type.name] = ( + self._ConvertEnumDescriptor(enum_type, file_proto.package, + file_descriptor, None, scope)) + + for index, extension_proto in enumerate(file_proto.extension): + extension_desc = self.MakeFieldDescriptor( + extension_proto, file_proto.package, index, is_extension=True) + extension_desc.containing_type = self._GetTypeFromScope( + file_descriptor.package, extension_proto.extendee, scope) + self.SetFieldType(extension_proto, extension_desc, + file_descriptor.package, scope) + file_descriptor.extensions_by_name[extension_desc.name] = extension_desc + + for desc_proto in file_proto.message_type: + self.SetAllFieldTypes(file_proto.package, desc_proto, scope) + + if file_proto.package: + desc_proto_prefix = _PrefixWithDot(file_proto.package) + else: + desc_proto_prefix = '' + + for desc_proto in file_proto.message_type: + desc = self._GetTypeFromScope(desc_proto_prefix, desc_proto.name, scope) + file_descriptor.message_types_by_name[desc_proto.name] = desc + self.Add(file_proto) + self._file_descriptors[file_proto.name] = file_descriptor + + return self._file_descriptors[file_proto.name] + + def _ConvertMessageDescriptor(self, desc_proto, package=None, file_desc=None, + scope=None): + """Adds the proto to the pool in the specified package. + + Args: + desc_proto: The descriptor_pb2.DescriptorProto protobuf message. + package: The package the proto should be located in. + file_desc: The file containing this message. + scope: Dict mapping short and full symbols to message and enum types. + + Returns: + The added descriptor. + """ + + if package: + desc_name = '.'.join((package, desc_proto.name)) + else: + desc_name = desc_proto.name + + if file_desc is None: + file_name = None + else: + file_name = file_desc.name + + if scope is None: + scope = {} + + nested = [ + self._ConvertMessageDescriptor(nested, desc_name, file_desc, scope) + for nested in desc_proto.nested_type] + enums = [ + self._ConvertEnumDescriptor(enum, desc_name, file_desc, None, scope) + for enum in desc_proto.enum_type] + fields = [self.MakeFieldDescriptor(field, desc_name, index) + for index, field in enumerate(desc_proto.field)] + extensions = [ + self.MakeFieldDescriptor(extension, desc_name, index, is_extension=True) + for index, extension in enumerate(desc_proto.extension)] + oneofs = [ + descriptor.OneofDescriptor(desc.name, '.'.join((desc_name, desc.name)), + index, None, []) + for index, desc in enumerate(desc_proto.oneof_decl)] + extension_ranges = [(r.start, r.end) for r in desc_proto.extension_range] + if extension_ranges: + is_extendable = True + else: + is_extendable = False + desc = descriptor.Descriptor( + name=desc_proto.name, + full_name=desc_name, + filename=file_name, + containing_type=None, + fields=fields, + oneofs=oneofs, + nested_types=nested, + enum_types=enums, + extensions=extensions, + options=desc_proto.options, + is_extendable=is_extendable, + extension_ranges=extension_ranges, + file=file_desc, + serialized_start=None, + serialized_end=None) + for nested in desc.nested_types: + nested.containing_type = desc + for enum in desc.enum_types: + enum.containing_type = desc + for field_index, field_desc in enumerate(desc_proto.field): + if field_desc.HasField('oneof_index'): + oneof_index = field_desc.oneof_index + oneofs[oneof_index].fields.append(fields[field_index]) + fields[field_index].containing_oneof = oneofs[oneof_index] + + scope[_PrefixWithDot(desc_name)] = desc + self._descriptors[desc_name] = desc + return desc + + def _ConvertEnumDescriptor(self, enum_proto, package=None, file_desc=None, + containing_type=None, scope=None): + """Make a protobuf EnumDescriptor given an EnumDescriptorProto protobuf. + + Args: + enum_proto: The descriptor_pb2.EnumDescriptorProto protobuf message. + package: Optional package name for the new message EnumDescriptor. + file_desc: The file containing the enum descriptor. + containing_type: The type containing this enum. + scope: Scope containing available types. + + Returns: + The added descriptor + """ + + if package: + enum_name = '.'.join((package, enum_proto.name)) + else: + enum_name = enum_proto.name + + if file_desc is None: + file_name = None + else: + file_name = file_desc.name + + values = [self._MakeEnumValueDescriptor(value, index) + for index, value in enumerate(enum_proto.value)] + desc = descriptor.EnumDescriptor(name=enum_proto.name, + full_name=enum_name, + filename=file_name, + file=file_desc, + values=values, + containing_type=containing_type, + options=enum_proto.options) + scope['.%s' % enum_name] = desc + self._enum_descriptors[enum_name] = desc + return desc + + def MakeFieldDescriptor(self, field_proto, message_name, index, + is_extension=False): + """Creates a field descriptor from a FieldDescriptorProto. + + For message and enum type fields, this method will do a look up + in the pool for the appropriate descriptor for that type. If it + is unavailable, it will fall back to the _source function to + create it. If this type is still unavailable, construction will + fail. + + Args: + field_proto: The proto describing the field. + message_name: The name of the containing message. + index: Index of the field + is_extension: Indication that this field is for an extension. + + Returns: + An initialized FieldDescriptor object + """ + + if message_name: + full_name = '.'.join((message_name, field_proto.name)) + else: + full_name = field_proto.name + + return descriptor.FieldDescriptor( + name=field_proto.name, + full_name=full_name, + index=index, + number=field_proto.number, + type=field_proto.type, + cpp_type=None, + message_type=None, + enum_type=None, + containing_type=None, + label=field_proto.label, + has_default_value=False, + default_value=None, + is_extension=is_extension, + extension_scope=None, + options=field_proto.options) + + def SetAllFieldTypes(self, package, desc_proto, scope): + """Sets all the descriptor's fields's types. + + This method also sets the containing types on any extensions. + + Args: + package: The current package of desc_proto. + desc_proto: The message descriptor to update. + scope: Enclosing scope of available types. + """ + + package = _PrefixWithDot(package) + + main_desc = self._GetTypeFromScope(package, desc_proto.name, scope) + + if package == '.': + nested_package = _PrefixWithDot(desc_proto.name) + else: + nested_package = '.'.join([package, desc_proto.name]) + + for field_proto, field_desc in zip(desc_proto.field, main_desc.fields): + self.SetFieldType(field_proto, field_desc, nested_package, scope) + + for extension_proto, extension_desc in ( + zip(desc_proto.extension, main_desc.extensions)): + extension_desc.containing_type = self._GetTypeFromScope( + nested_package, extension_proto.extendee, scope) + self.SetFieldType(extension_proto, extension_desc, nested_package, scope) + + for nested_type in desc_proto.nested_type: + self.SetAllFieldTypes(nested_package, nested_type, scope) + + def SetFieldType(self, field_proto, field_desc, package, scope): + """Sets the field's type, cpp_type, message_type and enum_type. + + Args: + field_proto: Data about the field in proto format. + field_desc: The descriptor to modiy. + package: The package the field's container is in. + scope: Enclosing scope of available types. + """ + if field_proto.type_name: + desc = self._GetTypeFromScope(package, field_proto.type_name, scope) + else: + desc = None + + if not field_proto.HasField('type'): + if isinstance(desc, descriptor.Descriptor): + field_proto.type = descriptor.FieldDescriptor.TYPE_MESSAGE + else: + field_proto.type = descriptor.FieldDescriptor.TYPE_ENUM + + field_desc.cpp_type = descriptor.FieldDescriptor.ProtoTypeToCppProtoType( + field_proto.type) + + if (field_proto.type == descriptor.FieldDescriptor.TYPE_MESSAGE + or field_proto.type == descriptor.FieldDescriptor.TYPE_GROUP): + field_desc.message_type = desc + + if field_proto.type == descriptor.FieldDescriptor.TYPE_ENUM: + field_desc.enum_type = desc + + if field_proto.label == descriptor.FieldDescriptor.LABEL_REPEATED: + field_desc.has_default_value = False + field_desc.default_value = [] + elif field_proto.HasField('default_value'): + field_desc.has_default_value = True + if (field_proto.type == descriptor.FieldDescriptor.TYPE_DOUBLE or + field_proto.type == descriptor.FieldDescriptor.TYPE_FLOAT): + field_desc.default_value = float(field_proto.default_value) + elif field_proto.type == descriptor.FieldDescriptor.TYPE_STRING: + field_desc.default_value = field_proto.default_value + elif field_proto.type == descriptor.FieldDescriptor.TYPE_BOOL: + field_desc.default_value = field_proto.default_value.lower() == 'true' + elif field_proto.type == descriptor.FieldDescriptor.TYPE_ENUM: + field_desc.default_value = field_desc.enum_type.values_by_name[ + field_proto.default_value].index + elif field_proto.type == descriptor.FieldDescriptor.TYPE_BYTES: + field_desc.default_value = text_encoding.CUnescape( + field_proto.default_value) + else: + field_desc.default_value = int(field_proto.default_value) + else: + field_desc.has_default_value = False + field_desc.default_value = None + + field_desc.type = field_proto.type + + def _MakeEnumValueDescriptor(self, value_proto, index): + """Creates a enum value descriptor object from a enum value proto. + + Args: + value_proto: The proto describing the enum value. + index: The index of the enum value. + + Returns: + An initialized EnumValueDescriptor object. + """ + + return descriptor.EnumValueDescriptor( + name=value_proto.name, + index=index, + number=value_proto.number, + options=value_proto.options, + type=None) + + def _ExtractSymbols(self, descriptors): + """Pulls out all the symbols from descriptor protos. + + Args: + descriptors: The messages to extract descriptors from. + Yields: + A two element tuple of the type name and descriptor object. + """ + + for desc in descriptors: + yield (_PrefixWithDot(desc.full_name), desc) + for symbol in self._ExtractSymbols(desc.nested_types): + yield symbol + for enum in desc.enum_types: + yield (_PrefixWithDot(enum.full_name), enum) + + def _GetDeps(self, dependencies): + """Recursively finds dependencies for file protos. + + Args: + dependencies: The names of the files being depended on. + + Yields: + Each direct and indirect dependency. + """ + + for dependency in dependencies: + dep_desc = self.FindFileByName(dependency) + yield dep_desc + for parent_dep in dep_desc.dependencies: + yield parent_dep + + def _GetTypeFromScope(self, package, type_name, scope): + """Finds a given type name in the current scope. + + Args: + package: The package the proto should be located in. + type_name: The name of the type to be found in the scope. + scope: Dict mapping short and full symbols to message and enum types. + + Returns: + The descriptor for the requested type. + """ + if type_name not in scope: + components = _PrefixWithDot(package).split('.') + while components: + possible_match = '.'.join(components + [type_name]) + if possible_match in scope: + type_name = possible_match + break + else: + components.pop(-1) + return scope[type_name] + + +def _PrefixWithDot(name): + return name if name.startswith('.') else '.%s' % name diff --git a/pythonlib/google/protobuf/internal/__init__.py b/pythonlib/google/protobuf/internal/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pythonlib/google/protobuf/internal/api_implementation.cc b/pythonlib/google/protobuf/internal/api_implementation.cc new file mode 100644 index 0000000..ad6fd9c --- /dev/null +++ b/pythonlib/google/protobuf/internal/api_implementation.cc @@ -0,0 +1,139 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +#include + +namespace google { +namespace protobuf { +namespace python { + +// Version constant. +// This is either 0 for python, 1 for CPP V1, 2 for CPP V2. +// +// 0 is default and is equivalent to +// PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python +// +// 1 is set with -DPYTHON_PROTO2_CPP_IMPL_V1 and is equivalent to +// PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp +// and +// PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION=1 +// +// 2 is set with -DPYTHON_PROTO2_CPP_IMPL_V2 and is equivalent to +// PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp +// and +// PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION=2 +#ifdef PYTHON_PROTO2_CPP_IMPL_V1 +#if PY_MAJOR_VERSION >= 3 +#error "PYTHON_PROTO2_CPP_IMPL_V1 is not supported under Python 3." +#endif +static int kImplVersion = 1; +#else +#ifdef PYTHON_PROTO2_CPP_IMPL_V2 +static int kImplVersion = 2; +#else +#ifdef PYTHON_PROTO2_PYTHON_IMPL +static int kImplVersion = 0; +#else + +// The defaults are set here. Python 3 uses the fast C++ APIv2 by default. +// Python 2 still uses the Python version by default until some compatibility +// issues can be worked around. +#if PY_MAJOR_VERSION >= 3 +static int kImplVersion = 2; +#else +static int kImplVersion = 0; +#endif + +#endif // PYTHON_PROTO2_PYTHON_IMPL +#endif // PYTHON_PROTO2_CPP_IMPL_V2 +#endif // PYTHON_PROTO2_CPP_IMPL_V1 + +static const char* kImplVersionName = "api_version"; + +static const char* kModuleName = "_api_implementation"; +static const char kModuleDocstring[] = +"_api_implementation is a module that exposes compile-time constants that\n" +"determine the default API implementation to use for Python proto2.\n" +"\n" +"It complements api_implementation.py by setting defaults using compile-time\n" +"constants defined in C, such that one can set defaults at compilation\n" +"(e.g. with blaze flag --copt=-DPYTHON_PROTO2_CPP_IMPL_V2)."; + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef _module = { + PyModuleDef_HEAD_INIT, + kModuleName, + kModuleDocstring, + -1, + NULL, + NULL, + NULL, + NULL, + NULL +}; +#define INITFUNC PyInit__api_implementation +#define INITFUNC_ERRORVAL NULL +#else +#define INITFUNC init_api_implementation +#define INITFUNC_ERRORVAL +#endif + +extern "C" { + PyMODINIT_FUNC INITFUNC() { +#if PY_MAJOR_VERSION >= 3 + PyObject *module = PyModule_Create(&_module); +#else + PyObject *module = Py_InitModule3( + const_cast(kModuleName), + NULL, + const_cast(kModuleDocstring)); +#endif + if (module == NULL) { + return INITFUNC_ERRORVAL; + } + + // Adds the module variable "api_version". + if (PyModule_AddIntConstant( + module, + const_cast(kImplVersionName), + kImplVersion)) +#if PY_MAJOR_VERSION < 3 + return; +#else + { Py_DECREF(module); return NULL; } + + return module; +#endif + } +} + +} // namespace python +} // namespace protobuf +} // namespace google diff --git a/pythonlib/google/protobuf/internal/api_implementation.py b/pythonlib/google/protobuf/internal/api_implementation.py new file mode 100644 index 0000000..cbb8574 --- /dev/null +++ b/pythonlib/google/protobuf/internal/api_implementation.py @@ -0,0 +1,89 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Determine which implementation of the protobuf API is used in this process. +""" + +import os +import sys + +try: + # pylint: disable=g-import-not-at-top + from google.protobuf.internal import _api_implementation + # The compile-time constants in the _api_implementation module can be used to + # switch to a certain implementation of the Python API at build time. + _api_version = _api_implementation.api_version + del _api_implementation +except ImportError: + _api_version = 0 + +_default_implementation_type = ( + 'python' if _api_version == 0 else 'cpp') +_default_version_str = ( + '1' if _api_version <= 1 else '2') + +# This environment variable can be used to switch to a certain implementation +# of the Python API, overriding the compile-time constants in the +# _api_implementation module. Right now only 'python' and 'cpp' are valid +# values. Any other value will be ignored. +_implementation_type = os.getenv('PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION', + _default_implementation_type) + +if _implementation_type != 'python': + _implementation_type = 'cpp' + +# This environment variable can be used to switch between the two +# 'cpp' implementations, overriding the compile-time constants in the +# _api_implementation module. Right now only 1 and 2 are valid values. Any other +# value will be ignored. +_implementation_version_str = os.getenv( + 'PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION', + _default_version_str) + +if _implementation_version_str not in ('1', '2'): + raise ValueError( + "unsupported PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION: '" + + _implementation_version_str + "' (supported versions: 1, 2)" + ) + +_implementation_version = int(_implementation_version_str) + + +# Usage of this function is discouraged. Clients shouldn't care which +# implementation of the API is in use. Note that there is no guarantee +# that differences between APIs will be maintained. +# Please don't use this function if possible. +def Type(): + return _implementation_type + + +# See comment on 'Type' above. +def Version(): + return _implementation_version diff --git a/pythonlib/google/protobuf/internal/api_implementation_default_test.py b/pythonlib/google/protobuf/internal/api_implementation_default_test.py new file mode 100644 index 0000000..b2b4128 --- /dev/null +++ b/pythonlib/google/protobuf/internal/api_implementation_default_test.py @@ -0,0 +1,63 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Test that the api_implementation defaults are what we expect.""" + +import os +import sys +# Clear environment implementation settings before the google3 imports. +os.environ.pop('PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION', None) +os.environ.pop('PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION', None) + +# pylint: disable=g-import-not-at-top +from google.apputils import basetest +from google.protobuf.internal import api_implementation + + +class ApiImplementationDefaultTest(basetest.TestCase): + + if sys.version_info.major <= 2: + + def testThatPythonIsTheDefault(self): + """If -DPYTHON_PROTO_*IMPL* was given at build time, this may fail.""" + self.assertEqual('python', api_implementation.Type()) + + else: + + def testThatCppApiV2IsTheDefault(self): + """If -DPYTHON_PROTO_*IMPL* was given at build time, this may fail.""" + self.assertEqual('cpp', api_implementation.Type()) + self.assertEqual(2, api_implementation.Version()) + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/internal/containers.py b/pythonlib/google/protobuf/internal/containers.py new file mode 100644 index 0000000..5797e81 --- /dev/null +++ b/pythonlib/google/protobuf/internal/containers.py @@ -0,0 +1,269 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Contains container classes to represent different protocol buffer types. + +This file defines container classes which represent categories of protocol +buffer field types which need extra maintenance. Currently these categories +are: + - Repeated scalar fields - These are all repeated fields which aren't + composite (e.g. they are of simple types like int32, string, etc). + - Repeated composite fields - Repeated fields which are composite. This + includes groups and nested messages. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + + +class BaseContainer(object): + + """Base container class.""" + + # Minimizes memory usage and disallows assignment to other attributes. + __slots__ = ['_message_listener', '_values'] + + def __init__(self, message_listener): + """ + Args: + message_listener: A MessageListener implementation. + The RepeatedScalarFieldContainer will call this object's + Modified() method when it is modified. + """ + self._message_listener = message_listener + self._values = [] + + def __getitem__(self, key): + """Retrieves item by the specified key.""" + return self._values[key] + + def __len__(self): + """Returns the number of elements in the container.""" + return len(self._values) + + def __ne__(self, other): + """Checks if another instance isn't equal to this one.""" + # The concrete classes should define __eq__. + return not self == other + + def __hash__(self): + raise TypeError('unhashable object') + + def __repr__(self): + return repr(self._values) + + def sort(self, *args, **kwargs): + # Continue to support the old sort_function keyword argument. + # This is expected to be a rare occurrence, so use LBYL to avoid + # the overhead of actually catching KeyError. + if 'sort_function' in kwargs: + kwargs['cmp'] = kwargs.pop('sort_function') + self._values.sort(*args, **kwargs) + + +class RepeatedScalarFieldContainer(BaseContainer): + + """Simple, type-checked, list-like container for holding repeated scalars.""" + + # Disallows assignment to other attributes. + __slots__ = ['_type_checker'] + + def __init__(self, message_listener, type_checker): + """ + Args: + message_listener: A MessageListener implementation. + The RepeatedScalarFieldContainer will call this object's + Modified() method when it is modified. + type_checker: A type_checkers.ValueChecker instance to run on elements + inserted into this container. + """ + super(RepeatedScalarFieldContainer, self).__init__(message_listener) + self._type_checker = type_checker + + def append(self, value): + """Appends an item to the list. Similar to list.append().""" + self._values.append(self._type_checker.CheckValue(value)) + if not self._message_listener.dirty: + self._message_listener.Modified() + + def insert(self, key, value): + """Inserts the item at the specified position. Similar to list.insert().""" + self._values.insert(key, self._type_checker.CheckValue(value)) + if not self._message_listener.dirty: + self._message_listener.Modified() + + def extend(self, elem_seq): + """Extends by appending the given sequence. Similar to list.extend().""" + if not elem_seq: + return + + new_values = [] + for elem in elem_seq: + new_values.append(self._type_checker.CheckValue(elem)) + self._values.extend(new_values) + self._message_listener.Modified() + + def MergeFrom(self, other): + """Appends the contents of another repeated field of the same type to this + one. We do not check the types of the individual fields. + """ + self._values.extend(other._values) + self._message_listener.Modified() + + def remove(self, elem): + """Removes an item from the list. Similar to list.remove().""" + self._values.remove(elem) + self._message_listener.Modified() + + def __setitem__(self, key, value): + """Sets the item on the specified position.""" + if isinstance(key, slice): # PY3 + if key.step is not None: + raise ValueError('Extended slices not supported') + self.__setslice__(key.start, key.stop, value) + else: + self._values[key] = self._type_checker.CheckValue(value) + self._message_listener.Modified() + + def __getslice__(self, start, stop): + """Retrieves the subset of items from between the specified indices.""" + return self._values[start:stop] + + def __setslice__(self, start, stop, values): + """Sets the subset of items from between the specified indices.""" + new_values = [] + for value in values: + new_values.append(self._type_checker.CheckValue(value)) + self._values[start:stop] = new_values + self._message_listener.Modified() + + def __delitem__(self, key): + """Deletes the item at the specified position.""" + del self._values[key] + self._message_listener.Modified() + + def __delslice__(self, start, stop): + """Deletes the subset of items from between the specified indices.""" + del self._values[start:stop] + self._message_listener.Modified() + + def __eq__(self, other): + """Compares the current instance with another one.""" + if self is other: + return True + # Special case for the same type which should be common and fast. + if isinstance(other, self.__class__): + return other._values == self._values + # We are presumably comparing against some other sequence type. + return other == self._values + + +class RepeatedCompositeFieldContainer(BaseContainer): + + """Simple, list-like container for holding repeated composite fields.""" + + # Disallows assignment to other attributes. + __slots__ = ['_message_descriptor'] + + def __init__(self, message_listener, message_descriptor): + """ + Note that we pass in a descriptor instead of the generated directly, + since at the time we construct a _RepeatedCompositeFieldContainer we + haven't yet necessarily initialized the type that will be contained in the + container. + + Args: + message_listener: A MessageListener implementation. + The RepeatedCompositeFieldContainer will call this object's + Modified() method when it is modified. + message_descriptor: A Descriptor instance describing the protocol type + that should be present in this container. We'll use the + _concrete_class field of this descriptor when the client calls add(). + """ + super(RepeatedCompositeFieldContainer, self).__init__(message_listener) + self._message_descriptor = message_descriptor + + def add(self, **kwargs): + """Adds a new element at the end of the list and returns it. Keyword + arguments may be used to initialize the element. + """ + new_element = self._message_descriptor._concrete_class(**kwargs) + new_element._SetListener(self._message_listener) + self._values.append(new_element) + if not self._message_listener.dirty: + self._message_listener.Modified() + return new_element + + def extend(self, elem_seq): + """Extends by appending the given sequence of elements of the same type + as this one, copying each individual message. + """ + message_class = self._message_descriptor._concrete_class + listener = self._message_listener + values = self._values + for message in elem_seq: + new_element = message_class() + new_element._SetListener(listener) + new_element.MergeFrom(message) + values.append(new_element) + listener.Modified() + + def MergeFrom(self, other): + """Appends the contents of another repeated field of the same type to this + one, copying each individual message. + """ + self.extend(other._values) + + def remove(self, elem): + """Removes an item from the list. Similar to list.remove().""" + self._values.remove(elem) + self._message_listener.Modified() + + def __getslice__(self, start, stop): + """Retrieves the subset of items from between the specified indices.""" + return self._values[start:stop] + + def __delitem__(self, key): + """Deletes the item at the specified position.""" + del self._values[key] + self._message_listener.Modified() + + def __delslice__(self, start, stop): + """Deletes the subset of items from between the specified indices.""" + del self._values[start:stop] + self._message_listener.Modified() + + def __eq__(self, other): + """Compares the current instance with another one.""" + if self is other: + return True + if not isinstance(other, self.__class__): + raise TypeError('Can only compare repeated composite fields against ' + 'other repeated composite fields.') + return self._values == other._values diff --git a/pythonlib/google/protobuf/internal/cpp_message.py b/pythonlib/google/protobuf/internal/cpp_message.py new file mode 100644 index 0000000..8eb38ca --- /dev/null +++ b/pythonlib/google/protobuf/internal/cpp_message.py @@ -0,0 +1,663 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Contains helper functions used to create protocol message classes from +Descriptor objects at runtime backed by the protocol buffer C++ API. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + +import copy_reg +import operator +from google.protobuf.internal import _net_proto2___python +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import message + + +_LABEL_REPEATED = _net_proto2___python.LABEL_REPEATED +_LABEL_OPTIONAL = _net_proto2___python.LABEL_OPTIONAL +_CPPTYPE_MESSAGE = _net_proto2___python.CPPTYPE_MESSAGE +_TYPE_MESSAGE = _net_proto2___python.TYPE_MESSAGE + + +def GetDescriptorPool(): + """Creates a new DescriptorPool C++ object.""" + return _net_proto2___python.NewCDescriptorPool() + + +_pool = GetDescriptorPool() + + +def GetFieldDescriptor(full_field_name): + """Searches for a field descriptor given a full field name.""" + return _pool.FindFieldByName(full_field_name) + + +def BuildFile(content): + """Registers a new proto file in the underlying C++ descriptor pool.""" + _net_proto2___python.BuildFile(content) + + +def GetExtensionDescriptor(full_extension_name): + """Searches for extension descriptor given a full field name.""" + return _pool.FindExtensionByName(full_extension_name) + + +def NewCMessage(full_message_name): + """Creates a new C++ protocol message by its name.""" + return _net_proto2___python.NewCMessage(full_message_name) + + +def ScalarProperty(cdescriptor): + """Returns a scalar property for the given descriptor.""" + + def Getter(self): + return self._cmsg.GetScalar(cdescriptor) + + def Setter(self, value): + self._cmsg.SetScalar(cdescriptor, value) + + return property(Getter, Setter) + + +def CompositeProperty(cdescriptor, message_type): + """Returns a Python property the given composite field.""" + + def Getter(self): + sub_message = self._composite_fields.get(cdescriptor.name, None) + if sub_message is None: + cmessage = self._cmsg.NewSubMessage(cdescriptor) + sub_message = message_type._concrete_class(__cmessage=cmessage) + self._composite_fields[cdescriptor.name] = sub_message + return sub_message + + return property(Getter) + + +class RepeatedScalarContainer(object): + """Container for repeated scalar fields.""" + + __slots__ = ['_message', '_cfield_descriptor', '_cmsg'] + + def __init__(self, msg, cfield_descriptor): + self._message = msg + self._cmsg = msg._cmsg + self._cfield_descriptor = cfield_descriptor + + def append(self, value): + self._cmsg.AddRepeatedScalar( + self._cfield_descriptor, value) + + def extend(self, sequence): + for element in sequence: + self.append(element) + + def insert(self, key, value): + values = self[slice(None, None, None)] + values.insert(key, value) + self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values) + + def remove(self, value): + values = self[slice(None, None, None)] + values.remove(value) + self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values) + + def __setitem__(self, key, value): + values = self[slice(None, None, None)] + values[key] = value + self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values) + + def __getitem__(self, key): + return self._cmsg.GetRepeatedScalar(self._cfield_descriptor, key) + + def __delitem__(self, key): + self._cmsg.DeleteRepeatedField(self._cfield_descriptor, key) + + def __len__(self): + return len(self[slice(None, None, None)]) + + def __eq__(self, other): + if self is other: + return True + if not operator.isSequenceType(other): + raise TypeError( + 'Can only compare repeated scalar fields against sequences.') + # We are presumably comparing against some other sequence type. + return other == self[slice(None, None, None)] + + def __ne__(self, other): + return not self == other + + def __hash__(self): + raise TypeError('unhashable object') + + def sort(self, *args, **kwargs): + # Maintain compatibility with the previous interface. + if 'sort_function' in kwargs: + kwargs['cmp'] = kwargs.pop('sort_function') + self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, + sorted(self, *args, **kwargs)) + + +def RepeatedScalarProperty(cdescriptor): + """Returns a Python property the given repeated scalar field.""" + + def Getter(self): + container = self._composite_fields.get(cdescriptor.name, None) + if container is None: + container = RepeatedScalarContainer(self, cdescriptor) + self._composite_fields[cdescriptor.name] = container + return container + + def Setter(self, new_value): + raise AttributeError('Assignment not allowed to repeated field ' + '"%s" in protocol message object.' % cdescriptor.name) + + doc = 'Magic attribute generated for "%s" proto field.' % cdescriptor.name + return property(Getter, Setter, doc=doc) + + +class RepeatedCompositeContainer(object): + """Container for repeated composite fields.""" + + __slots__ = ['_message', '_subclass', '_cfield_descriptor', '_cmsg'] + + def __init__(self, msg, cfield_descriptor, subclass): + self._message = msg + self._cmsg = msg._cmsg + self._subclass = subclass + self._cfield_descriptor = cfield_descriptor + + def add(self, **kwargs): + cmessage = self._cmsg.AddMessage(self._cfield_descriptor) + return self._subclass(__cmessage=cmessage, __owner=self._message, **kwargs) + + def extend(self, elem_seq): + """Extends by appending the given sequence of elements of the same type + as this one, copying each individual message. + """ + for message in elem_seq: + self.add().MergeFrom(message) + + def remove(self, value): + # TODO(protocol-devel): This is inefficient as it needs to generate a + # message pointer for each message only to do index(). Move this to a C++ + # extension function. + self.__delitem__(self[slice(None, None, None)].index(value)) + + def MergeFrom(self, other): + for message in other[:]: + self.add().MergeFrom(message) + + def __getitem__(self, key): + cmessages = self._cmsg.GetRepeatedMessage( + self._cfield_descriptor, key) + subclass = self._subclass + if not isinstance(cmessages, list): + return subclass(__cmessage=cmessages, __owner=self._message) + + return [subclass(__cmessage=m, __owner=self._message) for m in cmessages] + + def __delitem__(self, key): + self._cmsg.DeleteRepeatedField( + self._cfield_descriptor, key) + + def __len__(self): + return self._cmsg.FieldLength(self._cfield_descriptor) + + def __eq__(self, other): + """Compares the current instance with another one.""" + if self is other: + return True + if not isinstance(other, self.__class__): + raise TypeError('Can only compare repeated composite fields against ' + 'other repeated composite fields.') + messages = self[slice(None, None, None)] + other_messages = other[slice(None, None, None)] + return messages == other_messages + + def __hash__(self): + raise TypeError('unhashable object') + + def sort(self, cmp=None, key=None, reverse=False, **kwargs): + # Maintain compatibility with the old interface. + if cmp is None and 'sort_function' in kwargs: + cmp = kwargs.pop('sort_function') + + # The cmp function, if provided, is passed the results of the key function, + # so we only need to wrap one of them. + if key is None: + index_key = self.__getitem__ + else: + index_key = lambda i: key(self[i]) + + # Sort the list of current indexes by the underlying object. + indexes = range(len(self)) + indexes.sort(cmp=cmp, key=index_key, reverse=reverse) + + # Apply the transposition. + for dest, src in enumerate(indexes): + if dest == src: + continue + self._cmsg.SwapRepeatedFieldElements(self._cfield_descriptor, dest, src) + # Don't swap the same value twice. + indexes[src] = src + + +def RepeatedCompositeProperty(cdescriptor, message_type): + """Returns a Python property for the given repeated composite field.""" + + def Getter(self): + container = self._composite_fields.get(cdescriptor.name, None) + if container is None: + container = RepeatedCompositeContainer( + self, cdescriptor, message_type._concrete_class) + self._composite_fields[cdescriptor.name] = container + return container + + def Setter(self, new_value): + raise AttributeError('Assignment not allowed to repeated field ' + '"%s" in protocol message object.' % cdescriptor.name) + + doc = 'Magic attribute generated for "%s" proto field.' % cdescriptor.name + return property(Getter, Setter, doc=doc) + + +class ExtensionDict(object): + """Extension dictionary added to each protocol message.""" + + def __init__(self, msg): + self._message = msg + self._cmsg = msg._cmsg + self._values = {} + + def __setitem__(self, extension, value): + from google.protobuf import descriptor + if not isinstance(extension, descriptor.FieldDescriptor): + raise KeyError('Bad extension %r.' % (extension,)) + cdescriptor = extension._cdescriptor + if (cdescriptor.label != _LABEL_OPTIONAL or + cdescriptor.cpp_type == _CPPTYPE_MESSAGE): + raise TypeError('Extension %r is repeated and/or a composite type.' % ( + extension.full_name,)) + self._cmsg.SetScalar(cdescriptor, value) + self._values[extension] = value + + def __getitem__(self, extension): + from google.protobuf import descriptor + if not isinstance(extension, descriptor.FieldDescriptor): + raise KeyError('Bad extension %r.' % (extension,)) + + cdescriptor = extension._cdescriptor + if (cdescriptor.label != _LABEL_REPEATED and + cdescriptor.cpp_type != _CPPTYPE_MESSAGE): + return self._cmsg.GetScalar(cdescriptor) + + ext = self._values.get(extension, None) + if ext is not None: + return ext + + ext = self._CreateNewHandle(extension) + self._values[extension] = ext + return ext + + def ClearExtension(self, extension): + from google.protobuf import descriptor + if not isinstance(extension, descriptor.FieldDescriptor): + raise KeyError('Bad extension %r.' % (extension,)) + self._cmsg.ClearFieldByDescriptor(extension._cdescriptor) + if extension in self._values: + del self._values[extension] + + def HasExtension(self, extension): + from google.protobuf import descriptor + if not isinstance(extension, descriptor.FieldDescriptor): + raise KeyError('Bad extension %r.' % (extension,)) + return self._cmsg.HasFieldByDescriptor(extension._cdescriptor) + + def _FindExtensionByName(self, name): + """Tries to find a known extension with the specified name. + + Args: + name: Extension full name. + + Returns: + Extension field descriptor. + """ + return self._message._extensions_by_name.get(name, None) + + def _CreateNewHandle(self, extension): + cdescriptor = extension._cdescriptor + if (cdescriptor.label != _LABEL_REPEATED and + cdescriptor.cpp_type == _CPPTYPE_MESSAGE): + cmessage = self._cmsg.NewSubMessage(cdescriptor) + return extension.message_type._concrete_class(__cmessage=cmessage) + + if cdescriptor.label == _LABEL_REPEATED: + if cdescriptor.cpp_type == _CPPTYPE_MESSAGE: + return RepeatedCompositeContainer( + self._message, cdescriptor, extension.message_type._concrete_class) + else: + return RepeatedScalarContainer(self._message, cdescriptor) + # This shouldn't happen! + assert False + return None + + +def NewMessage(bases, message_descriptor, dictionary): + """Creates a new protocol message *class*.""" + _AddClassAttributesForNestedExtensions(message_descriptor, dictionary) + _AddEnumValues(message_descriptor, dictionary) + _AddDescriptors(message_descriptor, dictionary) + return bases + + +def InitMessage(message_descriptor, cls): + """Constructs a new message instance (called before instance's __init__).""" + cls._extensions_by_name = {} + _AddInitMethod(message_descriptor, cls) + _AddMessageMethods(message_descriptor, cls) + _AddPropertiesForExtensions(message_descriptor, cls) + copy_reg.pickle(cls, lambda obj: (cls, (), obj.__getstate__())) + + +def _AddDescriptors(message_descriptor, dictionary): + """Sets up a new protocol message class dictionary. + + Args: + message_descriptor: A Descriptor instance describing this message type. + dictionary: Class dictionary to which we'll add a '__slots__' entry. + """ + dictionary['__descriptors'] = {} + for field in message_descriptor.fields: + dictionary['__descriptors'][field.name] = GetFieldDescriptor( + field.full_name) + + dictionary['__slots__'] = list(dictionary['__descriptors'].iterkeys()) + [ + '_cmsg', '_owner', '_composite_fields', 'Extensions', '_HACK_REFCOUNTS'] + + +def _AddEnumValues(message_descriptor, dictionary): + """Sets class-level attributes for all enum fields defined in this message. + + Args: + message_descriptor: Descriptor object for this message type. + dictionary: Class dictionary that should be populated. + """ + for enum_type in message_descriptor.enum_types: + dictionary[enum_type.name] = enum_type_wrapper.EnumTypeWrapper(enum_type) + for enum_value in enum_type.values: + dictionary[enum_value.name] = enum_value.number + + +def _AddClassAttributesForNestedExtensions(message_descriptor, dictionary): + """Adds class attributes for the nested extensions.""" + extension_dict = message_descriptor.extensions_by_name + for extension_name, extension_field in extension_dict.iteritems(): + assert extension_name not in dictionary + dictionary[extension_name] = extension_field + + +def _AddInitMethod(message_descriptor, cls): + """Adds an __init__ method to cls.""" + + # Create and attach message field properties to the message class. + # This can be done just once per message class, since property setters and + # getters are passed the message instance. + # This makes message instantiation extremely fast, and at the same time it + # doesn't require the creation of property objects for each message instance, + # which saves a lot of memory. + for field in message_descriptor.fields: + field_cdescriptor = cls.__descriptors[field.name] + if field.label == _LABEL_REPEATED: + if field.cpp_type == _CPPTYPE_MESSAGE: + value = RepeatedCompositeProperty(field_cdescriptor, field.message_type) + else: + value = RepeatedScalarProperty(field_cdescriptor) + elif field.cpp_type == _CPPTYPE_MESSAGE: + value = CompositeProperty(field_cdescriptor, field.message_type) + else: + value = ScalarProperty(field_cdescriptor) + setattr(cls, field.name, value) + + # Attach a constant with the field number. + constant_name = field.name.upper() + '_FIELD_NUMBER' + setattr(cls, constant_name, field.number) + + def Init(self, **kwargs): + """Message constructor.""" + cmessage = kwargs.pop('__cmessage', None) + if cmessage: + self._cmsg = cmessage + else: + self._cmsg = NewCMessage(message_descriptor.full_name) + + # Keep a reference to the owner, as the owner keeps a reference to the + # underlying protocol buffer message. + owner = kwargs.pop('__owner', None) + if owner: + self._owner = owner + + if message_descriptor.is_extendable: + self.Extensions = ExtensionDict(self) + else: + # Reference counting in the C++ code is broken and depends on + # the Extensions reference to keep this object alive during unit + # tests (see b/4856052). Remove this once b/4945904 is fixed. + self._HACK_REFCOUNTS = self + self._composite_fields = {} + + for field_name, field_value in kwargs.iteritems(): + field_cdescriptor = self.__descriptors.get(field_name, None) + if not field_cdescriptor: + raise ValueError('Protocol message has no "%s" field.' % field_name) + if field_cdescriptor.label == _LABEL_REPEATED: + if field_cdescriptor.cpp_type == _CPPTYPE_MESSAGE: + field_name = getattr(self, field_name) + for val in field_value: + field_name.add().MergeFrom(val) + else: + getattr(self, field_name).extend(field_value) + elif field_cdescriptor.cpp_type == _CPPTYPE_MESSAGE: + getattr(self, field_name).MergeFrom(field_value) + else: + setattr(self, field_name, field_value) + + Init.__module__ = None + Init.__doc__ = None + cls.__init__ = Init + + +def _IsMessageSetExtension(field): + """Checks if a field is a message set extension.""" + return (field.is_extension and + field.containing_type.has_options and + field.containing_type.GetOptions().message_set_wire_format and + field.type == _TYPE_MESSAGE and + field.message_type == field.extension_scope and + field.label == _LABEL_OPTIONAL) + + +def _AddMessageMethods(message_descriptor, cls): + """Adds the methods to a protocol message class.""" + if message_descriptor.is_extendable: + + def ClearExtension(self, extension): + self.Extensions.ClearExtension(extension) + + def HasExtension(self, extension): + return self.Extensions.HasExtension(extension) + + def HasField(self, field_name): + return self._cmsg.HasField(field_name) + + def ClearField(self, field_name): + child_cmessage = None + if field_name in self._composite_fields: + child_field = self._composite_fields[field_name] + del self._composite_fields[field_name] + + child_cdescriptor = self.__descriptors[field_name] + # TODO(anuraag): Support clearing repeated message fields as well. + if (child_cdescriptor.label != _LABEL_REPEATED and + child_cdescriptor.cpp_type == _CPPTYPE_MESSAGE): + child_field._owner = None + child_cmessage = child_field._cmsg + + if child_cmessage is not None: + self._cmsg.ClearField(field_name, child_cmessage) + else: + self._cmsg.ClearField(field_name) + + def Clear(self): + cmessages_to_release = [] + for field_name, child_field in self._composite_fields.iteritems(): + child_cdescriptor = self.__descriptors[field_name] + # TODO(anuraag): Support clearing repeated message fields as well. + if (child_cdescriptor.label != _LABEL_REPEATED and + child_cdescriptor.cpp_type == _CPPTYPE_MESSAGE): + child_field._owner = None + cmessages_to_release.append((child_cdescriptor, child_field._cmsg)) + self._composite_fields.clear() + self._cmsg.Clear(cmessages_to_release) + + def IsInitialized(self, errors=None): + if self._cmsg.IsInitialized(): + return True + if errors is not None: + errors.extend(self.FindInitializationErrors()); + return False + + def SerializeToString(self): + if not self.IsInitialized(): + raise message.EncodeError( + 'Message %s is missing required fields: %s' % ( + self._cmsg.full_name, ','.join(self.FindInitializationErrors()))) + return self._cmsg.SerializeToString() + + def SerializePartialToString(self): + return self._cmsg.SerializePartialToString() + + def ParseFromString(self, serialized): + self.Clear() + self.MergeFromString(serialized) + + def MergeFromString(self, serialized): + byte_size = self._cmsg.MergeFromString(serialized) + if byte_size < 0: + raise message.DecodeError('Unable to merge from string.') + return byte_size + + def MergeFrom(self, msg): + if not isinstance(msg, cls): + raise TypeError( + "Parameter to MergeFrom() must be instance of same class: " + "expected %s got %s." % (cls.__name__, type(msg).__name__)) + self._cmsg.MergeFrom(msg._cmsg) + + def CopyFrom(self, msg): + self._cmsg.CopyFrom(msg._cmsg) + + def ByteSize(self): + return self._cmsg.ByteSize() + + def SetInParent(self): + return self._cmsg.SetInParent() + + def ListFields(self): + all_fields = [] + field_list = self._cmsg.ListFields() + fields_by_name = cls.DESCRIPTOR.fields_by_name + for is_extension, field_name in field_list: + if is_extension: + extension = cls._extensions_by_name[field_name] + all_fields.append((extension, self.Extensions[extension])) + else: + field_descriptor = fields_by_name[field_name] + all_fields.append( + (field_descriptor, getattr(self, field_name))) + all_fields.sort(key=lambda item: item[0].number) + return all_fields + + def FindInitializationErrors(self): + return self._cmsg.FindInitializationErrors() + + def __str__(self): + return str(self._cmsg) + + def __eq__(self, other): + if self is other: + return True + if not isinstance(other, self.__class__): + return False + return self.ListFields() == other.ListFields() + + def __ne__(self, other): + return not self == other + + def __hash__(self): + raise TypeError('unhashable object') + + def __unicode__(self): + # Lazy import to prevent circular import when text_format imports this file. + from google.protobuf import text_format + return text_format.MessageToString(self, as_utf8=True).decode('utf-8') + + # Attach the local methods to the message class. + for key, value in locals().copy().iteritems(): + if key not in ('key', 'value', '__builtins__', '__name__', '__doc__'): + setattr(cls, key, value) + + # Static methods: + + def RegisterExtension(extension_handle): + extension_handle.containing_type = cls.DESCRIPTOR + cls._extensions_by_name[extension_handle.full_name] = extension_handle + + if _IsMessageSetExtension(extension_handle): + # MessageSet extension. Also register under type name. + cls._extensions_by_name[ + extension_handle.message_type.full_name] = extension_handle + cls.RegisterExtension = staticmethod(RegisterExtension) + + def FromString(string): + msg = cls() + msg.MergeFromString(string) + return msg + cls.FromString = staticmethod(FromString) + + + +def _AddPropertiesForExtensions(message_descriptor, cls): + """Adds properties for all fields in this protocol message type.""" + extension_dict = message_descriptor.extensions_by_name + for extension_name, extension_field in extension_dict.iteritems(): + constant_name = extension_name.upper() + '_FIELD_NUMBER' + setattr(cls, constant_name, extension_field.number) diff --git a/pythonlib/google/protobuf/internal/decoder.py b/pythonlib/google/protobuf/internal/decoder.py new file mode 100644 index 0000000..651ee0d --- /dev/null +++ b/pythonlib/google/protobuf/internal/decoder.py @@ -0,0 +1,831 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +#PY25 compatible for GAE. +# +# Copyright 2009 Google Inc. All Rights Reserved. + +"""Code for decoding protocol buffer primitives. + +This code is very similar to encoder.py -- read the docs for that module first. + +A "decoder" is a function with the signature: + Decode(buffer, pos, end, message, field_dict) +The arguments are: + buffer: The string containing the encoded message. + pos: The current position in the string. + end: The position in the string where the current message ends. May be + less than len(buffer) if we're reading a sub-message. + message: The message object into which we're parsing. + field_dict: message._fields (avoids a hashtable lookup). +The decoder reads the field and stores it into field_dict, returning the new +buffer position. A decoder for a repeated field may proactively decode all of +the elements of that field, if they appear consecutively. + +Note that decoders may throw any of the following: + IndexError: Indicates a truncated message. + struct.error: Unpacking of a fixed-width field failed. + message.DecodeError: Other errors. + +Decoders are expected to raise an exception if they are called with pos > end. +This allows callers to be lax about bounds checking: it's fineto read past +"end" as long as you are sure that someone else will notice and throw an +exception later on. + +Something up the call stack is expected to catch IndexError and struct.error +and convert them to message.DecodeError. + +Decoders are constructed using decoder constructors with the signature: + MakeDecoder(field_number, is_repeated, is_packed, key, new_default) +The arguments are: + field_number: The field number of the field we want to decode. + is_repeated: Is the field a repeated field? (bool) + is_packed: Is the field a packed field? (bool) + key: The key to use when looking up the field within field_dict. + (This is actually the FieldDescriptor but nothing in this + file should depend on that.) + new_default: A function which takes a message object as a parameter and + returns a new instance of the default value for this field. + (This is called for repeated fields and sub-messages, when an + instance does not already exist.) + +As with encoders, we define a decoder constructor for every type of field. +Then, for every field of every message class we construct an actual decoder. +That decoder goes into a dict indexed by tag, so when we decode a message +we repeatedly read a tag, look up the corresponding decoder, and invoke it. +""" + +__author__ = 'kenton@google.com (Kenton Varda)' + +import struct +import sys ##PY25 +_PY2 = sys.version_info[0] < 3 ##PY25 +from google.protobuf.internal import encoder +from google.protobuf.internal import wire_format +from google.protobuf import message + + +# This will overflow and thus become IEEE-754 "infinity". We would use +# "float('inf')" but it doesn't work on Windows pre-Python-2.6. +_POS_INF = 1e10000 +_NEG_INF = -_POS_INF +_NAN = _POS_INF * 0 + + +# This is not for optimization, but rather to avoid conflicts with local +# variables named "message". +_DecodeError = message.DecodeError + + +def _VarintDecoder(mask, result_type): + """Return an encoder for a basic varint value (does not include tag). + + Decoded values will be bitwise-anded with the given mask before being + returned, e.g. to limit them to 32 bits. The returned decoder does not + take the usual "end" parameter -- the caller is expected to do bounds checking + after the fact (often the caller can defer such checking until later). The + decoder returns a (value, new_pos) pair. + """ + + local_ord = ord + py2 = _PY2 ##PY25 +##!PY25 py2 = str is bytes + def DecodeVarint(buffer, pos): + result = 0 + shift = 0 + while 1: + b = local_ord(buffer[pos]) if py2 else buffer[pos] + result |= ((b & 0x7f) << shift) + pos += 1 + if not (b & 0x80): + result &= mask + result = result_type(result) + return (result, pos) + shift += 7 + if shift >= 64: + raise _DecodeError('Too many bytes when decoding varint.') + return DecodeVarint + + +def _SignedVarintDecoder(mask, result_type): + """Like _VarintDecoder() but decodes signed values.""" + + local_ord = ord + py2 = _PY2 ##PY25 +##!PY25 py2 = str is bytes + def DecodeVarint(buffer, pos): + result = 0 + shift = 0 + while 1: + b = local_ord(buffer[pos]) if py2 else buffer[pos] + result |= ((b & 0x7f) << shift) + pos += 1 + if not (b & 0x80): + if result > 0x7fffffffffffffff: + result -= (1 << 64) + result |= ~mask + else: + result &= mask + result = result_type(result) + return (result, pos) + shift += 7 + if shift >= 64: + raise _DecodeError('Too many bytes when decoding varint.') + return DecodeVarint + +# We force 32-bit values to int and 64-bit values to long to make +# alternate implementations where the distinction is more significant +# (e.g. the C++ implementation) simpler. + +_DecodeVarint = _VarintDecoder((1 << 64) - 1, long) +_DecodeSignedVarint = _SignedVarintDecoder((1 << 64) - 1, long) + +# Use these versions for values which must be limited to 32 bits. +_DecodeVarint32 = _VarintDecoder((1 << 32) - 1, int) +_DecodeSignedVarint32 = _SignedVarintDecoder((1 << 32) - 1, int) + + +def ReadTag(buffer, pos): + """Read a tag from the buffer, and return a (tag_bytes, new_pos) tuple. + + We return the raw bytes of the tag rather than decoding them. The raw + bytes can then be used to look up the proper decoder. This effectively allows + us to trade some work that would be done in pure-python (decoding a varint) + for work that is done in C (searching for a byte string in a hash table). + In a low-level language it would be much cheaper to decode the varint and + use that, but not in Python. + """ + + py2 = _PY2 ##PY25 +##!PY25 py2 = str is bytes + start = pos + while (ord(buffer[pos]) if py2 else buffer[pos]) & 0x80: + pos += 1 + pos += 1 + return (buffer[start:pos], pos) + + +# -------------------------------------------------------------------- + + +def _SimpleDecoder(wire_type, decode_value): + """Return a constructor for a decoder for fields of a particular type. + + Args: + wire_type: The field's wire type. + decode_value: A function which decodes an individual value, e.g. + _DecodeVarint() + """ + + def SpecificDecoder(field_number, is_repeated, is_packed, key, new_default): + if is_packed: + local_DecodeVarint = _DecodeVarint + def DecodePackedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + (endpoint, pos) = local_DecodeVarint(buffer, pos) + endpoint += pos + if endpoint > end: + raise _DecodeError('Truncated message.') + while pos < endpoint: + (element, pos) = decode_value(buffer, pos) + value.append(element) + if pos > endpoint: + del value[-1] # Discard corrupt value. + raise _DecodeError('Packed element was truncated.') + return pos + return DecodePackedField + elif is_repeated: + tag_bytes = encoder.TagBytes(field_number, wire_type) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + (element, new_pos) = decode_value(buffer, pos) + value.append(element) + # Predict that the next tag is another copy of the same repeated + # field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos >= end: + # Prediction failed. Return. + if new_pos > end: + raise _DecodeError('Truncated message.') + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + (field_dict[key], pos) = decode_value(buffer, pos) + if pos > end: + del field_dict[key] # Discard corrupt value. + raise _DecodeError('Truncated message.') + return pos + return DecodeField + + return SpecificDecoder + + +def _ModifiedDecoder(wire_type, decode_value, modify_value): + """Like SimpleDecoder but additionally invokes modify_value on every value + before storing it. Usually modify_value is ZigZagDecode. + """ + + # Reusing _SimpleDecoder is slightly slower than copying a bunch of code, but + # not enough to make a significant difference. + + def InnerDecode(buffer, pos): + (result, new_pos) = decode_value(buffer, pos) + return (modify_value(result), new_pos) + return _SimpleDecoder(wire_type, InnerDecode) + + +def _StructPackDecoder(wire_type, format): + """Return a constructor for a decoder for a fixed-width field. + + Args: + wire_type: The field's wire type. + format: The format string to pass to struct.unpack(). + """ + + value_size = struct.calcsize(format) + local_unpack = struct.unpack + + # Reusing _SimpleDecoder is slightly slower than copying a bunch of code, but + # not enough to make a significant difference. + + # Note that we expect someone up-stack to catch struct.error and convert + # it to _DecodeError -- this way we don't have to set up exception- + # handling blocks every time we parse one value. + + def InnerDecode(buffer, pos): + new_pos = pos + value_size + result = local_unpack(format, buffer[pos:new_pos])[0] + return (result, new_pos) + return _SimpleDecoder(wire_type, InnerDecode) + + +def _FloatDecoder(): + """Returns a decoder for a float field. + + This code works around a bug in struct.unpack for non-finite 32-bit + floating-point values. + """ + + local_unpack = struct.unpack + b = (lambda x:x) if _PY2 else lambda x:x.encode('latin1') ##PY25 + + def InnerDecode(buffer, pos): + # We expect a 32-bit value in little-endian byte order. Bit 1 is the sign + # bit, bits 2-9 represent the exponent, and bits 10-32 are the significand. + new_pos = pos + 4 + float_bytes = buffer[pos:new_pos] + + # If this value has all its exponent bits set, then it's non-finite. + # In Python 2.4, struct.unpack will convert it to a finite 64-bit value. + # To avoid that, we parse it specially. + if ((float_bytes[3:4] in b('\x7F\xFF')) ##PY25 +##!PY25 if ((float_bytes[3:4] in b'\x7F\xFF') + and (float_bytes[2:3] >= b('\x80'))): ##PY25 +##!PY25 and (float_bytes[2:3] >= b'\x80')): + # If at least one significand bit is set... + if float_bytes[0:3] != b('\x00\x00\x80'): ##PY25 +##!PY25 if float_bytes[0:3] != b'\x00\x00\x80': + return (_NAN, new_pos) + # If sign bit is set... + if float_bytes[3:4] == b('\xFF'): ##PY25 +##!PY25 if float_bytes[3:4] == b'\xFF': + return (_NEG_INF, new_pos) + return (_POS_INF, new_pos) + + # Note that we expect someone up-stack to catch struct.error and convert + # it to _DecodeError -- this way we don't have to set up exception- + # handling blocks every time we parse one value. + result = local_unpack('= b'\xF0') +##!PY25 and (double_bytes[0:7] != b'\x00\x00\x00\x00\x00\x00\xF0')): + if ((double_bytes[7:8] in b('\x7F\xFF')) ##PY25 + and (double_bytes[6:7] >= b('\xF0')) ##PY25 + and (double_bytes[0:7] != b('\x00\x00\x00\x00\x00\x00\xF0'))): ##PY25 + return (_NAN, new_pos) + + # Note that we expect someone up-stack to catch struct.error and convert + # it to _DecodeError -- this way we don't have to set up exception- + # handling blocks every time we parse one value. + result = local_unpack(' end: + raise _DecodeError('Truncated message.') + while pos < endpoint: + value_start_pos = pos + (element, pos) = _DecodeSignedVarint32(buffer, pos) + if element in enum_type.values_by_number: + value.append(element) + else: + if not message._unknown_fields: + message._unknown_fields = [] + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_VARINT) + message._unknown_fields.append( + (tag_bytes, buffer[value_start_pos:pos])) + if pos > endpoint: + if element in enum_type.values_by_number: + del value[-1] # Discard corrupt value. + else: + del message._unknown_fields[-1] + raise _DecodeError('Packed element was truncated.') + return pos + return DecodePackedField + elif is_repeated: + tag_bytes = encoder.TagBytes(field_number, wire_format.WIRETYPE_VARINT) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + (element, new_pos) = _DecodeSignedVarint32(buffer, pos) + if element in enum_type.values_by_number: + value.append(element) + else: + if not message._unknown_fields: + message._unknown_fields = [] + message._unknown_fields.append( + (tag_bytes, buffer[pos:new_pos])) + # Predict that the next tag is another copy of the same repeated + # field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos >= end: + # Prediction failed. Return. + if new_pos > end: + raise _DecodeError('Truncated message.') + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + value_start_pos = pos + (enum_value, pos) = _DecodeSignedVarint32(buffer, pos) + if pos > end: + raise _DecodeError('Truncated message.') + if enum_value in enum_type.values_by_number: + field_dict[key] = enum_value + else: + if not message._unknown_fields: + message._unknown_fields = [] + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_VARINT) + message._unknown_fields.append( + (tag_bytes, buffer[value_start_pos:pos])) + return pos + return DecodeField + + +# -------------------------------------------------------------------- + + +Int32Decoder = _SimpleDecoder( + wire_format.WIRETYPE_VARINT, _DecodeSignedVarint32) + +Int64Decoder = _SimpleDecoder( + wire_format.WIRETYPE_VARINT, _DecodeSignedVarint) + +UInt32Decoder = _SimpleDecoder(wire_format.WIRETYPE_VARINT, _DecodeVarint32) +UInt64Decoder = _SimpleDecoder(wire_format.WIRETYPE_VARINT, _DecodeVarint) + +SInt32Decoder = _ModifiedDecoder( + wire_format.WIRETYPE_VARINT, _DecodeVarint32, wire_format.ZigZagDecode) +SInt64Decoder = _ModifiedDecoder( + wire_format.WIRETYPE_VARINT, _DecodeVarint, wire_format.ZigZagDecode) + +# Note that Python conveniently guarantees that when using the '<' prefix on +# formats, they will also have the same size across all platforms (as opposed +# to without the prefix, where their sizes depend on the C compiler's basic +# type sizes). +Fixed32Decoder = _StructPackDecoder(wire_format.WIRETYPE_FIXED32, ' end: + raise _DecodeError('Truncated string.') + value.append(_ConvertToUnicode(buffer[pos:new_pos])) + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated string.') + field_dict[key] = _ConvertToUnicode(buffer[pos:new_pos]) + return new_pos + return DecodeField + + +def BytesDecoder(field_number, is_repeated, is_packed, key, new_default): + """Returns a decoder for a bytes field.""" + + local_DecodeVarint = _DecodeVarint + + assert not is_packed + if is_repeated: + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_LENGTH_DELIMITED) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated string.') + value.append(buffer[pos:new_pos]) + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated string.') + field_dict[key] = buffer[pos:new_pos] + return new_pos + return DecodeField + + +def GroupDecoder(field_number, is_repeated, is_packed, key, new_default): + """Returns a decoder for a group field.""" + + end_tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_END_GROUP) + end_tag_len = len(end_tag_bytes) + + assert not is_packed + if is_repeated: + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_START_GROUP) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read sub-message. + pos = value.add()._InternalParse(buffer, pos, end) + # Read end tag. + new_pos = pos+end_tag_len + if buffer[pos:new_pos] != end_tag_bytes or new_pos > end: + raise _DecodeError('Missing group end tag.') + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read sub-message. + pos = value._InternalParse(buffer, pos, end) + # Read end tag. + new_pos = pos+end_tag_len + if buffer[pos:new_pos] != end_tag_bytes or new_pos > end: + raise _DecodeError('Missing group end tag.') + return new_pos + return DecodeField + + +def MessageDecoder(field_number, is_repeated, is_packed, key, new_default): + """Returns a decoder for a message field.""" + + local_DecodeVarint = _DecodeVarint + + assert not is_packed + if is_repeated: + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_LENGTH_DELIMITED) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read length. + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated message.') + # Read sub-message. + if value.add()._InternalParse(buffer, pos, new_pos) != new_pos: + # The only reason _InternalParse would return early is if it + # encountered an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read length. + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated message.') + # Read sub-message. + if value._InternalParse(buffer, pos, new_pos) != new_pos: + # The only reason _InternalParse would return early is if it encountered + # an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + return new_pos + return DecodeField + + +# -------------------------------------------------------------------- + +MESSAGE_SET_ITEM_TAG = encoder.TagBytes(1, wire_format.WIRETYPE_START_GROUP) + +def MessageSetItemDecoder(extensions_by_number): + """Returns a decoder for a MessageSet item. + + The parameter is the _extensions_by_number map for the message class. + + The message set message looks like this: + message MessageSet { + repeated group Item = 1 { + required int32 type_id = 2; + required string message = 3; + } + } + """ + + type_id_tag_bytes = encoder.TagBytes(2, wire_format.WIRETYPE_VARINT) + message_tag_bytes = encoder.TagBytes(3, wire_format.WIRETYPE_LENGTH_DELIMITED) + item_end_tag_bytes = encoder.TagBytes(1, wire_format.WIRETYPE_END_GROUP) + + local_ReadTag = ReadTag + local_DecodeVarint = _DecodeVarint + local_SkipField = SkipField + + def DecodeItem(buffer, pos, end, message, field_dict): + message_set_item_start = pos + type_id = -1 + message_start = -1 + message_end = -1 + + # Technically, type_id and message can appear in any order, so we need + # a little loop here. + while 1: + (tag_bytes, pos) = local_ReadTag(buffer, pos) + if tag_bytes == type_id_tag_bytes: + (type_id, pos) = local_DecodeVarint(buffer, pos) + elif tag_bytes == message_tag_bytes: + (size, message_start) = local_DecodeVarint(buffer, pos) + pos = message_end = message_start + size + elif tag_bytes == item_end_tag_bytes: + break + else: + pos = SkipField(buffer, pos, end, tag_bytes) + if pos == -1: + raise _DecodeError('Missing group end tag.') + + if pos > end: + raise _DecodeError('Truncated message.') + + if type_id == -1: + raise _DecodeError('MessageSet item missing type_id.') + if message_start == -1: + raise _DecodeError('MessageSet item missing message.') + + extension = extensions_by_number.get(type_id) + if extension is not None: + value = field_dict.get(extension) + if value is None: + value = field_dict.setdefault( + extension, extension.message_type._concrete_class()) + if value._InternalParse(buffer, message_start,message_end) != message_end: + # The only reason _InternalParse would return early is if it encountered + # an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + else: + if not message._unknown_fields: + message._unknown_fields = [] + message._unknown_fields.append((MESSAGE_SET_ITEM_TAG, + buffer[message_set_item_start:pos])) + + return pos + + return DecodeItem + +# -------------------------------------------------------------------- +# Optimization is not as heavy here because calls to SkipField() are rare, +# except for handling end-group tags. + +def _SkipVarint(buffer, pos, end): + """Skip a varint value. Returns the new position.""" + # Previously ord(buffer[pos]) raised IndexError when pos is out of range. + # With this code, ord(b'') raises TypeError. Both are handled in + # python_message.py to generate a 'Truncated message' error. + while ord(buffer[pos:pos+1]) & 0x80: + pos += 1 + pos += 1 + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _SkipFixed64(buffer, pos, end): + """Skip a fixed64 value. Returns the new position.""" + + pos += 8 + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _SkipLengthDelimited(buffer, pos, end): + """Skip a length-delimited value. Returns the new position.""" + + (size, pos) = _DecodeVarint(buffer, pos) + pos += size + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _SkipGroup(buffer, pos, end): + """Skip sub-group. Returns the new position.""" + + while 1: + (tag_bytes, pos) = ReadTag(buffer, pos) + new_pos = SkipField(buffer, pos, end, tag_bytes) + if new_pos == -1: + return pos + pos = new_pos + +def _EndGroup(buffer, pos, end): + """Skipping an END_GROUP tag returns -1 to tell the parent loop to break.""" + + return -1 + +def _SkipFixed32(buffer, pos, end): + """Skip a fixed32 value. Returns the new position.""" + + pos += 4 + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _RaiseInvalidWireType(buffer, pos, end): + """Skip function for unknown wire types. Raises an exception.""" + + raise _DecodeError('Tag had invalid wire type.') + +def _FieldSkipper(): + """Constructs the SkipField function.""" + + WIRETYPE_TO_SKIPPER = [ + _SkipVarint, + _SkipFixed64, + _SkipLengthDelimited, + _SkipGroup, + _EndGroup, + _SkipFixed32, + _RaiseInvalidWireType, + _RaiseInvalidWireType, + ] + + wiretype_mask = wire_format.TAG_TYPE_MASK + + def SkipField(buffer, pos, end, tag_bytes): + """Skips a field with the specified tag. + + |pos| should point to the byte immediately after the tag. + + Returns: + The new position (after the tag value), or -1 if the tag is an end-group + tag (in which case the calling loop should break). + """ + + # The wire type is always in the first byte since varints are little-endian. + wire_type = ord(tag_bytes[0:1]) & wiretype_mask + return WIRETYPE_TO_SKIPPER[wire_type](buffer, pos, end) + + return SkipField + +SkipField = _FieldSkipper() diff --git a/pythonlib/google/protobuf/internal/descriptor_database_test.py b/pythonlib/google/protobuf/internal/descriptor_database_test.py new file mode 100644 index 0000000..856f472 --- /dev/null +++ b/pythonlib/google/protobuf/internal/descriptor_database_test.py @@ -0,0 +1,63 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Tests for google.protobuf.descriptor_database.""" + +__author__ = 'matthewtoia@google.com (Matt Toia)' + +from google.apputils import basetest +from google.protobuf import descriptor_pb2 +from google.protobuf.internal import factory_test2_pb2 +from google.protobuf import descriptor_database + + +class DescriptorDatabaseTest(basetest.TestCase): + + def testAdd(self): + db = descriptor_database.DescriptorDatabase() + file_desc_proto = descriptor_pb2.FileDescriptorProto.FromString( + factory_test2_pb2.DESCRIPTOR.serialized_pb) + db.Add(file_desc_proto) + + self.assertEquals(file_desc_proto, db.FindFileByName( + 'google/protobuf/internal/factory_test2.proto')) + self.assertEquals(file_desc_proto, db.FindFileContainingSymbol( + 'google.protobuf.python.internal.Factory2Message')) + self.assertEquals(file_desc_proto, db.FindFileContainingSymbol( + 'google.protobuf.python.internal.Factory2Message.NestedFactory2Message')) + self.assertEquals(file_desc_proto, db.FindFileContainingSymbol( + 'google.protobuf.python.internal.Factory2Enum')) + self.assertEquals(file_desc_proto, db.FindFileContainingSymbol( + 'google.protobuf.python.internal.Factory2Message.NestedFactory2Enum')) + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/internal/descriptor_pool_test.py b/pythonlib/google/protobuf/internal/descriptor_pool_test.py new file mode 100644 index 0000000..7c1ce2e --- /dev/null +++ b/pythonlib/google/protobuf/internal/descriptor_pool_test.py @@ -0,0 +1,564 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Tests for google.protobuf.descriptor_pool.""" + +__author__ = 'matthewtoia@google.com (Matt Toia)' + +import os +import unittest + +from google.apputils import basetest +from google.protobuf import unittest_pb2 +from google.protobuf import descriptor_pb2 +from google.protobuf.internal import api_implementation +from google.protobuf.internal import descriptor_pool_test1_pb2 +from google.protobuf.internal import descriptor_pool_test2_pb2 +from google.protobuf.internal import factory_test1_pb2 +from google.protobuf.internal import factory_test2_pb2 +from google.protobuf import descriptor +from google.protobuf import descriptor_database +from google.protobuf import descriptor_pool + + +class DescriptorPoolTest(basetest.TestCase): + + def setUp(self): + self.pool = descriptor_pool.DescriptorPool() + self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString( + factory_test1_pb2.DESCRIPTOR.serialized_pb) + self.factory_test2_fd = descriptor_pb2.FileDescriptorProto.FromString( + factory_test2_pb2.DESCRIPTOR.serialized_pb) + self.pool.Add(self.factory_test1_fd) + self.pool.Add(self.factory_test2_fd) + + def testFindFileByName(self): + name1 = 'google/protobuf/internal/factory_test1.proto' + file_desc1 = self.pool.FindFileByName(name1) + self.assertIsInstance(file_desc1, descriptor.FileDescriptor) + self.assertEquals(name1, file_desc1.name) + self.assertEquals('google.protobuf.python.internal', file_desc1.package) + self.assertIn('Factory1Message', file_desc1.message_types_by_name) + + name2 = 'google/protobuf/internal/factory_test2.proto' + file_desc2 = self.pool.FindFileByName(name2) + self.assertIsInstance(file_desc2, descriptor.FileDescriptor) + self.assertEquals(name2, file_desc2.name) + self.assertEquals('google.protobuf.python.internal', file_desc2.package) + self.assertIn('Factory2Message', file_desc2.message_types_by_name) + + def testFindFileByNameFailure(self): + with self.assertRaises(KeyError): + self.pool.FindFileByName('Does not exist') + + def testFindFileContainingSymbol(self): + file_desc1 = self.pool.FindFileContainingSymbol( + 'google.protobuf.python.internal.Factory1Message') + self.assertIsInstance(file_desc1, descriptor.FileDescriptor) + self.assertEquals('google/protobuf/internal/factory_test1.proto', + file_desc1.name) + self.assertEquals('google.protobuf.python.internal', file_desc1.package) + self.assertIn('Factory1Message', file_desc1.message_types_by_name) + + file_desc2 = self.pool.FindFileContainingSymbol( + 'google.protobuf.python.internal.Factory2Message') + self.assertIsInstance(file_desc2, descriptor.FileDescriptor) + self.assertEquals('google/protobuf/internal/factory_test2.proto', + file_desc2.name) + self.assertEquals('google.protobuf.python.internal', file_desc2.package) + self.assertIn('Factory2Message', file_desc2.message_types_by_name) + + def testFindFileContainingSymbolFailure(self): + with self.assertRaises(KeyError): + self.pool.FindFileContainingSymbol('Does not exist') + + def testFindMessageTypeByName(self): + msg1 = self.pool.FindMessageTypeByName( + 'google.protobuf.python.internal.Factory1Message') + self.assertIsInstance(msg1, descriptor.Descriptor) + self.assertEquals('Factory1Message', msg1.name) + self.assertEquals('google.protobuf.python.internal.Factory1Message', + msg1.full_name) + self.assertEquals(None, msg1.containing_type) + + nested_msg1 = msg1.nested_types[0] + self.assertEquals('NestedFactory1Message', nested_msg1.name) + self.assertEquals(msg1, nested_msg1.containing_type) + + nested_enum1 = msg1.enum_types[0] + self.assertEquals('NestedFactory1Enum', nested_enum1.name) + self.assertEquals(msg1, nested_enum1.containing_type) + + self.assertEquals(nested_msg1, msg1.fields_by_name[ + 'nested_factory_1_message'].message_type) + self.assertEquals(nested_enum1, msg1.fields_by_name[ + 'nested_factory_1_enum'].enum_type) + + msg2 = self.pool.FindMessageTypeByName( + 'google.protobuf.python.internal.Factory2Message') + self.assertIsInstance(msg2, descriptor.Descriptor) + self.assertEquals('Factory2Message', msg2.name) + self.assertEquals('google.protobuf.python.internal.Factory2Message', + msg2.full_name) + self.assertIsNone(msg2.containing_type) + + nested_msg2 = msg2.nested_types[0] + self.assertEquals('NestedFactory2Message', nested_msg2.name) + self.assertEquals(msg2, nested_msg2.containing_type) + + nested_enum2 = msg2.enum_types[0] + self.assertEquals('NestedFactory2Enum', nested_enum2.name) + self.assertEquals(msg2, nested_enum2.containing_type) + + self.assertEquals(nested_msg2, msg2.fields_by_name[ + 'nested_factory_2_message'].message_type) + self.assertEquals(nested_enum2, msg2.fields_by_name[ + 'nested_factory_2_enum'].enum_type) + + self.assertTrue(msg2.fields_by_name['int_with_default'].has_default_value) + self.assertEquals( + 1776, msg2.fields_by_name['int_with_default'].default_value) + + self.assertTrue( + msg2.fields_by_name['double_with_default'].has_default_value) + self.assertEquals( + 9.99, msg2.fields_by_name['double_with_default'].default_value) + + self.assertTrue( + msg2.fields_by_name['string_with_default'].has_default_value) + self.assertEquals( + 'hello world', msg2.fields_by_name['string_with_default'].default_value) + + self.assertTrue(msg2.fields_by_name['bool_with_default'].has_default_value) + self.assertFalse(msg2.fields_by_name['bool_with_default'].default_value) + + self.assertTrue(msg2.fields_by_name['enum_with_default'].has_default_value) + self.assertEquals( + 1, msg2.fields_by_name['enum_with_default'].default_value) + + msg3 = self.pool.FindMessageTypeByName( + 'google.protobuf.python.internal.Factory2Message.NestedFactory2Message') + self.assertEquals(nested_msg2, msg3) + + self.assertTrue(msg2.fields_by_name['bytes_with_default'].has_default_value) + self.assertEquals( + b'a\xfb\x00c', + msg2.fields_by_name['bytes_with_default'].default_value) + + self.assertEqual(1, len(msg2.oneofs)) + self.assertEqual(1, len(msg2.oneofs_by_name)) + self.assertEqual(2, len(msg2.oneofs[0].fields)) + for name in ['oneof_int', 'oneof_string']: + self.assertEqual(msg2.oneofs[0], + msg2.fields_by_name[name].containing_oneof) + self.assertIn(msg2.fields_by_name[name], msg2.oneofs[0].fields) + + def testFindMessageTypeByNameFailure(self): + with self.assertRaises(KeyError): + self.pool.FindMessageTypeByName('Does not exist') + + def testFindEnumTypeByName(self): + enum1 = self.pool.FindEnumTypeByName( + 'google.protobuf.python.internal.Factory1Enum') + self.assertIsInstance(enum1, descriptor.EnumDescriptor) + self.assertEquals(0, enum1.values_by_name['FACTORY_1_VALUE_0'].number) + self.assertEquals(1, enum1.values_by_name['FACTORY_1_VALUE_1'].number) + + nested_enum1 = self.pool.FindEnumTypeByName( + 'google.protobuf.python.internal.Factory1Message.NestedFactory1Enum') + self.assertIsInstance(nested_enum1, descriptor.EnumDescriptor) + self.assertEquals( + 0, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_0'].number) + self.assertEquals( + 1, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_1'].number) + + enum2 = self.pool.FindEnumTypeByName( + 'google.protobuf.python.internal.Factory2Enum') + self.assertIsInstance(enum2, descriptor.EnumDescriptor) + self.assertEquals(0, enum2.values_by_name['FACTORY_2_VALUE_0'].number) + self.assertEquals(1, enum2.values_by_name['FACTORY_2_VALUE_1'].number) + + nested_enum2 = self.pool.FindEnumTypeByName( + 'google.protobuf.python.internal.Factory2Message.NestedFactory2Enum') + self.assertIsInstance(nested_enum2, descriptor.EnumDescriptor) + self.assertEquals( + 0, nested_enum2.values_by_name['NESTED_FACTORY_2_VALUE_0'].number) + self.assertEquals( + 1, nested_enum2.values_by_name['NESTED_FACTORY_2_VALUE_1'].number) + + def testFindEnumTypeByNameFailure(self): + with self.assertRaises(KeyError): + self.pool.FindEnumTypeByName('Does not exist') + + def testUserDefinedDB(self): + db = descriptor_database.DescriptorDatabase() + self.pool = descriptor_pool.DescriptorPool(db) + db.Add(self.factory_test1_fd) + db.Add(self.factory_test2_fd) + self.testFindMessageTypeByName() + + def testComplexNesting(self): + test1_desc = descriptor_pb2.FileDescriptorProto.FromString( + descriptor_pool_test1_pb2.DESCRIPTOR.serialized_pb) + test2_desc = descriptor_pb2.FileDescriptorProto.FromString( + descriptor_pool_test2_pb2.DESCRIPTOR.serialized_pb) + self.pool.Add(test1_desc) + self.pool.Add(test2_desc) + TEST1_FILE.CheckFile(self, self.pool) + TEST2_FILE.CheckFile(self, self.pool) + + + +class ProtoFile(object): + + def __init__(self, name, package, messages, dependencies=None): + self.name = name + self.package = package + self.messages = messages + self.dependencies = dependencies or [] + + def CheckFile(self, test, pool): + file_desc = pool.FindFileByName(self.name) + test.assertEquals(self.name, file_desc.name) + test.assertEquals(self.package, file_desc.package) + dependencies_names = [f.name for f in file_desc.dependencies] + test.assertEqual(self.dependencies, dependencies_names) + for name, msg_type in self.messages.items(): + msg_type.CheckType(test, None, name, file_desc) + + +class EnumType(object): + + def __init__(self, values): + self.values = values + + def CheckType(self, test, msg_desc, name, file_desc): + enum_desc = msg_desc.enum_types_by_name[name] + test.assertEqual(name, enum_desc.name) + expected_enum_full_name = '.'.join([msg_desc.full_name, name]) + test.assertEqual(expected_enum_full_name, enum_desc.full_name) + test.assertEqual(msg_desc, enum_desc.containing_type) + test.assertEqual(file_desc, enum_desc.file) + for index, (value, number) in enumerate(self.values): + value_desc = enum_desc.values_by_name[value] + test.assertEqual(value, value_desc.name) + test.assertEqual(index, value_desc.index) + test.assertEqual(number, value_desc.number) + test.assertEqual(enum_desc, value_desc.type) + test.assertIn(value, msg_desc.enum_values_by_name) + + +class MessageType(object): + + def __init__(self, type_dict, field_list, is_extendable=False, + extensions=None): + self.type_dict = type_dict + self.field_list = field_list + self.is_extendable = is_extendable + self.extensions = extensions or [] + + def CheckType(self, test, containing_type_desc, name, file_desc): + if containing_type_desc is None: + desc = file_desc.message_types_by_name[name] + expected_full_name = '.'.join([file_desc.package, name]) + else: + desc = containing_type_desc.nested_types_by_name[name] + expected_full_name = '.'.join([containing_type_desc.full_name, name]) + + test.assertEqual(name, desc.name) + test.assertEqual(expected_full_name, desc.full_name) + test.assertEqual(containing_type_desc, desc.containing_type) + test.assertEqual(desc.file, file_desc) + test.assertEqual(self.is_extendable, desc.is_extendable) + for name, subtype in self.type_dict.items(): + subtype.CheckType(test, desc, name, file_desc) + + for index, (name, field) in enumerate(self.field_list): + field.CheckField(test, desc, name, index) + + for index, (name, field) in enumerate(self.extensions): + field.CheckField(test, desc, name, index) + + +class EnumField(object): + + def __init__(self, number, type_name, default_value): + self.number = number + self.type_name = type_name + self.default_value = default_value + + def CheckField(self, test, msg_desc, name, index): + field_desc = msg_desc.fields_by_name[name] + enum_desc = msg_desc.enum_types_by_name[self.type_name] + test.assertEqual(name, field_desc.name) + expected_field_full_name = '.'.join([msg_desc.full_name, name]) + test.assertEqual(expected_field_full_name, field_desc.full_name) + test.assertEqual(index, field_desc.index) + test.assertEqual(self.number, field_desc.number) + test.assertEqual(descriptor.FieldDescriptor.TYPE_ENUM, field_desc.type) + test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_ENUM, + field_desc.cpp_type) + test.assertTrue(field_desc.has_default_value) + test.assertEqual(enum_desc.values_by_name[self.default_value].index, + field_desc.default_value) + test.assertEqual(msg_desc, field_desc.containing_type) + test.assertEqual(enum_desc, field_desc.enum_type) + + +class MessageField(object): + + def __init__(self, number, type_name): + self.number = number + self.type_name = type_name + + def CheckField(self, test, msg_desc, name, index): + field_desc = msg_desc.fields_by_name[name] + field_type_desc = msg_desc.nested_types_by_name[self.type_name] + test.assertEqual(name, field_desc.name) + expected_field_full_name = '.'.join([msg_desc.full_name, name]) + test.assertEqual(expected_field_full_name, field_desc.full_name) + test.assertEqual(index, field_desc.index) + test.assertEqual(self.number, field_desc.number) + test.assertEqual(descriptor.FieldDescriptor.TYPE_MESSAGE, field_desc.type) + test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_MESSAGE, + field_desc.cpp_type) + test.assertFalse(field_desc.has_default_value) + test.assertEqual(msg_desc, field_desc.containing_type) + test.assertEqual(field_type_desc, field_desc.message_type) + + +class StringField(object): + + def __init__(self, number, default_value): + self.number = number + self.default_value = default_value + + def CheckField(self, test, msg_desc, name, index): + field_desc = msg_desc.fields_by_name[name] + test.assertEqual(name, field_desc.name) + expected_field_full_name = '.'.join([msg_desc.full_name, name]) + test.assertEqual(expected_field_full_name, field_desc.full_name) + test.assertEqual(index, field_desc.index) + test.assertEqual(self.number, field_desc.number) + test.assertEqual(descriptor.FieldDescriptor.TYPE_STRING, field_desc.type) + test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_STRING, + field_desc.cpp_type) + test.assertTrue(field_desc.has_default_value) + test.assertEqual(self.default_value, field_desc.default_value) + + +class ExtensionField(object): + + def __init__(self, number, extended_type): + self.number = number + self.extended_type = extended_type + + def CheckField(self, test, msg_desc, name, index): + field_desc = msg_desc.extensions_by_name[name] + test.assertEqual(name, field_desc.name) + expected_field_full_name = '.'.join([msg_desc.full_name, name]) + test.assertEqual(expected_field_full_name, field_desc.full_name) + test.assertEqual(self.number, field_desc.number) + test.assertEqual(index, field_desc.index) + test.assertEqual(descriptor.FieldDescriptor.TYPE_MESSAGE, field_desc.type) + test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_MESSAGE, + field_desc.cpp_type) + test.assertFalse(field_desc.has_default_value) + test.assertTrue(field_desc.is_extension) + test.assertEqual(msg_desc, field_desc.extension_scope) + test.assertEqual(msg_desc, field_desc.message_type) + test.assertEqual(self.extended_type, field_desc.containing_type.name) + + +class AddDescriptorTest(basetest.TestCase): + + def _TestMessage(self, prefix): + pool = descriptor_pool.DescriptorPool() + pool.AddDescriptor(unittest_pb2.TestAllTypes.DESCRIPTOR) + self.assertEquals( + 'protobuf_unittest.TestAllTypes', + pool.FindMessageTypeByName( + prefix + 'protobuf_unittest.TestAllTypes').full_name) + + # AddDescriptor is not recursive. + with self.assertRaises(KeyError): + pool.FindMessageTypeByName( + prefix + 'protobuf_unittest.TestAllTypes.NestedMessage') + + pool.AddDescriptor(unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR) + self.assertEquals( + 'protobuf_unittest.TestAllTypes.NestedMessage', + pool.FindMessageTypeByName( + prefix + 'protobuf_unittest.TestAllTypes.NestedMessage').full_name) + + # Files are implicitly also indexed when messages are added. + self.assertEquals( + 'google/protobuf/unittest.proto', + pool.FindFileByName( + 'google/protobuf/unittest.proto').name) + + self.assertEquals( + 'google/protobuf/unittest.proto', + pool.FindFileContainingSymbol( + prefix + 'protobuf_unittest.TestAllTypes.NestedMessage').name) + + def testMessage(self): + self._TestMessage('') + self._TestMessage('.') + + def _TestEnum(self, prefix): + pool = descriptor_pool.DescriptorPool() + pool.AddEnumDescriptor(unittest_pb2.ForeignEnum.DESCRIPTOR) + self.assertEquals( + 'protobuf_unittest.ForeignEnum', + pool.FindEnumTypeByName( + prefix + 'protobuf_unittest.ForeignEnum').full_name) + + # AddEnumDescriptor is not recursive. + with self.assertRaises(KeyError): + pool.FindEnumTypeByName( + prefix + 'protobuf_unittest.ForeignEnum.NestedEnum') + + pool.AddEnumDescriptor(unittest_pb2.TestAllTypes.NestedEnum.DESCRIPTOR) + self.assertEquals( + 'protobuf_unittest.TestAllTypes.NestedEnum', + pool.FindEnumTypeByName( + prefix + 'protobuf_unittest.TestAllTypes.NestedEnum').full_name) + + # Files are implicitly also indexed when enums are added. + self.assertEquals( + 'google/protobuf/unittest.proto', + pool.FindFileByName( + 'google/protobuf/unittest.proto').name) + + self.assertEquals( + 'google/protobuf/unittest.proto', + pool.FindFileContainingSymbol( + prefix + 'protobuf_unittest.TestAllTypes.NestedEnum').name) + + def testEnum(self): + self._TestEnum('') + self._TestEnum('.') + + def testFile(self): + pool = descriptor_pool.DescriptorPool() + pool.AddFileDescriptor(unittest_pb2.DESCRIPTOR) + self.assertEquals( + 'google/protobuf/unittest.proto', + pool.FindFileByName( + 'google/protobuf/unittest.proto').name) + + # AddFileDescriptor is not recursive; messages and enums within files must + # be explicitly registered. + with self.assertRaises(KeyError): + pool.FindFileContainingSymbol( + 'protobuf_unittest.TestAllTypes') + + +TEST1_FILE = ProtoFile( + 'google/protobuf/internal/descriptor_pool_test1.proto', + 'google.protobuf.python.internal', + { + 'DescriptorPoolTest1': MessageType({ + 'NestedEnum': EnumType([('ALPHA', 1), ('BETA', 2)]), + 'NestedMessage': MessageType({ + 'NestedEnum': EnumType([('EPSILON', 5), ('ZETA', 6)]), + 'DeepNestedMessage': MessageType({ + 'NestedEnum': EnumType([('ETA', 7), ('THETA', 8)]), + }, [ + ('nested_enum', EnumField(1, 'NestedEnum', 'ETA')), + ('nested_field', StringField(2, 'theta')), + ]), + }, [ + ('nested_enum', EnumField(1, 'NestedEnum', 'ZETA')), + ('nested_field', StringField(2, 'beta')), + ('deep_nested_message', MessageField(3, 'DeepNestedMessage')), + ]) + }, [ + ('nested_enum', EnumField(1, 'NestedEnum', 'BETA')), + ('nested_message', MessageField(2, 'NestedMessage')), + ], is_extendable=True), + + 'DescriptorPoolTest2': MessageType({ + 'NestedEnum': EnumType([('GAMMA', 3), ('DELTA', 4)]), + 'NestedMessage': MessageType({ + 'NestedEnum': EnumType([('IOTA', 9), ('KAPPA', 10)]), + 'DeepNestedMessage': MessageType({ + 'NestedEnum': EnumType([('LAMBDA', 11), ('MU', 12)]), + }, [ + ('nested_enum', EnumField(1, 'NestedEnum', 'MU')), + ('nested_field', StringField(2, 'lambda')), + ]), + }, [ + ('nested_enum', EnumField(1, 'NestedEnum', 'IOTA')), + ('nested_field', StringField(2, 'delta')), + ('deep_nested_message', MessageField(3, 'DeepNestedMessage')), + ]) + }, [ + ('nested_enum', EnumField(1, 'NestedEnum', 'GAMMA')), + ('nested_message', MessageField(2, 'NestedMessage')), + ]), + }) + + +TEST2_FILE = ProtoFile( + 'google/protobuf/internal/descriptor_pool_test2.proto', + 'google.protobuf.python.internal', + { + 'DescriptorPoolTest3': MessageType({ + 'NestedEnum': EnumType([('NU', 13), ('XI', 14)]), + 'NestedMessage': MessageType({ + 'NestedEnum': EnumType([('OMICRON', 15), ('PI', 16)]), + 'DeepNestedMessage': MessageType({ + 'NestedEnum': EnumType([('RHO', 17), ('SIGMA', 18)]), + }, [ + ('nested_enum', EnumField(1, 'NestedEnum', 'RHO')), + ('nested_field', StringField(2, 'sigma')), + ]), + }, [ + ('nested_enum', EnumField(1, 'NestedEnum', 'PI')), + ('nested_field', StringField(2, 'nu')), + ('deep_nested_message', MessageField(3, 'DeepNestedMessage')), + ]) + }, [ + ('nested_enum', EnumField(1, 'NestedEnum', 'XI')), + ('nested_message', MessageField(2, 'NestedMessage')), + ], extensions=[ + ('descriptor_pool_test', + ExtensionField(1001, 'DescriptorPoolTest1')), + ]), + }, + dependencies=['google/protobuf/internal/descriptor_pool_test1.proto']) + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/internal/descriptor_pool_test1.proto b/pythonlib/google/protobuf/internal/descriptor_pool_test1.proto new file mode 100644 index 0000000..c11dcc0 --- /dev/null +++ b/pythonlib/google/protobuf/internal/descriptor_pool_test1.proto @@ -0,0 +1,94 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +package google.protobuf.python.internal; + + +message DescriptorPoolTest1 { + extensions 1000 to max; + + enum NestedEnum { + ALPHA = 1; + BETA = 2; + } + + optional NestedEnum nested_enum = 1 [default = BETA]; + + message NestedMessage { + enum NestedEnum { + EPSILON = 5; + ZETA = 6; + } + optional NestedEnum nested_enum = 1 [default = ZETA]; + optional string nested_field = 2 [default = "beta"]; + optional DeepNestedMessage deep_nested_message = 3; + + message DeepNestedMessage { + enum NestedEnum { + ETA = 7; + THETA = 8; + } + optional NestedEnum nested_enum = 1 [default = ETA]; + optional string nested_field = 2 [default = "theta"]; + } + } + + optional NestedMessage nested_message = 2; +} + +message DescriptorPoolTest2 { + enum NestedEnum { + GAMMA = 3; + DELTA = 4; + } + + optional NestedEnum nested_enum = 1 [default = GAMMA]; + + message NestedMessage { + enum NestedEnum { + IOTA = 9; + KAPPA = 10; + } + optional NestedEnum nested_enum = 1 [default = IOTA]; + optional string nested_field = 2 [default = "delta"]; + optional DeepNestedMessage deep_nested_message = 3; + + message DeepNestedMessage { + enum NestedEnum { + LAMBDA = 11; + MU = 12; + } + optional NestedEnum nested_enum = 1 [default = MU]; + optional string nested_field = 2 [default = "lambda"]; + } + } + + optional NestedMessage nested_message = 2; +} diff --git a/pythonlib/google/protobuf/internal/descriptor_pool_test1_pb2.py b/pythonlib/google/protobuf/internal/descriptor_pool_test1_pb2.py new file mode 100644 index 0000000..d98f2d3 --- /dev/null +++ b/pythonlib/google/protobuf/internal/descriptor_pool_test1_pb2.py @@ -0,0 +1,467 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/internal/descriptor_pool_test1.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/internal/descriptor_pool_test1.proto', + package='google.protobuf.python.internal', + serialized_pb=_b('\n4google/protobuf/internal/descriptor_pool_test1.proto\x12\x1fgoogle.protobuf.python.internal\"\xfb\x05\n\x13\x44\x65scriptorPoolTest1\x12Z\n\x0bnested_enum\x18\x01 \x01(\x0e\x32?.google.protobuf.python.internal.DescriptorPoolTest1.NestedEnum:\x04\x42\x45TA\x12Z\n\x0enested_message\x18\x02 \x01(\x0b\x32\x42.google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage\x1a\xfd\x03\n\rNestedMessage\x12h\n\x0bnested_enum\x18\x01 \x01(\x0e\x32M.google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage.NestedEnum:\x04ZETA\x12\x1a\n\x0cnested_field\x18\x02 \x01(\t:\x04\x62\x65ta\x12q\n\x13\x64\x65\x65p_nested_message\x18\x03 \x01(\x0b\x32T.google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage.DeepNestedMessage\x1a\xcd\x01\n\x11\x44\x65\x65pNestedMessage\x12y\n\x0bnested_enum\x18\x01 \x01(\x0e\x32_.google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage.DeepNestedMessage.NestedEnum:\x03\x45TA\x12\x1b\n\x0cnested_field\x18\x02 \x01(\t:\x05theta\" \n\nNestedEnum\x12\x07\n\x03\x45TA\x10\x07\x12\t\n\x05THETA\x10\x08\"#\n\nNestedEnum\x12\x0b\n\x07\x45PSILON\x10\x05\x12\x08\n\x04ZETA\x10\x06\"!\n\nNestedEnum\x12\t\n\x05\x41LPHA\x10\x01\x12\x08\n\x04\x42\x45TA\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xf1\x05\n\x13\x44\x65scriptorPoolTest2\x12[\n\x0bnested_enum\x18\x01 \x01(\x0e\x32?.google.protobuf.python.internal.DescriptorPoolTest2.NestedEnum:\x05GAMMA\x12Z\n\x0enested_message\x18\x02 \x01(\x0b\x32\x42.google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage\x1a\xfc\x03\n\rNestedMessage\x12h\n\x0bnested_enum\x18\x01 \x01(\x0e\x32M.google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage.NestedEnum:\x04IOTA\x12\x1b\n\x0cnested_field\x18\x02 \x01(\t:\x05\x64\x65lta\x12q\n\x13\x64\x65\x65p_nested_message\x18\x03 \x01(\x0b\x32T.google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage.DeepNestedMessage\x1a\xcd\x01\n\x11\x44\x65\x65pNestedMessage\x12x\n\x0bnested_enum\x18\x01 \x01(\x0e\x32_.google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage.DeepNestedMessage.NestedEnum:\x02MU\x12\x1c\n\x0cnested_field\x18\x02 \x01(\t:\x06lambda\" \n\nNestedEnum\x12\n\n\x06LAMBDA\x10\x0b\x12\x06\n\x02MU\x10\x0c\"!\n\nNestedEnum\x12\x08\n\x04IOTA\x10\t\x12\t\n\x05KAPPA\x10\n\"\"\n\nNestedEnum\x12\t\n\x05GAMMA\x10\x03\x12\t\n\x05\x44\x45LTA\x10\x04') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + + +_DESCRIPTORPOOLTEST1_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage.DeepNestedMessage.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ETA', index=0, number=7, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='THETA', index=1, number=8, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=738, + serialized_end=770, +) +_sym_db.RegisterEnumDescriptor(_DESCRIPTORPOOLTEST1_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM) + +_DESCRIPTORPOOLTEST1_NESTEDMESSAGE_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='EPSILON', index=0, number=5, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ZETA', index=1, number=6, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=772, + serialized_end=807, +) +_sym_db.RegisterEnumDescriptor(_DESCRIPTORPOOLTEST1_NESTEDMESSAGE_NESTEDENUM) + +_DESCRIPTORPOOLTEST1_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='google.protobuf.python.internal.DescriptorPoolTest1.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ALPHA', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BETA', index=1, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=809, + serialized_end=842, +) +_sym_db.RegisterEnumDescriptor(_DESCRIPTORPOOLTEST1_NESTEDENUM) + +_DESCRIPTORPOOLTEST2_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage.DeepNestedMessage.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LAMBDA', index=0, number=11, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MU', index=1, number=12, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1506, + serialized_end=1538, +) +_sym_db.RegisterEnumDescriptor(_DESCRIPTORPOOLTEST2_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM) + +_DESCRIPTORPOOLTEST2_NESTEDMESSAGE_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='IOTA', index=0, number=9, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='KAPPA', index=1, number=10, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1540, + serialized_end=1573, +) +_sym_db.RegisterEnumDescriptor(_DESCRIPTORPOOLTEST2_NESTEDMESSAGE_NESTEDENUM) + +_DESCRIPTORPOOLTEST2_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='google.protobuf.python.internal.DescriptorPoolTest2.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='GAMMA', index=0, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DELTA', index=1, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1575, + serialized_end=1609, +) +_sym_db.RegisterEnumDescriptor(_DESCRIPTORPOOLTEST2_NESTEDENUM) + + +_DESCRIPTORPOOLTEST1_NESTEDMESSAGE_DEEPNESTEDMESSAGE = _descriptor.Descriptor( + name='DeepNestedMessage', + full_name='google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage.DeepNestedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='nested_enum', full_name='google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage.DeepNestedMessage.nested_enum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=7, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_field', full_name='google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage.DeepNestedMessage.nested_field', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("theta").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DESCRIPTORPOOLTEST1_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=565, + serialized_end=770, +) + +_DESCRIPTORPOOLTEST1_NESTEDMESSAGE = _descriptor.Descriptor( + name='NestedMessage', + full_name='google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='nested_enum', full_name='google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage.nested_enum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=6, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_field', full_name='google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage.nested_field', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("beta").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='deep_nested_message', full_name='google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage.deep_nested_message', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_DESCRIPTORPOOLTEST1_NESTEDMESSAGE_DEEPNESTEDMESSAGE, ], + enum_types=[ + _DESCRIPTORPOOLTEST1_NESTEDMESSAGE_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=298, + serialized_end=807, +) + +_DESCRIPTORPOOLTEST1 = _descriptor.Descriptor( + name='DescriptorPoolTest1', + full_name='google.protobuf.python.internal.DescriptorPoolTest1', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='nested_enum', full_name='google.protobuf.python.internal.DescriptorPoolTest1.nested_enum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=2, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_message', full_name='google.protobuf.python.internal.DescriptorPoolTest1.nested_message', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_DESCRIPTORPOOLTEST1_NESTEDMESSAGE, ], + enum_types=[ + _DESCRIPTORPOOLTEST1_NESTEDENUM, + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=90, + serialized_end=853, +) + + +_DESCRIPTORPOOLTEST2_NESTEDMESSAGE_DEEPNESTEDMESSAGE = _descriptor.Descriptor( + name='DeepNestedMessage', + full_name='google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage.DeepNestedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='nested_enum', full_name='google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage.DeepNestedMessage.nested_enum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=12, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_field', full_name='google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage.DeepNestedMessage.nested_field', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("lambda").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DESCRIPTORPOOLTEST2_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1333, + serialized_end=1538, +) + +_DESCRIPTORPOOLTEST2_NESTEDMESSAGE = _descriptor.Descriptor( + name='NestedMessage', + full_name='google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='nested_enum', full_name='google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage.nested_enum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=9, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_field', full_name='google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage.nested_field', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("delta").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='deep_nested_message', full_name='google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage.deep_nested_message', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_DESCRIPTORPOOLTEST2_NESTEDMESSAGE_DEEPNESTEDMESSAGE, ], + enum_types=[ + _DESCRIPTORPOOLTEST2_NESTEDMESSAGE_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1065, + serialized_end=1573, +) + +_DESCRIPTORPOOLTEST2 = _descriptor.Descriptor( + name='DescriptorPoolTest2', + full_name='google.protobuf.python.internal.DescriptorPoolTest2', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='nested_enum', full_name='google.protobuf.python.internal.DescriptorPoolTest2.nested_enum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=3, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_message', full_name='google.protobuf.python.internal.DescriptorPoolTest2.nested_message', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_DESCRIPTORPOOLTEST2_NESTEDMESSAGE, ], + enum_types=[ + _DESCRIPTORPOOLTEST2_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=856, + serialized_end=1609, +) + +_DESCRIPTORPOOLTEST1_NESTEDMESSAGE_DEEPNESTEDMESSAGE.fields_by_name['nested_enum'].enum_type = _DESCRIPTORPOOLTEST1_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM +_DESCRIPTORPOOLTEST1_NESTEDMESSAGE_DEEPNESTEDMESSAGE.containing_type = _DESCRIPTORPOOLTEST1_NESTEDMESSAGE +_DESCRIPTORPOOLTEST1_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM.containing_type = _DESCRIPTORPOOLTEST1_NESTEDMESSAGE_DEEPNESTEDMESSAGE +_DESCRIPTORPOOLTEST1_NESTEDMESSAGE.fields_by_name['nested_enum'].enum_type = _DESCRIPTORPOOLTEST1_NESTEDMESSAGE_NESTEDENUM +_DESCRIPTORPOOLTEST1_NESTEDMESSAGE.fields_by_name['deep_nested_message'].message_type = _DESCRIPTORPOOLTEST1_NESTEDMESSAGE_DEEPNESTEDMESSAGE +_DESCRIPTORPOOLTEST1_NESTEDMESSAGE.containing_type = _DESCRIPTORPOOLTEST1 +_DESCRIPTORPOOLTEST1_NESTEDMESSAGE_NESTEDENUM.containing_type = _DESCRIPTORPOOLTEST1_NESTEDMESSAGE +_DESCRIPTORPOOLTEST1.fields_by_name['nested_enum'].enum_type = _DESCRIPTORPOOLTEST1_NESTEDENUM +_DESCRIPTORPOOLTEST1.fields_by_name['nested_message'].message_type = _DESCRIPTORPOOLTEST1_NESTEDMESSAGE +_DESCRIPTORPOOLTEST1_NESTEDENUM.containing_type = _DESCRIPTORPOOLTEST1 +_DESCRIPTORPOOLTEST2_NESTEDMESSAGE_DEEPNESTEDMESSAGE.fields_by_name['nested_enum'].enum_type = _DESCRIPTORPOOLTEST2_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM +_DESCRIPTORPOOLTEST2_NESTEDMESSAGE_DEEPNESTEDMESSAGE.containing_type = _DESCRIPTORPOOLTEST2_NESTEDMESSAGE +_DESCRIPTORPOOLTEST2_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM.containing_type = _DESCRIPTORPOOLTEST2_NESTEDMESSAGE_DEEPNESTEDMESSAGE +_DESCRIPTORPOOLTEST2_NESTEDMESSAGE.fields_by_name['nested_enum'].enum_type = _DESCRIPTORPOOLTEST2_NESTEDMESSAGE_NESTEDENUM +_DESCRIPTORPOOLTEST2_NESTEDMESSAGE.fields_by_name['deep_nested_message'].message_type = _DESCRIPTORPOOLTEST2_NESTEDMESSAGE_DEEPNESTEDMESSAGE +_DESCRIPTORPOOLTEST2_NESTEDMESSAGE.containing_type = _DESCRIPTORPOOLTEST2 +_DESCRIPTORPOOLTEST2_NESTEDMESSAGE_NESTEDENUM.containing_type = _DESCRIPTORPOOLTEST2_NESTEDMESSAGE +_DESCRIPTORPOOLTEST2.fields_by_name['nested_enum'].enum_type = _DESCRIPTORPOOLTEST2_NESTEDENUM +_DESCRIPTORPOOLTEST2.fields_by_name['nested_message'].message_type = _DESCRIPTORPOOLTEST2_NESTEDMESSAGE +_DESCRIPTORPOOLTEST2_NESTEDENUM.containing_type = _DESCRIPTORPOOLTEST2 +DESCRIPTOR.message_types_by_name['DescriptorPoolTest1'] = _DESCRIPTORPOOLTEST1 +DESCRIPTOR.message_types_by_name['DescriptorPoolTest2'] = _DESCRIPTORPOOLTEST2 + +DescriptorPoolTest1 = _reflection.GeneratedProtocolMessageType('DescriptorPoolTest1', (_message.Message,), dict( + + NestedMessage = _reflection.GeneratedProtocolMessageType('NestedMessage', (_message.Message,), dict( + + DeepNestedMessage = _reflection.GeneratedProtocolMessageType('DeepNestedMessage', (_message.Message,), dict( + DESCRIPTOR = _DESCRIPTORPOOLTEST1_NESTEDMESSAGE_DEEPNESTEDMESSAGE, + __module__ = 'google.protobuf.internal.descriptor_pool_test1_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage.DeepNestedMessage) + )) + , + DESCRIPTOR = _DESCRIPTORPOOLTEST1_NESTEDMESSAGE, + __module__ = 'google.protobuf.internal.descriptor_pool_test1_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.DescriptorPoolTest1.NestedMessage) + )) + , + DESCRIPTOR = _DESCRIPTORPOOLTEST1, + __module__ = 'google.protobuf.internal.descriptor_pool_test1_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.DescriptorPoolTest1) + )) +_sym_db.RegisterMessage(DescriptorPoolTest1) +_sym_db.RegisterMessage(DescriptorPoolTest1.NestedMessage) +_sym_db.RegisterMessage(DescriptorPoolTest1.NestedMessage.DeepNestedMessage) + +DescriptorPoolTest2 = _reflection.GeneratedProtocolMessageType('DescriptorPoolTest2', (_message.Message,), dict( + + NestedMessage = _reflection.GeneratedProtocolMessageType('NestedMessage', (_message.Message,), dict( + + DeepNestedMessage = _reflection.GeneratedProtocolMessageType('DeepNestedMessage', (_message.Message,), dict( + DESCRIPTOR = _DESCRIPTORPOOLTEST2_NESTEDMESSAGE_DEEPNESTEDMESSAGE, + __module__ = 'google.protobuf.internal.descriptor_pool_test1_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage.DeepNestedMessage) + )) + , + DESCRIPTOR = _DESCRIPTORPOOLTEST2_NESTEDMESSAGE, + __module__ = 'google.protobuf.internal.descriptor_pool_test1_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.DescriptorPoolTest2.NestedMessage) + )) + , + DESCRIPTOR = _DESCRIPTORPOOLTEST2, + __module__ = 'google.protobuf.internal.descriptor_pool_test1_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.DescriptorPoolTest2) + )) +_sym_db.RegisterMessage(DescriptorPoolTest2) +_sym_db.RegisterMessage(DescriptorPoolTest2.NestedMessage) +_sym_db.RegisterMessage(DescriptorPoolTest2.NestedMessage.DeepNestedMessage) + + +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/internal/descriptor_pool_test2.proto b/pythonlib/google/protobuf/internal/descriptor_pool_test2.proto new file mode 100644 index 0000000..d97d39b --- /dev/null +++ b/pythonlib/google/protobuf/internal/descriptor_pool_test2.proto @@ -0,0 +1,70 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +package google.protobuf.python.internal; + +import "google/protobuf/internal/descriptor_pool_test1.proto"; + + +message DescriptorPoolTest3 { + + extend DescriptorPoolTest1 { + optional DescriptorPoolTest3 descriptor_pool_test = 1001; + } + + enum NestedEnum { + NU = 13; + XI = 14; + } + + optional NestedEnum nested_enum = 1 [default = XI]; + + message NestedMessage { + enum NestedEnum { + OMICRON = 15; + PI = 16; + } + optional NestedEnum nested_enum = 1 [default = PI]; + optional string nested_field = 2 [default = "nu"]; + optional DeepNestedMessage deep_nested_message = 3; + + message DeepNestedMessage { + enum NestedEnum { + RHO = 17; + SIGMA = 18; + } + optional NestedEnum nested_enum = 1 [default = RHO]; + optional string nested_field = 2 [default = "sigma"]; + } + } + + optional NestedMessage nested_message = 2; +} + diff --git a/pythonlib/google/protobuf/internal/descriptor_pool_test2_pb2.py b/pythonlib/google/protobuf/internal/descriptor_pool_test2_pb2.py new file mode 100644 index 0000000..cfcfb8d --- /dev/null +++ b/pythonlib/google/protobuf/internal/descriptor_pool_test2_pb2.py @@ -0,0 +1,259 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/internal/descriptor_pool_test2.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import google.protobuf.internal.descriptor_pool_test1_pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/internal/descriptor_pool_test2.proto', + package='google.protobuf.python.internal', + serialized_pb=_b('\n4google/protobuf/internal/descriptor_pool_test2.proto\x12\x1fgoogle.protobuf.python.internal\x1a\x34google/protobuf/internal/descriptor_pool_test1.proto\"\xef\x06\n\x13\x44\x65scriptorPoolTest3\x12X\n\x0bnested_enum\x18\x01 \x01(\x0e\x32?.google.protobuf.python.internal.DescriptorPoolTest3.NestedEnum:\x02XI\x12Z\n\x0enested_message\x18\x02 \x01(\x0b\x32\x42.google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage\x1a\xf7\x03\n\rNestedMessage\x12\x66\n\x0bnested_enum\x18\x01 \x01(\x0e\x32M.google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage.NestedEnum:\x02PI\x12\x18\n\x0cnested_field\x18\x02 \x01(\t:\x02nu\x12q\n\x13\x64\x65\x65p_nested_message\x18\x03 \x01(\x0b\x32T.google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage.DeepNestedMessage\x1a\xcd\x01\n\x11\x44\x65\x65pNestedMessage\x12y\n\x0bnested_enum\x18\x01 \x01(\x0e\x32_.google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage.DeepNestedMessage.NestedEnum:\x03RHO\x12\x1b\n\x0cnested_field\x18\x02 \x01(\t:\x05sigma\" \n\nNestedEnum\x12\x07\n\x03RHO\x10\x11\x12\t\n\x05SIGMA\x10\x12\"!\n\nNestedEnum\x12\x0b\n\x07OMICRON\x10\x0f\x12\x06\n\x02PI\x10\x10\"\x1c\n\nNestedEnum\x12\x06\n\x02NU\x10\r\x12\x06\n\x02XI\x10\x0e\x32\x89\x01\n\x14\x64\x65scriptor_pool_test\x12\x34.google.protobuf.python.internal.DescriptorPoolTest1\x18\xe9\x07 \x01(\x0b\x32\x34.google.protobuf.python.internal.DescriptorPoolTest3') + , + dependencies=[google.protobuf.internal.descriptor_pool_test1_pb2.DESCRIPTOR,]) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + + +_DESCRIPTORPOOLTEST3_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage.DeepNestedMessage.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='RHO', index=0, number=17, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SIGMA', index=1, number=18, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=786, + serialized_end=818, +) +_sym_db.RegisterEnumDescriptor(_DESCRIPTORPOOLTEST3_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM) + +_DESCRIPTORPOOLTEST3_NESTEDMESSAGE_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='OMICRON', index=0, number=15, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PI', index=1, number=16, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=820, + serialized_end=853, +) +_sym_db.RegisterEnumDescriptor(_DESCRIPTORPOOLTEST3_NESTEDMESSAGE_NESTEDENUM) + +_DESCRIPTORPOOLTEST3_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='google.protobuf.python.internal.DescriptorPoolTest3.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NU', index=0, number=13, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='XI', index=1, number=14, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=855, + serialized_end=883, +) +_sym_db.RegisterEnumDescriptor(_DESCRIPTORPOOLTEST3_NESTEDENUM) + + +_DESCRIPTORPOOLTEST3_NESTEDMESSAGE_DEEPNESTEDMESSAGE = _descriptor.Descriptor( + name='DeepNestedMessage', + full_name='google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage.DeepNestedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='nested_enum', full_name='google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage.DeepNestedMessage.nested_enum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=17, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_field', full_name='google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage.DeepNestedMessage.nested_field', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("sigma").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DESCRIPTORPOOLTEST3_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=613, + serialized_end=818, +) + +_DESCRIPTORPOOLTEST3_NESTEDMESSAGE = _descriptor.Descriptor( + name='NestedMessage', + full_name='google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='nested_enum', full_name='google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage.nested_enum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=16, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_field', full_name='google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage.nested_field', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("nu").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='deep_nested_message', full_name='google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage.deep_nested_message', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_DESCRIPTORPOOLTEST3_NESTEDMESSAGE_DEEPNESTEDMESSAGE, ], + enum_types=[ + _DESCRIPTORPOOLTEST3_NESTEDMESSAGE_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=350, + serialized_end=853, +) + +_DESCRIPTORPOOLTEST3 = _descriptor.Descriptor( + name='DescriptorPoolTest3', + full_name='google.protobuf.python.internal.DescriptorPoolTest3', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='nested_enum', full_name='google.protobuf.python.internal.DescriptorPoolTest3.nested_enum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=14, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_message', full_name='google.protobuf.python.internal.DescriptorPoolTest3.nested_message', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + _descriptor.FieldDescriptor( + name='descriptor_pool_test', full_name='google.protobuf.python.internal.DescriptorPoolTest3.descriptor_pool_test', index=0, + number=1001, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + ], + nested_types=[_DESCRIPTORPOOLTEST3_NESTEDMESSAGE, ], + enum_types=[ + _DESCRIPTORPOOLTEST3_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=144, + serialized_end=1023, +) + +_DESCRIPTORPOOLTEST3_NESTEDMESSAGE_DEEPNESTEDMESSAGE.fields_by_name['nested_enum'].enum_type = _DESCRIPTORPOOLTEST3_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM +_DESCRIPTORPOOLTEST3_NESTEDMESSAGE_DEEPNESTEDMESSAGE.containing_type = _DESCRIPTORPOOLTEST3_NESTEDMESSAGE +_DESCRIPTORPOOLTEST3_NESTEDMESSAGE_DEEPNESTEDMESSAGE_NESTEDENUM.containing_type = _DESCRIPTORPOOLTEST3_NESTEDMESSAGE_DEEPNESTEDMESSAGE +_DESCRIPTORPOOLTEST3_NESTEDMESSAGE.fields_by_name['nested_enum'].enum_type = _DESCRIPTORPOOLTEST3_NESTEDMESSAGE_NESTEDENUM +_DESCRIPTORPOOLTEST3_NESTEDMESSAGE.fields_by_name['deep_nested_message'].message_type = _DESCRIPTORPOOLTEST3_NESTEDMESSAGE_DEEPNESTEDMESSAGE +_DESCRIPTORPOOLTEST3_NESTEDMESSAGE.containing_type = _DESCRIPTORPOOLTEST3 +_DESCRIPTORPOOLTEST3_NESTEDMESSAGE_NESTEDENUM.containing_type = _DESCRIPTORPOOLTEST3_NESTEDMESSAGE +_DESCRIPTORPOOLTEST3.fields_by_name['nested_enum'].enum_type = _DESCRIPTORPOOLTEST3_NESTEDENUM +_DESCRIPTORPOOLTEST3.fields_by_name['nested_message'].message_type = _DESCRIPTORPOOLTEST3_NESTEDMESSAGE +_DESCRIPTORPOOLTEST3_NESTEDENUM.containing_type = _DESCRIPTORPOOLTEST3 +DESCRIPTOR.message_types_by_name['DescriptorPoolTest3'] = _DESCRIPTORPOOLTEST3 + +DescriptorPoolTest3 = _reflection.GeneratedProtocolMessageType('DescriptorPoolTest3', (_message.Message,), dict( + + NestedMessage = _reflection.GeneratedProtocolMessageType('NestedMessage', (_message.Message,), dict( + + DeepNestedMessage = _reflection.GeneratedProtocolMessageType('DeepNestedMessage', (_message.Message,), dict( + DESCRIPTOR = _DESCRIPTORPOOLTEST3_NESTEDMESSAGE_DEEPNESTEDMESSAGE, + __module__ = 'google.protobuf.internal.descriptor_pool_test2_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage.DeepNestedMessage) + )) + , + DESCRIPTOR = _DESCRIPTORPOOLTEST3_NESTEDMESSAGE, + __module__ = 'google.protobuf.internal.descriptor_pool_test2_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.DescriptorPoolTest3.NestedMessage) + )) + , + DESCRIPTOR = _DESCRIPTORPOOLTEST3, + __module__ = 'google.protobuf.internal.descriptor_pool_test2_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.DescriptorPoolTest3) + )) +_sym_db.RegisterMessage(DescriptorPoolTest3) +_sym_db.RegisterMessage(DescriptorPoolTest3.NestedMessage) +_sym_db.RegisterMessage(DescriptorPoolTest3.NestedMessage.DeepNestedMessage) + +_DESCRIPTORPOOLTEST3.extensions_by_name['descriptor_pool_test'].message_type = _DESCRIPTORPOOLTEST3 +google.protobuf.internal.descriptor_pool_test1_pb2.DescriptorPoolTest1.RegisterExtension(_DESCRIPTORPOOLTEST3.extensions_by_name['descriptor_pool_test']) + +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/internal/descriptor_python_test.py b/pythonlib/google/protobuf/internal/descriptor_python_test.py new file mode 100644 index 0000000..b3a1571 --- /dev/null +++ b/pythonlib/google/protobuf/internal/descriptor_python_test.py @@ -0,0 +1,54 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Unittest for descriptor.py for the pure Python implementation.""" + +import os +os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'python' + +# We must set the implementation version above before the google3 imports. +# pylint: disable=g-import-not-at-top +from google.apputils import basetest +from google.protobuf.internal import api_implementation +# Run all tests from the original module by putting them in our namespace. +# pylint: disable=wildcard-import +from google.protobuf.internal.descriptor_test import * + + +class ConfirmPurePythonTest(basetest.TestCase): + + def testImplementationSetting(self): + self.assertEqual('python', api_implementation.Type()) + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/internal/descriptor_test.py b/pythonlib/google/protobuf/internal/descriptor_test.py new file mode 100644 index 0000000..d20d945 --- /dev/null +++ b/pythonlib/google/protobuf/internal/descriptor_test.py @@ -0,0 +1,669 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Unittest for google.protobuf.internal.descriptor.""" + +__author__ = 'robinson@google.com (Will Robinson)' + +from google.apputils import basetest +from google.protobuf import unittest_custom_options_pb2 +from google.protobuf import unittest_import_pb2 +from google.protobuf import unittest_pb2 +from google.protobuf import descriptor_pb2 +from google.protobuf import descriptor +from google.protobuf import text_format + + +TEST_EMPTY_MESSAGE_DESCRIPTOR_ASCII = """ +name: 'TestEmptyMessage' +""" + + +class DescriptorTest(basetest.TestCase): + + def setUp(self): + self.my_file = descriptor.FileDescriptor( + name='some/filename/some.proto', + package='protobuf_unittest' + ) + self.my_enum = descriptor.EnumDescriptor( + name='ForeignEnum', + full_name='protobuf_unittest.ForeignEnum', + filename=None, + file=self.my_file, + values=[ + descriptor.EnumValueDescriptor(name='FOREIGN_FOO', index=0, number=4), + descriptor.EnumValueDescriptor(name='FOREIGN_BAR', index=1, number=5), + descriptor.EnumValueDescriptor(name='FOREIGN_BAZ', index=2, number=6), + ]) + self.my_message = descriptor.Descriptor( + name='NestedMessage', + full_name='protobuf_unittest.TestAllTypes.NestedMessage', + filename=None, + file=self.my_file, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='bb', + full_name='protobuf_unittest.TestAllTypes.NestedMessage.bb', + index=0, number=1, + type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None), + ], + nested_types=[], + enum_types=[ + self.my_enum, + ], + extensions=[]) + self.my_method = descriptor.MethodDescriptor( + name='Bar', + full_name='protobuf_unittest.TestService.Bar', + index=0, + containing_service=None, + input_type=None, + output_type=None) + self.my_service = descriptor.ServiceDescriptor( + name='TestServiceWithOptions', + full_name='protobuf_unittest.TestServiceWithOptions', + file=self.my_file, + index=0, + methods=[ + self.my_method + ]) + + def testEnumValueName(self): + self.assertEqual(self.my_message.EnumValueName('ForeignEnum', 4), + 'FOREIGN_FOO') + + self.assertEqual( + self.my_message.enum_types_by_name[ + 'ForeignEnum'].values_by_number[4].name, + self.my_message.EnumValueName('ForeignEnum', 4)) + + def testEnumFixups(self): + self.assertEqual(self.my_enum, self.my_enum.values[0].type) + + def testContainingTypeFixups(self): + self.assertEqual(self.my_message, self.my_message.fields[0].containing_type) + self.assertEqual(self.my_message, self.my_enum.containing_type) + + def testContainingServiceFixups(self): + self.assertEqual(self.my_service, self.my_method.containing_service) + + def testGetOptions(self): + self.assertEqual(self.my_enum.GetOptions(), + descriptor_pb2.EnumOptions()) + self.assertEqual(self.my_enum.values[0].GetOptions(), + descriptor_pb2.EnumValueOptions()) + self.assertEqual(self.my_message.GetOptions(), + descriptor_pb2.MessageOptions()) + self.assertEqual(self.my_message.fields[0].GetOptions(), + descriptor_pb2.FieldOptions()) + self.assertEqual(self.my_method.GetOptions(), + descriptor_pb2.MethodOptions()) + self.assertEqual(self.my_service.GetOptions(), + descriptor_pb2.ServiceOptions()) + + def testSimpleCustomOptions(self): + file_descriptor = unittest_custom_options_pb2.DESCRIPTOR + message_descriptor =\ + unittest_custom_options_pb2.TestMessageWithCustomOptions.DESCRIPTOR + field_descriptor = message_descriptor.fields_by_name["field1"] + enum_descriptor = message_descriptor.enum_types_by_name["AnEnum"] + enum_value_descriptor =\ + message_descriptor.enum_values_by_name["ANENUM_VAL2"] + service_descriptor =\ + unittest_custom_options_pb2.TestServiceWithCustomOptions.DESCRIPTOR + method_descriptor = service_descriptor.FindMethodByName("Foo") + + file_options = file_descriptor.GetOptions() + file_opt1 = unittest_custom_options_pb2.file_opt1 + self.assertEqual(9876543210, file_options.Extensions[file_opt1]) + message_options = message_descriptor.GetOptions() + message_opt1 = unittest_custom_options_pb2.message_opt1 + self.assertEqual(-56, message_options.Extensions[message_opt1]) + field_options = field_descriptor.GetOptions() + field_opt1 = unittest_custom_options_pb2.field_opt1 + self.assertEqual(8765432109, field_options.Extensions[field_opt1]) + field_opt2 = unittest_custom_options_pb2.field_opt2 + self.assertEqual(42, field_options.Extensions[field_opt2]) + enum_options = enum_descriptor.GetOptions() + enum_opt1 = unittest_custom_options_pb2.enum_opt1 + self.assertEqual(-789, enum_options.Extensions[enum_opt1]) + enum_value_options = enum_value_descriptor.GetOptions() + enum_value_opt1 = unittest_custom_options_pb2.enum_value_opt1 + self.assertEqual(123, enum_value_options.Extensions[enum_value_opt1]) + + service_options = service_descriptor.GetOptions() + service_opt1 = unittest_custom_options_pb2.service_opt1 + self.assertEqual(-9876543210, service_options.Extensions[service_opt1]) + method_options = method_descriptor.GetOptions() + method_opt1 = unittest_custom_options_pb2.method_opt1 + self.assertEqual(unittest_custom_options_pb2.METHODOPT1_VAL2, + method_options.Extensions[method_opt1]) + + def testDifferentCustomOptionTypes(self): + kint32min = -2**31 + kint64min = -2**63 + kint32max = 2**31 - 1 + kint64max = 2**63 - 1 + kuint32max = 2**32 - 1 + kuint64max = 2**64 - 1 + + message_descriptor =\ + unittest_custom_options_pb2.CustomOptionMinIntegerValues.DESCRIPTOR + message_options = message_descriptor.GetOptions() + self.assertEqual(False, message_options.Extensions[ + unittest_custom_options_pb2.bool_opt]) + self.assertEqual(kint32min, message_options.Extensions[ + unittest_custom_options_pb2.int32_opt]) + self.assertEqual(kint64min, message_options.Extensions[ + unittest_custom_options_pb2.int64_opt]) + self.assertEqual(0, message_options.Extensions[ + unittest_custom_options_pb2.uint32_opt]) + self.assertEqual(0, message_options.Extensions[ + unittest_custom_options_pb2.uint64_opt]) + self.assertEqual(kint32min, message_options.Extensions[ + unittest_custom_options_pb2.sint32_opt]) + self.assertEqual(kint64min, message_options.Extensions[ + unittest_custom_options_pb2.sint64_opt]) + self.assertEqual(0, message_options.Extensions[ + unittest_custom_options_pb2.fixed32_opt]) + self.assertEqual(0, message_options.Extensions[ + unittest_custom_options_pb2.fixed64_opt]) + self.assertEqual(kint32min, message_options.Extensions[ + unittest_custom_options_pb2.sfixed32_opt]) + self.assertEqual(kint64min, message_options.Extensions[ + unittest_custom_options_pb2.sfixed64_opt]) + + message_descriptor =\ + unittest_custom_options_pb2.CustomOptionMaxIntegerValues.DESCRIPTOR + message_options = message_descriptor.GetOptions() + self.assertEqual(True, message_options.Extensions[ + unittest_custom_options_pb2.bool_opt]) + self.assertEqual(kint32max, message_options.Extensions[ + unittest_custom_options_pb2.int32_opt]) + self.assertEqual(kint64max, message_options.Extensions[ + unittest_custom_options_pb2.int64_opt]) + self.assertEqual(kuint32max, message_options.Extensions[ + unittest_custom_options_pb2.uint32_opt]) + self.assertEqual(kuint64max, message_options.Extensions[ + unittest_custom_options_pb2.uint64_opt]) + self.assertEqual(kint32max, message_options.Extensions[ + unittest_custom_options_pb2.sint32_opt]) + self.assertEqual(kint64max, message_options.Extensions[ + unittest_custom_options_pb2.sint64_opt]) + self.assertEqual(kuint32max, message_options.Extensions[ + unittest_custom_options_pb2.fixed32_opt]) + self.assertEqual(kuint64max, message_options.Extensions[ + unittest_custom_options_pb2.fixed64_opt]) + self.assertEqual(kint32max, message_options.Extensions[ + unittest_custom_options_pb2.sfixed32_opt]) + self.assertEqual(kint64max, message_options.Extensions[ + unittest_custom_options_pb2.sfixed64_opt]) + + message_descriptor =\ + unittest_custom_options_pb2.CustomOptionOtherValues.DESCRIPTOR + message_options = message_descriptor.GetOptions() + self.assertEqual(-100, message_options.Extensions[ + unittest_custom_options_pb2.int32_opt]) + self.assertAlmostEqual(12.3456789, message_options.Extensions[ + unittest_custom_options_pb2.float_opt], 6) + self.assertAlmostEqual(1.234567890123456789, message_options.Extensions[ + unittest_custom_options_pb2.double_opt]) + self.assertEqual("Hello, \"World\"", message_options.Extensions[ + unittest_custom_options_pb2.string_opt]) + self.assertEqual(b"Hello\0World", message_options.Extensions[ + unittest_custom_options_pb2.bytes_opt]) + dummy_enum = unittest_custom_options_pb2.DummyMessageContainingEnum + self.assertEqual( + dummy_enum.TEST_OPTION_ENUM_TYPE2, + message_options.Extensions[unittest_custom_options_pb2.enum_opt]) + + message_descriptor =\ + unittest_custom_options_pb2.SettingRealsFromPositiveInts.DESCRIPTOR + message_options = message_descriptor.GetOptions() + self.assertAlmostEqual(12, message_options.Extensions[ + unittest_custom_options_pb2.float_opt], 6) + self.assertAlmostEqual(154, message_options.Extensions[ + unittest_custom_options_pb2.double_opt]) + + message_descriptor =\ + unittest_custom_options_pb2.SettingRealsFromNegativeInts.DESCRIPTOR + message_options = message_descriptor.GetOptions() + self.assertAlmostEqual(-12, message_options.Extensions[ + unittest_custom_options_pb2.float_opt], 6) + self.assertAlmostEqual(-154, message_options.Extensions[ + unittest_custom_options_pb2.double_opt]) + + def testComplexExtensionOptions(self): + descriptor =\ + unittest_custom_options_pb2.VariousComplexOptions.DESCRIPTOR + options = descriptor.GetOptions() + self.assertEqual(42, options.Extensions[ + unittest_custom_options_pb2.complex_opt1].foo) + self.assertEqual(324, options.Extensions[ + unittest_custom_options_pb2.complex_opt1].Extensions[ + unittest_custom_options_pb2.quux]) + self.assertEqual(876, options.Extensions[ + unittest_custom_options_pb2.complex_opt1].Extensions[ + unittest_custom_options_pb2.corge].qux) + self.assertEqual(987, options.Extensions[ + unittest_custom_options_pb2.complex_opt2].baz) + self.assertEqual(654, options.Extensions[ + unittest_custom_options_pb2.complex_opt2].Extensions[ + unittest_custom_options_pb2.grault]) + self.assertEqual(743, options.Extensions[ + unittest_custom_options_pb2.complex_opt2].bar.foo) + self.assertEqual(1999, options.Extensions[ + unittest_custom_options_pb2.complex_opt2].bar.Extensions[ + unittest_custom_options_pb2.quux]) + self.assertEqual(2008, options.Extensions[ + unittest_custom_options_pb2.complex_opt2].bar.Extensions[ + unittest_custom_options_pb2.corge].qux) + self.assertEqual(741, options.Extensions[ + unittest_custom_options_pb2.complex_opt2].Extensions[ + unittest_custom_options_pb2.garply].foo) + self.assertEqual(1998, options.Extensions[ + unittest_custom_options_pb2.complex_opt2].Extensions[ + unittest_custom_options_pb2.garply].Extensions[ + unittest_custom_options_pb2.quux]) + self.assertEqual(2121, options.Extensions[ + unittest_custom_options_pb2.complex_opt2].Extensions[ + unittest_custom_options_pb2.garply].Extensions[ + unittest_custom_options_pb2.corge].qux) + self.assertEqual(1971, options.Extensions[ + unittest_custom_options_pb2.ComplexOptionType2 + .ComplexOptionType4.complex_opt4].waldo) + self.assertEqual(321, options.Extensions[ + unittest_custom_options_pb2.complex_opt2].fred.waldo) + self.assertEqual(9, options.Extensions[ + unittest_custom_options_pb2.complex_opt3].qux) + self.assertEqual(22, options.Extensions[ + unittest_custom_options_pb2.complex_opt3].complexoptiontype5.plugh) + self.assertEqual(24, options.Extensions[ + unittest_custom_options_pb2.complexopt6].xyzzy) + + # Check that aggregate options were parsed and saved correctly in + # the appropriate descriptors. + def testAggregateOptions(self): + file_descriptor = unittest_custom_options_pb2.DESCRIPTOR + message_descriptor =\ + unittest_custom_options_pb2.AggregateMessage.DESCRIPTOR + field_descriptor = message_descriptor.fields_by_name["fieldname"] + enum_descriptor = unittest_custom_options_pb2.AggregateEnum.DESCRIPTOR + enum_value_descriptor = enum_descriptor.values_by_name["VALUE"] + service_descriptor =\ + unittest_custom_options_pb2.AggregateService.DESCRIPTOR + method_descriptor = service_descriptor.FindMethodByName("Method") + + # Tests for the different types of data embedded in fileopt + file_options = file_descriptor.GetOptions().Extensions[ + unittest_custom_options_pb2.fileopt] + self.assertEqual(100, file_options.i) + self.assertEqual("FileAnnotation", file_options.s) + self.assertEqual("NestedFileAnnotation", file_options.sub.s) + self.assertEqual("FileExtensionAnnotation", file_options.file.Extensions[ + unittest_custom_options_pb2.fileopt].s) + self.assertEqual("EmbeddedMessageSetElement", file_options.mset.Extensions[ + unittest_custom_options_pb2.AggregateMessageSetElement + .message_set_extension].s) + + # Simple tests for all the other types of annotations + self.assertEqual( + "MessageAnnotation", + message_descriptor.GetOptions().Extensions[ + unittest_custom_options_pb2.msgopt].s) + self.assertEqual( + "FieldAnnotation", + field_descriptor.GetOptions().Extensions[ + unittest_custom_options_pb2.fieldopt].s) + self.assertEqual( + "EnumAnnotation", + enum_descriptor.GetOptions().Extensions[ + unittest_custom_options_pb2.enumopt].s) + self.assertEqual( + "EnumValueAnnotation", + enum_value_descriptor.GetOptions().Extensions[ + unittest_custom_options_pb2.enumvalopt].s) + self.assertEqual( + "ServiceAnnotation", + service_descriptor.GetOptions().Extensions[ + unittest_custom_options_pb2.serviceopt].s) + self.assertEqual( + "MethodAnnotation", + method_descriptor.GetOptions().Extensions[ + unittest_custom_options_pb2.methodopt].s) + + def testNestedOptions(self): + nested_message =\ + unittest_custom_options_pb2.NestedOptionType.NestedMessage.DESCRIPTOR + self.assertEqual(1001, nested_message.GetOptions().Extensions[ + unittest_custom_options_pb2.message_opt1]) + nested_field = nested_message.fields_by_name["nested_field"] + self.assertEqual(1002, nested_field.GetOptions().Extensions[ + unittest_custom_options_pb2.field_opt1]) + outer_message =\ + unittest_custom_options_pb2.NestedOptionType.DESCRIPTOR + nested_enum = outer_message.enum_types_by_name["NestedEnum"] + self.assertEqual(1003, nested_enum.GetOptions().Extensions[ + unittest_custom_options_pb2.enum_opt1]) + nested_enum_value = outer_message.enum_values_by_name["NESTED_ENUM_VALUE"] + self.assertEqual(1004, nested_enum_value.GetOptions().Extensions[ + unittest_custom_options_pb2.enum_value_opt1]) + nested_extension = outer_message.extensions_by_name["nested_extension"] + self.assertEqual(1005, nested_extension.GetOptions().Extensions[ + unittest_custom_options_pb2.field_opt2]) + + def testFileDescriptorReferences(self): + self.assertEqual(self.my_enum.file, self.my_file) + self.assertEqual(self.my_message.file, self.my_file) + + def testFileDescriptor(self): + self.assertEqual(self.my_file.name, 'some/filename/some.proto') + self.assertEqual(self.my_file.package, 'protobuf_unittest') + + +class DescriptorCopyToProtoTest(basetest.TestCase): + """Tests for CopyTo functions of Descriptor.""" + + def _AssertProtoEqual(self, actual_proto, expected_class, expected_ascii): + expected_proto = expected_class() + text_format.Merge(expected_ascii, expected_proto) + + self.assertEqual( + actual_proto, expected_proto, + 'Not equal,\nActual:\n%s\nExpected:\n%s\n' + % (str(actual_proto), str(expected_proto))) + + def _InternalTestCopyToProto(self, desc, expected_proto_class, + expected_proto_ascii): + actual = expected_proto_class() + desc.CopyToProto(actual) + self._AssertProtoEqual( + actual, expected_proto_class, expected_proto_ascii) + + def testCopyToProto_EmptyMessage(self): + self._InternalTestCopyToProto( + unittest_pb2.TestEmptyMessage.DESCRIPTOR, + descriptor_pb2.DescriptorProto, + TEST_EMPTY_MESSAGE_DESCRIPTOR_ASCII) + + def testCopyToProto_NestedMessage(self): + TEST_NESTED_MESSAGE_ASCII = """ + name: 'NestedMessage' + field: < + name: 'bb' + number: 1 + label: 1 # Optional + type: 5 # TYPE_INT32 + > + """ + + self._InternalTestCopyToProto( + unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR, + descriptor_pb2.DescriptorProto, + TEST_NESTED_MESSAGE_ASCII) + + def testCopyToProto_ForeignNestedMessage(self): + TEST_FOREIGN_NESTED_ASCII = """ + name: 'TestForeignNested' + field: < + name: 'foreign_nested' + number: 1 + label: 1 # Optional + type: 11 # TYPE_MESSAGE + type_name: '.protobuf_unittest.TestAllTypes.NestedMessage' + > + """ + + self._InternalTestCopyToProto( + unittest_pb2.TestForeignNested.DESCRIPTOR, + descriptor_pb2.DescriptorProto, + TEST_FOREIGN_NESTED_ASCII) + + def testCopyToProto_ForeignEnum(self): + TEST_FOREIGN_ENUM_ASCII = """ + name: 'ForeignEnum' + value: < + name: 'FOREIGN_FOO' + number: 4 + > + value: < + name: 'FOREIGN_BAR' + number: 5 + > + value: < + name: 'FOREIGN_BAZ' + number: 6 + > + """ + + self._InternalTestCopyToProto( + unittest_pb2._FOREIGNENUM, + descriptor_pb2.EnumDescriptorProto, + TEST_FOREIGN_ENUM_ASCII) + + def testCopyToProto_Options(self): + TEST_DEPRECATED_FIELDS_ASCII = """ + name: 'TestDeprecatedFields' + field: < + name: 'deprecated_int32' + number: 1 + label: 1 # Optional + type: 5 # TYPE_INT32 + options: < + deprecated: true + > + > + """ + + self._InternalTestCopyToProto( + unittest_pb2.TestDeprecatedFields.DESCRIPTOR, + descriptor_pb2.DescriptorProto, + TEST_DEPRECATED_FIELDS_ASCII) + + def testCopyToProto_AllExtensions(self): + TEST_EMPTY_MESSAGE_WITH_EXTENSIONS_ASCII = """ + name: 'TestEmptyMessageWithExtensions' + extension_range: < + start: 1 + end: 536870912 + > + """ + + self._InternalTestCopyToProto( + unittest_pb2.TestEmptyMessageWithExtensions.DESCRIPTOR, + descriptor_pb2.DescriptorProto, + TEST_EMPTY_MESSAGE_WITH_EXTENSIONS_ASCII) + + def testCopyToProto_SeveralExtensions(self): + TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII = """ + name: 'TestMultipleExtensionRanges' + extension_range: < + start: 42 + end: 43 + > + extension_range: < + start: 4143 + end: 4244 + > + extension_range: < + start: 65536 + end: 536870912 + > + """ + + self._InternalTestCopyToProto( + unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR, + descriptor_pb2.DescriptorProto, + TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII) + + # Disable this test so we can make changes to the proto file. + # TODO(xiaofeng): Enable this test after cl/55530659 is submitted. + # + # def testCopyToProto_FileDescriptor(self): + # UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII = (""" + # name: 'google/protobuf/unittest_import.proto' + # package: 'protobuf_unittest_import' + # dependency: 'google/protobuf/unittest_import_public.proto' + # message_type: < + # name: 'ImportMessage' + # field: < + # name: 'd' + # number: 1 + # label: 1 # Optional + # type: 5 # TYPE_INT32 + # > + # > + # """ + + # """enum_type: < + # name: 'ImportEnum' + # value: < + # name: 'IMPORT_FOO' + # number: 7 + # > + # value: < + # name: 'IMPORT_BAR' + # number: 8 + # > + # value: < + # name: 'IMPORT_BAZ' + # number: 9 + # > + # > + # options: < + # java_package: 'com.google.protobuf.test' + # optimize_for: 1 # SPEED + # > + # public_dependency: 0 + # """) + # self._InternalTestCopyToProto( + # unittest_import_pb2.DESCRIPTOR, + # descriptor_pb2.FileDescriptorProto, + # UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII) + + def testCopyToProto_ServiceDescriptor(self): + TEST_SERVICE_ASCII = """ + name: 'TestService' + method: < + name: 'Foo' + input_type: '.protobuf_unittest.FooRequest' + output_type: '.protobuf_unittest.FooResponse' + > + method: < + name: 'Bar' + input_type: '.protobuf_unittest.BarRequest' + output_type: '.protobuf_unittest.BarResponse' + > + """ + self._InternalTestCopyToProto( + unittest_pb2.TestService.DESCRIPTOR, + descriptor_pb2.ServiceDescriptorProto, + TEST_SERVICE_ASCII) + + +class MakeDescriptorTest(basetest.TestCase): + + def testMakeDescriptorWithNestedFields(self): + file_descriptor_proto = descriptor_pb2.FileDescriptorProto() + file_descriptor_proto.name = 'Foo2' + message_type = file_descriptor_proto.message_type.add() + message_type.name = file_descriptor_proto.name + nested_type = message_type.nested_type.add() + nested_type.name = 'Sub' + enum_type = nested_type.enum_type.add() + enum_type.name = 'FOO' + enum_type_val = enum_type.value.add() + enum_type_val.name = 'BAR' + enum_type_val.number = 3 + field = message_type.field.add() + field.number = 1 + field.name = 'uint64_field' + field.label = descriptor.FieldDescriptor.LABEL_REQUIRED + field.type = descriptor.FieldDescriptor.TYPE_UINT64 + field = message_type.field.add() + field.number = 2 + field.name = 'nested_message_field' + field.label = descriptor.FieldDescriptor.LABEL_REQUIRED + field.type = descriptor.FieldDescriptor.TYPE_MESSAGE + field.type_name = 'Sub' + enum_field = nested_type.field.add() + enum_field.number = 2 + enum_field.name = 'bar_field' + enum_field.label = descriptor.FieldDescriptor.LABEL_REQUIRED + enum_field.type = descriptor.FieldDescriptor.TYPE_ENUM + enum_field.type_name = 'Foo2.Sub.FOO' + + result = descriptor.MakeDescriptor(message_type) + self.assertEqual(result.fields[0].cpp_type, + descriptor.FieldDescriptor.CPPTYPE_UINT64) + self.assertEqual(result.fields[1].cpp_type, + descriptor.FieldDescriptor.CPPTYPE_MESSAGE) + self.assertEqual(result.fields[1].message_type.containing_type, + result) + self.assertEqual(result.nested_types[0].fields[0].full_name, + 'Foo2.Sub.bar_field') + self.assertEqual(result.nested_types[0].fields[0].enum_type, + result.nested_types[0].enum_types[0]) + + def testMakeDescriptorWithUnsignedIntField(self): + file_descriptor_proto = descriptor_pb2.FileDescriptorProto() + file_descriptor_proto.name = 'Foo' + message_type = file_descriptor_proto.message_type.add() + message_type.name = file_descriptor_proto.name + enum_type = message_type.enum_type.add() + enum_type.name = 'FOO' + enum_type_val = enum_type.value.add() + enum_type_val.name = 'BAR' + enum_type_val.number = 3 + field = message_type.field.add() + field.number = 1 + field.name = 'uint64_field' + field.label = descriptor.FieldDescriptor.LABEL_REQUIRED + field.type = descriptor.FieldDescriptor.TYPE_UINT64 + enum_field = message_type.field.add() + enum_field.number = 2 + enum_field.name = 'bar_field' + enum_field.label = descriptor.FieldDescriptor.LABEL_REQUIRED + enum_field.type = descriptor.FieldDescriptor.TYPE_ENUM + enum_field.type_name = 'Foo.FOO' + + result = descriptor.MakeDescriptor(message_type) + self.assertEqual(result.fields[0].cpp_type, + descriptor.FieldDescriptor.CPPTYPE_UINT64) + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/internal/encoder.py b/pythonlib/google/protobuf/internal/encoder.py new file mode 100644 index 0000000..0a7c041 --- /dev/null +++ b/pythonlib/google/protobuf/internal/encoder.py @@ -0,0 +1,788 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +#PY25 compatible for GAE. +# +# Copyright 2009 Google Inc. All Rights Reserved. + +"""Code for encoding protocol message primitives. + +Contains the logic for encoding every logical protocol field type +into one of the 5 physical wire types. + +This code is designed to push the Python interpreter's performance to the +limits. + +The basic idea is that at startup time, for every field (i.e. every +FieldDescriptor) we construct two functions: a "sizer" and an "encoder". The +sizer takes a value of this field's type and computes its byte size. The +encoder takes a writer function and a value. It encodes the value into byte +strings and invokes the writer function to write those strings. Typically the +writer function is the write() method of a cStringIO. + +We try to do as much work as possible when constructing the writer and the +sizer rather than when calling them. In particular: +* We copy any needed global functions to local variables, so that we do not need + to do costly global table lookups at runtime. +* Similarly, we try to do any attribute lookups at startup time if possible. +* Every field's tag is encoded to bytes at startup, since it can't change at + runtime. +* Whatever component of the field size we can compute at startup, we do. +* We *avoid* sharing code if doing so would make the code slower and not sharing + does not burden us too much. For example, encoders for repeated fields do + not just call the encoders for singular fields in a loop because this would + add an extra function call overhead for every loop iteration; instead, we + manually inline the single-value encoder into the loop. +* If a Python function lacks a return statement, Python actually generates + instructions to pop the result of the last statement off the stack, push + None onto the stack, and then return that. If we really don't care what + value is returned, then we can save two instructions by returning the + result of the last statement. It looks funny but it helps. +* We assume that type and bounds checking has happened at a higher level. +""" + +__author__ = 'kenton@google.com (Kenton Varda)' + +import struct +import sys ##PY25 +_PY2 = sys.version_info[0] < 3 ##PY25 +from google.protobuf.internal import wire_format + + +# This will overflow and thus become IEEE-754 "infinity". We would use +# "float('inf')" but it doesn't work on Windows pre-Python-2.6. +_POS_INF = 1e10000 +_NEG_INF = -_POS_INF + + +def _VarintSize(value): + """Compute the size of a varint value.""" + if value <= 0x7f: return 1 + if value <= 0x3fff: return 2 + if value <= 0x1fffff: return 3 + if value <= 0xfffffff: return 4 + if value <= 0x7ffffffff: return 5 + if value <= 0x3ffffffffff: return 6 + if value <= 0x1ffffffffffff: return 7 + if value <= 0xffffffffffffff: return 8 + if value <= 0x7fffffffffffffff: return 9 + return 10 + + +def _SignedVarintSize(value): + """Compute the size of a signed varint value.""" + if value < 0: return 10 + if value <= 0x7f: return 1 + if value <= 0x3fff: return 2 + if value <= 0x1fffff: return 3 + if value <= 0xfffffff: return 4 + if value <= 0x7ffffffff: return 5 + if value <= 0x3ffffffffff: return 6 + if value <= 0x1ffffffffffff: return 7 + if value <= 0xffffffffffffff: return 8 + if value <= 0x7fffffffffffffff: return 9 + return 10 + + +def _TagSize(field_number): + """Returns the number of bytes required to serialize a tag with this field + number.""" + # Just pass in type 0, since the type won't affect the tag+type size. + return _VarintSize(wire_format.PackTag(field_number, 0)) + + +# -------------------------------------------------------------------- +# In this section we define some generic sizers. Each of these functions +# takes parameters specific to a particular field type, e.g. int32 or fixed64. +# It returns another function which in turn takes parameters specific to a +# particular field, e.g. the field number and whether it is repeated or packed. +# Look at the next section to see how these are used. + + +def _SimpleSizer(compute_value_size): + """A sizer which uses the function compute_value_size to compute the size of + each value. Typically compute_value_size is _VarintSize.""" + + def SpecificSizer(field_number, is_repeated, is_packed): + tag_size = _TagSize(field_number) + if is_packed: + local_VarintSize = _VarintSize + def PackedFieldSize(value): + result = 0 + for element in value: + result += compute_value_size(element) + return result + local_VarintSize(result) + tag_size + return PackedFieldSize + elif is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + result += compute_value_size(element) + return result + return RepeatedFieldSize + else: + def FieldSize(value): + return tag_size + compute_value_size(value) + return FieldSize + + return SpecificSizer + + +def _ModifiedSizer(compute_value_size, modify_value): + """Like SimpleSizer, but modify_value is invoked on each value before it is + passed to compute_value_size. modify_value is typically ZigZagEncode.""" + + def SpecificSizer(field_number, is_repeated, is_packed): + tag_size = _TagSize(field_number) + if is_packed: + local_VarintSize = _VarintSize + def PackedFieldSize(value): + result = 0 + for element in value: + result += compute_value_size(modify_value(element)) + return result + local_VarintSize(result) + tag_size + return PackedFieldSize + elif is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + result += compute_value_size(modify_value(element)) + return result + return RepeatedFieldSize + else: + def FieldSize(value): + return tag_size + compute_value_size(modify_value(value)) + return FieldSize + + return SpecificSizer + + +def _FixedSizer(value_size): + """Like _SimpleSizer except for a fixed-size field. The input is the size + of one value.""" + + def SpecificSizer(field_number, is_repeated, is_packed): + tag_size = _TagSize(field_number) + if is_packed: + local_VarintSize = _VarintSize + def PackedFieldSize(value): + result = len(value) * value_size + return result + local_VarintSize(result) + tag_size + return PackedFieldSize + elif is_repeated: + element_size = value_size + tag_size + def RepeatedFieldSize(value): + return len(value) * element_size + return RepeatedFieldSize + else: + field_size = value_size + tag_size + def FieldSize(value): + return field_size + return FieldSize + + return SpecificSizer + + +# ==================================================================== +# Here we declare a sizer constructor for each field type. Each "sizer +# constructor" is a function that takes (field_number, is_repeated, is_packed) +# as parameters and returns a sizer, which in turn takes a field value as +# a parameter and returns its encoded size. + + +Int32Sizer = Int64Sizer = EnumSizer = _SimpleSizer(_SignedVarintSize) + +UInt32Sizer = UInt64Sizer = _SimpleSizer(_VarintSize) + +SInt32Sizer = SInt64Sizer = _ModifiedSizer( + _SignedVarintSize, wire_format.ZigZagEncode) + +Fixed32Sizer = SFixed32Sizer = FloatSizer = _FixedSizer(4) +Fixed64Sizer = SFixed64Sizer = DoubleSizer = _FixedSizer(8) + +BoolSizer = _FixedSizer(1) + + +def StringSizer(field_number, is_repeated, is_packed): + """Returns a sizer for a string field.""" + + tag_size = _TagSize(field_number) + local_VarintSize = _VarintSize + local_len = len + assert not is_packed + if is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + l = local_len(element.encode('utf-8')) + result += local_VarintSize(l) + l + return result + return RepeatedFieldSize + else: + def FieldSize(value): + l = local_len(value.encode('utf-8')) + return tag_size + local_VarintSize(l) + l + return FieldSize + + +def BytesSizer(field_number, is_repeated, is_packed): + """Returns a sizer for a bytes field.""" + + tag_size = _TagSize(field_number) + local_VarintSize = _VarintSize + local_len = len + assert not is_packed + if is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + l = local_len(element) + result += local_VarintSize(l) + l + return result + return RepeatedFieldSize + else: + def FieldSize(value): + l = local_len(value) + return tag_size + local_VarintSize(l) + l + return FieldSize + + +def GroupSizer(field_number, is_repeated, is_packed): + """Returns a sizer for a group field.""" + + tag_size = _TagSize(field_number) * 2 + assert not is_packed + if is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + result += element.ByteSize() + return result + return RepeatedFieldSize + else: + def FieldSize(value): + return tag_size + value.ByteSize() + return FieldSize + + +def MessageSizer(field_number, is_repeated, is_packed): + """Returns a sizer for a message field.""" + + tag_size = _TagSize(field_number) + local_VarintSize = _VarintSize + assert not is_packed + if is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + l = element.ByteSize() + result += local_VarintSize(l) + l + return result + return RepeatedFieldSize + else: + def FieldSize(value): + l = value.ByteSize() + return tag_size + local_VarintSize(l) + l + return FieldSize + + +# -------------------------------------------------------------------- +# MessageSet is special. + + +def MessageSetItemSizer(field_number): + """Returns a sizer for extensions of MessageSet. + + The message set message looks like this: + message MessageSet { + repeated group Item = 1 { + required int32 type_id = 2; + required string message = 3; + } + } + """ + static_size = (_TagSize(1) * 2 + _TagSize(2) + _VarintSize(field_number) + + _TagSize(3)) + local_VarintSize = _VarintSize + + def FieldSize(value): + l = value.ByteSize() + return static_size + local_VarintSize(l) + l + + return FieldSize + + +# ==================================================================== +# Encoders! + + +def _VarintEncoder(): + """Return an encoder for a basic varint value (does not include tag).""" + + local_chr = _PY2 and chr or (lambda x: bytes((x,))) ##PY25 +##!PY25 local_chr = chr if bytes is str else lambda x: bytes((x,)) + def EncodeVarint(write, value): + bits = value & 0x7f + value >>= 7 + while value: + write(local_chr(0x80|bits)) + bits = value & 0x7f + value >>= 7 + return write(local_chr(bits)) + + return EncodeVarint + + +def _SignedVarintEncoder(): + """Return an encoder for a basic signed varint value (does not include + tag).""" + + local_chr = _PY2 and chr or (lambda x: bytes((x,))) ##PY25 +##!PY25 local_chr = chr if bytes is str else lambda x: bytes((x,)) + def EncodeSignedVarint(write, value): + if value < 0: + value += (1 << 64) + bits = value & 0x7f + value >>= 7 + while value: + write(local_chr(0x80|bits)) + bits = value & 0x7f + value >>= 7 + return write(local_chr(bits)) + + return EncodeSignedVarint + + +_EncodeVarint = _VarintEncoder() +_EncodeSignedVarint = _SignedVarintEncoder() + + +def _VarintBytes(value): + """Encode the given integer as a varint and return the bytes. This is only + called at startup time so it doesn't need to be fast.""" + + pieces = [] + _EncodeVarint(pieces.append, value) + return "".encode("latin1").join(pieces) ##PY25 +##!PY25 return b"".join(pieces) + + +def TagBytes(field_number, wire_type): + """Encode the given tag and return the bytes. Only called at startup.""" + + return _VarintBytes(wire_format.PackTag(field_number, wire_type)) + +# -------------------------------------------------------------------- +# As with sizers (see above), we have a number of common encoder +# implementations. + + +def _SimpleEncoder(wire_type, encode_value, compute_value_size): + """Return a constructor for an encoder for fields of a particular type. + + Args: + wire_type: The field's wire type, for encoding tags. + encode_value: A function which encodes an individual value, e.g. + _EncodeVarint(). + compute_value_size: A function which computes the size of an individual + value, e.g. _VarintSize(). + """ + + def SpecificEncoder(field_number, is_repeated, is_packed): + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value): + write(tag_bytes) + size = 0 + for element in value: + size += compute_value_size(element) + local_EncodeVarint(write, size) + for element in value: + encode_value(write, element) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value): + for element in value: + write(tag_bytes) + encode_value(write, element) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value): + write(tag_bytes) + return encode_value(write, value) + return EncodeField + + return SpecificEncoder + + +def _ModifiedEncoder(wire_type, encode_value, compute_value_size, modify_value): + """Like SimpleEncoder but additionally invokes modify_value on every value + before passing it to encode_value. Usually modify_value is ZigZagEncode.""" + + def SpecificEncoder(field_number, is_repeated, is_packed): + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value): + write(tag_bytes) + size = 0 + for element in value: + size += compute_value_size(modify_value(element)) + local_EncodeVarint(write, size) + for element in value: + encode_value(write, modify_value(element)) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value): + for element in value: + write(tag_bytes) + encode_value(write, modify_value(element)) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value): + write(tag_bytes) + return encode_value(write, modify_value(value)) + return EncodeField + + return SpecificEncoder + + +def _StructPackEncoder(wire_type, format): + """Return a constructor for an encoder for a fixed-width field. + + Args: + wire_type: The field's wire type, for encoding tags. + format: The format string to pass to struct.pack(). + """ + + value_size = struct.calcsize(format) + + def SpecificEncoder(field_number, is_repeated, is_packed): + local_struct_pack = struct.pack + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value): + write(tag_bytes) + local_EncodeVarint(write, len(value) * value_size) + for element in value: + write(local_struct_pack(format, element)) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value): + for element in value: + write(tag_bytes) + write(local_struct_pack(format, element)) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value): + write(tag_bytes) + return write(local_struct_pack(format, value)) + return EncodeField + + return SpecificEncoder + + +def _FloatingPointEncoder(wire_type, format): + """Return a constructor for an encoder for float fields. + + This is like StructPackEncoder, but catches errors that may be due to + passing non-finite floating-point values to struct.pack, and makes a + second attempt to encode those values. + + Args: + wire_type: The field's wire type, for encoding tags. + format: The format string to pass to struct.pack(). + """ + + b = _PY2 and (lambda x:x) or (lambda x:x.encode('latin1')) ##PY25 + value_size = struct.calcsize(format) + if value_size == 4: + def EncodeNonFiniteOrRaise(write, value): + # Remember that the serialized form uses little-endian byte order. + if value == _POS_INF: + write(b('\x00\x00\x80\x7F')) ##PY25 +##!PY25 write(b'\x00\x00\x80\x7F') + elif value == _NEG_INF: + write(b('\x00\x00\x80\xFF')) ##PY25 +##!PY25 write(b'\x00\x00\x80\xFF') + elif value != value: # NaN + write(b('\x00\x00\xC0\x7F')) ##PY25 +##!PY25 write(b'\x00\x00\xC0\x7F') + else: + raise + elif value_size == 8: + def EncodeNonFiniteOrRaise(write, value): + if value == _POS_INF: + write(b('\x00\x00\x00\x00\x00\x00\xF0\x7F')) ##PY25 +##!PY25 write(b'\x00\x00\x00\x00\x00\x00\xF0\x7F') + elif value == _NEG_INF: + write(b('\x00\x00\x00\x00\x00\x00\xF0\xFF')) ##PY25 +##!PY25 write(b'\x00\x00\x00\x00\x00\x00\xF0\xFF') + elif value != value: # NaN + write(b('\x00\x00\x00\x00\x00\x00\xF8\x7F')) ##PY25 +##!PY25 write(b'\x00\x00\x00\x00\x00\x00\xF8\x7F') + else: + raise + else: + raise ValueError('Can\'t encode floating-point values that are ' + '%d bytes long (only 4 or 8)' % value_size) + + def SpecificEncoder(field_number, is_repeated, is_packed): + local_struct_pack = struct.pack + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value): + write(tag_bytes) + local_EncodeVarint(write, len(value) * value_size) + for element in value: + # This try/except block is going to be faster than any code that + # we could write to check whether element is finite. + try: + write(local_struct_pack(format, element)) + except SystemError: + EncodeNonFiniteOrRaise(write, element) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value): + for element in value: + write(tag_bytes) + try: + write(local_struct_pack(format, element)) + except SystemError: + EncodeNonFiniteOrRaise(write, element) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value): + write(tag_bytes) + try: + write(local_struct_pack(format, value)) + except SystemError: + EncodeNonFiniteOrRaise(write, value) + return EncodeField + + return SpecificEncoder + + +# ==================================================================== +# Here we declare an encoder constructor for each field type. These work +# very similarly to sizer constructors, described earlier. + + +Int32Encoder = Int64Encoder = EnumEncoder = _SimpleEncoder( + wire_format.WIRETYPE_VARINT, _EncodeSignedVarint, _SignedVarintSize) + +UInt32Encoder = UInt64Encoder = _SimpleEncoder( + wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize) + +SInt32Encoder = SInt64Encoder = _ModifiedEncoder( + wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize, + wire_format.ZigZagEncode) + +# Note that Python conveniently guarantees that when using the '<' prefix on +# formats, they will also have the same size across all platforms (as opposed +# to without the prefix, where their sizes depend on the C compiler's basic +# type sizes). +Fixed32Encoder = _StructPackEncoder(wire_format.WIRETYPE_FIXED32, '\n\x04loop\x18\x01 \x01(\x0b\x32\x30.google.protobuf.python.internal.Factory2Message*<\n\x0c\x46\x61\x63tory2Enum\x12\x15\n\x11\x46\x41\x43TORY_2_VALUE_0\x10\x00\x12\x15\n\x11\x46\x41\x43TORY_2_VALUE_1\x10\x01:H\n\ranother_field\x12\x30.google.protobuf.python.internal.Factory1Message\x18\xea\x07 \x01(\t') + , + dependencies=[google.protobuf.internal.factory_test1_pb2.DESCRIPTOR,]) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +_FACTORY2ENUM = _descriptor.EnumDescriptor( + name='Factory2Enum', + full_name='google.protobuf.python.internal.Factory2Enum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='FACTORY_2_VALUE_0', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='FACTORY_2_VALUE_1', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1705, + serialized_end=1765, +) +_sym_db.RegisterEnumDescriptor(_FACTORY2ENUM) + +Factory2Enum = enum_type_wrapper.EnumTypeWrapper(_FACTORY2ENUM) +FACTORY_2_VALUE_0 = 0 +FACTORY_2_VALUE_1 = 1 + +ANOTHER_FIELD_FIELD_NUMBER = 1002 +another_field = _descriptor.FieldDescriptor( + name='another_field', full_name='google.protobuf.python.internal.another_field', index=0, + number=1002, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) + +_FACTORY2MESSAGE_NESTEDFACTORY2ENUM = _descriptor.EnumDescriptor( + name='NestedFactory2Enum', + full_name='google.protobuf.python.internal.Factory2Message.NestedFactory2Enum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NESTED_FACTORY_2_VALUE_0', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NESTED_FACTORY_2_VALUE_1', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1454, + serialized_end=1534, +) +_sym_db.RegisterEnumDescriptor(_FACTORY2MESSAGE_NESTEDFACTORY2ENUM) + + +_FACTORY2MESSAGE_NESTEDFACTORY2MESSAGE = _descriptor.Descriptor( + name='NestedFactory2Message', + full_name='google.protobuf.python.internal.Factory2Message.NestedFactory2Message', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='value', full_name='google.protobuf.python.internal.Factory2Message.NestedFactory2Message.value', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1371, + serialized_end=1409, +) + +_FACTORY2MESSAGE_GROUPED = _descriptor.Descriptor( + name='Grouped', + full_name='google.protobuf.python.internal.Factory2Message.Grouped', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='part_1', full_name='google.protobuf.python.internal.Factory2Message.Grouped.part_1', index=0, + number=13, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='part_2', full_name='google.protobuf.python.internal.Factory2Message.Grouped.part_2', index=1, + number=14, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1411, + serialized_end=1452, +) + +_FACTORY2MESSAGE = _descriptor.Descriptor( + name='Factory2Message', + full_name='google.protobuf.python.internal.Factory2Message', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='mandatory', full_name='google.protobuf.python.internal.Factory2Message.mandatory', index=0, + number=1, type=5, cpp_type=1, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='factory_2_enum', full_name='google.protobuf.python.internal.Factory2Message.factory_2_enum', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_factory_2_enum', full_name='google.protobuf.python.internal.Factory2Message.nested_factory_2_enum', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_factory_2_message', full_name='google.protobuf.python.internal.Factory2Message.nested_factory_2_message', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='factory_1_message', full_name='google.protobuf.python.internal.Factory2Message.factory_1_message', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='factory_1_enum', full_name='google.protobuf.python.internal.Factory2Message.factory_1_enum', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_factory_1_enum', full_name='google.protobuf.python.internal.Factory2Message.nested_factory_1_enum', index=6, + number=7, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_factory_1_message', full_name='google.protobuf.python.internal.Factory2Message.nested_factory_1_message', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='circular_message', full_name='google.protobuf.python.internal.Factory2Message.circular_message', index=8, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='scalar_value', full_name='google.protobuf.python.internal.Factory2Message.scalar_value', index=9, + number=10, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='list_value', full_name='google.protobuf.python.internal.Factory2Message.list_value', index=10, + number=11, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='grouped', full_name='google.protobuf.python.internal.Factory2Message.grouped', index=11, + number=12, type=10, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='loop', full_name='google.protobuf.python.internal.Factory2Message.loop', index=12, + number=15, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='int_with_default', full_name='google.protobuf.python.internal.Factory2Message.int_with_default', index=13, + number=16, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1776, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='double_with_default', full_name='google.protobuf.python.internal.Factory2Message.double_with_default', index=14, + number=17, type=1, cpp_type=5, label=1, + has_default_value=True, default_value=9.99, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='string_with_default', full_name='google.protobuf.python.internal.Factory2Message.string_with_default', index=15, + number=18, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("hello world").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bool_with_default', full_name='google.protobuf.python.internal.Factory2Message.bool_with_default', index=16, + number=19, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='enum_with_default', full_name='google.protobuf.python.internal.Factory2Message.enum_with_default', index=17, + number=20, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bytes_with_default', full_name='google.protobuf.python.internal.Factory2Message.bytes_with_default', index=18, + number=21, type=12, cpp_type=9, label=1, + has_default_value=True, default_value=_b("a\373\000c"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='oneof_int', full_name='google.protobuf.python.internal.Factory2Message.oneof_int', index=19, + number=22, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='oneof_string', full_name='google.protobuf.python.internal.Factory2Message.oneof_string', index=20, + number=23, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + _descriptor.FieldDescriptor( + name='one_more_field', full_name='google.protobuf.python.internal.Factory2Message.one_more_field', index=0, + number=1001, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + ], + nested_types=[_FACTORY2MESSAGE_NESTEDFACTORY2MESSAGE, _FACTORY2MESSAGE_GROUPED, ], + enum_types=[ + _FACTORY2MESSAGE_NESTEDFACTORY2ENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='oneof_field', full_name='google.protobuf.python.internal.Factory2Message.oneof_field', + index=0, containing_type=None, fields=[]), + ], + serialized_start=128, + serialized_end=1624, +) + + +_LOOPMESSAGE = _descriptor.Descriptor( + name='LoopMessage', + full_name='google.protobuf.python.internal.LoopMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='loop', full_name='google.protobuf.python.internal.LoopMessage.loop', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1626, + serialized_end=1703, +) + +_FACTORY2MESSAGE_NESTEDFACTORY2MESSAGE.containing_type = _FACTORY2MESSAGE +_FACTORY2MESSAGE_GROUPED.containing_type = _FACTORY2MESSAGE +_FACTORY2MESSAGE.fields_by_name['factory_2_enum'].enum_type = _FACTORY2ENUM +_FACTORY2MESSAGE.fields_by_name['nested_factory_2_enum'].enum_type = _FACTORY2MESSAGE_NESTEDFACTORY2ENUM +_FACTORY2MESSAGE.fields_by_name['nested_factory_2_message'].message_type = _FACTORY2MESSAGE_NESTEDFACTORY2MESSAGE +_FACTORY2MESSAGE.fields_by_name['factory_1_message'].message_type = google.protobuf.internal.factory_test1_pb2._FACTORY1MESSAGE +_FACTORY2MESSAGE.fields_by_name['factory_1_enum'].enum_type = google.protobuf.internal.factory_test1_pb2._FACTORY1ENUM +_FACTORY2MESSAGE.fields_by_name['nested_factory_1_enum'].enum_type = google.protobuf.internal.factory_test1_pb2._FACTORY1MESSAGE_NESTEDFACTORY1ENUM +_FACTORY2MESSAGE.fields_by_name['nested_factory_1_message'].message_type = google.protobuf.internal.factory_test1_pb2._FACTORY1MESSAGE_NESTEDFACTORY1MESSAGE +_FACTORY2MESSAGE.fields_by_name['circular_message'].message_type = _FACTORY2MESSAGE +_FACTORY2MESSAGE.fields_by_name['grouped'].message_type = _FACTORY2MESSAGE_GROUPED +_FACTORY2MESSAGE.fields_by_name['loop'].message_type = _LOOPMESSAGE +_FACTORY2MESSAGE.fields_by_name['enum_with_default'].enum_type = _FACTORY2ENUM +_FACTORY2MESSAGE_NESTEDFACTORY2ENUM.containing_type = _FACTORY2MESSAGE +_FACTORY2MESSAGE.oneofs_by_name['oneof_field'].fields.append( + _FACTORY2MESSAGE.fields_by_name['oneof_int']) +_FACTORY2MESSAGE.fields_by_name['oneof_int'].containing_oneof = _FACTORY2MESSAGE.oneofs_by_name['oneof_field'] +_FACTORY2MESSAGE.oneofs_by_name['oneof_field'].fields.append( + _FACTORY2MESSAGE.fields_by_name['oneof_string']) +_FACTORY2MESSAGE.fields_by_name['oneof_string'].containing_oneof = _FACTORY2MESSAGE.oneofs_by_name['oneof_field'] +_LOOPMESSAGE.fields_by_name['loop'].message_type = _FACTORY2MESSAGE +DESCRIPTOR.message_types_by_name['Factory2Message'] = _FACTORY2MESSAGE +DESCRIPTOR.message_types_by_name['LoopMessage'] = _LOOPMESSAGE +DESCRIPTOR.enum_types_by_name['Factory2Enum'] = _FACTORY2ENUM +DESCRIPTOR.extensions_by_name['another_field'] = another_field + +Factory2Message = _reflection.GeneratedProtocolMessageType('Factory2Message', (_message.Message,), dict( + + NestedFactory2Message = _reflection.GeneratedProtocolMessageType('NestedFactory2Message', (_message.Message,), dict( + DESCRIPTOR = _FACTORY2MESSAGE_NESTEDFACTORY2MESSAGE, + __module__ = 'google.protobuf.internal.factory_test2_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.Factory2Message.NestedFactory2Message) + )) + , + + Grouped = _reflection.GeneratedProtocolMessageType('Grouped', (_message.Message,), dict( + DESCRIPTOR = _FACTORY2MESSAGE_GROUPED, + __module__ = 'google.protobuf.internal.factory_test2_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.Factory2Message.Grouped) + )) + , + DESCRIPTOR = _FACTORY2MESSAGE, + __module__ = 'google.protobuf.internal.factory_test2_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.Factory2Message) + )) +_sym_db.RegisterMessage(Factory2Message) +_sym_db.RegisterMessage(Factory2Message.NestedFactory2Message) +_sym_db.RegisterMessage(Factory2Message.Grouped) + +LoopMessage = _reflection.GeneratedProtocolMessageType('LoopMessage', (_message.Message,), dict( + DESCRIPTOR = _LOOPMESSAGE, + __module__ = 'google.protobuf.internal.factory_test2_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.LoopMessage) + )) +_sym_db.RegisterMessage(LoopMessage) + +google.protobuf.internal.factory_test1_pb2.Factory1Message.RegisterExtension(another_field) +google.protobuf.internal.factory_test1_pb2.Factory1Message.RegisterExtension(_FACTORY2MESSAGE.extensions_by_name['one_more_field']) + +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/internal/generator_test.py b/pythonlib/google/protobuf/internal/generator_test.py new file mode 100644 index 0000000..5818060 --- /dev/null +++ b/pythonlib/google/protobuf/internal/generator_test.py @@ -0,0 +1,343 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +# TODO(robinson): Flesh this out considerably. We focused on reflection_test.py +# first, since it's testing the subtler code, and since it provides decent +# indirect testing of the protocol compiler output. + +"""Unittest that directly tests the output of the pure-Python protocol +compiler. See //google/protobuf/reflection_test.py for a test which +further ensures that we can use Python protocol message objects as we expect. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +from google.apputils import basetest +from google.protobuf.internal import test_bad_identifiers_pb2 +from google.protobuf import unittest_custom_options_pb2 +from google.protobuf import unittest_import_pb2 +from google.protobuf import unittest_import_public_pb2 +from google.protobuf import unittest_mset_pb2 +from google.protobuf import unittest_no_generic_services_pb2 +from google.protobuf import unittest_pb2 +from google.protobuf import service +from google.protobuf import symbol_database + +MAX_EXTENSION = 536870912 + + +class GeneratorTest(basetest.TestCase): + + def testNestedMessageDescriptor(self): + field_name = 'optional_nested_message' + proto_type = unittest_pb2.TestAllTypes + self.assertEqual( + proto_type.NestedMessage.DESCRIPTOR, + proto_type.DESCRIPTOR.fields_by_name[field_name].message_type) + + def testEnums(self): + # We test only module-level enums here. + # TODO(robinson): Examine descriptors directly to check + # enum descriptor output. + self.assertEqual(4, unittest_pb2.FOREIGN_FOO) + self.assertEqual(5, unittest_pb2.FOREIGN_BAR) + self.assertEqual(6, unittest_pb2.FOREIGN_BAZ) + + proto = unittest_pb2.TestAllTypes() + self.assertEqual(1, proto.FOO) + self.assertEqual(1, unittest_pb2.TestAllTypes.FOO) + self.assertEqual(2, proto.BAR) + self.assertEqual(2, unittest_pb2.TestAllTypes.BAR) + self.assertEqual(3, proto.BAZ) + self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ) + + def testExtremeDefaultValues(self): + message = unittest_pb2.TestExtremeDefaultValues() + + # Python pre-2.6 does not have isinf() or isnan() functions, so we have + # to provide our own. + def isnan(val): + # NaN is never equal to itself. + return val != val + def isinf(val): + # Infinity times zero equals NaN. + return not isnan(val) and isnan(val * 0) + + self.assertTrue(isinf(message.inf_double)) + self.assertTrue(message.inf_double > 0) + self.assertTrue(isinf(message.neg_inf_double)) + self.assertTrue(message.neg_inf_double < 0) + self.assertTrue(isnan(message.nan_double)) + + self.assertTrue(isinf(message.inf_float)) + self.assertTrue(message.inf_float > 0) + self.assertTrue(isinf(message.neg_inf_float)) + self.assertTrue(message.neg_inf_float < 0) + self.assertTrue(isnan(message.nan_float)) + self.assertEqual("? ? ?? ?? ??? ??/ ??-", message.cpp_trigraph) + + def testHasDefaultValues(self): + desc = unittest_pb2.TestAllTypes.DESCRIPTOR + + expected_has_default_by_name = { + 'optional_int32': False, + 'repeated_int32': False, + 'optional_nested_message': False, + 'default_int32': True, + } + + has_default_by_name = dict( + [(f.name, f.has_default_value) + for f in desc.fields + if f.name in expected_has_default_by_name]) + self.assertEqual(expected_has_default_by_name, has_default_by_name) + + def testContainingTypeBehaviorForExtensions(self): + self.assertEqual(unittest_pb2.optional_int32_extension.containing_type, + unittest_pb2.TestAllExtensions.DESCRIPTOR) + self.assertEqual(unittest_pb2.TestRequired.single.containing_type, + unittest_pb2.TestAllExtensions.DESCRIPTOR) + + def testExtensionScope(self): + self.assertEqual(unittest_pb2.optional_int32_extension.extension_scope, + None) + self.assertEqual(unittest_pb2.TestRequired.single.extension_scope, + unittest_pb2.TestRequired.DESCRIPTOR) + + def testIsExtension(self): + self.assertTrue(unittest_pb2.optional_int32_extension.is_extension) + self.assertTrue(unittest_pb2.TestRequired.single.is_extension) + + message_descriptor = unittest_pb2.TestRequired.DESCRIPTOR + non_extension_descriptor = message_descriptor.fields_by_name['a'] + self.assertTrue(not non_extension_descriptor.is_extension) + + def testOptions(self): + proto = unittest_mset_pb2.TestMessageSet() + self.assertTrue(proto.DESCRIPTOR.GetOptions().message_set_wire_format) + + def testMessageWithCustomOptions(self): + proto = unittest_custom_options_pb2.TestMessageWithCustomOptions() + enum_options = proto.DESCRIPTOR.enum_types_by_name['AnEnum'].GetOptions() + self.assertTrue(enum_options is not None) + # TODO(gps): We really should test for the presense of the enum_opt1 + # extension and for its value to be set to -789. + + def testNestedTypes(self): + self.assertEquals( + set(unittest_pb2.TestAllTypes.DESCRIPTOR.nested_types), + set([ + unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR, + unittest_pb2.TestAllTypes.OptionalGroup.DESCRIPTOR, + unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR, + ])) + self.assertEqual(unittest_pb2.TestEmptyMessage.DESCRIPTOR.nested_types, []) + self.assertEqual( + unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.nested_types, []) + + def testContainingType(self): + self.assertTrue( + unittest_pb2.TestEmptyMessage.DESCRIPTOR.containing_type is None) + self.assertTrue( + unittest_pb2.TestAllTypes.DESCRIPTOR.containing_type is None) + self.assertEqual( + unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type, + unittest_pb2.TestAllTypes.DESCRIPTOR) + self.assertEqual( + unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type, + unittest_pb2.TestAllTypes.DESCRIPTOR) + self.assertEqual( + unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR.containing_type, + unittest_pb2.TestAllTypes.DESCRIPTOR) + + def testContainingTypeInEnumDescriptor(self): + self.assertTrue(unittest_pb2._FOREIGNENUM.containing_type is None) + self.assertEqual(unittest_pb2._TESTALLTYPES_NESTEDENUM.containing_type, + unittest_pb2.TestAllTypes.DESCRIPTOR) + + def testPackage(self): + self.assertEqual( + unittest_pb2.TestAllTypes.DESCRIPTOR.file.package, + 'protobuf_unittest') + desc = unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR + self.assertEqual(desc.file.package, 'protobuf_unittest') + self.assertEqual( + unittest_import_pb2.ImportMessage.DESCRIPTOR.file.package, + 'protobuf_unittest_import') + + self.assertEqual( + unittest_pb2._FOREIGNENUM.file.package, 'protobuf_unittest') + self.assertEqual( + unittest_pb2._TESTALLTYPES_NESTEDENUM.file.package, + 'protobuf_unittest') + self.assertEqual( + unittest_import_pb2._IMPORTENUM.file.package, + 'protobuf_unittest_import') + + def testExtensionRange(self): + self.assertEqual( + unittest_pb2.TestAllTypes.DESCRIPTOR.extension_ranges, []) + self.assertEqual( + unittest_pb2.TestAllExtensions.DESCRIPTOR.extension_ranges, + [(1, MAX_EXTENSION)]) + self.assertEqual( + unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR.extension_ranges, + [(42, 43), (4143, 4244), (65536, MAX_EXTENSION)]) + + def testFileDescriptor(self): + self.assertEqual(unittest_pb2.DESCRIPTOR.name, + 'google/protobuf/unittest.proto') + self.assertEqual(unittest_pb2.DESCRIPTOR.package, 'protobuf_unittest') + self.assertFalse(unittest_pb2.DESCRIPTOR.serialized_pb is None) + self.assertEqual(unittest_pb2.DESCRIPTOR.dependencies, + [unittest_import_pb2.DESCRIPTOR]) + self.assertEqual(unittest_import_pb2.DESCRIPTOR.dependencies, + [unittest_import_public_pb2.DESCRIPTOR]) + + def testNoGenericServices(self): + self.assertTrue(hasattr(unittest_no_generic_services_pb2, "TestMessage")) + self.assertTrue(hasattr(unittest_no_generic_services_pb2, "FOO")) + self.assertTrue(hasattr(unittest_no_generic_services_pb2, "test_extension")) + + # Make sure unittest_no_generic_services_pb2 has no services subclassing + # Proto2 Service class. + if hasattr(unittest_no_generic_services_pb2, "TestService"): + self.assertFalse(issubclass(unittest_no_generic_services_pb2.TestService, + service.Service)) + + def testMessageTypesByName(self): + file_type = unittest_pb2.DESCRIPTOR + self.assertEqual( + unittest_pb2._TESTALLTYPES, + file_type.message_types_by_name[unittest_pb2._TESTALLTYPES.name]) + + # Nested messages shouldn't be included in the message_types_by_name + # dictionary (like in the C++ API). + self.assertFalse( + unittest_pb2._TESTALLTYPES_NESTEDMESSAGE.name in + file_type.message_types_by_name) + + def testEnumTypesByName(self): + file_type = unittest_pb2.DESCRIPTOR + self.assertEqual( + unittest_pb2._FOREIGNENUM, + file_type.enum_types_by_name[unittest_pb2._FOREIGNENUM.name]) + + def testExtensionsByName(self): + file_type = unittest_pb2.DESCRIPTOR + self.assertEqual( + unittest_pb2.my_extension_string, + file_type.extensions_by_name[unittest_pb2.my_extension_string.name]) + + def testPublicImports(self): + # Test public imports as embedded message. + all_type_proto = unittest_pb2.TestAllTypes() + self.assertEqual(0, all_type_proto.optional_public_import_message.e) + + # PublicImportMessage is actually defined in unittest_import_public_pb2 + # module, and is public imported by unittest_import_pb2 module. + public_import_proto = unittest_import_pb2.PublicImportMessage() + self.assertEqual(0, public_import_proto.e) + self.assertTrue(unittest_import_public_pb2.PublicImportMessage is + unittest_import_pb2.PublicImportMessage) + + def testBadIdentifiers(self): + # We're just testing that the code was imported without problems. + message = test_bad_identifiers_pb2.TestBadIdentifiers() + self.assertEqual(message.Extensions[test_bad_identifiers_pb2.message], + "foo") + self.assertEqual(message.Extensions[test_bad_identifiers_pb2.descriptor], + "bar") + self.assertEqual(message.Extensions[test_bad_identifiers_pb2.reflection], + "baz") + self.assertEqual(message.Extensions[test_bad_identifiers_pb2.service], + "qux") + + def testOneof(self): + desc = unittest_pb2.TestAllTypes.DESCRIPTOR + self.assertEqual(1, len(desc.oneofs)) + self.assertEqual('oneof_field', desc.oneofs[0].name) + self.assertEqual(0, desc.oneofs[0].index) + self.assertIs(desc, desc.oneofs[0].containing_type) + self.assertIs(desc.oneofs[0], desc.oneofs_by_name['oneof_field']) + nested_names = set(['oneof_uint32', 'oneof_nested_message', + 'oneof_string', 'oneof_bytes']) + self.assertSameElements( + nested_names, + [field.name for field in desc.oneofs[0].fields]) + for field_name, field_desc in desc.fields_by_name.iteritems(): + if field_name in nested_names: + self.assertIs(desc.oneofs[0], field_desc.containing_oneof) + else: + self.assertIsNone(field_desc.containing_oneof) + + +class SymbolDatabaseRegistrationTest(basetest.TestCase): + """Checks that messages, enums and files are correctly registered.""" + + def testGetSymbol(self): + self.assertEquals( + unittest_pb2.TestAllTypes, symbol_database.Default().GetSymbol( + 'protobuf_unittest.TestAllTypes')) + self.assertEquals( + unittest_pb2.TestAllTypes.NestedMessage, + symbol_database.Default().GetSymbol( + 'protobuf_unittest.TestAllTypes.NestedMessage')) + with self.assertRaises(KeyError): + symbol_database.Default().GetSymbol('protobuf_unittest.NestedMessage') + self.assertEquals( + unittest_pb2.TestAllTypes.OptionalGroup, + symbol_database.Default().GetSymbol( + 'protobuf_unittest.TestAllTypes.OptionalGroup')) + self.assertEquals( + unittest_pb2.TestAllTypes.RepeatedGroup, + symbol_database.Default().GetSymbol( + 'protobuf_unittest.TestAllTypes.RepeatedGroup')) + + def testEnums(self): + self.assertEquals( + 'protobuf_unittest.ForeignEnum', + symbol_database.Default().pool.FindEnumTypeByName( + 'protobuf_unittest.ForeignEnum').full_name) + self.assertEquals( + 'protobuf_unittest.TestAllTypes.NestedEnum', + symbol_database.Default().pool.FindEnumTypeByName( + 'protobuf_unittest.TestAllTypes.NestedEnum').full_name) + + def testFindFileByName(self): + self.assertEquals( + 'google/protobuf/unittest.proto', + symbol_database.Default().pool.FindFileByName( + 'google/protobuf/unittest.proto').name) + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/internal/message_factory_python_test.py b/pythonlib/google/protobuf/internal/message_factory_python_test.py new file mode 100644 index 0000000..6a2053f --- /dev/null +++ b/pythonlib/google/protobuf/internal/message_factory_python_test.py @@ -0,0 +1,54 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Tests for ..public.message_factory for the pure Python implementation.""" + +import os +os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'python' + +# We must set the implementation version above before the google3 imports. +# pylint: disable=g-import-not-at-top +from google.apputils import basetest +from google.protobuf.internal import api_implementation +# Run all tests from the original module by putting them in our namespace. +# pylint: disable=wildcard-import +from google.protobuf.internal.message_factory_test import * + + +class ConfirmPurePythonTest(basetest.TestCase): + + def testImplementationSetting(self): + self.assertEqual('python', api_implementation.Type()) + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/internal/message_factory_test.py b/pythonlib/google/protobuf/internal/message_factory_test.py new file mode 100644 index 0000000..c53d77b --- /dev/null +++ b/pythonlib/google/protobuf/internal/message_factory_test.py @@ -0,0 +1,131 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Tests for google.protobuf.message_factory.""" + +__author__ = 'matthewtoia@google.com (Matt Toia)' + +from google.apputils import basetest +from google.protobuf import descriptor_pb2 +from google.protobuf.internal import factory_test1_pb2 +from google.protobuf.internal import factory_test2_pb2 +from google.protobuf import descriptor_database +from google.protobuf import descriptor_pool +from google.protobuf import message_factory + + +class MessageFactoryTest(basetest.TestCase): + + def setUp(self): + self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString( + factory_test1_pb2.DESCRIPTOR.serialized_pb) + self.factory_test2_fd = descriptor_pb2.FileDescriptorProto.FromString( + factory_test2_pb2.DESCRIPTOR.serialized_pb) + + def _ExerciseDynamicClass(self, cls): + msg = cls() + msg.mandatory = 42 + msg.nested_factory_2_enum = 0 + msg.nested_factory_2_message.value = 'nested message value' + msg.factory_1_message.factory_1_enum = 1 + msg.factory_1_message.nested_factory_1_enum = 0 + msg.factory_1_message.nested_factory_1_message.value = ( + 'nested message value') + msg.factory_1_message.scalar_value = 22 + msg.factory_1_message.list_value.extend([u'one', u'two', u'three']) + msg.factory_1_message.list_value.append(u'four') + msg.factory_1_enum = 1 + msg.nested_factory_1_enum = 0 + msg.nested_factory_1_message.value = 'nested message value' + msg.circular_message.mandatory = 1 + msg.circular_message.circular_message.mandatory = 2 + msg.circular_message.scalar_value = 'one deep' + msg.scalar_value = 'zero deep' + msg.list_value.extend([u'four', u'three', u'two']) + msg.list_value.append(u'one') + msg.grouped.add() + msg.grouped[0].part_1 = 'hello' + msg.grouped[0].part_2 = 'world' + msg.grouped.add(part_1='testing', part_2='123') + msg.loop.loop.mandatory = 2 + msg.loop.loop.loop.loop.mandatory = 4 + serialized = msg.SerializeToString() + converted = factory_test2_pb2.Factory2Message.FromString(serialized) + reserialized = converted.SerializeToString() + self.assertEquals(serialized, reserialized) + result = cls.FromString(reserialized) + self.assertEquals(msg, result) + + def testGetPrototype(self): + db = descriptor_database.DescriptorDatabase() + pool = descriptor_pool.DescriptorPool(db) + db.Add(self.factory_test1_fd) + db.Add(self.factory_test2_fd) + factory = message_factory.MessageFactory() + cls = factory.GetPrototype(pool.FindMessageTypeByName( + 'google.protobuf.python.internal.Factory2Message')) + self.assertIsNot(cls, factory_test2_pb2.Factory2Message) + self._ExerciseDynamicClass(cls) + cls2 = factory.GetPrototype(pool.FindMessageTypeByName( + 'google.protobuf.python.internal.Factory2Message')) + self.assertIs(cls, cls2) + + def testGetMessages(self): + # performed twice because multiple calls with the same input must be allowed + for _ in range(2): + messages = message_factory.GetMessages([self.factory_test2_fd, + self.factory_test1_fd]) + self.assertContainsSubset( + ['google.protobuf.python.internal.Factory2Message', + 'google.protobuf.python.internal.Factory1Message'], + messages.keys()) + self._ExerciseDynamicClass( + messages['google.protobuf.python.internal.Factory2Message']) + self.assertContainsSubset( + ['google.protobuf.python.internal.Factory2Message.one_more_field', + 'google.protobuf.python.internal.another_field'], + (messages['google.protobuf.python.internal.Factory1Message'] + ._extensions_by_name.keys())) + factory_msg1 = messages['google.protobuf.python.internal.Factory1Message'] + msg1 = messages['google.protobuf.python.internal.Factory1Message']() + ext1 = factory_msg1._extensions_by_name[ + 'google.protobuf.python.internal.Factory2Message.one_more_field'] + ext2 = factory_msg1._extensions_by_name[ + 'google.protobuf.python.internal.another_field'] + msg1.Extensions[ext1] = 'test1' + msg1.Extensions[ext2] = 'test2' + self.assertEquals('test1', msg1.Extensions[ext1]) + self.assertEquals('test2', msg1.Extensions[ext2]) + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/internal/message_listener.py b/pythonlib/google/protobuf/internal/message_listener.py new file mode 100644 index 0000000..1080234 --- /dev/null +++ b/pythonlib/google/protobuf/internal/message_listener.py @@ -0,0 +1,78 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Defines a listener interface for observing certain +state transitions on Message objects. + +Also defines a null implementation of this interface. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + + +class MessageListener(object): + + """Listens for modifications made to a message. Meant to be registered via + Message._SetListener(). + + Attributes: + dirty: If True, then calling Modified() would be a no-op. This can be + used to avoid these calls entirely in the common case. + """ + + def Modified(self): + """Called every time the message is modified in such a way that the parent + message may need to be updated. This currently means either: + (a) The message was modified for the first time, so the parent message + should henceforth mark the message as present. + (b) The message's cached byte size became dirty -- i.e. the message was + modified for the first time after a previous call to ByteSize(). + Therefore the parent should also mark its byte size as dirty. + Note that (a) implies (b), since new objects start out with a client cached + size (zero). However, we document (a) explicitly because it is important. + + Modified() will *only* be called in response to one of these two events -- + not every time the sub-message is modified. + + Note that if the listener's |dirty| attribute is true, then calling + Modified at the moment would be a no-op, so it can be skipped. Performance- + sensitive callers should check this attribute directly before calling since + it will be true most of the time. + """ + + raise NotImplementedError + + +class NullMessageListener(object): + + """No-op MessageListener implementation.""" + + def Modified(self): + pass diff --git a/pythonlib/google/protobuf/internal/message_python_test.py b/pythonlib/google/protobuf/internal/message_python_test.py new file mode 100644 index 0000000..baf1504 --- /dev/null +++ b/pythonlib/google/protobuf/internal/message_python_test.py @@ -0,0 +1,54 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Tests for ..public.message for the pure Python implementation.""" + +import os +os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'python' + +# We must set the implementation version above before the google3 imports. +# pylint: disable=g-import-not-at-top +from google.apputils import basetest +from google.protobuf.internal import api_implementation +# Run all tests from the original module by putting them in our namespace. +# pylint: disable=wildcard-import +from google.protobuf.internal.message_test import * + + +class ConfirmPurePythonTest(basetest.TestCase): + + def testImplementationSetting(self): + self.assertEqual('python', api_implementation.Type()) + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/internal/message_test.py b/pythonlib/google/protobuf/internal/message_test.py new file mode 100644 index 0000000..f4c4ae0 --- /dev/null +++ b/pythonlib/google/protobuf/internal/message_test.py @@ -0,0 +1,676 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Tests python protocol buffers against the golden message. + +Note that the golden messages exercise every known field type, thus this +test ends up exercising and verifying nearly all of the parsing and +serialization code in the whole library. + +TODO(kenton): Merge with wire_format_test? It doesn't make a whole lot of +sense to call this a test of the "message" module, which only declares an +abstract interface. +""" + +__author__ = 'gps@google.com (Gregory P. Smith)' + +import copy +import math +import operator +import pickle +import sys + +from google.apputils import basetest +from google.protobuf import unittest_pb2 +from google.protobuf.internal import api_implementation +from google.protobuf.internal import test_util +from google.protobuf import message + +# Python pre-2.6 does not have isinf() or isnan() functions, so we have +# to provide our own. +def isnan(val): + # NaN is never equal to itself. + return val != val +def isinf(val): + # Infinity times zero equals NaN. + return not isnan(val) and isnan(val * 0) +def IsPosInf(val): + return isinf(val) and (val > 0) +def IsNegInf(val): + return isinf(val) and (val < 0) + + +class MessageTest(basetest.TestCase): + + def testBadUtf8String(self): + if api_implementation.Type() != 'python': + self.skipTest("Skipping testBadUtf8String, currently only the python " + "api implementation raises UnicodeDecodeError when a " + "string field contains bad utf-8.") + bad_utf8_data = test_util.GoldenFileData('bad_utf8_string') + with self.assertRaises(UnicodeDecodeError) as context: + unittest_pb2.TestAllTypes.FromString(bad_utf8_data) + self.assertIn('field: protobuf_unittest.TestAllTypes.optional_string', + str(context.exception)) + + def testGoldenMessage(self): + golden_data = test_util.GoldenFileData( + 'golden_message_oneof_implemented') + golden_message = unittest_pb2.TestAllTypes() + golden_message.ParseFromString(golden_data) + test_util.ExpectAllFieldsSet(self, golden_message) + self.assertEqual(golden_data, golden_message.SerializeToString()) + golden_copy = copy.deepcopy(golden_message) + self.assertEqual(golden_data, golden_copy.SerializeToString()) + + def testGoldenExtensions(self): + golden_data = test_util.GoldenFileData('golden_message') + golden_message = unittest_pb2.TestAllExtensions() + golden_message.ParseFromString(golden_data) + all_set = unittest_pb2.TestAllExtensions() + test_util.SetAllExtensions(all_set) + self.assertEquals(all_set, golden_message) + self.assertEqual(golden_data, golden_message.SerializeToString()) + golden_copy = copy.deepcopy(golden_message) + self.assertEqual(golden_data, golden_copy.SerializeToString()) + + def testGoldenPackedMessage(self): + golden_data = test_util.GoldenFileData('golden_packed_fields_message') + golden_message = unittest_pb2.TestPackedTypes() + golden_message.ParseFromString(golden_data) + all_set = unittest_pb2.TestPackedTypes() + test_util.SetAllPackedFields(all_set) + self.assertEquals(all_set, golden_message) + self.assertEqual(golden_data, all_set.SerializeToString()) + golden_copy = copy.deepcopy(golden_message) + self.assertEqual(golden_data, golden_copy.SerializeToString()) + + def testGoldenPackedExtensions(self): + golden_data = test_util.GoldenFileData('golden_packed_fields_message') + golden_message = unittest_pb2.TestPackedExtensions() + golden_message.ParseFromString(golden_data) + all_set = unittest_pb2.TestPackedExtensions() + test_util.SetAllPackedExtensions(all_set) + self.assertEquals(all_set, golden_message) + self.assertEqual(golden_data, all_set.SerializeToString()) + golden_copy = copy.deepcopy(golden_message) + self.assertEqual(golden_data, golden_copy.SerializeToString()) + + def testPickleSupport(self): + golden_data = test_util.GoldenFileData('golden_message') + golden_message = unittest_pb2.TestAllTypes() + golden_message.ParseFromString(golden_data) + pickled_message = pickle.dumps(golden_message) + + unpickled_message = pickle.loads(pickled_message) + self.assertEquals(unpickled_message, golden_message) + + + def testPickleIncompleteProto(self): + golden_message = unittest_pb2.TestRequired(a=1) + pickled_message = pickle.dumps(golden_message) + + unpickled_message = pickle.loads(pickled_message) + self.assertEquals(unpickled_message, golden_message) + self.assertEquals(unpickled_message.a, 1) + # This is still an incomplete proto - so serializing should fail + self.assertRaises(message.EncodeError, unpickled_message.SerializeToString) + + def testPositiveInfinity(self): + golden_data = (b'\x5D\x00\x00\x80\x7F' + b'\x61\x00\x00\x00\x00\x00\x00\xF0\x7F' + b'\xCD\x02\x00\x00\x80\x7F' + b'\xD1\x02\x00\x00\x00\x00\x00\x00\xF0\x7F') + golden_message = unittest_pb2.TestAllTypes() + golden_message.ParseFromString(golden_data) + self.assertTrue(IsPosInf(golden_message.optional_float)) + self.assertTrue(IsPosInf(golden_message.optional_double)) + self.assertTrue(IsPosInf(golden_message.repeated_float[0])) + self.assertTrue(IsPosInf(golden_message.repeated_double[0])) + self.assertEqual(golden_data, golden_message.SerializeToString()) + + def testNegativeInfinity(self): + golden_data = (b'\x5D\x00\x00\x80\xFF' + b'\x61\x00\x00\x00\x00\x00\x00\xF0\xFF' + b'\xCD\x02\x00\x00\x80\xFF' + b'\xD1\x02\x00\x00\x00\x00\x00\x00\xF0\xFF') + golden_message = unittest_pb2.TestAllTypes() + golden_message.ParseFromString(golden_data) + self.assertTrue(IsNegInf(golden_message.optional_float)) + self.assertTrue(IsNegInf(golden_message.optional_double)) + self.assertTrue(IsNegInf(golden_message.repeated_float[0])) + self.assertTrue(IsNegInf(golden_message.repeated_double[0])) + self.assertEqual(golden_data, golden_message.SerializeToString()) + + def testNotANumber(self): + golden_data = (b'\x5D\x00\x00\xC0\x7F' + b'\x61\x00\x00\x00\x00\x00\x00\xF8\x7F' + b'\xCD\x02\x00\x00\xC0\x7F' + b'\xD1\x02\x00\x00\x00\x00\x00\x00\xF8\x7F') + golden_message = unittest_pb2.TestAllTypes() + golden_message.ParseFromString(golden_data) + self.assertTrue(isnan(golden_message.optional_float)) + self.assertTrue(isnan(golden_message.optional_double)) + self.assertTrue(isnan(golden_message.repeated_float[0])) + self.assertTrue(isnan(golden_message.repeated_double[0])) + + # The protocol buffer may serialize to any one of multiple different + # representations of a NaN. Rather than verify a specific representation, + # verify the serialized string can be converted into a correctly + # behaving protocol buffer. + serialized = golden_message.SerializeToString() + message = unittest_pb2.TestAllTypes() + message.ParseFromString(serialized) + self.assertTrue(isnan(message.optional_float)) + self.assertTrue(isnan(message.optional_double)) + self.assertTrue(isnan(message.repeated_float[0])) + self.assertTrue(isnan(message.repeated_double[0])) + + def testPositiveInfinityPacked(self): + golden_data = (b'\xA2\x06\x04\x00\x00\x80\x7F' + b'\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF0\x7F') + golden_message = unittest_pb2.TestPackedTypes() + golden_message.ParseFromString(golden_data) + self.assertTrue(IsPosInf(golden_message.packed_float[0])) + self.assertTrue(IsPosInf(golden_message.packed_double[0])) + self.assertEqual(golden_data, golden_message.SerializeToString()) + + def testNegativeInfinityPacked(self): + golden_data = (b'\xA2\x06\x04\x00\x00\x80\xFF' + b'\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF0\xFF') + golden_message = unittest_pb2.TestPackedTypes() + golden_message.ParseFromString(golden_data) + self.assertTrue(IsNegInf(golden_message.packed_float[0])) + self.assertTrue(IsNegInf(golden_message.packed_double[0])) + self.assertEqual(golden_data, golden_message.SerializeToString()) + + def testNotANumberPacked(self): + golden_data = (b'\xA2\x06\x04\x00\x00\xC0\x7F' + b'\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF8\x7F') + golden_message = unittest_pb2.TestPackedTypes() + golden_message.ParseFromString(golden_data) + self.assertTrue(isnan(golden_message.packed_float[0])) + self.assertTrue(isnan(golden_message.packed_double[0])) + + serialized = golden_message.SerializeToString() + message = unittest_pb2.TestPackedTypes() + message.ParseFromString(serialized) + self.assertTrue(isnan(message.packed_float[0])) + self.assertTrue(isnan(message.packed_double[0])) + + def testExtremeFloatValues(self): + message = unittest_pb2.TestAllTypes() + + # Most positive exponent, no significand bits set. + kMostPosExponentNoSigBits = math.pow(2, 127) + message.optional_float = kMostPosExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == kMostPosExponentNoSigBits) + + # Most positive exponent, one significand bit set. + kMostPosExponentOneSigBit = 1.5 * math.pow(2, 127) + message.optional_float = kMostPosExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == kMostPosExponentOneSigBit) + + # Repeat last two cases with values of same magnitude, but negative. + message.optional_float = -kMostPosExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == -kMostPosExponentNoSigBits) + + message.optional_float = -kMostPosExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == -kMostPosExponentOneSigBit) + + # Most negative exponent, no significand bits set. + kMostNegExponentNoSigBits = math.pow(2, -127) + message.optional_float = kMostNegExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == kMostNegExponentNoSigBits) + + # Most negative exponent, one significand bit set. + kMostNegExponentOneSigBit = 1.5 * math.pow(2, -127) + message.optional_float = kMostNegExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == kMostNegExponentOneSigBit) + + # Repeat last two cases with values of the same magnitude, but negative. + message.optional_float = -kMostNegExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == -kMostNegExponentNoSigBits) + + message.optional_float = -kMostNegExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == -kMostNegExponentOneSigBit) + + def testExtremeDoubleValues(self): + message = unittest_pb2.TestAllTypes() + + # Most positive exponent, no significand bits set. + kMostPosExponentNoSigBits = math.pow(2, 1023) + message.optional_double = kMostPosExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == kMostPosExponentNoSigBits) + + # Most positive exponent, one significand bit set. + kMostPosExponentOneSigBit = 1.5 * math.pow(2, 1023) + message.optional_double = kMostPosExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == kMostPosExponentOneSigBit) + + # Repeat last two cases with values of same magnitude, but negative. + message.optional_double = -kMostPosExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == -kMostPosExponentNoSigBits) + + message.optional_double = -kMostPosExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == -kMostPosExponentOneSigBit) + + # Most negative exponent, no significand bits set. + kMostNegExponentNoSigBits = math.pow(2, -1023) + message.optional_double = kMostNegExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == kMostNegExponentNoSigBits) + + # Most negative exponent, one significand bit set. + kMostNegExponentOneSigBit = 1.5 * math.pow(2, -1023) + message.optional_double = kMostNegExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == kMostNegExponentOneSigBit) + + # Repeat last two cases with values of the same magnitude, but negative. + message.optional_double = -kMostNegExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == -kMostNegExponentNoSigBits) + + message.optional_double = -kMostNegExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == -kMostNegExponentOneSigBit) + + def testFloatPrinting(self): + message = unittest_pb2.TestAllTypes() + message.optional_float = 2.0 + self.assertEqual(str(message), 'optional_float: 2.0\n') + + def testHighPrecisionFloatPrinting(self): + message = unittest_pb2.TestAllTypes() + message.optional_double = 0.12345678912345678 + if sys.version_info.major >= 3: + self.assertEqual(str(message), 'optional_double: 0.12345678912345678\n') + else: + self.assertEqual(str(message), 'optional_double: 0.123456789123\n') + + def testUnknownFieldPrinting(self): + populated = unittest_pb2.TestAllTypes() + test_util.SetAllNonLazyFields(populated) + empty = unittest_pb2.TestEmptyMessage() + empty.ParseFromString(populated.SerializeToString()) + self.assertEqual(str(empty), '') + + def testSortingRepeatedScalarFieldsDefaultComparator(self): + """Check some different types with the default comparator.""" + message = unittest_pb2.TestAllTypes() + + # TODO(mattp): would testing more scalar types strengthen test? + message.repeated_int32.append(1) + message.repeated_int32.append(3) + message.repeated_int32.append(2) + message.repeated_int32.sort() + self.assertEqual(message.repeated_int32[0], 1) + self.assertEqual(message.repeated_int32[1], 2) + self.assertEqual(message.repeated_int32[2], 3) + + message.repeated_float.append(1.1) + message.repeated_float.append(1.3) + message.repeated_float.append(1.2) + message.repeated_float.sort() + self.assertAlmostEqual(message.repeated_float[0], 1.1) + self.assertAlmostEqual(message.repeated_float[1], 1.2) + self.assertAlmostEqual(message.repeated_float[2], 1.3) + + message.repeated_string.append('a') + message.repeated_string.append('c') + message.repeated_string.append('b') + message.repeated_string.sort() + self.assertEqual(message.repeated_string[0], 'a') + self.assertEqual(message.repeated_string[1], 'b') + self.assertEqual(message.repeated_string[2], 'c') + + message.repeated_bytes.append(b'a') + message.repeated_bytes.append(b'c') + message.repeated_bytes.append(b'b') + message.repeated_bytes.sort() + self.assertEqual(message.repeated_bytes[0], b'a') + self.assertEqual(message.repeated_bytes[1], b'b') + self.assertEqual(message.repeated_bytes[2], b'c') + + def testSortingRepeatedScalarFieldsCustomComparator(self): + """Check some different types with custom comparator.""" + message = unittest_pb2.TestAllTypes() + + message.repeated_int32.append(-3) + message.repeated_int32.append(-2) + message.repeated_int32.append(-1) + message.repeated_int32.sort(key=abs) + self.assertEqual(message.repeated_int32[0], -1) + self.assertEqual(message.repeated_int32[1], -2) + self.assertEqual(message.repeated_int32[2], -3) + + message.repeated_string.append('aaa') + message.repeated_string.append('bb') + message.repeated_string.append('c') + message.repeated_string.sort(key=len) + self.assertEqual(message.repeated_string[0], 'c') + self.assertEqual(message.repeated_string[1], 'bb') + self.assertEqual(message.repeated_string[2], 'aaa') + + def testSortingRepeatedCompositeFieldsCustomComparator(self): + """Check passing a custom comparator to sort a repeated composite field.""" + message = unittest_pb2.TestAllTypes() + + message.repeated_nested_message.add().bb = 1 + message.repeated_nested_message.add().bb = 3 + message.repeated_nested_message.add().bb = 2 + message.repeated_nested_message.add().bb = 6 + message.repeated_nested_message.add().bb = 5 + message.repeated_nested_message.add().bb = 4 + message.repeated_nested_message.sort(key=operator.attrgetter('bb')) + self.assertEqual(message.repeated_nested_message[0].bb, 1) + self.assertEqual(message.repeated_nested_message[1].bb, 2) + self.assertEqual(message.repeated_nested_message[2].bb, 3) + self.assertEqual(message.repeated_nested_message[3].bb, 4) + self.assertEqual(message.repeated_nested_message[4].bb, 5) + self.assertEqual(message.repeated_nested_message[5].bb, 6) + + def testRepeatedCompositeFieldSortArguments(self): + """Check sorting a repeated composite field using list.sort() arguments.""" + message = unittest_pb2.TestAllTypes() + + get_bb = operator.attrgetter('bb') + cmp_bb = lambda a, b: cmp(a.bb, b.bb) + message.repeated_nested_message.add().bb = 1 + message.repeated_nested_message.add().bb = 3 + message.repeated_nested_message.add().bb = 2 + message.repeated_nested_message.add().bb = 6 + message.repeated_nested_message.add().bb = 5 + message.repeated_nested_message.add().bb = 4 + message.repeated_nested_message.sort(key=get_bb) + self.assertEqual([k.bb for k in message.repeated_nested_message], + [1, 2, 3, 4, 5, 6]) + message.repeated_nested_message.sort(key=get_bb, reverse=True) + self.assertEqual([k.bb for k in message.repeated_nested_message], + [6, 5, 4, 3, 2, 1]) + if sys.version_info.major >= 3: return # No cmp sorting in PY3. + message.repeated_nested_message.sort(sort_function=cmp_bb) + self.assertEqual([k.bb for k in message.repeated_nested_message], + [1, 2, 3, 4, 5, 6]) + message.repeated_nested_message.sort(cmp=cmp_bb, reverse=True) + self.assertEqual([k.bb for k in message.repeated_nested_message], + [6, 5, 4, 3, 2, 1]) + + def testRepeatedScalarFieldSortArguments(self): + """Check sorting a scalar field using list.sort() arguments.""" + message = unittest_pb2.TestAllTypes() + + message.repeated_int32.append(-3) + message.repeated_int32.append(-2) + message.repeated_int32.append(-1) + message.repeated_int32.sort(key=abs) + self.assertEqual(list(message.repeated_int32), [-1, -2, -3]) + message.repeated_int32.sort(key=abs, reverse=True) + self.assertEqual(list(message.repeated_int32), [-3, -2, -1]) + if sys.version_info.major < 3: # No cmp sorting in PY3. + abs_cmp = lambda a, b: cmp(abs(a), abs(b)) + message.repeated_int32.sort(sort_function=abs_cmp) + self.assertEqual(list(message.repeated_int32), [-1, -2, -3]) + message.repeated_int32.sort(cmp=abs_cmp, reverse=True) + self.assertEqual(list(message.repeated_int32), [-3, -2, -1]) + + message.repeated_string.append('aaa') + message.repeated_string.append('bb') + message.repeated_string.append('c') + message.repeated_string.sort(key=len) + self.assertEqual(list(message.repeated_string), ['c', 'bb', 'aaa']) + message.repeated_string.sort(key=len, reverse=True) + self.assertEqual(list(message.repeated_string), ['aaa', 'bb', 'c']) + if sys.version_info.major < 3: # No cmp sorting in PY3. + len_cmp = lambda a, b: cmp(len(a), len(b)) + message.repeated_string.sort(sort_function=len_cmp) + self.assertEqual(list(message.repeated_string), ['c', 'bb', 'aaa']) + message.repeated_string.sort(cmp=len_cmp, reverse=True) + self.assertEqual(list(message.repeated_string), ['aaa', 'bb', 'c']) + + def testRepeatedFieldsComparable(self): + m1 = unittest_pb2.TestAllTypes() + m2 = unittest_pb2.TestAllTypes() + m1.repeated_int32.append(0) + m1.repeated_int32.append(1) + m1.repeated_int32.append(2) + m2.repeated_int32.append(0) + m2.repeated_int32.append(1) + m2.repeated_int32.append(2) + m1.repeated_nested_message.add().bb = 1 + m1.repeated_nested_message.add().bb = 2 + m1.repeated_nested_message.add().bb = 3 + m2.repeated_nested_message.add().bb = 1 + m2.repeated_nested_message.add().bb = 2 + m2.repeated_nested_message.add().bb = 3 + + if sys.version_info.major >= 3: return # No cmp() in PY3. + + # These comparisons should not raise errors. + _ = m1 < m2 + _ = m1.repeated_nested_message < m2.repeated_nested_message + + # Make sure cmp always works. If it wasn't defined, these would be + # id() comparisons and would all fail. + self.assertEqual(cmp(m1, m2), 0) + self.assertEqual(cmp(m1.repeated_int32, m2.repeated_int32), 0) + self.assertEqual(cmp(m1.repeated_int32, [0, 1, 2]), 0) + self.assertEqual(cmp(m1.repeated_nested_message, + m2.repeated_nested_message), 0) + with self.assertRaises(TypeError): + # Can't compare repeated composite containers to lists. + cmp(m1.repeated_nested_message, m2.repeated_nested_message[:]) + + # TODO(anuraag): Implement extensiondict comparison in C++ and then add test + + def testParsingMerge(self): + """Check the merge behavior when a required or optional field appears + multiple times in the input.""" + messages = [ + unittest_pb2.TestAllTypes(), + unittest_pb2.TestAllTypes(), + unittest_pb2.TestAllTypes() ] + messages[0].optional_int32 = 1 + messages[1].optional_int64 = 2 + messages[2].optional_int32 = 3 + messages[2].optional_string = 'hello' + + merged_message = unittest_pb2.TestAllTypes() + merged_message.optional_int32 = 3 + merged_message.optional_int64 = 2 + merged_message.optional_string = 'hello' + + generator = unittest_pb2.TestParsingMerge.RepeatedFieldsGenerator() + generator.field1.extend(messages) + generator.field2.extend(messages) + generator.field3.extend(messages) + generator.ext1.extend(messages) + generator.ext2.extend(messages) + generator.group1.add().field1.MergeFrom(messages[0]) + generator.group1.add().field1.MergeFrom(messages[1]) + generator.group1.add().field1.MergeFrom(messages[2]) + generator.group2.add().field1.MergeFrom(messages[0]) + generator.group2.add().field1.MergeFrom(messages[1]) + generator.group2.add().field1.MergeFrom(messages[2]) + + data = generator.SerializeToString() + parsing_merge = unittest_pb2.TestParsingMerge() + parsing_merge.ParseFromString(data) + + # Required and optional fields should be merged. + self.assertEqual(parsing_merge.required_all_types, merged_message) + self.assertEqual(parsing_merge.optional_all_types, merged_message) + self.assertEqual(parsing_merge.optionalgroup.optional_group_all_types, + merged_message) + self.assertEqual(parsing_merge.Extensions[ + unittest_pb2.TestParsingMerge.optional_ext], + merged_message) + + # Repeated fields should not be merged. + self.assertEqual(len(parsing_merge.repeated_all_types), 3) + self.assertEqual(len(parsing_merge.repeatedgroup), 3) + self.assertEqual(len(parsing_merge.Extensions[ + unittest_pb2.TestParsingMerge.repeated_ext]), 3) + + def ensureNestedMessageExists(self, msg, attribute): + """Make sure that a nested message object exists. + + As soon as a nested message attribute is accessed, it will be present in the + _fields dict, without being marked as actually being set. + """ + getattr(msg, attribute) + self.assertFalse(msg.HasField(attribute)) + + def testOneofGetCaseNonexistingField(self): + m = unittest_pb2.TestAllTypes() + self.assertRaises(ValueError, m.WhichOneof, 'no_such_oneof_field') + + def testOneofSemantics(self): + m = unittest_pb2.TestAllTypes() + self.assertIs(None, m.WhichOneof('oneof_field')) + + m.oneof_uint32 = 11 + self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field')) + self.assertTrue(m.HasField('oneof_uint32')) + + m.oneof_string = u'foo' + self.assertEqual('oneof_string', m.WhichOneof('oneof_field')) + self.assertFalse(m.HasField('oneof_uint32')) + self.assertTrue(m.HasField('oneof_string')) + + m.oneof_nested_message.bb = 11 + self.assertEqual('oneof_nested_message', m.WhichOneof('oneof_field')) + self.assertFalse(m.HasField('oneof_string')) + self.assertTrue(m.HasField('oneof_nested_message')) + + m.oneof_bytes = b'bb' + self.assertEqual('oneof_bytes', m.WhichOneof('oneof_field')) + self.assertFalse(m.HasField('oneof_nested_message')) + self.assertTrue(m.HasField('oneof_bytes')) + + def testOneofCompositeFieldReadAccess(self): + m = unittest_pb2.TestAllTypes() + m.oneof_uint32 = 11 + + self.ensureNestedMessageExists(m, 'oneof_nested_message') + self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field')) + self.assertEqual(11, m.oneof_uint32) + + def testOneofHasField(self): + m = unittest_pb2.TestAllTypes() + self.assertFalse(m.HasField('oneof_field')) + m.oneof_uint32 = 11 + self.assertTrue(m.HasField('oneof_field')) + m.oneof_bytes = b'bb' + self.assertTrue(m.HasField('oneof_field')) + m.ClearField('oneof_bytes') + self.assertFalse(m.HasField('oneof_field')) + + def testOneofClearField(self): + m = unittest_pb2.TestAllTypes() + m.oneof_uint32 = 11 + m.ClearField('oneof_field') + self.assertFalse(m.HasField('oneof_field')) + self.assertFalse(m.HasField('oneof_uint32')) + self.assertIs(None, m.WhichOneof('oneof_field')) + + def testOneofClearSetField(self): + m = unittest_pb2.TestAllTypes() + m.oneof_uint32 = 11 + m.ClearField('oneof_uint32') + self.assertFalse(m.HasField('oneof_field')) + self.assertFalse(m.HasField('oneof_uint32')) + self.assertIs(None, m.WhichOneof('oneof_field')) + + def testOneofClearUnsetField(self): + m = unittest_pb2.TestAllTypes() + m.oneof_uint32 = 11 + self.ensureNestedMessageExists(m, 'oneof_nested_message') + m.ClearField('oneof_nested_message') + self.assertEqual(11, m.oneof_uint32) + self.assertTrue(m.HasField('oneof_field')) + self.assertTrue(m.HasField('oneof_uint32')) + self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field')) + + + + def testSortEmptyRepeatedCompositeContainer(self): + """Exercise a scenario that has led to segfaults in the past. + """ + m = unittest_pb2.TestAllTypes() + m.repeated_nested_message.sort() + + def testHasFieldOnRepeatedField(self): + """Using HasField on a repeated field should raise an exception. + """ + m = unittest_pb2.TestAllTypes() + with self.assertRaises(ValueError) as _: + m.HasField('repeated_int32') + + +class ValidTypeNamesTest(basetest.TestCase): + + def assertImportFromName(self, msg, base_name): + # Parse to extra 'some.name' as a string. + tp_name = str(type(msg)).split("'")[1] + valid_names = ('Repeated%sContainer' % base_name, + 'Repeated%sFieldContainer' % base_name) + self.assertTrue(any(tp_name.endswith(v) for v in valid_names), + '%r does end with any of %r' % (tp_name, valid_names)) + + parts = tp_name.split('.') + class_name = parts[-1] + module_name = '.'.join(parts[:-1]) + __import__(module_name, fromlist=[class_name]) + + def testTypeNamesCanBeImported(self): + # If import doesn't work, pickling won't work either. + pb = unittest_pb2.TestAllTypes() + self.assertImportFromName(pb.repeated_int32, 'Scalar') + self.assertImportFromName(pb.repeated_nested_message, 'Composite') + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/internal/missing_enum_values.proto b/pythonlib/google/protobuf/internal/missing_enum_values.proto new file mode 100644 index 0000000..c9ae58b --- /dev/null +++ b/pythonlib/google/protobuf/internal/missing_enum_values.proto @@ -0,0 +1,50 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +package google.protobuf.python.internal; + +message TestEnumValues { + enum NestedEnum { + ZERO = 0; + ONE = 1; + } + optional NestedEnum optional_nested_enum = 1; + repeated NestedEnum repeated_nested_enum = 2; + repeated NestedEnum packed_nested_enum = 3 [packed = true]; +} + +message TestMissingEnumValues { + enum NestedEnum { + TWO = 2; + } + optional NestedEnum optional_nested_enum = 1; + repeated NestedEnum repeated_nested_enum = 2; + repeated NestedEnum packed_nested_enum = 3 [packed = true]; +} diff --git a/pythonlib/google/protobuf/internal/missing_enum_values_pb2.py b/pythonlib/google/protobuf/internal/missing_enum_values_pb2.py new file mode 100644 index 0000000..1869318 --- /dev/null +++ b/pythonlib/google/protobuf/internal/missing_enum_values_pb2.py @@ -0,0 +1,187 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/internal/missing_enum_values.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/internal/missing_enum_values.proto', + package='google.protobuf.python.internal', + serialized_pb=_b('\n2google/protobuf/internal/missing_enum_values.proto\x12\x1fgoogle.protobuf.python.internal\"\xc1\x02\n\x0eTestEnumValues\x12X\n\x14optional_nested_enum\x18\x01 \x01(\x0e\x32:.google.protobuf.python.internal.TestEnumValues.NestedEnum\x12X\n\x14repeated_nested_enum\x18\x02 \x03(\x0e\x32:.google.protobuf.python.internal.TestEnumValues.NestedEnum\x12Z\n\x12packed_nested_enum\x18\x03 \x03(\x0e\x32:.google.protobuf.python.internal.TestEnumValues.NestedEnumB\x02\x10\x01\"\x1f\n\nNestedEnum\x12\x08\n\x04ZERO\x10\x00\x12\x07\n\x03ONE\x10\x01\"\xd3\x02\n\x15TestMissingEnumValues\x12_\n\x14optional_nested_enum\x18\x01 \x01(\x0e\x32\x41.google.protobuf.python.internal.TestMissingEnumValues.NestedEnum\x12_\n\x14repeated_nested_enum\x18\x02 \x03(\x0e\x32\x41.google.protobuf.python.internal.TestMissingEnumValues.NestedEnum\x12\x61\n\x12packed_nested_enum\x18\x03 \x03(\x0e\x32\x41.google.protobuf.python.internal.TestMissingEnumValues.NestedEnumB\x02\x10\x01\"\x15\n\nNestedEnum\x12\x07\n\x03TWO\x10\x02') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + + +_TESTENUMVALUES_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='google.protobuf.python.internal.TestEnumValues.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ZERO', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ONE', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=378, + serialized_end=409, +) +_sym_db.RegisterEnumDescriptor(_TESTENUMVALUES_NESTEDENUM) + +_TESTMISSINGENUMVALUES_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='google.protobuf.python.internal.TestMissingEnumValues.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='TWO', index=0, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=730, + serialized_end=751, +) +_sym_db.RegisterEnumDescriptor(_TESTMISSINGENUMVALUES_NESTEDENUM) + + +_TESTENUMVALUES = _descriptor.Descriptor( + name='TestEnumValues', + full_name='google.protobuf.python.internal.TestEnumValues', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='optional_nested_enum', full_name='google.protobuf.python.internal.TestEnumValues.optional_nested_enum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_nested_enum', full_name='google.protobuf.python.internal.TestEnumValues.repeated_nested_enum', index=1, + number=2, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='packed_nested_enum', full_name='google.protobuf.python.internal.TestEnumValues.packed_nested_enum', index=2, + number=3, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _TESTENUMVALUES_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=88, + serialized_end=409, +) + + +_TESTMISSINGENUMVALUES = _descriptor.Descriptor( + name='TestMissingEnumValues', + full_name='google.protobuf.python.internal.TestMissingEnumValues', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='optional_nested_enum', full_name='google.protobuf.python.internal.TestMissingEnumValues.optional_nested_enum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=2, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_nested_enum', full_name='google.protobuf.python.internal.TestMissingEnumValues.repeated_nested_enum', index=1, + number=2, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='packed_nested_enum', full_name='google.protobuf.python.internal.TestMissingEnumValues.packed_nested_enum', index=2, + number=3, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _TESTMISSINGENUMVALUES_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=412, + serialized_end=751, +) + +_TESTENUMVALUES.fields_by_name['optional_nested_enum'].enum_type = _TESTENUMVALUES_NESTEDENUM +_TESTENUMVALUES.fields_by_name['repeated_nested_enum'].enum_type = _TESTENUMVALUES_NESTEDENUM +_TESTENUMVALUES.fields_by_name['packed_nested_enum'].enum_type = _TESTENUMVALUES_NESTEDENUM +_TESTENUMVALUES_NESTEDENUM.containing_type = _TESTENUMVALUES +_TESTMISSINGENUMVALUES.fields_by_name['optional_nested_enum'].enum_type = _TESTMISSINGENUMVALUES_NESTEDENUM +_TESTMISSINGENUMVALUES.fields_by_name['repeated_nested_enum'].enum_type = _TESTMISSINGENUMVALUES_NESTEDENUM +_TESTMISSINGENUMVALUES.fields_by_name['packed_nested_enum'].enum_type = _TESTMISSINGENUMVALUES_NESTEDENUM +_TESTMISSINGENUMVALUES_NESTEDENUM.containing_type = _TESTMISSINGENUMVALUES +DESCRIPTOR.message_types_by_name['TestEnumValues'] = _TESTENUMVALUES +DESCRIPTOR.message_types_by_name['TestMissingEnumValues'] = _TESTMISSINGENUMVALUES + +TestEnumValues = _reflection.GeneratedProtocolMessageType('TestEnumValues', (_message.Message,), dict( + DESCRIPTOR = _TESTENUMVALUES, + __module__ = 'google.protobuf.internal.missing_enum_values_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.TestEnumValues) + )) +_sym_db.RegisterMessage(TestEnumValues) + +TestMissingEnumValues = _reflection.GeneratedProtocolMessageType('TestMissingEnumValues', (_message.Message,), dict( + DESCRIPTOR = _TESTMISSINGENUMVALUES, + __module__ = 'google.protobuf.internal.missing_enum_values_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.TestMissingEnumValues) + )) +_sym_db.RegisterMessage(TestMissingEnumValues) + + +_TESTENUMVALUES.fields_by_name['packed_nested_enum'].has_options = True +_TESTENUMVALUES.fields_by_name['packed_nested_enum']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTMISSINGENUMVALUES.fields_by_name['packed_nested_enum'].has_options = True +_TESTMISSINGENUMVALUES.fields_by_name['packed_nested_enum']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/internal/more_extensions.proto b/pythonlib/google/protobuf/internal/more_extensions.proto new file mode 100644 index 0000000..e2d9701 --- /dev/null +++ b/pythonlib/google/protobuf/internal/more_extensions.proto @@ -0,0 +1,58 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: robinson@google.com (Will Robinson) + + +package google.protobuf.internal; + + +message TopLevelMessage { + optional ExtendedMessage submessage = 1; +} + + +message ExtendedMessage { + extensions 1 to max; +} + + +message ForeignMessage { + optional int32 foreign_message_int = 1; +} + + +extend ExtendedMessage { + optional int32 optional_int_extension = 1; + optional ForeignMessage optional_message_extension = 2; + + repeated int32 repeated_int_extension = 3; + repeated ForeignMessage repeated_message_extension = 4; +} diff --git a/pythonlib/google/protobuf/internal/more_extensions_dynamic.proto b/pythonlib/google/protobuf/internal/more_extensions_dynamic.proto new file mode 100644 index 0000000..df98ac4 --- /dev/null +++ b/pythonlib/google/protobuf/internal/more_extensions_dynamic.proto @@ -0,0 +1,49 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: jasonh@google.com (Jason Hsueh) +// +// This file is used to test a corner case in the CPP implementation where the +// generated C++ type is available for the extendee, but the extension is +// defined in a file whose C++ type is not in the binary. + + +import "google/protobuf/internal/more_extensions.proto"; + +package google.protobuf.internal; + +message DynamicMessageType { + optional int32 a = 1; +} + +extend ExtendedMessage { + optional int32 dynamic_int32_extension = 100; + optional DynamicMessageType dynamic_message_extension = 101; +} diff --git a/pythonlib/google/protobuf/internal/more_extensions_dynamic_pb2.py b/pythonlib/google/protobuf/internal/more_extensions_dynamic_pb2.py new file mode 100644 index 0000000..db55105 --- /dev/null +++ b/pythonlib/google/protobuf/internal/more_extensions_dynamic_pb2.py @@ -0,0 +1,90 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/internal/more_extensions_dynamic.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import google.protobuf.internal.more_extensions_pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/internal/more_extensions_dynamic.proto', + package='google.protobuf.internal', + serialized_pb=_b('\n6google/protobuf/internal/more_extensions_dynamic.proto\x12\x18google.protobuf.internal\x1a.google/protobuf/internal/more_extensions.proto\"\x1f\n\x12\x44ynamicMessageType\x12\t\n\x01\x61\x18\x01 \x01(\x05:J\n\x17\x64ynamic_int32_extension\x12).google.protobuf.internal.ExtendedMessage\x18\x64 \x01(\x05:z\n\x19\x64ynamic_message_extension\x12).google.protobuf.internal.ExtendedMessage\x18\x65 \x01(\x0b\x32,.google.protobuf.internal.DynamicMessageType') + , + dependencies=[google.protobuf.internal.more_extensions_pb2.DESCRIPTOR,]) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + +DYNAMIC_INT32_EXTENSION_FIELD_NUMBER = 100 +dynamic_int32_extension = _descriptor.FieldDescriptor( + name='dynamic_int32_extension', full_name='google.protobuf.internal.dynamic_int32_extension', index=0, + number=100, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DYNAMIC_MESSAGE_EXTENSION_FIELD_NUMBER = 101 +dynamic_message_extension = _descriptor.FieldDescriptor( + name='dynamic_message_extension', full_name='google.protobuf.internal.dynamic_message_extension', index=1, + number=101, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) + + +_DYNAMICMESSAGETYPE = _descriptor.Descriptor( + name='DynamicMessageType', + full_name='google.protobuf.internal.DynamicMessageType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='google.protobuf.internal.DynamicMessageType.a', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=132, + serialized_end=163, +) + +DESCRIPTOR.message_types_by_name['DynamicMessageType'] = _DYNAMICMESSAGETYPE +DESCRIPTOR.extensions_by_name['dynamic_int32_extension'] = dynamic_int32_extension +DESCRIPTOR.extensions_by_name['dynamic_message_extension'] = dynamic_message_extension + +DynamicMessageType = _reflection.GeneratedProtocolMessageType('DynamicMessageType', (_message.Message,), dict( + DESCRIPTOR = _DYNAMICMESSAGETYPE, + __module__ = 'google.protobuf.internal.more_extensions_dynamic_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.internal.DynamicMessageType) + )) +_sym_db.RegisterMessage(DynamicMessageType) + +google.protobuf.internal.more_extensions_pb2.ExtendedMessage.RegisterExtension(dynamic_int32_extension) +dynamic_message_extension.message_type = _DYNAMICMESSAGETYPE +google.protobuf.internal.more_extensions_pb2.ExtendedMessage.RegisterExtension(dynamic_message_extension) + +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/internal/more_extensions_pb2.py b/pythonlib/google/protobuf/internal/more_extensions_pb2.py new file mode 100644 index 0000000..83fe84b --- /dev/null +++ b/pythonlib/google/protobuf/internal/more_extensions_pb2.py @@ -0,0 +1,179 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/internal/more_extensions.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/internal/more_extensions.proto', + package='google.protobuf.internal', + serialized_pb=_b('\n.google/protobuf/internal/more_extensions.proto\x12\x18google.protobuf.internal\"P\n\x0fTopLevelMessage\x12=\n\nsubmessage\x18\x01 \x01(\x0b\x32).google.protobuf.internal.ExtendedMessage\"\x1b\n\x0f\x45xtendedMessage*\x08\x08\x01\x10\x80\x80\x80\x80\x02\"-\n\x0e\x46oreignMessage\x12\x1b\n\x13\x66oreign_message_int\x18\x01 \x01(\x05:I\n\x16optional_int_extension\x12).google.protobuf.internal.ExtendedMessage\x18\x01 \x01(\x05:w\n\x1aoptional_message_extension\x12).google.protobuf.internal.ExtendedMessage\x18\x02 \x01(\x0b\x32(.google.protobuf.internal.ForeignMessage:I\n\x16repeated_int_extension\x12).google.protobuf.internal.ExtendedMessage\x18\x03 \x03(\x05:w\n\x1arepeated_message_extension\x12).google.protobuf.internal.ExtendedMessage\x18\x04 \x03(\x0b\x32(.google.protobuf.internal.ForeignMessage') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + +OPTIONAL_INT_EXTENSION_FIELD_NUMBER = 1 +optional_int_extension = _descriptor.FieldDescriptor( + name='optional_int_extension', full_name='google.protobuf.internal.optional_int_extension', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_MESSAGE_EXTENSION_FIELD_NUMBER = 2 +optional_message_extension = _descriptor.FieldDescriptor( + name='optional_message_extension', full_name='google.protobuf.internal.optional_message_extension', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_INT_EXTENSION_FIELD_NUMBER = 3 +repeated_int_extension = _descriptor.FieldDescriptor( + name='repeated_int_extension', full_name='google.protobuf.internal.repeated_int_extension', index=2, + number=3, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_MESSAGE_EXTENSION_FIELD_NUMBER = 4 +repeated_message_extension = _descriptor.FieldDescriptor( + name='repeated_message_extension', full_name='google.protobuf.internal.repeated_message_extension', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) + + +_TOPLEVELMESSAGE = _descriptor.Descriptor( + name='TopLevelMessage', + full_name='google.protobuf.internal.TopLevelMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='submessage', full_name='google.protobuf.internal.TopLevelMessage.submessage', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=76, + serialized_end=156, +) + + +_EXTENDEDMESSAGE = _descriptor.Descriptor( + name='ExtendedMessage', + full_name='google.protobuf.internal.ExtendedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1, 536870912), ], + oneofs=[ + ], + serialized_start=158, + serialized_end=185, +) + + +_FOREIGNMESSAGE = _descriptor.Descriptor( + name='ForeignMessage', + full_name='google.protobuf.internal.ForeignMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='foreign_message_int', full_name='google.protobuf.internal.ForeignMessage.foreign_message_int', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=187, + serialized_end=232, +) + +_TOPLEVELMESSAGE.fields_by_name['submessage'].message_type = _EXTENDEDMESSAGE +DESCRIPTOR.message_types_by_name['TopLevelMessage'] = _TOPLEVELMESSAGE +DESCRIPTOR.message_types_by_name['ExtendedMessage'] = _EXTENDEDMESSAGE +DESCRIPTOR.message_types_by_name['ForeignMessage'] = _FOREIGNMESSAGE +DESCRIPTOR.extensions_by_name['optional_int_extension'] = optional_int_extension +DESCRIPTOR.extensions_by_name['optional_message_extension'] = optional_message_extension +DESCRIPTOR.extensions_by_name['repeated_int_extension'] = repeated_int_extension +DESCRIPTOR.extensions_by_name['repeated_message_extension'] = repeated_message_extension + +TopLevelMessage = _reflection.GeneratedProtocolMessageType('TopLevelMessage', (_message.Message,), dict( + DESCRIPTOR = _TOPLEVELMESSAGE, + __module__ = 'google.protobuf.internal.more_extensions_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.internal.TopLevelMessage) + )) +_sym_db.RegisterMessage(TopLevelMessage) + +ExtendedMessage = _reflection.GeneratedProtocolMessageType('ExtendedMessage', (_message.Message,), dict( + DESCRIPTOR = _EXTENDEDMESSAGE, + __module__ = 'google.protobuf.internal.more_extensions_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.internal.ExtendedMessage) + )) +_sym_db.RegisterMessage(ExtendedMessage) + +ForeignMessage = _reflection.GeneratedProtocolMessageType('ForeignMessage', (_message.Message,), dict( + DESCRIPTOR = _FOREIGNMESSAGE, + __module__ = 'google.protobuf.internal.more_extensions_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.internal.ForeignMessage) + )) +_sym_db.RegisterMessage(ForeignMessage) + +ExtendedMessage.RegisterExtension(optional_int_extension) +optional_message_extension.message_type = _FOREIGNMESSAGE +ExtendedMessage.RegisterExtension(optional_message_extension) +ExtendedMessage.RegisterExtension(repeated_int_extension) +repeated_message_extension.message_type = _FOREIGNMESSAGE +ExtendedMessage.RegisterExtension(repeated_message_extension) + +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/internal/more_messages.proto b/pythonlib/google/protobuf/internal/more_messages.proto new file mode 100644 index 0000000..c701b44 --- /dev/null +++ b/pythonlib/google/protobuf/internal/more_messages.proto @@ -0,0 +1,51 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: robinson@google.com (Will Robinson) + + +package google.protobuf.internal; + +// A message where tag numbers are listed out of order, to allow us to test our +// canonicalization of serialized output, which should always be in tag order. +// We also mix in some extensions for extra fun. +message OutOfOrderFields { + optional sint32 optional_sint32 = 5; + extensions 4 to 4; + optional uint32 optional_uint32 = 3; + extensions 2 to 2; + optional int32 optional_int32 = 1; +}; + + +extend OutOfOrderFields { + optional uint64 optional_uint64 = 4; + optional int64 optional_int64 = 2; +} diff --git a/pythonlib/google/protobuf/internal/more_messages_pb2.py b/pythonlib/google/protobuf/internal/more_messages_pb2.py new file mode 100644 index 0000000..5c02085 --- /dev/null +++ b/pythonlib/google/protobuf/internal/more_messages_pb2.py @@ -0,0 +1,101 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/internal/more_messages.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/internal/more_messages.proto', + package='google.protobuf.internal', + serialized_pb=_b('\n,google/protobuf/internal/more_messages.proto\x12\x18google.protobuf.internal\"h\n\x10OutOfOrderFields\x12\x17\n\x0foptional_sint32\x18\x05 \x01(\x11\x12\x17\n\x0foptional_uint32\x18\x03 \x01(\r\x12\x16\n\x0eoptional_int32\x18\x01 \x01(\x05*\x04\x08\x04\x10\x05*\x04\x08\x02\x10\x03:C\n\x0foptional_uint64\x12*.google.protobuf.internal.OutOfOrderFields\x18\x04 \x01(\x04:B\n\x0eoptional_int64\x12*.google.protobuf.internal.OutOfOrderFields\x18\x02 \x01(\x03') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + +OPTIONAL_UINT64_FIELD_NUMBER = 4 +optional_uint64 = _descriptor.FieldDescriptor( + name='optional_uint64', full_name='google.protobuf.internal.optional_uint64', index=0, + number=4, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_INT64_FIELD_NUMBER = 2 +optional_int64 = _descriptor.FieldDescriptor( + name='optional_int64', full_name='google.protobuf.internal.optional_int64', index=1, + number=2, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) + + +_OUTOFORDERFIELDS = _descriptor.Descriptor( + name='OutOfOrderFields', + full_name='google.protobuf.internal.OutOfOrderFields', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='optional_sint32', full_name='google.protobuf.internal.OutOfOrderFields.optional_sint32', index=0, + number=5, type=17, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_uint32', full_name='google.protobuf.internal.OutOfOrderFields.optional_uint32', index=1, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_int32', full_name='google.protobuf.internal.OutOfOrderFields.optional_int32', index=2, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(4, 5), (2, 3), ], + oneofs=[ + ], + serialized_start=74, + serialized_end=178, +) + +DESCRIPTOR.message_types_by_name['OutOfOrderFields'] = _OUTOFORDERFIELDS +DESCRIPTOR.extensions_by_name['optional_uint64'] = optional_uint64 +DESCRIPTOR.extensions_by_name['optional_int64'] = optional_int64 + +OutOfOrderFields = _reflection.GeneratedProtocolMessageType('OutOfOrderFields', (_message.Message,), dict( + DESCRIPTOR = _OUTOFORDERFIELDS, + __module__ = 'google.protobuf.internal.more_messages_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.internal.OutOfOrderFields) + )) +_sym_db.RegisterMessage(OutOfOrderFields) + +OutOfOrderFields.RegisterExtension(optional_uint64) +OutOfOrderFields.RegisterExtension(optional_int64) + +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/internal/python_message.py b/pythonlib/google/protobuf/internal/python_message.py new file mode 100644 index 0000000..9ee352d --- /dev/null +++ b/pythonlib/google/protobuf/internal/python_message.py @@ -0,0 +1,1247 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +# Keep it Python2.5 compatible for GAE. +# +# Copyright 2007 Google Inc. All Rights Reserved. +# +# This code is meant to work on Python 2.4 and above only. +# +# TODO(robinson): Helpers for verbose, common checks like seeing if a +# descriptor's cpp_type is CPPTYPE_MESSAGE. + +"""Contains a metaclass and helper functions used to create +protocol message classes from Descriptor objects at runtime. + +Recall that a metaclass is the "type" of a class. +(A class is to a metaclass what an instance is to a class.) + +In this case, we use the GeneratedProtocolMessageType metaclass +to inject all the useful functionality into the classes +output by the protocol compiler at compile-time. + +The upshot of all this is that the real implementation +details for ALL pure-Python protocol buffers are *here in +this file*. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import sys +if sys.version_info[0] < 3: + try: + from cStringIO import StringIO as BytesIO + except ImportError: + from StringIO import StringIO as BytesIO + import copy_reg as copyreg +else: + from io import BytesIO + import copyreg +import struct +import weakref + +# We use "as" to avoid name collisions with variables. +from google.protobuf.internal import containers +from google.protobuf.internal import decoder +from google.protobuf.internal import encoder +from google.protobuf.internal import enum_type_wrapper +from google.protobuf.internal import message_listener as message_listener_mod +from google.protobuf.internal import type_checkers +from google.protobuf.internal import wire_format +from google.protobuf import descriptor as descriptor_mod +from google.protobuf import message as message_mod +from google.protobuf import text_format + +_FieldDescriptor = descriptor_mod.FieldDescriptor + + +def NewMessage(bases, descriptor, dictionary): + _AddClassAttributesForNestedExtensions(descriptor, dictionary) + _AddSlots(descriptor, dictionary) + return bases + + +def InitMessage(descriptor, cls): + cls._decoders_by_tag = {} + cls._extensions_by_name = {} + cls._extensions_by_number = {} + if (descriptor.has_options and + descriptor.GetOptions().message_set_wire_format): + cls._decoders_by_tag[decoder.MESSAGE_SET_ITEM_TAG] = ( + decoder.MessageSetItemDecoder(cls._extensions_by_number)) + + # Attach stuff to each FieldDescriptor for quick lookup later on. + for field in descriptor.fields: + _AttachFieldHelpers(cls, field) + + _AddEnumValues(descriptor, cls) + _AddInitMethod(descriptor, cls) + _AddPropertiesForFields(descriptor, cls) + _AddPropertiesForExtensions(descriptor, cls) + _AddStaticMethods(cls) + _AddMessageMethods(descriptor, cls) + _AddPrivateHelperMethods(descriptor, cls) + copyreg.pickle(cls, lambda obj: (cls, (), obj.__getstate__())) + + +# Stateless helpers for GeneratedProtocolMessageType below. +# Outside clients should not access these directly. +# +# I opted not to make any of these methods on the metaclass, to make it more +# clear that I'm not really using any state there and to keep clients from +# thinking that they have direct access to these construction helpers. + + +def _PropertyName(proto_field_name): + """Returns the name of the public property attribute which + clients can use to get and (in some cases) set the value + of a protocol message field. + + Args: + proto_field_name: The protocol message field name, exactly + as it appears (or would appear) in a .proto file. + """ + # TODO(robinson): Escape Python keywords (e.g., yield), and test this support. + # nnorwitz makes my day by writing: + # """ + # FYI. See the keyword module in the stdlib. This could be as simple as: + # + # if keyword.iskeyword(proto_field_name): + # return proto_field_name + "_" + # return proto_field_name + # """ + # Kenton says: The above is a BAD IDEA. People rely on being able to use + # getattr() and setattr() to reflectively manipulate field values. If we + # rename the properties, then every such user has to also make sure to apply + # the same transformation. Note that currently if you name a field "yield", + # you can still access it just fine using getattr/setattr -- it's not even + # that cumbersome to do so. + # TODO(kenton): Remove this method entirely if/when everyone agrees with my + # position. + return proto_field_name + + +def _VerifyExtensionHandle(message, extension_handle): + """Verify that the given extension handle is valid.""" + + if not isinstance(extension_handle, _FieldDescriptor): + raise KeyError('HasExtension() expects an extension handle, got: %s' % + extension_handle) + + if not extension_handle.is_extension: + raise KeyError('"%s" is not an extension.' % extension_handle.full_name) + + if not extension_handle.containing_type: + raise KeyError('"%s" is missing a containing_type.' + % extension_handle.full_name) + + if extension_handle.containing_type is not message.DESCRIPTOR: + raise KeyError('Extension "%s" extends message type "%s", but this ' + 'message is of type "%s".' % + (extension_handle.full_name, + extension_handle.containing_type.full_name, + message.DESCRIPTOR.full_name)) + + +def _AddSlots(message_descriptor, dictionary): + """Adds a __slots__ entry to dictionary, containing the names of all valid + attributes for this message type. + + Args: + message_descriptor: A Descriptor instance describing this message type. + dictionary: Class dictionary to which we'll add a '__slots__' entry. + """ + dictionary['__slots__'] = ['_cached_byte_size', + '_cached_byte_size_dirty', + '_fields', + '_unknown_fields', + '_is_present_in_parent', + '_listener', + '_listener_for_children', + '__weakref__', + '_oneofs'] + + +def _IsMessageSetExtension(field): + return (field.is_extension and + field.containing_type.has_options and + field.containing_type.GetOptions().message_set_wire_format and + field.type == _FieldDescriptor.TYPE_MESSAGE and + field.message_type == field.extension_scope and + field.label == _FieldDescriptor.LABEL_OPTIONAL) + + +def _AttachFieldHelpers(cls, field_descriptor): + is_repeated = (field_descriptor.label == _FieldDescriptor.LABEL_REPEATED) + is_packed = (field_descriptor.has_options and + field_descriptor.GetOptions().packed) + + if _IsMessageSetExtension(field_descriptor): + field_encoder = encoder.MessageSetItemEncoder(field_descriptor.number) + sizer = encoder.MessageSetItemSizer(field_descriptor.number) + else: + field_encoder = type_checkers.TYPE_TO_ENCODER[field_descriptor.type]( + field_descriptor.number, is_repeated, is_packed) + sizer = type_checkers.TYPE_TO_SIZER[field_descriptor.type]( + field_descriptor.number, is_repeated, is_packed) + + field_descriptor._encoder = field_encoder + field_descriptor._sizer = sizer + field_descriptor._default_constructor = _DefaultValueConstructorForField( + field_descriptor) + + def AddDecoder(wiretype, is_packed): + tag_bytes = encoder.TagBytes(field_descriptor.number, wiretype) + cls._decoders_by_tag[tag_bytes] = ( + type_checkers.TYPE_TO_DECODER[field_descriptor.type]( + field_descriptor.number, is_repeated, is_packed, + field_descriptor, field_descriptor._default_constructor)) + + AddDecoder(type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type], + False) + + if is_repeated and wire_format.IsTypePackable(field_descriptor.type): + # To support wire compatibility of adding packed = true, add a decoder for + # packed values regardless of the field's options. + AddDecoder(wire_format.WIRETYPE_LENGTH_DELIMITED, True) + + +def _AddClassAttributesForNestedExtensions(descriptor, dictionary): + extension_dict = descriptor.extensions_by_name + for extension_name, extension_field in extension_dict.iteritems(): + assert extension_name not in dictionary + dictionary[extension_name] = extension_field + + +def _AddEnumValues(descriptor, cls): + """Sets class-level attributes for all enum fields defined in this message. + + Also exporting a class-level object that can name enum values. + + Args: + descriptor: Descriptor object for this message type. + cls: Class we're constructing for this message type. + """ + for enum_type in descriptor.enum_types: + setattr(cls, enum_type.name, enum_type_wrapper.EnumTypeWrapper(enum_type)) + for enum_value in enum_type.values: + setattr(cls, enum_value.name, enum_value.number) + + +def _DefaultValueConstructorForField(field): + """Returns a function which returns a default value for a field. + + Args: + field: FieldDescriptor object for this field. + + The returned function has one argument: + message: Message instance containing this field, or a weakref proxy + of same. + + That function in turn returns a default value for this field. The default + value may refer back to |message| via a weak reference. + """ + + if field.label == _FieldDescriptor.LABEL_REPEATED: + if field.has_default_value and field.default_value != []: + raise ValueError('Repeated field default value not empty list: %s' % ( + field.default_value)) + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + # We can't look at _concrete_class yet since it might not have + # been set. (Depends on order in which we initialize the classes). + message_type = field.message_type + def MakeRepeatedMessageDefault(message): + return containers.RepeatedCompositeFieldContainer( + message._listener_for_children, field.message_type) + return MakeRepeatedMessageDefault + else: + type_checker = type_checkers.GetTypeChecker(field) + def MakeRepeatedScalarDefault(message): + return containers.RepeatedScalarFieldContainer( + message._listener_for_children, type_checker) + return MakeRepeatedScalarDefault + + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + # _concrete_class may not yet be initialized. + message_type = field.message_type + def MakeSubMessageDefault(message): + result = message_type._concrete_class() + result._SetListener(message._listener_for_children) + return result + return MakeSubMessageDefault + + def MakeScalarDefault(message): + # TODO(protobuf-team): This may be broken since there may not be + # default_value. Combine with has_default_value somehow. + return field.default_value + return MakeScalarDefault + + +def _AddInitMethod(message_descriptor, cls): + """Adds an __init__ method to cls.""" + fields = message_descriptor.fields + def init(self, **kwargs): + self._cached_byte_size = 0 + self._cached_byte_size_dirty = len(kwargs) > 0 + self._fields = {} + # Contains a mapping from oneof field descriptors to the descriptor + # of the currently set field in that oneof field. + self._oneofs = {} + + # _unknown_fields is () when empty for efficiency, and will be turned into + # a list if fields are added. + self._unknown_fields = () + self._is_present_in_parent = False + self._listener = message_listener_mod.NullMessageListener() + self._listener_for_children = _Listener(self) + for field_name, field_value in kwargs.iteritems(): + field = _GetFieldByName(message_descriptor, field_name) + if field is None: + raise TypeError("%s() got an unexpected keyword argument '%s'" % + (message_descriptor.name, field_name)) + if field.label == _FieldDescriptor.LABEL_REPEATED: + copy = field._default_constructor(self) + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite + for val in field_value: + copy.add().MergeFrom(val) + else: # Scalar + copy.extend(field_value) + self._fields[field] = copy + elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + copy = field._default_constructor(self) + copy.MergeFrom(field_value) + self._fields[field] = copy + else: + setattr(self, field_name, field_value) + + init.__module__ = None + init.__doc__ = None + cls.__init__ = init + + +def _GetFieldByName(message_descriptor, field_name): + """Returns a field descriptor by field name. + + Args: + message_descriptor: A Descriptor describing all fields in message. + field_name: The name of the field to retrieve. + Returns: + The field descriptor associated with the field name. + """ + try: + return message_descriptor.fields_by_name[field_name] + except KeyError: + raise ValueError('Protocol message has no "%s" field.' % field_name) + + +def _AddPropertiesForFields(descriptor, cls): + """Adds properties for all fields in this protocol message type.""" + for field in descriptor.fields: + _AddPropertiesForField(field, cls) + + if descriptor.is_extendable: + # _ExtensionDict is just an adaptor with no state so we allocate a new one + # every time it is accessed. + cls.Extensions = property(lambda self: _ExtensionDict(self)) + + +def _AddPropertiesForField(field, cls): + """Adds a public property for a protocol message field. + Clients can use this property to get and (in the case + of non-repeated scalar fields) directly set the value + of a protocol message field. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + # Catch it if we add other types that we should + # handle specially here. + assert _FieldDescriptor.MAX_CPPTYPE == 10 + + constant_name = field.name.upper() + "_FIELD_NUMBER" + setattr(cls, constant_name, field.number) + + if field.label == _FieldDescriptor.LABEL_REPEATED: + _AddPropertiesForRepeatedField(field, cls) + elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + _AddPropertiesForNonRepeatedCompositeField(field, cls) + else: + _AddPropertiesForNonRepeatedScalarField(field, cls) + + +def _AddPropertiesForRepeatedField(field, cls): + """Adds a public property for a "repeated" protocol message field. Clients + can use this property to get the value of the field, which will be either a + _RepeatedScalarFieldContainer or _RepeatedCompositeFieldContainer (see + below). + + Note that when clients add values to these containers, we perform + type-checking in the case of repeated scalar fields, and we also set any + necessary "has" bits as a side-effect. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + proto_field_name = field.name + property_name = _PropertyName(proto_field_name) + + def getter(self): + field_value = self._fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + + # Atomically check if another thread has preempted us and, if not, swap + # in the new object we just created. If someone has preempted us, we + # take that object and discard ours. + # WARNING: We are relying on setdefault() being atomic. This is true + # in CPython but we haven't investigated others. This warning appears + # in several other locations in this file. + field_value = self._fields.setdefault(field, field_value) + return field_value + getter.__module__ = None + getter.__doc__ = 'Getter for %s.' % proto_field_name + + # We define a setter just so we can throw an exception with a more + # helpful error message. + def setter(self, new_value): + raise AttributeError('Assignment not allowed to repeated field ' + '"%s" in protocol message object.' % proto_field_name) + + doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name + setattr(cls, property_name, property(getter, setter, doc=doc)) + + +def _AddPropertiesForNonRepeatedScalarField(field, cls): + """Adds a public property for a nonrepeated, scalar protocol message field. + Clients can use this property to get and directly set the value of the field. + Note that when the client sets the value of a field by using this property, + all necessary "has" bits are set as a side-effect, and we also perform + type-checking. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + proto_field_name = field.name + property_name = _PropertyName(proto_field_name) + type_checker = type_checkers.GetTypeChecker(field) + default_value = field.default_value + valid_values = set() + + def getter(self): + # TODO(protobuf-team): This may be broken since there may not be + # default_value. Combine with has_default_value somehow. + return self._fields.get(field, default_value) + getter.__module__ = None + getter.__doc__ = 'Getter for %s.' % proto_field_name + def field_setter(self, new_value): + # pylint: disable=protected-access + self._fields[field] = type_checker.CheckValue(new_value) + # Check _cached_byte_size_dirty inline to improve performance, since scalar + # setters are called frequently. + if not self._cached_byte_size_dirty: + self._Modified() + + if field.containing_oneof is not None: + def setter(self, new_value): + field_setter(self, new_value) + self._UpdateOneofState(field) + else: + setter = field_setter + + setter.__module__ = None + setter.__doc__ = 'Setter for %s.' % proto_field_name + + # Add a property to encapsulate the getter/setter. + doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name + setattr(cls, property_name, property(getter, setter, doc=doc)) + + +def _AddPropertiesForNonRepeatedCompositeField(field, cls): + """Adds a public property for a nonrepeated, composite protocol message field. + A composite field is a "group" or "message" field. + + Clients can use this property to get the value of the field, but cannot + assign to the property directly. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + # TODO(robinson): Remove duplication with similar method + # for non-repeated scalars. + proto_field_name = field.name + property_name = _PropertyName(proto_field_name) + + # TODO(komarek): Can anyone explain to me why we cache the message_type this + # way, instead of referring to field.message_type inside of getter(self)? + # What if someone sets message_type later on (which makes for simpler + # dyanmic proto descriptor and class creation code). + message_type = field.message_type + + def getter(self): + field_value = self._fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = message_type._concrete_class() # use field.message_type? + field_value._SetListener( + _OneofListener(self, field) + if field.containing_oneof is not None + else self._listener_for_children) + + # Atomically check if another thread has preempted us and, if not, swap + # in the new object we just created. If someone has preempted us, we + # take that object and discard ours. + # WARNING: We are relying on setdefault() being atomic. This is true + # in CPython but we haven't investigated others. This warning appears + # in several other locations in this file. + field_value = self._fields.setdefault(field, field_value) + return field_value + getter.__module__ = None + getter.__doc__ = 'Getter for %s.' % proto_field_name + + # We define a setter just so we can throw an exception with a more + # helpful error message. + def setter(self, new_value): + raise AttributeError('Assignment not allowed to composite field ' + '"%s" in protocol message object.' % proto_field_name) + + # Add a property to encapsulate the getter. + doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name + setattr(cls, property_name, property(getter, setter, doc=doc)) + + +def _AddPropertiesForExtensions(descriptor, cls): + """Adds properties for all fields in this protocol message type.""" + extension_dict = descriptor.extensions_by_name + for extension_name, extension_field in extension_dict.iteritems(): + constant_name = extension_name.upper() + "_FIELD_NUMBER" + setattr(cls, constant_name, extension_field.number) + + +def _AddStaticMethods(cls): + # TODO(robinson): This probably needs to be thread-safe(?) + def RegisterExtension(extension_handle): + extension_handle.containing_type = cls.DESCRIPTOR + _AttachFieldHelpers(cls, extension_handle) + + # Try to insert our extension, failing if an extension with the same number + # already exists. + actual_handle = cls._extensions_by_number.setdefault( + extension_handle.number, extension_handle) + if actual_handle is not extension_handle: + raise AssertionError( + 'Extensions "%s" and "%s" both try to extend message type "%s" with ' + 'field number %d.' % + (extension_handle.full_name, actual_handle.full_name, + cls.DESCRIPTOR.full_name, extension_handle.number)) + + cls._extensions_by_name[extension_handle.full_name] = extension_handle + + handle = extension_handle # avoid line wrapping + if _IsMessageSetExtension(handle): + # MessageSet extension. Also register under type name. + cls._extensions_by_name[ + extension_handle.message_type.full_name] = extension_handle + + cls.RegisterExtension = staticmethod(RegisterExtension) + + def FromString(s): + message = cls() + message.MergeFromString(s) + return message + cls.FromString = staticmethod(FromString) + + +def _IsPresent(item): + """Given a (FieldDescriptor, value) tuple from _fields, return true if the + value should be included in the list returned by ListFields().""" + + if item[0].label == _FieldDescriptor.LABEL_REPEATED: + return bool(item[1]) + elif item[0].cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + return item[1]._is_present_in_parent + else: + return True + + +def _AddListFieldsMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def ListFields(self): + all_fields = [item for item in self._fields.iteritems() if _IsPresent(item)] + all_fields.sort(key = lambda item: item[0].number) + return all_fields + + cls.ListFields = ListFields + + +def _AddHasFieldMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + singular_fields = {} + for field in message_descriptor.fields: + if field.label != _FieldDescriptor.LABEL_REPEATED: + singular_fields[field.name] = field + # Fields inside oneofs are never repeated (enforced by the compiler). + for field in message_descriptor.oneofs: + singular_fields[field.name] = field + + def HasField(self, field_name): + try: + field = singular_fields[field_name] + except KeyError: + raise ValueError( + 'Protocol message has no singular "%s" field.' % field_name) + + if isinstance(field, descriptor_mod.OneofDescriptor): + try: + return HasField(self, self._oneofs[field].name) + except KeyError: + return False + else: + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + value = self._fields.get(field) + return value is not None and value._is_present_in_parent + else: + return field in self._fields + + cls.HasField = HasField + + +def _AddClearFieldMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def ClearField(self, field_name): + try: + field = message_descriptor.fields_by_name[field_name] + except KeyError: + try: + field = message_descriptor.oneofs_by_name[field_name] + if field in self._oneofs: + field = self._oneofs[field] + else: + return + except KeyError: + raise ValueError('Protocol message has no "%s" field.' % field_name) + + if field in self._fields: + # Note: If the field is a sub-message, its listener will still point + # at us. That's fine, because the worst than can happen is that it + # will call _Modified() and invalidate our byte size. Big deal. + del self._fields[field] + + if self._oneofs.get(field.containing_oneof, None) is field: + del self._oneofs[field.containing_oneof] + + # Always call _Modified() -- even if nothing was changed, this is + # a mutating method, and thus calling it should cause the field to become + # present in the parent message. + self._Modified() + + cls.ClearField = ClearField + + +def _AddClearExtensionMethod(cls): + """Helper for _AddMessageMethods().""" + def ClearExtension(self, extension_handle): + _VerifyExtensionHandle(self, extension_handle) + + # Similar to ClearField(), above. + if extension_handle in self._fields: + del self._fields[extension_handle] + self._Modified() + cls.ClearExtension = ClearExtension + + +def _AddClearMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def Clear(self): + # Clear fields. + self._fields = {} + self._unknown_fields = () + self._Modified() + cls.Clear = Clear + + +def _AddHasExtensionMethod(cls): + """Helper for _AddMessageMethods().""" + def HasExtension(self, extension_handle): + _VerifyExtensionHandle(self, extension_handle) + if extension_handle.label == _FieldDescriptor.LABEL_REPEATED: + raise KeyError('"%s" is repeated.' % extension_handle.full_name) + + if extension_handle.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + value = self._fields.get(extension_handle) + return value is not None and value._is_present_in_parent + else: + return extension_handle in self._fields + cls.HasExtension = HasExtension + + +def _AddEqualsMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def __eq__(self, other): + if (not isinstance(other, message_mod.Message) or + other.DESCRIPTOR != self.DESCRIPTOR): + return False + + if self is other: + return True + + if not self.ListFields() == other.ListFields(): + return False + + # Sort unknown fields because their order shouldn't affect equality test. + unknown_fields = list(self._unknown_fields) + unknown_fields.sort() + other_unknown_fields = list(other._unknown_fields) + other_unknown_fields.sort() + + return unknown_fields == other_unknown_fields + + cls.__eq__ = __eq__ + + +def _AddStrMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def __str__(self): + return text_format.MessageToString(self) + cls.__str__ = __str__ + + +def _AddUnicodeMethod(unused_message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def __unicode__(self): + return text_format.MessageToString(self, as_utf8=True).decode('utf-8') + cls.__unicode__ = __unicode__ + + +def _AddSetListenerMethod(cls): + """Helper for _AddMessageMethods().""" + def SetListener(self, listener): + if listener is None: + self._listener = message_listener_mod.NullMessageListener() + else: + self._listener = listener + cls._SetListener = SetListener + + +def _BytesForNonRepeatedElement(value, field_number, field_type): + """Returns the number of bytes needed to serialize a non-repeated element. + The returned byte count includes space for tag information and any + other additional space associated with serializing value. + + Args: + value: Value we're serializing. + field_number: Field number of this value. (Since the field number + is stored as part of a varint-encoded tag, this has an impact + on the total bytes required to serialize the value). + field_type: The type of the field. One of the TYPE_* constants + within FieldDescriptor. + """ + try: + fn = type_checkers.TYPE_TO_BYTE_SIZE_FN[field_type] + return fn(field_number, value) + except KeyError: + raise message_mod.EncodeError('Unrecognized field type: %d' % field_type) + + +def _AddByteSizeMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def ByteSize(self): + if not self._cached_byte_size_dirty: + return self._cached_byte_size + + size = 0 + for field_descriptor, field_value in self.ListFields(): + size += field_descriptor._sizer(field_value) + + for tag_bytes, value_bytes in self._unknown_fields: + size += len(tag_bytes) + len(value_bytes) + + self._cached_byte_size = size + self._cached_byte_size_dirty = False + self._listener_for_children.dirty = False + return size + + cls.ByteSize = ByteSize + + +def _AddSerializeToStringMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def SerializeToString(self): + # Check if the message has all of its required fields set. + errors = [] + if not self.IsInitialized(): + raise message_mod.EncodeError( + 'Message %s is missing required fields: %s' % ( + self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) + return self.SerializePartialToString() + cls.SerializeToString = SerializeToString + + +def _AddSerializePartialToStringMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def SerializePartialToString(self): + out = BytesIO() + self._InternalSerialize(out.write) + return out.getvalue() + cls.SerializePartialToString = SerializePartialToString + + def InternalSerialize(self, write_bytes): + for field_descriptor, field_value in self.ListFields(): + field_descriptor._encoder(write_bytes, field_value) + for tag_bytes, value_bytes in self._unknown_fields: + write_bytes(tag_bytes) + write_bytes(value_bytes) + cls._InternalSerialize = InternalSerialize + + +def _AddMergeFromStringMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def MergeFromString(self, serialized): + length = len(serialized) + try: + if self._InternalParse(serialized, 0, length) != length: + # The only reason _InternalParse would return early is if it + # encountered an end-group tag. + raise message_mod.DecodeError('Unexpected end-group tag.') + except (IndexError, TypeError): + # Now ord(buf[p:p+1]) == ord('') gets TypeError. + raise message_mod.DecodeError('Truncated message.') + except struct.error, e: + raise message_mod.DecodeError(e) + return length # Return this for legacy reasons. + cls.MergeFromString = MergeFromString + + local_ReadTag = decoder.ReadTag + local_SkipField = decoder.SkipField + decoders_by_tag = cls._decoders_by_tag + + def InternalParse(self, buffer, pos, end): + self._Modified() + field_dict = self._fields + unknown_field_list = self._unknown_fields + while pos != end: + (tag_bytes, new_pos) = local_ReadTag(buffer, pos) + field_decoder = decoders_by_tag.get(tag_bytes) + if field_decoder is None: + value_start_pos = new_pos + new_pos = local_SkipField(buffer, new_pos, end, tag_bytes) + if new_pos == -1: + return pos + if not unknown_field_list: + unknown_field_list = self._unknown_fields = [] + unknown_field_list.append((tag_bytes, buffer[value_start_pos:new_pos])) + pos = new_pos + else: + pos = field_decoder(buffer, new_pos, end, self, field_dict) + return pos + cls._InternalParse = InternalParse + + +def _AddIsInitializedMethod(message_descriptor, cls): + """Adds the IsInitialized and FindInitializationError methods to the + protocol message class.""" + + required_fields = [field for field in message_descriptor.fields + if field.label == _FieldDescriptor.LABEL_REQUIRED] + + def IsInitialized(self, errors=None): + """Checks if all required fields of a message are set. + + Args: + errors: A list which, if provided, will be populated with the field + paths of all missing required fields. + + Returns: + True iff the specified message has all required fields set. + """ + + # Performance is critical so we avoid HasField() and ListFields(). + + for field in required_fields: + if (field not in self._fields or + (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and + not self._fields[field]._is_present_in_parent)): + if errors is not None: + errors.extend(self.FindInitializationErrors()) + return False + + for field, value in list(self._fields.items()): # dict can change size! + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + if field.label == _FieldDescriptor.LABEL_REPEATED: + for element in value: + if not element.IsInitialized(): + if errors is not None: + errors.extend(self.FindInitializationErrors()) + return False + elif value._is_present_in_parent and not value.IsInitialized(): + if errors is not None: + errors.extend(self.FindInitializationErrors()) + return False + + return True + + cls.IsInitialized = IsInitialized + + def FindInitializationErrors(self): + """Finds required fields which are not initialized. + + Returns: + A list of strings. Each string is a path to an uninitialized field from + the top-level message, e.g. "foo.bar[5].baz". + """ + + errors = [] # simplify things + + for field in required_fields: + if not self.HasField(field.name): + errors.append(field.name) + + for field, value in self.ListFields(): + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + if field.is_extension: + name = "(%s)" % field.full_name + else: + name = field.name + + if field.label == _FieldDescriptor.LABEL_REPEATED: + for i in xrange(len(value)): + element = value[i] + prefix = "%s[%d]." % (name, i) + sub_errors = element.FindInitializationErrors() + errors += [ prefix + error for error in sub_errors ] + else: + prefix = name + "." + sub_errors = value.FindInitializationErrors() + errors += [ prefix + error for error in sub_errors ] + + return errors + + cls.FindInitializationErrors = FindInitializationErrors + + +def _AddMergeFromMethod(cls): + LABEL_REPEATED = _FieldDescriptor.LABEL_REPEATED + CPPTYPE_MESSAGE = _FieldDescriptor.CPPTYPE_MESSAGE + + def MergeFrom(self, msg): + if not isinstance(msg, cls): + raise TypeError( + "Parameter to MergeFrom() must be instance of same class: " + "expected %s got %s." % (cls.__name__, type(msg).__name__)) + + assert msg is not self + self._Modified() + + fields = self._fields + + for field, value in msg._fields.iteritems(): + if field.label == LABEL_REPEATED: + field_value = fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + fields[field] = field_value + field_value.MergeFrom(value) + elif field.cpp_type == CPPTYPE_MESSAGE: + if value._is_present_in_parent: + field_value = fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + fields[field] = field_value + field_value.MergeFrom(value) + else: + self._fields[field] = value + + if msg._unknown_fields: + if not self._unknown_fields: + self._unknown_fields = [] + self._unknown_fields.extend(msg._unknown_fields) + + cls.MergeFrom = MergeFrom + + +def _AddWhichOneofMethod(message_descriptor, cls): + def WhichOneof(self, oneof_name): + """Returns the name of the currently set field inside a oneof, or None.""" + try: + field = message_descriptor.oneofs_by_name[oneof_name] + except KeyError: + raise ValueError( + 'Protocol message has no oneof "%s" field.' % oneof_name) + + nested_field = self._oneofs.get(field, None) + if nested_field is not None and self.HasField(nested_field.name): + return nested_field.name + else: + return None + + cls.WhichOneof = WhichOneof + + +def _AddMessageMethods(message_descriptor, cls): + """Adds implementations of all Message methods to cls.""" + _AddListFieldsMethod(message_descriptor, cls) + _AddHasFieldMethod(message_descriptor, cls) + _AddClearFieldMethod(message_descriptor, cls) + if message_descriptor.is_extendable: + _AddClearExtensionMethod(cls) + _AddHasExtensionMethod(cls) + _AddClearMethod(message_descriptor, cls) + _AddEqualsMethod(message_descriptor, cls) + _AddStrMethod(message_descriptor, cls) + _AddUnicodeMethod(message_descriptor, cls) + _AddSetListenerMethod(cls) + _AddByteSizeMethod(message_descriptor, cls) + _AddSerializeToStringMethod(message_descriptor, cls) + _AddSerializePartialToStringMethod(message_descriptor, cls) + _AddMergeFromStringMethod(message_descriptor, cls) + _AddIsInitializedMethod(message_descriptor, cls) + _AddMergeFromMethod(cls) + _AddWhichOneofMethod(message_descriptor, cls) + +def _AddPrivateHelperMethods(message_descriptor, cls): + """Adds implementation of private helper methods to cls.""" + + def Modified(self): + """Sets the _cached_byte_size_dirty bit to true, + and propagates this to our listener iff this was a state change. + """ + + # Note: Some callers check _cached_byte_size_dirty before calling + # _Modified() as an extra optimization. So, if this method is ever + # changed such that it does stuff even when _cached_byte_size_dirty is + # already true, the callers need to be updated. + if not self._cached_byte_size_dirty: + self._cached_byte_size_dirty = True + self._listener_for_children.dirty = True + self._is_present_in_parent = True + self._listener.Modified() + + def _UpdateOneofState(self, field): + """Sets field as the active field in its containing oneof. + + Will also delete currently active field in the oneof, if it is different + from the argument. Does not mark the message as modified. + """ + other_field = self._oneofs.setdefault(field.containing_oneof, field) + if other_field is not field: + del self._fields[other_field] + self._oneofs[field.containing_oneof] = field + + cls._Modified = Modified + cls.SetInParent = Modified + cls._UpdateOneofState = _UpdateOneofState + + +class _Listener(object): + + """MessageListener implementation that a parent message registers with its + child message. + + In order to support semantics like: + + foo.bar.baz.qux = 23 + assert foo.HasField('bar') + + ...child objects must have back references to their parents. + This helper class is at the heart of this support. + """ + + def __init__(self, parent_message): + """Args: + parent_message: The message whose _Modified() method we should call when + we receive Modified() messages. + """ + # This listener establishes a back reference from a child (contained) object + # to its parent (containing) object. We make this a weak reference to avoid + # creating cyclic garbage when the client finishes with the 'parent' object + # in the tree. + if isinstance(parent_message, weakref.ProxyType): + self._parent_message_weakref = parent_message + else: + self._parent_message_weakref = weakref.proxy(parent_message) + + # As an optimization, we also indicate directly on the listener whether + # or not the parent message is dirty. This way we can avoid traversing + # up the tree in the common case. + self.dirty = False + + def Modified(self): + if self.dirty: + return + try: + # Propagate the signal to our parents iff this is the first field set. + self._parent_message_weakref._Modified() + except ReferenceError: + # We can get here if a client has kept a reference to a child object, + # and is now setting a field on it, but the child's parent has been + # garbage-collected. This is not an error. + pass + + +class _OneofListener(_Listener): + """Special listener implementation for setting composite oneof fields.""" + + def __init__(self, parent_message, field): + """Args: + parent_message: The message whose _Modified() method we should call when + we receive Modified() messages. + field: The descriptor of the field being set in the parent message. + """ + super(_OneofListener, self).__init__(parent_message) + self._field = field + + def Modified(self): + """Also updates the state of the containing oneof in the parent message.""" + try: + self._parent_message_weakref._UpdateOneofState(self._field) + super(_OneofListener, self).Modified() + except ReferenceError: + pass + + +# TODO(robinson): Move elsewhere? This file is getting pretty ridiculous... +# TODO(robinson): Unify error handling of "unknown extension" crap. +# TODO(robinson): Support iteritems()-style iteration over all +# extensions with the "has" bits turned on? +class _ExtensionDict(object): + + """Dict-like container for supporting an indexable "Extensions" + field on proto instances. + + Note that in all cases we expect extension handles to be + FieldDescriptors. + """ + + def __init__(self, extended_message): + """extended_message: Message instance for which we are the Extensions dict. + """ + + self._extended_message = extended_message + + def __getitem__(self, extension_handle): + """Returns the current value of the given extension handle.""" + + _VerifyExtensionHandle(self._extended_message, extension_handle) + + result = self._extended_message._fields.get(extension_handle) + if result is not None: + return result + + if extension_handle.label == _FieldDescriptor.LABEL_REPEATED: + result = extension_handle._default_constructor(self._extended_message) + elif extension_handle.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + result = extension_handle.message_type._concrete_class() + try: + result._SetListener(self._extended_message._listener_for_children) + except ReferenceError: + pass + else: + # Singular scalar -- just return the default without inserting into the + # dict. + return extension_handle.default_value + + # Atomically check if another thread has preempted us and, if not, swap + # in the new object we just created. If someone has preempted us, we + # take that object and discard ours. + # WARNING: We are relying on setdefault() being atomic. This is true + # in CPython but we haven't investigated others. This warning appears + # in several other locations in this file. + result = self._extended_message._fields.setdefault( + extension_handle, result) + + return result + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + + my_fields = self._extended_message.ListFields() + other_fields = other._extended_message.ListFields() + + # Get rid of non-extension fields. + my_fields = [ field for field in my_fields if field.is_extension ] + other_fields = [ field for field in other_fields if field.is_extension ] + + return my_fields == other_fields + + def __ne__(self, other): + return not self == other + + def __hash__(self): + raise TypeError('unhashable object') + + # Note that this is only meaningful for non-repeated, scalar extension + # fields. Note also that we may have to call _Modified() when we do + # successfully set a field this way, to set any necssary "has" bits in the + # ancestors of the extended message. + def __setitem__(self, extension_handle, value): + """If extension_handle specifies a non-repeated, scalar extension + field, sets the value of that field. + """ + + _VerifyExtensionHandle(self._extended_message, extension_handle) + + if (extension_handle.label == _FieldDescriptor.LABEL_REPEATED or + extension_handle.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE): + raise TypeError( + 'Cannot assign to extension "%s" because it is a repeated or ' + 'composite type.' % extension_handle.full_name) + + # It's slightly wasteful to lookup the type checker each time, + # but we expect this to be a vanishingly uncommon case anyway. + type_checker = type_checkers.GetTypeChecker( + extension_handle) + # pylint: disable=protected-access + self._extended_message._fields[extension_handle] = ( + type_checker.CheckValue(value)) + self._extended_message._Modified() + + def _FindExtensionByName(self, name): + """Tries to find a known extension with the specified name. + + Args: + name: Extension full name. + + Returns: + Extension field descriptor. + """ + return self._extended_message._extensions_by_name.get(name, None) diff --git a/pythonlib/google/protobuf/internal/reflection_test.py b/pythonlib/google/protobuf/internal/reflection_test.py new file mode 100644 index 0000000..b3c414c --- /dev/null +++ b/pythonlib/google/protobuf/internal/reflection_test.py @@ -0,0 +1,2934 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Unittest for reflection.py, which also indirectly tests the output of the +pure-Python protocol compiler. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import copy +import gc +import operator +import struct + +from google.apputils import basetest +from google.protobuf import unittest_import_pb2 +from google.protobuf import unittest_mset_pb2 +from google.protobuf import unittest_pb2 +from google.protobuf import descriptor_pb2 +from google.protobuf import descriptor +from google.protobuf import message +from google.protobuf import reflection +from google.protobuf import text_format +from google.protobuf.internal import api_implementation +from google.protobuf.internal import more_extensions_pb2 +from google.protobuf.internal import more_messages_pb2 +from google.protobuf.internal import wire_format +from google.protobuf.internal import test_util +from google.protobuf.internal import decoder + + +class _MiniDecoder(object): + """Decodes a stream of values from a string. + + Once upon a time we actually had a class called decoder.Decoder. Then we + got rid of it during a redesign that made decoding much, much faster overall. + But a couple tests in this file used it to check that the serialized form of + a message was correct. So, this class implements just the methods that were + used by said tests, so that we don't have to rewrite the tests. + """ + + def __init__(self, bytes): + self._bytes = bytes + self._pos = 0 + + def ReadVarint(self): + result, self._pos = decoder._DecodeVarint(self._bytes, self._pos) + return result + + ReadInt32 = ReadVarint + ReadInt64 = ReadVarint + ReadUInt32 = ReadVarint + ReadUInt64 = ReadVarint + + def ReadSInt64(self): + return wire_format.ZigZagDecode(self.ReadVarint()) + + ReadSInt32 = ReadSInt64 + + def ReadFieldNumberAndWireType(self): + return wire_format.UnpackTag(self.ReadVarint()) + + def ReadFloat(self): + result = struct.unpack("\n\ndescriptor\x12%.protobuf_unittest.TestBadIdentifiers\x18\x65 \x01(\t:\x03\x62\x61r:>\n\nreflection\x12%.protobuf_unittest.TestBadIdentifiers\x18\x66 \x01(\t:\x03\x62\x61z:;\n\x07service\x12%.protobuf_unittest.TestBadIdentifiers\x18g \x01(\t:\x03quxB\x03\x90\x01\x01') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + +MESSAGE_FIELD_NUMBER = 100 +message = _descriptor.FieldDescriptor( + name='message', full_name='protobuf_unittest.message', index=0, + number=100, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("foo").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DESCRIPTOR_FIELD_NUMBER = 101 +descriptor = _descriptor.FieldDescriptor( + name='descriptor', full_name='protobuf_unittest.descriptor', index=1, + number=101, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("bar").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REFLECTION_FIELD_NUMBER = 102 +reflection = _descriptor.FieldDescriptor( + name='reflection', full_name='protobuf_unittest.reflection', index=2, + number=102, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("baz").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +SERVICE_FIELD_NUMBER = 103 +service = _descriptor.FieldDescriptor( + name='service', full_name='protobuf_unittest.service', index=3, + number=103, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("qux").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) + + +_TESTBADIDENTIFIERS = _descriptor.Descriptor( + name='TestBadIdentifiers', + full_name='protobuf_unittest.TestBadIdentifiers', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(100, 536870912), ], + oneofs=[ + ], + serialized_start=74, + serialized_end=104, +) + + +_ANOTHERMESSAGE = _descriptor.Descriptor( + name='AnotherMessage', + full_name='protobuf_unittest.AnotherMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=106, + serialized_end=122, +) + +DESCRIPTOR.message_types_by_name['TestBadIdentifiers'] = _TESTBADIDENTIFIERS +DESCRIPTOR.message_types_by_name['AnotherMessage'] = _ANOTHERMESSAGE +DESCRIPTOR.extensions_by_name['message'] = message +DESCRIPTOR.extensions_by_name['descriptor'] = descriptor +DESCRIPTOR.extensions_by_name['reflection'] = reflection +DESCRIPTOR.extensions_by_name['service'] = service + +TestBadIdentifiers = _reflection.GeneratedProtocolMessageType('TestBadIdentifiers', (_message.Message,), dict( + DESCRIPTOR = _TESTBADIDENTIFIERS, + __module__ = 'google.protobuf.internal.test_bad_identifiers_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestBadIdentifiers) + )) +_sym_db.RegisterMessage(TestBadIdentifiers) + +AnotherMessage = _reflection.GeneratedProtocolMessageType('AnotherMessage', (_message.Message,), dict( + DESCRIPTOR = _ANOTHERMESSAGE, + __module__ = 'google.protobuf.internal.test_bad_identifiers_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.AnotherMessage) + )) +_sym_db.RegisterMessage(AnotherMessage) + +TestBadIdentifiers.RegisterExtension(message) +TestBadIdentifiers.RegisterExtension(descriptor) +TestBadIdentifiers.RegisterExtension(reflection) +TestBadIdentifiers.RegisterExtension(service) + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\220\001\001')) + +_ANOTHERSERVICE = _descriptor.ServiceDescriptor( + name='AnotherService', + full_name='protobuf_unittest.AnotherService', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=124, + serialized_end=140, + methods=[ +]) + +AnotherService = service_reflection.GeneratedServiceType('AnotherService', (_service.Service,), dict( + DESCRIPTOR = _ANOTHERSERVICE, + __module__ = 'google.protobuf.internal.test_bad_identifiers_pb2' + )) + +AnotherService_Stub = service_reflection.GeneratedServiceStubType('AnotherService_Stub', (AnotherService,), dict( + DESCRIPTOR = _ANOTHERSERVICE, + __module__ = 'google.protobuf.internal.test_bad_identifiers_pb2' + )) + + +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/internal/test_util.py b/pythonlib/google/protobuf/internal/test_util.py new file mode 100644 index 0000000..350d1c6 --- /dev/null +++ b/pythonlib/google/protobuf/internal/test_util.py @@ -0,0 +1,662 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Utilities for Python proto2 tests. + +This is intentionally modeled on C++ code in +//google/protobuf/test_util.*. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import os.path + +from google.protobuf import unittest_import_pb2 +from google.protobuf import unittest_pb2 + + +def SetAllNonLazyFields(message): + """Sets every non-lazy field in the message to a unique value. + + Args: + message: A unittest_pb2.TestAllTypes instance. + """ + + # + # Optional fields. + # + + message.optional_int32 = 101 + message.optional_int64 = 102 + message.optional_uint32 = 103 + message.optional_uint64 = 104 + message.optional_sint32 = 105 + message.optional_sint64 = 106 + message.optional_fixed32 = 107 + message.optional_fixed64 = 108 + message.optional_sfixed32 = 109 + message.optional_sfixed64 = 110 + message.optional_float = 111 + message.optional_double = 112 + message.optional_bool = True + message.optional_string = u'115' + message.optional_bytes = b'116' + + message.optionalgroup.a = 117 + message.optional_nested_message.bb = 118 + message.optional_foreign_message.c = 119 + message.optional_import_message.d = 120 + message.optional_public_import_message.e = 126 + + message.optional_nested_enum = unittest_pb2.TestAllTypes.BAZ + message.optional_foreign_enum = unittest_pb2.FOREIGN_BAZ + message.optional_import_enum = unittest_import_pb2.IMPORT_BAZ + + message.optional_string_piece = u'124' + message.optional_cord = u'125' + + # + # Repeated fields. + # + + message.repeated_int32.append(201) + message.repeated_int64.append(202) + message.repeated_uint32.append(203) + message.repeated_uint64.append(204) + message.repeated_sint32.append(205) + message.repeated_sint64.append(206) + message.repeated_fixed32.append(207) + message.repeated_fixed64.append(208) + message.repeated_sfixed32.append(209) + message.repeated_sfixed64.append(210) + message.repeated_float.append(211) + message.repeated_double.append(212) + message.repeated_bool.append(True) + message.repeated_string.append(u'215') + message.repeated_bytes.append(b'216') + + message.repeatedgroup.add().a = 217 + message.repeated_nested_message.add().bb = 218 + message.repeated_foreign_message.add().c = 219 + message.repeated_import_message.add().d = 220 + message.repeated_lazy_message.add().bb = 227 + + message.repeated_nested_enum.append(unittest_pb2.TestAllTypes.BAR) + message.repeated_foreign_enum.append(unittest_pb2.FOREIGN_BAR) + message.repeated_import_enum.append(unittest_import_pb2.IMPORT_BAR) + + message.repeated_string_piece.append(u'224') + message.repeated_cord.append(u'225') + + # Add a second one of each field. + message.repeated_int32.append(301) + message.repeated_int64.append(302) + message.repeated_uint32.append(303) + message.repeated_uint64.append(304) + message.repeated_sint32.append(305) + message.repeated_sint64.append(306) + message.repeated_fixed32.append(307) + message.repeated_fixed64.append(308) + message.repeated_sfixed32.append(309) + message.repeated_sfixed64.append(310) + message.repeated_float.append(311) + message.repeated_double.append(312) + message.repeated_bool.append(False) + message.repeated_string.append(u'315') + message.repeated_bytes.append(b'316') + + message.repeatedgroup.add().a = 317 + message.repeated_nested_message.add().bb = 318 + message.repeated_foreign_message.add().c = 319 + message.repeated_import_message.add().d = 320 + message.repeated_lazy_message.add().bb = 327 + + message.repeated_nested_enum.append(unittest_pb2.TestAllTypes.BAZ) + message.repeated_foreign_enum.append(unittest_pb2.FOREIGN_BAZ) + message.repeated_import_enum.append(unittest_import_pb2.IMPORT_BAZ) + + message.repeated_string_piece.append(u'324') + message.repeated_cord.append(u'325') + + # + # Fields that have defaults. + # + + message.default_int32 = 401 + message.default_int64 = 402 + message.default_uint32 = 403 + message.default_uint64 = 404 + message.default_sint32 = 405 + message.default_sint64 = 406 + message.default_fixed32 = 407 + message.default_fixed64 = 408 + message.default_sfixed32 = 409 + message.default_sfixed64 = 410 + message.default_float = 411 + message.default_double = 412 + message.default_bool = False + message.default_string = '415' + message.default_bytes = b'416' + + message.default_nested_enum = unittest_pb2.TestAllTypes.FOO + message.default_foreign_enum = unittest_pb2.FOREIGN_FOO + message.default_import_enum = unittest_import_pb2.IMPORT_FOO + + message.default_string_piece = '424' + message.default_cord = '425' + + message.oneof_uint32 = 601 + message.oneof_nested_message.bb = 602 + message.oneof_string = '603' + message.oneof_bytes = b'604' + + +def SetAllFields(message): + SetAllNonLazyFields(message) + message.optional_lazy_message.bb = 127 + + +def SetAllExtensions(message): + """Sets every extension in the message to a unique value. + + Args: + message: A unittest_pb2.TestAllExtensions instance. + """ + + extensions = message.Extensions + pb2 = unittest_pb2 + import_pb2 = unittest_import_pb2 + + # + # Optional fields. + # + + extensions[pb2.optional_int32_extension] = 101 + extensions[pb2.optional_int64_extension] = 102 + extensions[pb2.optional_uint32_extension] = 103 + extensions[pb2.optional_uint64_extension] = 104 + extensions[pb2.optional_sint32_extension] = 105 + extensions[pb2.optional_sint64_extension] = 106 + extensions[pb2.optional_fixed32_extension] = 107 + extensions[pb2.optional_fixed64_extension] = 108 + extensions[pb2.optional_sfixed32_extension] = 109 + extensions[pb2.optional_sfixed64_extension] = 110 + extensions[pb2.optional_float_extension] = 111 + extensions[pb2.optional_double_extension] = 112 + extensions[pb2.optional_bool_extension] = True + extensions[pb2.optional_string_extension] = u'115' + extensions[pb2.optional_bytes_extension] = b'116' + + extensions[pb2.optionalgroup_extension].a = 117 + extensions[pb2.optional_nested_message_extension].bb = 118 + extensions[pb2.optional_foreign_message_extension].c = 119 + extensions[pb2.optional_import_message_extension].d = 120 + extensions[pb2.optional_public_import_message_extension].e = 126 + extensions[pb2.optional_lazy_message_extension].bb = 127 + + extensions[pb2.optional_nested_enum_extension] = pb2.TestAllTypes.BAZ + extensions[pb2.optional_nested_enum_extension] = pb2.TestAllTypes.BAZ + extensions[pb2.optional_foreign_enum_extension] = pb2.FOREIGN_BAZ + extensions[pb2.optional_import_enum_extension] = import_pb2.IMPORT_BAZ + + extensions[pb2.optional_string_piece_extension] = u'124' + extensions[pb2.optional_cord_extension] = u'125' + + # + # Repeated fields. + # + + extensions[pb2.repeated_int32_extension].append(201) + extensions[pb2.repeated_int64_extension].append(202) + extensions[pb2.repeated_uint32_extension].append(203) + extensions[pb2.repeated_uint64_extension].append(204) + extensions[pb2.repeated_sint32_extension].append(205) + extensions[pb2.repeated_sint64_extension].append(206) + extensions[pb2.repeated_fixed32_extension].append(207) + extensions[pb2.repeated_fixed64_extension].append(208) + extensions[pb2.repeated_sfixed32_extension].append(209) + extensions[pb2.repeated_sfixed64_extension].append(210) + extensions[pb2.repeated_float_extension].append(211) + extensions[pb2.repeated_double_extension].append(212) + extensions[pb2.repeated_bool_extension].append(True) + extensions[pb2.repeated_string_extension].append(u'215') + extensions[pb2.repeated_bytes_extension].append(b'216') + + extensions[pb2.repeatedgroup_extension].add().a = 217 + extensions[pb2.repeated_nested_message_extension].add().bb = 218 + extensions[pb2.repeated_foreign_message_extension].add().c = 219 + extensions[pb2.repeated_import_message_extension].add().d = 220 + extensions[pb2.repeated_lazy_message_extension].add().bb = 227 + + extensions[pb2.repeated_nested_enum_extension].append(pb2.TestAllTypes.BAR) + extensions[pb2.repeated_foreign_enum_extension].append(pb2.FOREIGN_BAR) + extensions[pb2.repeated_import_enum_extension].append(import_pb2.IMPORT_BAR) + + extensions[pb2.repeated_string_piece_extension].append(u'224') + extensions[pb2.repeated_cord_extension].append(u'225') + + # Append a second one of each field. + extensions[pb2.repeated_int32_extension].append(301) + extensions[pb2.repeated_int64_extension].append(302) + extensions[pb2.repeated_uint32_extension].append(303) + extensions[pb2.repeated_uint64_extension].append(304) + extensions[pb2.repeated_sint32_extension].append(305) + extensions[pb2.repeated_sint64_extension].append(306) + extensions[pb2.repeated_fixed32_extension].append(307) + extensions[pb2.repeated_fixed64_extension].append(308) + extensions[pb2.repeated_sfixed32_extension].append(309) + extensions[pb2.repeated_sfixed64_extension].append(310) + extensions[pb2.repeated_float_extension].append(311) + extensions[pb2.repeated_double_extension].append(312) + extensions[pb2.repeated_bool_extension].append(False) + extensions[pb2.repeated_string_extension].append(u'315') + extensions[pb2.repeated_bytes_extension].append(b'316') + + extensions[pb2.repeatedgroup_extension].add().a = 317 + extensions[pb2.repeated_nested_message_extension].add().bb = 318 + extensions[pb2.repeated_foreign_message_extension].add().c = 319 + extensions[pb2.repeated_import_message_extension].add().d = 320 + extensions[pb2.repeated_lazy_message_extension].add().bb = 327 + + extensions[pb2.repeated_nested_enum_extension].append(pb2.TestAllTypes.BAZ) + extensions[pb2.repeated_foreign_enum_extension].append(pb2.FOREIGN_BAZ) + extensions[pb2.repeated_import_enum_extension].append(import_pb2.IMPORT_BAZ) + + extensions[pb2.repeated_string_piece_extension].append(u'324') + extensions[pb2.repeated_cord_extension].append(u'325') + + # + # Fields with defaults. + # + + extensions[pb2.default_int32_extension] = 401 + extensions[pb2.default_int64_extension] = 402 + extensions[pb2.default_uint32_extension] = 403 + extensions[pb2.default_uint64_extension] = 404 + extensions[pb2.default_sint32_extension] = 405 + extensions[pb2.default_sint64_extension] = 406 + extensions[pb2.default_fixed32_extension] = 407 + extensions[pb2.default_fixed64_extension] = 408 + extensions[pb2.default_sfixed32_extension] = 409 + extensions[pb2.default_sfixed64_extension] = 410 + extensions[pb2.default_float_extension] = 411 + extensions[pb2.default_double_extension] = 412 + extensions[pb2.default_bool_extension] = False + extensions[pb2.default_string_extension] = u'415' + extensions[pb2.default_bytes_extension] = b'416' + + extensions[pb2.default_nested_enum_extension] = pb2.TestAllTypes.FOO + extensions[pb2.default_foreign_enum_extension] = pb2.FOREIGN_FOO + extensions[pb2.default_import_enum_extension] = import_pb2.IMPORT_FOO + + extensions[pb2.default_string_piece_extension] = u'424' + extensions[pb2.default_cord_extension] = '425' + + extensions[pb2.oneof_uint32_extension] = 601 + extensions[pb2.oneof_nested_message_extension].bb = 602 + extensions[pb2.oneof_string_extension] = u'603' + extensions[pb2.oneof_bytes_extension] = b'604' + + +def SetAllFieldsAndExtensions(message): + """Sets every field and extension in the message to a unique value. + + Args: + message: A unittest_pb2.TestAllExtensions message. + """ + message.my_int = 1 + message.my_string = 'foo' + message.my_float = 1.0 + message.Extensions[unittest_pb2.my_extension_int] = 23 + message.Extensions[unittest_pb2.my_extension_string] = 'bar' + + +def ExpectAllFieldsAndExtensionsInOrder(serialized): + """Ensures that serialized is the serialization we expect for a message + filled with SetAllFieldsAndExtensions(). (Specifically, ensures that the + serialization is in canonical, tag-number order). + """ + my_extension_int = unittest_pb2.my_extension_int + my_extension_string = unittest_pb2.my_extension_string + expected_strings = [] + message = unittest_pb2.TestFieldOrderings() + message.my_int = 1 # Field 1. + expected_strings.append(message.SerializeToString()) + message.Clear() + message.Extensions[my_extension_int] = 23 # Field 5. + expected_strings.append(message.SerializeToString()) + message.Clear() + message.my_string = 'foo' # Field 11. + expected_strings.append(message.SerializeToString()) + message.Clear() + message.Extensions[my_extension_string] = 'bar' # Field 50. + expected_strings.append(message.SerializeToString()) + message.Clear() + message.my_float = 1.0 + expected_strings.append(message.SerializeToString()) + message.Clear() + expected = b''.join(expected_strings) + + if expected != serialized: + raise ValueError('Expected %r, found %r' % (expected, serialized)) + + +def ExpectAllFieldsSet(test_case, message): + """Check all fields for correct values have after Set*Fields() is called.""" + test_case.assertTrue(message.HasField('optional_int32')) + test_case.assertTrue(message.HasField('optional_int64')) + test_case.assertTrue(message.HasField('optional_uint32')) + test_case.assertTrue(message.HasField('optional_uint64')) + test_case.assertTrue(message.HasField('optional_sint32')) + test_case.assertTrue(message.HasField('optional_sint64')) + test_case.assertTrue(message.HasField('optional_fixed32')) + test_case.assertTrue(message.HasField('optional_fixed64')) + test_case.assertTrue(message.HasField('optional_sfixed32')) + test_case.assertTrue(message.HasField('optional_sfixed64')) + test_case.assertTrue(message.HasField('optional_float')) + test_case.assertTrue(message.HasField('optional_double')) + test_case.assertTrue(message.HasField('optional_bool')) + test_case.assertTrue(message.HasField('optional_string')) + test_case.assertTrue(message.HasField('optional_bytes')) + + test_case.assertTrue(message.HasField('optionalgroup')) + test_case.assertTrue(message.HasField('optional_nested_message')) + test_case.assertTrue(message.HasField('optional_foreign_message')) + test_case.assertTrue(message.HasField('optional_import_message')) + + test_case.assertTrue(message.optionalgroup.HasField('a')) + test_case.assertTrue(message.optional_nested_message.HasField('bb')) + test_case.assertTrue(message.optional_foreign_message.HasField('c')) + test_case.assertTrue(message.optional_import_message.HasField('d')) + + test_case.assertTrue(message.HasField('optional_nested_enum')) + test_case.assertTrue(message.HasField('optional_foreign_enum')) + test_case.assertTrue(message.HasField('optional_import_enum')) + + test_case.assertTrue(message.HasField('optional_string_piece')) + test_case.assertTrue(message.HasField('optional_cord')) + + test_case.assertEqual(101, message.optional_int32) + test_case.assertEqual(102, message.optional_int64) + test_case.assertEqual(103, message.optional_uint32) + test_case.assertEqual(104, message.optional_uint64) + test_case.assertEqual(105, message.optional_sint32) + test_case.assertEqual(106, message.optional_sint64) + test_case.assertEqual(107, message.optional_fixed32) + test_case.assertEqual(108, message.optional_fixed64) + test_case.assertEqual(109, message.optional_sfixed32) + test_case.assertEqual(110, message.optional_sfixed64) + test_case.assertEqual(111, message.optional_float) + test_case.assertEqual(112, message.optional_double) + test_case.assertEqual(True, message.optional_bool) + test_case.assertEqual('115', message.optional_string) + test_case.assertEqual(b'116', message.optional_bytes) + + test_case.assertEqual(117, message.optionalgroup.a) + test_case.assertEqual(118, message.optional_nested_message.bb) + test_case.assertEqual(119, message.optional_foreign_message.c) + test_case.assertEqual(120, message.optional_import_message.d) + test_case.assertEqual(126, message.optional_public_import_message.e) + test_case.assertEqual(127, message.optional_lazy_message.bb) + + test_case.assertEqual(unittest_pb2.TestAllTypes.BAZ, + message.optional_nested_enum) + test_case.assertEqual(unittest_pb2.FOREIGN_BAZ, + message.optional_foreign_enum) + test_case.assertEqual(unittest_import_pb2.IMPORT_BAZ, + message.optional_import_enum) + + # ----------------------------------------------------------------- + + test_case.assertEqual(2, len(message.repeated_int32)) + test_case.assertEqual(2, len(message.repeated_int64)) + test_case.assertEqual(2, len(message.repeated_uint32)) + test_case.assertEqual(2, len(message.repeated_uint64)) + test_case.assertEqual(2, len(message.repeated_sint32)) + test_case.assertEqual(2, len(message.repeated_sint64)) + test_case.assertEqual(2, len(message.repeated_fixed32)) + test_case.assertEqual(2, len(message.repeated_fixed64)) + test_case.assertEqual(2, len(message.repeated_sfixed32)) + test_case.assertEqual(2, len(message.repeated_sfixed64)) + test_case.assertEqual(2, len(message.repeated_float)) + test_case.assertEqual(2, len(message.repeated_double)) + test_case.assertEqual(2, len(message.repeated_bool)) + test_case.assertEqual(2, len(message.repeated_string)) + test_case.assertEqual(2, len(message.repeated_bytes)) + + test_case.assertEqual(2, len(message.repeatedgroup)) + test_case.assertEqual(2, len(message.repeated_nested_message)) + test_case.assertEqual(2, len(message.repeated_foreign_message)) + test_case.assertEqual(2, len(message.repeated_import_message)) + test_case.assertEqual(2, len(message.repeated_nested_enum)) + test_case.assertEqual(2, len(message.repeated_foreign_enum)) + test_case.assertEqual(2, len(message.repeated_import_enum)) + + test_case.assertEqual(2, len(message.repeated_string_piece)) + test_case.assertEqual(2, len(message.repeated_cord)) + + test_case.assertEqual(201, message.repeated_int32[0]) + test_case.assertEqual(202, message.repeated_int64[0]) + test_case.assertEqual(203, message.repeated_uint32[0]) + test_case.assertEqual(204, message.repeated_uint64[0]) + test_case.assertEqual(205, message.repeated_sint32[0]) + test_case.assertEqual(206, message.repeated_sint64[0]) + test_case.assertEqual(207, message.repeated_fixed32[0]) + test_case.assertEqual(208, message.repeated_fixed64[0]) + test_case.assertEqual(209, message.repeated_sfixed32[0]) + test_case.assertEqual(210, message.repeated_sfixed64[0]) + test_case.assertEqual(211, message.repeated_float[0]) + test_case.assertEqual(212, message.repeated_double[0]) + test_case.assertEqual(True, message.repeated_bool[0]) + test_case.assertEqual('215', message.repeated_string[0]) + test_case.assertEqual(b'216', message.repeated_bytes[0]) + + test_case.assertEqual(217, message.repeatedgroup[0].a) + test_case.assertEqual(218, message.repeated_nested_message[0].bb) + test_case.assertEqual(219, message.repeated_foreign_message[0].c) + test_case.assertEqual(220, message.repeated_import_message[0].d) + test_case.assertEqual(227, message.repeated_lazy_message[0].bb) + + test_case.assertEqual(unittest_pb2.TestAllTypes.BAR, + message.repeated_nested_enum[0]) + test_case.assertEqual(unittest_pb2.FOREIGN_BAR, + message.repeated_foreign_enum[0]) + test_case.assertEqual(unittest_import_pb2.IMPORT_BAR, + message.repeated_import_enum[0]) + + test_case.assertEqual(301, message.repeated_int32[1]) + test_case.assertEqual(302, message.repeated_int64[1]) + test_case.assertEqual(303, message.repeated_uint32[1]) + test_case.assertEqual(304, message.repeated_uint64[1]) + test_case.assertEqual(305, message.repeated_sint32[1]) + test_case.assertEqual(306, message.repeated_sint64[1]) + test_case.assertEqual(307, message.repeated_fixed32[1]) + test_case.assertEqual(308, message.repeated_fixed64[1]) + test_case.assertEqual(309, message.repeated_sfixed32[1]) + test_case.assertEqual(310, message.repeated_sfixed64[1]) + test_case.assertEqual(311, message.repeated_float[1]) + test_case.assertEqual(312, message.repeated_double[1]) + test_case.assertEqual(False, message.repeated_bool[1]) + test_case.assertEqual('315', message.repeated_string[1]) + test_case.assertEqual(b'316', message.repeated_bytes[1]) + + test_case.assertEqual(317, message.repeatedgroup[1].a) + test_case.assertEqual(318, message.repeated_nested_message[1].bb) + test_case.assertEqual(319, message.repeated_foreign_message[1].c) + test_case.assertEqual(320, message.repeated_import_message[1].d) + test_case.assertEqual(327, message.repeated_lazy_message[1].bb) + + test_case.assertEqual(unittest_pb2.TestAllTypes.BAZ, + message.repeated_nested_enum[1]) + test_case.assertEqual(unittest_pb2.FOREIGN_BAZ, + message.repeated_foreign_enum[1]) + test_case.assertEqual(unittest_import_pb2.IMPORT_BAZ, + message.repeated_import_enum[1]) + + # ----------------------------------------------------------------- + + test_case.assertTrue(message.HasField('default_int32')) + test_case.assertTrue(message.HasField('default_int64')) + test_case.assertTrue(message.HasField('default_uint32')) + test_case.assertTrue(message.HasField('default_uint64')) + test_case.assertTrue(message.HasField('default_sint32')) + test_case.assertTrue(message.HasField('default_sint64')) + test_case.assertTrue(message.HasField('default_fixed32')) + test_case.assertTrue(message.HasField('default_fixed64')) + test_case.assertTrue(message.HasField('default_sfixed32')) + test_case.assertTrue(message.HasField('default_sfixed64')) + test_case.assertTrue(message.HasField('default_float')) + test_case.assertTrue(message.HasField('default_double')) + test_case.assertTrue(message.HasField('default_bool')) + test_case.assertTrue(message.HasField('default_string')) + test_case.assertTrue(message.HasField('default_bytes')) + + test_case.assertTrue(message.HasField('default_nested_enum')) + test_case.assertTrue(message.HasField('default_foreign_enum')) + test_case.assertTrue(message.HasField('default_import_enum')) + + test_case.assertEqual(401, message.default_int32) + test_case.assertEqual(402, message.default_int64) + test_case.assertEqual(403, message.default_uint32) + test_case.assertEqual(404, message.default_uint64) + test_case.assertEqual(405, message.default_sint32) + test_case.assertEqual(406, message.default_sint64) + test_case.assertEqual(407, message.default_fixed32) + test_case.assertEqual(408, message.default_fixed64) + test_case.assertEqual(409, message.default_sfixed32) + test_case.assertEqual(410, message.default_sfixed64) + test_case.assertEqual(411, message.default_float) + test_case.assertEqual(412, message.default_double) + test_case.assertEqual(False, message.default_bool) + test_case.assertEqual('415', message.default_string) + test_case.assertEqual(b'416', message.default_bytes) + + test_case.assertEqual(unittest_pb2.TestAllTypes.FOO, + message.default_nested_enum) + test_case.assertEqual(unittest_pb2.FOREIGN_FOO, + message.default_foreign_enum) + test_case.assertEqual(unittest_import_pb2.IMPORT_FOO, + message.default_import_enum) + + +def GoldenFile(filename): + """Finds the given golden file and returns a file object representing it.""" + + # Search up the directory tree looking for the C++ protobuf source code. + path = '.' + while os.path.exists(path): + if os.path.exists(os.path.join(path, 'src/google/protobuf')): + # Found it. Load the golden file from the testdata directory. + full_path = os.path.join(path, 'src/google/protobuf/testdata', filename) + return open(full_path, 'rb') + path = os.path.join(path, '..') + + raise RuntimeError( + 'Could not find golden files. This test must be run from within the ' + 'protobuf source package so that it can read test data files from the ' + 'C++ source tree.') + + +def GoldenFileData(filename): + """Finds the given golden file and returns its contents.""" + with GoldenFile(filename) as f: + return f.read() + + +def SetAllPackedFields(message): + """Sets every field in the message to a unique value. + + Args: + message: A unittest_pb2.TestPackedTypes instance. + """ + message.packed_int32.extend([601, 701]) + message.packed_int64.extend([602, 702]) + message.packed_uint32.extend([603, 703]) + message.packed_uint64.extend([604, 704]) + message.packed_sint32.extend([605, 705]) + message.packed_sint64.extend([606, 706]) + message.packed_fixed32.extend([607, 707]) + message.packed_fixed64.extend([608, 708]) + message.packed_sfixed32.extend([609, 709]) + message.packed_sfixed64.extend([610, 710]) + message.packed_float.extend([611.0, 711.0]) + message.packed_double.extend([612.0, 712.0]) + message.packed_bool.extend([True, False]) + message.packed_enum.extend([unittest_pb2.FOREIGN_BAR, + unittest_pb2.FOREIGN_BAZ]) + + +def SetAllPackedExtensions(message): + """Sets every extension in the message to a unique value. + + Args: + message: A unittest_pb2.TestPackedExtensions instance. + """ + extensions = message.Extensions + pb2 = unittest_pb2 + + extensions[pb2.packed_int32_extension].extend([601, 701]) + extensions[pb2.packed_int64_extension].extend([602, 702]) + extensions[pb2.packed_uint32_extension].extend([603, 703]) + extensions[pb2.packed_uint64_extension].extend([604, 704]) + extensions[pb2.packed_sint32_extension].extend([605, 705]) + extensions[pb2.packed_sint64_extension].extend([606, 706]) + extensions[pb2.packed_fixed32_extension].extend([607, 707]) + extensions[pb2.packed_fixed64_extension].extend([608, 708]) + extensions[pb2.packed_sfixed32_extension].extend([609, 709]) + extensions[pb2.packed_sfixed64_extension].extend([610, 710]) + extensions[pb2.packed_float_extension].extend([611.0, 711.0]) + extensions[pb2.packed_double_extension].extend([612.0, 712.0]) + extensions[pb2.packed_bool_extension].extend([True, False]) + extensions[pb2.packed_enum_extension].extend([unittest_pb2.FOREIGN_BAR, + unittest_pb2.FOREIGN_BAZ]) + + +def SetAllUnpackedFields(message): + """Sets every field in the message to a unique value. + + Args: + message: A unittest_pb2.TestUnpackedTypes instance. + """ + message.unpacked_int32.extend([601, 701]) + message.unpacked_int64.extend([602, 702]) + message.unpacked_uint32.extend([603, 703]) + message.unpacked_uint64.extend([604, 704]) + message.unpacked_sint32.extend([605, 705]) + message.unpacked_sint64.extend([606, 706]) + message.unpacked_fixed32.extend([607, 707]) + message.unpacked_fixed64.extend([608, 708]) + message.unpacked_sfixed32.extend([609, 709]) + message.unpacked_sfixed64.extend([610, 710]) + message.unpacked_float.extend([611.0, 711.0]) + message.unpacked_double.extend([612.0, 712.0]) + message.unpacked_bool.extend([True, False]) + message.unpacked_enum.extend([unittest_pb2.FOREIGN_BAR, + unittest_pb2.FOREIGN_BAZ]) diff --git a/pythonlib/google/protobuf/internal/text_encoding_test.py b/pythonlib/google/protobuf/internal/text_encoding_test.py new file mode 100644 index 0000000..ba0e45d --- /dev/null +++ b/pythonlib/google/protobuf/internal/text_encoding_test.py @@ -0,0 +1,68 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Tests for google.protobuf.text_encoding.""" + +from google.apputils import basetest +from google.protobuf import text_encoding + +TEST_VALUES = [ + ("foo\\rbar\\nbaz\\t", + "foo\\rbar\\nbaz\\t", + b"foo\rbar\nbaz\t"), + ("\\'full of \\\"sound\\\" and \\\"fury\\\"\\'", + "\\'full of \\\"sound\\\" and \\\"fury\\\"\\'", + b"'full of \"sound\" and \"fury\"'"), + ("signi\\\\fying\\\\ nothing\\\\", + "signi\\\\fying\\\\ nothing\\\\", + b"signi\\fying\\ nothing\\"), + ("\\010\\t\\n\\013\\014\\r", + "\x08\\t\\n\x0b\x0c\\r", + b"\010\011\012\013\014\015")] + + +class TextEncodingTestCase(basetest.TestCase): + def testCEscape(self): + for escaped, escaped_utf8, unescaped in TEST_VALUES: + self.assertEquals(escaped, + text_encoding.CEscape(unescaped, as_utf8=False)) + self.assertEquals(escaped_utf8, + text_encoding.CEscape(unescaped, as_utf8=True)) + + def testCUnescape(self): + for escaped, escaped_utf8, unescaped in TEST_VALUES: + self.assertEquals(unescaped, text_encoding.CUnescape(escaped)) + self.assertEquals(unescaped, text_encoding.CUnescape(escaped_utf8)) + + +if __name__ == "__main__": + basetest.main() diff --git a/pythonlib/google/protobuf/internal/text_format_test.py b/pythonlib/google/protobuf/internal/text_format_test.py new file mode 100644 index 0000000..d27ff7a --- /dev/null +++ b/pythonlib/google/protobuf/internal/text_format_test.py @@ -0,0 +1,736 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Test for google.protobuf.text_format.""" + +__author__ = 'kenton@google.com (Kenton Varda)' + +import re + +from google.apputils import basetest +from google.protobuf import text_format +from google.protobuf.internal import api_implementation +from google.protobuf.internal import test_util +from google.protobuf import unittest_pb2 +from google.protobuf import unittest_mset_pb2 + +class TextFormatTest(basetest.TestCase): + + def ReadGolden(self, golden_filename): + with test_util.GoldenFile(golden_filename) as f: + return (f.readlines() if str is bytes else # PY3 + [golden_line.decode('utf-8') for golden_line in f]) + + def CompareToGoldenFile(self, text, golden_filename): + golden_lines = self.ReadGolden(golden_filename) + self.assertMultiLineEqual(text, ''.join(golden_lines)) + + def CompareToGoldenText(self, text, golden_text): + self.assertMultiLineEqual(text, golden_text) + + def testPrintAllFields(self): + message = unittest_pb2.TestAllTypes() + test_util.SetAllFields(message) + self.CompareToGoldenFile( + self.RemoveRedundantZeros(text_format.MessageToString(message)), + 'text_format_unittest_data_oneof_implemented.txt') + + def testPrintInIndexOrder(self): + message = unittest_pb2.TestFieldOrderings() + message.my_string = '115' + message.my_int = 101 + message.my_float = 111 + self.CompareToGoldenText( + self.RemoveRedundantZeros(text_format.MessageToString( + message, use_index_order=True)), + 'my_string: \"115\"\nmy_int: 101\nmy_float: 111\n') + self.CompareToGoldenText( + self.RemoveRedundantZeros(text_format.MessageToString( + message)), 'my_int: 101\nmy_string: \"115\"\nmy_float: 111\n') + + def testPrintAllExtensions(self): + message = unittest_pb2.TestAllExtensions() + test_util.SetAllExtensions(message) + self.CompareToGoldenFile( + self.RemoveRedundantZeros(text_format.MessageToString(message)), + 'text_format_unittest_extensions_data.txt') + + def testPrintAllFieldsPointy(self): + message = unittest_pb2.TestAllTypes() + test_util.SetAllFields(message) + self.CompareToGoldenFile( + self.RemoveRedundantZeros( + text_format.MessageToString(message, pointy_brackets=True)), + 'text_format_unittest_data_pointy_oneof.txt') + + def testPrintAllExtensionsPointy(self): + message = unittest_pb2.TestAllExtensions() + test_util.SetAllExtensions(message) + self.CompareToGoldenFile( + self.RemoveRedundantZeros(text_format.MessageToString( + message, pointy_brackets=True)), + 'text_format_unittest_extensions_data_pointy.txt') + + def testPrintMessageSet(self): + message = unittest_mset_pb2.TestMessageSetContainer() + ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension + ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension + message.message_set.Extensions[ext1].i = 23 + message.message_set.Extensions[ext2].str = 'foo' + self.CompareToGoldenText( + text_format.MessageToString(message), + 'message_set {\n' + ' [protobuf_unittest.TestMessageSetExtension1] {\n' + ' i: 23\n' + ' }\n' + ' [protobuf_unittest.TestMessageSetExtension2] {\n' + ' str: \"foo\"\n' + ' }\n' + '}\n') + + def testPrintExotic(self): + message = unittest_pb2.TestAllTypes() + message.repeated_int64.append(-9223372036854775808) + message.repeated_uint64.append(18446744073709551615) + message.repeated_double.append(123.456) + message.repeated_double.append(1.23e22) + message.repeated_double.append(1.23e-18) + message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"') + message.repeated_string.append(u'\u00fc\ua71f') + self.CompareToGoldenText( + self.RemoveRedundantZeros(text_format.MessageToString(message)), + 'repeated_int64: -9223372036854775808\n' + 'repeated_uint64: 18446744073709551615\n' + 'repeated_double: 123.456\n' + 'repeated_double: 1.23e+22\n' + 'repeated_double: 1.23e-18\n' + 'repeated_string:' + ' "\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""\n' + 'repeated_string: "\\303\\274\\352\\234\\237"\n') + + def testPrintExoticUnicodeSubclass(self): + class UnicodeSub(unicode): + pass + message = unittest_pb2.TestAllTypes() + message.repeated_string.append(UnicodeSub(u'\u00fc\ua71f')) + self.CompareToGoldenText( + text_format.MessageToString(message), + 'repeated_string: "\\303\\274\\352\\234\\237"\n') + + def testPrintNestedMessageAsOneLine(self): + message = unittest_pb2.TestAllTypes() + msg = message.repeated_nested_message.add() + msg.bb = 42 + self.CompareToGoldenText( + text_format.MessageToString(message, as_one_line=True), + 'repeated_nested_message { bb: 42 }') + + def testPrintRepeatedFieldsAsOneLine(self): + message = unittest_pb2.TestAllTypes() + message.repeated_int32.append(1) + message.repeated_int32.append(1) + message.repeated_int32.append(3) + message.repeated_string.append("Google") + message.repeated_string.append("Zurich") + self.CompareToGoldenText( + text_format.MessageToString(message, as_one_line=True), + 'repeated_int32: 1 repeated_int32: 1 repeated_int32: 3 ' + 'repeated_string: "Google" repeated_string: "Zurich"') + + def testPrintNestedNewLineInStringAsOneLine(self): + message = unittest_pb2.TestAllTypes() + message.optional_string = "a\nnew\nline" + self.CompareToGoldenText( + text_format.MessageToString(message, as_one_line=True), + 'optional_string: "a\\nnew\\nline"') + + def testPrintMessageSetAsOneLine(self): + message = unittest_mset_pb2.TestMessageSetContainer() + ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension + ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension + message.message_set.Extensions[ext1].i = 23 + message.message_set.Extensions[ext2].str = 'foo' + self.CompareToGoldenText( + text_format.MessageToString(message, as_one_line=True), + 'message_set {' + ' [protobuf_unittest.TestMessageSetExtension1] {' + ' i: 23' + ' }' + ' [protobuf_unittest.TestMessageSetExtension2] {' + ' str: \"foo\"' + ' }' + ' }') + + def testPrintExoticAsOneLine(self): + message = unittest_pb2.TestAllTypes() + message.repeated_int64.append(-9223372036854775808) + message.repeated_uint64.append(18446744073709551615) + message.repeated_double.append(123.456) + message.repeated_double.append(1.23e22) + message.repeated_double.append(1.23e-18) + message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"') + message.repeated_string.append(u'\u00fc\ua71f') + self.CompareToGoldenText( + self.RemoveRedundantZeros( + text_format.MessageToString(message, as_one_line=True)), + 'repeated_int64: -9223372036854775808' + ' repeated_uint64: 18446744073709551615' + ' repeated_double: 123.456' + ' repeated_double: 1.23e+22' + ' repeated_double: 1.23e-18' + ' repeated_string: ' + '"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""' + ' repeated_string: "\\303\\274\\352\\234\\237"') + + def testRoundTripExoticAsOneLine(self): + message = unittest_pb2.TestAllTypes() + message.repeated_int64.append(-9223372036854775808) + message.repeated_uint64.append(18446744073709551615) + message.repeated_double.append(123.456) + message.repeated_double.append(1.23e22) + message.repeated_double.append(1.23e-18) + message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"') + message.repeated_string.append(u'\u00fc\ua71f') + + # Test as_utf8 = False. + wire_text = text_format.MessageToString( + message, as_one_line=True, as_utf8=False) + parsed_message = unittest_pb2.TestAllTypes() + r = text_format.Parse(wire_text, parsed_message) + self.assertIs(r, parsed_message) + self.assertEquals(message, parsed_message) + + # Test as_utf8 = True. + wire_text = text_format.MessageToString( + message, as_one_line=True, as_utf8=True) + parsed_message = unittest_pb2.TestAllTypes() + r = text_format.Parse(wire_text, parsed_message) + self.assertIs(r, parsed_message) + self.assertEquals(message, parsed_message, + '\n%s != %s' % (message, parsed_message)) + + def testPrintRawUtf8String(self): + message = unittest_pb2.TestAllTypes() + message.repeated_string.append(u'\u00fc\ua71f') + text = text_format.MessageToString(message, as_utf8=True) + self.CompareToGoldenText(text, 'repeated_string: "\303\274\352\234\237"\n') + parsed_message = unittest_pb2.TestAllTypes() + text_format.Parse(text, parsed_message) + self.assertEquals(message, parsed_message, + '\n%s != %s' % (message, parsed_message)) + + def testPrintFloatFormat(self): + # Check that float_format argument is passed to sub-message formatting. + message = unittest_pb2.NestedTestAllTypes() + # We use 1.25 as it is a round number in binary. The proto 32-bit float + # will not gain additional imprecise digits as a 64-bit Python float and + # show up in its str. 32-bit 1.2 is noisy when extended to 64-bit: + # >>> struct.unpack('f', struct.pack('f', 1.2))[0] + # 1.2000000476837158 + # >>> struct.unpack('f', struct.pack('f', 1.25))[0] + # 1.25 + message.payload.optional_float = 1.25 + # Check rounding at 15 significant digits + message.payload.optional_double = -.000003456789012345678 + # Check no decimal point. + message.payload.repeated_float.append(-5642) + # Check no trailing zeros. + message.payload.repeated_double.append(.000078900) + formatted_fields = ['optional_float: 1.25', + 'optional_double: -3.45678901234568e-6', + 'repeated_float: -5642', + 'repeated_double: 7.89e-5'] + text_message = text_format.MessageToString(message, float_format='.15g') + self.CompareToGoldenText( + self.RemoveRedundantZeros(text_message), + 'payload {{\n {}\n {}\n {}\n {}\n}}\n'.format(*formatted_fields)) + # as_one_line=True is a separate code branch where float_format is passed. + text_message = text_format.MessageToString(message, as_one_line=True, + float_format='.15g') + self.CompareToGoldenText( + self.RemoveRedundantZeros(text_message), + 'payload {{ {} {} {} {} }}'.format(*formatted_fields)) + + def testMessageToString(self): + message = unittest_pb2.ForeignMessage() + message.c = 123 + self.assertEqual('c: 123\n', str(message)) + + def RemoveRedundantZeros(self, text): + # Some platforms print 1e+5 as 1e+005. This is fine, but we need to remove + # these zeros in order to match the golden file. + text = text.replace('e+0','e+').replace('e+0','e+') \ + .replace('e-0','e-').replace('e-0','e-') + # Floating point fields are printed with .0 suffix even if they are + # actualy integer numbers. + text = re.compile('\.0$', re.MULTILINE).sub('', text) + return text + + def testParseGolden(self): + golden_text = '\n'.join(self.ReadGolden('text_format_unittest_data.txt')) + parsed_message = unittest_pb2.TestAllTypes() + r = text_format.Parse(golden_text, parsed_message) + self.assertIs(r, parsed_message) + + message = unittest_pb2.TestAllTypes() + test_util.SetAllFields(message) + self.assertEquals(message, parsed_message) + + def testParseGoldenExtensions(self): + golden_text = '\n'.join(self.ReadGolden( + 'text_format_unittest_extensions_data.txt')) + parsed_message = unittest_pb2.TestAllExtensions() + text_format.Parse(golden_text, parsed_message) + + message = unittest_pb2.TestAllExtensions() + test_util.SetAllExtensions(message) + self.assertEquals(message, parsed_message) + + def testParseAllFields(self): + message = unittest_pb2.TestAllTypes() + test_util.SetAllFields(message) + ascii_text = text_format.MessageToString(message) + + parsed_message = unittest_pb2.TestAllTypes() + text_format.Parse(ascii_text, parsed_message) + self.assertEqual(message, parsed_message) + test_util.ExpectAllFieldsSet(self, message) + + def testParseAllExtensions(self): + message = unittest_pb2.TestAllExtensions() + test_util.SetAllExtensions(message) + ascii_text = text_format.MessageToString(message) + + parsed_message = unittest_pb2.TestAllExtensions() + text_format.Parse(ascii_text, parsed_message) + self.assertEqual(message, parsed_message) + + def testParseMessageSet(self): + message = unittest_pb2.TestAllTypes() + text = ('repeated_uint64: 1\n' + 'repeated_uint64: 2\n') + text_format.Parse(text, message) + self.assertEqual(1, message.repeated_uint64[0]) + self.assertEqual(2, message.repeated_uint64[1]) + + message = unittest_mset_pb2.TestMessageSetContainer() + text = ('message_set {\n' + ' [protobuf_unittest.TestMessageSetExtension1] {\n' + ' i: 23\n' + ' }\n' + ' [protobuf_unittest.TestMessageSetExtension2] {\n' + ' str: \"foo\"\n' + ' }\n' + '}\n') + text_format.Parse(text, message) + ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension + ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension + self.assertEquals(23, message.message_set.Extensions[ext1].i) + self.assertEquals('foo', message.message_set.Extensions[ext2].str) + + def testParseExotic(self): + message = unittest_pb2.TestAllTypes() + text = ('repeated_int64: -9223372036854775808\n' + 'repeated_uint64: 18446744073709551615\n' + 'repeated_double: 123.456\n' + 'repeated_double: 1.23e+22\n' + 'repeated_double: 1.23e-18\n' + 'repeated_string: \n' + '"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""\n' + 'repeated_string: "foo" \'corge\' "grault"\n' + 'repeated_string: "\\303\\274\\352\\234\\237"\n' + 'repeated_string: "\\xc3\\xbc"\n' + 'repeated_string: "\xc3\xbc"\n') + text_format.Parse(text, message) + + self.assertEqual(-9223372036854775808, message.repeated_int64[0]) + self.assertEqual(18446744073709551615, message.repeated_uint64[0]) + self.assertEqual(123.456, message.repeated_double[0]) + self.assertEqual(1.23e22, message.repeated_double[1]) + self.assertEqual(1.23e-18, message.repeated_double[2]) + self.assertEqual( + '\000\001\a\b\f\n\r\t\v\\\'"', message.repeated_string[0]) + self.assertEqual('foocorgegrault', message.repeated_string[1]) + self.assertEqual(u'\u00fc\ua71f', message.repeated_string[2]) + self.assertEqual(u'\u00fc', message.repeated_string[3]) + + def testParseTrailingCommas(self): + message = unittest_pb2.TestAllTypes() + text = ('repeated_int64: 100;\n' + 'repeated_int64: 200;\n' + 'repeated_int64: 300,\n' + 'repeated_string: "one",\n' + 'repeated_string: "two";\n') + text_format.Parse(text, message) + + self.assertEqual(100, message.repeated_int64[0]) + self.assertEqual(200, message.repeated_int64[1]) + self.assertEqual(300, message.repeated_int64[2]) + self.assertEqual(u'one', message.repeated_string[0]) + self.assertEqual(u'two', message.repeated_string[1]) + + def testParseEmptyText(self): + message = unittest_pb2.TestAllTypes() + text = '' + text_format.Parse(text, message) + self.assertEquals(unittest_pb2.TestAllTypes(), message) + + def testParseInvalidUtf8(self): + message = unittest_pb2.TestAllTypes() + text = 'repeated_string: "\\xc3\\xc3"' + self.assertRaises(text_format.ParseError, text_format.Parse, text, message) + + def testParseSingleWord(self): + message = unittest_pb2.TestAllTypes() + text = 'foo' + self.assertRaisesWithLiteralMatch( + text_format.ParseError, + ('1:1 : Message type "protobuf_unittest.TestAllTypes" has no field named ' + '"foo".'), + text_format.Parse, text, message) + + def testParseUnknownField(self): + message = unittest_pb2.TestAllTypes() + text = 'unknown_field: 8\n' + self.assertRaisesWithLiteralMatch( + text_format.ParseError, + ('1:1 : Message type "protobuf_unittest.TestAllTypes" has no field named ' + '"unknown_field".'), + text_format.Parse, text, message) + + def testParseBadExtension(self): + message = unittest_pb2.TestAllExtensions() + text = '[unknown_extension]: 8\n' + self.assertRaisesWithLiteralMatch( + text_format.ParseError, + '1:2 : Extension "unknown_extension" not registered.', + text_format.Parse, text, message) + message = unittest_pb2.TestAllTypes() + self.assertRaisesWithLiteralMatch( + text_format.ParseError, + ('1:2 : Message type "protobuf_unittest.TestAllTypes" does not have ' + 'extensions.'), + text_format.Parse, text, message) + + def testParseGroupNotClosed(self): + message = unittest_pb2.TestAllTypes() + text = 'RepeatedGroup: <' + self.assertRaisesWithLiteralMatch( + text_format.ParseError, '1:16 : Expected ">".', + text_format.Parse, text, message) + + text = 'RepeatedGroup: {' + self.assertRaisesWithLiteralMatch( + text_format.ParseError, '1:16 : Expected "}".', + text_format.Parse, text, message) + + def testParseEmptyGroup(self): + message = unittest_pb2.TestAllTypes() + text = 'OptionalGroup: {}' + text_format.Parse(text, message) + self.assertTrue(message.HasField('optionalgroup')) + + message.Clear() + + message = unittest_pb2.TestAllTypes() + text = 'OptionalGroup: <>' + text_format.Parse(text, message) + self.assertTrue(message.HasField('optionalgroup')) + + def testParseBadEnumValue(self): + message = unittest_pb2.TestAllTypes() + text = 'optional_nested_enum: BARR' + self.assertRaisesWithLiteralMatch( + text_format.ParseError, + ('1:23 : Enum type "protobuf_unittest.TestAllTypes.NestedEnum" ' + 'has no value named BARR.'), + text_format.Parse, text, message) + + message = unittest_pb2.TestAllTypes() + text = 'optional_nested_enum: 100' + self.assertRaisesWithLiteralMatch( + text_format.ParseError, + ('1:23 : Enum type "protobuf_unittest.TestAllTypes.NestedEnum" ' + 'has no value with number 100.'), + text_format.Parse, text, message) + + def testParseBadIntValue(self): + message = unittest_pb2.TestAllTypes() + text = 'optional_int32: bork' + self.assertRaisesWithLiteralMatch( + text_format.ParseError, + ('1:17 : Couldn\'t parse integer: bork'), + text_format.Parse, text, message) + + def testParseStringFieldUnescape(self): + message = unittest_pb2.TestAllTypes() + text = r'''repeated_string: "\xf\x62" + repeated_string: "\\xf\\x62" + repeated_string: "\\\xf\\\x62" + repeated_string: "\\\\xf\\\\x62" + repeated_string: "\\\\\xf\\\\\x62" + repeated_string: "\x5cx20"''' + text_format.Parse(text, message) + + SLASH = '\\' + self.assertEqual('\x0fb', message.repeated_string[0]) + self.assertEqual(SLASH + 'xf' + SLASH + 'x62', message.repeated_string[1]) + self.assertEqual(SLASH + '\x0f' + SLASH + 'b', message.repeated_string[2]) + self.assertEqual(SLASH + SLASH + 'xf' + SLASH + SLASH + 'x62', + message.repeated_string[3]) + self.assertEqual(SLASH + SLASH + '\x0f' + SLASH + SLASH + 'b', + message.repeated_string[4]) + self.assertEqual(SLASH + 'x20', message.repeated_string[5]) + + def testMergeRepeatedScalars(self): + message = unittest_pb2.TestAllTypes() + text = ('optional_int32: 42 ' + 'optional_int32: 67') + r = text_format.Merge(text, message) + self.assertIs(r, message) + self.assertEqual(67, message.optional_int32) + + def testParseRepeatedScalars(self): + message = unittest_pb2.TestAllTypes() + text = ('optional_int32: 42 ' + 'optional_int32: 67') + self.assertRaisesWithLiteralMatch( + text_format.ParseError, + ('1:36 : Message type "protobuf_unittest.TestAllTypes" should not ' + 'have multiple "optional_int32" fields.'), + text_format.Parse, text, message) + + def testMergeRepeatedNestedMessageScalars(self): + message = unittest_pb2.TestAllTypes() + text = ('optional_nested_message { bb: 1 } ' + 'optional_nested_message { bb: 2 }') + r = text_format.Merge(text, message) + self.assertTrue(r is message) + self.assertEqual(2, message.optional_nested_message.bb) + + def testParseRepeatedNestedMessageScalars(self): + message = unittest_pb2.TestAllTypes() + text = ('optional_nested_message { bb: 1 } ' + 'optional_nested_message { bb: 2 }') + self.assertRaisesWithLiteralMatch( + text_format.ParseError, + ('1:65 : Message type "protobuf_unittest.TestAllTypes.NestedMessage" ' + 'should not have multiple "bb" fields.'), + text_format.Parse, text, message) + + def testMergeRepeatedExtensionScalars(self): + message = unittest_pb2.TestAllExtensions() + text = ('[protobuf_unittest.optional_int32_extension]: 42 ' + '[protobuf_unittest.optional_int32_extension]: 67') + text_format.Merge(text, message) + self.assertEqual( + 67, + message.Extensions[unittest_pb2.optional_int32_extension]) + + def testParseRepeatedExtensionScalars(self): + message = unittest_pb2.TestAllExtensions() + text = ('[protobuf_unittest.optional_int32_extension]: 42 ' + '[protobuf_unittest.optional_int32_extension]: 67') + self.assertRaisesWithLiteralMatch( + text_format.ParseError, + ('1:96 : Message type "protobuf_unittest.TestAllExtensions" ' + 'should not have multiple ' + '"protobuf_unittest.optional_int32_extension" extensions.'), + text_format.Parse, text, message) + + def testParseLinesGolden(self): + opened = self.ReadGolden('text_format_unittest_data.txt') + parsed_message = unittest_pb2.TestAllTypes() + r = text_format.ParseLines(opened, parsed_message) + self.assertIs(r, parsed_message) + + message = unittest_pb2.TestAllTypes() + test_util.SetAllFields(message) + self.assertEquals(message, parsed_message) + + def testMergeLinesGolden(self): + opened = self.ReadGolden('text_format_unittest_data.txt') + parsed_message = unittest_pb2.TestAllTypes() + r = text_format.MergeLines(opened, parsed_message) + self.assertIs(r, parsed_message) + + message = unittest_pb2.TestAllTypes() + test_util.SetAllFields(message) + self.assertEqual(message, parsed_message) + + +class TokenizerTest(basetest.TestCase): + + def testSimpleTokenCases(self): + text = ('identifier1:"string1"\n \n\n' + 'identifier2 : \n \n123 \n identifier3 :\'string\'\n' + 'identifiER_4 : 1.1e+2 ID5:-0.23 ID6:\'aaaa\\\'bbbb\'\n' + 'ID7 : "aa\\"bb"\n\n\n\n ID8: {A:inf B:-inf C:true D:false}\n' + 'ID9: 22 ID10: -111111111111111111 ID11: -22\n' + 'ID12: 2222222222222222222 ID13: 1.23456f ID14: 1.2e+2f ' + 'false_bool: 0 true_BOOL:t \n true_bool1: 1 false_BOOL1:f ') + tokenizer = text_format._Tokenizer(text.splitlines()) + methods = [(tokenizer.ConsumeIdentifier, 'identifier1'), + ':', + (tokenizer.ConsumeString, 'string1'), + (tokenizer.ConsumeIdentifier, 'identifier2'), + ':', + (tokenizer.ConsumeInt32, 123), + (tokenizer.ConsumeIdentifier, 'identifier3'), + ':', + (tokenizer.ConsumeString, 'string'), + (tokenizer.ConsumeIdentifier, 'identifiER_4'), + ':', + (tokenizer.ConsumeFloat, 1.1e+2), + (tokenizer.ConsumeIdentifier, 'ID5'), + ':', + (tokenizer.ConsumeFloat, -0.23), + (tokenizer.ConsumeIdentifier, 'ID6'), + ':', + (tokenizer.ConsumeString, 'aaaa\'bbbb'), + (tokenizer.ConsumeIdentifier, 'ID7'), + ':', + (tokenizer.ConsumeString, 'aa\"bb'), + (tokenizer.ConsumeIdentifier, 'ID8'), + ':', + '{', + (tokenizer.ConsumeIdentifier, 'A'), + ':', + (tokenizer.ConsumeFloat, float('inf')), + (tokenizer.ConsumeIdentifier, 'B'), + ':', + (tokenizer.ConsumeFloat, -float('inf')), + (tokenizer.ConsumeIdentifier, 'C'), + ':', + (tokenizer.ConsumeBool, True), + (tokenizer.ConsumeIdentifier, 'D'), + ':', + (tokenizer.ConsumeBool, False), + '}', + (tokenizer.ConsumeIdentifier, 'ID9'), + ':', + (tokenizer.ConsumeUint32, 22), + (tokenizer.ConsumeIdentifier, 'ID10'), + ':', + (tokenizer.ConsumeInt64, -111111111111111111), + (tokenizer.ConsumeIdentifier, 'ID11'), + ':', + (tokenizer.ConsumeInt32, -22), + (tokenizer.ConsumeIdentifier, 'ID12'), + ':', + (tokenizer.ConsumeUint64, 2222222222222222222), + (tokenizer.ConsumeIdentifier, 'ID13'), + ':', + (tokenizer.ConsumeFloat, 1.23456), + (tokenizer.ConsumeIdentifier, 'ID14'), + ':', + (tokenizer.ConsumeFloat, 1.2e+2), + (tokenizer.ConsumeIdentifier, 'false_bool'), + ':', + (tokenizer.ConsumeBool, False), + (tokenizer.ConsumeIdentifier, 'true_BOOL'), + ':', + (tokenizer.ConsumeBool, True), + (tokenizer.ConsumeIdentifier, 'true_bool1'), + ':', + (tokenizer.ConsumeBool, True), + (tokenizer.ConsumeIdentifier, 'false_BOOL1'), + ':', + (tokenizer.ConsumeBool, False)] + + i = 0 + while not tokenizer.AtEnd(): + m = methods[i] + if type(m) == str: + token = tokenizer.token + self.assertEqual(token, m) + tokenizer.NextToken() + else: + self.assertEqual(m[1], m[0]()) + i += 1 + + def testConsumeIntegers(self): + # This test only tests the failures in the integer parsing methods as well + # as the '0' special cases. + int64_max = (1 << 63) - 1 + uint32_max = (1 << 32) - 1 + text = '-1 %d %d' % (uint32_max + 1, int64_max + 1) + tokenizer = text_format._Tokenizer(text.splitlines()) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint64) + self.assertEqual(-1, tokenizer.ConsumeInt32()) + + self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt32) + self.assertEqual(uint32_max + 1, tokenizer.ConsumeInt64()) + + self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt64) + self.assertEqual(int64_max + 1, tokenizer.ConsumeUint64()) + self.assertTrue(tokenizer.AtEnd()) + + text = '-0 -0 0 0' + tokenizer = text_format._Tokenizer(text.splitlines()) + self.assertEqual(0, tokenizer.ConsumeUint32()) + self.assertEqual(0, tokenizer.ConsumeUint64()) + self.assertEqual(0, tokenizer.ConsumeUint32()) + self.assertEqual(0, tokenizer.ConsumeUint64()) + self.assertTrue(tokenizer.AtEnd()) + + def testConsumeByteString(self): + text = '"string1\'' + tokenizer = text_format._Tokenizer(text.splitlines()) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) + + text = 'string1"' + tokenizer = text_format._Tokenizer(text.splitlines()) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) + + text = '\n"\\xt"' + tokenizer = text_format._Tokenizer(text.splitlines()) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) + + text = '\n"\\"' + tokenizer = text_format._Tokenizer(text.splitlines()) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) + + text = '\n"\\x"' + tokenizer = text_format._Tokenizer(text.splitlines()) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) + + def testConsumeBool(self): + text = 'not-a-bool' + tokenizer = text_format._Tokenizer(text.splitlines()) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeBool) + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/internal/type_checkers.py b/pythonlib/google/protobuf/internal/type_checkers.py new file mode 100644 index 0000000..8e1b3cc --- /dev/null +++ b/pythonlib/google/protobuf/internal/type_checkers.py @@ -0,0 +1,328 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +#PY25 compatible for GAE. +# +# Copyright 2008 Google Inc. All Rights Reserved. + +"""Provides type checking routines. + +This module defines type checking utilities in the forms of dictionaries: + +VALUE_CHECKERS: A dictionary of field types and a value validation object. +TYPE_TO_BYTE_SIZE_FN: A dictionary with field types and a size computing + function. +TYPE_TO_SERIALIZE_METHOD: A dictionary with field types and serialization + function. +FIELD_TYPE_TO_WIRE_TYPE: A dictionary with field typed and their + coresponding wire types. +TYPE_TO_DESERIALIZE_METHOD: A dictionary with field types and deserialization + function. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import sys ##PY25 +if sys.version < '2.6': bytes = str ##PY25 +from google.protobuf.internal import api_implementation +from google.protobuf.internal import decoder +from google.protobuf.internal import encoder +from google.protobuf.internal import wire_format +from google.protobuf import descriptor + +_FieldDescriptor = descriptor.FieldDescriptor + + +def GetTypeChecker(field): + """Returns a type checker for a message field of the specified types. + + Args: + field: FieldDescriptor object for this field. + + Returns: + An instance of TypeChecker which can be used to verify the types + of values assigned to a field of the specified type. + """ + if (field.cpp_type == _FieldDescriptor.CPPTYPE_STRING and + field.type == _FieldDescriptor.TYPE_STRING): + return UnicodeValueChecker() + if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: + return EnumValueChecker(field.enum_type) + return _VALUE_CHECKERS[field.cpp_type] + + +# None of the typecheckers below make any attempt to guard against people +# subclassing builtin types and doing weird things. We're not trying to +# protect against malicious clients here, just people accidentally shooting +# themselves in the foot in obvious ways. + +class TypeChecker(object): + + """Type checker used to catch type errors as early as possible + when the client is setting scalar fields in protocol messages. + """ + + def __init__(self, *acceptable_types): + self._acceptable_types = acceptable_types + + def CheckValue(self, proposed_value): + """Type check the provided value and return it. + + The returned value might have been normalized to another type. + """ + if not isinstance(proposed_value, self._acceptable_types): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), self._acceptable_types)) + raise TypeError(message) + return proposed_value + + +# IntValueChecker and its subclasses perform integer type-checks +# and bounds-checks. +class IntValueChecker(object): + + """Checker used for integer fields. Performs type-check and range check.""" + + def CheckValue(self, proposed_value): + if not isinstance(proposed_value, (int, long)): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), (int, long))) + raise TypeError(message) + if not self._MIN <= proposed_value <= self._MAX: + raise ValueError('Value out of range: %d' % proposed_value) + # We force 32-bit values to int and 64-bit values to long to make + # alternate implementations where the distinction is more significant + # (e.g. the C++ implementation) simpler. + proposed_value = self._TYPE(proposed_value) + return proposed_value + + +class EnumValueChecker(object): + + """Checker used for enum fields. Performs type-check and range check.""" + + def __init__(self, enum_type): + self._enum_type = enum_type + + def CheckValue(self, proposed_value): + if not isinstance(proposed_value, (int, long)): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), (int, long))) + raise TypeError(message) + if proposed_value not in self._enum_type.values_by_number: + raise ValueError('Unknown enum value: %d' % proposed_value) + return proposed_value + + +class UnicodeValueChecker(object): + + """Checker used for string fields. + + Always returns a unicode value, even if the input is of type str. + """ + + def CheckValue(self, proposed_value): + if not isinstance(proposed_value, (bytes, unicode)): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), (bytes, unicode))) + raise TypeError(message) + + # If the value is of type 'bytes' make sure that it is in 7-bit ASCII + # encoding. + if isinstance(proposed_value, bytes): + try: + proposed_value = proposed_value.decode('ascii') + except UnicodeDecodeError: + raise ValueError('%.1024r has type bytes, but isn\'t in 7-bit ASCII ' + 'encoding. Non-ASCII strings must be converted to ' + 'unicode objects before being added.' % + (proposed_value)) + return proposed_value + + +class Int32ValueChecker(IntValueChecker): + # We're sure to use ints instead of longs here since comparison may be more + # efficient. + _MIN = -2147483648 + _MAX = 2147483647 + _TYPE = int + + +class Uint32ValueChecker(IntValueChecker): + _MIN = 0 + _MAX = (1 << 32) - 1 + _TYPE = int + + +class Int64ValueChecker(IntValueChecker): + _MIN = -(1 << 63) + _MAX = (1 << 63) - 1 + _TYPE = long + + +class Uint64ValueChecker(IntValueChecker): + _MIN = 0 + _MAX = (1 << 64) - 1 + _TYPE = long + + +# Type-checkers for all scalar CPPTYPEs. +_VALUE_CHECKERS = { + _FieldDescriptor.CPPTYPE_INT32: Int32ValueChecker(), + _FieldDescriptor.CPPTYPE_INT64: Int64ValueChecker(), + _FieldDescriptor.CPPTYPE_UINT32: Uint32ValueChecker(), + _FieldDescriptor.CPPTYPE_UINT64: Uint64ValueChecker(), + _FieldDescriptor.CPPTYPE_DOUBLE: TypeChecker( + float, int, long), + _FieldDescriptor.CPPTYPE_FLOAT: TypeChecker( + float, int, long), + _FieldDescriptor.CPPTYPE_BOOL: TypeChecker(bool, int), + _FieldDescriptor.CPPTYPE_STRING: TypeChecker(bytes), + } + + +# Map from field type to a function F, such that F(field_num, value) +# gives the total byte size for a value of the given type. This +# byte size includes tag information and any other additional space +# associated with serializing "value". +TYPE_TO_BYTE_SIZE_FN = { + _FieldDescriptor.TYPE_DOUBLE: wire_format.DoubleByteSize, + _FieldDescriptor.TYPE_FLOAT: wire_format.FloatByteSize, + _FieldDescriptor.TYPE_INT64: wire_format.Int64ByteSize, + _FieldDescriptor.TYPE_UINT64: wire_format.UInt64ByteSize, + _FieldDescriptor.TYPE_INT32: wire_format.Int32ByteSize, + _FieldDescriptor.TYPE_FIXED64: wire_format.Fixed64ByteSize, + _FieldDescriptor.TYPE_FIXED32: wire_format.Fixed32ByteSize, + _FieldDescriptor.TYPE_BOOL: wire_format.BoolByteSize, + _FieldDescriptor.TYPE_STRING: wire_format.StringByteSize, + _FieldDescriptor.TYPE_GROUP: wire_format.GroupByteSize, + _FieldDescriptor.TYPE_MESSAGE: wire_format.MessageByteSize, + _FieldDescriptor.TYPE_BYTES: wire_format.BytesByteSize, + _FieldDescriptor.TYPE_UINT32: wire_format.UInt32ByteSize, + _FieldDescriptor.TYPE_ENUM: wire_format.EnumByteSize, + _FieldDescriptor.TYPE_SFIXED32: wire_format.SFixed32ByteSize, + _FieldDescriptor.TYPE_SFIXED64: wire_format.SFixed64ByteSize, + _FieldDescriptor.TYPE_SINT32: wire_format.SInt32ByteSize, + _FieldDescriptor.TYPE_SINT64: wire_format.SInt64ByteSize + } + + +# Maps from field types to encoder constructors. +TYPE_TO_ENCODER = { + _FieldDescriptor.TYPE_DOUBLE: encoder.DoubleEncoder, + _FieldDescriptor.TYPE_FLOAT: encoder.FloatEncoder, + _FieldDescriptor.TYPE_INT64: encoder.Int64Encoder, + _FieldDescriptor.TYPE_UINT64: encoder.UInt64Encoder, + _FieldDescriptor.TYPE_INT32: encoder.Int32Encoder, + _FieldDescriptor.TYPE_FIXED64: encoder.Fixed64Encoder, + _FieldDescriptor.TYPE_FIXED32: encoder.Fixed32Encoder, + _FieldDescriptor.TYPE_BOOL: encoder.BoolEncoder, + _FieldDescriptor.TYPE_STRING: encoder.StringEncoder, + _FieldDescriptor.TYPE_GROUP: encoder.GroupEncoder, + _FieldDescriptor.TYPE_MESSAGE: encoder.MessageEncoder, + _FieldDescriptor.TYPE_BYTES: encoder.BytesEncoder, + _FieldDescriptor.TYPE_UINT32: encoder.UInt32Encoder, + _FieldDescriptor.TYPE_ENUM: encoder.EnumEncoder, + _FieldDescriptor.TYPE_SFIXED32: encoder.SFixed32Encoder, + _FieldDescriptor.TYPE_SFIXED64: encoder.SFixed64Encoder, + _FieldDescriptor.TYPE_SINT32: encoder.SInt32Encoder, + _FieldDescriptor.TYPE_SINT64: encoder.SInt64Encoder, + } + + +# Maps from field types to sizer constructors. +TYPE_TO_SIZER = { + _FieldDescriptor.TYPE_DOUBLE: encoder.DoubleSizer, + _FieldDescriptor.TYPE_FLOAT: encoder.FloatSizer, + _FieldDescriptor.TYPE_INT64: encoder.Int64Sizer, + _FieldDescriptor.TYPE_UINT64: encoder.UInt64Sizer, + _FieldDescriptor.TYPE_INT32: encoder.Int32Sizer, + _FieldDescriptor.TYPE_FIXED64: encoder.Fixed64Sizer, + _FieldDescriptor.TYPE_FIXED32: encoder.Fixed32Sizer, + _FieldDescriptor.TYPE_BOOL: encoder.BoolSizer, + _FieldDescriptor.TYPE_STRING: encoder.StringSizer, + _FieldDescriptor.TYPE_GROUP: encoder.GroupSizer, + _FieldDescriptor.TYPE_MESSAGE: encoder.MessageSizer, + _FieldDescriptor.TYPE_BYTES: encoder.BytesSizer, + _FieldDescriptor.TYPE_UINT32: encoder.UInt32Sizer, + _FieldDescriptor.TYPE_ENUM: encoder.EnumSizer, + _FieldDescriptor.TYPE_SFIXED32: encoder.SFixed32Sizer, + _FieldDescriptor.TYPE_SFIXED64: encoder.SFixed64Sizer, + _FieldDescriptor.TYPE_SINT32: encoder.SInt32Sizer, + _FieldDescriptor.TYPE_SINT64: encoder.SInt64Sizer, + } + + +# Maps from field type to a decoder constructor. +TYPE_TO_DECODER = { + _FieldDescriptor.TYPE_DOUBLE: decoder.DoubleDecoder, + _FieldDescriptor.TYPE_FLOAT: decoder.FloatDecoder, + _FieldDescriptor.TYPE_INT64: decoder.Int64Decoder, + _FieldDescriptor.TYPE_UINT64: decoder.UInt64Decoder, + _FieldDescriptor.TYPE_INT32: decoder.Int32Decoder, + _FieldDescriptor.TYPE_FIXED64: decoder.Fixed64Decoder, + _FieldDescriptor.TYPE_FIXED32: decoder.Fixed32Decoder, + _FieldDescriptor.TYPE_BOOL: decoder.BoolDecoder, + _FieldDescriptor.TYPE_STRING: decoder.StringDecoder, + _FieldDescriptor.TYPE_GROUP: decoder.GroupDecoder, + _FieldDescriptor.TYPE_MESSAGE: decoder.MessageDecoder, + _FieldDescriptor.TYPE_BYTES: decoder.BytesDecoder, + _FieldDescriptor.TYPE_UINT32: decoder.UInt32Decoder, + _FieldDescriptor.TYPE_ENUM: decoder.EnumDecoder, + _FieldDescriptor.TYPE_SFIXED32: decoder.SFixed32Decoder, + _FieldDescriptor.TYPE_SFIXED64: decoder.SFixed64Decoder, + _FieldDescriptor.TYPE_SINT32: decoder.SInt32Decoder, + _FieldDescriptor.TYPE_SINT64: decoder.SInt64Decoder, + } + +# Maps from field type to expected wiretype. +FIELD_TYPE_TO_WIRE_TYPE = { + _FieldDescriptor.TYPE_DOUBLE: wire_format.WIRETYPE_FIXED64, + _FieldDescriptor.TYPE_FLOAT: wire_format.WIRETYPE_FIXED32, + _FieldDescriptor.TYPE_INT64: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_UINT64: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_INT32: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_FIXED64: wire_format.WIRETYPE_FIXED64, + _FieldDescriptor.TYPE_FIXED32: wire_format.WIRETYPE_FIXED32, + _FieldDescriptor.TYPE_BOOL: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_STRING: + wire_format.WIRETYPE_LENGTH_DELIMITED, + _FieldDescriptor.TYPE_GROUP: wire_format.WIRETYPE_START_GROUP, + _FieldDescriptor.TYPE_MESSAGE: + wire_format.WIRETYPE_LENGTH_DELIMITED, + _FieldDescriptor.TYPE_BYTES: + wire_format.WIRETYPE_LENGTH_DELIMITED, + _FieldDescriptor.TYPE_UINT32: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_ENUM: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_SFIXED32: wire_format.WIRETYPE_FIXED32, + _FieldDescriptor.TYPE_SFIXED64: wire_format.WIRETYPE_FIXED64, + _FieldDescriptor.TYPE_SINT32: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_SINT64: wire_format.WIRETYPE_VARINT, + } diff --git a/pythonlib/google/protobuf/internal/unknown_fields_test.py b/pythonlib/google/protobuf/internal/unknown_fields_test.py new file mode 100644 index 0000000..8f3354c --- /dev/null +++ b/pythonlib/google/protobuf/internal/unknown_fields_test.py @@ -0,0 +1,231 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Test for preservation of unknown fields in the pure Python implementation.""" + +__author__ = 'bohdank@google.com (Bohdan Koval)' + +from google.apputils import basetest +from google.protobuf import unittest_mset_pb2 +from google.protobuf import unittest_pb2 +from google.protobuf.internal import encoder +from google.protobuf.internal import missing_enum_values_pb2 +from google.protobuf.internal import test_util +from google.protobuf.internal import type_checkers + + +class UnknownFieldsTest(basetest.TestCase): + + def setUp(self): + self.descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR + self.all_fields = unittest_pb2.TestAllTypes() + test_util.SetAllFields(self.all_fields) + self.all_fields_data = self.all_fields.SerializeToString() + self.empty_message = unittest_pb2.TestEmptyMessage() + self.empty_message.ParseFromString(self.all_fields_data) + self.unknown_fields = self.empty_message._unknown_fields + + def GetField(self, name): + field_descriptor = self.descriptor.fields_by_name[name] + wire_type = type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type] + field_tag = encoder.TagBytes(field_descriptor.number, wire_type) + result_dict = {} + for tag_bytes, value in self.unknown_fields: + if tag_bytes == field_tag: + decoder = unittest_pb2.TestAllTypes._decoders_by_tag[tag_bytes] + decoder(value, 0, len(value), self.all_fields, result_dict) + return result_dict[field_descriptor] + + def testEnum(self): + value = self.GetField('optional_nested_enum') + self.assertEqual(self.all_fields.optional_nested_enum, value) + + def testRepeatedEnum(self): + value = self.GetField('repeated_nested_enum') + self.assertEqual(self.all_fields.repeated_nested_enum, value) + + def testVarint(self): + value = self.GetField('optional_int32') + self.assertEqual(self.all_fields.optional_int32, value) + + def testFixed32(self): + value = self.GetField('optional_fixed32') + self.assertEqual(self.all_fields.optional_fixed32, value) + + def testFixed64(self): + value = self.GetField('optional_fixed64') + self.assertEqual(self.all_fields.optional_fixed64, value) + + def testLengthDelimited(self): + value = self.GetField('optional_string') + self.assertEqual(self.all_fields.optional_string, value) + + def testGroup(self): + value = self.GetField('optionalgroup') + self.assertEqual(self.all_fields.optionalgroup, value) + + def testSerialize(self): + data = self.empty_message.SerializeToString() + + # Don't use assertEqual because we don't want to dump raw binary data to + # stdout. + self.assertTrue(data == self.all_fields_data) + + def testCopyFrom(self): + message = unittest_pb2.TestEmptyMessage() + message.CopyFrom(self.empty_message) + self.assertEqual(self.unknown_fields, message._unknown_fields) + + def testMergeFrom(self): + message = unittest_pb2.TestAllTypes() + message.optional_int32 = 1 + message.optional_uint32 = 2 + source = unittest_pb2.TestEmptyMessage() + source.ParseFromString(message.SerializeToString()) + + message.ClearField('optional_int32') + message.optional_int64 = 3 + message.optional_uint32 = 4 + destination = unittest_pb2.TestEmptyMessage() + destination.ParseFromString(message.SerializeToString()) + unknown_fields = destination._unknown_fields[:] + + destination.MergeFrom(source) + self.assertEqual(unknown_fields + source._unknown_fields, + destination._unknown_fields) + + def testClear(self): + self.empty_message.Clear() + self.assertEqual(0, len(self.empty_message._unknown_fields)) + + def testByteSize(self): + self.assertEqual(self.all_fields.ByteSize(), self.empty_message.ByteSize()) + + def testUnknownExtensions(self): + message = unittest_pb2.TestEmptyMessageWithExtensions() + message.ParseFromString(self.all_fields_data) + self.assertEqual(self.empty_message._unknown_fields, + message._unknown_fields) + + def testListFields(self): + # Make sure ListFields doesn't return unknown fields. + self.assertEqual(0, len(self.empty_message.ListFields())) + + def testSerializeMessageSetWireFormatUnknownExtension(self): + # Create a message using the message set wire format with an unknown + # message. + raw = unittest_mset_pb2.RawMessageSet() + + # Add an unknown extension. + item = raw.item.add() + item.type_id = 1545009 + message1 = unittest_mset_pb2.TestMessageSetExtension1() + message1.i = 12345 + item.message = message1.SerializeToString() + + serialized = raw.SerializeToString() + + # Parse message using the message set wire format. + proto = unittest_mset_pb2.TestMessageSet() + proto.MergeFromString(serialized) + + # Verify that the unknown extension is serialized unchanged + reserialized = proto.SerializeToString() + new_raw = unittest_mset_pb2.RawMessageSet() + new_raw.MergeFromString(reserialized) + self.assertEqual(raw, new_raw) + + def testEquals(self): + message = unittest_pb2.TestEmptyMessage() + message.ParseFromString(self.all_fields_data) + self.assertEqual(self.empty_message, message) + + self.all_fields.ClearField('optional_string') + message.ParseFromString(self.all_fields.SerializeToString()) + self.assertNotEqual(self.empty_message, message) + + +class UnknownFieldsTest(basetest.TestCase): + + def setUp(self): + self.descriptor = missing_enum_values_pb2.TestEnumValues.DESCRIPTOR + + self.message = missing_enum_values_pb2.TestEnumValues() + self.message.optional_nested_enum = ( + missing_enum_values_pb2.TestEnumValues.ZERO) + self.message.repeated_nested_enum.extend([ + missing_enum_values_pb2.TestEnumValues.ZERO, + missing_enum_values_pb2.TestEnumValues.ONE, + ]) + self.message.packed_nested_enum.extend([ + missing_enum_values_pb2.TestEnumValues.ZERO, + missing_enum_values_pb2.TestEnumValues.ONE, + ]) + self.message_data = self.message.SerializeToString() + self.missing_message = missing_enum_values_pb2.TestMissingEnumValues() + self.missing_message.ParseFromString(self.message_data) + self.unknown_fields = self.missing_message._unknown_fields + + def GetField(self, name): + field_descriptor = self.descriptor.fields_by_name[name] + wire_type = type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type] + field_tag = encoder.TagBytes(field_descriptor.number, wire_type) + result_dict = {} + for tag_bytes, value in self.unknown_fields: + if tag_bytes == field_tag: + decoder = missing_enum_values_pb2.TestEnumValues._decoders_by_tag[ + tag_bytes] + decoder(value, 0, len(value), self.message, result_dict) + return result_dict[field_descriptor] + + def testUnknownEnumValue(self): + self.assertFalse(self.missing_message.HasField('optional_nested_enum')) + value = self.GetField('optional_nested_enum') + self.assertEqual(self.message.optional_nested_enum, value) + + def testUnknownRepeatedEnumValue(self): + value = self.GetField('repeated_nested_enum') + self.assertEqual(self.message.repeated_nested_enum, value) + + def testUnknownPackedEnumValue(self): + value = self.GetField('packed_nested_enum') + self.assertEqual(self.message.packed_nested_enum, value) + + def testRoundTrip(self): + new_message = missing_enum_values_pb2.TestEnumValues() + new_message.ParseFromString(self.missing_message.SerializeToString()) + self.assertEqual(self.message, new_message) + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/internal/wire_format.py b/pythonlib/google/protobuf/internal/wire_format.py new file mode 100644 index 0000000..c941fe1 --- /dev/null +++ b/pythonlib/google/protobuf/internal/wire_format.py @@ -0,0 +1,268 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Constants and static functions to support protocol buffer wire format.""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import struct +from google.protobuf import descriptor +from google.protobuf import message + + +TAG_TYPE_BITS = 3 # Number of bits used to hold type info in a proto tag. +TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1 # 0x7 + +# These numbers identify the wire type of a protocol buffer value. +# We use the least-significant TAG_TYPE_BITS bits of the varint-encoded +# tag-and-type to store one of these WIRETYPE_* constants. +# These values must match WireType enum in google/protobuf/wire_format.h. +WIRETYPE_VARINT = 0 +WIRETYPE_FIXED64 = 1 +WIRETYPE_LENGTH_DELIMITED = 2 +WIRETYPE_START_GROUP = 3 +WIRETYPE_END_GROUP = 4 +WIRETYPE_FIXED32 = 5 +_WIRETYPE_MAX = 5 + + +# Bounds for various integer types. +INT32_MAX = int((1 << 31) - 1) +INT32_MIN = int(-(1 << 31)) +UINT32_MAX = (1 << 32) - 1 + +INT64_MAX = (1 << 63) - 1 +INT64_MIN = -(1 << 63) +UINT64_MAX = (1 << 64) - 1 + +# "struct" format strings that will encode/decode the specified formats. +FORMAT_UINT32_LITTLE_ENDIAN = '> TAG_TYPE_BITS), (tag & TAG_TYPE_MASK) + + +def ZigZagEncode(value): + """ZigZag Transform: Encodes signed integers so that they can be + effectively used with varint encoding. See wire_format.h for + more details. + """ + if value >= 0: + return value << 1 + return (value << 1) ^ (~0) + + +def ZigZagDecode(value): + """Inverse of ZigZagEncode().""" + if not value & 0x1: + return value >> 1 + return (value >> 1) ^ (~0) + + + +# The *ByteSize() functions below return the number of bytes required to +# serialize "field number + type" information and then serialize the value. + + +def Int32ByteSize(field_number, int32): + return Int64ByteSize(field_number, int32) + + +def Int32ByteSizeNoTag(int32): + return _VarUInt64ByteSizeNoTag(0xffffffffffffffff & int32) + + +def Int64ByteSize(field_number, int64): + # Have to convert to uint before calling UInt64ByteSize(). + return UInt64ByteSize(field_number, 0xffffffffffffffff & int64) + + +def UInt32ByteSize(field_number, uint32): + return UInt64ByteSize(field_number, uint32) + + +def UInt64ByteSize(field_number, uint64): + return TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(uint64) + + +def SInt32ByteSize(field_number, int32): + return UInt32ByteSize(field_number, ZigZagEncode(int32)) + + +def SInt64ByteSize(field_number, int64): + return UInt64ByteSize(field_number, ZigZagEncode(int64)) + + +def Fixed32ByteSize(field_number, fixed32): + return TagByteSize(field_number) + 4 + + +def Fixed64ByteSize(field_number, fixed64): + return TagByteSize(field_number) + 8 + + +def SFixed32ByteSize(field_number, sfixed32): + return TagByteSize(field_number) + 4 + + +def SFixed64ByteSize(field_number, sfixed64): + return TagByteSize(field_number) + 8 + + +def FloatByteSize(field_number, flt): + return TagByteSize(field_number) + 4 + + +def DoubleByteSize(field_number, double): + return TagByteSize(field_number) + 8 + + +def BoolByteSize(field_number, b): + return TagByteSize(field_number) + 1 + + +def EnumByteSize(field_number, enum): + return UInt32ByteSize(field_number, enum) + + +def StringByteSize(field_number, string): + return BytesByteSize(field_number, string.encode('utf-8')) + + +def BytesByteSize(field_number, b): + return (TagByteSize(field_number) + + _VarUInt64ByteSizeNoTag(len(b)) + + len(b)) + + +def GroupByteSize(field_number, message): + return (2 * TagByteSize(field_number) # START and END group. + + message.ByteSize()) + + +def MessageByteSize(field_number, message): + return (TagByteSize(field_number) + + _VarUInt64ByteSizeNoTag(message.ByteSize()) + + message.ByteSize()) + + +def MessageSetItemByteSize(field_number, msg): + # First compute the sizes of the tags. + # There are 2 tags for the beginning and ending of the repeated group, that + # is field number 1, one with field number 2 (type_id) and one with field + # number 3 (message). + total_size = (2 * TagByteSize(1) + TagByteSize(2) + TagByteSize(3)) + + # Add the number of bytes for type_id. + total_size += _VarUInt64ByteSizeNoTag(field_number) + + message_size = msg.ByteSize() + + # The number of bytes for encoding the length of the message. + total_size += _VarUInt64ByteSizeNoTag(message_size) + + # The size of the message. + total_size += message_size + return total_size + + +def TagByteSize(field_number): + """Returns the bytes required to serialize a tag with this field number.""" + # Just pass in type 0, since the type won't affect the tag+type size. + return _VarUInt64ByteSizeNoTag(PackTag(field_number, 0)) + + +# Private helper function for the *ByteSize() functions above. + +def _VarUInt64ByteSizeNoTag(uint64): + """Returns the number of bytes required to serialize a single varint + using boundary value comparisons. (unrolled loop optimization -WPierce) + uint64 must be unsigned. + """ + if uint64 <= 0x7f: return 1 + if uint64 <= 0x3fff: return 2 + if uint64 <= 0x1fffff: return 3 + if uint64 <= 0xfffffff: return 4 + if uint64 <= 0x7ffffffff: return 5 + if uint64 <= 0x3ffffffffff: return 6 + if uint64 <= 0x1ffffffffffff: return 7 + if uint64 <= 0xffffffffffffff: return 8 + if uint64 <= 0x7fffffffffffffff: return 9 + if uint64 > UINT64_MAX: + raise message.EncodeError('Value out of range: %d' % uint64) + return 10 + + +NON_PACKABLE_TYPES = ( + descriptor.FieldDescriptor.TYPE_STRING, + descriptor.FieldDescriptor.TYPE_GROUP, + descriptor.FieldDescriptor.TYPE_MESSAGE, + descriptor.FieldDescriptor.TYPE_BYTES +) + + +def IsTypePackable(field_type): + """Return true iff packable = true is valid for fields of this type. + + Args: + field_type: a FieldDescriptor::Type value. + + Returns: + True iff fields of this type are packable. + """ + return field_type not in NON_PACKABLE_TYPES diff --git a/pythonlib/google/protobuf/internal/wire_format_test.py b/pythonlib/google/protobuf/internal/wire_format_test.py new file mode 100644 index 0000000..9362c72 --- /dev/null +++ b/pythonlib/google/protobuf/internal/wire_format_test.py @@ -0,0 +1,253 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Test for google.protobuf.internal.wire_format.""" + +__author__ = 'robinson@google.com (Will Robinson)' + +from google.apputils import basetest +from google.protobuf import message +from google.protobuf.internal import wire_format + + +class WireFormatTest(basetest.TestCase): + + def testPackTag(self): + field_number = 0xabc + tag_type = 2 + self.assertEqual((field_number << 3) | tag_type, + wire_format.PackTag(field_number, tag_type)) + PackTag = wire_format.PackTag + # Number too high. + self.assertRaises(message.EncodeError, PackTag, field_number, 6) + # Number too low. + self.assertRaises(message.EncodeError, PackTag, field_number, -1) + + def testUnpackTag(self): + # Test field numbers that will require various varint sizes. + for expected_field_number in (1, 15, 16, 2047, 2048): + for expected_wire_type in range(6): # Highest-numbered wiretype is 5. + field_number, wire_type = wire_format.UnpackTag( + wire_format.PackTag(expected_field_number, expected_wire_type)) + self.assertEqual(expected_field_number, field_number) + self.assertEqual(expected_wire_type, wire_type) + + self.assertRaises(TypeError, wire_format.UnpackTag, None) + self.assertRaises(TypeError, wire_format.UnpackTag, 'abc') + self.assertRaises(TypeError, wire_format.UnpackTag, 0.0) + self.assertRaises(TypeError, wire_format.UnpackTag, object()) + + def testZigZagEncode(self): + Z = wire_format.ZigZagEncode + self.assertEqual(0, Z(0)) + self.assertEqual(1, Z(-1)) + self.assertEqual(2, Z(1)) + self.assertEqual(3, Z(-2)) + self.assertEqual(4, Z(2)) + self.assertEqual(0xfffffffe, Z(0x7fffffff)) + self.assertEqual(0xffffffff, Z(-0x80000000)) + self.assertEqual(0xfffffffffffffffe, Z(0x7fffffffffffffff)) + self.assertEqual(0xffffffffffffffff, Z(-0x8000000000000000)) + + self.assertRaises(TypeError, Z, None) + self.assertRaises(TypeError, Z, 'abcd') + self.assertRaises(TypeError, Z, 0.0) + self.assertRaises(TypeError, Z, object()) + + def testZigZagDecode(self): + Z = wire_format.ZigZagDecode + self.assertEqual(0, Z(0)) + self.assertEqual(-1, Z(1)) + self.assertEqual(1, Z(2)) + self.assertEqual(-2, Z(3)) + self.assertEqual(2, Z(4)) + self.assertEqual(0x7fffffff, Z(0xfffffffe)) + self.assertEqual(-0x80000000, Z(0xffffffff)) + self.assertEqual(0x7fffffffffffffff, Z(0xfffffffffffffffe)) + self.assertEqual(-0x8000000000000000, Z(0xffffffffffffffff)) + + self.assertRaises(TypeError, Z, None) + self.assertRaises(TypeError, Z, 'abcd') + self.assertRaises(TypeError, Z, 0.0) + self.assertRaises(TypeError, Z, object()) + + def NumericByteSizeTestHelper(self, byte_size_fn, value, expected_value_size): + # Use field numbers that cause various byte sizes for the tag information. + for field_number, tag_bytes in ((15, 1), (16, 2), (2047, 2), (2048, 3)): + expected_size = expected_value_size + tag_bytes + actual_size = byte_size_fn(field_number, value) + self.assertEqual(expected_size, actual_size, + 'byte_size_fn: %s, field_number: %d, value: %r\n' + 'Expected: %d, Actual: %d'% ( + byte_size_fn, field_number, value, expected_size, actual_size)) + + def testByteSizeFunctions(self): + # Test all numeric *ByteSize() functions. + NUMERIC_ARGS = [ + # Int32ByteSize(). + [wire_format.Int32ByteSize, 0, 1], + [wire_format.Int32ByteSize, 127, 1], + [wire_format.Int32ByteSize, 128, 2], + [wire_format.Int32ByteSize, -1, 10], + # Int64ByteSize(). + [wire_format.Int64ByteSize, 0, 1], + [wire_format.Int64ByteSize, 127, 1], + [wire_format.Int64ByteSize, 128, 2], + [wire_format.Int64ByteSize, -1, 10], + # UInt32ByteSize(). + [wire_format.UInt32ByteSize, 0, 1], + [wire_format.UInt32ByteSize, 127, 1], + [wire_format.UInt32ByteSize, 128, 2], + [wire_format.UInt32ByteSize, wire_format.UINT32_MAX, 5], + # UInt64ByteSize(). + [wire_format.UInt64ByteSize, 0, 1], + [wire_format.UInt64ByteSize, 127, 1], + [wire_format.UInt64ByteSize, 128, 2], + [wire_format.UInt64ByteSize, wire_format.UINT64_MAX, 10], + # SInt32ByteSize(). + [wire_format.SInt32ByteSize, 0, 1], + [wire_format.SInt32ByteSize, -1, 1], + [wire_format.SInt32ByteSize, 1, 1], + [wire_format.SInt32ByteSize, -63, 1], + [wire_format.SInt32ByteSize, 63, 1], + [wire_format.SInt32ByteSize, -64, 1], + [wire_format.SInt32ByteSize, 64, 2], + # SInt64ByteSize(). + [wire_format.SInt64ByteSize, 0, 1], + [wire_format.SInt64ByteSize, -1, 1], + [wire_format.SInt64ByteSize, 1, 1], + [wire_format.SInt64ByteSize, -63, 1], + [wire_format.SInt64ByteSize, 63, 1], + [wire_format.SInt64ByteSize, -64, 1], + [wire_format.SInt64ByteSize, 64, 2], + # Fixed32ByteSize(). + [wire_format.Fixed32ByteSize, 0, 4], + [wire_format.Fixed32ByteSize, wire_format.UINT32_MAX, 4], + # Fixed64ByteSize(). + [wire_format.Fixed64ByteSize, 0, 8], + [wire_format.Fixed64ByteSize, wire_format.UINT64_MAX, 8], + # SFixed32ByteSize(). + [wire_format.SFixed32ByteSize, 0, 4], + [wire_format.SFixed32ByteSize, wire_format.INT32_MIN, 4], + [wire_format.SFixed32ByteSize, wire_format.INT32_MAX, 4], + # SFixed64ByteSize(). + [wire_format.SFixed64ByteSize, 0, 8], + [wire_format.SFixed64ByteSize, wire_format.INT64_MIN, 8], + [wire_format.SFixed64ByteSize, wire_format.INT64_MAX, 8], + # FloatByteSize(). + [wire_format.FloatByteSize, 0.0, 4], + [wire_format.FloatByteSize, 1000000000.0, 4], + [wire_format.FloatByteSize, -1000000000.0, 4], + # DoubleByteSize(). + [wire_format.DoubleByteSize, 0.0, 8], + [wire_format.DoubleByteSize, 1000000000.0, 8], + [wire_format.DoubleByteSize, -1000000000.0, 8], + # BoolByteSize(). + [wire_format.BoolByteSize, False, 1], + [wire_format.BoolByteSize, True, 1], + # EnumByteSize(). + [wire_format.EnumByteSize, 0, 1], + [wire_format.EnumByteSize, 127, 1], + [wire_format.EnumByteSize, 128, 2], + [wire_format.EnumByteSize, wire_format.UINT32_MAX, 5], + ] + for args in NUMERIC_ARGS: + self.NumericByteSizeTestHelper(*args) + + # Test strings and bytes. + for byte_size_fn in (wire_format.StringByteSize, wire_format.BytesByteSize): + # 1 byte for tag, 1 byte for length, 3 bytes for contents. + self.assertEqual(5, byte_size_fn(10, 'abc')) + # 2 bytes for tag, 1 byte for length, 3 bytes for contents. + self.assertEqual(6, byte_size_fn(16, 'abc')) + # 2 bytes for tag, 2 bytes for length, 128 bytes for contents. + self.assertEqual(132, byte_size_fn(16, 'a' * 128)) + + # Test UTF-8 string byte size calculation. + # 1 byte for tag, 1 byte for length, 8 bytes for content. + self.assertEqual(10, wire_format.StringByteSize( + 5, b'\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82'.decode('utf-8'))) + + class MockMessage(object): + def __init__(self, byte_size): + self.byte_size = byte_size + def ByteSize(self): + return self.byte_size + + message_byte_size = 10 + mock_message = MockMessage(byte_size=message_byte_size) + # Test groups. + # (2 * 1) bytes for begin and end tags, plus message_byte_size. + self.assertEqual(2 + message_byte_size, + wire_format.GroupByteSize(1, mock_message)) + # (2 * 2) bytes for begin and end tags, plus message_byte_size. + self.assertEqual(4 + message_byte_size, + wire_format.GroupByteSize(16, mock_message)) + + # Test messages. + # 1 byte for tag, plus 1 byte for length, plus contents. + self.assertEqual(2 + mock_message.byte_size, + wire_format.MessageByteSize(1, mock_message)) + # 2 bytes for tag, plus 1 byte for length, plus contents. + self.assertEqual(3 + mock_message.byte_size, + wire_format.MessageByteSize(16, mock_message)) + # 2 bytes for tag, plus 2 bytes for length, plus contents. + mock_message.byte_size = 128 + self.assertEqual(4 + mock_message.byte_size, + wire_format.MessageByteSize(16, mock_message)) + + + # Test message set item byte size. + # 4 bytes for tags, plus 1 byte for length, plus 1 byte for type_id, + # plus contents. + mock_message.byte_size = 10 + self.assertEqual(mock_message.byte_size + 6, + wire_format.MessageSetItemByteSize(1, mock_message)) + + # 4 bytes for tags, plus 2 bytes for length, plus 1 byte for type_id, + # plus contents. + mock_message.byte_size = 128 + self.assertEqual(mock_message.byte_size + 7, + wire_format.MessageSetItemByteSize(1, mock_message)) + + # 4 bytes for tags, plus 2 bytes for length, plus 2 byte for type_id, + # plus contents. + self.assertEqual(mock_message.byte_size + 8, + wire_format.MessageSetItemByteSize(128, mock_message)) + + # Too-long varint. + self.assertRaises(message.EncodeError, + wire_format.UInt64ByteSize, 1, 1 << 128) + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/message.py b/pythonlib/google/protobuf/message.py new file mode 100644 index 0000000..37b0af1 --- /dev/null +++ b/pythonlib/google/protobuf/message.py @@ -0,0 +1,284 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +# TODO(robinson): We should just make these methods all "pure-virtual" and move +# all implementation out, into reflection.py for now. + + +"""Contains an abstract base class for protocol messages.""" + +__author__ = 'robinson@google.com (Will Robinson)' + + +class Error(Exception): pass +class DecodeError(Error): pass +class EncodeError(Error): pass + + +class Message(object): + + """Abstract base class for protocol messages. + + Protocol message classes are almost always generated by the protocol + compiler. These generated types subclass Message and implement the methods + shown below. + + TODO(robinson): Link to an HTML document here. + + TODO(robinson): Document that instances of this class will also + have an Extensions attribute with __getitem__ and __setitem__. + Again, not sure how to best convey this. + + TODO(robinson): Document that the class must also have a static + RegisterExtension(extension_field) method. + Not sure how to best express at this point. + """ + + # TODO(robinson): Document these fields and methods. + + __slots__ = [] + + DESCRIPTOR = None + + def __deepcopy__(self, memo=None): + clone = type(self)() + clone.MergeFrom(self) + return clone + + def __eq__(self, other_msg): + """Recursively compares two messages by value and structure.""" + raise NotImplementedError + + def __ne__(self, other_msg): + # Can't just say self != other_msg, since that would infinitely recurse. :) + return not self == other_msg + + def __hash__(self): + raise TypeError('unhashable object') + + def __str__(self): + """Outputs a human-readable representation of the message.""" + raise NotImplementedError + + def __unicode__(self): + """Outputs a human-readable representation of the message.""" + raise NotImplementedError + + def MergeFrom(self, other_msg): + """Merges the contents of the specified message into current message. + + This method merges the contents of the specified message into the current + message. Singular fields that are set in the specified message overwrite + the corresponding fields in the current message. Repeated fields are + appended. Singular sub-messages and groups are recursively merged. + + Args: + other_msg: Message to merge into the current message. + """ + raise NotImplementedError + + def CopyFrom(self, other_msg): + """Copies the content of the specified message into the current message. + + The method clears the current message and then merges the specified + message using MergeFrom. + + Args: + other_msg: Message to copy into the current one. + """ + if self is other_msg: + return + self.Clear() + self.MergeFrom(other_msg) + + def Clear(self): + """Clears all data that was set in the message.""" + raise NotImplementedError + + def SetInParent(self): + """Mark this as present in the parent. + + This normally happens automatically when you assign a field of a + sub-message, but sometimes you want to make the sub-message + present while keeping it empty. If you find yourself using this, + you may want to reconsider your design.""" + raise NotImplementedError + + def IsInitialized(self): + """Checks if the message is initialized. + + Returns: + The method returns True if the message is initialized (i.e. all of its + required fields are set). + """ + raise NotImplementedError + + # TODO(robinson): MergeFromString() should probably return None and be + # implemented in terms of a helper that returns the # of bytes read. Our + # deserialization routines would use the helper when recursively + # deserializing, but the end user would almost always just want the no-return + # MergeFromString(). + + def MergeFromString(self, serialized): + """Merges serialized protocol buffer data into this message. + + When we find a field in |serialized| that is already present + in this message: + - If it's a "repeated" field, we append to the end of our list. + - Else, if it's a scalar, we overwrite our field. + - Else, (it's a nonrepeated composite), we recursively merge + into the existing composite. + + TODO(robinson): Document handling of unknown fields. + + Args: + serialized: Any object that allows us to call buffer(serialized) + to access a string of bytes using the buffer interface. + + TODO(robinson): When we switch to a helper, this will return None. + + Returns: + The number of bytes read from |serialized|. + For non-group messages, this will always be len(serialized), + but for messages which are actually groups, this will + generally be less than len(serialized), since we must + stop when we reach an END_GROUP tag. Note that if + we *do* stop because of an END_GROUP tag, the number + of bytes returned does not include the bytes + for the END_GROUP tag information. + """ + raise NotImplementedError + + def ParseFromString(self, serialized): + """Parse serialized protocol buffer data into this message. + + Like MergeFromString(), except we clear the object first and + do not return the value that MergeFromString returns. + """ + self.Clear() + self.MergeFromString(serialized) + + def SerializeToString(self): + """Serializes the protocol message to a binary string. + + Returns: + A binary string representation of the message if all of the required + fields in the message are set (i.e. the message is initialized). + + Raises: + message.EncodeError if the message isn't initialized. + """ + raise NotImplementedError + + def SerializePartialToString(self): + """Serializes the protocol message to a binary string. + + This method is similar to SerializeToString but doesn't check if the + message is initialized. + + Returns: + A string representation of the partial message. + """ + raise NotImplementedError + + # TODO(robinson): Decide whether we like these better + # than auto-generated has_foo() and clear_foo() methods + # on the instances themselves. This way is less consistent + # with C++, but it makes reflection-type access easier and + # reduces the number of magically autogenerated things. + # + # TODO(robinson): Be sure to document (and test) exactly + # which field names are accepted here. Are we case-sensitive? + # What do we do with fields that share names with Python keywords + # like 'lambda' and 'yield'? + # + # nnorwitz says: + # """ + # Typically (in python), an underscore is appended to names that are + # keywords. So they would become lambda_ or yield_. + # """ + def ListFields(self): + """Returns a list of (FieldDescriptor, value) tuples for all + fields in the message which are not empty. A singular field is non-empty + if HasField() would return true, and a repeated field is non-empty if + it contains at least one element. The fields are ordered by field + number""" + raise NotImplementedError + + def HasField(self, field_name): + """Checks if a certain field is set for the message. Note if the + field_name is not defined in the message descriptor, ValueError will be + raised.""" + raise NotImplementedError + + def ClearField(self, field_name): + raise NotImplementedError + + def HasExtension(self, extension_handle): + raise NotImplementedError + + def ClearExtension(self, extension_handle): + raise NotImplementedError + + def ByteSize(self): + """Returns the serialized size of this message. + Recursively calls ByteSize() on all contained messages. + """ + raise NotImplementedError + + def _SetListener(self, message_listener): + """Internal method used by the protocol message implementation. + Clients should not call this directly. + + Sets a listener that this message will call on certain state transitions. + + The purpose of this method is to register back-edges from children to + parents at runtime, for the purpose of setting "has" bits and + byte-size-dirty bits in the parent and ancestor objects whenever a child or + descendant object is modified. + + If the client wants to disconnect this Message from the object tree, she + explicitly sets callback to None. + + If message_listener is None, unregisters any existing listener. Otherwise, + message_listener must implement the MessageListener interface in + internal/message_listener.py, and we discard any listener registered + via a previous _SetListener() call. + """ + raise NotImplementedError + + def __getstate__(self): + """Support the pickle protocol.""" + return dict(serialized=self.SerializePartialToString()) + + def __setstate__(self, state): + """Support the pickle protocol.""" + self.__init__() + self.ParseFromString(state['serialized']) diff --git a/pythonlib/google/protobuf/message_factory.py b/pythonlib/google/protobuf/message_factory.py new file mode 100644 index 0000000..9004ffd --- /dev/null +++ b/pythonlib/google/protobuf/message_factory.py @@ -0,0 +1,155 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +#PY25 compatible for GAE. +# +# Copyright 2012 Google Inc. All Rights Reserved. + +"""Provides a factory class for generating dynamic messages. + +The easiest way to use this class is if you have access to the FileDescriptor +protos containing the messages you want to create you can just do the following: + +message_classes = message_factory.GetMessages(iterable_of_file_descriptors) +my_proto_instance = message_classes['some.proto.package.MessageName']() +""" + +__author__ = 'matthewtoia@google.com (Matt Toia)' + +import sys ##PY25 +from google.protobuf import descriptor_database +from google.protobuf import descriptor_pool +from google.protobuf import message +from google.protobuf import reflection + + +class MessageFactory(object): + """Factory for creating Proto2 messages from descriptors in a pool.""" + + def __init__(self, pool=None): + """Initializes a new factory.""" + self.pool = (pool or descriptor_pool.DescriptorPool( + descriptor_database.DescriptorDatabase())) + + # local cache of all classes built from protobuf descriptors + self._classes = {} + + def GetPrototype(self, descriptor): + """Builds a proto2 message class based on the passed in descriptor. + + Passing a descriptor with a fully qualified name matching a previous + invocation will cause the same class to be returned. + + Args: + descriptor: The descriptor to build from. + + Returns: + A class describing the passed in descriptor. + """ + if descriptor.full_name not in self._classes: + descriptor_name = descriptor.name + if sys.version_info[0] < 3: ##PY25 +##!PY25 if str is bytes: # PY2 + descriptor_name = descriptor.name.encode('ascii', 'ignore') + result_class = reflection.GeneratedProtocolMessageType( + descriptor_name, + (message.Message,), + {'DESCRIPTOR': descriptor, '__module__': None}) + # If module not set, it wrongly points to the reflection.py module. + self._classes[descriptor.full_name] = result_class + for field in descriptor.fields: + if field.message_type: + self.GetPrototype(field.message_type) + for extension in result_class.DESCRIPTOR.extensions: + if extension.containing_type.full_name not in self._classes: + self.GetPrototype(extension.containing_type) + extended_class = self._classes[extension.containing_type.full_name] + extended_class.RegisterExtension(extension) + return self._classes[descriptor.full_name] + + def GetMessages(self, files): + """Gets all the messages from a specified file. + + This will find and resolve dependencies, failing if the descriptor + pool cannot satisfy them. + + Args: + files: The file names to extract messages from. + + Returns: + A dictionary mapping proto names to the message classes. This will include + any dependent messages as well as any messages defined in the same file as + a specified message. + """ + result = {} + for file_name in files: + file_desc = self.pool.FindFileByName(file_name) + for name, msg in file_desc.message_types_by_name.iteritems(): + if file_desc.package: + full_name = '.'.join([file_desc.package, name]) + else: + full_name = msg.name + result[full_name] = self.GetPrototype( + self.pool.FindMessageTypeByName(full_name)) + + # While the extension FieldDescriptors are created by the descriptor pool, + # the python classes created in the factory need them to be registered + # explicitly, which is done below. + # + # The call to RegisterExtension will specifically check if the + # extension was already registered on the object and either + # ignore the registration if the original was the same, or raise + # an error if they were different. + + for name, extension in file_desc.extensions_by_name.iteritems(): + if extension.containing_type.full_name not in self._classes: + self.GetPrototype(extension.containing_type) + extended_class = self._classes[extension.containing_type.full_name] + extended_class.RegisterExtension(extension) + return result + + +_FACTORY = MessageFactory() + + +def GetMessages(file_protos): + """Builds a dictionary of all the messages available in a set of files. + + Args: + file_protos: A sequence of file protos to build messages out of. + + Returns: + A dictionary mapping proto names to the message classes. This will include + any dependent messages as well as any messages defined in the same file as + a specified message. + """ + for file_proto in file_protos: + _FACTORY.pool.Add(file_proto) + return _FACTORY.GetMessages([file_proto.name for file_proto in file_protos]) diff --git a/pythonlib/google/protobuf/pyext/README b/pythonlib/google/protobuf/pyext/README new file mode 100644 index 0000000..6d61cb4 --- /dev/null +++ b/pythonlib/google/protobuf/pyext/README @@ -0,0 +1,6 @@ +This is the 'v2' C++ implementation for python proto2. + +It is active when: + +PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp +PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION=2 diff --git a/pythonlib/google/protobuf/pyext/__init__.py b/pythonlib/google/protobuf/pyext/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pythonlib/google/protobuf/pyext/cpp_message.py b/pythonlib/google/protobuf/pyext/cpp_message.py new file mode 100644 index 0000000..ba87f8e --- /dev/null +++ b/pythonlib/google/protobuf/pyext/cpp_message.py @@ -0,0 +1,61 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Protocol message implementation hooks for C++ implementation. + +Contains helper functions used to create protocol message classes from +Descriptor objects at runtime backed by the protocol buffer C++ API. +""" + +__author__ = 'tibell@google.com (Johan Tibell)' + +from google.protobuf.pyext import _message +from google.protobuf import message + + +def NewMessage(bases, message_descriptor, dictionary): + """Creates a new protocol message *class*.""" + new_bases = [] + for base in bases: + if base is message.Message: + # _message.Message must come before message.Message as it + # overrides methods in that class. + new_bases.append(_message.Message) + new_bases.append(base) + return tuple(new_bases) + + +def InitMessage(message_descriptor, cls): + """Constructs a new message instance (called before instance's __init__).""" + + def SubInit(self, **kwargs): + super(cls, self).__init__(message_descriptor, **kwargs) + cls.__init__ = SubInit + cls.AddDescriptors(message_descriptor) diff --git a/pythonlib/google/protobuf/pyext/descriptor.cc b/pythonlib/google/protobuf/pyext/descriptor.cc new file mode 100644 index 0000000..cbf42c0 --- /dev/null +++ b/pythonlib/google/protobuf/pyext/descriptor.cc @@ -0,0 +1,357 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: petar@google.com (Petar Petrov) + +#include +#include + +#include +#include +#include + +#define C(str) const_cast(str) + +#if PY_MAJOR_VERSION >= 3 + #define PyString_FromStringAndSize PyUnicode_FromStringAndSize + #define PyInt_FromLong PyLong_FromLong + #if PY_VERSION_HEX < 0x03030000 + #error "Python 3.0 - 3.2 are not supported." + #else + #define PyString_AsString(ob) \ + (PyUnicode_Check(ob)? PyUnicode_AsUTF8(ob): PyBytes_AS_STRING(ob)) + #endif +#endif + +namespace google { +namespace protobuf { +namespace python { + + +#ifndef PyVarObject_HEAD_INIT +#define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size, +#endif +#ifndef Py_TYPE +#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) +#endif + + +static google::protobuf::DescriptorPool* g_descriptor_pool = NULL; + +namespace cfield_descriptor { + +static void Dealloc(CFieldDescriptor* self) { + Py_CLEAR(self->descriptor_field); + Py_TYPE(self)->tp_free(reinterpret_cast(self)); +} + +static PyObject* GetFullName(CFieldDescriptor* self, void *closure) { + return PyString_FromStringAndSize( + self->descriptor->full_name().c_str(), + self->descriptor->full_name().size()); +} + +static PyObject* GetName(CFieldDescriptor *self, void *closure) { + return PyString_FromStringAndSize( + self->descriptor->name().c_str(), + self->descriptor->name().size()); +} + +static PyObject* GetCppType(CFieldDescriptor *self, void *closure) { + return PyInt_FromLong(self->descriptor->cpp_type()); +} + +static PyObject* GetLabel(CFieldDescriptor *self, void *closure) { + return PyInt_FromLong(self->descriptor->label()); +} + +static PyObject* GetID(CFieldDescriptor *self, void *closure) { + return PyLong_FromVoidPtr(self); +} + +static PyGetSetDef Getters[] = { + { C("full_name"), (getter)GetFullName, NULL, "Full name", NULL}, + { C("name"), (getter)GetName, NULL, "last name", NULL}, + { C("cpp_type"), (getter)GetCppType, NULL, "C++ Type", NULL}, + { C("label"), (getter)GetLabel, NULL, "Label", NULL}, + { C("id"), (getter)GetID, NULL, "ID", NULL}, + {NULL} +}; + +} // namespace cfield_descriptor + +PyTypeObject CFieldDescriptor_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + C("google.protobuf.internal." + "_net_proto2___python." + "CFieldDescriptor"), // tp_name + sizeof(CFieldDescriptor), // tp_basicsize + 0, // tp_itemsize + (destructor)cfield_descriptor::Dealloc, // tp_dealloc + 0, // tp_print + 0, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash + 0, // tp_call + 0, // tp_str + 0, // tp_getattro + 0, // tp_setattro + 0, // tp_as_buffer + Py_TPFLAGS_DEFAULT, // tp_flags + C("A Field Descriptor"), // tp_doc + 0, // tp_traverse + 0, // tp_clear + 0, // tp_richcompare + 0, // tp_weaklistoffset + 0, // tp_iter + 0, // tp_iternext + 0, // tp_methods + 0, // tp_members + cfield_descriptor::Getters, // tp_getset + 0, // tp_base + 0, // tp_dict + 0, // tp_descr_get + 0, // tp_descr_set + 0, // tp_dictoffset + 0, // tp_init + PyType_GenericAlloc, // tp_alloc + PyType_GenericNew, // tp_new + PyObject_Del, // tp_free +}; + +namespace cdescriptor_pool { + +static void Dealloc(CDescriptorPool* self) { + Py_TYPE(self)->tp_free(reinterpret_cast(self)); +} + +static PyObject* NewCDescriptor( + const google::protobuf::FieldDescriptor* field_descriptor) { + CFieldDescriptor* cfield_descriptor = PyObject_New( + CFieldDescriptor, &CFieldDescriptor_Type); + if (cfield_descriptor == NULL) { + return NULL; + } + cfield_descriptor->descriptor = field_descriptor; + cfield_descriptor->descriptor_field = NULL; + + return reinterpret_cast(cfield_descriptor); +} + +PyObject* FindFieldByName(CDescriptorPool* self, PyObject* name) { + const char* full_field_name = PyString_AsString(name); + if (full_field_name == NULL) { + return NULL; + } + + const google::protobuf::FieldDescriptor* field_descriptor = NULL; + + field_descriptor = self->pool->FindFieldByName(full_field_name); + + if (field_descriptor == NULL) { + PyErr_Format(PyExc_TypeError, "Couldn't find field %.200s", + full_field_name); + return NULL; + } + + return NewCDescriptor(field_descriptor); +} + +PyObject* FindExtensionByName(CDescriptorPool* self, PyObject* arg) { + const char* full_field_name = PyString_AsString(arg); + if (full_field_name == NULL) { + return NULL; + } + + const google::protobuf::FieldDescriptor* field_descriptor = + self->pool->FindExtensionByName(full_field_name); + if (field_descriptor == NULL) { + PyErr_Format(PyExc_TypeError, "Couldn't find field %.200s", + full_field_name); + return NULL; + } + + return NewCDescriptor(field_descriptor); +} + +static PyMethodDef Methods[] = { + { C("FindFieldByName"), + (PyCFunction)FindFieldByName, + METH_O, + C("Searches for a field descriptor by full name.") }, + { C("FindExtensionByName"), + (PyCFunction)FindExtensionByName, + METH_O, + C("Searches for extension descriptor by full name.") }, + {NULL} +}; + +} // namespace cdescriptor_pool + +PyTypeObject CDescriptorPool_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + C("google.protobuf.internal." + "_net_proto2___python." + "CFieldDescriptor"), // tp_name + sizeof(CDescriptorPool), // tp_basicsize + 0, // tp_itemsize + (destructor)cdescriptor_pool::Dealloc, // tp_dealloc + 0, // tp_print + 0, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash + 0, // tp_call + 0, // tp_str + 0, // tp_getattro + 0, // tp_setattro + 0, // tp_as_buffer + Py_TPFLAGS_DEFAULT, // tp_flags + C("A Descriptor Pool"), // tp_doc + 0, // tp_traverse + 0, // tp_clear + 0, // tp_richcompare + 0, // tp_weaklistoffset + 0, // tp_iter + 0, // tp_iternext + cdescriptor_pool::Methods, // tp_methods + 0, // tp_members + 0, // tp_getset + 0, // tp_base + 0, // tp_dict + 0, // tp_descr_get + 0, // tp_descr_set + 0, // tp_dictoffset + 0, // tp_init + PyType_GenericAlloc, // tp_alloc + PyType_GenericNew, // tp_new + PyObject_Del, // tp_free +}; + +google::protobuf::DescriptorPool* GetDescriptorPool() { + if (g_descriptor_pool == NULL) { + g_descriptor_pool = new google::protobuf::DescriptorPool( + google::protobuf::DescriptorPool::generated_pool()); + } + return g_descriptor_pool; +} + +PyObject* Python_NewCDescriptorPool(PyObject* ignored, PyObject* args) { + CDescriptorPool* cdescriptor_pool = PyObject_New( + CDescriptorPool, &CDescriptorPool_Type); + if (cdescriptor_pool == NULL) { + return NULL; + } + cdescriptor_pool->pool = GetDescriptorPool(); + return reinterpret_cast(cdescriptor_pool); +} + + +// Collects errors that occur during proto file building to allow them to be +// propagated in the python exception instead of only living in ERROR logs. +class BuildFileErrorCollector : public google::protobuf::DescriptorPool::ErrorCollector { + public: + BuildFileErrorCollector() : error_message(""), had_errors(false) {} + + void AddError(const string& filename, const string& element_name, + const Message* descriptor, ErrorLocation location, + const string& message) { + // Replicates the logging behavior that happens in the C++ implementation + // when an error collector is not passed in. + if (!had_errors) { + error_message += + ("Invalid proto descriptor for file \"" + filename + "\":\n"); + } + // As this only happens on failure and will result in the program not + // running at all, no effort is made to optimize this string manipulation. + error_message += (" " + element_name + ": " + message + "\n"); + } + + string error_message; + bool had_errors; +}; + +PyObject* Python_BuildFile(PyObject* ignored, PyObject* arg) { + char* message_type; + Py_ssize_t message_len; + + if (PyBytes_AsStringAndSize(arg, &message_type, &message_len) < 0) { + return NULL; + } + + google::protobuf::FileDescriptorProto file_proto; + if (!file_proto.ParseFromArray(message_type, message_len)) { + PyErr_SetString(PyExc_TypeError, "Couldn't parse file content!"); + return NULL; + } + + if (google::protobuf::DescriptorPool::generated_pool()->FindFileByName( + file_proto.name()) != NULL) { + Py_RETURN_NONE; + } + + BuildFileErrorCollector error_collector; + const google::protobuf::FileDescriptor* descriptor = + GetDescriptorPool()->BuildFileCollectingErrors(file_proto, + &error_collector); + if (descriptor == NULL) { + PyErr_Format(PyExc_TypeError, + "Couldn't build proto file into descriptor pool!\n%s", + error_collector.error_message.c_str()); + return NULL; + } + + Py_RETURN_NONE; +} + +bool InitDescriptor() { + CFieldDescriptor_Type.tp_new = PyType_GenericNew; + if (PyType_Ready(&CFieldDescriptor_Type) < 0) + return false; + + CDescriptorPool_Type.tp_new = PyType_GenericNew; + if (PyType_Ready(&CDescriptorPool_Type) < 0) + return false; + + return true; +} + +} // namespace python +} // namespace protobuf +} // namespace google diff --git a/pythonlib/google/protobuf/pyext/descriptor.h b/pythonlib/google/protobuf/pyext/descriptor.h new file mode 100644 index 0000000..d114425 --- /dev/null +++ b/pythonlib/google/protobuf/pyext/descriptor.h @@ -0,0 +1,96 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: petar@google.com (Petar Petrov) + +#ifndef GOOGLE_PROTOBUF_PYTHON_CPP_DESCRIPTOR_H__ +#define GOOGLE_PROTOBUF_PYTHON_CPP_DESCRIPTOR_H__ + +#include +#include + +#include + +#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) +typedef int Py_ssize_t; +#define PY_SSIZE_T_MAX INT_MAX +#define PY_SSIZE_T_MIN INT_MIN +#endif + +namespace google { +namespace protobuf { +namespace python { + +typedef struct CFieldDescriptor { + PyObject_HEAD + + // The proto2 descriptor that this object represents. + const google::protobuf::FieldDescriptor* descriptor; + + // Reference to the original field object in the Python DESCRIPTOR. + PyObject* descriptor_field; +} CFieldDescriptor; + +typedef struct { + PyObject_HEAD + + const google::protobuf::DescriptorPool* pool; +} CDescriptorPool; + +extern PyTypeObject CFieldDescriptor_Type; + +extern PyTypeObject CDescriptorPool_Type; + +namespace cdescriptor_pool { + +// Looks up a field by name. Returns a CDescriptor corresponding to +// the field on success, or NULL on failure. +// +// Returns a new reference. +PyObject* FindFieldByName(CDescriptorPool* self, PyObject* name); + +// Looks up an extension by name. Returns a CDescriptor corresponding +// to the field on success, or NULL on failure. +// +// Returns a new reference. +PyObject* FindExtensionByName(CDescriptorPool* self, PyObject* arg); + +} // namespace cdescriptor_pool + +PyObject* Python_NewCDescriptorPool(PyObject* ignored, PyObject* args); +PyObject* Python_BuildFile(PyObject* ignored, PyObject* args); +bool InitDescriptor(); +google::protobuf::DescriptorPool* GetDescriptorPool(); + +} // namespace python +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_PYTHON_CPP_DESCRIPTOR_H__ diff --git a/pythonlib/google/protobuf/pyext/descriptor_cpp2_test.py b/pythonlib/google/protobuf/pyext/descriptor_cpp2_test.py new file mode 100644 index 0000000..3a3ff29 --- /dev/null +++ b/pythonlib/google/protobuf/pyext/descriptor_cpp2_test.py @@ -0,0 +1,58 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Tests for google.protobuf.pyext behavior.""" + +__author__ = 'anuraag@google.com (Anuraag Agrawal)' + +import os +os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'cpp' +os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION'] = '2' + +# We must set the implementation version above before the google3 imports. +# pylint: disable=g-import-not-at-top +from google.apputils import basetest +from google.protobuf.internal import api_implementation +# Run all tests from the original module by putting them in our namespace. +# pylint: disable=wildcard-import +from google.protobuf.internal.descriptor_test import * + + +class ConfirmCppApi2Test(basetest.TestCase): + + def testImplementationSetting(self): + self.assertEqual('cpp', api_implementation.Type()) + self.assertEqual(2, api_implementation.Version()) + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/pyext/extension_dict.cc b/pythonlib/google/protobuf/pyext/extension_dict.cc new file mode 100644 index 0000000..1e14b42 --- /dev/null +++ b/pythonlib/google/protobuf/pyext/extension_dict.cc @@ -0,0 +1,338 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: anuraag@google.com (Anuraag Agrawal) +// Author: tibell@google.com (Johan Tibell) + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace python { + +extern google::protobuf::DynamicMessageFactory* global_message_factory; + +namespace extension_dict { + +// TODO(tibell): Always use self->message for clarity, just like in +// RepeatedCompositeContainer. +static google::protobuf::Message* GetMessage(ExtensionDict* self) { + if (self->parent != NULL) { + return self->parent->message; + } else { + return self->message; + } +} + +CFieldDescriptor* InternalGetCDescriptorFromExtension(PyObject* extension) { + PyObject* cdescriptor = PyObject_GetAttrString(extension, "_cdescriptor"); + if (cdescriptor == NULL) { + PyErr_SetString(PyExc_KeyError, "Unregistered extension."); + return NULL; + } + if (!PyObject_TypeCheck(cdescriptor, &CFieldDescriptor_Type)) { + PyErr_SetString(PyExc_TypeError, "Not a CFieldDescriptor"); + Py_DECREF(cdescriptor); + return NULL; + } + CFieldDescriptor* descriptor = + reinterpret_cast(cdescriptor); + return descriptor; +} + +PyObject* len(ExtensionDict* self) { +#if PY_MAJOR_VERSION >= 3 + return PyLong_FromLong(PyDict_Size(self->values)); +#else + return PyInt_FromLong(PyDict_Size(self->values)); +#endif +} + +// TODO(tibell): Use VisitCompositeField. +int ReleaseExtension(ExtensionDict* self, + PyObject* extension, + const google::protobuf::FieldDescriptor* descriptor) { + if (descriptor->label() == google::protobuf::FieldDescriptor::LABEL_REPEATED) { + if (descriptor->cpp_type() == + google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { + if (repeated_composite_container::Release( + reinterpret_cast( + extension)) < 0) { + return -1; + } + } else { + if (repeated_scalar_container::Release( + reinterpret_cast( + extension)) < 0) { + return -1; + } + } + } else if (descriptor->cpp_type() == + google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { + if (cmessage::ReleaseSubMessage( + GetMessage(self), descriptor, + reinterpret_cast(extension)) < 0) { + return -1; + } + } + + return 0; +} + +PyObject* subscript(ExtensionDict* self, PyObject* key) { + CFieldDescriptor* cdescriptor = InternalGetCDescriptorFromExtension( + key); + if (cdescriptor == NULL) { + return NULL; + } + ScopedPyObjectPtr py_cdescriptor(reinterpret_cast(cdescriptor)); + const google::protobuf::FieldDescriptor* descriptor = cdescriptor->descriptor; + if (descriptor == NULL) { + return NULL; + } + if (descriptor->label() != FieldDescriptor::LABEL_REPEATED && + descriptor->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) { + return cmessage::InternalGetScalar(self->parent, descriptor); + } + + PyObject* value = PyDict_GetItem(self->values, key); + if (value != NULL) { + Py_INCREF(value); + return value; + } + + if (descriptor->label() != FieldDescriptor::LABEL_REPEATED && + descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + PyObject* sub_message = cmessage::InternalGetSubMessage( + self->parent, cdescriptor); + if (sub_message == NULL) { + return NULL; + } + PyDict_SetItem(self->values, key, sub_message); + return sub_message; + } + + if (descriptor->label() == FieldDescriptor::LABEL_REPEATED) { + if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + // COPIED + PyObject* py_container = PyObject_CallObject( + reinterpret_cast(&RepeatedCompositeContainer_Type), + NULL); + if (py_container == NULL) { + return NULL; + } + RepeatedCompositeContainer* container = + reinterpret_cast(py_container); + PyObject* field = cdescriptor->descriptor_field; + PyObject* message_type = PyObject_GetAttrString(field, "message_type"); + PyObject* concrete_class = PyObject_GetAttrString(message_type, + "_concrete_class"); + container->owner = self->owner; + container->parent = self->parent; + container->message = self->parent->message; + container->parent_field = cdescriptor; + container->subclass_init = concrete_class; + Py_DECREF(message_type); + PyDict_SetItem(self->values, key, py_container); + return py_container; + } else { + // COPIED + ScopedPyObjectPtr init_args(PyTuple_Pack(2, self->parent, cdescriptor)); + PyObject* py_container = PyObject_CallObject( + reinterpret_cast(&RepeatedScalarContainer_Type), + init_args); + if (py_container == NULL) { + return NULL; + } + PyDict_SetItem(self->values, key, py_container); + return py_container; + } + } + PyErr_SetString(PyExc_ValueError, "control reached unexpected line"); + return NULL; +} + +int ass_subscript(ExtensionDict* self, PyObject* key, PyObject* value) { + CFieldDescriptor* cdescriptor = InternalGetCDescriptorFromExtension( + key); + if (cdescriptor == NULL) { + return -1; + } + ScopedPyObjectPtr py_cdescriptor(reinterpret_cast(cdescriptor)); + const google::protobuf::FieldDescriptor* descriptor = cdescriptor->descriptor; + if (descriptor->label() != FieldDescriptor::LABEL_OPTIONAL || + descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + PyErr_SetString(PyExc_TypeError, "Extension is repeated and/or composite " + "type"); + return -1; + } + cmessage::AssureWritable(self->parent); + if (cmessage::InternalSetScalar(self->parent, descriptor, value) < 0) { + return -1; + } + // TODO(tibell): We shouldn't write scalars to the cache. + PyDict_SetItem(self->values, key, value); + return 0; +} + +PyObject* ClearExtension(ExtensionDict* self, PyObject* extension) { + CFieldDescriptor* cdescriptor = InternalGetCDescriptorFromExtension( + extension); + if (cdescriptor == NULL) { + return NULL; + } + ScopedPyObjectPtr py_cdescriptor(reinterpret_cast(cdescriptor)); + PyObject* value = PyDict_GetItem(self->values, extension); + if (value != NULL) { + if (ReleaseExtension(self, value, cdescriptor->descriptor) < 0) { + return NULL; + } + } + if (cmessage::ClearFieldByDescriptor(self->parent, + cdescriptor->descriptor) == NULL) { + return NULL; + } + if (PyDict_DelItem(self->values, extension) < 0) { + PyErr_Clear(); + } + Py_RETURN_NONE; +} + +PyObject* HasExtension(ExtensionDict* self, PyObject* extension) { + CFieldDescriptor* cdescriptor = InternalGetCDescriptorFromExtension( + extension); + if (cdescriptor == NULL) { + return NULL; + } + ScopedPyObjectPtr py_cdescriptor(reinterpret_cast(cdescriptor)); + PyObject* result = cmessage::HasFieldByDescriptor( + self->parent, cdescriptor->descriptor); + return result; +} + +PyObject* _FindExtensionByName(ExtensionDict* self, PyObject* name) { + ScopedPyObjectPtr extensions_by_name(PyObject_GetAttrString( + reinterpret_cast(self->parent), "_extensions_by_name")); + if (extensions_by_name == NULL) { + return NULL; + } + PyObject* result = PyDict_GetItem(extensions_by_name, name); + if (result == NULL) { + Py_RETURN_NONE; + } else { + Py_INCREF(result); + return result; + } +} + +int init(ExtensionDict* self, PyObject* args, PyObject* kwargs) { + self->parent = NULL; + self->message = NULL; + self->values = PyDict_New(); + return 0; +} + +void dealloc(ExtensionDict* self) { + Py_CLEAR(self->values); + self->owner.reset(); + Py_TYPE(self)->tp_free(reinterpret_cast(self)); +} + +static PyMappingMethods MpMethods = { + (lenfunc)len, /* mp_length */ + (binaryfunc)subscript, /* mp_subscript */ + (objobjargproc)ass_subscript,/* mp_ass_subscript */ +}; + +#define EDMETHOD(name, args, doc) { #name, (PyCFunction)name, args, doc } +static PyMethodDef Methods[] = { + EDMETHOD(ClearExtension, METH_O, "Clears an extension from the object."), + EDMETHOD(HasExtension, METH_O, "Checks if the object has an extension."), + EDMETHOD(_FindExtensionByName, METH_O, + "Finds an extension by name."), + { NULL, NULL } +}; + +} // namespace extension_dict + +PyTypeObject ExtensionDict_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "google.protobuf.internal." + "cpp._message.ExtensionDict", // tp_name + sizeof(ExtensionDict), // tp_basicsize + 0, // tp_itemsize + (destructor)extension_dict::dealloc, // tp_dealloc + 0, // tp_print + 0, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + &extension_dict::MpMethods, // tp_as_mapping + 0, // tp_hash + 0, // tp_call + 0, // tp_str + 0, // tp_getattro + 0, // tp_setattro + 0, // tp_as_buffer + Py_TPFLAGS_DEFAULT, // tp_flags + "An extension dict", // tp_doc + 0, // tp_traverse + 0, // tp_clear + 0, // tp_richcompare + 0, // tp_weaklistoffset + 0, // tp_iter + 0, // tp_iternext + extension_dict::Methods, // tp_methods + 0, // tp_members + 0, // tp_getset + 0, // tp_base + 0, // tp_dict + 0, // tp_descr_get + 0, // tp_descr_set + 0, // tp_dictoffset + (initproc)extension_dict::init, // tp_init +}; + +} // namespace python +} // namespace protobuf +} // namespace google diff --git a/pythonlib/google/protobuf/pyext/extension_dict.h b/pythonlib/google/protobuf/pyext/extension_dict.h new file mode 100644 index 0000000..1343001 --- /dev/null +++ b/pythonlib/google/protobuf/pyext/extension_dict.h @@ -0,0 +1,123 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: anuraag@google.com (Anuraag Agrawal) +// Author: tibell@google.com (Johan Tibell) + +#ifndef GOOGLE_PROTOBUF_PYTHON_CPP_EXTENSION_DICT_H__ +#define GOOGLE_PROTOBUF_PYTHON_CPP_EXTENSION_DICT_H__ + +#include + +#include +#ifndef _SHARED_PTR_H +#include +#endif + + +namespace google { +namespace protobuf { + +class Message; +class FieldDescriptor; + +using internal::shared_ptr; + +namespace python { + +struct CMessage; +struct CFieldDescriptor; + +typedef struct ExtensionDict { + PyObject_HEAD; + shared_ptr owner; + CMessage* parent; + Message* message; + PyObject* values; +} ExtensionDict; + +extern PyTypeObject ExtensionDict_Type; + +namespace extension_dict { + +// Gets the _cdescriptor reference to a CFieldDescriptor object given a +// python descriptor object. +// +// Returns a new reference. +CFieldDescriptor* InternalGetCDescriptorFromExtension(PyObject* extension); + +// Gets the number of extension values in this ExtensionDict as a python object. +// +// Returns a new reference. +PyObject* len(ExtensionDict* self); + +// Releases extensions referenced outside this dictionary to keep outside +// references alive. +// +// Returns 0 on success, -1 on failure. +int ReleaseExtension(ExtensionDict* self, + PyObject* extension, + const google::protobuf::FieldDescriptor* descriptor); + +// Gets an extension from the dict for the given extension descriptor. +// +// Returns a new reference. +PyObject* subscript(ExtensionDict* self, PyObject* key); + +// Assigns a value to an extension in the dict. Can only be used for singular +// simple types. +// +// Returns 0 on success, -1 on failure. +int ass_subscript(ExtensionDict* self, PyObject* key, PyObject* value); + +// Clears an extension from the dict. Will release the extension if there +// is still an external reference left to it. +// +// Returns None on success. +PyObject* ClearExtension(ExtensionDict* self, + PyObject* extension); + +// Checks if the dict has an extension. +// +// Returns a new python boolean reference. +PyObject* HasExtension(ExtensionDict* self, PyObject* extension); + +// Gets an extension from the dict given the extension name as opposed to +// descriptor. +// +// Returns a new reference. +PyObject* _FindExtensionByName(ExtensionDict* self, PyObject* name); + +} // namespace extension_dict +} // namespace python +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_PYTHON_CPP_EXTENSION_DICT_H__ diff --git a/pythonlib/google/protobuf/pyext/message.cc b/pythonlib/google/protobuf/pyext/message.cc new file mode 100644 index 0000000..c45cbf0 --- /dev/null +++ b/pythonlib/google/protobuf/pyext/message.cc @@ -0,0 +1,2561 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: anuraag@google.com (Anuraag Agrawal) +// Author: tibell@google.com (Johan Tibell) + +#include + +#include +#ifndef _SHARED_PTR_H +#include +#endif +#include +#include + +#ifndef PyVarObject_HEAD_INIT +#define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size, +#endif +#ifndef Py_TYPE +#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if PY_MAJOR_VERSION >= 3 + #define PyInt_Check PyLong_Check + #define PyInt_AsLong PyLong_AsLong + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyString_Check PyUnicode_Check + #define PyString_FromString PyUnicode_FromString + #define PyString_FromStringAndSize PyUnicode_FromStringAndSize + #if PY_VERSION_HEX < 0x03030000 + #error "Python 3.0 - 3.2 are not supported." + #else + #define PyString_AsString(ob) \ + (PyUnicode_Check(ob)? PyUnicode_AsUTF8(ob): PyBytes_AS_STRING(ob)) + #endif +#endif + +namespace google { +namespace protobuf { +namespace python { + +// Forward declarations +namespace cmessage { +static PyObject* GetDescriptor(CMessage* self, PyObject* name); +static string GetMessageName(CMessage* self); +int InternalReleaseFieldByDescriptor( + const google::protobuf::FieldDescriptor* field_descriptor, + PyObject* composite_field, + google::protobuf::Message* parent_message); +} // namespace cmessage + +// --------------------------------------------------------------------- +// Visiting the composite children of a CMessage + +struct ChildVisitor { + // Returns 0 on success, -1 on failure. + int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) { + return 0; + } + + // Returns 0 on success, -1 on failure. + int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) { + return 0; + } + + // Returns 0 on success, -1 on failure. + int VisitCMessage(CMessage* cmessage, + const google::protobuf::FieldDescriptor* field_descriptor) { + return 0; + } +}; + +// Apply a function to a composite field. Does nothing if child is of +// non-composite type. +template +static int VisitCompositeField(const FieldDescriptor* descriptor, + PyObject* child, + Visitor visitor) { + if (descriptor->label() == google::protobuf::FieldDescriptor::LABEL_REPEATED) { + if (descriptor->cpp_type() == google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { + RepeatedCompositeContainer* container = + reinterpret_cast(child); + if (visitor.VisitRepeatedCompositeContainer(container) == -1) + return -1; + } else { + RepeatedScalarContainer* container = + reinterpret_cast(child); + if (visitor.VisitRepeatedScalarContainer(container) == -1) + return -1; + } + } else if (descriptor->cpp_type() == + google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { + CMessage* cmsg = reinterpret_cast(child); + if (visitor.VisitCMessage(cmsg, descriptor) == -1) + return -1; + } + // The ExtensionDict might contain non-composite fields, which we + // skip here. + return 0; +} + +// Visit each composite field and extension field of this CMessage. +// Returns -1 on error and 0 on success. +template +int ForEachCompositeField(CMessage* self, Visitor visitor) { + Py_ssize_t pos = 0; + PyObject* key; + PyObject* field; + + // Visit normal fields. + while (PyDict_Next(self->composite_fields, &pos, &key, &field)) { + PyObject* cdescriptor = cmessage::GetDescriptor(self, key); + if (cdescriptor != NULL) { + const google::protobuf::FieldDescriptor* descriptor = + reinterpret_cast(cdescriptor)->descriptor; + if (VisitCompositeField(descriptor, field, visitor) == -1) + return -1; + } + } + + // Visit extension fields. + if (self->extensions != NULL) { + while (PyDict_Next(self->extensions->values, &pos, &key, &field)) { + CFieldDescriptor* cdescriptor = + extension_dict::InternalGetCDescriptorFromExtension(key); + if (cdescriptor == NULL) + return -1; + if (VisitCompositeField(cdescriptor->descriptor, field, visitor) == -1) + return -1; + } + } + + return 0; +} + +// --------------------------------------------------------------------- + +// Constants used for integer type range checking. +PyObject* kPythonZero; +PyObject* kint32min_py; +PyObject* kint32max_py; +PyObject* kuint32max_py; +PyObject* kint64min_py; +PyObject* kint64max_py; +PyObject* kuint64max_py; + +PyObject* EnumTypeWrapper_class; +PyObject* EncodeError_class; +PyObject* DecodeError_class; +PyObject* PickleError_class; + +// Constant PyString values used for GetAttr/GetItem. +static PyObject* kDESCRIPTOR; +static PyObject* k__descriptors; +static PyObject* kfull_name; +static PyObject* kname; +static PyObject* kmessage_type; +static PyObject* kis_extendable; +static PyObject* kextensions_by_name; +static PyObject* k_extensions_by_name; +static PyObject* k_extensions_by_number; +static PyObject* k_concrete_class; +static PyObject* kfields_by_name; + +static CDescriptorPool* descriptor_pool; + +/* Is 64bit */ +void FormatTypeError(PyObject* arg, char* expected_types) { + PyObject* repr = PyObject_Repr(arg); + if (repr) { + PyErr_Format(PyExc_TypeError, + "%.100s has type %.100s, but expected one of: %s", + PyString_AsString(repr), + Py_TYPE(arg)->tp_name, + expected_types); + Py_DECREF(repr); + } +} + +template +bool CheckAndGetInteger( + PyObject* arg, T* value, PyObject* min, PyObject* max) { + bool is_long = PyLong_Check(arg); +#if PY_MAJOR_VERSION < 3 + if (!PyInt_Check(arg) && !is_long) { + FormatTypeError(arg, "int, long"); + return false; + } + if (PyObject_Compare(min, arg) > 0 || PyObject_Compare(max, arg) < 0) { +#else + if (!is_long) { + FormatTypeError(arg, "int"); + return false; + } + if (PyObject_RichCompareBool(min, arg, Py_LE) != 1 || + PyObject_RichCompareBool(max, arg, Py_GE) != 1) { +#endif + PyObject *s = PyObject_Str(arg); + if (s) { + PyErr_Format(PyExc_ValueError, + "Value out of range: %s", + PyString_AsString(s)); + Py_DECREF(s); + } + return false; + } +#if PY_MAJOR_VERSION < 3 + if (!is_long) { + *value = static_cast(PyInt_AsLong(arg)); + } else // NOLINT +#endif + { + if (min == kPythonZero) { + *value = static_cast(PyLong_AsUnsignedLongLong(arg)); + } else { + *value = static_cast(PyLong_AsLongLong(arg)); + } + } + return true; +} + +// These are referenced by repeated_scalar_container, and must +// be explicitly instantiated. +template bool CheckAndGetInteger( + PyObject*, int32*, PyObject*, PyObject*); +template bool CheckAndGetInteger( + PyObject*, int64*, PyObject*, PyObject*); +template bool CheckAndGetInteger( + PyObject*, uint32*, PyObject*, PyObject*); +template bool CheckAndGetInteger( + PyObject*, uint64*, PyObject*, PyObject*); + +bool CheckAndGetDouble(PyObject* arg, double* value) { + if (!PyInt_Check(arg) && !PyLong_Check(arg) && + !PyFloat_Check(arg)) { + FormatTypeError(arg, "int, long, float"); + return false; + } + *value = PyFloat_AsDouble(arg); + return true; +} + +bool CheckAndGetFloat(PyObject* arg, float* value) { + double double_value; + if (!CheckAndGetDouble(arg, &double_value)) { + return false; + } + *value = static_cast(double_value); + return true; +} + +bool CheckAndGetBool(PyObject* arg, bool* value) { + if (!PyInt_Check(arg) && !PyBool_Check(arg) && !PyLong_Check(arg)) { + FormatTypeError(arg, "int, long, bool"); + return false; + } + *value = static_cast(PyInt_AsLong(arg)); + return true; +} + +bool CheckAndSetString( + PyObject* arg, google::protobuf::Message* message, + const google::protobuf::FieldDescriptor* descriptor, + const google::protobuf::Reflection* reflection, + bool append, + int index) { + GOOGLE_DCHECK(descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING || + descriptor->type() == google::protobuf::FieldDescriptor::TYPE_BYTES); + if (descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING) { + if (!PyBytes_Check(arg) && !PyUnicode_Check(arg)) { + FormatTypeError(arg, "bytes, unicode"); + return false; + } + + if (PyBytes_Check(arg)) { + PyObject* unicode = PyUnicode_FromEncodedObject(arg, "ascii", NULL); + if (unicode == NULL) { + PyObject* repr = PyObject_Repr(arg); + PyErr_Format(PyExc_ValueError, + "%s has type str, but isn't in 7-bit ASCII " + "encoding. Non-ASCII strings must be converted to " + "unicode objects before being added.", + PyString_AsString(repr)); + Py_DECREF(repr); + return false; + } else { + Py_DECREF(unicode); + } + } + } else if (!PyBytes_Check(arg)) { + FormatTypeError(arg, "bytes"); + return false; + } + + PyObject* encoded_string = NULL; + if (descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING) { + if (PyBytes_Check(arg)) { +#if PY_MAJOR_VERSION < 3 + encoded_string = PyString_AsEncodedObject(arg, "utf-8", NULL); +#else + encoded_string = arg; // Already encoded. + Py_INCREF(encoded_string); +#endif + } else { + encoded_string = PyUnicode_AsEncodedObject(arg, "utf-8", NULL); + } + } else { + // In this case field type is "bytes". + encoded_string = arg; + Py_INCREF(encoded_string); + } + + if (encoded_string == NULL) { + return false; + } + + char* value; + Py_ssize_t value_len; + if (PyBytes_AsStringAndSize(encoded_string, &value, &value_len) < 0) { + Py_DECREF(encoded_string); + return false; + } + + string value_string(value, value_len); + if (append) { + reflection->AddString(message, descriptor, value_string); + } else if (index < 0) { + reflection->SetString(message, descriptor, value_string); + } else { + reflection->SetRepeatedString(message, descriptor, index, value_string); + } + Py_DECREF(encoded_string); + return true; +} + +PyObject* ToStringObject( + const google::protobuf::FieldDescriptor* descriptor, string value) { + if (descriptor->type() != google::protobuf::FieldDescriptor::TYPE_STRING) { + return PyBytes_FromStringAndSize(value.c_str(), value.length()); + } + + PyObject* result = PyUnicode_DecodeUTF8(value.c_str(), value.length(), NULL); + // If the string can't be decoded in UTF-8, just return a string object that + // contains the raw bytes. This can't happen if the value was assigned using + // the members of the Python message object, but can happen if the values were + // parsed from the wire (binary). + if (result == NULL) { + PyErr_Clear(); + result = PyBytes_FromStringAndSize(value.c_str(), value.length()); + } + return result; +} + +google::protobuf::DynamicMessageFactory* global_message_factory; + +namespace cmessage { + +static int MaybeReleaseOverlappingOneofField( + CMessage* cmessage, + const google::protobuf::FieldDescriptor* field) { +#ifdef GOOGLE_PROTOBUF_HAS_ONEOF + google::protobuf::Message* message = cmessage->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + if (!field->containing_oneof() || + !reflection->HasOneof(*message, field->containing_oneof()) || + reflection->HasField(*message, field)) { + // No other field in this oneof, no need to release. + return 0; + } + + const OneofDescriptor* oneof = field->containing_oneof(); + const FieldDescriptor* existing_field = + reflection->GetOneofFieldDescriptor(*message, oneof); + if (existing_field->cpp_type() != google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { + // Non-message fields don't need to be released. + return 0; + } + const char* field_name = existing_field->name().c_str(); + PyObject* child_message = PyDict_GetItemString( + cmessage->composite_fields, field_name); + if (child_message == NULL) { + // No python reference to this field so no need to release. + return 0; + } + + if (InternalReleaseFieldByDescriptor( + existing_field, child_message, message) < 0) { + return -1; + } + return PyDict_DelItemString(cmessage->composite_fields, field_name); +#else + return 0; +#endif +} + +// --------------------------------------------------------------------- +// Making a message writable + +static google::protobuf::Message* GetMutableMessage( + CMessage* parent, + const google::protobuf::FieldDescriptor* parent_field) { + google::protobuf::Message* parent_message = parent->message; + const google::protobuf::Reflection* reflection = parent_message->GetReflection(); + if (MaybeReleaseOverlappingOneofField(parent, parent_field) < 0) { + return NULL; + } + return reflection->MutableMessage( + parent_message, parent_field, global_message_factory); +} + +struct FixupMessageReference : public ChildVisitor { + // message must outlive this object. + explicit FixupMessageReference(google::protobuf::Message* message) : + message_(message) {} + + int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) { + container->message = message_; + return 0; + } + + int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) { + container->message = message_; + return 0; + } + + private: + google::protobuf::Message* message_; +}; + +int AssureWritable(CMessage* self) { + if (self == NULL || !self->read_only) { + return 0; + } + + if (self->parent == NULL) { + // If parent is NULL but we are trying to modify a read-only message, this + // is a reference to a constant default instance that needs to be replaced + // with a mutable top-level message. + const Message* prototype = global_message_factory->GetPrototype( + self->message->GetDescriptor()); + self->message = prototype->New(); + self->owner.reset(self->message); + } else { + // Otherwise, we need a mutable child message. + if (AssureWritable(self->parent) == -1) + return -1; + + // Make self->message writable. + google::protobuf::Message* parent_message = self->parent->message; + google::protobuf::Message* mutable_message = GetMutableMessage( + self->parent, + self->parent_field->descriptor); + if (mutable_message == NULL) { + return -1; + } + self->message = mutable_message; + } + self->read_only = false; + + // When a CMessage is made writable its Message pointer is updated + // to point to a new mutable Message. When that happens we need to + // update any references to the old, read-only CMessage. There are + // three places such references occur: RepeatedScalarContainer, + // RepeatedCompositeContainer, and ExtensionDict. + if (self->extensions != NULL) + self->extensions->message = self->message; + if (ForEachCompositeField(self, FixupMessageReference(self->message)) == -1) + return -1; + + return 0; +} + +// --- Globals: + +static PyObject* GetDescriptor(CMessage* self, PyObject* name) { + PyObject* descriptors = + PyDict_GetItem(Py_TYPE(self)->tp_dict, k__descriptors); + if (descriptors == NULL) { + PyErr_SetString(PyExc_TypeError, "No __descriptors"); + return NULL; + } + + return PyDict_GetItem(descriptors, name); +} + +static const google::protobuf::Message* CreateMessage(const char* message_type) { + string message_name(message_type); + const google::protobuf::Descriptor* descriptor = + GetDescriptorPool()->FindMessageTypeByName(message_name); + if (descriptor == NULL) { + PyErr_SetString(PyExc_TypeError, message_type); + return NULL; + } + return global_message_factory->GetPrototype(descriptor); +} + +// If cmessage_list is not NULL, this function releases values into the +// container CMessages instead of just removing. Repeated composite container +// needs to do this to make sure CMessages stay alive if they're still +// referenced after deletion. Repeated scalar container doesn't need to worry. +int InternalDeleteRepeatedField( + google::protobuf::Message* message, + const google::protobuf::FieldDescriptor* field_descriptor, + PyObject* slice, + PyObject* cmessage_list) { + Py_ssize_t length, from, to, step, slice_length; + const google::protobuf::Reflection* reflection = message->GetReflection(); + int min, max; + length = reflection->FieldSize(*message, field_descriptor); + + if (PyInt_Check(slice) || PyLong_Check(slice)) { + from = to = PyLong_AsLong(slice); + if (from < 0) { + from = to = length + from; + } + step = 1; + min = max = from; + + // Range check. + if (from < 0 || from >= length) { + PyErr_Format(PyExc_IndexError, "list assignment index out of range"); + return -1; + } + } else if (PySlice_Check(slice)) { + from = to = step = slice_length = 0; + PySlice_GetIndicesEx( +#if PY_MAJOR_VERSION < 3 + reinterpret_cast(slice), +#else + slice, +#endif + length, &from, &to, &step, &slice_length); + if (from < to) { + min = from; + max = to - 1; + } else { + min = to + 1; + max = from; + } + } else { + PyErr_SetString(PyExc_TypeError, "list indices must be integers"); + return -1; + } + + Py_ssize_t i = from; + std::vector to_delete(length, false); + while (i >= min && i <= max) { + to_delete[i] = true; + i += step; + } + + to = 0; + for (i = 0; i < length; ++i) { + if (!to_delete[i]) { + if (i != to) { + reflection->SwapElements(message, field_descriptor, i, to); + if (cmessage_list != NULL) { + // If a list of cmessages is passed in (i.e. from a repeated + // composite container), swap those as well to correspond to the + // swaps in the underlying message so they're in the right order + // when we start releasing. + PyObject* tmp = PyList_GET_ITEM(cmessage_list, i); + PyList_SET_ITEM(cmessage_list, i, + PyList_GET_ITEM(cmessage_list, to)); + PyList_SET_ITEM(cmessage_list, to, tmp); + } + } + ++to; + } + } + + while (i > to) { + if (cmessage_list == NULL) { + reflection->RemoveLast(message, field_descriptor); + } else { + CMessage* last_cmessage = reinterpret_cast( + PyList_GET_ITEM(cmessage_list, PyList_GET_SIZE(cmessage_list) - 1)); + repeated_composite_container::ReleaseLastTo( + field_descriptor, message, last_cmessage); + if (PySequence_DelItem(cmessage_list, -1) < 0) { + return -1; + } + } + --i; + } + + return 0; +} + +int InitAttributes(CMessage* self, PyObject* arg, PyObject* kwargs) { + ScopedPyObjectPtr descriptor; + if (arg == NULL) { + descriptor.reset( + PyObject_GetAttr(reinterpret_cast(self), kDESCRIPTOR)); + if (descriptor == NULL) { + return NULL; + } + } else { + descriptor.reset(arg); + descriptor.inc(); + } + ScopedPyObjectPtr is_extendable(PyObject_GetAttr(descriptor, kis_extendable)); + if (is_extendable == NULL) { + return NULL; + } + int retcode = PyObject_IsTrue(is_extendable); + if (retcode == -1) { + return NULL; + } + if (retcode) { + PyObject* py_extension_dict = PyObject_CallObject( + reinterpret_cast(&ExtensionDict_Type), NULL); + if (py_extension_dict == NULL) { + return NULL; + } + ExtensionDict* extension_dict = reinterpret_cast( + py_extension_dict); + extension_dict->parent = self; + extension_dict->message = self->message; + self->extensions = extension_dict; + } + + if (kwargs == NULL) { + return 0; + } + + Py_ssize_t pos = 0; + PyObject* name; + PyObject* value; + while (PyDict_Next(kwargs, &pos, &name, &value)) { + if (!PyString_Check(name)) { + PyErr_SetString(PyExc_ValueError, "Field name must be a string"); + return -1; + } + PyObject* py_cdescriptor = GetDescriptor(self, name); + if (py_cdescriptor == NULL) { + PyErr_Format(PyExc_ValueError, "Protocol message has no \"%s\" field.", + PyString_AsString(name)); + return -1; + } + const google::protobuf::FieldDescriptor* descriptor = + reinterpret_cast(py_cdescriptor)->descriptor; + if (descriptor->label() == google::protobuf::FieldDescriptor::LABEL_REPEATED) { + ScopedPyObjectPtr container(GetAttr(self, name)); + if (container == NULL) { + return -1; + } + if (descriptor->cpp_type() == google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { + if (repeated_composite_container::Extend( + reinterpret_cast(container.get()), + value) + == NULL) { + return -1; + } + } else { + if (repeated_scalar_container::Extend( + reinterpret_cast(container.get()), + value) == + NULL) { + return -1; + } + } + } else if (descriptor->cpp_type() == + google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { + ScopedPyObjectPtr message(GetAttr(self, name)); + if (message == NULL) { + return -1; + } + if (MergeFrom(reinterpret_cast(message.get()), + value) == NULL) { + return -1; + } + } else { + if (SetAttr(self, name, value) < 0) { + return -1; + } + } + } + return 0; +} + +static PyObject* New(PyTypeObject* type, PyObject* args, PyObject* kwargs) { + CMessage* self = reinterpret_cast(type->tp_alloc(type, 0)); + if (self == NULL) { + return NULL; + } + + self->message = NULL; + self->parent = NULL; + self->parent_field = NULL; + self->read_only = false; + self->extensions = NULL; + + self->composite_fields = PyDict_New(); + if (self->composite_fields == NULL) { + return NULL; + } + return reinterpret_cast(self); +} + +PyObject* NewEmpty(PyObject* type) { + return New(reinterpret_cast(type), NULL, NULL); +} + +static int Init(CMessage* self, PyObject* args, PyObject* kwargs) { + if (kwargs == NULL) { + // TODO(anuraag): Set error + return -1; + } + + PyObject* descriptor = PyTuple_GetItem(args, 0); + if (descriptor == NULL || PyTuple_Size(args) != 1) { + PyErr_SetString(PyExc_ValueError, "args must contain one arg: descriptor"); + return -1; + } + + ScopedPyObjectPtr py_message_type(PyObject_GetAttr(descriptor, kfull_name)); + if (py_message_type == NULL) { + return -1; + } + + const char* message_type = PyString_AsString(py_message_type.get()); + const google::protobuf::Message* message = CreateMessage(message_type); + if (message == NULL) { + return -1; + } + + self->message = message->New(); + self->owner.reset(self->message); + + if (InitAttributes(self, descriptor, kwargs) < 0) { + return -1; + } + return 0; +} + +// --------------------------------------------------------------------- +// Deallocating a CMessage +// +// Deallocating a CMessage requires that we clear any weak references +// from children to the message being deallocated. + +// Clear the weak reference from the child to the parent. +struct ClearWeakReferences : public ChildVisitor { + int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) { + container->parent = NULL; + // The elements in the container have the same parent as the + // container itself, so NULL out that pointer as well. + const Py_ssize_t n = PyList_GET_SIZE(container->child_messages); + for (Py_ssize_t i = 0; i < n; ++i) { + CMessage* child_cmessage = reinterpret_cast( + PyList_GET_ITEM(container->child_messages, i)); + child_cmessage->parent = NULL; + } + return 0; + } + + int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) { + container->parent = NULL; + return 0; + } + + int VisitCMessage(CMessage* cmessage, + const google::protobuf::FieldDescriptor* field_descriptor) { + cmessage->parent = NULL; + return 0; + } +}; + +static void Dealloc(CMessage* self) { + // Null out all weak references from children to this message. + GOOGLE_CHECK_EQ(0, ForEachCompositeField(self, ClearWeakReferences())); + + Py_CLEAR(self->extensions); + Py_CLEAR(self->composite_fields); + self->owner.reset(); + Py_TYPE(self)->tp_free(reinterpret_cast(self)); +} + +// --------------------------------------------------------------------- + + +PyObject* IsInitialized(CMessage* self, PyObject* args) { + PyObject* errors = NULL; + if (PyArg_ParseTuple(args, "|O", &errors) < 0) { + return NULL; + } + if (self->message->IsInitialized()) { + Py_RETURN_TRUE; + } + if (errors != NULL) { + ScopedPyObjectPtr initialization_errors( + FindInitializationErrors(self)); + if (initialization_errors == NULL) { + return NULL; + } + ScopedPyObjectPtr extend_name(PyString_FromString("extend")); + if (extend_name == NULL) { + return NULL; + } + ScopedPyObjectPtr result(PyObject_CallMethodObjArgs( + errors, + extend_name.get(), + initialization_errors.get(), + NULL)); + if (result == NULL) { + return NULL; + } + } + Py_RETURN_FALSE; +} + +PyObject* HasFieldByDescriptor( + CMessage* self, const google::protobuf::FieldDescriptor* field_descriptor) { + google::protobuf::Message* message = self->message; + if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) { + PyErr_SetString(PyExc_KeyError, + "Field does not belong to message!"); + return NULL; + } + if (field_descriptor->label() == google::protobuf::FieldDescriptor::LABEL_REPEATED) { + PyErr_SetString(PyExc_KeyError, + "Field is repeated. A singular method is required."); + return NULL; + } + bool has_field = + message->GetReflection()->HasField(*message, field_descriptor); + return PyBool_FromLong(has_field ? 1 : 0); +} + +const google::protobuf::FieldDescriptor* FindFieldWithOneofs( + const google::protobuf::Message* message, const char* field_name, bool* in_oneof) { + const google::protobuf::Descriptor* descriptor = message->GetDescriptor(); + const google::protobuf::FieldDescriptor* field_descriptor = + descriptor->FindFieldByName(field_name); + if (field_descriptor == NULL) { + const google::protobuf::OneofDescriptor* oneof_desc = + message->GetDescriptor()->FindOneofByName(field_name); + if (oneof_desc == NULL) { + *in_oneof = false; + return NULL; + } else { + *in_oneof = true; + return message->GetReflection()->GetOneofFieldDescriptor( + *message, oneof_desc); + } + } + return field_descriptor; +} + +PyObject* HasField(CMessage* self, PyObject* arg) { +#if PY_MAJOR_VERSION < 3 + char* field_name; + if (PyString_AsStringAndSize(arg, &field_name, NULL) < 0) { +#else + char* field_name = PyUnicode_AsUTF8(arg); + if (!field_name) { +#endif + return NULL; + } + + google::protobuf::Message* message = self->message; + const google::protobuf::Descriptor* descriptor = message->GetDescriptor(); + bool is_in_oneof; + const google::protobuf::FieldDescriptor* field_descriptor = + FindFieldWithOneofs(message, field_name, &is_in_oneof); + if (field_descriptor == NULL) { + if (!is_in_oneof) { + PyErr_Format(PyExc_ValueError, "Unknown field %s.", field_name); + return NULL; + } else { + Py_RETURN_FALSE; + } + } + + if (field_descriptor->label() == google::protobuf::FieldDescriptor::LABEL_REPEATED) { + PyErr_Format(PyExc_ValueError, + "Protocol message has no singular \"%s\" field.", field_name); + return NULL; + } + + bool has_field = + message->GetReflection()->HasField(*message, field_descriptor); + if (!has_field && field_descriptor->cpp_type() == + google::protobuf::FieldDescriptor::CPPTYPE_ENUM) { + // We may have an invalid enum value stored in the UnknownFieldSet and need + // to check presence in there as well. + const google::protobuf::UnknownFieldSet& unknown_field_set = + message->GetReflection()->GetUnknownFields(*message); + for (int i = 0; i < unknown_field_set.field_count(); ++i) { + if (unknown_field_set.field(i).number() == field_descriptor->number()) { + Py_RETURN_TRUE; + } + } + Py_RETURN_FALSE; + } + return PyBool_FromLong(has_field ? 1 : 0); +} + +PyObject* ClearExtension(CMessage* self, PyObject* arg) { + if (self->extensions != NULL) { + return extension_dict::ClearExtension(self->extensions, arg); + } + PyErr_SetString(PyExc_TypeError, "Message is not extendable"); + return NULL; +} + +PyObject* HasExtension(CMessage* self, PyObject* arg) { + if (self->extensions != NULL) { + return extension_dict::HasExtension(self->extensions, arg); + } + PyErr_SetString(PyExc_TypeError, "Message is not extendable"); + return NULL; +} + +// --------------------------------------------------------------------- +// Releasing messages +// +// The Python API's ClearField() and Clear() methods behave +// differently than their C++ counterparts. While the C++ versions +// clears the children the Python versions detaches the children, +// without touching their content. This impedance mismatch causes +// some complexity in the implementation, which is captured in this +// section. +// +// When a CMessage field is cleared we need to: +// +// * Release the Message used as the backing store for the CMessage +// from its parent. +// +// * Change the owner field of the released CMessage and all of its +// children to point to the newly released Message. +// +// * Clear the weak references from the released CMessage to the +// parent. +// +// When a RepeatedCompositeContainer field is cleared we need to: +// +// * Release all the Message used as the backing store for the +// CMessages stored in the container. +// +// * Change the owner field of all the released CMessage and all of +// their children to point to the newly released Messages. +// +// * Clear the weak references from the released container to the +// parent. + +struct SetOwnerVisitor : public ChildVisitor { + // new_owner must outlive this object. + explicit SetOwnerVisitor(const shared_ptr& new_owner) + : new_owner_(new_owner) {} + + int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) { + repeated_composite_container::SetOwner(container, new_owner_); + return 0; + } + + int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) { + repeated_scalar_container::SetOwner(container, new_owner_); + return 0; + } + + int VisitCMessage(CMessage* cmessage, + const google::protobuf::FieldDescriptor* field_descriptor) { + return SetOwner(cmessage, new_owner_); + } + + private: + const shared_ptr& new_owner_; +}; + +// Change the owner of this CMessage and all its children, recursively. +int SetOwner(CMessage* self, const shared_ptr& new_owner) { + self->owner = new_owner; + if (ForEachCompositeField(self, SetOwnerVisitor(new_owner)) == -1) + return -1; + return 0; +} + +// Releases the message specified by 'field' and returns the +// pointer. If the field does not exist a new message is created using +// 'descriptor'. The caller takes ownership of the returned pointer. +Message* ReleaseMessage(google::protobuf::Message* message, + const google::protobuf::Descriptor* descriptor, + const google::protobuf::FieldDescriptor* field_descriptor) { + Message* released_message = message->GetReflection()->ReleaseMessage( + message, field_descriptor, global_message_factory); + // ReleaseMessage will return NULL which differs from + // child_cmessage->message, if the field does not exist. In this case, + // the latter points to the default instance via a const_cast<>, so we + // have to reset it to a new mutable object since we are taking ownership. + if (released_message == NULL) { + const Message* prototype = global_message_factory->GetPrototype( + descriptor); + GOOGLE_DCHECK(prototype != NULL); + released_message = prototype->New(); + } + + return released_message; +} + +int ReleaseSubMessage(google::protobuf::Message* message, + const google::protobuf::FieldDescriptor* field_descriptor, + CMessage* child_cmessage) { + // Release the Message + shared_ptr released_message(ReleaseMessage( + message, child_cmessage->message->GetDescriptor(), field_descriptor)); + child_cmessage->message = released_message.get(); + child_cmessage->owner.swap(released_message); + child_cmessage->parent = NULL; + child_cmessage->parent_field = NULL; + child_cmessage->read_only = false; + return ForEachCompositeField(child_cmessage, + SetOwnerVisitor(child_cmessage->owner)); +} + +struct ReleaseChild : public ChildVisitor { + // message must outlive this object. + explicit ReleaseChild(google::protobuf::Message* parent_message) : + parent_message_(parent_message) {} + + int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) { + return repeated_composite_container::Release( + reinterpret_cast(container)); + } + + int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) { + return repeated_scalar_container::Release( + reinterpret_cast(container)); + } + + int VisitCMessage(CMessage* cmessage, + const google::protobuf::FieldDescriptor* field_descriptor) { + return ReleaseSubMessage(parent_message_, field_descriptor, + reinterpret_cast(cmessage)); + } + + google::protobuf::Message* parent_message_; +}; + +int InternalReleaseFieldByDescriptor( + const google::protobuf::FieldDescriptor* field_descriptor, + PyObject* composite_field, + google::protobuf::Message* parent_message) { + return VisitCompositeField( + field_descriptor, + composite_field, + ReleaseChild(parent_message)); +} + +int InternalReleaseField(CMessage* self, PyObject* composite_field, + PyObject* name) { + PyObject* cdescriptor = GetDescriptor(self, name); + if (cdescriptor != NULL) { + const google::protobuf::FieldDescriptor* descriptor = + reinterpret_cast(cdescriptor)->descriptor; + return InternalReleaseFieldByDescriptor( + descriptor, composite_field, self->message); + } + + return 0; +} + +PyObject* ClearFieldByDescriptor( + CMessage* self, + const google::protobuf::FieldDescriptor* descriptor) { + if (!FIELD_BELONGS_TO_MESSAGE(descriptor, self->message)) { + PyErr_SetString(PyExc_KeyError, + "Field does not belong to message!"); + return NULL; + } + AssureWritable(self); + self->message->GetReflection()->ClearField(self->message, descriptor); + Py_RETURN_NONE; +} + +PyObject* ClearField(CMessage* self, PyObject* arg) { + char* field_name; + if (!PyString_Check(arg)) { + PyErr_SetString(PyExc_TypeError, "field name must be a string"); + return NULL; + } +#if PY_MAJOR_VERSION < 3 + if (PyString_AsStringAndSize(arg, &field_name, NULL) < 0) { + return NULL; + } +#else + field_name = PyUnicode_AsUTF8(arg); +#endif + AssureWritable(self); + google::protobuf::Message* message = self->message; + const google::protobuf::Descriptor* descriptor = message->GetDescriptor(); + ScopedPyObjectPtr arg_in_oneof; + bool is_in_oneof; + const google::protobuf::FieldDescriptor* field_descriptor = + FindFieldWithOneofs(message, field_name, &is_in_oneof); + if (field_descriptor == NULL) { + if (!is_in_oneof) { + PyErr_Format(PyExc_ValueError, + "Protocol message has no \"%s\" field.", field_name); + return NULL; + } else { + Py_RETURN_NONE; + } + } else if (is_in_oneof) { + arg_in_oneof.reset(PyString_FromString(field_descriptor->name().c_str())); + arg = arg_in_oneof.get(); + } + + PyObject* composite_field = PyDict_GetItem(self->composite_fields, + arg); + + // Only release the field if there's a possibility that there are + // references to it. + if (composite_field != NULL) { + if (InternalReleaseField(self, composite_field, arg) < 0) { + return NULL; + } + PyDict_DelItem(self->composite_fields, arg); + } + message->GetReflection()->ClearField(message, field_descriptor); + if (field_descriptor->cpp_type() == google::protobuf::FieldDescriptor::CPPTYPE_ENUM) { + google::protobuf::UnknownFieldSet* unknown_field_set = + message->GetReflection()->MutableUnknownFields(message); + unknown_field_set->DeleteByNumber(field_descriptor->number()); + } + + Py_RETURN_NONE; +} + +PyObject* Clear(CMessage* self) { + AssureWritable(self); + if (ForEachCompositeField(self, ReleaseChild(self->message)) == -1) + return NULL; + + // The old ExtensionDict still aliases this CMessage, but all its + // fields have been released. + if (self->extensions != NULL) { + Py_CLEAR(self->extensions); + PyObject* py_extension_dict = PyObject_CallObject( + reinterpret_cast(&ExtensionDict_Type), NULL); + if (py_extension_dict == NULL) { + return NULL; + } + ExtensionDict* extension_dict = reinterpret_cast( + py_extension_dict); + extension_dict->parent = self; + extension_dict->message = self->message; + self->extensions = extension_dict; + } + PyDict_Clear(self->composite_fields); + self->message->Clear(); + Py_RETURN_NONE; +} + +// --------------------------------------------------------------------- + +static string GetMessageName(CMessage* self) { + if (self->parent_field != NULL) { + return self->parent_field->descriptor->full_name(); + } else { + return self->message->GetDescriptor()->full_name(); + } +} + +static PyObject* SerializeToString(CMessage* self, PyObject* args) { + if (!self->message->IsInitialized()) { + ScopedPyObjectPtr errors(FindInitializationErrors(self)); + if (errors == NULL) { + return NULL; + } + ScopedPyObjectPtr comma(PyString_FromString(",")); + if (comma == NULL) { + return NULL; + } + ScopedPyObjectPtr joined( + PyObject_CallMethod(comma.get(), "join", "O", errors.get())); + if (joined == NULL) { + return NULL; + } + PyErr_Format(EncodeError_class, "Message %s is missing required fields: %s", + GetMessageName(self).c_str(), PyString_AsString(joined.get())); + return NULL; + } + int size = self->message->ByteSize(); + if (size <= 0) { + return PyBytes_FromString(""); + } + PyObject* result = PyBytes_FromStringAndSize(NULL, size); + if (result == NULL) { + return NULL; + } + char* buffer = PyBytes_AS_STRING(result); + self->message->SerializeWithCachedSizesToArray( + reinterpret_cast(buffer)); + return result; +} + +static PyObject* SerializePartialToString(CMessage* self) { + string contents; + self->message->SerializePartialToString(&contents); + return PyBytes_FromStringAndSize(contents.c_str(), contents.size()); +} + +// Formats proto fields for ascii dumps using python formatting functions where +// appropriate. +class PythonFieldValuePrinter : public google::protobuf::TextFormat::FieldValuePrinter { + public: + PythonFieldValuePrinter() : float_holder_(PyFloat_FromDouble(0)) {} + + // Python has some differences from C++ when printing floating point numbers. + // + // 1) Trailing .0 is always printed. + // 2) Outputted is rounded to 12 digits. + // + // We override floating point printing with the C-API function for printing + // Python floats to ensure consistency. + string PrintFloat(float value) const { return PrintDouble(value); } + string PrintDouble(double value) const { + reinterpret_cast(float_holder_.get())->ob_fval = value; + ScopedPyObjectPtr s(PyObject_Str(float_holder_.get())); + if (s == NULL) return string(); +#if PY_MAJOR_VERSION < 3 + char *cstr = PyBytes_AS_STRING(static_cast(s)); +#else + char *cstr = PyUnicode_AsUTF8(s); +#endif + return string(cstr); + } + + private: + // Holder for a python float object which we use to allow us to use + // the Python API for printing doubles. We initialize once and then + // directly modify it for every float printed to save on allocations + // and refcounting. + ScopedPyObjectPtr float_holder_; +}; + +static PyObject* ToStr(CMessage* self) { + google::protobuf::TextFormat::Printer printer; + // Passes ownership + printer.SetDefaultFieldValuePrinter(new PythonFieldValuePrinter()); + printer.SetHideUnknownFields(true); + string output; + if (!printer.PrintToString(*self->message, &output)) { + PyErr_SetString(PyExc_ValueError, "Unable to convert message to str"); + return NULL; + } + return PyString_FromString(output.c_str()); +} + +PyObject* MergeFrom(CMessage* self, PyObject* arg) { + CMessage* other_message; + if (!PyObject_TypeCheck(reinterpret_cast(arg), &CMessage_Type)) { + PyErr_SetString(PyExc_TypeError, "Must be a message"); + return NULL; + } + + other_message = reinterpret_cast(arg); + if (other_message->message->GetDescriptor() != + self->message->GetDescriptor()) { + PyErr_Format(PyExc_TypeError, + "Tried to merge from a message with a different type. " + "to: %s, from: %s", + self->message->GetDescriptor()->full_name().c_str(), + other_message->message->GetDescriptor()->full_name().c_str()); + return NULL; + } + AssureWritable(self); + + // TODO(tibell): Message::MergeFrom might turn some child Messages + // into mutable messages, invalidating the message field in the + // corresponding CMessages. We should run a FixupMessageReferences + // pass here. + + self->message->MergeFrom(*other_message->message); + Py_RETURN_NONE; +} + +static PyObject* CopyFrom(CMessage* self, PyObject* arg) { + CMessage* other_message; + if (!PyObject_TypeCheck(reinterpret_cast(arg), &CMessage_Type)) { + PyErr_SetString(PyExc_TypeError, "Must be a message"); + return NULL; + } + + other_message = reinterpret_cast(arg); + + if (self == other_message) { + Py_RETURN_NONE; + } + + if (other_message->message->GetDescriptor() != + self->message->GetDescriptor()) { + PyErr_Format(PyExc_TypeError, + "Tried to copy from a message with a different type. " + "to: %s, from: %s", + self->message->GetDescriptor()->full_name().c_str(), + other_message->message->GetDescriptor()->full_name().c_str()); + return NULL; + } + + AssureWritable(self); + + // CopyFrom on the message will not clean up self->composite_fields, + // which can leave us in an inconsistent state, so clear it out here. + Clear(self); + + self->message->CopyFrom(*other_message->message); + + Py_RETURN_NONE; +} + +static PyObject* MergeFromString(CMessage* self, PyObject* arg) { + const void* data; + Py_ssize_t data_length; + if (PyObject_AsReadBuffer(arg, &data, &data_length) < 0) { + return NULL; + } + + AssureWritable(self); + google::protobuf::io::CodedInputStream input( + reinterpret_cast(data), data_length); + input.SetExtensionRegistry(GetDescriptorPool(), global_message_factory); + bool success = self->message->MergePartialFromCodedStream(&input); + if (success) { + return PyInt_FromLong(input.CurrentPosition()); + } else { + PyErr_Format(DecodeError_class, "Error parsing message"); + return NULL; + } +} + +static PyObject* ParseFromString(CMessage* self, PyObject* arg) { + if (Clear(self) == NULL) { + return NULL; + } + return MergeFromString(self, arg); +} + +static PyObject* ByteSize(CMessage* self, PyObject* args) { + return PyLong_FromLong(self->message->ByteSize()); +} + +static PyObject* RegisterExtension(PyObject* cls, + PyObject* extension_handle) { + ScopedPyObjectPtr message_descriptor(PyObject_GetAttr(cls, kDESCRIPTOR)); + if (message_descriptor == NULL) { + return NULL; + } + if (PyObject_SetAttrString(extension_handle, "containing_type", + message_descriptor) < 0) { + return NULL; + } + ScopedPyObjectPtr extensions_by_name( + PyObject_GetAttr(cls, k_extensions_by_name)); + if (extensions_by_name == NULL) { + PyErr_SetString(PyExc_TypeError, "no extensions_by_name on class"); + return NULL; + } + ScopedPyObjectPtr full_name(PyObject_GetAttr(extension_handle, kfull_name)); + if (full_name == NULL) { + return NULL; + } + if (PyDict_SetItem(extensions_by_name, full_name, extension_handle) < 0) { + return NULL; + } + + // Also store a mapping from extension number to implementing class. + ScopedPyObjectPtr extensions_by_number( + PyObject_GetAttr(cls, k_extensions_by_number)); + if (extensions_by_number == NULL) { + PyErr_SetString(PyExc_TypeError, "no extensions_by_number on class"); + return NULL; + } + ScopedPyObjectPtr number(PyObject_GetAttrString(extension_handle, "number")); + if (number == NULL) { + return NULL; + } + if (PyDict_SetItem(extensions_by_number, number, extension_handle) < 0) { + return NULL; + } + + CFieldDescriptor* cdescriptor = + extension_dict::InternalGetCDescriptorFromExtension(extension_handle); + ScopedPyObjectPtr py_cdescriptor(reinterpret_cast(cdescriptor)); + if (cdescriptor == NULL) { + return NULL; + } + Py_INCREF(extension_handle); + cdescriptor->descriptor_field = extension_handle; + const google::protobuf::FieldDescriptor* descriptor = cdescriptor->descriptor; + // Check if it's a message set + if (descriptor->is_extension() && + descriptor->containing_type()->options().message_set_wire_format() && + descriptor->type() == google::protobuf::FieldDescriptor::TYPE_MESSAGE && + descriptor->message_type() == descriptor->extension_scope() && + descriptor->label() == google::protobuf::FieldDescriptor::LABEL_OPTIONAL) { + ScopedPyObjectPtr message_name(PyString_FromStringAndSize( + descriptor->message_type()->full_name().c_str(), + descriptor->message_type()->full_name().size())); + if (message_name == NULL) { + return NULL; + } + PyDict_SetItem(extensions_by_name, message_name, extension_handle); + } + + Py_RETURN_NONE; +} + +static PyObject* SetInParent(CMessage* self, PyObject* args) { + AssureWritable(self); + Py_RETURN_NONE; +} + +static PyObject* WhichOneof(CMessage* self, PyObject* arg) { + char* oneof_name; + if (!PyString_Check(arg)) { + PyErr_SetString(PyExc_TypeError, "field name must be a string"); + return NULL; + } + oneof_name = PyString_AsString(arg); + if (oneof_name == NULL) { + return NULL; + } + const google::protobuf::OneofDescriptor* oneof_desc = + self->message->GetDescriptor()->FindOneofByName(oneof_name); + if (oneof_desc == NULL) { + PyErr_Format(PyExc_ValueError, + "Protocol message has no oneof \"%s\" field.", oneof_name); + return NULL; + } + const google::protobuf::FieldDescriptor* field_in_oneof = + self->message->GetReflection()->GetOneofFieldDescriptor( + *self->message, oneof_desc); + if (field_in_oneof == NULL) { + Py_RETURN_NONE; + } else { + return PyString_FromString(field_in_oneof->name().c_str()); + } +} + +static PyObject* ListFields(CMessage* self) { + vector fields; + self->message->GetReflection()->ListFields(*self->message, &fields); + + PyObject* descriptor = PyDict_GetItem(Py_TYPE(self)->tp_dict, kDESCRIPTOR); + if (descriptor == NULL) { + return NULL; + } + ScopedPyObjectPtr fields_by_name( + PyObject_GetAttr(descriptor, kfields_by_name)); + if (fields_by_name == NULL) { + return NULL; + } + ScopedPyObjectPtr extensions_by_name(PyObject_GetAttr( + reinterpret_cast(Py_TYPE(self)), k_extensions_by_name)); + if (extensions_by_name == NULL) { + PyErr_SetString(PyExc_ValueError, "no extensionsbyname"); + return NULL; + } + // Normally, the list will be exactly the size of the fields. + PyObject* all_fields = PyList_New(fields.size()); + if (all_fields == NULL) { + return NULL; + } + + // When there are unknown extensions, the py list will *not* contain + // the field information. Thus the actual size of the py list will be + // smaller than the size of fields. Set the actual size at the end. + Py_ssize_t actual_size = 0; + for (Py_ssize_t i = 0; i < fields.size(); ++i) { + ScopedPyObjectPtr t(PyTuple_New(2)); + if (t == NULL) { + Py_DECREF(all_fields); + return NULL; + } + + if (fields[i]->is_extension()) { + const string& field_name = fields[i]->full_name(); + PyObject* extension_field = PyDict_GetItemString(extensions_by_name, + field_name.c_str()); + if (extension_field == NULL) { + // If we couldn't fetch extension_field, it means the module that + // defines this extension has not been explicitly imported in Python + // code, and the extension hasn't been registered. There's nothing much + // we can do about this, so just skip it in the output to match the + // behavior of the python implementation. + continue; + } + PyObject* extensions = reinterpret_cast(self->extensions); + if (extensions == NULL) { + Py_DECREF(all_fields); + return NULL; + } + // 'extension' reference later stolen by PyTuple_SET_ITEM. + PyObject* extension = PyObject_GetItem(extensions, extension_field); + if (extension == NULL) { + Py_DECREF(all_fields); + return NULL; + } + Py_INCREF(extension_field); + PyTuple_SET_ITEM(t.get(), 0, extension_field); + // Steals reference to 'extension' + PyTuple_SET_ITEM(t.get(), 1, extension); + } else { + const string& field_name = fields[i]->name(); + ScopedPyObjectPtr py_field_name(PyString_FromStringAndSize( + field_name.c_str(), field_name.length())); + if (py_field_name == NULL) { + PyErr_SetString(PyExc_ValueError, "bad string"); + Py_DECREF(all_fields); + return NULL; + } + PyObject* field_descriptor = + PyDict_GetItem(fields_by_name, py_field_name); + if (field_descriptor == NULL) { + Py_DECREF(all_fields); + return NULL; + } + + PyObject* field_value = GetAttr(self, py_field_name); + if (field_value == NULL) { + PyErr_SetObject(PyExc_ValueError, py_field_name); + Py_DECREF(all_fields); + return NULL; + } + Py_INCREF(field_descriptor); + PyTuple_SET_ITEM(t.get(), 0, field_descriptor); + PyTuple_SET_ITEM(t.get(), 1, field_value); + } + PyList_SET_ITEM(all_fields, actual_size, t.release()); + ++actual_size; + } + Py_SIZE(all_fields) = actual_size; + return all_fields; +} + +PyObject* FindInitializationErrors(CMessage* self) { + google::protobuf::Message* message = self->message; + vector errors; + message->FindInitializationErrors(&errors); + + PyObject* error_list = PyList_New(errors.size()); + if (error_list == NULL) { + return NULL; + } + for (Py_ssize_t i = 0; i < errors.size(); ++i) { + const string& error = errors[i]; + PyObject* error_string = PyString_FromStringAndSize( + error.c_str(), error.length()); + if (error_string == NULL) { + Py_DECREF(error_list); + return NULL; + } + PyList_SET_ITEM(error_list, i, error_string); + } + return error_list; +} + +static PyObject* RichCompare(CMessage* self, PyObject* other, int opid) { + if (!PyObject_TypeCheck(other, &CMessage_Type)) { + if (opid == Py_EQ) { + Py_RETURN_FALSE; + } else if (opid == Py_NE) { + Py_RETURN_TRUE; + } + } + if (opid == Py_EQ || opid == Py_NE) { + ScopedPyObjectPtr self_fields(ListFields(self)); + ScopedPyObjectPtr other_fields(ListFields( + reinterpret_cast(other))); + return PyObject_RichCompare(self_fields, other_fields, opid); + } else { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } +} + +PyObject* InternalGetScalar( + CMessage* self, + const google::protobuf::FieldDescriptor* field_descriptor) { + google::protobuf::Message* message = self->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + + if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) { + PyErr_SetString( + PyExc_KeyError, "Field does not belong to message!"); + return NULL; + } + + PyObject* result = NULL; + switch (field_descriptor->cpp_type()) { + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: { + int32 value = reflection->GetInt32(*message, field_descriptor); + result = PyInt_FromLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: { + int64 value = reflection->GetInt64(*message, field_descriptor); + result = PyLong_FromLongLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: { + uint32 value = reflection->GetUInt32(*message, field_descriptor); + result = PyInt_FromSize_t(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: { + uint64 value = reflection->GetUInt64(*message, field_descriptor); + result = PyLong_FromUnsignedLongLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: { + float value = reflection->GetFloat(*message, field_descriptor); + result = PyFloat_FromDouble(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: { + double value = reflection->GetDouble(*message, field_descriptor); + result = PyFloat_FromDouble(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: { + bool value = reflection->GetBool(*message, field_descriptor); + result = PyBool_FromLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: { + string value = reflection->GetString(*message, field_descriptor); + result = ToStringObject(field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: { + if (!message->GetReflection()->HasField(*message, field_descriptor)) { + // Look for the value in the unknown fields. + google::protobuf::UnknownFieldSet* unknown_field_set = + message->GetReflection()->MutableUnknownFields(message); + for (int i = 0; i < unknown_field_set->field_count(); ++i) { + if (unknown_field_set->field(i).number() == + field_descriptor->number()) { + result = PyInt_FromLong(unknown_field_set->field(i).varint()); + break; + } + } + } + + if (result == NULL) { + const google::protobuf::EnumValueDescriptor* enum_value = + message->GetReflection()->GetEnum(*message, field_descriptor); + result = PyInt_FromLong(enum_value->number()); + } + break; + } + default: + PyErr_Format( + PyExc_SystemError, "Getting a value from a field of unknown type %d", + field_descriptor->cpp_type()); + } + + return result; +} + +PyObject* InternalGetSubMessage(CMessage* self, + CFieldDescriptor* cfield_descriptor) { + PyObject* field = cfield_descriptor->descriptor_field; + ScopedPyObjectPtr message_type(PyObject_GetAttr(field, kmessage_type)); + if (message_type == NULL) { + return NULL; + } + ScopedPyObjectPtr concrete_class( + PyObject_GetAttr(message_type, k_concrete_class)); + if (concrete_class == NULL) { + return NULL; + } + PyObject* py_cmsg = cmessage::NewEmpty(concrete_class); + if (py_cmsg == NULL) { + return NULL; + } + if (!PyObject_TypeCheck(py_cmsg, &CMessage_Type)) { + PyErr_SetString(PyExc_TypeError, "Not a CMessage!"); + } + CMessage* cmsg = reinterpret_cast(py_cmsg); + + const google::protobuf::FieldDescriptor* field_descriptor = + cfield_descriptor->descriptor; + const google::protobuf::Reflection* reflection = self->message->GetReflection(); + const google::protobuf::Message& sub_message = reflection->GetMessage( + *self->message, field_descriptor, global_message_factory); + cmsg->owner = self->owner; + cmsg->parent = self; + cmsg->parent_field = cfield_descriptor; + cmsg->read_only = !reflection->HasField(*self->message, field_descriptor); + cmsg->message = const_cast(&sub_message); + + if (InitAttributes(cmsg, NULL, NULL) < 0) { + Py_DECREF(py_cmsg); + return NULL; + } + return py_cmsg; +} + +int InternalSetScalar( + CMessage* self, + const google::protobuf::FieldDescriptor* field_descriptor, + PyObject* arg) { + google::protobuf::Message* message = self->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + + if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) { + PyErr_SetString( + PyExc_KeyError, "Field does not belong to message!"); + return -1; + } + + if (MaybeReleaseOverlappingOneofField(self, field_descriptor) < 0) { + return -1; + } + + switch (field_descriptor->cpp_type()) { + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: { + GOOGLE_CHECK_GET_INT32(arg, value, -1); + reflection->SetInt32(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: { + GOOGLE_CHECK_GET_INT64(arg, value, -1); + reflection->SetInt64(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: { + GOOGLE_CHECK_GET_UINT32(arg, value, -1); + reflection->SetUInt32(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: { + GOOGLE_CHECK_GET_UINT64(arg, value, -1); + reflection->SetUInt64(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: { + GOOGLE_CHECK_GET_FLOAT(arg, value, -1); + reflection->SetFloat(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: { + GOOGLE_CHECK_GET_DOUBLE(arg, value, -1); + reflection->SetDouble(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: { + GOOGLE_CHECK_GET_BOOL(arg, value, -1); + reflection->SetBool(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: { + if (!CheckAndSetString( + arg, message, field_descriptor, reflection, false, -1)) { + return -1; + } + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: { + GOOGLE_CHECK_GET_INT32(arg, value, -1); + const google::protobuf::EnumDescriptor* enum_descriptor = + field_descriptor->enum_type(); + const google::protobuf::EnumValueDescriptor* enum_value = + enum_descriptor->FindValueByNumber(value); + if (enum_value != NULL) { + reflection->SetEnum(message, field_descriptor, enum_value); + } else { + PyErr_Format(PyExc_ValueError, "Unknown enum value: %d", value); + return -1; + } + break; + } + default: + PyErr_Format( + PyExc_SystemError, "Setting value to a field of unknown type %d", + field_descriptor->cpp_type()); + return -1; + } + + return 0; +} + +PyObject* FromString(PyTypeObject* cls, PyObject* serialized) { + PyObject* py_cmsg = PyObject_CallObject( + reinterpret_cast(cls), NULL); + if (py_cmsg == NULL) { + return NULL; + } + CMessage* cmsg = reinterpret_cast(py_cmsg); + + ScopedPyObjectPtr py_length(MergeFromString(cmsg, serialized)); + if (py_length == NULL) { + Py_DECREF(py_cmsg); + return NULL; + } + + if (InitAttributes(cmsg, NULL, NULL) < 0) { + Py_DECREF(py_cmsg); + return NULL; + } + return py_cmsg; +} + +static PyObject* AddDescriptors(PyTypeObject* cls, + PyObject* descriptor) { + if (PyObject_SetAttr(reinterpret_cast(cls), + k_extensions_by_name, PyDict_New()) < 0) { + return NULL; + } + if (PyObject_SetAttr(reinterpret_cast(cls), + k_extensions_by_number, PyDict_New()) < 0) { + return NULL; + } + + ScopedPyObjectPtr field_descriptors(PyDict_New()); + + ScopedPyObjectPtr fields(PyObject_GetAttrString(descriptor, "fields")); + if (fields == NULL) { + return NULL; + } + + ScopedPyObjectPtr _NUMBER_string(PyString_FromString("_FIELD_NUMBER")); + if (_NUMBER_string == NULL) { + return NULL; + } + + const Py_ssize_t fields_size = PyList_GET_SIZE(fields.get()); + for (int i = 0; i < fields_size; ++i) { + PyObject* field = PyList_GET_ITEM(fields.get(), i); + ScopedPyObjectPtr field_name(PyObject_GetAttr(field, kname)); + ScopedPyObjectPtr full_field_name(PyObject_GetAttr(field, kfull_name)); + if (field_name == NULL || full_field_name == NULL) { + PyErr_SetString(PyExc_TypeError, "Name is null"); + return NULL; + } + + PyObject* field_descriptor = + cdescriptor_pool::FindFieldByName(descriptor_pool, full_field_name); + if (field_descriptor == NULL) { + PyErr_SetString(PyExc_TypeError, "Couldn't find field"); + return NULL; + } + Py_INCREF(field); + CFieldDescriptor* cfield_descriptor = reinterpret_cast( + field_descriptor); + cfield_descriptor->descriptor_field = field; + if (PyDict_SetItem(field_descriptors, field_name, field_descriptor) < 0) { + return NULL; + } + + // The FieldDescriptor's name field might either be of type bytes or + // of type unicode, depending on whether the FieldDescriptor was + // parsed from a serialized message or read from the + // _pb2.py module. + ScopedPyObjectPtr field_name_upcased( + PyObject_CallMethod(field_name, "upper", NULL)); + if (field_name_upcased == NULL) { + return NULL; + } + + ScopedPyObjectPtr field_number_name(PyObject_CallMethod( + field_name_upcased, "__add__", "(O)", _NUMBER_string.get())); + if (field_number_name == NULL) { + return NULL; + } + + ScopedPyObjectPtr number(PyInt_FromLong( + cfield_descriptor->descriptor->number())); + if (number == NULL) { + return NULL; + } + if (PyObject_SetAttr(reinterpret_cast(cls), + field_number_name, number) == -1) { + return NULL; + } + } + + PyDict_SetItem(cls->tp_dict, k__descriptors, field_descriptors); + + // Enum Values + ScopedPyObjectPtr enum_types(PyObject_GetAttrString(descriptor, + "enum_types")); + if (enum_types == NULL) { + return NULL; + } + ScopedPyObjectPtr type_iter(PyObject_GetIter(enum_types)); + if (type_iter == NULL) { + return NULL; + } + ScopedPyObjectPtr enum_type; + while ((enum_type.reset(PyIter_Next(type_iter))) != NULL) { + ScopedPyObjectPtr wrapped(PyObject_CallFunctionObjArgs( + EnumTypeWrapper_class, enum_type.get(), NULL)); + if (wrapped == NULL) { + return NULL; + } + ScopedPyObjectPtr enum_name(PyObject_GetAttr(enum_type, kname)); + if (enum_name == NULL) { + return NULL; + } + if (PyObject_SetAttr(reinterpret_cast(cls), + enum_name, wrapped) == -1) { + return NULL; + } + + ScopedPyObjectPtr enum_values(PyObject_GetAttrString(enum_type, "values")); + if (enum_values == NULL) { + return NULL; + } + ScopedPyObjectPtr values_iter(PyObject_GetIter(enum_values)); + if (values_iter == NULL) { + return NULL; + } + ScopedPyObjectPtr enum_value; + while ((enum_value.reset(PyIter_Next(values_iter))) != NULL) { + ScopedPyObjectPtr value_name(PyObject_GetAttr(enum_value, kname)); + if (value_name == NULL) { + return NULL; + } + ScopedPyObjectPtr value_number(PyObject_GetAttrString(enum_value, + "number")); + if (value_number == NULL) { + return NULL; + } + if (PyObject_SetAttr(reinterpret_cast(cls), + value_name, value_number) == -1) { + return NULL; + } + } + if (PyErr_Occurred()) { // If PyIter_Next failed + return NULL; + } + } + if (PyErr_Occurred()) { // If PyIter_Next failed + return NULL; + } + + ScopedPyObjectPtr extension_dict( + PyObject_GetAttr(descriptor, kextensions_by_name)); + if (extension_dict == NULL || !PyDict_Check(extension_dict)) { + PyErr_SetString(PyExc_TypeError, "extensions_by_name not a dict"); + return NULL; + } + Py_ssize_t pos = 0; + PyObject* extension_name; + PyObject* extension_field; + + while (PyDict_Next(extension_dict, &pos, &extension_name, &extension_field)) { + if (PyObject_SetAttr(reinterpret_cast(cls), + extension_name, extension_field) == -1) { + return NULL; + } + ScopedPyObjectPtr py_cfield_descriptor( + PyObject_GetAttrString(extension_field, "_cdescriptor")); + if (py_cfield_descriptor == NULL) { + return NULL; + } + CFieldDescriptor* cfield_descriptor = + reinterpret_cast(py_cfield_descriptor.get()); + Py_INCREF(extension_field); + cfield_descriptor->descriptor_field = extension_field; + + ScopedPyObjectPtr field_name_upcased( + PyObject_CallMethod(extension_name, "upper", NULL)); + if (field_name_upcased == NULL) { + return NULL; + } + ScopedPyObjectPtr field_number_name(PyObject_CallMethod( + field_name_upcased, "__add__", "(O)", _NUMBER_string.get())); + if (field_number_name == NULL) { + return NULL; + } + ScopedPyObjectPtr number(PyInt_FromLong( + cfield_descriptor->descriptor->number())); + if (number == NULL) { + return NULL; + } + if (PyObject_SetAttr(reinterpret_cast(cls), + field_number_name, PyInt_FromLong( + cfield_descriptor->descriptor->number())) == -1) { + return NULL; + } + } + + Py_RETURN_NONE; +} + +PyObject* DeepCopy(CMessage* self, PyObject* arg) { + PyObject* clone = PyObject_CallObject( + reinterpret_cast(Py_TYPE(self)), NULL); + if (clone == NULL) { + return NULL; + } + if (!PyObject_TypeCheck(clone, &CMessage_Type)) { + Py_DECREF(clone); + return NULL; + } + if (InitAttributes(reinterpret_cast(clone), NULL, NULL) < 0) { + Py_DECREF(clone); + return NULL; + } + if (MergeFrom(reinterpret_cast(clone), + reinterpret_cast(self)) == NULL) { + Py_DECREF(clone); + return NULL; + } + return clone; +} + +PyObject* ToUnicode(CMessage* self) { + // Lazy import to prevent circular dependencies + ScopedPyObjectPtr text_format( + PyImport_ImportModule("google.protobuf.text_format")); + if (text_format == NULL) { + return NULL; + } + ScopedPyObjectPtr method_name(PyString_FromString("MessageToString")); + if (method_name == NULL) { + return NULL; + } + Py_INCREF(Py_True); + ScopedPyObjectPtr encoded(PyObject_CallMethodObjArgs(text_format, method_name, + self, Py_True, NULL)); + Py_DECREF(Py_True); + if (encoded == NULL) { + return NULL; + } +#if PY_MAJOR_VERSION < 3 + PyObject* decoded = PyString_AsDecodedObject(encoded, "utf-8", NULL); +#else + PyObject* decoded = PyUnicode_FromEncodedObject(encoded, "utf-8", NULL); +#endif + if (decoded == NULL) { + return NULL; + } + return decoded; +} + +PyObject* Reduce(CMessage* self) { + ScopedPyObjectPtr constructor(reinterpret_cast(Py_TYPE(self))); + constructor.inc(); + ScopedPyObjectPtr args(PyTuple_New(0)); + if (args == NULL) { + return NULL; + } + ScopedPyObjectPtr state(PyDict_New()); + if (state == NULL) { + return NULL; + } + ScopedPyObjectPtr serialized(SerializePartialToString(self)); + if (serialized == NULL) { + return NULL; + } + if (PyDict_SetItemString(state, "serialized", serialized) < 0) { + return NULL; + } + return Py_BuildValue("OOO", constructor.get(), args.get(), state.get()); +} + +PyObject* SetState(CMessage* self, PyObject* state) { + if (!PyDict_Check(state)) { + PyErr_SetString(PyExc_TypeError, "state not a dict"); + return NULL; + } + PyObject* serialized = PyDict_GetItemString(state, "serialized"); + if (serialized == NULL) { + return NULL; + } + if (ParseFromString(self, serialized) == NULL) { + return NULL; + } + Py_RETURN_NONE; +} + +// CMessage static methods: +PyObject* _GetFieldDescriptor(PyObject* unused, PyObject* arg) { + return cdescriptor_pool::FindFieldByName(descriptor_pool, arg); +} + +PyObject* _GetExtensionDescriptor(PyObject* unused, PyObject* arg) { + return cdescriptor_pool::FindExtensionByName(descriptor_pool, arg); +} + +static PyMemberDef Members[] = { + {"Extensions", T_OBJECT_EX, offsetof(CMessage, extensions), 0, + "Extension dict"}, + {NULL} +}; + +static PyMethodDef Methods[] = { + { "__deepcopy__", (PyCFunction)DeepCopy, METH_VARARGS, + "Makes a deep copy of the class." }, + { "__reduce__", (PyCFunction)Reduce, METH_NOARGS, + "Outputs picklable representation of the message." }, + { "__setstate__", (PyCFunction)SetState, METH_O, + "Inputs picklable representation of the message." }, + { "__unicode__", (PyCFunction)ToUnicode, METH_NOARGS, + "Outputs a unicode representation of the message." }, + { "AddDescriptors", (PyCFunction)AddDescriptors, METH_O | METH_CLASS, + "Adds field descriptors to the class" }, + { "ByteSize", (PyCFunction)ByteSize, METH_NOARGS, + "Returns the size of the message in bytes." }, + { "Clear", (PyCFunction)Clear, METH_NOARGS, + "Clears the message." }, + { "ClearExtension", (PyCFunction)ClearExtension, METH_O, + "Clears a message field." }, + { "ClearField", (PyCFunction)ClearField, METH_O, + "Clears a message field." }, + { "CopyFrom", (PyCFunction)CopyFrom, METH_O, + "Copies a protocol message into the current message." }, + { "FindInitializationErrors", (PyCFunction)FindInitializationErrors, + METH_NOARGS, + "Finds unset required fields." }, + { "FromString", (PyCFunction)FromString, METH_O | METH_CLASS, + "Creates new method instance from given serialized data." }, + { "HasExtension", (PyCFunction)HasExtension, METH_O, + "Checks if a message field is set." }, + { "HasField", (PyCFunction)HasField, METH_O, + "Checks if a message field is set." }, + { "IsInitialized", (PyCFunction)IsInitialized, METH_VARARGS, + "Checks if all required fields of a protocol message are set." }, + { "ListFields", (PyCFunction)ListFields, METH_NOARGS, + "Lists all set fields of a message." }, + { "MergeFrom", (PyCFunction)MergeFrom, METH_O, + "Merges a protocol message into the current message." }, + { "MergeFromString", (PyCFunction)MergeFromString, METH_O, + "Merges a serialized message into the current message." }, + { "ParseFromString", (PyCFunction)ParseFromString, METH_O, + "Parses a serialized message into the current message." }, + { "RegisterExtension", (PyCFunction)RegisterExtension, METH_O | METH_CLASS, + "Registers an extension with the current message." }, + { "SerializePartialToString", (PyCFunction)SerializePartialToString, + METH_NOARGS, + "Serializes the message to a string, even if it isn't initialized." }, + { "SerializeToString", (PyCFunction)SerializeToString, METH_NOARGS, + "Serializes the message to a string, only for initialized messages." }, + { "SetInParent", (PyCFunction)SetInParent, METH_NOARGS, + "Sets the has bit of the given field in its parent message." }, + { "WhichOneof", (PyCFunction)WhichOneof, METH_O, + "Returns the name of the field set inside a oneof, " + "or None if no field is set." }, + + // Static Methods. + { "_BuildFile", (PyCFunction)Python_BuildFile, METH_O | METH_STATIC, + "Registers a new protocol buffer file in the global C++ descriptor pool." }, + { "_GetFieldDescriptor", (PyCFunction)_GetFieldDescriptor, + METH_O | METH_STATIC, "Finds a field descriptor in the message pool." }, + { "_GetExtensionDescriptor", (PyCFunction)_GetExtensionDescriptor, + METH_O | METH_STATIC, + "Finds a extension descriptor in the message pool." }, + { NULL, NULL} +}; + +PyObject* GetAttr(CMessage* self, PyObject* name) { + PyObject* value = PyDict_GetItem(self->composite_fields, name); + if (value != NULL) { + Py_INCREF(value); + return value; + } + + PyObject* descriptor = GetDescriptor(self, name); + if (descriptor != NULL) { + CFieldDescriptor* cdescriptor = + reinterpret_cast(descriptor); + const google::protobuf::FieldDescriptor* field_descriptor = cdescriptor->descriptor; + if (field_descriptor->label() == google::protobuf::FieldDescriptor::LABEL_REPEATED) { + if (field_descriptor->cpp_type() == + google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { + PyObject* py_container = PyObject_CallObject( + reinterpret_cast(&RepeatedCompositeContainer_Type), + NULL); + if (py_container == NULL) { + return NULL; + } + RepeatedCompositeContainer* container = + reinterpret_cast(py_container); + PyObject* field = cdescriptor->descriptor_field; + PyObject* message_type = PyObject_GetAttr(field, kmessage_type); + if (message_type == NULL) { + return NULL; + } + PyObject* concrete_class = + PyObject_GetAttr(message_type, k_concrete_class); + if (concrete_class == NULL) { + return NULL; + } + container->parent = self; + container->parent_field = cdescriptor; + container->message = self->message; + container->owner = self->owner; + container->subclass_init = concrete_class; + Py_DECREF(message_type); + if (PyDict_SetItem(self->composite_fields, name, py_container) < 0) { + Py_DECREF(py_container); + return NULL; + } + return py_container; + } else { + ScopedPyObjectPtr init_args(PyTuple_Pack(2, self, cdescriptor)); + PyObject* py_container = PyObject_CallObject( + reinterpret_cast(&RepeatedScalarContainer_Type), + init_args); + if (py_container == NULL) { + return NULL; + } + if (PyDict_SetItem(self->composite_fields, name, py_container) < 0) { + Py_DECREF(py_container); + return NULL; + } + return py_container; + } + } else { + if (field_descriptor->cpp_type() == + google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { + PyObject* sub_message = InternalGetSubMessage(self, cdescriptor); + if (PyDict_SetItem(self->composite_fields, name, sub_message) < 0) { + Py_DECREF(sub_message); + return NULL; + } + return sub_message; + } else { + return InternalGetScalar(self, field_descriptor); + } + } + } + + return CMessage_Type.tp_base->tp_getattro(reinterpret_cast(self), + name); +} + +int SetAttr(CMessage* self, PyObject* name, PyObject* value) { + if (PyDict_Contains(self->composite_fields, name)) { + PyErr_SetString(PyExc_TypeError, "Can't set composite field"); + return -1; + } + + PyObject* descriptor = GetDescriptor(self, name); + if (descriptor != NULL) { + AssureWritable(self); + CFieldDescriptor* cdescriptor = + reinterpret_cast(descriptor); + const google::protobuf::FieldDescriptor* field_descriptor = cdescriptor->descriptor; + if (field_descriptor->label() == google::protobuf::FieldDescriptor::LABEL_REPEATED) { + PyErr_Format(PyExc_AttributeError, "Assignment not allowed to repeated " + "field \"%s\" in protocol message object.", + field_descriptor->name().c_str()); + return -1; + } else { + if (field_descriptor->cpp_type() == + google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { + PyErr_Format(PyExc_AttributeError, "Assignment not allowed to " + "field \"%s\" in protocol message object.", + field_descriptor->name().c_str()); + return -1; + } else { + return InternalSetScalar(self, field_descriptor, value); + } + } + } + + PyErr_Format(PyExc_AttributeError, "Assignment not allowed"); + return -1; +} + +} // namespace cmessage + +PyTypeObject CMessage_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "google.protobuf.internal." + "cpp._message.CMessage", // tp_name + sizeof(CMessage), // tp_basicsize + 0, // tp_itemsize + (destructor)cmessage::Dealloc, // tp_dealloc + 0, // tp_print + 0, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash + 0, // tp_call + (reprfunc)cmessage::ToStr, // tp_str + (getattrofunc)cmessage::GetAttr, // tp_getattro + (setattrofunc)cmessage::SetAttr, // tp_setattro + 0, // tp_as_buffer + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // tp_flags + "A ProtocolMessage", // tp_doc + 0, // tp_traverse + 0, // tp_clear + (richcmpfunc)cmessage::RichCompare, // tp_richcompare + 0, // tp_weaklistoffset + 0, // tp_iter + 0, // tp_iternext + cmessage::Methods, // tp_methods + cmessage::Members, // tp_members + 0, // tp_getset + 0, // tp_base + 0, // tp_dict + 0, // tp_descr_get + 0, // tp_descr_set + 0, // tp_dictoffset + (initproc)cmessage::Init, // tp_init + 0, // tp_alloc + cmessage::New, // tp_new +}; + +// --- Exposing the C proto living inside Python proto to C code: + +const Message* (*GetCProtoInsidePyProtoPtr)(PyObject* msg); +Message* (*MutableCProtoInsidePyProtoPtr)(PyObject* msg); + +static const google::protobuf::Message* GetCProtoInsidePyProtoImpl(PyObject* msg) { + if (!PyObject_TypeCheck(msg, &CMessage_Type)) { + return NULL; + } + CMessage* cmsg = reinterpret_cast(msg); + return cmsg->message; +} + +static google::protobuf::Message* MutableCProtoInsidePyProtoImpl(PyObject* msg) { + if (!PyObject_TypeCheck(msg, &CMessage_Type)) { + return NULL; + } + CMessage* cmsg = reinterpret_cast(msg); + if (PyDict_Size(cmsg->composite_fields) != 0 || + (cmsg->extensions != NULL && + PyDict_Size(cmsg->extensions->values) != 0)) { + // There is currently no way of accurately syncing arbitrary changes to + // the underlying C++ message back to the CMessage (e.g. removed repeated + // composite containers). We only allow direct mutation of the underlying + // C++ message if there is no child data in the CMessage. + return NULL; + } + cmessage::AssureWritable(cmsg); + return cmsg->message; +} + +static const char module_docstring[] = +"python-proto2 is a module that can be used to enhance proto2 Python API\n" +"performance.\n" +"\n" +"It provides access to the protocol buffers C++ reflection API that\n" +"implements the basic protocol buffer functions."; + +void InitGlobals() { + // TODO(gps): Check all return values in this function for NULL and propagate + // the error (MemoryError) on up to result in an import failure. These should + // also be freed and reset to NULL during finalization. + kPythonZero = PyInt_FromLong(0); + kint32min_py = PyInt_FromLong(kint32min); + kint32max_py = PyInt_FromLong(kint32max); + kuint32max_py = PyLong_FromLongLong(kuint32max); + kint64min_py = PyLong_FromLongLong(kint64min); + kint64max_py = PyLong_FromLongLong(kint64max); + kuint64max_py = PyLong_FromUnsignedLongLong(kuint64max); + + kDESCRIPTOR = PyString_FromString("DESCRIPTOR"); + k__descriptors = PyString_FromString("__descriptors"); + kfull_name = PyString_FromString("full_name"); + kis_extendable = PyString_FromString("is_extendable"); + kextensions_by_name = PyString_FromString("extensions_by_name"); + k_extensions_by_name = PyString_FromString("_extensions_by_name"); + k_extensions_by_number = PyString_FromString("_extensions_by_number"); + k_concrete_class = PyString_FromString("_concrete_class"); + kmessage_type = PyString_FromString("message_type"); + kname = PyString_FromString("name"); + kfields_by_name = PyString_FromString("fields_by_name"); + + global_message_factory = new DynamicMessageFactory(GetDescriptorPool()); + global_message_factory->SetDelegateToGeneratedFactory(true); + + descriptor_pool = reinterpret_cast( + Python_NewCDescriptorPool(NULL, NULL)); +} + +bool InitProto2MessageModule(PyObject *m) { + InitGlobals(); + + google::protobuf::python::CMessage_Type.tp_hash = PyObject_HashNotImplemented; + if (PyType_Ready(&google::protobuf::python::CMessage_Type) < 0) { + return false; + } + + // All three of these are actually set elsewhere, directly onto the child + // protocol buffer message class, but set them here as well to document that + // subclasses need to set these. + PyDict_SetItem(google::protobuf::python::CMessage_Type.tp_dict, kDESCRIPTOR, Py_None); + PyDict_SetItem(google::protobuf::python::CMessage_Type.tp_dict, + k_extensions_by_name, Py_None); + PyDict_SetItem(google::protobuf::python::CMessage_Type.tp_dict, + k_extensions_by_number, Py_None); + + PyModule_AddObject(m, "Message", reinterpret_cast( + &google::protobuf::python::CMessage_Type)); + + google::protobuf::python::RepeatedScalarContainer_Type.tp_new = PyType_GenericNew; + google::protobuf::python::RepeatedScalarContainer_Type.tp_hash = + PyObject_HashNotImplemented; + if (PyType_Ready(&google::protobuf::python::RepeatedScalarContainer_Type) < 0) { + return false; + } + + PyModule_AddObject(m, "RepeatedScalarContainer", + reinterpret_cast( + &google::protobuf::python::RepeatedScalarContainer_Type)); + + google::protobuf::python::RepeatedCompositeContainer_Type.tp_new = PyType_GenericNew; + google::protobuf::python::RepeatedCompositeContainer_Type.tp_hash = + PyObject_HashNotImplemented; + if (PyType_Ready(&google::protobuf::python::RepeatedCompositeContainer_Type) < 0) { + return false; + } + + PyModule_AddObject( + m, "RepeatedCompositeContainer", + reinterpret_cast( + &google::protobuf::python::RepeatedCompositeContainer_Type)); + + google::protobuf::python::ExtensionDict_Type.tp_new = PyType_GenericNew; + google::protobuf::python::ExtensionDict_Type.tp_hash = PyObject_HashNotImplemented; + if (PyType_Ready(&google::protobuf::python::ExtensionDict_Type) < 0) { + return false; + } + + PyModule_AddObject( + m, "ExtensionDict", + reinterpret_cast(&google::protobuf::python::ExtensionDict_Type)); + + if (!google::protobuf::python::InitDescriptor()) { + return false; + } + + PyObject* enum_type_wrapper = PyImport_ImportModule( + "google.protobuf.internal.enum_type_wrapper"); + if (enum_type_wrapper == NULL) { + return false; + } + google::protobuf::python::EnumTypeWrapper_class = + PyObject_GetAttrString(enum_type_wrapper, "EnumTypeWrapper"); + Py_DECREF(enum_type_wrapper); + + PyObject* message_module = PyImport_ImportModule( + "google.protobuf.message"); + if (message_module == NULL) { + return false; + } + google::protobuf::python::EncodeError_class = PyObject_GetAttrString(message_module, + "EncodeError"); + google::protobuf::python::DecodeError_class = PyObject_GetAttrString(message_module, + "DecodeError"); + Py_DECREF(message_module); + + PyObject* pickle_module = PyImport_ImportModule("pickle"); + if (pickle_module == NULL) { + return false; + } + google::protobuf::python::PickleError_class = PyObject_GetAttrString(pickle_module, + "PickleError"); + Py_DECREF(pickle_module); + + // Override {Get,Mutable}CProtoInsidePyProto. + google::protobuf::python::GetCProtoInsidePyProtoPtr = + google::protobuf::python::GetCProtoInsidePyProtoImpl; + google::protobuf::python::MutableCProtoInsidePyProtoPtr = + google::protobuf::python::MutableCProtoInsidePyProtoImpl; + + return true; +} + +} // namespace python +} // namespace protobuf + + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef _module = { + PyModuleDef_HEAD_INIT, + "_message", + google::protobuf::python::module_docstring, + -1, + NULL, + NULL, + NULL, + NULL, + NULL +}; +#define INITFUNC PyInit__message +#define INITFUNC_ERRORVAL NULL +#else // Python 2 +#define INITFUNC init_message +#define INITFUNC_ERRORVAL +#endif + +extern "C" { + PyMODINIT_FUNC INITFUNC(void) { + PyObject* m; +#if PY_MAJOR_VERSION >= 3 + m = PyModule_Create(&_module); +#else + m = Py_InitModule3("_message", NULL, google::protobuf::python::module_docstring); +#endif + if (m == NULL) { + return INITFUNC_ERRORVAL; + } + + if (!google::protobuf::python::InitProto2MessageModule(m)) { + Py_DECREF(m); + return INITFUNC_ERRORVAL; + } + +#if PY_MAJOR_VERSION >= 3 + return m; +#endif + } +} +} // namespace google diff --git a/pythonlib/google/protobuf/pyext/message.h b/pythonlib/google/protobuf/pyext/message.h new file mode 100644 index 0000000..28e504f --- /dev/null +++ b/pythonlib/google/protobuf/pyext/message.h @@ -0,0 +1,305 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: anuraag@google.com (Anuraag Agrawal) +// Author: tibell@google.com (Johan Tibell) + +#ifndef GOOGLE_PROTOBUF_PYTHON_CPP_MESSAGE_H__ +#define GOOGLE_PROTOBUF_PYTHON_CPP_MESSAGE_H__ + +#include + +#include +#ifndef _SHARED_PTR_H +#include +#endif +#include + + +namespace google { +namespace protobuf { + +class Message; +class Reflection; +class FieldDescriptor; + +using internal::shared_ptr; + +namespace python { + +struct CFieldDescriptor; +struct ExtensionDict; + +typedef struct CMessage { + PyObject_HEAD; + + // This is the top-level C++ Message object that owns the whole + // proto tree. Every Python CMessage holds a reference to it in + // order to keep it alive as long as there's a Python object that + // references any part of the tree. + shared_ptr owner; + + // Weak reference to a parent CMessage object. This is NULL for any top-level + // message and is set for any child message (i.e. a child submessage or a + // part of a repeated composite field). + // + // Used to make sure all ancestors are also mutable when first modifying + // a child submessage (in other words, turning a default message instance + // into a mutable one). + // + // If a submessage is released (becomes a new top-level message), this field + // MUST be set to NULL. The parent may get deallocated and further attempts + // to use this pointer will result in a crash. + struct CMessage* parent; + + // Weak reference to the parent's descriptor that describes this submessage. + // Used together with the parent's message when making a default message + // instance mutable. + // TODO(anuraag): With a bit of work on the Python/C++ layer, it should be + // possible to make this a direct pointer to a C++ FieldDescriptor, this would + // be easier if this implementation replaces upstream. + CFieldDescriptor* parent_field; + + // Pointer to the C++ Message object for this CMessage. The + // CMessage does not own this pointer. + Message* message; + + // Indicates this submessage is pointing to a default instance of a message. + // Submessages are always first created as read only messages and are then + // made writable, at which point this field is set to false. + bool read_only; + + // A reference to a Python dictionary containing CMessage, + // RepeatedCompositeContainer, and RepeatedScalarContainer + // objects. Used as a cache to make sure we don't have to make a + // Python wrapper for the C++ Message objects on every access, or + // deal with the synchronization nightmare that could create. + PyObject* composite_fields; + + // A reference to the dictionary containing the message's extensions. + // Similar to composite_fields, acting as a cache, but also contains the + // required extension dict logic. + ExtensionDict* extensions; +} CMessage; + +extern PyTypeObject CMessage_Type; + +namespace cmessage { + +// Create a new empty message that can be populated by the parent. +PyObject* NewEmpty(PyObject* type); + +// Release a submessage from its proto tree, making it a new top-level messgae. +// A new message will be created if this is a read-only default instance. +// +// Corresponds to reflection api method ReleaseMessage. +int ReleaseSubMessage(google::protobuf::Message* message, + const google::protobuf::FieldDescriptor* field_descriptor, + CMessage* child_cmessage); + +// Initializes a new CMessage instance for a submessage. Only called once per +// submessage as the result is cached in composite_fields. +// +// Corresponds to reflection api method GetMessage. +PyObject* InternalGetSubMessage(CMessage* self, + CFieldDescriptor* cfield_descriptor); + +// Deletes a range of C++ submessages in a repeated field (following a +// removal in a RepeatedCompositeContainer). +// +// Releases messages to the provided cmessage_list if it is not NULL rather +// than just removing them from the underlying proto. This cmessage_list must +// have a CMessage for each underlying submessage. The CMessages refered to +// by slice will be removed from cmessage_list by this function. +// +// Corresponds to reflection api method RemoveLast. +int InternalDeleteRepeatedField(google::protobuf::Message* message, + const google::protobuf::FieldDescriptor* field_descriptor, + PyObject* slice, PyObject* cmessage_list); + +// Sets the specified scalar value to the message. +int InternalSetScalar(CMessage* self, + const google::protobuf::FieldDescriptor* field_descriptor, + PyObject* value); + +// Retrieves the specified scalar value from the message. +// +// Returns a new python reference. +PyObject* InternalGetScalar(CMessage* self, + const google::protobuf::FieldDescriptor* field_descriptor); + +// Clears the message, removing all contained data. Extension dictionary and +// submessages are released first if there are remaining external references. +// +// Corresponds to message api method Clear. +PyObject* Clear(CMessage* self); + +// Clears the data described by the given descriptor. Used to clear extensions +// (which don't have names). Extension release is handled by ExtensionDict +// class, not this function. +// TODO(anuraag): Try to make this discrepancy in release semantics with +// ClearField less confusing. +// +// Corresponds to reflection api method ClearField. +PyObject* ClearFieldByDescriptor( + CMessage* self, + const google::protobuf::FieldDescriptor* descriptor); + +// Clears the data for the given field name. The message is released if there +// are any external references. +// +// Corresponds to reflection api method ClearField. +PyObject* ClearField(CMessage* self, PyObject* arg); + +// Checks if the message has the field described by the descriptor. Used for +// extensions (which have no name). +// +// Corresponds to reflection api method HasField +PyObject* HasFieldByDescriptor( + CMessage* self, const google::protobuf::FieldDescriptor* field_descriptor); + +// Checks if the message has the named field. +// +// Corresponds to reflection api method HasField. +PyObject* HasField(CMessage* self, PyObject* arg); + +// Initializes constants/enum values on a message. This is called by +// RepeatedCompositeContainer and ExtensionDict after calling the constructor. +// TODO(anuraag): Make it always called from within the constructor since it can +int InitAttributes(CMessage* self, PyObject* descriptor, PyObject* kwargs); + +PyObject* MergeFrom(CMessage* self, PyObject* arg); + +// Retrieves an attribute named 'name' from CMessage 'self'. Returns +// the attribute value on success, or NULL on failure. +// +// Returns a new reference. +PyObject* GetAttr(CMessage* self, PyObject* name); + +// Set the value of the attribute named 'name', for CMessage 'self', +// to the value 'value'. Returns -1 on failure. +int SetAttr(CMessage* self, PyObject* name, PyObject* value); + +PyObject* FindInitializationErrors(CMessage* self); + +// Set the owner field of self and any children of self, recursively. +// Used when self is being released and thus has a new owner (the +// released Message.) +int SetOwner(CMessage* self, const shared_ptr& new_owner); + +int AssureWritable(CMessage* self); + +} // namespace cmessage + +/* Is 64bit */ +#define IS_64BIT (SIZEOF_LONG == 8) + +#define FIELD_BELONGS_TO_MESSAGE(field_descriptor, message) \ + ((message)->GetDescriptor() == (field_descriptor)->containing_type()) + +#define FIELD_IS_REPEATED(field_descriptor) \ + ((field_descriptor)->label() == google::protobuf::FieldDescriptor::LABEL_REPEATED) + +#define GOOGLE_CHECK_GET_INT32(arg, value, err) \ + int32 value; \ + if (!CheckAndGetInteger(arg, &value, kint32min_py, kint32max_py)) { \ + return err; \ + } + +#define GOOGLE_CHECK_GET_INT64(arg, value, err) \ + int64 value; \ + if (!CheckAndGetInteger(arg, &value, kint64min_py, kint64max_py)) { \ + return err; \ + } + +#define GOOGLE_CHECK_GET_UINT32(arg, value, err) \ + uint32 value; \ + if (!CheckAndGetInteger(arg, &value, kPythonZero, kuint32max_py)) { \ + return err; \ + } + +#define GOOGLE_CHECK_GET_UINT64(arg, value, err) \ + uint64 value; \ + if (!CheckAndGetInteger(arg, &value, kPythonZero, kuint64max_py)) { \ + return err; \ + } + +#define GOOGLE_CHECK_GET_FLOAT(arg, value, err) \ + float value; \ + if (!CheckAndGetFloat(arg, &value)) { \ + return err; \ + } \ + +#define GOOGLE_CHECK_GET_DOUBLE(arg, value, err) \ + double value; \ + if (!CheckAndGetDouble(arg, &value)) { \ + return err; \ + } + +#define GOOGLE_CHECK_GET_BOOL(arg, value, err) \ + bool value; \ + if (!CheckAndGetBool(arg, &value)) { \ + return err; \ + } + + +extern PyObject* kPythonZero; +extern PyObject* kint32min_py; +extern PyObject* kint32max_py; +extern PyObject* kuint32max_py; +extern PyObject* kint64min_py; +extern PyObject* kint64max_py; +extern PyObject* kuint64max_py; + +#define C(str) const_cast(str) + +void FormatTypeError(PyObject* arg, char* expected_types); +template +bool CheckAndGetInteger( + PyObject* arg, T* value, PyObject* min, PyObject* max); +bool CheckAndGetDouble(PyObject* arg, double* value); +bool CheckAndGetFloat(PyObject* arg, float* value); +bool CheckAndGetBool(PyObject* arg, bool* value); +bool CheckAndSetString( + PyObject* arg, google::protobuf::Message* message, + const google::protobuf::FieldDescriptor* descriptor, + const google::protobuf::Reflection* reflection, + bool append, + int index); +PyObject* ToStringObject( + const google::protobuf::FieldDescriptor* descriptor, string value); + +extern PyObject* PickleError_class; + +} // namespace python +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_PYTHON_CPP_MESSAGE_H__ diff --git a/pythonlib/google/protobuf/pyext/message_factory_cpp2_test.py b/pythonlib/google/protobuf/pyext/message_factory_cpp2_test.py new file mode 100644 index 0000000..fb52e1b --- /dev/null +++ b/pythonlib/google/protobuf/pyext/message_factory_cpp2_test.py @@ -0,0 +1,56 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Tests for google.protobuf.message_factory.""" + +import os +os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'cpp' +os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION'] = '2' + +# We must set the implementation version above before the google3 imports. +# pylint: disable=g-import-not-at-top +from google.apputils import basetest +from google.protobuf.internal import api_implementation +# Run all tests from the original module by putting them in our namespace. +# pylint: disable=wildcard-import +from google.protobuf.internal.message_factory_test import * + + +class ConfirmCppApi2Test(basetest.TestCase): + + def testImplementationSetting(self): + self.assertEqual('cpp', api_implementation.Type()) + self.assertEqual(2, api_implementation.Version()) + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/pyext/proto2_api_test.proto b/pythonlib/google/protobuf/pyext/proto2_api_test.proto new file mode 100644 index 0000000..eef9b73 --- /dev/null +++ b/pythonlib/google/protobuf/pyext/proto2_api_test.proto @@ -0,0 +1,38 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +import "google/protobuf/internal/cpp/proto1_api_test.proto"; + +package google.protobuf.python.internal; + +message TestNestedProto1APIMessage { + optional int32 a = 1; + optional TestMessage.NestedMessage b = 2; +} diff --git a/pythonlib/google/protobuf/pyext/python.proto b/pythonlib/google/protobuf/pyext/python.proto new file mode 100644 index 0000000..ee6d5ab --- /dev/null +++ b/pythonlib/google/protobuf/pyext/python.proto @@ -0,0 +1,66 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: tibell@google.com (Johan Tibell) +// +// These message definitions are used to exercises known corner cases +// in the C++ implementation of the Python API. + + +package google.protobuf.python.internal; + +// Protos optimized for SPEED use a strict superset of the generated code +// of equivalent ones optimized for CODE_SIZE, so we should optimize all our +// tests for speed unless explicitly testing code size optimization. +option optimize_for = SPEED; + +message TestAllTypes { + message NestedMessage { + optional int32 bb = 1; + optional ForeignMessage cc = 2; + } + + repeated NestedMessage repeated_nested_message = 1; + optional NestedMessage optional_nested_message = 2; + optional int32 optional_int32 = 3; +} + +message ForeignMessage { + optional int32 c = 1; + repeated int32 d = 2; +} + +message TestAllExtensions { + extensions 1 to max; +} + +extend TestAllExtensions { + optional TestAllTypes.NestedMessage optional_nested_message_extension = 1; +} diff --git a/pythonlib/google/protobuf/pyext/python_pb2.py b/pythonlib/google/protobuf/pyext/python_pb2.py new file mode 100644 index 0000000..6e200cc --- /dev/null +++ b/pythonlib/google/protobuf/pyext/python_pb2.py @@ -0,0 +1,218 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/pyext/python.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/pyext/python.proto', + package='google.protobuf.python.internal', + serialized_pb=_b('\n\"google/protobuf/pyext/python.proto\x12\x1fgoogle.protobuf.python.internal\"\xbc\x02\n\x0cTestAllTypes\x12\\\n\x17repeated_nested_message\x18\x01 \x03(\x0b\x32;.google.protobuf.python.internal.TestAllTypes.NestedMessage\x12\\\n\x17optional_nested_message\x18\x02 \x01(\x0b\x32;.google.protobuf.python.internal.TestAllTypes.NestedMessage\x12\x16\n\x0eoptional_int32\x18\x03 \x01(\x05\x1aX\n\rNestedMessage\x12\n\n\x02\x62\x62\x18\x01 \x01(\x05\x12;\n\x02\x63\x63\x18\x02 \x01(\x0b\x32/.google.protobuf.python.internal.ForeignMessage\"&\n\x0e\x46oreignMessage\x12\t\n\x01\x63\x18\x01 \x01(\x05\x12\t\n\x01\x64\x18\x02 \x03(\x05\"\x1d\n\x11TestAllExtensions*\x08\x08\x01\x10\x80\x80\x80\x80\x02:\x9a\x01\n!optional_nested_message_extension\x12\x32.google.protobuf.python.internal.TestAllExtensions\x18\x01 \x01(\x0b\x32;.google.protobuf.python.internal.TestAllTypes.NestedMessageB\x02H\x01') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + +OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER = 1 +optional_nested_message_extension = _descriptor.FieldDescriptor( + name='optional_nested_message_extension', full_name='google.protobuf.python.internal.optional_nested_message_extension', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) + + +_TESTALLTYPES_NESTEDMESSAGE = _descriptor.Descriptor( + name='NestedMessage', + full_name='google.protobuf.python.internal.TestAllTypes.NestedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='bb', full_name='google.protobuf.python.internal.TestAllTypes.NestedMessage.bb', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='cc', full_name='google.protobuf.python.internal.TestAllTypes.NestedMessage.cc', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=300, + serialized_end=388, +) + +_TESTALLTYPES = _descriptor.Descriptor( + name='TestAllTypes', + full_name='google.protobuf.python.internal.TestAllTypes', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='repeated_nested_message', full_name='google.protobuf.python.internal.TestAllTypes.repeated_nested_message', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_nested_message', full_name='google.protobuf.python.internal.TestAllTypes.optional_nested_message', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_int32', full_name='google.protobuf.python.internal.TestAllTypes.optional_int32', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_TESTALLTYPES_NESTEDMESSAGE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=72, + serialized_end=388, +) + + +_FOREIGNMESSAGE = _descriptor.Descriptor( + name='ForeignMessage', + full_name='google.protobuf.python.internal.ForeignMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='c', full_name='google.protobuf.python.internal.ForeignMessage.c', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='d', full_name='google.protobuf.python.internal.ForeignMessage.d', index=1, + number=2, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=390, + serialized_end=428, +) + + +_TESTALLEXTENSIONS = _descriptor.Descriptor( + name='TestAllExtensions', + full_name='google.protobuf.python.internal.TestAllExtensions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1, 536870912), ], + oneofs=[ + ], + serialized_start=430, + serialized_end=459, +) + +_TESTALLTYPES_NESTEDMESSAGE.fields_by_name['cc'].message_type = _FOREIGNMESSAGE +_TESTALLTYPES_NESTEDMESSAGE.containing_type = _TESTALLTYPES +_TESTALLTYPES.fields_by_name['repeated_nested_message'].message_type = _TESTALLTYPES_NESTEDMESSAGE +_TESTALLTYPES.fields_by_name['optional_nested_message'].message_type = _TESTALLTYPES_NESTEDMESSAGE +DESCRIPTOR.message_types_by_name['TestAllTypes'] = _TESTALLTYPES +DESCRIPTOR.message_types_by_name['ForeignMessage'] = _FOREIGNMESSAGE +DESCRIPTOR.message_types_by_name['TestAllExtensions'] = _TESTALLEXTENSIONS +DESCRIPTOR.extensions_by_name['optional_nested_message_extension'] = optional_nested_message_extension + +TestAllTypes = _reflection.GeneratedProtocolMessageType('TestAllTypes', (_message.Message,), dict( + + NestedMessage = _reflection.GeneratedProtocolMessageType('NestedMessage', (_message.Message,), dict( + DESCRIPTOR = _TESTALLTYPES_NESTEDMESSAGE, + __module__ = 'google.protobuf.pyext.python_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.TestAllTypes.NestedMessage) + )) + , + DESCRIPTOR = _TESTALLTYPES, + __module__ = 'google.protobuf.pyext.python_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.TestAllTypes) + )) +_sym_db.RegisterMessage(TestAllTypes) +_sym_db.RegisterMessage(TestAllTypes.NestedMessage) + +ForeignMessage = _reflection.GeneratedProtocolMessageType('ForeignMessage', (_message.Message,), dict( + DESCRIPTOR = _FOREIGNMESSAGE, + __module__ = 'google.protobuf.pyext.python_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.ForeignMessage) + )) +_sym_db.RegisterMessage(ForeignMessage) + +TestAllExtensions = _reflection.GeneratedProtocolMessageType('TestAllExtensions', (_message.Message,), dict( + DESCRIPTOR = _TESTALLEXTENSIONS, + __module__ = 'google.protobuf.pyext.python_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.python.internal.TestAllExtensions) + )) +_sym_db.RegisterMessage(TestAllExtensions) + +optional_nested_message_extension.message_type = _TESTALLTYPES_NESTEDMESSAGE +TestAllExtensions.RegisterExtension(optional_nested_message_extension) + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('H\001')) +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/pyext/python_protobuf.h b/pythonlib/google/protobuf/pyext/python_protobuf.h new file mode 100644 index 0000000..c5b0b1c --- /dev/null +++ b/pythonlib/google/protobuf/pyext/python_protobuf.h @@ -0,0 +1,57 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: qrczak@google.com (Marcin Kowalczyk) +// +// This module exposes the C proto inside the given Python proto, in +// case the Python proto is implemented with a C proto. + +#ifndef GOOGLE_PROTOBUF_PYTHON_PYTHON_PROTOBUF_H__ +#define GOOGLE_PROTOBUF_PYTHON_PYTHON_PROTOBUF_H__ + +#include + +namespace google { +namespace protobuf { + +class Message; + +namespace python { + +// Return the pointer to the C proto inside the given Python proto, +// or NULL when this is not a Python proto implemented with a C proto. +const Message* GetCProtoInsidePyProto(PyObject* msg); +Message* MutableCProtoInsidePyProto(PyObject* msg); + +} // namespace python +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_PYTHON_PYTHON_PROTOBUF_H__ diff --git a/pythonlib/google/protobuf/pyext/reflection_cpp2_generated_test.py b/pythonlib/google/protobuf/pyext/reflection_cpp2_generated_test.py new file mode 100644 index 0000000..d7fce5f --- /dev/null +++ b/pythonlib/google/protobuf/pyext/reflection_cpp2_generated_test.py @@ -0,0 +1,94 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Unittest for reflection.py, which tests the generated C++ implementation.""" + +__author__ = 'jasonh@google.com (Jason Hsueh)' + +import os +os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'cpp' +os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION'] = '2' + +from google.apputils import basetest +from google.protobuf.internal import api_implementation +from google.protobuf.internal import more_extensions_dynamic_pb2 +from google.protobuf.internal import more_extensions_pb2 +from google.protobuf.internal.reflection_test import * + + +class ReflectionCppTest(basetest.TestCase): + def testImplementationSetting(self): + self.assertEqual('cpp', api_implementation.Type()) + self.assertEqual(2, api_implementation.Version()) + + def testExtensionOfGeneratedTypeInDynamicFile(self): + """Tests that a file built dynamically can extend a generated C++ type. + + The C++ implementation uses a DescriptorPool that has the generated + DescriptorPool as an underlay. Typically, a type can only find + extensions in its own pool. With the python C-extension, the generated C++ + extendee may be available, but not the extension. This tests that the + C-extension implements the correct special handling to make such extensions + available. + """ + pb1 = more_extensions_pb2.ExtendedMessage() + # Test that basic accessors work. + self.assertFalse( + pb1.HasExtension(more_extensions_dynamic_pb2.dynamic_int32_extension)) + self.assertFalse( + pb1.HasExtension(more_extensions_dynamic_pb2.dynamic_message_extension)) + pb1.Extensions[more_extensions_dynamic_pb2.dynamic_int32_extension] = 17 + pb1.Extensions[more_extensions_dynamic_pb2.dynamic_message_extension].a = 24 + self.assertTrue( + pb1.HasExtension(more_extensions_dynamic_pb2.dynamic_int32_extension)) + self.assertTrue( + pb1.HasExtension(more_extensions_dynamic_pb2.dynamic_message_extension)) + + # Now serialize the data and parse to a new message. + pb2 = more_extensions_pb2.ExtendedMessage() + pb2.MergeFromString(pb1.SerializeToString()) + + self.assertTrue( + pb2.HasExtension(more_extensions_dynamic_pb2.dynamic_int32_extension)) + self.assertTrue( + pb2.HasExtension(more_extensions_dynamic_pb2.dynamic_message_extension)) + self.assertEqual( + 17, pb2.Extensions[more_extensions_dynamic_pb2.dynamic_int32_extension]) + self.assertEqual( + 24, + pb2.Extensions[more_extensions_dynamic_pb2.dynamic_message_extension].a) + + + +if __name__ == '__main__': + basetest.main() diff --git a/pythonlib/google/protobuf/pyext/repeated_composite_container.cc b/pythonlib/google/protobuf/pyext/repeated_composite_container.cc new file mode 100644 index 0000000..b164505 --- /dev/null +++ b/pythonlib/google/protobuf/pyext/repeated_composite_container.cc @@ -0,0 +1,763 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: anuraag@google.com (Anuraag Agrawal) +// Author: tibell@google.com (Johan Tibell) + +#include + +#include +#ifndef _SHARED_PTR_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#if PY_MAJOR_VERSION >= 3 + #define PyInt_Check PyLong_Check + #define PyInt_AsLong PyLong_AsLong + #define PyInt_FromLong PyLong_FromLong +#endif + +namespace google { +namespace protobuf { +namespace python { + +extern google::protobuf::DynamicMessageFactory* global_message_factory; + +namespace repeated_composite_container { + +// TODO(tibell): We might also want to check: +// GOOGLE_CHECK_NOTNULL((self)->owner.get()); +#define GOOGLE_CHECK_ATTACHED(self) \ + do { \ + GOOGLE_CHECK_NOTNULL((self)->message); \ + GOOGLE_CHECK_NOTNULL((self)->parent_field); \ + } while (0); + +#define GOOGLE_CHECK_RELEASED(self) \ + do { \ + GOOGLE_CHECK((self)->owner.get() == NULL); \ + GOOGLE_CHECK((self)->message == NULL); \ + GOOGLE_CHECK((self)->parent_field == NULL); \ + GOOGLE_CHECK((self)->parent == NULL); \ + } while (0); + +// Returns a new reference. +static PyObject* GetKey(PyObject* x) { + // Just the identity function. + Py_INCREF(x); + return x; +} + +#define GET_KEY(keyfunc, value) \ + ((keyfunc) == NULL ? \ + GetKey((value)) : \ + PyObject_CallFunctionObjArgs((keyfunc), (value), NULL)) + +// Converts a comparison function that returns -1, 0, or 1 into a +// less-than predicate. +// +// Returns -1 on error, 1 if x < y, 0 if x >= y. +static int islt(PyObject *x, PyObject *y, PyObject *compare) { + if (compare == NULL) + return PyObject_RichCompareBool(x, y, Py_LT); + + ScopedPyObjectPtr res(PyObject_CallFunctionObjArgs(compare, x, y, NULL)); + if (res == NULL) + return -1; + if (!PyInt_Check(res)) { + PyErr_Format(PyExc_TypeError, + "comparison function must return int, not %.200s", + Py_TYPE(res)->tp_name); + return -1; + } + return PyInt_AsLong(res) < 0; +} + +// Copied from uarrsort.c but swaps memcpy swaps with protobuf/python swaps +// TODO(anuraag): Is there a better way to do this then reinventing the wheel? +static int InternalQuickSort(RepeatedCompositeContainer* self, + Py_ssize_t start, + Py_ssize_t limit, + PyObject* cmp, + PyObject* keyfunc) { + if (limit - start <= 1) + return 0; // Nothing to sort. + + GOOGLE_CHECK_ATTACHED(self); + + google::protobuf::Message* message = self->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + const google::protobuf::FieldDescriptor* descriptor = self->parent_field->descriptor; + Py_ssize_t left; + Py_ssize_t right; + + PyObject* children = self->child_messages; + + do { + left = start; + right = limit; + ScopedPyObjectPtr mid( + GET_KEY(keyfunc, PyList_GET_ITEM(children, (start + limit) / 2))); + do { + ScopedPyObjectPtr key(GET_KEY(keyfunc, PyList_GET_ITEM(children, left))); + int is_lt = islt(key, mid, cmp); + if (is_lt == -1) + return -1; + /* array[left]SwapElements(message, descriptor, left, right); + PyObject* tmp = PyList_GET_ITEM(children, left); + PyList_SET_ITEM(children, left, PyList_GET_ITEM(children, right)); + PyList_SET_ITEM(children, right, tmp); + } + ++left; + } + } while (left < right); + + if ((right - start) < (limit - left)) { + /* sort [start..right[ */ + if (start < (right - 1)) { + InternalQuickSort(self, start, right, cmp, keyfunc); + } + + /* sort [left..limit[ */ + start = left; + } else { + /* sort [left..limit[ */ + if (left < (limit - 1)) { + InternalQuickSort(self, left, limit, cmp, keyfunc); + } + + /* sort [start..right[ */ + limit = right; + } + } while (start < (limit - 1)); + + return 0; +} + +#undef GET_KEY + +// --------------------------------------------------------------------- +// len() + +static Py_ssize_t Length(RepeatedCompositeContainer* self) { + google::protobuf::Message* message = self->message; + if (message != NULL) { + return message->GetReflection()->FieldSize(*message, + self->parent_field->descriptor); + } else { + // The container has been released (i.e. by a call to Clear() or + // ClearField() on the parent) and thus there's no message. + return PyList_GET_SIZE(self->child_messages); + } +} + +// Returns 0 if successful; returns -1 and sets an exception if +// unsuccessful. +static int UpdateChildMessages(RepeatedCompositeContainer* self) { + if (self->message == NULL) + return 0; + + // A MergeFrom on a parent message could have caused extra messages to be + // added in the underlying protobuf so add them to our list. They can never + // be removed in such a way so there's no need to worry about that. + Py_ssize_t message_length = Length(self); + Py_ssize_t child_length = PyList_GET_SIZE(self->child_messages); + google::protobuf::Message* message = self->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + for (Py_ssize_t i = child_length; i < message_length; ++i) { + const Message& sub_message = reflection->GetRepeatedMessage( + *(self->message), self->parent_field->descriptor, i); + ScopedPyObjectPtr py_cmsg(cmessage::NewEmpty(self->subclass_init)); + if (py_cmsg == NULL) { + return -1; + } + CMessage* cmsg = reinterpret_cast(py_cmsg.get()); + cmsg->owner = self->owner; + cmsg->message = const_cast(&sub_message); + cmsg->parent = self->parent; + if (cmessage::InitAttributes(cmsg, NULL, NULL) < 0) { + return -1; + } + PyList_Append(self->child_messages, py_cmsg); + } + return 0; +} + +// --------------------------------------------------------------------- +// add() + +static PyObject* AddToAttached(RepeatedCompositeContainer* self, + PyObject* args, + PyObject* kwargs) { + GOOGLE_CHECK_ATTACHED(self); + + if (UpdateChildMessages(self) < 0) { + return NULL; + } + if (cmessage::AssureWritable(self->parent) == -1) + return NULL; + google::protobuf::Message* message = self->message; + google::protobuf::Message* sub_message = + message->GetReflection()->AddMessage(message, + self->parent_field->descriptor); + PyObject* py_cmsg = cmessage::NewEmpty(self->subclass_init); + if (py_cmsg == NULL) { + return NULL; + } + CMessage* cmsg = reinterpret_cast(py_cmsg); + + cmsg->owner = self->owner; + cmsg->message = sub_message; + cmsg->parent = self->parent; + // cmessage::InitAttributes must be called after cmsg->message has + // been set. + if (cmessage::InitAttributes(cmsg, NULL, kwargs) < 0) { + Py_DECREF(py_cmsg); + return NULL; + } + PyList_Append(self->child_messages, py_cmsg); + return py_cmsg; +} + +static PyObject* AddToReleased(RepeatedCompositeContainer* self, + PyObject* args, + PyObject* kwargs) { + GOOGLE_CHECK_RELEASED(self); + + // Create the CMessage + PyObject* py_cmsg = PyObject_CallObject(self->subclass_init, NULL); + if (py_cmsg == NULL) + return NULL; + CMessage* cmsg = reinterpret_cast(py_cmsg); + if (cmessage::InitAttributes(cmsg, NULL, kwargs) < 0) { + Py_DECREF(py_cmsg); + return NULL; + } + + // The Message got created by the call to subclass_init above and + // it set self->owner to the newly allocated message. + + PyList_Append(self->child_messages, py_cmsg); + return py_cmsg; +} + +PyObject* Add(RepeatedCompositeContainer* self, + PyObject* args, + PyObject* kwargs) { + if (self->message == NULL) + return AddToReleased(self, args, kwargs); + else + return AddToAttached(self, args, kwargs); +} + +// --------------------------------------------------------------------- +// extend() + +PyObject* Extend(RepeatedCompositeContainer* self, PyObject* value) { + cmessage::AssureWritable(self->parent); + if (UpdateChildMessages(self) < 0) { + return NULL; + } + ScopedPyObjectPtr iter(PyObject_GetIter(value)); + if (iter == NULL) { + PyErr_SetString(PyExc_TypeError, "Value must be iterable"); + return NULL; + } + ScopedPyObjectPtr next; + while ((next.reset(PyIter_Next(iter))) != NULL) { + if (!PyObject_TypeCheck(next, &CMessage_Type)) { + PyErr_SetString(PyExc_TypeError, "Not a cmessage"); + return NULL; + } + ScopedPyObjectPtr new_message(Add(self, NULL, NULL)); + if (new_message == NULL) { + return NULL; + } + CMessage* new_cmessage = reinterpret_cast(new_message.get()); + if (cmessage::MergeFrom(new_cmessage, next) == NULL) { + return NULL; + } + } + if (PyErr_Occurred()) { + return NULL; + } + Py_RETURN_NONE; +} + +PyObject* MergeFrom(RepeatedCompositeContainer* self, PyObject* other) { + if (UpdateChildMessages(self) < 0) { + return NULL; + } + return Extend(self, other); +} + +PyObject* Subscript(RepeatedCompositeContainer* self, PyObject* slice) { + if (UpdateChildMessages(self) < 0) { + return NULL; + } + Py_ssize_t from; + Py_ssize_t to; + Py_ssize_t step; + Py_ssize_t length = Length(self); + Py_ssize_t slicelength; + if (PySlice_Check(slice)) { +#if PY_MAJOR_VERSION >= 3 + if (PySlice_GetIndicesEx(slice, +#else + if (PySlice_GetIndicesEx(reinterpret_cast(slice), +#endif + length, &from, &to, &step, &slicelength) == -1) { + return NULL; + } + return PyList_GetSlice(self->child_messages, from, to); + } else if (PyInt_Check(slice) || PyLong_Check(slice)) { + from = to = PyLong_AsLong(slice); + if (from < 0) { + from = to = length + from; + } + PyObject* result = PyList_GetItem(self->child_messages, from); + if (result == NULL) { + return NULL; + } + Py_INCREF(result); + return result; + } + PyErr_SetString(PyExc_TypeError, "index must be an integer or slice"); + return NULL; +} + +int AssignSubscript(RepeatedCompositeContainer* self, + PyObject* slice, + PyObject* value) { + if (UpdateChildMessages(self) < 0) { + return -1; + } + if (value != NULL) { + PyErr_SetString(PyExc_TypeError, "does not support assignment"); + return -1; + } + + // Delete from the underlying Message, if any. + if (self->message != NULL) { + if (cmessage::InternalDeleteRepeatedField(self->message, + self->parent_field->descriptor, + slice, + self->child_messages) < 0) { + return -1; + } + } else { + Py_ssize_t from; + Py_ssize_t to; + Py_ssize_t step; + Py_ssize_t length = Length(self); + Py_ssize_t slicelength; + if (PySlice_Check(slice)) { +#if PY_MAJOR_VERSION >= 3 + if (PySlice_GetIndicesEx(slice, +#else + if (PySlice_GetIndicesEx(reinterpret_cast(slice), +#endif + length, &from, &to, &step, &slicelength) == -1) { + return -1; + } + return PySequence_DelSlice(self->child_messages, from, to); + } else if (PyInt_Check(slice) || PyLong_Check(slice)) { + from = to = PyLong_AsLong(slice); + if (from < 0) { + from = to = length + from; + } + return PySequence_DelItem(self->child_messages, from); + } + } + + return 0; +} + +static PyObject* Remove(RepeatedCompositeContainer* self, PyObject* value) { + if (UpdateChildMessages(self) < 0) { + return NULL; + } + Py_ssize_t index = PySequence_Index(self->child_messages, value); + if (index == -1) { + return NULL; + } + ScopedPyObjectPtr py_index(PyLong_FromLong(index)); + if (AssignSubscript(self, py_index, NULL) < 0) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject* RichCompare(RepeatedCompositeContainer* self, + PyObject* other, + int opid) { + if (UpdateChildMessages(self) < 0) { + return NULL; + } + if (!PyObject_TypeCheck(other, &RepeatedCompositeContainer_Type)) { + PyErr_SetString(PyExc_TypeError, + "Can only compare repeated composite fields " + "against other repeated composite fields."); + return NULL; + } + if (opid == Py_EQ || opid == Py_NE) { + // TODO(anuraag): Don't make new lists just for this... + ScopedPyObjectPtr full_slice(PySlice_New(NULL, NULL, NULL)); + if (full_slice == NULL) { + return NULL; + } + ScopedPyObjectPtr list(Subscript(self, full_slice)); + if (list == NULL) { + return NULL; + } + ScopedPyObjectPtr other_list( + Subscript( + reinterpret_cast(other), full_slice)); + if (other_list == NULL) { + return NULL; + } + return PyObject_RichCompare(list, other_list, opid); + } else { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } +} + +// --------------------------------------------------------------------- +// sort() + +static PyObject* SortAttached(RepeatedCompositeContainer* self, + PyObject* args, + PyObject* kwds) { + // Sort the underlying Message array. + PyObject *compare = NULL; + int reverse = 0; + PyObject *keyfunc = NULL; + static char *kwlist[] = {"cmp", "key", "reverse", 0}; + + if (args != NULL) { + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort", + kwlist, &compare, &keyfunc, &reverse)) + return NULL; + } + if (compare == Py_None) + compare = NULL; + if (keyfunc == Py_None) + keyfunc = NULL; + + const Py_ssize_t length = Length(self); + if (InternalQuickSort(self, 0, length, compare, keyfunc) < 0) + return NULL; + + // Finally reverse the result if requested. + if (reverse) { + google::protobuf::Message* message = self->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + const google::protobuf::FieldDescriptor* descriptor = self->parent_field->descriptor; + + // Reverse the Message array. + for (int i = 0; i < length / 2; ++i) + reflection->SwapElements(message, descriptor, i, length - i - 1); + + // Reverse the Python list. + ScopedPyObjectPtr res(PyObject_CallMethod(self->child_messages, + "reverse", NULL)); + if (res == NULL) + return NULL; + } + + Py_RETURN_NONE; +} + +static PyObject* SortReleased(RepeatedCompositeContainer* self, + PyObject* args, + PyObject* kwds) { + ScopedPyObjectPtr m(PyObject_GetAttrString(self->child_messages, "sort")); + if (m == NULL) + return NULL; + if (PyObject_Call(m, args, kwds) == NULL) + return NULL; + Py_RETURN_NONE; +} + +static PyObject* Sort(RepeatedCompositeContainer* self, + PyObject* args, + PyObject* kwds) { + // Support the old sort_function argument for backwards + // compatibility. + if (kwds != NULL) { + PyObject* sort_func = PyDict_GetItemString(kwds, "sort_function"); + if (sort_func != NULL) { + // Must set before deleting as sort_func is a borrowed reference + // and kwds might be the only thing keeping it alive. + PyDict_SetItemString(kwds, "cmp", sort_func); + PyDict_DelItemString(kwds, "sort_function"); + } + } + + if (UpdateChildMessages(self) < 0) + return NULL; + if (self->message == NULL) { + return SortReleased(self, args, kwds); + } else { + return SortAttached(self, args, kwds); + } +} + +// --------------------------------------------------------------------- + +static PyObject* Item(RepeatedCompositeContainer* self, Py_ssize_t index) { + if (UpdateChildMessages(self) < 0) { + return NULL; + } + Py_ssize_t length = Length(self); + if (index < 0) { + index = length + index; + } + PyObject* item = PyList_GetItem(self->child_messages, index); + if (item == NULL) { + return NULL; + } + Py_INCREF(item); + return item; +} + +// The caller takes ownership of the returned Message. +Message* ReleaseLast(const FieldDescriptor* field, + const Descriptor* type, + Message* message) { + GOOGLE_CHECK_NOTNULL(field); + GOOGLE_CHECK_NOTNULL(type); + GOOGLE_CHECK_NOTNULL(message); + + Message* released_message = message->GetReflection()->ReleaseLast( + message, field); + // TODO(tibell): Deal with proto1. + + // ReleaseMessage will return NULL which differs from + // child_cmessage->message, if the field does not exist. In this case, + // the latter points to the default instance via a const_cast<>, so we + // have to reset it to a new mutable object since we are taking ownership. + if (released_message == NULL) { + const Message* prototype = global_message_factory->GetPrototype(type); + GOOGLE_CHECK_NOTNULL(prototype); + return prototype->New(); + } else { + return released_message; + } +} + +// Release field of message and transfer the ownership to cmessage. +void ReleaseLastTo(const FieldDescriptor* field, + Message* message, + CMessage* cmessage) { + GOOGLE_CHECK_NOTNULL(field); + GOOGLE_CHECK_NOTNULL(message); + GOOGLE_CHECK_NOTNULL(cmessage); + + shared_ptr released_message( + ReleaseLast(field, cmessage->message->GetDescriptor(), message)); + cmessage->parent = NULL; + cmessage->parent_field = NULL; + cmessage->message = released_message.get(); + cmessage->read_only = false; + cmessage::SetOwner(cmessage, released_message); +} + +// Called to release a container using +// ClearField('container_field_name') on the parent. +int Release(RepeatedCompositeContainer* self) { + if (UpdateChildMessages(self) < 0) { + PyErr_WriteUnraisable(PyBytes_FromString("Failed to update released " + "messages")); + return -1; + } + + Message* message = self->message; + const FieldDescriptor* field = self->parent_field->descriptor; + + // The reflection API only lets us release the last message in a + // repeated field. Therefore we iterate through the children + // starting with the last one. + const Py_ssize_t size = PyList_GET_SIZE(self->child_messages); + GOOGLE_DCHECK_EQ(size, message->GetReflection()->FieldSize(*message, field)); + for (Py_ssize_t i = size - 1; i >= 0; --i) { + CMessage* child_cmessage = reinterpret_cast( + PyList_GET_ITEM(self->child_messages, i)); + ReleaseLastTo(field, message, child_cmessage); + } + + // Detach from containing message. + self->parent = NULL; + self->parent_field = NULL; + self->message = NULL; + self->owner.reset(); + + return 0; +} + +int SetOwner(RepeatedCompositeContainer* self, + const shared_ptr& new_owner) { + GOOGLE_CHECK_ATTACHED(self); + + self->owner = new_owner; + const Py_ssize_t n = PyList_GET_SIZE(self->child_messages); + for (Py_ssize_t i = 0; i < n; ++i) { + PyObject* msg = PyList_GET_ITEM(self->child_messages, i); + if (cmessage::SetOwner(reinterpret_cast(msg), new_owner) == -1) { + return -1; + } + } + return 0; +} + +static int Init(RepeatedCompositeContainer* self, + PyObject* args, + PyObject* kwargs) { + self->message = NULL; + self->parent = NULL; + self->parent_field = NULL; + self->subclass_init = NULL; + self->child_messages = PyList_New(0); + return 0; +} + +static void Dealloc(RepeatedCompositeContainer* self) { + Py_CLEAR(self->child_messages); + // TODO(tibell): Do we need to call delete on these objects to make + // sure their destructors are called? + self->owner.reset(); + Py_TYPE(self)->tp_free(reinterpret_cast(self)); +} + +static PySequenceMethods SqMethods = { + (lenfunc)Length, /* sq_length */ + 0, /* sq_concat */ + 0, /* sq_repeat */ + (ssizeargfunc)Item /* sq_item */ +}; + +static PyMappingMethods MpMethods = { + (lenfunc)Length, /* mp_length */ + (binaryfunc)Subscript, /* mp_subscript */ + (objobjargproc)AssignSubscript,/* mp_ass_subscript */ +}; + +static PyMethodDef Methods[] = { + { "add", (PyCFunction) Add, METH_VARARGS | METH_KEYWORDS, + "Adds an object to the repeated container." }, + { "extend", (PyCFunction) Extend, METH_O, + "Adds objects to the repeated container." }, + { "remove", (PyCFunction) Remove, METH_O, + "Removes an object from the repeated container." }, + { "sort", (PyCFunction) Sort, METH_VARARGS | METH_KEYWORDS, + "Sorts the repeated container." }, + { "MergeFrom", (PyCFunction) MergeFrom, METH_O, + "Adds objects to the repeated container." }, + { NULL, NULL } +}; + +} // namespace repeated_composite_container + +PyTypeObject RepeatedCompositeContainer_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "google.protobuf.internal." + "cpp._message.RepeatedCompositeContainer", // tp_name + sizeof(RepeatedCompositeContainer), // tp_basicsize + 0, // tp_itemsize + (destructor)repeated_composite_container::Dealloc, // tp_dealloc + 0, // tp_print + 0, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + &repeated_composite_container::SqMethods, // tp_as_sequence + &repeated_composite_container::MpMethods, // tp_as_mapping + 0, // tp_hash + 0, // tp_call + 0, // tp_str + 0, // tp_getattro + 0, // tp_setattro + 0, // tp_as_buffer + Py_TPFLAGS_DEFAULT, // tp_flags + "A Repeated scalar container", // tp_doc + 0, // tp_traverse + 0, // tp_clear + (richcmpfunc)repeated_composite_container::RichCompare, // tp_richcompare + 0, // tp_weaklistoffset + 0, // tp_iter + 0, // tp_iternext + repeated_composite_container::Methods, // tp_methods + 0, // tp_members + 0, // tp_getset + 0, // tp_base + 0, // tp_dict + 0, // tp_descr_get + 0, // tp_descr_set + 0, // tp_dictoffset + (initproc)repeated_composite_container::Init, // tp_init +}; + +} // namespace python +} // namespace protobuf +} // namespace google diff --git a/pythonlib/google/protobuf/pyext/repeated_composite_container.h b/pythonlib/google/protobuf/pyext/repeated_composite_container.h new file mode 100644 index 0000000..e8ed30e --- /dev/null +++ b/pythonlib/google/protobuf/pyext/repeated_composite_container.h @@ -0,0 +1,172 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: anuraag@google.com (Anuraag Agrawal) +// Author: tibell@google.com (Johan Tibell) + +#ifndef GOOGLE_PROTOBUF_PYTHON_CPP_REPEATED_COMPOSITE_CONTAINER_H__ +#define GOOGLE_PROTOBUF_PYTHON_CPP_REPEATED_COMPOSITE_CONTAINER_H__ + +#include + +#include +#ifndef _SHARED_PTR_H +#include +#endif +#include +#include + + +namespace google { +namespace protobuf { + +class FieldDescriptor; +class Message; + +using internal::shared_ptr; + +namespace python { + +struct CMessage; +struct CFieldDescriptor; + +// A RepeatedCompositeContainer can be in one of two states: attached +// or released. +// +// When in the attached state all modifications to the container are +// done both on the 'message' and on the 'child_messages' +// list. In this state all Messages refered to by the children in +// 'child_messages' are owner by the 'owner'. +// +// When in the released state 'message', 'owner', 'parent', and +// 'parent_field' are NULL. +typedef struct RepeatedCompositeContainer { + PyObject_HEAD; + + // This is the top-level C++ Message object that owns the whole + // proto tree. Every Python RepeatedCompositeContainer holds a + // reference to it in order to keep it alive as long as there's a + // Python object that references any part of the tree. + shared_ptr owner; + + // Weak reference to parent object. May be NULL. Used to make sure + // the parent is writable before modifying the + // RepeatedCompositeContainer. + CMessage* parent; + + // A descriptor used to modify the underlying 'message'. + CFieldDescriptor* parent_field; + + // Pointer to the C++ Message that contains this container. The + // RepeatedCompositeContainer does not own this pointer. + // + // If NULL, this message has been released from its parent (by + // calling Clear() or ClearField() on the parent. + Message* message; + + // A callable that is used to create new child messages. + PyObject* subclass_init; + + // A list of child messages. + PyObject* child_messages; +} RepeatedCompositeContainer; + +extern PyTypeObject RepeatedCompositeContainer_Type; + +namespace repeated_composite_container { + +// Returns the number of items in this repeated composite container. +static Py_ssize_t Length(RepeatedCompositeContainer* self); + +// Appends a new CMessage to the container and returns it. The +// CMessage is initialized using the content of kwargs. +// +// Returns a new reference if successful; returns NULL and sets an +// exception if unsuccessful. +PyObject* Add(RepeatedCompositeContainer* self, + PyObject* args, + PyObject* kwargs); + +// Appends all the CMessages in the input iterator to the container. +// +// Returns None if successful; returns NULL and sets an exception if +// unsuccessful. +PyObject* Extend(RepeatedCompositeContainer* self, PyObject* value); + +// Appends a new message to the container for each message in the +// input iterator, merging each data element in. Equivalent to extend. +// +// Returns None if successful; returns NULL and sets an exception if +// unsuccessful. +PyObject* MergeFrom(RepeatedCompositeContainer* self, PyObject* other); + +// Accesses messages in the container. +// +// Returns a new reference to the message for an integer parameter. +// Returns a new reference to a list of messages for a slice. +PyObject* Subscript(RepeatedCompositeContainer* self, PyObject* slice); + +// Deletes items from the container (cannot be used for assignment). +// +// Returns 0 on success, -1 on failure. +int AssignSubscript(RepeatedCompositeContainer* self, + PyObject* slice, + PyObject* value); + +// Releases the messages in the container to the given message. +// +// Returns 0 on success, -1 on failure. +int ReleaseToMessage(RepeatedCompositeContainer* self, + google::protobuf::Message* new_message); + +// Releases the messages in the container to a new message. +// +// Returns 0 on success, -1 on failure. +int Release(RepeatedCompositeContainer* self); + +// Returns 0 on success, -1 on failure. +int SetOwner(RepeatedCompositeContainer* self, + const shared_ptr& new_owner); + +// Removes the last element of the repeated message field 'field' on +// the Message 'message', and transfers the ownership of the released +// Message to 'cmessage'. +// +// Corresponds to reflection api method ReleaseMessage. +void ReleaseLastTo(const FieldDescriptor* field, + Message* message, + CMessage* cmessage); + +} // namespace repeated_composite_container +} // namespace python +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_PYTHON_CPP_REPEATED_COMPOSITE_CONTAINER_H__ diff --git a/pythonlib/google/protobuf/pyext/repeated_scalar_container.cc b/pythonlib/google/protobuf/pyext/repeated_scalar_container.cc new file mode 100644 index 0000000..b0fcd81 --- /dev/null +++ b/pythonlib/google/protobuf/pyext/repeated_scalar_container.cc @@ -0,0 +1,825 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: anuraag@google.com (Anuraag Agrawal) +// Author: tibell@google.com (Johan Tibell) + +#include + +#include +#ifndef _SHARED_PTR_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#if PY_MAJOR_VERSION >= 3 + #define PyInt_FromLong PyLong_FromLong + #if PY_VERSION_HEX < 0x03030000 + #error "Python 3.0 - 3.2 are not supported." + #else + #define PyString_AsString(ob) \ + (PyUnicode_Check(ob)? PyUnicode_AsUTF8(ob): PyBytes_AS_STRING(ob)) + #endif +#endif + +namespace google { +namespace protobuf { +namespace python { + +extern google::protobuf::DynamicMessageFactory* global_message_factory; + +namespace repeated_scalar_container { + +static int InternalAssignRepeatedField( + RepeatedScalarContainer* self, PyObject* list) { + self->message->GetReflection()->ClearField(self->message, + self->parent_field->descriptor); + for (Py_ssize_t i = 0; i < PyList_GET_SIZE(list); ++i) { + PyObject* value = PyList_GET_ITEM(list, i); + if (Append(self, value) == NULL) { + return -1; + } + } + return 0; +} + +static Py_ssize_t Len(RepeatedScalarContainer* self) { + google::protobuf::Message* message = self->message; + return message->GetReflection()->FieldSize(*message, + self->parent_field->descriptor); +} + +static int AssignItem(RepeatedScalarContainer* self, + Py_ssize_t index, + PyObject* arg) { + cmessage::AssureWritable(self->parent); + google::protobuf::Message* message = self->message; + const google::protobuf::FieldDescriptor* field_descriptor = + self->parent_field->descriptor; + if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) { + PyErr_SetString( + PyExc_KeyError, "Field does not belong to message!"); + return -1; + } + + const google::protobuf::Reflection* reflection = message->GetReflection(); + int field_size = reflection->FieldSize(*message, field_descriptor); + if (index < 0) { + index = field_size + index; + } + if (index < 0 || index >= field_size) { + PyErr_Format(PyExc_IndexError, + "list assignment index (%d) out of range", + static_cast(index)); + return -1; + } + + if (arg == NULL) { + ScopedPyObjectPtr py_index(PyLong_FromLong(index)); + return cmessage::InternalDeleteRepeatedField(message, field_descriptor, + py_index, NULL); + } + + if (PySequence_Check(arg) && !(PyBytes_Check(arg) || PyUnicode_Check(arg))) { + PyErr_SetString(PyExc_TypeError, "Value must be scalar"); + return -1; + } + + switch (field_descriptor->cpp_type()) { + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: { + GOOGLE_CHECK_GET_INT32(arg, value, -1); + reflection->SetRepeatedInt32(message, field_descriptor, index, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: { + GOOGLE_CHECK_GET_INT64(arg, value, -1); + reflection->SetRepeatedInt64(message, field_descriptor, index, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: { + GOOGLE_CHECK_GET_UINT32(arg, value, -1); + reflection->SetRepeatedUInt32(message, field_descriptor, index, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: { + GOOGLE_CHECK_GET_UINT64(arg, value, -1); + reflection->SetRepeatedUInt64(message, field_descriptor, index, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: { + GOOGLE_CHECK_GET_FLOAT(arg, value, -1); + reflection->SetRepeatedFloat(message, field_descriptor, index, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: { + GOOGLE_CHECK_GET_DOUBLE(arg, value, -1); + reflection->SetRepeatedDouble(message, field_descriptor, index, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: { + GOOGLE_CHECK_GET_BOOL(arg, value, -1); + reflection->SetRepeatedBool(message, field_descriptor, index, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: { + if (!CheckAndSetString( + arg, message, field_descriptor, reflection, false, index)) { + return -1; + } + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: { + GOOGLE_CHECK_GET_INT32(arg, value, -1); + const google::protobuf::EnumDescriptor* enum_descriptor = + field_descriptor->enum_type(); + const google::protobuf::EnumValueDescriptor* enum_value = + enum_descriptor->FindValueByNumber(value); + if (enum_value != NULL) { + reflection->SetRepeatedEnum(message, field_descriptor, index, + enum_value); + } else { + ScopedPyObjectPtr s(PyObject_Str(arg)); + if (s != NULL) { + PyErr_Format(PyExc_ValueError, "Unknown enum value: %s", + PyString_AsString(s.get())); + } + return -1; + } + break; + } + default: + PyErr_Format( + PyExc_SystemError, "Adding value to a field of unknown type %d", + field_descriptor->cpp_type()); + return -1; + } + return 0; +} + +static PyObject* Item(RepeatedScalarContainer* self, Py_ssize_t index) { + google::protobuf::Message* message = self->message; + const google::protobuf::FieldDescriptor* field_descriptor = + self->parent_field->descriptor; + const google::protobuf::Reflection* reflection = message->GetReflection(); + + int field_size = reflection->FieldSize(*message, field_descriptor); + if (index < 0) { + index = field_size + index; + } + if (index < 0 || index >= field_size) { + PyErr_Format(PyExc_IndexError, + "list assignment index (%d) out of range", + static_cast(index)); + return NULL; + } + + PyObject* result = NULL; + switch (field_descriptor->cpp_type()) { + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: { + int32 value = reflection->GetRepeatedInt32( + *message, field_descriptor, index); + result = PyInt_FromLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: { + int64 value = reflection->GetRepeatedInt64( + *message, field_descriptor, index); + result = PyLong_FromLongLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: { + uint32 value = reflection->GetRepeatedUInt32( + *message, field_descriptor, index); + result = PyLong_FromLongLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: { + uint64 value = reflection->GetRepeatedUInt64( + *message, field_descriptor, index); + result = PyLong_FromUnsignedLongLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: { + float value = reflection->GetRepeatedFloat( + *message, field_descriptor, index); + result = PyFloat_FromDouble(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: { + double value = reflection->GetRepeatedDouble( + *message, field_descriptor, index); + result = PyFloat_FromDouble(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: { + bool value = reflection->GetRepeatedBool( + *message, field_descriptor, index); + result = PyBool_FromLong(value ? 1 : 0); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: { + const google::protobuf::EnumValueDescriptor* enum_value = + message->GetReflection()->GetRepeatedEnum( + *message, field_descriptor, index); + result = PyInt_FromLong(enum_value->number()); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: { + string value = reflection->GetRepeatedString( + *message, field_descriptor, index); + result = ToStringObject(field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: { + PyObject* py_cmsg = PyObject_CallObject(reinterpret_cast( + &CMessage_Type), NULL); + if (py_cmsg == NULL) { + return NULL; + } + CMessage* cmsg = reinterpret_cast(py_cmsg); + const google::protobuf::Message& msg = reflection->GetRepeatedMessage( + *message, field_descriptor, index); + cmsg->owner = self->owner; + cmsg->parent = self->parent; + cmsg->message = const_cast(&msg); + cmsg->read_only = false; + result = reinterpret_cast(py_cmsg); + break; + } + default: + PyErr_Format( + PyExc_SystemError, + "Getting value from a repeated field of unknown type %d", + field_descriptor->cpp_type()); + } + + return result; +} + +static PyObject* Subscript(RepeatedScalarContainer* self, PyObject* slice) { + Py_ssize_t from; + Py_ssize_t to; + Py_ssize_t step; + Py_ssize_t length; + Py_ssize_t slicelength; + bool return_list = false; +#if PY_MAJOR_VERSION < 3 + if (PyInt_Check(slice)) { + from = to = PyInt_AsLong(slice); + } else // NOLINT +#endif + if (PyLong_Check(slice)) { + from = to = PyLong_AsLong(slice); + } else if (PySlice_Check(slice)) { + length = Len(self); +#if PY_MAJOR_VERSION >= 3 + if (PySlice_GetIndicesEx(slice, +#else + if (PySlice_GetIndicesEx(reinterpret_cast(slice), +#endif + length, &from, &to, &step, &slicelength) == -1) { + return NULL; + } + return_list = true; + } else { + PyErr_SetString(PyExc_TypeError, "list indices must be integers"); + return NULL; + } + + if (!return_list) { + return Item(self, from); + } + + PyObject* list = PyList_New(0); + if (list == NULL) { + return NULL; + } + if (from <= to) { + if (step < 0) { + return list; + } + for (Py_ssize_t index = from; index < to; index += step) { + if (index < 0 || index >= length) { + break; + } + ScopedPyObjectPtr s(Item(self, index)); + PyList_Append(list, s); + } + } else { + if (step > 0) { + return list; + } + for (Py_ssize_t index = from; index > to; index += step) { + if (index < 0 || index >= length) { + break; + } + ScopedPyObjectPtr s(Item(self, index)); + PyList_Append(list, s); + } + } + return list; +} + +PyObject* Append(RepeatedScalarContainer* self, PyObject* item) { + cmessage::AssureWritable(self->parent); + google::protobuf::Message* message = self->message; + const google::protobuf::FieldDescriptor* field_descriptor = + self->parent_field->descriptor; + + if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) { + PyErr_SetString( + PyExc_KeyError, "Field does not belong to message!"); + return NULL; + } + + const google::protobuf::Reflection* reflection = message->GetReflection(); + switch (field_descriptor->cpp_type()) { + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: { + GOOGLE_CHECK_GET_INT32(item, value, NULL); + reflection->AddInt32(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: { + GOOGLE_CHECK_GET_INT64(item, value, NULL); + reflection->AddInt64(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: { + GOOGLE_CHECK_GET_UINT32(item, value, NULL); + reflection->AddUInt32(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: { + GOOGLE_CHECK_GET_UINT64(item, value, NULL); + reflection->AddUInt64(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: { + GOOGLE_CHECK_GET_FLOAT(item, value, NULL); + reflection->AddFloat(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: { + GOOGLE_CHECK_GET_DOUBLE(item, value, NULL); + reflection->AddDouble(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: { + GOOGLE_CHECK_GET_BOOL(item, value, NULL); + reflection->AddBool(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: { + if (!CheckAndSetString( + item, message, field_descriptor, reflection, true, -1)) { + return NULL; + } + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: { + GOOGLE_CHECK_GET_INT32(item, value, NULL); + const google::protobuf::EnumDescriptor* enum_descriptor = + field_descriptor->enum_type(); + const google::protobuf::EnumValueDescriptor* enum_value = + enum_descriptor->FindValueByNumber(value); + if (enum_value != NULL) { + reflection->AddEnum(message, field_descriptor, enum_value); + } else { + ScopedPyObjectPtr s(PyObject_Str(item)); + if (s != NULL) { + PyErr_Format(PyExc_ValueError, "Unknown enum value: %s", + PyString_AsString(s.get())); + } + return NULL; + } + break; + } + default: + PyErr_Format( + PyExc_SystemError, "Adding value to a field of unknown type %d", + field_descriptor->cpp_type()); + return NULL; + } + + Py_RETURN_NONE; +} + +static int AssSubscript(RepeatedScalarContainer* self, + PyObject* slice, + PyObject* value) { + Py_ssize_t from; + Py_ssize_t to; + Py_ssize_t step; + Py_ssize_t length; + Py_ssize_t slicelength; + bool create_list = false; + + cmessage::AssureWritable(self->parent); + google::protobuf::Message* message = self->message; + const google::protobuf::FieldDescriptor* field_descriptor = + self->parent_field->descriptor; + +#if PY_MAJOR_VERSION < 3 + if (PyInt_Check(slice)) { + from = to = PyInt_AsLong(slice); + } else +#endif + if (PyLong_Check(slice)) { + from = to = PyLong_AsLong(slice); + } else if (PySlice_Check(slice)) { + const google::protobuf::Reflection* reflection = message->GetReflection(); + length = reflection->FieldSize(*message, field_descriptor); +#if PY_MAJOR_VERSION >= 3 + if (PySlice_GetIndicesEx(slice, +#else + if (PySlice_GetIndicesEx(reinterpret_cast(slice), +#endif + length, &from, &to, &step, &slicelength) == -1) { + return -1; + } + create_list = true; + } else { + PyErr_SetString(PyExc_TypeError, "list indices must be integers"); + return -1; + } + + if (value == NULL) { + return cmessage::InternalDeleteRepeatedField( + message, field_descriptor, slice, NULL); + } + + if (!create_list) { + return AssignItem(self, from, value); + } + + ScopedPyObjectPtr full_slice(PySlice_New(NULL, NULL, NULL)); + if (full_slice == NULL) { + return -1; + } + ScopedPyObjectPtr new_list(Subscript(self, full_slice)); + if (new_list == NULL) { + return -1; + } + if (PySequence_SetSlice(new_list, from, to, value) < 0) { + return -1; + } + + return InternalAssignRepeatedField(self, new_list); +} + +PyObject* Extend(RepeatedScalarContainer* self, PyObject* value) { + cmessage::AssureWritable(self->parent); + if (PyObject_Not(value)) { + Py_RETURN_NONE; + } + ScopedPyObjectPtr iter(PyObject_GetIter(value)); + if (iter == NULL) { + PyErr_SetString(PyExc_TypeError, "Value must be iterable"); + return NULL; + } + ScopedPyObjectPtr next; + while ((next.reset(PyIter_Next(iter))) != NULL) { + if (Append(self, next) == NULL) { + return NULL; + } + } + if (PyErr_Occurred()) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject* Insert(RepeatedScalarContainer* self, PyObject* args) { + Py_ssize_t index; + PyObject* value; + if (!PyArg_ParseTuple(args, "lO", &index, &value)) { + return NULL; + } + ScopedPyObjectPtr full_slice(PySlice_New(NULL, NULL, NULL)); + ScopedPyObjectPtr new_list(Subscript(self, full_slice)); + if (PyList_Insert(new_list, index, value) < 0) { + return NULL; + } + int ret = InternalAssignRepeatedField(self, new_list); + if (ret < 0) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject* Remove(RepeatedScalarContainer* self, PyObject* value) { + Py_ssize_t match_index = -1; + for (Py_ssize_t i = 0; i < Len(self); ++i) { + ScopedPyObjectPtr elem(Item(self, i)); + if (PyObject_RichCompareBool(elem, value, Py_EQ)) { + match_index = i; + break; + } + } + if (match_index == -1) { + PyErr_SetString(PyExc_ValueError, "remove(x): x not in container"); + return NULL; + } + if (AssignItem(self, match_index, NULL) < 0) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject* RichCompare(RepeatedScalarContainer* self, + PyObject* other, + int opid) { + if (opid != Py_EQ && opid != Py_NE) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + + // Copy the contents of this repeated scalar container, and other if it is + // also a repeated scalar container, into Python lists so we can delegate + // to the list's compare method. + + ScopedPyObjectPtr full_slice(PySlice_New(NULL, NULL, NULL)); + if (full_slice == NULL) { + return NULL; + } + + ScopedPyObjectPtr other_list_deleter; + if (PyObject_TypeCheck(other, &RepeatedScalarContainer_Type)) { + other_list_deleter.reset(Subscript( + reinterpret_cast(other), full_slice)); + other = other_list_deleter.get(); + } + + ScopedPyObjectPtr list(Subscript(self, full_slice)); + if (list == NULL) { + return NULL; + } + return PyObject_RichCompare(list, other, opid); +} + +PyObject* Reduce(RepeatedScalarContainer* unused_self) { + PyErr_Format( + PickleError_class, + "can't pickle repeated message fields, convert to list first"); + return NULL; +} + +static PyObject* Sort(RepeatedScalarContainer* self, + PyObject* args, + PyObject* kwds) { + // Support the old sort_function argument for backwards + // compatibility. + if (kwds != NULL) { + PyObject* sort_func = PyDict_GetItemString(kwds, "sort_function"); + if (sort_func != NULL) { + // Must set before deleting as sort_func is a borrowed reference + // and kwds might be the only thing keeping it alive. + if (PyDict_SetItemString(kwds, "cmp", sort_func) == -1) + return NULL; + if (PyDict_DelItemString(kwds, "sort_function") == -1) + return NULL; + } + } + + ScopedPyObjectPtr full_slice(PySlice_New(NULL, NULL, NULL)); + if (full_slice == NULL) { + return NULL; + } + ScopedPyObjectPtr list(Subscript(self, full_slice)); + if (list == NULL) { + return NULL; + } + ScopedPyObjectPtr m(PyObject_GetAttrString(list, "sort")); + if (m == NULL) { + return NULL; + } + ScopedPyObjectPtr res(PyObject_Call(m, args, kwds)); + if (res == NULL) { + return NULL; + } + int ret = InternalAssignRepeatedField(self, list); + if (ret < 0) { + return NULL; + } + Py_RETURN_NONE; +} + +static int Init(RepeatedScalarContainer* self, + PyObject* args, + PyObject* kwargs) { + PyObject* py_parent; + PyObject* py_parent_field; + if (!PyArg_UnpackTuple(args, "__init__()", 2, 2, &py_parent, + &py_parent_field)) { + return -1; + } + + if (!PyObject_TypeCheck(py_parent, &CMessage_Type)) { + PyErr_Format(PyExc_TypeError, + "expect %s, but got %s", + CMessage_Type.tp_name, + Py_TYPE(py_parent)->tp_name); + return -1; + } + + if (!PyObject_TypeCheck(py_parent_field, &CFieldDescriptor_Type)) { + PyErr_Format(PyExc_TypeError, + "expect %s, but got %s", + CFieldDescriptor_Type.tp_name, + Py_TYPE(py_parent_field)->tp_name); + return -1; + } + + CMessage* cmessage = reinterpret_cast(py_parent); + CFieldDescriptor* cdescriptor = reinterpret_cast( + py_parent_field); + + if (!FIELD_BELONGS_TO_MESSAGE(cdescriptor->descriptor, cmessage->message)) { + PyErr_SetString( + PyExc_KeyError, "Field does not belong to message!"); + return -1; + } + + self->message = cmessage->message; + self->parent = cmessage; + self->parent_field = cdescriptor; + self->owner = cmessage->owner; + return 0; +} + +// Initializes the underlying Message object of "to" so it becomes a new parent +// repeated scalar, and copies all the values from "from" to it. A child scalar +// container can be released by passing it as both from and to (e.g. making it +// the recipient of the new parent message and copying the values from itself). +static int InitializeAndCopyToParentContainer( + RepeatedScalarContainer* from, + RepeatedScalarContainer* to) { + ScopedPyObjectPtr full_slice(PySlice_New(NULL, NULL, NULL)); + if (full_slice == NULL) { + return -1; + } + ScopedPyObjectPtr values(Subscript(from, full_slice)); + if (values == NULL) { + return -1; + } + google::protobuf::Message* new_message = global_message_factory->GetPrototype( + from->message->GetDescriptor())->New(); + to->parent = NULL; + // TODO(anuraag): Document why it's OK to hang on to parent_field, + // even though it's a weak reference. It ought to be enough to + // hold on to the FieldDescriptor only. + to->parent_field = from->parent_field; + to->message = new_message; + to->owner.reset(new_message); + if (InternalAssignRepeatedField(to, values) < 0) { + return -1; + } + return 0; +} + +int Release(RepeatedScalarContainer* self) { + return InitializeAndCopyToParentContainer(self, self); +} + +PyObject* DeepCopy(RepeatedScalarContainer* self, PyObject* arg) { + ScopedPyObjectPtr init_args( + PyTuple_Pack(2, self->parent, self->parent_field)); + PyObject* clone = PyObject_CallObject( + reinterpret_cast(&RepeatedScalarContainer_Type), init_args); + if (clone == NULL) { + return NULL; + } + if (!PyObject_TypeCheck(clone, &RepeatedScalarContainer_Type)) { + Py_DECREF(clone); + return NULL; + } + if (InitializeAndCopyToParentContainer( + self, reinterpret_cast(clone)) < 0) { + Py_DECREF(clone); + return NULL; + } + return clone; +} + +static void Dealloc(RepeatedScalarContainer* self) { + self->owner.reset(); + Py_TYPE(self)->tp_free(reinterpret_cast(self)); +} + +void SetOwner(RepeatedScalarContainer* self, + const shared_ptr& new_owner) { + self->owner = new_owner; +} + +static PySequenceMethods SqMethods = { + (lenfunc)Len, /* sq_length */ + 0, /* sq_concat */ + 0, /* sq_repeat */ + (ssizeargfunc)Item, /* sq_item */ + 0, /* sq_slice */ + (ssizeobjargproc)AssignItem /* sq_ass_item */ +}; + +static PyMappingMethods MpMethods = { + (lenfunc)Len, /* mp_length */ + (binaryfunc)Subscript, /* mp_subscript */ + (objobjargproc)AssSubscript, /* mp_ass_subscript */ +}; + +static PyMethodDef Methods[] = { + { "__deepcopy__", (PyCFunction)DeepCopy, METH_VARARGS, + "Makes a deep copy of the class." }, + { "__reduce__", (PyCFunction)Reduce, METH_NOARGS, + "Outputs picklable representation of the repeated field." }, + { "append", (PyCFunction)Append, METH_O, + "Appends an object to the repeated container." }, + { "extend", (PyCFunction)Extend, METH_O, + "Appends objects to the repeated container." }, + { "insert", (PyCFunction)Insert, METH_VARARGS, + "Appends objects to the repeated container." }, + { "remove", (PyCFunction)Remove, METH_O, + "Removes an object from the repeated container." }, + { "sort", (PyCFunction)Sort, METH_VARARGS | METH_KEYWORDS, + "Sorts the repeated container."}, + { NULL, NULL } +}; + +} // namespace repeated_scalar_container + +PyTypeObject RepeatedScalarContainer_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "google.protobuf.internal." + "cpp._message.RepeatedScalarContainer", // tp_name + sizeof(RepeatedScalarContainer), // tp_basicsize + 0, // tp_itemsize + (destructor)repeated_scalar_container::Dealloc, // tp_dealloc + 0, // tp_print + 0, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + &repeated_scalar_container::SqMethods, // tp_as_sequence + &repeated_scalar_container::MpMethods, // tp_as_mapping + 0, // tp_hash + 0, // tp_call + 0, // tp_str + 0, // tp_getattro + 0, // tp_setattro + 0, // tp_as_buffer + Py_TPFLAGS_DEFAULT, // tp_flags + "A Repeated scalar container", // tp_doc + 0, // tp_traverse + 0, // tp_clear + (richcmpfunc)repeated_scalar_container::RichCompare, // tp_richcompare + 0, // tp_weaklistoffset + 0, // tp_iter + 0, // tp_iternext + repeated_scalar_container::Methods, // tp_methods + 0, // tp_members + 0, // tp_getset + 0, // tp_base + 0, // tp_dict + 0, // tp_descr_get + 0, // tp_descr_set + 0, // tp_dictoffset + (initproc)repeated_scalar_container::Init, // tp_init +}; + +} // namespace python +} // namespace protobuf +} // namespace google diff --git a/pythonlib/google/protobuf/pyext/repeated_scalar_container.h b/pythonlib/google/protobuf/pyext/repeated_scalar_container.h new file mode 100644 index 0000000..8a30138 --- /dev/null +++ b/pythonlib/google/protobuf/pyext/repeated_scalar_container.h @@ -0,0 +1,112 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: anuraag@google.com (Anuraag Agrawal) +// Author: tibell@google.com (Johan Tibell) + +#ifndef GOOGLE_PROTOBUF_PYTHON_CPP_REPEATED_SCALAR_CONTAINER_H__ +#define GOOGLE_PROTOBUF_PYTHON_CPP_REPEATED_SCALAR_CONTAINER_H__ + +#include + +#include +#ifndef _SHARED_PTR_H +#include +#endif + + +namespace google { +namespace protobuf { + +class Message; + +using internal::shared_ptr; + +namespace python { + +struct CFieldDescriptor; +struct CMessage; + +typedef struct RepeatedScalarContainer { + PyObject_HEAD; + + // This is the top-level C++ Message object that owns the whole + // proto tree. Every Python RepeatedScalarContainer holds a + // reference to it in order to keep it alive as long as there's a + // Python object that references any part of the tree. + shared_ptr owner; + + // Pointer to the C++ Message that contains this container. The + // RepeatedScalarContainer does not own this pointer. + Message* message; + + // Weak reference to a parent CMessage object (i.e. may be NULL.) + // + // Used to make sure all ancestors are also mutable when first + // modifying the container. + CMessage* parent; + + // Weak reference to the parent's descriptor that describes this + // field. Used together with the parent's message when making a + // default message instance mutable. + CFieldDescriptor* parent_field; +} RepeatedScalarContainer; + +extern PyTypeObject RepeatedScalarContainer_Type; + +namespace repeated_scalar_container { + +// Appends the scalar 'item' to the end of the container 'self'. +// +// Returns None if successful; returns NULL and sets an exception if +// unsuccessful. +PyObject* Append(RepeatedScalarContainer* self, PyObject* item); + +// Releases the messages in the container to a new message. +// +// Returns 0 on success, -1 on failure. +int Release(RepeatedScalarContainer* self); + +// Appends all the elements in the input iterator to the container. +// +// Returns None if successful; returns NULL and sets an exception if +// unsuccessful. +PyObject* Extend(RepeatedScalarContainer* self, PyObject* value); + +// Set the owner field of self and any children of self. +void SetOwner(RepeatedScalarContainer* self, + const shared_ptr& new_owner); + +} // namespace repeated_scalar_container +} // namespace python +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_PYTHON_CPP_REPEATED_SCALAR_CONTAINER_H__ diff --git a/pythonlib/google/protobuf/pyext/scoped_pyobject_ptr.h b/pythonlib/google/protobuf/pyext/scoped_pyobject_ptr.h new file mode 100644 index 0000000..1b27a89 --- /dev/null +++ b/pythonlib/google/protobuf/pyext/scoped_pyobject_ptr.h @@ -0,0 +1,95 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// 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. + +// Author: tibell@google.com (Johan Tibell) + +#ifndef GOOGLE_PROTOBUF_PYTHON_CPP_SCOPED_PYOBJECT_PTR_H__ +#define GOOGLE_PROTOBUF_PYTHON_CPP_SCOPED_PYOBJECT_PTR_H__ + +#include + +namespace google { +class ScopedPyObjectPtr { + public: + // Constructor. Defaults to intializing with NULL. + // There is no way to create an uninitialized ScopedPyObjectPtr. + explicit ScopedPyObjectPtr(PyObject* p = NULL) : ptr_(p) { } + + // Destructor. If there is a PyObject object, delete it. + ~ScopedPyObjectPtr() { + Py_XDECREF(ptr_); + } + + // Reset. Deletes the current owned object, if any. + // Then takes ownership of a new object, if given. + // this->reset(this->get()) works. + PyObject* reset(PyObject* p = NULL) { + if (p != ptr_) { + Py_XDECREF(ptr_); + ptr_ = p; + } + return ptr_; + } + + // Releases ownership of the object. + PyObject* release() { + PyObject* p = ptr_; + ptr_ = NULL; + return p; + } + + operator PyObject*() { return ptr_; } + + PyObject* operator->() const { + assert(ptr_ != NULL); + return ptr_; + } + + PyObject* get() const { return ptr_; } + + Py_ssize_t refcnt() const { return Py_REFCNT(ptr_); } + + void inc() const { Py_INCREF(ptr_); } + + // Comparison operators. + // These return whether a ScopedPyObjectPtr and a raw pointer + // refer to the same object, not just to two different but equal + // objects. + bool operator==(const PyObject* p) const { return ptr_ == p; } + bool operator!=(const PyObject* p) const { return ptr_ != p; } + + private: + PyObject* ptr_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ScopedPyObjectPtr); +}; + +} // namespace google +#endif // GOOGLE_PROTOBUF_PYTHON_CPP_SCOPED_PYOBJECT_PTR_H__ diff --git a/pythonlib/google/protobuf/reflection.py b/pythonlib/google/protobuf/reflection.py new file mode 100644 index 0000000..7aac623 --- /dev/null +++ b/pythonlib/google/protobuf/reflection.py @@ -0,0 +1,205 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +# This code is meant to work on Python 2.4 and above only. + +"""Contains a metaclass and helper functions used to create +protocol message classes from Descriptor objects at runtime. + +Recall that a metaclass is the "type" of a class. +(A class is to a metaclass what an instance is to a class.) + +In this case, we use the GeneratedProtocolMessageType metaclass +to inject all the useful functionality into the classes +output by the protocol compiler at compile-time. + +The upshot of all this is that the real implementation +details for ALL pure-Python protocol buffers are *here in +this file*. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + + +from google.protobuf.internal import api_implementation +from google.protobuf import descriptor as descriptor_mod +from google.protobuf import message + +_FieldDescriptor = descriptor_mod.FieldDescriptor + + +if api_implementation.Type() == 'cpp': + if api_implementation.Version() == 2: + from google.protobuf.pyext import cpp_message + _NewMessage = cpp_message.NewMessage + _InitMessage = cpp_message.InitMessage + else: + from google.protobuf.internal import cpp_message + _NewMessage = cpp_message.NewMessage + _InitMessage = cpp_message.InitMessage +else: + from google.protobuf.internal import python_message + _NewMessage = python_message.NewMessage + _InitMessage = python_message.InitMessage + + +class GeneratedProtocolMessageType(type): + + """Metaclass for protocol message classes created at runtime from Descriptors. + + We add implementations for all methods described in the Message class. We + also create properties to allow getting/setting all fields in the protocol + message. Finally, we create slots to prevent users from accidentally + "setting" nonexistent fields in the protocol message, which then wouldn't get + serialized / deserialized properly. + + The protocol compiler currently uses this metaclass to create protocol + message classes at runtime. Clients can also manually create their own + classes at runtime, as in this example: + + mydescriptor = Descriptor(.....) + class MyProtoClass(Message): + __metaclass__ = GeneratedProtocolMessageType + DESCRIPTOR = mydescriptor + myproto_instance = MyProtoClass() + myproto.foo_field = 23 + ... + + The above example will not work for nested types. If you wish to include them, + use reflection.MakeClass() instead of manually instantiating the class in + order to create the appropriate class structure. + """ + + # Must be consistent with the protocol-compiler code in + # proto2/compiler/internal/generator.*. + _DESCRIPTOR_KEY = 'DESCRIPTOR' + + def __new__(cls, name, bases, dictionary): + """Custom allocation for runtime-generated class types. + + We override __new__ because this is apparently the only place + where we can meaningfully set __slots__ on the class we're creating(?). + (The interplay between metaclasses and slots is not very well-documented). + + Args: + name: Name of the class (ignored, but required by the + metaclass protocol). + bases: Base classes of the class we're constructing. + (Should be message.Message). We ignore this field, but + it's required by the metaclass protocol + dictionary: The class dictionary of the class we're + constructing. dictionary[_DESCRIPTOR_KEY] must contain + a Descriptor object describing this protocol message + type. + + Returns: + Newly-allocated class. + """ + descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY] + bases = _NewMessage(bases, descriptor, dictionary) + superclass = super(GeneratedProtocolMessageType, cls) + + new_class = superclass.__new__(cls, name, bases, dictionary) + setattr(descriptor, '_concrete_class', new_class) + return new_class + + def __init__(cls, name, bases, dictionary): + """Here we perform the majority of our work on the class. + We add enum getters, an __init__ method, implementations + of all Message methods, and properties for all fields + in the protocol type. + + Args: + name: Name of the class (ignored, but required by the + metaclass protocol). + bases: Base classes of the class we're constructing. + (Should be message.Message). We ignore this field, but + it's required by the metaclass protocol + dictionary: The class dictionary of the class we're + constructing. dictionary[_DESCRIPTOR_KEY] must contain + a Descriptor object describing this protocol message + type. + """ + descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY] + _InitMessage(descriptor, cls) + superclass = super(GeneratedProtocolMessageType, cls) + superclass.__init__(name, bases, dictionary) + + +def ParseMessage(descriptor, byte_str): + """Generate a new Message instance from this Descriptor and a byte string. + + Args: + descriptor: Protobuf Descriptor object + byte_str: Serialized protocol buffer byte string + + Returns: + Newly created protobuf Message object. + """ + result_class = MakeClass(descriptor) + new_msg = result_class() + new_msg.ParseFromString(byte_str) + return new_msg + + +def MakeClass(descriptor): + """Construct a class object for a protobuf described by descriptor. + + Composite descriptors are handled by defining the new class as a member of the + parent class, recursing as deep as necessary. + This is the dynamic equivalent to: + + class Parent(message.Message): + __metaclass__ = GeneratedProtocolMessageType + DESCRIPTOR = descriptor + class Child(message.Message): + __metaclass__ = GeneratedProtocolMessageType + DESCRIPTOR = descriptor.nested_types[0] + + Sample usage: + file_descriptor = descriptor_pb2.FileDescriptorProto() + file_descriptor.ParseFromString(proto2_string) + msg_descriptor = descriptor.MakeDescriptor(file_descriptor.message_type[0]) + msg_class = reflection.MakeClass(msg_descriptor) + msg = msg_class() + + Args: + descriptor: A descriptor.Descriptor object describing the protobuf. + Returns: + The Message class object described by the descriptor. + """ + attributes = {} + for name, nested_type in descriptor.nested_types_by_name.items(): + attributes[name] = MakeClass(nested_type) + + attributes[GeneratedProtocolMessageType._DESCRIPTOR_KEY] = descriptor + + return GeneratedProtocolMessageType(str(descriptor.name), (message.Message,), + attributes) diff --git a/pythonlib/google/protobuf/service.py b/pythonlib/google/protobuf/service.py new file mode 100644 index 0000000..180b70e --- /dev/null +++ b/pythonlib/google/protobuf/service.py @@ -0,0 +1,226 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""DEPRECATED: Declares the RPC service interfaces. + +This module declares the abstract interfaces underlying proto2 RPC +services. These are intended to be independent of any particular RPC +implementation, so that proto2 services can be used on top of a variety +of implementations. Starting with version 2.3.0, RPC implementations should +not try to build on these, but should instead provide code generator plugins +which generate code specific to the particular RPC implementation. This way +the generated code can be more appropriate for the implementation in use +and can avoid unnecessary layers of indirection. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + + +class RpcException(Exception): + """Exception raised on failed blocking RPC method call.""" + pass + + +class Service(object): + + """Abstract base interface for protocol-buffer-based RPC services. + + Services themselves are abstract classes (implemented either by servers or as + stubs), but they subclass this base interface. The methods of this + interface can be used to call the methods of the service without knowing + its exact type at compile time (analogous to the Message interface). + """ + + def GetDescriptor(): + """Retrieves this service's descriptor.""" + raise NotImplementedError + + def CallMethod(self, method_descriptor, rpc_controller, + request, done): + """Calls a method of the service specified by method_descriptor. + + If "done" is None then the call is blocking and the response + message will be returned directly. Otherwise the call is asynchronous + and "done" will later be called with the response value. + + In the blocking case, RpcException will be raised on error. + + Preconditions: + * method_descriptor.service == GetDescriptor + * request is of the exact same classes as returned by + GetRequestClass(method). + * After the call has started, the request must not be modified. + * "rpc_controller" is of the correct type for the RPC implementation being + used by this Service. For stubs, the "correct type" depends on the + RpcChannel which the stub is using. + + Postconditions: + * "done" will be called when the method is complete. This may be + before CallMethod() returns or it may be at some point in the future. + * If the RPC failed, the response value passed to "done" will be None. + Further details about the failure can be found by querying the + RpcController. + """ + raise NotImplementedError + + def GetRequestClass(self, method_descriptor): + """Returns the class of the request message for the specified method. + + CallMethod() requires that the request is of a particular subclass of + Message. GetRequestClass() gets the default instance of this required + type. + + Example: + method = service.GetDescriptor().FindMethodByName("Foo") + request = stub.GetRequestClass(method)() + request.ParseFromString(input) + service.CallMethod(method, request, callback) + """ + raise NotImplementedError + + def GetResponseClass(self, method_descriptor): + """Returns the class of the response message for the specified method. + + This method isn't really needed, as the RpcChannel's CallMethod constructs + the response protocol message. It's provided anyway in case it is useful + for the caller to know the response type in advance. + """ + raise NotImplementedError + + +class RpcController(object): + + """An RpcController mediates a single method call. + + The primary purpose of the controller is to provide a way to manipulate + settings specific to the RPC implementation and to find out about RPC-level + errors. The methods provided by the RpcController interface are intended + to be a "least common denominator" set of features which we expect all + implementations to support. Specific implementations may provide more + advanced features (e.g. deadline propagation). + """ + + # Client-side methods below + + def Reset(self): + """Resets the RpcController to its initial state. + + After the RpcController has been reset, it may be reused in + a new call. Must not be called while an RPC is in progress. + """ + raise NotImplementedError + + def Failed(self): + """Returns true if the call failed. + + After a call has finished, returns true if the call failed. The possible + reasons for failure depend on the RPC implementation. Failed() must not + be called before a call has finished. If Failed() returns true, the + contents of the response message are undefined. + """ + raise NotImplementedError + + def ErrorText(self): + """If Failed is true, returns a human-readable description of the error.""" + raise NotImplementedError + + def StartCancel(self): + """Initiate cancellation. + + Advises the RPC system that the caller desires that the RPC call be + canceled. The RPC system may cancel it immediately, may wait awhile and + then cancel it, or may not even cancel the call at all. If the call is + canceled, the "done" callback will still be called and the RpcController + will indicate that the call failed at that time. + """ + raise NotImplementedError + + # Server-side methods below + + def SetFailed(self, reason): + """Sets a failure reason. + + Causes Failed() to return true on the client side. "reason" will be + incorporated into the message returned by ErrorText(). If you find + you need to return machine-readable information about failures, you + should incorporate it into your response protocol buffer and should + NOT call SetFailed(). + """ + raise NotImplementedError + + def IsCanceled(self): + """Checks if the client cancelled the RPC. + + If true, indicates that the client canceled the RPC, so the server may + as well give up on replying to it. The server should still call the + final "done" callback. + """ + raise NotImplementedError + + def NotifyOnCancel(self, callback): + """Sets a callback to invoke on cancel. + + Asks that the given callback be called when the RPC is canceled. The + callback will always be called exactly once. If the RPC completes without + being canceled, the callback will be called after completion. If the RPC + has already been canceled when NotifyOnCancel() is called, the callback + will be called immediately. + + NotifyOnCancel() must be called no more than once per request. + """ + raise NotImplementedError + + +class RpcChannel(object): + + """Abstract interface for an RPC channel. + + An RpcChannel represents a communication line to a service which can be used + to call that service's methods. The service may be running on another + machine. Normally, you should not use an RpcChannel directly, but instead + construct a stub {@link Service} wrapping it. Example: + + Example: + RpcChannel channel = rpcImpl.Channel("remotehost.example.com:1234") + RpcController controller = rpcImpl.Controller() + MyService service = MyService_Stub(channel) + service.MyMethod(controller, request, callback) + """ + + def CallMethod(self, method_descriptor, rpc_controller, + request, response_class, done): + """Calls the method identified by the descriptor. + + Call the given method of the remote service. The signature of this + procedure looks the same as Service.CallMethod(), but the requirements + are less strict in one important way: the request object doesn't have to + be of any specific class as long as its descriptor is method.input_type. + """ + raise NotImplementedError diff --git a/pythonlib/google/protobuf/service_reflection.py b/pythonlib/google/protobuf/service_reflection.py new file mode 100644 index 0000000..851e83e --- /dev/null +++ b/pythonlib/google/protobuf/service_reflection.py @@ -0,0 +1,284 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""Contains metaclasses used to create protocol service and service stub +classes from ServiceDescriptor objects at runtime. + +The GeneratedServiceType and GeneratedServiceStubType metaclasses are used to +inject all useful functionality into the classes output by the protocol +compiler at compile-time. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + + +class GeneratedServiceType(type): + + """Metaclass for service classes created at runtime from ServiceDescriptors. + + Implementations for all methods described in the Service class are added here + by this class. We also create properties to allow getting/setting all fields + in the protocol message. + + The protocol compiler currently uses this metaclass to create protocol service + classes at runtime. Clients can also manually create their own classes at + runtime, as in this example: + + mydescriptor = ServiceDescriptor(.....) + class MyProtoService(service.Service): + __metaclass__ = GeneratedServiceType + DESCRIPTOR = mydescriptor + myservice_instance = MyProtoService() + ... + """ + + _DESCRIPTOR_KEY = 'DESCRIPTOR' + + def __init__(cls, name, bases, dictionary): + """Creates a message service class. + + Args: + name: Name of the class (ignored, but required by the metaclass + protocol). + bases: Base classes of the class being constructed. + dictionary: The class dictionary of the class being constructed. + dictionary[_DESCRIPTOR_KEY] must contain a ServiceDescriptor object + describing this protocol service type. + """ + # Don't do anything if this class doesn't have a descriptor. This happens + # when a service class is subclassed. + if GeneratedServiceType._DESCRIPTOR_KEY not in dictionary: + return + descriptor = dictionary[GeneratedServiceType._DESCRIPTOR_KEY] + service_builder = _ServiceBuilder(descriptor) + service_builder.BuildService(cls) + + +class GeneratedServiceStubType(GeneratedServiceType): + + """Metaclass for service stubs created at runtime from ServiceDescriptors. + + This class has similar responsibilities as GeneratedServiceType, except that + it creates the service stub classes. + """ + + _DESCRIPTOR_KEY = 'DESCRIPTOR' + + def __init__(cls, name, bases, dictionary): + """Creates a message service stub class. + + Args: + name: Name of the class (ignored, here). + bases: Base classes of the class being constructed. + dictionary: The class dictionary of the class being constructed. + dictionary[_DESCRIPTOR_KEY] must contain a ServiceDescriptor object + describing this protocol service type. + """ + super(GeneratedServiceStubType, cls).__init__(name, bases, dictionary) + # Don't do anything if this class doesn't have a descriptor. This happens + # when a service stub is subclassed. + if GeneratedServiceStubType._DESCRIPTOR_KEY not in dictionary: + return + descriptor = dictionary[GeneratedServiceStubType._DESCRIPTOR_KEY] + service_stub_builder = _ServiceStubBuilder(descriptor) + service_stub_builder.BuildServiceStub(cls) + + +class _ServiceBuilder(object): + + """This class constructs a protocol service class using a service descriptor. + + Given a service descriptor, this class constructs a class that represents + the specified service descriptor. One service builder instance constructs + exactly one service class. That means all instances of that class share the + same builder. + """ + + def __init__(self, service_descriptor): + """Initializes an instance of the service class builder. + + Args: + service_descriptor: ServiceDescriptor to use when constructing the + service class. + """ + self.descriptor = service_descriptor + + def BuildService(self, cls): + """Constructs the service class. + + Args: + cls: The class that will be constructed. + """ + + # CallMethod needs to operate with an instance of the Service class. This + # internal wrapper function exists only to be able to pass the service + # instance to the method that does the real CallMethod work. + def _WrapCallMethod(srvc, method_descriptor, + rpc_controller, request, callback): + return self._CallMethod(srvc, method_descriptor, + rpc_controller, request, callback) + self.cls = cls + cls.CallMethod = _WrapCallMethod + cls.GetDescriptor = staticmethod(lambda: self.descriptor) + cls.GetDescriptor.__doc__ = "Returns the service descriptor." + cls.GetRequestClass = self._GetRequestClass + cls.GetResponseClass = self._GetResponseClass + for method in self.descriptor.methods: + setattr(cls, method.name, self._GenerateNonImplementedMethod(method)) + + def _CallMethod(self, srvc, method_descriptor, + rpc_controller, request, callback): + """Calls the method described by a given method descriptor. + + Args: + srvc: Instance of the service for which this method is called. + method_descriptor: Descriptor that represent the method to call. + rpc_controller: RPC controller to use for this method's execution. + request: Request protocol message. + callback: A callback to invoke after the method has completed. + """ + if method_descriptor.containing_service != self.descriptor: + raise RuntimeError( + 'CallMethod() given method descriptor for wrong service type.') + method = getattr(srvc, method_descriptor.name) + return method(rpc_controller, request, callback) + + def _GetRequestClass(self, method_descriptor): + """Returns the class of the request protocol message. + + Args: + method_descriptor: Descriptor of the method for which to return the + request protocol message class. + + Returns: + A class that represents the input protocol message of the specified + method. + """ + if method_descriptor.containing_service != self.descriptor: + raise RuntimeError( + 'GetRequestClass() given method descriptor for wrong service type.') + return method_descriptor.input_type._concrete_class + + def _GetResponseClass(self, method_descriptor): + """Returns the class of the response protocol message. + + Args: + method_descriptor: Descriptor of the method for which to return the + response protocol message class. + + Returns: + A class that represents the output protocol message of the specified + method. + """ + if method_descriptor.containing_service != self.descriptor: + raise RuntimeError( + 'GetResponseClass() given method descriptor for wrong service type.') + return method_descriptor.output_type._concrete_class + + def _GenerateNonImplementedMethod(self, method): + """Generates and returns a method that can be set for a service methods. + + Args: + method: Descriptor of the service method for which a method is to be + generated. + + Returns: + A method that can be added to the service class. + """ + return lambda inst, rpc_controller, request, callback: ( + self._NonImplementedMethod(method.name, rpc_controller, callback)) + + def _NonImplementedMethod(self, method_name, rpc_controller, callback): + """The body of all methods in the generated service class. + + Args: + method_name: Name of the method being executed. + rpc_controller: RPC controller used to execute this method. + callback: A callback which will be invoked when the method finishes. + """ + rpc_controller.SetFailed('Method %s not implemented.' % method_name) + callback(None) + + +class _ServiceStubBuilder(object): + + """Constructs a protocol service stub class using a service descriptor. + + Given a service descriptor, this class constructs a suitable stub class. + A stub is just a type-safe wrapper around an RpcChannel which emulates a + local implementation of the service. + + One service stub builder instance constructs exactly one class. It means all + instances of that class share the same service stub builder. + """ + + def __init__(self, service_descriptor): + """Initializes an instance of the service stub class builder. + + Args: + service_descriptor: ServiceDescriptor to use when constructing the + stub class. + """ + self.descriptor = service_descriptor + + def BuildServiceStub(self, cls): + """Constructs the stub class. + + Args: + cls: The class that will be constructed. + """ + + def _ServiceStubInit(stub, rpc_channel): + stub.rpc_channel = rpc_channel + self.cls = cls + cls.__init__ = _ServiceStubInit + for method in self.descriptor.methods: + setattr(cls, method.name, self._GenerateStubMethod(method)) + + def _GenerateStubMethod(self, method): + return (lambda inst, rpc_controller, request, callback=None: + self._StubMethod(inst, method, rpc_controller, request, callback)) + + def _StubMethod(self, stub, method_descriptor, + rpc_controller, request, callback): + """The body of all service methods in the generated stub class. + + Args: + stub: Stub instance. + method_descriptor: Descriptor of the invoked method. + rpc_controller: Rpc controller to execute the method. + request: Request protocol message. + callback: A callback to execute when the method finishes. + Returns: + Response message (in case of blocking call). + """ + return stub.rpc_channel.CallMethod( + method_descriptor, rpc_controller, request, + method_descriptor.output_type._concrete_class, callback) diff --git a/pythonlib/google/protobuf/symbol_database.py b/pythonlib/google/protobuf/symbol_database.py new file mode 100644 index 0000000..7466fec --- /dev/null +++ b/pythonlib/google/protobuf/symbol_database.py @@ -0,0 +1,185 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +"""A database of Python protocol buffer generated symbols. + +SymbolDatabase makes it easy to create new instances of a registered type, given +only the type's protocol buffer symbol name. Once all symbols are registered, +they can be accessed using either the MessageFactory interface which +SymbolDatabase exposes, or the DescriptorPool interface of the underlying +pool. + +Example usage: + + db = symbol_database.SymbolDatabase() + + # Register symbols of interest, from one or multiple files. + db.RegisterFileDescriptor(my_proto_pb2.DESCRIPTOR) + db.RegisterMessage(my_proto_pb2.MyMessage) + db.RegisterEnumDescriptor(my_proto_pb2.MyEnum.DESCRIPTOR) + + # The database can be used as a MessageFactory, to generate types based on + # their name: + types = db.GetMessages(['my_proto.proto']) + my_message_instance = types['MyMessage']() + + # The database's underlying descriptor pool can be queried, so it's not + # necessary to know a type's filename to be able to generate it: + filename = db.pool.FindFileContainingSymbol('MyMessage') + my_message_instance = db.GetMessages([filename])['MyMessage']() + + # This functionality is also provided directly via a convenience method: + my_message_instance = db.GetSymbol('MyMessage')() +""" + + +from google.protobuf import descriptor_pool + + +class SymbolDatabase(object): + """A database of Python generated symbols. + + SymbolDatabase also models message_factory.MessageFactory. + + The symbol database can be used to keep a global registry of all protocol + buffer types used within a program. + """ + + def __init__(self): + """Constructor.""" + + self._symbols = {} + self._symbols_by_file = {} + self.pool = descriptor_pool.DescriptorPool() + + def RegisterMessage(self, message): + """Registers the given message type in the local database. + + Args: + message: a message.Message, to be registered. + + Returns: + The provided message. + """ + + desc = message.DESCRIPTOR + self._symbols[desc.full_name] = message + if desc.file.name not in self._symbols_by_file: + self._symbols_by_file[desc.file.name] = {} + self._symbols_by_file[desc.file.name][desc.full_name] = message + self.pool.AddDescriptor(desc) + return message + + def RegisterEnumDescriptor(self, enum_descriptor): + """Registers the given enum descriptor in the local database. + + Args: + enum_descriptor: a descriptor.EnumDescriptor. + + Returns: + The provided descriptor. + """ + self.pool.AddEnumDescriptor(enum_descriptor) + return enum_descriptor + + def RegisterFileDescriptor(self, file_descriptor): + """Registers the given file descriptor in the local database. + + Args: + file_descriptor: a descriptor.FileDescriptor. + + Returns: + The provided descriptor. + """ + self.pool.AddFileDescriptor(file_descriptor) + + def GetSymbol(self, symbol): + """Tries to find a symbol in the local database. + + Currently, this method only returns message.Message instances, however, if + may be extended in future to support other symbol types. + + Args: + symbol: A str, a protocol buffer symbol. + + Returns: + A Python class corresponding to the symbol. + + Raises: + KeyError: if the symbol could not be found. + """ + + return self._symbols[symbol] + + def GetPrototype(self, descriptor): + """Builds a proto2 message class based on the passed in descriptor. + + Passing a descriptor with a fully qualified name matching a previous + invocation will cause the same class to be returned. + + Args: + descriptor: The descriptor to build from. + + Returns: + A class describing the passed in descriptor. + """ + + return self.GetSymbol(descriptor.full_name) + + def GetMessages(self, files): + """Gets all the messages from a specified file. + + This will find and resolve dependencies, failing if they are not registered + in the symbol database. + + + Args: + files: The file names to extract messages from. + + Returns: + A dictionary mapping proto names to the message classes. This will include + any dependent messages as well as any messages defined in the same file as + a specified message. + + Raises: + KeyError: if a file could not be found. + """ + + result = {} + for f in files: + result.update(self._symbols_by_file[f]) + return result + +_DEFAULT = SymbolDatabase() + + +def Default(): + """Returns the default SymbolDatabase.""" + return _DEFAULT diff --git a/pythonlib/google/protobuf/text_encoding.py b/pythonlib/google/protobuf/text_encoding.py new file mode 100644 index 0000000..ed0aabf --- /dev/null +++ b/pythonlib/google/protobuf/text_encoding.py @@ -0,0 +1,110 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +#PY25 compatible for GAE. +# +"""Encoding related utilities.""" + +import re +import sys ##PY25 + +# Lookup table for utf8 +_cescape_utf8_to_str = [chr(i) for i in xrange(0, 256)] +_cescape_utf8_to_str[9] = r'\t' # optional escape +_cescape_utf8_to_str[10] = r'\n' # optional escape +_cescape_utf8_to_str[13] = r'\r' # optional escape +_cescape_utf8_to_str[39] = r"\'" # optional escape + +_cescape_utf8_to_str[34] = r'\"' # necessary escape +_cescape_utf8_to_str[92] = r'\\' # necessary escape + +# Lookup table for non-utf8, with necessary escapes at (o >= 127 or o < 32) +_cescape_byte_to_str = ([r'\%03o' % i for i in xrange(0, 32)] + + [chr(i) for i in xrange(32, 127)] + + [r'\%03o' % i for i in xrange(127, 256)]) +_cescape_byte_to_str[9] = r'\t' # optional escape +_cescape_byte_to_str[10] = r'\n' # optional escape +_cescape_byte_to_str[13] = r'\r' # optional escape +_cescape_byte_to_str[39] = r"\'" # optional escape + +_cescape_byte_to_str[34] = r'\"' # necessary escape +_cescape_byte_to_str[92] = r'\\' # necessary escape + + +def CEscape(text, as_utf8): + """Escape a bytes string for use in an ascii protocol buffer. + + text.encode('string_escape') does not seem to satisfy our needs as it + encodes unprintable characters using two-digit hex escapes whereas our + C++ unescaping function allows hex escapes to be any length. So, + "\0011".encode('string_escape') ends up being "\\x011", which will be + decoded in C++ as a single-character string with char code 0x11. + + Args: + text: A byte string to be escaped + as_utf8: Specifies if result should be returned in UTF-8 encoding + Returns: + Escaped string + """ + # PY3 hack: make Ord work for str and bytes: + # //platforms/networking/data uses unicode here, hence basestring. + Ord = ord if isinstance(text, basestring) else lambda x: x + if as_utf8: + return ''.join(_cescape_utf8_to_str[Ord(c)] for c in text) + return ''.join(_cescape_byte_to_str[Ord(c)] for c in text) + + +_CUNESCAPE_HEX = re.compile(r'(\\+)x([0-9a-fA-F])(?![0-9a-fA-F])') +_cescape_highbit_to_str = ([chr(i) for i in range(0, 127)] + + [r'\%03o' % i for i in range(127, 256)]) + + +def CUnescape(text): + """Unescape a text string with C-style escape sequences to UTF-8 bytes.""" + + def ReplaceHex(m): + # Only replace the match if the number of leading back slashes is odd. i.e. + # the slash itself is not escaped. + if len(m.group(1)) & 1: + return m.group(1) + 'x0' + m.group(2) + return m.group(0) + + # This is required because the 'string_escape' encoding doesn't + # allow single-digit hex escapes (like '\xf'). + result = _CUNESCAPE_HEX.sub(ReplaceHex, text) + + if sys.version_info[0] < 3: ##PY25 +##!PY25 if str is bytes: # PY2 + return result.decode('string_escape') + result = ''.join(_cescape_highbit_to_str[ord(c)] for c in result) + return (result.encode('ascii') # Make it bytes to allow decode. + .decode('unicode_escape') + # Make it bytes again to return the proper type. + .encode('raw_unicode_escape')) diff --git a/pythonlib/google/protobuf/text_format.py b/pythonlib/google/protobuf/text_format.py new file mode 100644 index 0000000..50f76f2 --- /dev/null +++ b/pythonlib/google/protobuf/text_format.py @@ -0,0 +1,873 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# 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. + +#PY25 compatible for GAE. +# +# Copyright 2007 Google Inc. All Rights Reserved. + +"""Contains routines for printing protocol messages in text format.""" + +__author__ = 'kenton@google.com (Kenton Varda)' + +import cStringIO +import re + +from google.protobuf.internal import type_checkers +from google.protobuf import descriptor +from google.protobuf import text_encoding + +__all__ = ['MessageToString', 'PrintMessage', 'PrintField', + 'PrintFieldValue', 'Merge'] + + +_INTEGER_CHECKERS = (type_checkers.Uint32ValueChecker(), + type_checkers.Int32ValueChecker(), + type_checkers.Uint64ValueChecker(), + type_checkers.Int64ValueChecker()) +_FLOAT_INFINITY = re.compile('-?inf(?:inity)?f?', re.IGNORECASE) +_FLOAT_NAN = re.compile('nanf?', re.IGNORECASE) +_FLOAT_TYPES = frozenset([descriptor.FieldDescriptor.CPPTYPE_FLOAT, + descriptor.FieldDescriptor.CPPTYPE_DOUBLE]) + + +class Error(Exception): + """Top-level module error for text_format.""" + + +class ParseError(Error): + """Thrown in case of ASCII parsing error.""" + + +def MessageToString(message, as_utf8=False, as_one_line=False, + pointy_brackets=False, use_index_order=False, + float_format=None): + """Convert protobuf message to text format. + + Floating point values can be formatted compactly with 15 digits of + precision (which is the most that IEEE 754 "double" can guarantee) + using float_format='.15g'. + + Args: + message: The protocol buffers message. + as_utf8: Produce text output in UTF8 format. + as_one_line: Don't introduce newlines between fields. + pointy_brackets: If True, use angle brackets instead of curly braces for + nesting. + use_index_order: If True, print fields of a proto message using the order + defined in source code instead of the field number. By default, use the + field number order. + float_format: If set, use this to specify floating point number formatting + (per the "Format Specification Mini-Language"); otherwise, str() is used. + + Returns: + A string of the text formatted protocol buffer message. + """ + out = cStringIO.StringIO() + PrintMessage(message, out, as_utf8=as_utf8, as_one_line=as_one_line, + pointy_brackets=pointy_brackets, + use_index_order=use_index_order, + float_format=float_format) + result = out.getvalue() + out.close() + if as_one_line: + return result.rstrip() + return result + + +def PrintMessage(message, out, indent=0, as_utf8=False, as_one_line=False, + pointy_brackets=False, use_index_order=False, + float_format=None): + fields = message.ListFields() + if use_index_order: + fields.sort(key=lambda x: x[0].index) + for field, value in fields: + if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + for element in value: + PrintField(field, element, out, indent, as_utf8, as_one_line, + pointy_brackets=pointy_brackets, + float_format=float_format) + else: + PrintField(field, value, out, indent, as_utf8, as_one_line, + pointy_brackets=pointy_brackets, + float_format=float_format) + + +def PrintField(field, value, out, indent=0, as_utf8=False, as_one_line=False, + pointy_brackets=False, float_format=None): + """Print a single field name/value pair. For repeated fields, the value + should be a single element.""" + + out.write(' ' * indent) + if field.is_extension: + out.write('[') + if (field.containing_type.GetOptions().message_set_wire_format and + field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and + field.message_type == field.extension_scope and + field.label == descriptor.FieldDescriptor.LABEL_OPTIONAL): + out.write(field.message_type.full_name) + else: + out.write(field.full_name) + out.write(']') + elif field.type == descriptor.FieldDescriptor.TYPE_GROUP: + # For groups, use the capitalized name. + out.write(field.message_type.name) + else: + out.write(field.name) + + if field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + # The colon is optional in this case, but our cross-language golden files + # don't include it. + out.write(': ') + + PrintFieldValue(field, value, out, indent, as_utf8, as_one_line, + pointy_brackets=pointy_brackets, + float_format=float_format) + if as_one_line: + out.write(' ') + else: + out.write('\n') + + +def PrintFieldValue(field, value, out, indent=0, as_utf8=False, + as_one_line=False, pointy_brackets=False, + float_format=None): + """Print a single field value (not including name). For repeated fields, + the value should be a single element.""" + + if pointy_brackets: + openb = '<' + closeb = '>' + else: + openb = '{' + closeb = '}' + + if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + if as_one_line: + out.write(' %s ' % openb) + PrintMessage(value, out, indent, as_utf8, as_one_line, + pointy_brackets=pointy_brackets, + float_format=float_format) + out.write(closeb) + else: + out.write(' %s\n' % openb) + PrintMessage(value, out, indent + 2, as_utf8, as_one_line, + pointy_brackets=pointy_brackets, + float_format=float_format) + out.write(' ' * indent + closeb) + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM: + enum_value = field.enum_type.values_by_number.get(value, None) + if enum_value is not None: + out.write(enum_value.name) + else: + out.write(str(value)) + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_STRING: + out.write('\"') + if isinstance(value, unicode): + out_value = value.encode('utf-8') + else: + out_value = value + if field.type == descriptor.FieldDescriptor.TYPE_BYTES: + # We need to escape non-UTF8 chars in TYPE_BYTES field. + out_as_utf8 = False + else: + out_as_utf8 = as_utf8 + out.write(text_encoding.CEscape(out_value, out_as_utf8)) + out.write('\"') + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_BOOL: + if value: + out.write('true') + else: + out.write('false') + elif field.cpp_type in _FLOAT_TYPES and float_format is not None: + out.write('{1:{0}}'.format(float_format, value)) + else: + out.write(str(value)) + + +def _ParseOrMerge(lines, message, allow_multiple_scalars): + """Converts an ASCII representation of a protocol message into a message. + + Args: + lines: Lines of a message's ASCII representation. + message: A protocol buffer message to merge into. + allow_multiple_scalars: Determines if repeated values for a non-repeated + field are permitted, e.g., the string "foo: 1 foo: 2" for a + required/optional field named "foo". + + Raises: + ParseError: On ASCII parsing problems. + """ + tokenizer = _Tokenizer(lines) + while not tokenizer.AtEnd(): + _MergeField(tokenizer, message, allow_multiple_scalars) + + +def Parse(text, message): + """Parses an ASCII representation of a protocol message into a message. + + Args: + text: Message ASCII representation. + message: A protocol buffer message to merge into. + + Returns: + The same message passed as argument. + + Raises: + ParseError: On ASCII parsing problems. + """ + if not isinstance(text, str): text = text.decode('utf-8') + return ParseLines(text.split('\n'), message) + + +def Merge(text, message): + """Parses an ASCII representation of a protocol message into a message. + + Like Parse(), but allows repeated values for a non-repeated field, and uses + the last one. + + Args: + text: Message ASCII representation. + message: A protocol buffer message to merge into. + + Returns: + The same message passed as argument. + + Raises: + ParseError: On ASCII parsing problems. + """ + return MergeLines(text.split('\n'), message) + + +def ParseLines(lines, message): + """Parses an ASCII representation of a protocol message into a message. + + Args: + lines: An iterable of lines of a message's ASCII representation. + message: A protocol buffer message to merge into. + + Returns: + The same message passed as argument. + + Raises: + ParseError: On ASCII parsing problems. + """ + _ParseOrMerge(lines, message, False) + return message + + +def MergeLines(lines, message): + """Parses an ASCII representation of a protocol message into a message. + + Args: + lines: An iterable of lines of a message's ASCII representation. + message: A protocol buffer message to merge into. + + Returns: + The same message passed as argument. + + Raises: + ParseError: On ASCII parsing problems. + """ + _ParseOrMerge(lines, message, True) + return message + + +def _MergeField(tokenizer, message, allow_multiple_scalars): + """Merges a single protocol message field into a message. + + Args: + tokenizer: A tokenizer to parse the field name and values. + message: A protocol message to record the data. + allow_multiple_scalars: Determines if repeated values for a non-repeated + field are permitted, e.g., the string "foo: 1 foo: 2" for a + required/optional field named "foo". + + Raises: + ParseError: In case of ASCII parsing problems. + """ + message_descriptor = message.DESCRIPTOR + if tokenizer.TryConsume('['): + name = [tokenizer.ConsumeIdentifier()] + while tokenizer.TryConsume('.'): + name.append(tokenizer.ConsumeIdentifier()) + name = '.'.join(name) + + if not message_descriptor.is_extendable: + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" does not have extensions.' % + message_descriptor.full_name) + # pylint: disable=protected-access + field = message.Extensions._FindExtensionByName(name) + # pylint: enable=protected-access + if not field: + raise tokenizer.ParseErrorPreviousToken( + 'Extension "%s" not registered.' % name) + elif message_descriptor != field.containing_type: + raise tokenizer.ParseErrorPreviousToken( + 'Extension "%s" does not extend message type "%s".' % ( + name, message_descriptor.full_name)) + tokenizer.Consume(']') + else: + name = tokenizer.ConsumeIdentifier() + field = message_descriptor.fields_by_name.get(name, None) + + # Group names are expected to be capitalized as they appear in the + # .proto file, which actually matches their type names, not their field + # names. + if not field: + field = message_descriptor.fields_by_name.get(name.lower(), None) + if field and field.type != descriptor.FieldDescriptor.TYPE_GROUP: + field = None + + if (field and field.type == descriptor.FieldDescriptor.TYPE_GROUP and + field.message_type.name != name): + field = None + + if not field: + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" has no field named "%s".' % ( + message_descriptor.full_name, name)) + + if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + tokenizer.TryConsume(':') + + if tokenizer.TryConsume('<'): + end_token = '>' + else: + tokenizer.Consume('{') + end_token = '}' + + if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + if field.is_extension: + sub_message = message.Extensions[field].add() + else: + sub_message = getattr(message, field.name).add() + else: + if field.is_extension: + sub_message = message.Extensions[field] + else: + sub_message = getattr(message, field.name) + sub_message.SetInParent() + + while not tokenizer.TryConsume(end_token): + if tokenizer.AtEnd(): + raise tokenizer.ParseErrorPreviousToken('Expected "%s".' % (end_token)) + _MergeField(tokenizer, sub_message, allow_multiple_scalars) + else: + _MergeScalarField(tokenizer, message, field, allow_multiple_scalars) + + # For historical reasons, fields may optionally be separated by commas or + # semicolons. + if not tokenizer.TryConsume(','): + tokenizer.TryConsume(';') + + +def _MergeScalarField(tokenizer, message, field, allow_multiple_scalars): + """Merges a single protocol message scalar field into a message. + + Args: + tokenizer: A tokenizer to parse the field value. + message: A protocol message to record the data. + field: The descriptor of the field to be merged. + allow_multiple_scalars: Determines if repeated values for a non-repeated + field are permitted, e.g., the string "foo: 1 foo: 2" for a + required/optional field named "foo". + + Raises: + ParseError: In case of ASCII parsing problems. + RuntimeError: On runtime errors. + """ + tokenizer.Consume(':') + value = None + + if field.type in (descriptor.FieldDescriptor.TYPE_INT32, + descriptor.FieldDescriptor.TYPE_SINT32, + descriptor.FieldDescriptor.TYPE_SFIXED32): + value = tokenizer.ConsumeInt32() + elif field.type in (descriptor.FieldDescriptor.TYPE_INT64, + descriptor.FieldDescriptor.TYPE_SINT64, + descriptor.FieldDescriptor.TYPE_SFIXED64): + value = tokenizer.ConsumeInt64() + elif field.type in (descriptor.FieldDescriptor.TYPE_UINT32, + descriptor.FieldDescriptor.TYPE_FIXED32): + value = tokenizer.ConsumeUint32() + elif field.type in (descriptor.FieldDescriptor.TYPE_UINT64, + descriptor.FieldDescriptor.TYPE_FIXED64): + value = tokenizer.ConsumeUint64() + elif field.type in (descriptor.FieldDescriptor.TYPE_FLOAT, + descriptor.FieldDescriptor.TYPE_DOUBLE): + value = tokenizer.ConsumeFloat() + elif field.type == descriptor.FieldDescriptor.TYPE_BOOL: + value = tokenizer.ConsumeBool() + elif field.type == descriptor.FieldDescriptor.TYPE_STRING: + value = tokenizer.ConsumeString() + elif field.type == descriptor.FieldDescriptor.TYPE_BYTES: + value = tokenizer.ConsumeByteString() + elif field.type == descriptor.FieldDescriptor.TYPE_ENUM: + value = tokenizer.ConsumeEnum(field) + else: + raise RuntimeError('Unknown field type %d' % field.type) + + if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + if field.is_extension: + message.Extensions[field].append(value) + else: + getattr(message, field.name).append(value) + else: + if field.is_extension: + if not allow_multiple_scalars and message.HasExtension(field): + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" should not have multiple "%s" extensions.' % + (message.DESCRIPTOR.full_name, field.full_name)) + else: + message.Extensions[field] = value + else: + if not allow_multiple_scalars and message.HasField(field.name): + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" should not have multiple "%s" fields.' % + (message.DESCRIPTOR.full_name, field.name)) + else: + setattr(message, field.name, value) + + +class _Tokenizer(object): + """Protocol buffer ASCII representation tokenizer. + + This class handles the lower level string parsing by splitting it into + meaningful tokens. + + It was directly ported from the Java protocol buffer API. + """ + + _WHITESPACE = re.compile('(\\s|(#.*$))+', re.MULTILINE) + _TOKEN = re.compile( + '[a-zA-Z_][0-9a-zA-Z_+-]*|' # an identifier + '[0-9+-][0-9a-zA-Z_.+-]*|' # a number + '\"([^\"\n\\\\]|\\\\.)*(\"|\\\\?$)|' # a double-quoted string + '\'([^\'\n\\\\]|\\\\.)*(\'|\\\\?$)') # a single-quoted string + _IDENTIFIER = re.compile(r'\w+') + + def __init__(self, lines): + self._position = 0 + self._line = -1 + self._column = 0 + self._token_start = None + self.token = '' + self._lines = iter(lines) + self._current_line = '' + self._previous_line = 0 + self._previous_column = 0 + self._more_lines = True + self._SkipWhitespace() + self.NextToken() + + def AtEnd(self): + """Checks the end of the text was reached. + + Returns: + True iff the end was reached. + """ + return not self.token + + def _PopLine(self): + while len(self._current_line) <= self._column: + try: + self._current_line = self._lines.next() + except StopIteration: + self._current_line = '' + self._more_lines = False + return + else: + self._line += 1 + self._column = 0 + + def _SkipWhitespace(self): + while True: + self._PopLine() + match = self._WHITESPACE.match(self._current_line, self._column) + if not match: + break + length = len(match.group(0)) + self._column += length + + def TryConsume(self, token): + """Tries to consume a given piece of text. + + Args: + token: Text to consume. + + Returns: + True iff the text was consumed. + """ + if self.token == token: + self.NextToken() + return True + return False + + def Consume(self, token): + """Consumes a piece of text. + + Args: + token: Text to consume. + + Raises: + ParseError: If the text couldn't be consumed. + """ + if not self.TryConsume(token): + raise self._ParseError('Expected "%s".' % token) + + def ConsumeIdentifier(self): + """Consumes protocol message field identifier. + + Returns: + Identifier string. + + Raises: + ParseError: If an identifier couldn't be consumed. + """ + result = self.token + if not self._IDENTIFIER.match(result): + raise self._ParseError('Expected identifier.') + self.NextToken() + return result + + def ConsumeInt32(self): + """Consumes a signed 32bit integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If a signed 32bit integer couldn't be consumed. + """ + try: + result = ParseInteger(self.token, is_signed=True, is_long=False) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeUint32(self): + """Consumes an unsigned 32bit integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If an unsigned 32bit integer couldn't be consumed. + """ + try: + result = ParseInteger(self.token, is_signed=False, is_long=False) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeInt64(self): + """Consumes a signed 64bit integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If a signed 64bit integer couldn't be consumed. + """ + try: + result = ParseInteger(self.token, is_signed=True, is_long=True) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeUint64(self): + """Consumes an unsigned 64bit integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If an unsigned 64bit integer couldn't be consumed. + """ + try: + result = ParseInteger(self.token, is_signed=False, is_long=True) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeFloat(self): + """Consumes an floating point number. + + Returns: + The number parsed. + + Raises: + ParseError: If a floating point number couldn't be consumed. + """ + try: + result = ParseFloat(self.token) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeBool(self): + """Consumes a boolean value. + + Returns: + The bool parsed. + + Raises: + ParseError: If a boolean value couldn't be consumed. + """ + try: + result = ParseBool(self.token) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeString(self): + """Consumes a string value. + + Returns: + The string parsed. + + Raises: + ParseError: If a string value couldn't be consumed. + """ + the_bytes = self.ConsumeByteString() + try: + return unicode(the_bytes, 'utf-8') + except UnicodeDecodeError, e: + raise self._StringParseError(e) + + def ConsumeByteString(self): + """Consumes a byte array value. + + Returns: + The array parsed (as a string). + + Raises: + ParseError: If a byte array value couldn't be consumed. + """ + the_list = [self._ConsumeSingleByteString()] + while self.token and self.token[0] in ('\'', '"'): + the_list.append(self._ConsumeSingleByteString()) + return ''.encode('latin1').join(the_list) ##PY25 +##!PY25 return b''.join(the_list) + + def _ConsumeSingleByteString(self): + """Consume one token of a string literal. + + String literals (whether bytes or text) can come in multiple adjacent + tokens which are automatically concatenated, like in C or Python. This + method only consumes one token. + """ + text = self.token + if len(text) < 1 or text[0] not in ('\'', '"'): + raise self._ParseError('Expected string.') + + if len(text) < 2 or text[-1] != text[0]: + raise self._ParseError('String missing ending quote.') + + try: + result = text_encoding.CUnescape(text[1:-1]) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ConsumeEnum(self, field): + try: + result = ParseEnum(field, self.token) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def ParseErrorPreviousToken(self, message): + """Creates and *returns* a ParseError for the previously read token. + + Args: + message: A message to set for the exception. + + Returns: + A ParseError instance. + """ + return ParseError('%d:%d : %s' % ( + self._previous_line + 1, self._previous_column + 1, message)) + + def _ParseError(self, message): + """Creates and *returns* a ParseError for the current token.""" + return ParseError('%d:%d : %s' % ( + self._line + 1, self._column + 1, message)) + + def _StringParseError(self, e): + return self._ParseError('Couldn\'t parse string: ' + str(e)) + + def NextToken(self): + """Reads the next meaningful token.""" + self._previous_line = self._line + self._previous_column = self._column + + self._column += len(self.token) + self._SkipWhitespace() + + if not self._more_lines: + self.token = '' + return + + match = self._TOKEN.match(self._current_line, self._column) + if match: + token = match.group(0) + self.token = token + else: + self.token = self._current_line[self._column] + + +def ParseInteger(text, is_signed=False, is_long=False): + """Parses an integer. + + Args: + text: The text to parse. + is_signed: True if a signed integer must be parsed. + is_long: True if a long integer must be parsed. + + Returns: + The integer value. + + Raises: + ValueError: Thrown Iff the text is not a valid integer. + """ + # Do the actual parsing. Exception handling is propagated to caller. + try: + # We force 32-bit values to int and 64-bit values to long to make + # alternate implementations where the distinction is more significant + # (e.g. the C++ implementation) simpler. + if is_long: + result = long(text, 0) + else: + result = int(text, 0) + except ValueError: + raise ValueError('Couldn\'t parse integer: %s' % text) + + # Check if the integer is sane. Exceptions handled by callers. + checker = _INTEGER_CHECKERS[2 * int(is_long) + int(is_signed)] + checker.CheckValue(result) + return result + + +def ParseFloat(text): + """Parse a floating point number. + + Args: + text: Text to parse. + + Returns: + The number parsed. + + Raises: + ValueError: If a floating point number couldn't be parsed. + """ + try: + # Assume Python compatible syntax. + return float(text) + except ValueError: + # Check alternative spellings. + if _FLOAT_INFINITY.match(text): + if text[0] == '-': + return float('-inf') + else: + return float('inf') + elif _FLOAT_NAN.match(text): + return float('nan') + else: + # assume '1.0f' format + try: + return float(text.rstrip('f')) + except ValueError: + raise ValueError('Couldn\'t parse float: %s' % text) + + +def ParseBool(text): + """Parse a boolean value. + + Args: + text: Text to parse. + + Returns: + Boolean values parsed + + Raises: + ValueError: If text is not a valid boolean. + """ + if text in ('true', 't', '1'): + return True + elif text in ('false', 'f', '0'): + return False + else: + raise ValueError('Expected "true" or "false".') + + +def ParseEnum(field, value): + """Parse an enum value. + + The value can be specified by a number (the enum value), or by + a string literal (the enum name). + + Args: + field: Enum field descriptor. + value: String value. + + Returns: + Enum value number. + + Raises: + ValueError: If the enum value could not be parsed. + """ + enum_descriptor = field.enum_type + try: + number = int(value, 0) + except ValueError: + # Identifier. + enum_value = enum_descriptor.values_by_name.get(value, None) + if enum_value is None: + raise ValueError( + 'Enum type "%s" has no value named %s.' % ( + enum_descriptor.full_name, value)) + else: + # Numeric value. + enum_value = enum_descriptor.values_by_number.get(number, None) + if enum_value is None: + raise ValueError( + 'Enum type "%s" has no value with number %d.' % ( + enum_descriptor.full_name, number)) + return enum_value.number diff --git a/pythonlib/google/protobuf/unittest_custom_options_pb2.py b/pythonlib/google/protobuf/unittest_custom_options_pb2.py new file mode 100644 index 0000000..c950812 --- /dev/null +++ b/pythonlib/google/protobuf/unittest_custom_options_pb2.py @@ -0,0 +1,1642 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/unittest_custom_options.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import service as _service +from google.protobuf import service_reflection +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import google.protobuf.descriptor_pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/unittest_custom_options.proto', + package='protobuf_unittest', + serialized_pb=_b('\n-google/protobuf/unittest_custom_options.proto\x12\x11protobuf_unittest\x1a google/protobuf/descriptor.proto\"\x8d\x01\n\x1cTestMessageWithCustomOptions\x12\x1e\n\x06\x66ield1\x18\x01 \x01(\tB\x0e\x08\x01\xc1\xe0\xc3\x1d-\xe1u\n\x02\x00\x00\x00\";\n\x06\x41nEnum\x12\x0f\n\x0b\x41NENUM_VAL1\x10\x01\x12\x16\n\x0b\x41NENUM_VAL2\x10\x02\x1a\x05\xb0\x86\xfa\x05{\x1a\x08\xc5\xf6\xc9\x1d\xeb\xfc\xff\xff:\x10\x08\x00\xe0\xe9\xc2\x1d\xc8\xff\xff\xff\xff\xff\xff\xff\xff\x01\"\x18\n\x16\x43ustomOptionFooRequest\"\x19\n\x17\x43ustomOptionFooResponse\"\x1e\n\x1c\x43ustomOptionFooClientMessage\"\x1e\n\x1c\x43ustomOptionFooServerMessage\"m\n\x1a\x44ummyMessageContainingEnum\"O\n\x0cTestEnumType\x12\x1a\n\x16TEST_OPTION_ENUM_TYPE1\x10\x16\x12#\n\x16TEST_OPTION_ENUM_TYPE2\x10\xe9\xff\xff\xff\xff\xff\xff\xff\xff\x01\"!\n\x1f\x44ummyMessageInvalidAsOptionType\"\x8a\x01\n\x1c\x43ustomOptionMinIntegerValues:j\xd0\xde\xb2\x1d\x00\xe8\xc6\xb2\x1d\x80\x80\x80\x80\xf8\xff\xff\xff\xff\x01\xb0\xbc\xb2\x1d\x80\x80\x80\x80\x80\x80\x80\x80\x80\x01\x80\x93\xb2\x1d\x00\xf8\xf5\xb0\x1d\x00\x80\xc4\xb0\x1d\xff\xff\xff\xff\x0f\xf8\x97\xb0\x1d\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x9d\xf5\xaf\x1d\x00\x00\x00\x00\x91\xee\xaf\x1d\x00\x00\x00\x00\x00\x00\x00\x00\xad\x8d\xaf\x1d\x00\x00\x00\x80\x99\xd6\xa8\x1d\x00\x00\x00\x00\x00\x00\x00\x80\"\x91\x01\n\x1c\x43ustomOptionMaxIntegerValues:q\xd0\xde\xb2\x1d\x01\xe8\xc6\xb2\x1d\xff\xff\xff\xff\x07\xb0\xbc\xb2\x1d\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x80\x93\xb2\x1d\xff\xff\xff\xff\x0f\xf8\xf5\xb0\x1d\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x80\xc4\xb0\x1d\xfe\xff\xff\xff\x0f\xf8\x97\xb0\x1d\xfe\xff\xff\xff\xff\xff\xff\xff\xff\x01\x9d\xf5\xaf\x1d\xff\xff\xff\xff\x91\xee\xaf\x1d\xff\xff\xff\xff\xff\xff\xff\xff\xad\x8d\xaf\x1d\xff\xff\xff\x7f\x99\xd6\xa8\x1d\xff\xff\xff\xff\xff\xff\xff\x7f\"n\n\x17\x43ustomOptionOtherValues:S\xe8\xc6\xb2\x1d\x9c\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf5\xdf\xa3\x1d\xe7\x87\x45\x41\xe9\xdc\xa2\x1d\xfbY\x8c\x42\xca\xc0\xf3?\xaa\xdc\xa2\x1d\x0eHello, \"World\"\xb2\xd9\xa2\x1d\x0bHello\x00World\x88\xd9\xa2\x1d\xe9\xff\xff\xff\xff\xff\xff\xff\xff\x01\"4\n\x1cSettingRealsFromPositiveInts:\x14\xf5\xdf\xa3\x1d\x00\x00@A\xe9\xdc\xa2\x1d\x00\x00\x00\x00\x00@c@\"4\n\x1cSettingRealsFromNegativeInts:\x14\xf5\xdf\xa3\x1d\x00\x00@\xc1\xe9\xdc\xa2\x1d\x00\x00\x00\x00\x00@c\xc0\"U\n\x12\x43omplexOptionType1\x12\x0b\n\x03\x66oo\x18\x01 \x01(\x05\x12\x0c\n\x04\x66oo2\x18\x02 \x01(\x05\x12\x0c\n\x04\x66oo3\x18\x03 \x01(\x05\x12\x0c\n\x04\x66oo4\x18\x04 \x03(\x05*\x08\x08\x64\x10\x80\x80\x80\x80\x02\"\x8b\x03\n\x12\x43omplexOptionType2\x12\x32\n\x03\x62\x61r\x18\x01 \x01(\x0b\x32%.protobuf_unittest.ComplexOptionType1\x12\x0b\n\x03\x62\x61z\x18\x02 \x01(\x05\x12\x46\n\x04\x66red\x18\x03 \x01(\x0b\x32\x38.protobuf_unittest.ComplexOptionType2.ComplexOptionType4\x12H\n\x06\x62\x61rney\x18\x04 \x03(\x0b\x32\x38.protobuf_unittest.ComplexOptionType2.ComplexOptionType4\x1a\x97\x01\n\x12\x43omplexOptionType4\x12\r\n\x05waldo\x18\x01 \x01(\x05\x32r\n\x0c\x63omplex_opt4\x12\x1f.google.protobuf.MessageOptions\x18\x8a\xf5\xd1\x03 \x01(\x0b\x32\x38.protobuf_unittest.ComplexOptionType2.ComplexOptionType4*\x08\x08\x64\x10\x80\x80\x80\x80\x02\"\x9c\x01\n\x12\x43omplexOptionType3\x12\x0b\n\x03qux\x18\x01 \x01(\x05\x12T\n\x12\x63omplexoptiontype5\x18\x02 \x01(\n28.protobuf_unittest.ComplexOptionType3.ComplexOptionType5\x1a#\n\x12\x43omplexOptionType5\x12\r\n\x05plugh\x18\x03 \x01(\x05\"\x1f\n\x0b\x43omplexOpt6\x12\x10\n\x05xyzzy\x18\xdf\xbf\xcf\x03 \x01(\x05\"\xf1\x01\n\x15VariousComplexOptions:\xd7\x01\xa2\xe2\x95\x1d\x02\x08*\xa2\xe2\x95\x1d\x06\xd8\x85\x9e\x1d\xc4\x02\xa2\xe2\x95\x1d\x08\x92\xf5\x9d\x1d\x03\x08\xec\x06\xa2\xe2\x95\x1d\x02 c\xa2\xe2\x95\x1d\x02 X\xaa\xfd\x90\x1d\x03\x10\xdb\x07\xaa\xfd\x90\x1d\x06\xf8\xe6\x97\x1d\x8e\x05\xaa\xfd\x90\x1d\x05\n\x03\x08\xe7\x05\xaa\xfd\x90\x1d\x08\n\x06\xd8\x85\x9e\x1d\xcf\x0f\xaa\xfd\x90\x1d\n\n\x08\x92\xf5\x9d\x1d\x03\x08\xd8\x0f\xaa\xfd\x90\x1d\x08\xc2\xac\x97\x1d\x03\x08\xe5\x05\xaa\xfd\x90\x1d\x0b\xc2\xac\x97\x1d\x06\xd8\x85\x9e\x1d\xce\x0f\xaa\xfd\x90\x1d\r\xc2\xac\x97\x1d\x08\x92\xf5\x9d\x1d\x03\x08\xc9\x10\xd2\xa8\x8f\x1d\x03\x08\xb3\x0f\xaa\xfd\x90\x1d\x05\x1a\x03\x08\xc1\x02\xaa\xfd\x90\x1d\x04\"\x02\x08\x65\xaa\xfd\x90\x1d\x05\"\x03\x08\xd4\x01\xfa\xde\x90\x1d\x02\x08\t\xfa\xde\x90\x1d\x04\x13\x18\x16\x14\xe3\xdc\xfc\x1c\xf8\xfd\xfb\x1c\x18\xe4\xdc\xfc\x1c\"#\n\x13\x41ggregateMessageSet*\x08\x08\x04\x10\xff\xff\xff\xff\x07:\x02\x08\x01\"\xa0\x01\n\x1a\x41ggregateMessageSetElement\x12\t\n\x01s\x18\x01 \x01(\t2w\n\x15message_set_extension\x12&.protobuf_unittest.AggregateMessageSet\x18\xf6\xeb\xae\x07 \x01(\x0b\x32-.protobuf_unittest.AggregateMessageSetElement\"\xfd\x01\n\tAggregate\x12\t\n\x01i\x18\x01 \x01(\x05\x12\t\n\x01s\x18\x02 \x01(\t\x12)\n\x03sub\x18\x03 \x01(\x0b\x32\x1c.protobuf_unittest.Aggregate\x12*\n\x04\x66ile\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.FileOptions\x12\x34\n\x04mset\x18\x05 \x01(\x0b\x32&.protobuf_unittest.AggregateMessageSet2M\n\x06nested\x12\x1c.google.protobuf.FileOptions\x18\xa7\xd1\xb0\x07 \x01(\x0b\x32\x1c.protobuf_unittest.Aggregate\"Y\n\x10\x41ggregateMessage\x12)\n\tfieldname\x18\x01 \x01(\x05\x42\x16\xf2\xa1\x87;\x11\x12\x0f\x46ieldAnnotation:\x1a\xc2\xd1\x86;\x15\x08\x65\x12\x11MessageAnnotation\"\xc9\x01\n\x10NestedOptionType\x1a;\n\rNestedMessage\x12\"\n\x0cnested_field\x18\x01 \x01(\x05\x42\x0c\xc1\xe0\xc3\x1d\xea\x03\x00\x00\x00\x00\x00\x00:\x06\xe0\xe9\xc2\x1d\xe9\x07\"5\n\nNestedEnum\x12\x1d\n\x11NESTED_ENUM_VALUE\x10\x01\x1a\x06\xb0\x86\xfa\x05\xec\x07\x1a\x08\xc5\xf6\xc9\x1d\xeb\x03\x00\x00\x32\x41\n\x10nested_extension\x12\x1c.google.protobuf.FileOptions\x18\xfd\xf8\xe2\x03 \x01(\x05\x42\x06\xc8\x8b\xca\x1d\xed\x07*6\n\nMethodOpt1\x12\x13\n\x0fMETHODOPT1_VAL1\x10\x01\x12\x13\n\x0fMETHODOPT1_VAL2\x10\x02*M\n\rAggregateEnum\x12%\n\x05VALUE\x10\x01\x1a\x1a\xca\xfc\x89;\x15\x12\x13\x45numValueAnnotation\x1a\x15\x92\x95\x88;\x10\x12\x0e\x45numAnnotation2\x8e\x01\n\x1cTestServiceWithCustomOptions\x12\x63\n\x03\x46oo\x12).protobuf_unittest.CustomOptionFooRequest\x1a*.protobuf_unittest.CustomOptionFooResponse\"\x05\xe0\xfa\x8c\x1e\x02\x1a\t\x90\xb2\x8b\x1e\xd3\xdb\x80\xcbI2\x99\x01\n\x10\x41ggregateService\x12k\n\x06Method\x12#.protobuf_unittest.AggregateMessage\x1a#.protobuf_unittest.AggregateMessage\"\x17\xca\xc8\x96;\x12\x12\x10MethodAnnotation\x1a\x18\xca\xfb\x8e;\x13\x12\x11ServiceAnnotation:2\n\tfile_opt1\x12\x1c.google.protobuf.FileOptions\x18\x8e\x9d\xd8\x03 \x01(\x04:8\n\x0cmessage_opt1\x12\x1f.google.protobuf.MessageOptions\x18\x9c\xad\xd8\x03 \x01(\x05:4\n\nfield_opt1\x12\x1d.google.protobuf.FieldOptions\x18\x88\xbc\xd8\x03 \x01(\x06:8\n\nfield_opt2\x12\x1d.google.protobuf.FieldOptions\x18\xb9\xa1\xd9\x03 \x01(\x05:\x02\x34\x32:2\n\tenum_opt1\x12\x1c.google.protobuf.EnumOptions\x18\xe8\x9e\xd9\x03 \x01(\x0f:<\n\x0f\x65num_value_opt1\x12!.google.protobuf.EnumValueOptions\x18\xe6\xa0_ \x01(\x05:8\n\x0cservice_opt1\x12\x1f.google.protobuf.ServiceOptions\x18\xa2\xb6\xe1\x03 \x01(\x12:U\n\x0bmethod_opt1\x12\x1e.google.protobuf.MethodOptions\x18\xac\xcf\xe1\x03 \x01(\x0e\x32\x1d.protobuf_unittest.MethodOpt1:4\n\x08\x62ool_opt\x12\x1f.google.protobuf.MessageOptions\x18\xea\xab\xd6\x03 \x01(\x08:5\n\tint32_opt\x12\x1f.google.protobuf.MessageOptions\x18\xed\xa8\xd6\x03 \x01(\x05:5\n\tint64_opt\x12\x1f.google.protobuf.MessageOptions\x18\xc6\xa7\xd6\x03 \x01(\x03:6\n\nuint32_opt\x12\x1f.google.protobuf.MessageOptions\x18\xb0\xa2\xd6\x03 \x01(\r:6\n\nuint64_opt\x12\x1f.google.protobuf.MessageOptions\x18\xdf\x8e\xd6\x03 \x01(\x04:6\n\nsint32_opt\x12\x1f.google.protobuf.MessageOptions\x18\xc0\x88\xd6\x03 \x01(\x11:6\n\nsint64_opt\x12\x1f.google.protobuf.MessageOptions\x18\xff\x82\xd6\x03 \x01(\x12:7\n\x0b\x66ixed32_opt\x12\x1f.google.protobuf.MessageOptions\x18\xd3\xfe\xd5\x03 \x01(\x07:7\n\x0b\x66ixed64_opt\x12\x1f.google.protobuf.MessageOptions\x18\xe2\xfd\xd5\x03 \x01(\x06:8\n\x0csfixed32_opt\x12\x1f.google.protobuf.MessageOptions\x18\xd5\xf1\xd5\x03 \x01(\x0f:8\n\x0csfixed64_opt\x12\x1f.google.protobuf.MessageOptions\x18\xe3\x8a\xd5\x03 \x01(\x10:5\n\tfloat_opt\x12\x1f.google.protobuf.MessageOptions\x18\xfe\xbb\xd4\x03 \x01(\x02:6\n\ndouble_opt\x12\x1f.google.protobuf.MessageOptions\x18\xcd\xab\xd4\x03 \x01(\x01:6\n\nstring_opt\x12\x1f.google.protobuf.MessageOptions\x18\xc5\xab\xd4\x03 \x01(\t:5\n\tbytes_opt\x12\x1f.google.protobuf.MessageOptions\x18\x96\xab\xd4\x03 \x01(\x0c:p\n\x08\x65num_opt\x12\x1f.google.protobuf.MessageOptions\x18\x91\xab\xd4\x03 \x01(\x0e\x32:.protobuf_unittest.DummyMessageContainingEnum.TestEnumType:p\n\x10message_type_opt\x12\x1f.google.protobuf.MessageOptions\x18\xaf\xf2\xd3\x03 \x01(\x0b\x32\x32.protobuf_unittest.DummyMessageInvalidAsOptionType:6\n\x04quux\x12%.protobuf_unittest.ComplexOptionType1\x18\xdb\xe0\xd3\x03 \x01(\x05:^\n\x05\x63orge\x12%.protobuf_unittest.ComplexOptionType1\x18\xd2\xde\xd3\x03 \x01(\x0b\x32%.protobuf_unittest.ComplexOptionType3:8\n\x06grault\x12%.protobuf_unittest.ComplexOptionType2\x18\xef\xfc\xd2\x03 \x01(\x05:_\n\x06garply\x12%.protobuf_unittest.ComplexOptionType2\x18\xc8\xf5\xd2\x03 \x01(\x0b\x32%.protobuf_unittest.ComplexOptionType1:_\n\x0c\x63omplex_opt1\x12\x1f.google.protobuf.MessageOptions\x18\xa4\xdc\xd2\x03 \x01(\x0b\x32%.protobuf_unittest.ComplexOptionType1:_\n\x0c\x63omplex_opt2\x12\x1f.google.protobuf.MessageOptions\x18\xd5\x8f\xd2\x03 \x01(\x0b\x32%.protobuf_unittest.ComplexOptionType2:_\n\x0c\x63omplex_opt3\x12\x1f.google.protobuf.MessageOptions\x18\xef\x8b\xd2\x03 \x01(\x0b\x32%.protobuf_unittest.ComplexOptionType3:W\n\x0b\x63omplexopt6\x12\x1f.google.protobuf.MessageOptions\x18\xcc\xcb\xcf\x03 \x01(\n2\x1e.protobuf_unittest.ComplexOpt6:N\n\x07\x66ileopt\x12\x1c.google.protobuf.FileOptions\x18\xcf\xdd\xb0\x07 \x01(\x0b\x32\x1c.protobuf_unittest.Aggregate:P\n\x06msgopt\x12\x1f.google.protobuf.MessageOptions\x18\x98\xea\xb0\x07 \x01(\x0b\x32\x1c.protobuf_unittest.Aggregate:P\n\x08\x66ieldopt\x12\x1d.google.protobuf.FieldOptions\x18\x9e\xf4\xb0\x07 \x01(\x0b\x32\x1c.protobuf_unittest.Aggregate:N\n\x07\x65numopt\x12\x1c.google.protobuf.EnumOptions\x18\xd2\x82\xb1\x07 \x01(\x0b\x32\x1c.protobuf_unittest.Aggregate:V\n\nenumvalopt\x12!.google.protobuf.EnumValueOptions\x18\xc9\x9f\xb1\x07 \x01(\x0b\x32\x1c.protobuf_unittest.Aggregate:T\n\nserviceopt\x12\x1f.google.protobuf.ServiceOptions\x18\xb9\xef\xb1\x07 \x01(\x0b\x32\x1c.protobuf_unittest.Aggregate:R\n\tmethodopt\x12\x1e.google.protobuf.MethodOptions\x18\x89\xe9\xb2\x07 \x01(\x0b\x32\x1c.protobuf_unittest.AggregateB\x87\x01\x80\x01\x01\x88\x01\x01\x90\x01\x01\xf0\xe8\xc1\x1d\xea\xad\xc0\xe5$\xfa\xec\x85;p\x08\x64\x12\x0e\x46ileAnnotation\x1a\x16\x12\x14NestedFileAnnotation\"\x1e\xfa\xec\x85;\x19\x12\x17\x46ileExtensionAnnotation*$\x0b\x10\xf6\xeb\xae\x07\x1a\x1b\n\x19\x45mbeddedMessageSetElement\x0c') + , + dependencies=[google.protobuf.descriptor_pb2.DESCRIPTOR,]) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +_METHODOPT1 = _descriptor.EnumDescriptor( + name='MethodOpt1', + full_name='protobuf_unittest.MethodOpt1', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='METHODOPT1_VAL1', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='METHODOPT1_VAL2', index=1, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2690, + serialized_end=2744, +) +_sym_db.RegisterEnumDescriptor(_METHODOPT1) + +MethodOpt1 = enum_type_wrapper.EnumTypeWrapper(_METHODOPT1) +_AGGREGATEENUM = _descriptor.EnumDescriptor( + name='AggregateEnum', + full_name='protobuf_unittest.AggregateEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='VALUE', index=0, number=1, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), _b('\312\374\211;\025\022\023EnumValueAnnotation')), + type=None), + ], + containing_type=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumOptions(), _b('\222\225\210;\020\022\016EnumAnnotation')), + serialized_start=2746, + serialized_end=2823, +) +_sym_db.RegisterEnumDescriptor(_AGGREGATEENUM) + +AggregateEnum = enum_type_wrapper.EnumTypeWrapper(_AGGREGATEENUM) +METHODOPT1_VAL1 = 1 +METHODOPT1_VAL2 = 2 +VALUE = 1 + +FILE_OPT1_FIELD_NUMBER = 7736974 +file_opt1 = _descriptor.FieldDescriptor( + name='file_opt1', full_name='protobuf_unittest.file_opt1', index=0, + number=7736974, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +MESSAGE_OPT1_FIELD_NUMBER = 7739036 +message_opt1 = _descriptor.FieldDescriptor( + name='message_opt1', full_name='protobuf_unittest.message_opt1', index=1, + number=7739036, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +FIELD_OPT1_FIELD_NUMBER = 7740936 +field_opt1 = _descriptor.FieldDescriptor( + name='field_opt1', full_name='protobuf_unittest.field_opt1', index=2, + number=7740936, type=6, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +FIELD_OPT2_FIELD_NUMBER = 7753913 +field_opt2 = _descriptor.FieldDescriptor( + name='field_opt2', full_name='protobuf_unittest.field_opt2', index=3, + number=7753913, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=42, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +ENUM_OPT1_FIELD_NUMBER = 7753576 +enum_opt1 = _descriptor.FieldDescriptor( + name='enum_opt1', full_name='protobuf_unittest.enum_opt1', index=4, + number=7753576, type=15, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +ENUM_VALUE_OPT1_FIELD_NUMBER = 1560678 +enum_value_opt1 = _descriptor.FieldDescriptor( + name='enum_value_opt1', full_name='protobuf_unittest.enum_value_opt1', index=5, + number=1560678, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +SERVICE_OPT1_FIELD_NUMBER = 7887650 +service_opt1 = _descriptor.FieldDescriptor( + name='service_opt1', full_name='protobuf_unittest.service_opt1', index=6, + number=7887650, type=18, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +METHOD_OPT1_FIELD_NUMBER = 7890860 +method_opt1 = _descriptor.FieldDescriptor( + name='method_opt1', full_name='protobuf_unittest.method_opt1', index=7, + number=7890860, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +BOOL_OPT_FIELD_NUMBER = 7706090 +bool_opt = _descriptor.FieldDescriptor( + name='bool_opt', full_name='protobuf_unittest.bool_opt', index=8, + number=7706090, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +INT32_OPT_FIELD_NUMBER = 7705709 +int32_opt = _descriptor.FieldDescriptor( + name='int32_opt', full_name='protobuf_unittest.int32_opt', index=9, + number=7705709, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +INT64_OPT_FIELD_NUMBER = 7705542 +int64_opt = _descriptor.FieldDescriptor( + name='int64_opt', full_name='protobuf_unittest.int64_opt', index=10, + number=7705542, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +UINT32_OPT_FIELD_NUMBER = 7704880 +uint32_opt = _descriptor.FieldDescriptor( + name='uint32_opt', full_name='protobuf_unittest.uint32_opt', index=11, + number=7704880, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +UINT64_OPT_FIELD_NUMBER = 7702367 +uint64_opt = _descriptor.FieldDescriptor( + name='uint64_opt', full_name='protobuf_unittest.uint64_opt', index=12, + number=7702367, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +SINT32_OPT_FIELD_NUMBER = 7701568 +sint32_opt = _descriptor.FieldDescriptor( + name='sint32_opt', full_name='protobuf_unittest.sint32_opt', index=13, + number=7701568, type=17, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +SINT64_OPT_FIELD_NUMBER = 7700863 +sint64_opt = _descriptor.FieldDescriptor( + name='sint64_opt', full_name='protobuf_unittest.sint64_opt', index=14, + number=7700863, type=18, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +FIXED32_OPT_FIELD_NUMBER = 7700307 +fixed32_opt = _descriptor.FieldDescriptor( + name='fixed32_opt', full_name='protobuf_unittest.fixed32_opt', index=15, + number=7700307, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +FIXED64_OPT_FIELD_NUMBER = 7700194 +fixed64_opt = _descriptor.FieldDescriptor( + name='fixed64_opt', full_name='protobuf_unittest.fixed64_opt', index=16, + number=7700194, type=6, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +SFIXED32_OPT_FIELD_NUMBER = 7698645 +sfixed32_opt = _descriptor.FieldDescriptor( + name='sfixed32_opt', full_name='protobuf_unittest.sfixed32_opt', index=17, + number=7698645, type=15, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +SFIXED64_OPT_FIELD_NUMBER = 7685475 +sfixed64_opt = _descriptor.FieldDescriptor( + name='sfixed64_opt', full_name='protobuf_unittest.sfixed64_opt', index=18, + number=7685475, type=16, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +FLOAT_OPT_FIELD_NUMBER = 7675390 +float_opt = _descriptor.FieldDescriptor( + name='float_opt', full_name='protobuf_unittest.float_opt', index=19, + number=7675390, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DOUBLE_OPT_FIELD_NUMBER = 7673293 +double_opt = _descriptor.FieldDescriptor( + name='double_opt', full_name='protobuf_unittest.double_opt', index=20, + number=7673293, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +STRING_OPT_FIELD_NUMBER = 7673285 +string_opt = _descriptor.FieldDescriptor( + name='string_opt', full_name='protobuf_unittest.string_opt', index=21, + number=7673285, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +BYTES_OPT_FIELD_NUMBER = 7673238 +bytes_opt = _descriptor.FieldDescriptor( + name='bytes_opt', full_name='protobuf_unittest.bytes_opt', index=22, + number=7673238, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +ENUM_OPT_FIELD_NUMBER = 7673233 +enum_opt = _descriptor.FieldDescriptor( + name='enum_opt', full_name='protobuf_unittest.enum_opt', index=23, + number=7673233, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=22, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +MESSAGE_TYPE_OPT_FIELD_NUMBER = 7665967 +message_type_opt = _descriptor.FieldDescriptor( + name='message_type_opt', full_name='protobuf_unittest.message_type_opt', index=24, + number=7665967, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +QUUX_FIELD_NUMBER = 7663707 +quux = _descriptor.FieldDescriptor( + name='quux', full_name='protobuf_unittest.quux', index=25, + number=7663707, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +CORGE_FIELD_NUMBER = 7663442 +corge = _descriptor.FieldDescriptor( + name='corge', full_name='protobuf_unittest.corge', index=26, + number=7663442, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +GRAULT_FIELD_NUMBER = 7650927 +grault = _descriptor.FieldDescriptor( + name='grault', full_name='protobuf_unittest.grault', index=27, + number=7650927, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +GARPLY_FIELD_NUMBER = 7649992 +garply = _descriptor.FieldDescriptor( + name='garply', full_name='protobuf_unittest.garply', index=28, + number=7649992, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +COMPLEX_OPT1_FIELD_NUMBER = 7646756 +complex_opt1 = _descriptor.FieldDescriptor( + name='complex_opt1', full_name='protobuf_unittest.complex_opt1', index=29, + number=7646756, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +COMPLEX_OPT2_FIELD_NUMBER = 7636949 +complex_opt2 = _descriptor.FieldDescriptor( + name='complex_opt2', full_name='protobuf_unittest.complex_opt2', index=30, + number=7636949, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +COMPLEX_OPT3_FIELD_NUMBER = 7636463 +complex_opt3 = _descriptor.FieldDescriptor( + name='complex_opt3', full_name='protobuf_unittest.complex_opt3', index=31, + number=7636463, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +COMPLEXOPT6_FIELD_NUMBER = 7595468 +complexopt6 = _descriptor.FieldDescriptor( + name='complexopt6', full_name='protobuf_unittest.complexopt6', index=32, + number=7595468, type=10, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +FILEOPT_FIELD_NUMBER = 15478479 +fileopt = _descriptor.FieldDescriptor( + name='fileopt', full_name='protobuf_unittest.fileopt', index=33, + number=15478479, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +MSGOPT_FIELD_NUMBER = 15480088 +msgopt = _descriptor.FieldDescriptor( + name='msgopt', full_name='protobuf_unittest.msgopt', index=34, + number=15480088, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +FIELDOPT_FIELD_NUMBER = 15481374 +fieldopt = _descriptor.FieldDescriptor( + name='fieldopt', full_name='protobuf_unittest.fieldopt', index=35, + number=15481374, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +ENUMOPT_FIELD_NUMBER = 15483218 +enumopt = _descriptor.FieldDescriptor( + name='enumopt', full_name='protobuf_unittest.enumopt', index=36, + number=15483218, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +ENUMVALOPT_FIELD_NUMBER = 15486921 +enumvalopt = _descriptor.FieldDescriptor( + name='enumvalopt', full_name='protobuf_unittest.enumvalopt', index=37, + number=15486921, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +SERVICEOPT_FIELD_NUMBER = 15497145 +serviceopt = _descriptor.FieldDescriptor( + name='serviceopt', full_name='protobuf_unittest.serviceopt', index=38, + number=15497145, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +METHODOPT_FIELD_NUMBER = 15512713 +methodopt = _descriptor.FieldDescriptor( + name='methodopt', full_name='protobuf_unittest.methodopt', index=39, + number=15512713, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) + +_TESTMESSAGEWITHCUSTOMOPTIONS_ANENUM = _descriptor.EnumDescriptor( + name='AnEnum', + full_name='protobuf_unittest.TestMessageWithCustomOptions.AnEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ANENUM_VAL1', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ANENUM_VAL2', index=1, number=2, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), _b('\260\206\372\005{')), + type=None), + ], + containing_type=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumOptions(), _b('\305\366\311\035\353\374\377\377')), + serialized_start=167, + serialized_end=226, +) +_sym_db.RegisterEnumDescriptor(_TESTMESSAGEWITHCUSTOMOPTIONS_ANENUM) + +_DUMMYMESSAGECONTAININGENUM_TESTENUMTYPE = _descriptor.EnumDescriptor( + name='TestEnumType', + full_name='protobuf_unittest.DummyMessageContainingEnum.TestEnumType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='TEST_OPTION_ENUM_TYPE1', index=0, number=22, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TEST_OPTION_ENUM_TYPE2', index=1, number=-23, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=393, + serialized_end=472, +) +_sym_db.RegisterEnumDescriptor(_DUMMYMESSAGECONTAININGENUM_TESTENUMTYPE) + +_NESTEDOPTIONTYPE_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='protobuf_unittest.NestedOptionType.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NESTED_ENUM_VALUE', index=0, number=1, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), _b('\260\206\372\005\354\007')), + type=None), + ], + containing_type=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumOptions(), _b('\305\366\311\035\353\003\000\000')), + serialized_start=2568, + serialized_end=2621, +) +_sym_db.RegisterEnumDescriptor(_NESTEDOPTIONTYPE_NESTEDENUM) + + +_TESTMESSAGEWITHCUSTOMOPTIONS = _descriptor.Descriptor( + name='TestMessageWithCustomOptions', + full_name='protobuf_unittest.TestMessageWithCustomOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='field1', full_name='protobuf_unittest.TestMessageWithCustomOptions.field1', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001\301\340\303\035-\341u\n\002\000\000\000'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _TESTMESSAGEWITHCUSTOMOPTIONS_ANENUM, + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\010\000\340\351\302\035\310\377\377\377\377\377\377\377\377\001')), + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=103, + serialized_end=244, +) + + +_CUSTOMOPTIONFOOREQUEST = _descriptor.Descriptor( + name='CustomOptionFooRequest', + full_name='protobuf_unittest.CustomOptionFooRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=246, + serialized_end=270, +) + + +_CUSTOMOPTIONFOORESPONSE = _descriptor.Descriptor( + name='CustomOptionFooResponse', + full_name='protobuf_unittest.CustomOptionFooResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=272, + serialized_end=297, +) + + +_CUSTOMOPTIONFOOCLIENTMESSAGE = _descriptor.Descriptor( + name='CustomOptionFooClientMessage', + full_name='protobuf_unittest.CustomOptionFooClientMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=299, + serialized_end=329, +) + + +_CUSTOMOPTIONFOOSERVERMESSAGE = _descriptor.Descriptor( + name='CustomOptionFooServerMessage', + full_name='protobuf_unittest.CustomOptionFooServerMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=331, + serialized_end=361, +) + + +_DUMMYMESSAGECONTAININGENUM = _descriptor.Descriptor( + name='DummyMessageContainingEnum', + full_name='protobuf_unittest.DummyMessageContainingEnum', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DUMMYMESSAGECONTAININGENUM_TESTENUMTYPE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=363, + serialized_end=472, +) + + +_DUMMYMESSAGEINVALIDASOPTIONTYPE = _descriptor.Descriptor( + name='DummyMessageInvalidAsOptionType', + full_name='protobuf_unittest.DummyMessageInvalidAsOptionType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=474, + serialized_end=507, +) + + +_CUSTOMOPTIONMININTEGERVALUES = _descriptor.Descriptor( + name='CustomOptionMinIntegerValues', + full_name='protobuf_unittest.CustomOptionMinIntegerValues', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\320\336\262\035\000\350\306\262\035\200\200\200\200\370\377\377\377\377\001\260\274\262\035\200\200\200\200\200\200\200\200\200\001\200\223\262\035\000\370\365\260\035\000\200\304\260\035\377\377\377\377\017\370\227\260\035\377\377\377\377\377\377\377\377\377\001\235\365\257\035\000\000\000\000\221\356\257\035\000\000\000\000\000\000\000\000\255\215\257\035\000\000\000\200\231\326\250\035\000\000\000\000\000\000\000\200')), + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=510, + serialized_end=648, +) + + +_CUSTOMOPTIONMAXINTEGERVALUES = _descriptor.Descriptor( + name='CustomOptionMaxIntegerValues', + full_name='protobuf_unittest.CustomOptionMaxIntegerValues', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\320\336\262\035\001\350\306\262\035\377\377\377\377\007\260\274\262\035\377\377\377\377\377\377\377\377\177\200\223\262\035\377\377\377\377\017\370\365\260\035\377\377\377\377\377\377\377\377\377\001\200\304\260\035\376\377\377\377\017\370\227\260\035\376\377\377\377\377\377\377\377\377\001\235\365\257\035\377\377\377\377\221\356\257\035\377\377\377\377\377\377\377\377\255\215\257\035\377\377\377\177\231\326\250\035\377\377\377\377\377\377\377\177')), + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=651, + serialized_end=796, +) + + +_CUSTOMOPTIONOTHERVALUES = _descriptor.Descriptor( + name='CustomOptionOtherValues', + full_name='protobuf_unittest.CustomOptionOtherValues', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\350\306\262\035\234\377\377\377\377\377\377\377\377\001\365\337\243\035\347\207EA\351\334\242\035\373Y\214B\312\300\363?\252\334\242\035\016Hello, \"World\"\262\331\242\035\013Hello\000World\210\331\242\035\351\377\377\377\377\377\377\377\377\001')), + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=798, + serialized_end=908, +) + + +_SETTINGREALSFROMPOSITIVEINTS = _descriptor.Descriptor( + name='SettingRealsFromPositiveInts', + full_name='protobuf_unittest.SettingRealsFromPositiveInts', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\365\337\243\035\000\000@A\351\334\242\035\000\000\000\000\000@c@')), + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=910, + serialized_end=962, +) + + +_SETTINGREALSFROMNEGATIVEINTS = _descriptor.Descriptor( + name='SettingRealsFromNegativeInts', + full_name='protobuf_unittest.SettingRealsFromNegativeInts', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\365\337\243\035\000\000@\301\351\334\242\035\000\000\000\000\000@c\300')), + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=964, + serialized_end=1016, +) + + +_COMPLEXOPTIONTYPE1 = _descriptor.Descriptor( + name='ComplexOptionType1', + full_name='protobuf_unittest.ComplexOptionType1', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='foo', full_name='protobuf_unittest.ComplexOptionType1.foo', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo2', full_name='protobuf_unittest.ComplexOptionType1.foo2', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo3', full_name='protobuf_unittest.ComplexOptionType1.foo3', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo4', full_name='protobuf_unittest.ComplexOptionType1.foo4', index=3, + number=4, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(100, 536870912), ], + oneofs=[ + ], + serialized_start=1018, + serialized_end=1103, +) + + +_COMPLEXOPTIONTYPE2_COMPLEXOPTIONTYPE4 = _descriptor.Descriptor( + name='ComplexOptionType4', + full_name='protobuf_unittest.ComplexOptionType2.ComplexOptionType4', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='waldo', full_name='protobuf_unittest.ComplexOptionType2.ComplexOptionType4.waldo', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + _descriptor.FieldDescriptor( + name='complex_opt4', full_name='protobuf_unittest.ComplexOptionType2.ComplexOptionType4.complex_opt4', index=0, + number=7633546, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1340, + serialized_end=1491, +) + +_COMPLEXOPTIONTYPE2 = _descriptor.Descriptor( + name='ComplexOptionType2', + full_name='protobuf_unittest.ComplexOptionType2', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='bar', full_name='protobuf_unittest.ComplexOptionType2.bar', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='baz', full_name='protobuf_unittest.ComplexOptionType2.baz', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='fred', full_name='protobuf_unittest.ComplexOptionType2.fred', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='barney', full_name='protobuf_unittest.ComplexOptionType2.barney', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_COMPLEXOPTIONTYPE2_COMPLEXOPTIONTYPE4, ], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(100, 536870912), ], + oneofs=[ + ], + serialized_start=1106, + serialized_end=1501, +) + + +_COMPLEXOPTIONTYPE3_COMPLEXOPTIONTYPE5 = _descriptor.Descriptor( + name='ComplexOptionType5', + full_name='protobuf_unittest.ComplexOptionType3.ComplexOptionType5', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='plugh', full_name='protobuf_unittest.ComplexOptionType3.ComplexOptionType5.plugh', index=0, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1625, + serialized_end=1660, +) + +_COMPLEXOPTIONTYPE3 = _descriptor.Descriptor( + name='ComplexOptionType3', + full_name='protobuf_unittest.ComplexOptionType3', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='qux', full_name='protobuf_unittest.ComplexOptionType3.qux', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='complexoptiontype5', full_name='protobuf_unittest.ComplexOptionType3.complexoptiontype5', index=1, + number=2, type=10, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_COMPLEXOPTIONTYPE3_COMPLEXOPTIONTYPE5, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1504, + serialized_end=1660, +) + + +_COMPLEXOPT6 = _descriptor.Descriptor( + name='ComplexOpt6', + full_name='protobuf_unittest.ComplexOpt6', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='xyzzy', full_name='protobuf_unittest.ComplexOpt6.xyzzy', index=0, + number=7593951, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1662, + serialized_end=1693, +) + + +_VARIOUSCOMPLEXOPTIONS = _descriptor.Descriptor( + name='VariousComplexOptions', + full_name='protobuf_unittest.VariousComplexOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\242\342\225\035\002\010*\242\342\225\035\006\330\205\236\035\304\002\242\342\225\035\010\222\365\235\035\003\010\354\006\242\342\225\035\002 c\242\342\225\035\002 X\252\375\220\035\003\020\333\007\252\375\220\035\006\370\346\227\035\216\005\252\375\220\035\005\n\003\010\347\005\252\375\220\035\010\n\006\330\205\236\035\317\017\252\375\220\035\n\n\010\222\365\235\035\003\010\330\017\252\375\220\035\010\302\254\227\035\003\010\345\005\252\375\220\035\013\302\254\227\035\006\330\205\236\035\316\017\252\375\220\035\r\302\254\227\035\010\222\365\235\035\003\010\311\020\322\250\217\035\003\010\263\017\252\375\220\035\005\032\003\010\301\002\252\375\220\035\004\"\002\010e\252\375\220\035\005\"\003\010\324\001\372\336\220\035\002\010\t\372\336\220\035\004\023\030\026\024\343\334\374\034\370\375\373\034\030\344\334\374\034')), + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1696, + serialized_end=1937, +) + + +_AGGREGATEMESSAGESET = _descriptor.Descriptor( + name='AggregateMessageSet', + full_name='protobuf_unittest.AggregateMessageSet', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\010\001')), + is_extendable=True, + extension_ranges=[(4, 2147483647), ], + oneofs=[ + ], + serialized_start=1939, + serialized_end=1974, +) + + +_AGGREGATEMESSAGESETELEMENT = _descriptor.Descriptor( + name='AggregateMessageSetElement', + full_name='protobuf_unittest.AggregateMessageSetElement', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='s', full_name='protobuf_unittest.AggregateMessageSetElement.s', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + _descriptor.FieldDescriptor( + name='message_set_extension', full_name='protobuf_unittest.AggregateMessageSetElement.message_set_extension', index=0, + number=15447542, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=1977, + serialized_end=2137, +) + + +_AGGREGATE = _descriptor.Descriptor( + name='Aggregate', + full_name='protobuf_unittest.Aggregate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='i', full_name='protobuf_unittest.Aggregate.i', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='s', full_name='protobuf_unittest.Aggregate.s', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='sub', full_name='protobuf_unittest.Aggregate.sub', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='file', full_name='protobuf_unittest.Aggregate.file', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mset', full_name='protobuf_unittest.Aggregate.mset', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + _descriptor.FieldDescriptor( + name='nested', full_name='protobuf_unittest.Aggregate.nested', index=0, + number=15476903, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=2140, + serialized_end=2393, +) + + +_AGGREGATEMESSAGE = _descriptor.Descriptor( + name='AggregateMessage', + full_name='protobuf_unittest.AggregateMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='fieldname', full_name='protobuf_unittest.AggregateMessage.fieldname', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\362\241\207;\021\022\017FieldAnnotation'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\302\321\206;\025\010e\022\021MessageAnnotation')), + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=2395, + serialized_end=2484, +) + + +_NESTEDOPTIONTYPE_NESTEDMESSAGE = _descriptor.Descriptor( + name='NestedMessage', + full_name='protobuf_unittest.NestedOptionType.NestedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='nested_field', full_name='protobuf_unittest.NestedOptionType.NestedMessage.nested_field', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\301\340\303\035\352\003\000\000\000\000\000\000'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\340\351\302\035\351\007')), + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=2507, + serialized_end=2566, +) + +_NESTEDOPTIONTYPE = _descriptor.Descriptor( + name='NestedOptionType', + full_name='protobuf_unittest.NestedOptionType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + _descriptor.FieldDescriptor( + name='nested_extension', full_name='protobuf_unittest.NestedOptionType.nested_extension', index=0, + number=7912573, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\310\213\312\035\355\007'))), + ], + nested_types=[_NESTEDOPTIONTYPE_NESTEDMESSAGE, ], + enum_types=[ + _NESTEDOPTIONTYPE_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=2487, + serialized_end=2688, +) + +_TESTMESSAGEWITHCUSTOMOPTIONS_ANENUM.containing_type = _TESTMESSAGEWITHCUSTOMOPTIONS +_DUMMYMESSAGECONTAININGENUM_TESTENUMTYPE.containing_type = _DUMMYMESSAGECONTAININGENUM +_COMPLEXOPTIONTYPE2_COMPLEXOPTIONTYPE4.containing_type = _COMPLEXOPTIONTYPE2 +_COMPLEXOPTIONTYPE2.fields_by_name['bar'].message_type = _COMPLEXOPTIONTYPE1 +_COMPLEXOPTIONTYPE2.fields_by_name['fred'].message_type = _COMPLEXOPTIONTYPE2_COMPLEXOPTIONTYPE4 +_COMPLEXOPTIONTYPE2.fields_by_name['barney'].message_type = _COMPLEXOPTIONTYPE2_COMPLEXOPTIONTYPE4 +_COMPLEXOPTIONTYPE3_COMPLEXOPTIONTYPE5.containing_type = _COMPLEXOPTIONTYPE3 +_COMPLEXOPTIONTYPE3.fields_by_name['complexoptiontype5'].message_type = _COMPLEXOPTIONTYPE3_COMPLEXOPTIONTYPE5 +_AGGREGATE.fields_by_name['sub'].message_type = _AGGREGATE +_AGGREGATE.fields_by_name['file'].message_type = google.protobuf.descriptor_pb2._FILEOPTIONS +_AGGREGATE.fields_by_name['mset'].message_type = _AGGREGATEMESSAGESET +_NESTEDOPTIONTYPE_NESTEDMESSAGE.containing_type = _NESTEDOPTIONTYPE +_NESTEDOPTIONTYPE_NESTEDENUM.containing_type = _NESTEDOPTIONTYPE +DESCRIPTOR.message_types_by_name['TestMessageWithCustomOptions'] = _TESTMESSAGEWITHCUSTOMOPTIONS +DESCRIPTOR.message_types_by_name['CustomOptionFooRequest'] = _CUSTOMOPTIONFOOREQUEST +DESCRIPTOR.message_types_by_name['CustomOptionFooResponse'] = _CUSTOMOPTIONFOORESPONSE +DESCRIPTOR.message_types_by_name['CustomOptionFooClientMessage'] = _CUSTOMOPTIONFOOCLIENTMESSAGE +DESCRIPTOR.message_types_by_name['CustomOptionFooServerMessage'] = _CUSTOMOPTIONFOOSERVERMESSAGE +DESCRIPTOR.message_types_by_name['DummyMessageContainingEnum'] = _DUMMYMESSAGECONTAININGENUM +DESCRIPTOR.message_types_by_name['DummyMessageInvalidAsOptionType'] = _DUMMYMESSAGEINVALIDASOPTIONTYPE +DESCRIPTOR.message_types_by_name['CustomOptionMinIntegerValues'] = _CUSTOMOPTIONMININTEGERVALUES +DESCRIPTOR.message_types_by_name['CustomOptionMaxIntegerValues'] = _CUSTOMOPTIONMAXINTEGERVALUES +DESCRIPTOR.message_types_by_name['CustomOptionOtherValues'] = _CUSTOMOPTIONOTHERVALUES +DESCRIPTOR.message_types_by_name['SettingRealsFromPositiveInts'] = _SETTINGREALSFROMPOSITIVEINTS +DESCRIPTOR.message_types_by_name['SettingRealsFromNegativeInts'] = _SETTINGREALSFROMNEGATIVEINTS +DESCRIPTOR.message_types_by_name['ComplexOptionType1'] = _COMPLEXOPTIONTYPE1 +DESCRIPTOR.message_types_by_name['ComplexOptionType2'] = _COMPLEXOPTIONTYPE2 +DESCRIPTOR.message_types_by_name['ComplexOptionType3'] = _COMPLEXOPTIONTYPE3 +DESCRIPTOR.message_types_by_name['ComplexOpt6'] = _COMPLEXOPT6 +DESCRIPTOR.message_types_by_name['VariousComplexOptions'] = _VARIOUSCOMPLEXOPTIONS +DESCRIPTOR.message_types_by_name['AggregateMessageSet'] = _AGGREGATEMESSAGESET +DESCRIPTOR.message_types_by_name['AggregateMessageSetElement'] = _AGGREGATEMESSAGESETELEMENT +DESCRIPTOR.message_types_by_name['Aggregate'] = _AGGREGATE +DESCRIPTOR.message_types_by_name['AggregateMessage'] = _AGGREGATEMESSAGE +DESCRIPTOR.message_types_by_name['NestedOptionType'] = _NESTEDOPTIONTYPE +DESCRIPTOR.enum_types_by_name['MethodOpt1'] = _METHODOPT1 +DESCRIPTOR.enum_types_by_name['AggregateEnum'] = _AGGREGATEENUM +DESCRIPTOR.extensions_by_name['file_opt1'] = file_opt1 +DESCRIPTOR.extensions_by_name['message_opt1'] = message_opt1 +DESCRIPTOR.extensions_by_name['field_opt1'] = field_opt1 +DESCRIPTOR.extensions_by_name['field_opt2'] = field_opt2 +DESCRIPTOR.extensions_by_name['enum_opt1'] = enum_opt1 +DESCRIPTOR.extensions_by_name['enum_value_opt1'] = enum_value_opt1 +DESCRIPTOR.extensions_by_name['service_opt1'] = service_opt1 +DESCRIPTOR.extensions_by_name['method_opt1'] = method_opt1 +DESCRIPTOR.extensions_by_name['bool_opt'] = bool_opt +DESCRIPTOR.extensions_by_name['int32_opt'] = int32_opt +DESCRIPTOR.extensions_by_name['int64_opt'] = int64_opt +DESCRIPTOR.extensions_by_name['uint32_opt'] = uint32_opt +DESCRIPTOR.extensions_by_name['uint64_opt'] = uint64_opt +DESCRIPTOR.extensions_by_name['sint32_opt'] = sint32_opt +DESCRIPTOR.extensions_by_name['sint64_opt'] = sint64_opt +DESCRIPTOR.extensions_by_name['fixed32_opt'] = fixed32_opt +DESCRIPTOR.extensions_by_name['fixed64_opt'] = fixed64_opt +DESCRIPTOR.extensions_by_name['sfixed32_opt'] = sfixed32_opt +DESCRIPTOR.extensions_by_name['sfixed64_opt'] = sfixed64_opt +DESCRIPTOR.extensions_by_name['float_opt'] = float_opt +DESCRIPTOR.extensions_by_name['double_opt'] = double_opt +DESCRIPTOR.extensions_by_name['string_opt'] = string_opt +DESCRIPTOR.extensions_by_name['bytes_opt'] = bytes_opt +DESCRIPTOR.extensions_by_name['enum_opt'] = enum_opt +DESCRIPTOR.extensions_by_name['message_type_opt'] = message_type_opt +DESCRIPTOR.extensions_by_name['quux'] = quux +DESCRIPTOR.extensions_by_name['corge'] = corge +DESCRIPTOR.extensions_by_name['grault'] = grault +DESCRIPTOR.extensions_by_name['garply'] = garply +DESCRIPTOR.extensions_by_name['complex_opt1'] = complex_opt1 +DESCRIPTOR.extensions_by_name['complex_opt2'] = complex_opt2 +DESCRIPTOR.extensions_by_name['complex_opt3'] = complex_opt3 +DESCRIPTOR.extensions_by_name['complexopt6'] = complexopt6 +DESCRIPTOR.extensions_by_name['fileopt'] = fileopt +DESCRIPTOR.extensions_by_name['msgopt'] = msgopt +DESCRIPTOR.extensions_by_name['fieldopt'] = fieldopt +DESCRIPTOR.extensions_by_name['enumopt'] = enumopt +DESCRIPTOR.extensions_by_name['enumvalopt'] = enumvalopt +DESCRIPTOR.extensions_by_name['serviceopt'] = serviceopt +DESCRIPTOR.extensions_by_name['methodopt'] = methodopt + +TestMessageWithCustomOptions = _reflection.GeneratedProtocolMessageType('TestMessageWithCustomOptions', (_message.Message,), dict( + DESCRIPTOR = _TESTMESSAGEWITHCUSTOMOPTIONS, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestMessageWithCustomOptions) + )) +_sym_db.RegisterMessage(TestMessageWithCustomOptions) + +CustomOptionFooRequest = _reflection.GeneratedProtocolMessageType('CustomOptionFooRequest', (_message.Message,), dict( + DESCRIPTOR = _CUSTOMOPTIONFOOREQUEST, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.CustomOptionFooRequest) + )) +_sym_db.RegisterMessage(CustomOptionFooRequest) + +CustomOptionFooResponse = _reflection.GeneratedProtocolMessageType('CustomOptionFooResponse', (_message.Message,), dict( + DESCRIPTOR = _CUSTOMOPTIONFOORESPONSE, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.CustomOptionFooResponse) + )) +_sym_db.RegisterMessage(CustomOptionFooResponse) + +CustomOptionFooClientMessage = _reflection.GeneratedProtocolMessageType('CustomOptionFooClientMessage', (_message.Message,), dict( + DESCRIPTOR = _CUSTOMOPTIONFOOCLIENTMESSAGE, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.CustomOptionFooClientMessage) + )) +_sym_db.RegisterMessage(CustomOptionFooClientMessage) + +CustomOptionFooServerMessage = _reflection.GeneratedProtocolMessageType('CustomOptionFooServerMessage', (_message.Message,), dict( + DESCRIPTOR = _CUSTOMOPTIONFOOSERVERMESSAGE, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.CustomOptionFooServerMessage) + )) +_sym_db.RegisterMessage(CustomOptionFooServerMessage) + +DummyMessageContainingEnum = _reflection.GeneratedProtocolMessageType('DummyMessageContainingEnum', (_message.Message,), dict( + DESCRIPTOR = _DUMMYMESSAGECONTAININGENUM, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.DummyMessageContainingEnum) + )) +_sym_db.RegisterMessage(DummyMessageContainingEnum) + +DummyMessageInvalidAsOptionType = _reflection.GeneratedProtocolMessageType('DummyMessageInvalidAsOptionType', (_message.Message,), dict( + DESCRIPTOR = _DUMMYMESSAGEINVALIDASOPTIONTYPE, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.DummyMessageInvalidAsOptionType) + )) +_sym_db.RegisterMessage(DummyMessageInvalidAsOptionType) + +CustomOptionMinIntegerValues = _reflection.GeneratedProtocolMessageType('CustomOptionMinIntegerValues', (_message.Message,), dict( + DESCRIPTOR = _CUSTOMOPTIONMININTEGERVALUES, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.CustomOptionMinIntegerValues) + )) +_sym_db.RegisterMessage(CustomOptionMinIntegerValues) + +CustomOptionMaxIntegerValues = _reflection.GeneratedProtocolMessageType('CustomOptionMaxIntegerValues', (_message.Message,), dict( + DESCRIPTOR = _CUSTOMOPTIONMAXINTEGERVALUES, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.CustomOptionMaxIntegerValues) + )) +_sym_db.RegisterMessage(CustomOptionMaxIntegerValues) + +CustomOptionOtherValues = _reflection.GeneratedProtocolMessageType('CustomOptionOtherValues', (_message.Message,), dict( + DESCRIPTOR = _CUSTOMOPTIONOTHERVALUES, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.CustomOptionOtherValues) + )) +_sym_db.RegisterMessage(CustomOptionOtherValues) + +SettingRealsFromPositiveInts = _reflection.GeneratedProtocolMessageType('SettingRealsFromPositiveInts', (_message.Message,), dict( + DESCRIPTOR = _SETTINGREALSFROMPOSITIVEINTS, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.SettingRealsFromPositiveInts) + )) +_sym_db.RegisterMessage(SettingRealsFromPositiveInts) + +SettingRealsFromNegativeInts = _reflection.GeneratedProtocolMessageType('SettingRealsFromNegativeInts', (_message.Message,), dict( + DESCRIPTOR = _SETTINGREALSFROMNEGATIVEINTS, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.SettingRealsFromNegativeInts) + )) +_sym_db.RegisterMessage(SettingRealsFromNegativeInts) + +ComplexOptionType1 = _reflection.GeneratedProtocolMessageType('ComplexOptionType1', (_message.Message,), dict( + DESCRIPTOR = _COMPLEXOPTIONTYPE1, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.ComplexOptionType1) + )) +_sym_db.RegisterMessage(ComplexOptionType1) + +ComplexOptionType2 = _reflection.GeneratedProtocolMessageType('ComplexOptionType2', (_message.Message,), dict( + + ComplexOptionType4 = _reflection.GeneratedProtocolMessageType('ComplexOptionType4', (_message.Message,), dict( + DESCRIPTOR = _COMPLEXOPTIONTYPE2_COMPLEXOPTIONTYPE4, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.ComplexOptionType2.ComplexOptionType4) + )) + , + DESCRIPTOR = _COMPLEXOPTIONTYPE2, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.ComplexOptionType2) + )) +_sym_db.RegisterMessage(ComplexOptionType2) +_sym_db.RegisterMessage(ComplexOptionType2.ComplexOptionType4) + +ComplexOptionType3 = _reflection.GeneratedProtocolMessageType('ComplexOptionType3', (_message.Message,), dict( + + ComplexOptionType5 = _reflection.GeneratedProtocolMessageType('ComplexOptionType5', (_message.Message,), dict( + DESCRIPTOR = _COMPLEXOPTIONTYPE3_COMPLEXOPTIONTYPE5, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.ComplexOptionType3.ComplexOptionType5) + )) + , + DESCRIPTOR = _COMPLEXOPTIONTYPE3, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.ComplexOptionType3) + )) +_sym_db.RegisterMessage(ComplexOptionType3) +_sym_db.RegisterMessage(ComplexOptionType3.ComplexOptionType5) + +ComplexOpt6 = _reflection.GeneratedProtocolMessageType('ComplexOpt6', (_message.Message,), dict( + DESCRIPTOR = _COMPLEXOPT6, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.ComplexOpt6) + )) +_sym_db.RegisterMessage(ComplexOpt6) + +VariousComplexOptions = _reflection.GeneratedProtocolMessageType('VariousComplexOptions', (_message.Message,), dict( + DESCRIPTOR = _VARIOUSCOMPLEXOPTIONS, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.VariousComplexOptions) + )) +_sym_db.RegisterMessage(VariousComplexOptions) + +AggregateMessageSet = _reflection.GeneratedProtocolMessageType('AggregateMessageSet', (_message.Message,), dict( + DESCRIPTOR = _AGGREGATEMESSAGESET, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.AggregateMessageSet) + )) +_sym_db.RegisterMessage(AggregateMessageSet) + +AggregateMessageSetElement = _reflection.GeneratedProtocolMessageType('AggregateMessageSetElement', (_message.Message,), dict( + DESCRIPTOR = _AGGREGATEMESSAGESETELEMENT, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.AggregateMessageSetElement) + )) +_sym_db.RegisterMessage(AggregateMessageSetElement) + +Aggregate = _reflection.GeneratedProtocolMessageType('Aggregate', (_message.Message,), dict( + DESCRIPTOR = _AGGREGATE, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.Aggregate) + )) +_sym_db.RegisterMessage(Aggregate) + +AggregateMessage = _reflection.GeneratedProtocolMessageType('AggregateMessage', (_message.Message,), dict( + DESCRIPTOR = _AGGREGATEMESSAGE, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.AggregateMessage) + )) +_sym_db.RegisterMessage(AggregateMessage) + +NestedOptionType = _reflection.GeneratedProtocolMessageType('NestedOptionType', (_message.Message,), dict( + + NestedMessage = _reflection.GeneratedProtocolMessageType('NestedMessage', (_message.Message,), dict( + DESCRIPTOR = _NESTEDOPTIONTYPE_NESTEDMESSAGE, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.NestedOptionType.NestedMessage) + )) + , + DESCRIPTOR = _NESTEDOPTIONTYPE, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.NestedOptionType) + )) +_sym_db.RegisterMessage(NestedOptionType) +_sym_db.RegisterMessage(NestedOptionType.NestedMessage) + +google.protobuf.descriptor_pb2.FileOptions.RegisterExtension(file_opt1) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(message_opt1) +google.protobuf.descriptor_pb2.FieldOptions.RegisterExtension(field_opt1) +google.protobuf.descriptor_pb2.FieldOptions.RegisterExtension(field_opt2) +google.protobuf.descriptor_pb2.EnumOptions.RegisterExtension(enum_opt1) +google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(enum_value_opt1) +google.protobuf.descriptor_pb2.ServiceOptions.RegisterExtension(service_opt1) +method_opt1.enum_type = _METHODOPT1 +google.protobuf.descriptor_pb2.MethodOptions.RegisterExtension(method_opt1) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(bool_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(int32_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(int64_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(uint32_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(uint64_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(sint32_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(sint64_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(fixed32_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(fixed64_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(sfixed32_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(sfixed64_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(float_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(double_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(string_opt) +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(bytes_opt) +enum_opt.enum_type = _DUMMYMESSAGECONTAININGENUM_TESTENUMTYPE +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(enum_opt) +message_type_opt.message_type = _DUMMYMESSAGEINVALIDASOPTIONTYPE +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(message_type_opt) +ComplexOptionType1.RegisterExtension(quux) +corge.message_type = _COMPLEXOPTIONTYPE3 +ComplexOptionType1.RegisterExtension(corge) +ComplexOptionType2.RegisterExtension(grault) +garply.message_type = _COMPLEXOPTIONTYPE1 +ComplexOptionType2.RegisterExtension(garply) +complex_opt1.message_type = _COMPLEXOPTIONTYPE1 +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(complex_opt1) +complex_opt2.message_type = _COMPLEXOPTIONTYPE2 +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(complex_opt2) +complex_opt3.message_type = _COMPLEXOPTIONTYPE3 +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(complex_opt3) +complexopt6.message_type = _COMPLEXOPT6 +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(complexopt6) +fileopt.message_type = _AGGREGATE +google.protobuf.descriptor_pb2.FileOptions.RegisterExtension(fileopt) +msgopt.message_type = _AGGREGATE +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(msgopt) +fieldopt.message_type = _AGGREGATE +google.protobuf.descriptor_pb2.FieldOptions.RegisterExtension(fieldopt) +enumopt.message_type = _AGGREGATE +google.protobuf.descriptor_pb2.EnumOptions.RegisterExtension(enumopt) +enumvalopt.message_type = _AGGREGATE +google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(enumvalopt) +serviceopt.message_type = _AGGREGATE +google.protobuf.descriptor_pb2.ServiceOptions.RegisterExtension(serviceopt) +methodopt.message_type = _AGGREGATE +google.protobuf.descriptor_pb2.MethodOptions.RegisterExtension(methodopt) +_COMPLEXOPTIONTYPE2_COMPLEXOPTIONTYPE4.extensions_by_name['complex_opt4'].message_type = _COMPLEXOPTIONTYPE2_COMPLEXOPTIONTYPE4 +google.protobuf.descriptor_pb2.MessageOptions.RegisterExtension(_COMPLEXOPTIONTYPE2_COMPLEXOPTIONTYPE4.extensions_by_name['complex_opt4']) +_AGGREGATEMESSAGESETELEMENT.extensions_by_name['message_set_extension'].message_type = _AGGREGATEMESSAGESETELEMENT +AggregateMessageSet.RegisterExtension(_AGGREGATEMESSAGESETELEMENT.extensions_by_name['message_set_extension']) +_AGGREGATE.extensions_by_name['nested'].message_type = _AGGREGATE +google.protobuf.descriptor_pb2.FileOptions.RegisterExtension(_AGGREGATE.extensions_by_name['nested']) +google.protobuf.descriptor_pb2.FileOptions.RegisterExtension(_NESTEDOPTIONTYPE.extensions_by_name['nested_extension']) + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\200\001\001\210\001\001\220\001\001\360\350\301\035\352\255\300\345$\372\354\205;p\010d\022\016FileAnnotation\032\026\022\024NestedFileAnnotation\"\036\372\354\205;\031\022\027FileExtensionAnnotation*$\013\020\366\353\256\007\032\033\n\031EmbeddedMessageSetElement\014')) +_AGGREGATEENUM.has_options = True +_AGGREGATEENUM._options = _descriptor._ParseOptions(descriptor_pb2.EnumOptions(), _b('\222\225\210;\020\022\016EnumAnnotation')) +_AGGREGATEENUM.values_by_name["VALUE"].has_options = True +_AGGREGATEENUM.values_by_name["VALUE"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), _b('\312\374\211;\025\022\023EnumValueAnnotation')) +_TESTMESSAGEWITHCUSTOMOPTIONS_ANENUM.has_options = True +_TESTMESSAGEWITHCUSTOMOPTIONS_ANENUM._options = _descriptor._ParseOptions(descriptor_pb2.EnumOptions(), _b('\305\366\311\035\353\374\377\377')) +_TESTMESSAGEWITHCUSTOMOPTIONS_ANENUM.values_by_name["ANENUM_VAL2"].has_options = True +_TESTMESSAGEWITHCUSTOMOPTIONS_ANENUM.values_by_name["ANENUM_VAL2"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), _b('\260\206\372\005{')) +_TESTMESSAGEWITHCUSTOMOPTIONS.fields_by_name['field1'].has_options = True +_TESTMESSAGEWITHCUSTOMOPTIONS.fields_by_name['field1']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001\301\340\303\035-\341u\n\002\000\000\000')) +_TESTMESSAGEWITHCUSTOMOPTIONS.has_options = True +_TESTMESSAGEWITHCUSTOMOPTIONS._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\010\000\340\351\302\035\310\377\377\377\377\377\377\377\377\001')) +_CUSTOMOPTIONMININTEGERVALUES.has_options = True +_CUSTOMOPTIONMININTEGERVALUES._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\320\336\262\035\000\350\306\262\035\200\200\200\200\370\377\377\377\377\001\260\274\262\035\200\200\200\200\200\200\200\200\200\001\200\223\262\035\000\370\365\260\035\000\200\304\260\035\377\377\377\377\017\370\227\260\035\377\377\377\377\377\377\377\377\377\001\235\365\257\035\000\000\000\000\221\356\257\035\000\000\000\000\000\000\000\000\255\215\257\035\000\000\000\200\231\326\250\035\000\000\000\000\000\000\000\200')) +_CUSTOMOPTIONMAXINTEGERVALUES.has_options = True +_CUSTOMOPTIONMAXINTEGERVALUES._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\320\336\262\035\001\350\306\262\035\377\377\377\377\007\260\274\262\035\377\377\377\377\377\377\377\377\177\200\223\262\035\377\377\377\377\017\370\365\260\035\377\377\377\377\377\377\377\377\377\001\200\304\260\035\376\377\377\377\017\370\227\260\035\376\377\377\377\377\377\377\377\377\001\235\365\257\035\377\377\377\377\221\356\257\035\377\377\377\377\377\377\377\377\255\215\257\035\377\377\377\177\231\326\250\035\377\377\377\377\377\377\377\177')) +_CUSTOMOPTIONOTHERVALUES.has_options = True +_CUSTOMOPTIONOTHERVALUES._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\350\306\262\035\234\377\377\377\377\377\377\377\377\001\365\337\243\035\347\207EA\351\334\242\035\373Y\214B\312\300\363?\252\334\242\035\016Hello, \"World\"\262\331\242\035\013Hello\000World\210\331\242\035\351\377\377\377\377\377\377\377\377\001')) +_SETTINGREALSFROMPOSITIVEINTS.has_options = True +_SETTINGREALSFROMPOSITIVEINTS._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\365\337\243\035\000\000@A\351\334\242\035\000\000\000\000\000@c@')) +_SETTINGREALSFROMNEGATIVEINTS.has_options = True +_SETTINGREALSFROMNEGATIVEINTS._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\365\337\243\035\000\000@\301\351\334\242\035\000\000\000\000\000@c\300')) +_VARIOUSCOMPLEXOPTIONS.has_options = True +_VARIOUSCOMPLEXOPTIONS._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\242\342\225\035\002\010*\242\342\225\035\006\330\205\236\035\304\002\242\342\225\035\010\222\365\235\035\003\010\354\006\242\342\225\035\002 c\242\342\225\035\002 X\252\375\220\035\003\020\333\007\252\375\220\035\006\370\346\227\035\216\005\252\375\220\035\005\n\003\010\347\005\252\375\220\035\010\n\006\330\205\236\035\317\017\252\375\220\035\n\n\010\222\365\235\035\003\010\330\017\252\375\220\035\010\302\254\227\035\003\010\345\005\252\375\220\035\013\302\254\227\035\006\330\205\236\035\316\017\252\375\220\035\r\302\254\227\035\010\222\365\235\035\003\010\311\020\322\250\217\035\003\010\263\017\252\375\220\035\005\032\003\010\301\002\252\375\220\035\004\"\002\010e\252\375\220\035\005\"\003\010\324\001\372\336\220\035\002\010\t\372\336\220\035\004\023\030\026\024\343\334\374\034\370\375\373\034\030\344\334\374\034')) +_AGGREGATEMESSAGESET.has_options = True +_AGGREGATEMESSAGESET._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\010\001')) +_AGGREGATEMESSAGE.fields_by_name['fieldname'].has_options = True +_AGGREGATEMESSAGE.fields_by_name['fieldname']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\362\241\207;\021\022\017FieldAnnotation')) +_AGGREGATEMESSAGE.has_options = True +_AGGREGATEMESSAGE._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\302\321\206;\025\010e\022\021MessageAnnotation')) +_NESTEDOPTIONTYPE_NESTEDMESSAGE.fields_by_name['nested_field'].has_options = True +_NESTEDOPTIONTYPE_NESTEDMESSAGE.fields_by_name['nested_field']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\301\340\303\035\352\003\000\000\000\000\000\000')) +_NESTEDOPTIONTYPE_NESTEDMESSAGE.has_options = True +_NESTEDOPTIONTYPE_NESTEDMESSAGE._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\340\351\302\035\351\007')) +_NESTEDOPTIONTYPE_NESTEDENUM.has_options = True +_NESTEDOPTIONTYPE_NESTEDENUM._options = _descriptor._ParseOptions(descriptor_pb2.EnumOptions(), _b('\305\366\311\035\353\003\000\000')) +_NESTEDOPTIONTYPE_NESTEDENUM.values_by_name["NESTED_ENUM_VALUE"].has_options = True +_NESTEDOPTIONTYPE_NESTEDENUM.values_by_name["NESTED_ENUM_VALUE"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), _b('\260\206\372\005\354\007')) +_NESTEDOPTIONTYPE.extensions_by_name['nested_extension'].has_options = True +_NESTEDOPTIONTYPE.extensions_by_name['nested_extension']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\310\213\312\035\355\007')) + +_TESTSERVICEWITHCUSTOMOPTIONS = _descriptor.ServiceDescriptor( + name='TestServiceWithCustomOptions', + full_name='protobuf_unittest.TestServiceWithCustomOptions', + file=DESCRIPTOR, + index=0, + options=_descriptor._ParseOptions(descriptor_pb2.ServiceOptions(), _b('\220\262\213\036\323\333\200\313I')), + serialized_start=2826, + serialized_end=2968, + methods=[ + _descriptor.MethodDescriptor( + name='Foo', + full_name='protobuf_unittest.TestServiceWithCustomOptions.Foo', + index=0, + containing_service=None, + input_type=_CUSTOMOPTIONFOOREQUEST, + output_type=_CUSTOMOPTIONFOORESPONSE, + options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\340\372\214\036\002')), + ), +]) + +TestServiceWithCustomOptions = service_reflection.GeneratedServiceType('TestServiceWithCustomOptions', (_service.Service,), dict( + DESCRIPTOR = _TESTSERVICEWITHCUSTOMOPTIONS, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + )) + +TestServiceWithCustomOptions_Stub = service_reflection.GeneratedServiceStubType('TestServiceWithCustomOptions_Stub', (TestServiceWithCustomOptions,), dict( + DESCRIPTOR = _TESTSERVICEWITHCUSTOMOPTIONS, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + )) + + + +_AGGREGATESERVICE = _descriptor.ServiceDescriptor( + name='AggregateService', + full_name='protobuf_unittest.AggregateService', + file=DESCRIPTOR, + index=1, + options=_descriptor._ParseOptions(descriptor_pb2.ServiceOptions(), _b('\312\373\216;\023\022\021ServiceAnnotation')), + serialized_start=2971, + serialized_end=3124, + methods=[ + _descriptor.MethodDescriptor( + name='Method', + full_name='protobuf_unittest.AggregateService.Method', + index=0, + containing_service=None, + input_type=_AGGREGATEMESSAGE, + output_type=_AGGREGATEMESSAGE, + options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\312\310\226;\022\022\020MethodAnnotation')), + ), +]) + +AggregateService = service_reflection.GeneratedServiceType('AggregateService', (_service.Service,), dict( + DESCRIPTOR = _AGGREGATESERVICE, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + )) + +AggregateService_Stub = service_reflection.GeneratedServiceStubType('AggregateService_Stub', (AggregateService,), dict( + DESCRIPTOR = _AGGREGATESERVICE, + __module__ = 'google.protobuf.unittest_custom_options_pb2' + )) + + +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/unittest_import_pb2.py b/pythonlib/google/protobuf/unittest_import_pb2.py new file mode 100644 index 0000000..936ac4d --- /dev/null +++ b/pythonlib/google/protobuf/unittest_import_pb2.py @@ -0,0 +1,104 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/unittest_import.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import google.protobuf.unittest_import_public_pb2 + +from google.protobuf.unittest_import_public_pb2 import * + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/unittest_import.proto', + package='protobuf_unittest_import', + serialized_pb=_b('\n%google/protobuf/unittest_import.proto\x12\x18protobuf_unittest_import\x1a,google/protobuf/unittest_import_public.proto\"\x1a\n\rImportMessage\x12\t\n\x01\x64\x18\x01 \x01(\x05*<\n\nImportEnum\x12\x0e\n\nIMPORT_FOO\x10\x07\x12\x0e\n\nIMPORT_BAR\x10\x08\x12\x0e\n\nIMPORT_BAZ\x10\tB\x1c\n\x18\x63om.google.protobuf.testH\x01P\x00') + , + dependencies=[google.protobuf.unittest_import_public_pb2.DESCRIPTOR,]) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +_IMPORTENUM = _descriptor.EnumDescriptor( + name='ImportEnum', + full_name='protobuf_unittest_import.ImportEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='IMPORT_FOO', index=0, number=7, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='IMPORT_BAR', index=1, number=8, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='IMPORT_BAZ', index=2, number=9, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=141, + serialized_end=201, +) +_sym_db.RegisterEnumDescriptor(_IMPORTENUM) + +ImportEnum = enum_type_wrapper.EnumTypeWrapper(_IMPORTENUM) +IMPORT_FOO = 7 +IMPORT_BAR = 8 +IMPORT_BAZ = 9 + + + +_IMPORTMESSAGE = _descriptor.Descriptor( + name='ImportMessage', + full_name='protobuf_unittest_import.ImportMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='d', full_name='protobuf_unittest_import.ImportMessage.d', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=113, + serialized_end=139, +) + +DESCRIPTOR.message_types_by_name['ImportMessage'] = _IMPORTMESSAGE +DESCRIPTOR.enum_types_by_name['ImportEnum'] = _IMPORTENUM + +ImportMessage = _reflection.GeneratedProtocolMessageType('ImportMessage', (_message.Message,), dict( + DESCRIPTOR = _IMPORTMESSAGE, + __module__ = 'google.protobuf.unittest_import_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest_import.ImportMessage) + )) +_sym_db.RegisterMessage(ImportMessage) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\030com.google.protobuf.testH\001')) +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/unittest_import_public_pb2.py b/pythonlib/google/protobuf/unittest_import_public_pb2.py new file mode 100644 index 0000000..29ed406 --- /dev/null +++ b/pythonlib/google/protobuf/unittest_import_public_pb2.py @@ -0,0 +1,69 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/unittest_import_public.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/unittest_import_public.proto', + package='protobuf_unittest_import', + serialized_pb=_b('\n,google/protobuf/unittest_import_public.proto\x12\x18protobuf_unittest_import\" \n\x13PublicImportMessage\x12\t\n\x01\x65\x18\x01 \x01(\x05\x42\x1a\n\x18\x63om.google.protobuf.test') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + + + +_PUBLICIMPORTMESSAGE = _descriptor.Descriptor( + name='PublicImportMessage', + full_name='protobuf_unittest_import.PublicImportMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='e', full_name='protobuf_unittest_import.PublicImportMessage.e', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=74, + serialized_end=106, +) + +DESCRIPTOR.message_types_by_name['PublicImportMessage'] = _PUBLICIMPORTMESSAGE + +PublicImportMessage = _reflection.GeneratedProtocolMessageType('PublicImportMessage', (_message.Message,), dict( + DESCRIPTOR = _PUBLICIMPORTMESSAGE, + __module__ = 'google.protobuf.unittest_import_public_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest_import.PublicImportMessage) + )) +_sym_db.RegisterMessage(PublicImportMessage) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\030com.google.protobuf.test')) +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/unittest_mset_pb2.py b/pythonlib/google/protobuf/unittest_mset_pb2.py new file mode 100644 index 0000000..650abe8 --- /dev/null +++ b/pythonlib/google/protobuf/unittest_mset_pb2.py @@ -0,0 +1,281 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/unittest_mset.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/unittest_mset.proto', + package='protobuf_unittest', + serialized_pb=_b('\n#google/protobuf/unittest_mset.proto\x12\x11protobuf_unittest\"\x1e\n\x0eTestMessageSet*\x08\x08\x04\x10\xff\xff\xff\xff\x07:\x02\x08\x01\"Q\n\x17TestMessageSetContainer\x12\x36\n\x0bmessage_set\x18\x01 \x01(\x0b\x32!.protobuf_unittest.TestMessageSet\"\x96\x01\n\x18TestMessageSetExtension1\x12\t\n\x01i\x18\x0f \x01(\x05\x32o\n\x15message_set_extension\x12!.protobuf_unittest.TestMessageSet\x18\xb0\xa6^ \x01(\x0b\x32+.protobuf_unittest.TestMessageSetExtension1\"\x98\x01\n\x18TestMessageSetExtension2\x12\x0b\n\x03str\x18\x19 \x01(\t2o\n\x15message_set_extension\x12!.protobuf_unittest.TestMessageSet\x18\xf9\xbb^ \x01(\x0b\x32+.protobuf_unittest.TestMessageSetExtension2\"n\n\rRawMessageSet\x12\x33\n\x04item\x18\x01 \x03(\n2%.protobuf_unittest.RawMessageSet.Item\x1a(\n\x04Item\x12\x0f\n\x07type_id\x18\x02 \x02(\x05\x12\x0f\n\x07message\x18\x03 \x02(\x0c\x42\x02H\x01') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + + + +_TESTMESSAGESET = _descriptor.Descriptor( + name='TestMessageSet', + full_name='protobuf_unittest.TestMessageSet', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\010\001')), + is_extendable=True, + extension_ranges=[(4, 2147483647), ], + oneofs=[ + ], + serialized_start=58, + serialized_end=88, +) + + +_TESTMESSAGESETCONTAINER = _descriptor.Descriptor( + name='TestMessageSetContainer', + full_name='protobuf_unittest.TestMessageSetContainer', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message_set', full_name='protobuf_unittest.TestMessageSetContainer.message_set', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=90, + serialized_end=171, +) + + +_TESTMESSAGESETEXTENSION1 = _descriptor.Descriptor( + name='TestMessageSetExtension1', + full_name='protobuf_unittest.TestMessageSetExtension1', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='i', full_name='protobuf_unittest.TestMessageSetExtension1.i', index=0, + number=15, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + _descriptor.FieldDescriptor( + name='message_set_extension', full_name='protobuf_unittest.TestMessageSetExtension1.message_set_extension', index=0, + number=1545008, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=174, + serialized_end=324, +) + + +_TESTMESSAGESETEXTENSION2 = _descriptor.Descriptor( + name='TestMessageSetExtension2', + full_name='protobuf_unittest.TestMessageSetExtension2', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='str', full_name='protobuf_unittest.TestMessageSetExtension2.str', index=0, + number=25, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + _descriptor.FieldDescriptor( + name='message_set_extension', full_name='protobuf_unittest.TestMessageSetExtension2.message_set_extension', index=0, + number=1547769, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=327, + serialized_end=479, +) + + +_RAWMESSAGESET_ITEM = _descriptor.Descriptor( + name='Item', + full_name='protobuf_unittest.RawMessageSet.Item', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='type_id', full_name='protobuf_unittest.RawMessageSet.Item.type_id', index=0, + number=2, type=5, cpp_type=1, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message', full_name='protobuf_unittest.RawMessageSet.Item.message', index=1, + number=3, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=551, + serialized_end=591, +) + +_RAWMESSAGESET = _descriptor.Descriptor( + name='RawMessageSet', + full_name='protobuf_unittest.RawMessageSet', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='item', full_name='protobuf_unittest.RawMessageSet.item', index=0, + number=1, type=10, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_RAWMESSAGESET_ITEM, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=481, + serialized_end=591, +) + +_TESTMESSAGESETCONTAINER.fields_by_name['message_set'].message_type = _TESTMESSAGESET +_RAWMESSAGESET_ITEM.containing_type = _RAWMESSAGESET +_RAWMESSAGESET.fields_by_name['item'].message_type = _RAWMESSAGESET_ITEM +DESCRIPTOR.message_types_by_name['TestMessageSet'] = _TESTMESSAGESET +DESCRIPTOR.message_types_by_name['TestMessageSetContainer'] = _TESTMESSAGESETCONTAINER +DESCRIPTOR.message_types_by_name['TestMessageSetExtension1'] = _TESTMESSAGESETEXTENSION1 +DESCRIPTOR.message_types_by_name['TestMessageSetExtension2'] = _TESTMESSAGESETEXTENSION2 +DESCRIPTOR.message_types_by_name['RawMessageSet'] = _RAWMESSAGESET + +TestMessageSet = _reflection.GeneratedProtocolMessageType('TestMessageSet', (_message.Message,), dict( + DESCRIPTOR = _TESTMESSAGESET, + __module__ = 'google.protobuf.unittest_mset_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestMessageSet) + )) +_sym_db.RegisterMessage(TestMessageSet) + +TestMessageSetContainer = _reflection.GeneratedProtocolMessageType('TestMessageSetContainer', (_message.Message,), dict( + DESCRIPTOR = _TESTMESSAGESETCONTAINER, + __module__ = 'google.protobuf.unittest_mset_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestMessageSetContainer) + )) +_sym_db.RegisterMessage(TestMessageSetContainer) + +TestMessageSetExtension1 = _reflection.GeneratedProtocolMessageType('TestMessageSetExtension1', (_message.Message,), dict( + DESCRIPTOR = _TESTMESSAGESETEXTENSION1, + __module__ = 'google.protobuf.unittest_mset_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestMessageSetExtension1) + )) +_sym_db.RegisterMessage(TestMessageSetExtension1) + +TestMessageSetExtension2 = _reflection.GeneratedProtocolMessageType('TestMessageSetExtension2', (_message.Message,), dict( + DESCRIPTOR = _TESTMESSAGESETEXTENSION2, + __module__ = 'google.protobuf.unittest_mset_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestMessageSetExtension2) + )) +_sym_db.RegisterMessage(TestMessageSetExtension2) + +RawMessageSet = _reflection.GeneratedProtocolMessageType('RawMessageSet', (_message.Message,), dict( + + Item = _reflection.GeneratedProtocolMessageType('Item', (_message.Message,), dict( + DESCRIPTOR = _RAWMESSAGESET_ITEM, + __module__ = 'google.protobuf.unittest_mset_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.RawMessageSet.Item) + )) + , + DESCRIPTOR = _RAWMESSAGESET, + __module__ = 'google.protobuf.unittest_mset_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.RawMessageSet) + )) +_sym_db.RegisterMessage(RawMessageSet) +_sym_db.RegisterMessage(RawMessageSet.Item) + +_TESTMESSAGESETEXTENSION1.extensions_by_name['message_set_extension'].message_type = _TESTMESSAGESETEXTENSION1 +TestMessageSet.RegisterExtension(_TESTMESSAGESETEXTENSION1.extensions_by_name['message_set_extension']) +_TESTMESSAGESETEXTENSION2.extensions_by_name['message_set_extension'].message_type = _TESTMESSAGESETEXTENSION2 +TestMessageSet.RegisterExtension(_TESTMESSAGESETEXTENSION2.extensions_by_name['message_set_extension']) + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('H\001')) +_TESTMESSAGESET.has_options = True +_TESTMESSAGESET._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\010\001')) +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/unittest_no_generic_services_pb2.py b/pythonlib/google/protobuf/unittest_no_generic_services_pb2.py new file mode 100644 index 0000000..f145b3b --- /dev/null +++ b/pythonlib/google/protobuf/unittest_no_generic_services_pb2.py @@ -0,0 +1,99 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/unittest_no_generic_services.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/unittest_no_generic_services.proto', + package='google.protobuf.no_generic_services_test', + serialized_pb=_b('\n2google/protobuf/unittest_no_generic_services.proto\x12(google.protobuf.no_generic_services_test\"#\n\x0bTestMessage\x12\t\n\x01\x61\x18\x01 \x01(\x05*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02*\x13\n\x08TestEnum\x12\x07\n\x03\x46OO\x10\x01\x32\x82\x01\n\x0bTestService\x12s\n\x03\x46oo\x12\x35.google.protobuf.no_generic_services_test.TestMessage\x1a\x35.google.protobuf.no_generic_services_test.TestMessage:N\n\x0etest_extension\x12\x35.google.protobuf.no_generic_services_test.TestMessage\x18\xe8\x07 \x01(\x05') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +_TESTENUM = _descriptor.EnumDescriptor( + name='TestEnum', + full_name='google.protobuf.no_generic_services_test.TestEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='FOO', index=0, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=133, + serialized_end=152, +) +_sym_db.RegisterEnumDescriptor(_TESTENUM) + +TestEnum = enum_type_wrapper.EnumTypeWrapper(_TESTENUM) +FOO = 1 + +TEST_EXTENSION_FIELD_NUMBER = 1000 +test_extension = _descriptor.FieldDescriptor( + name='test_extension', full_name='google.protobuf.no_generic_services_test.test_extension', index=0, + number=1000, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) + + +_TESTMESSAGE = _descriptor.Descriptor( + name='TestMessage', + full_name='google.protobuf.no_generic_services_test.TestMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='google.protobuf.no_generic_services_test.TestMessage.a', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=96, + serialized_end=131, +) + +DESCRIPTOR.message_types_by_name['TestMessage'] = _TESTMESSAGE +DESCRIPTOR.enum_types_by_name['TestEnum'] = _TESTENUM +DESCRIPTOR.extensions_by_name['test_extension'] = test_extension + +TestMessage = _reflection.GeneratedProtocolMessageType('TestMessage', (_message.Message,), dict( + DESCRIPTOR = _TESTMESSAGE, + __module__ = 'google.protobuf.unittest_no_generic_services_pb2' + # @@protoc_insertion_point(class_scope:google.protobuf.no_generic_services_test.TestMessage) + )) +_sym_db.RegisterMessage(TestMessage) + +TestMessage.RegisterExtension(test_extension) + +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google/protobuf/unittest_pb2.py b/pythonlib/google/protobuf/unittest_pb2.py new file mode 100644 index 0000000..1437e02 --- /dev/null +++ b/pythonlib/google/protobuf/unittest_pb2.py @@ -0,0 +1,5926 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/unittest.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import service as _service +from google.protobuf import service_reflection +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import google.protobuf.unittest_import_pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/unittest.proto', + package='protobuf_unittest', + serialized_pb=_b('\n\x1egoogle/protobuf/unittest.proto\x12\x11protobuf_unittest\x1a%google/protobuf/unittest_import.proto\"\xed\x18\n\x0cTestAllTypes\x12\x16\n\x0eoptional_int32\x18\x01 \x01(\x05\x12\x16\n\x0eoptional_int64\x18\x02 \x01(\x03\x12\x17\n\x0foptional_uint32\x18\x03 \x01(\r\x12\x17\n\x0foptional_uint64\x18\x04 \x01(\x04\x12\x17\n\x0foptional_sint32\x18\x05 \x01(\x11\x12\x17\n\x0foptional_sint64\x18\x06 \x01(\x12\x12\x18\n\x10optional_fixed32\x18\x07 \x01(\x07\x12\x18\n\x10optional_fixed64\x18\x08 \x01(\x06\x12\x19\n\x11optional_sfixed32\x18\t \x01(\x0f\x12\x19\n\x11optional_sfixed64\x18\n \x01(\x10\x12\x16\n\x0eoptional_float\x18\x0b \x01(\x02\x12\x17\n\x0foptional_double\x18\x0c \x01(\x01\x12\x15\n\roptional_bool\x18\r \x01(\x08\x12\x17\n\x0foptional_string\x18\x0e \x01(\t\x12\x16\n\x0eoptional_bytes\x18\x0f \x01(\x0c\x12\x44\n\roptionalgroup\x18\x10 \x01(\n2-.protobuf_unittest.TestAllTypes.OptionalGroup\x12N\n\x17optional_nested_message\x18\x12 \x01(\x0b\x32-.protobuf_unittest.TestAllTypes.NestedMessage\x12\x43\n\x18optional_foreign_message\x18\x13 \x01(\x0b\x32!.protobuf_unittest.ForeignMessage\x12H\n\x17optional_import_message\x18\x14 \x01(\x0b\x32\'.protobuf_unittest_import.ImportMessage\x12H\n\x14optional_nested_enum\x18\x15 \x01(\x0e\x32*.protobuf_unittest.TestAllTypes.NestedEnum\x12=\n\x15optional_foreign_enum\x18\x16 \x01(\x0e\x32\x1e.protobuf_unittest.ForeignEnum\x12\x42\n\x14optional_import_enum\x18\x17 \x01(\x0e\x32$.protobuf_unittest_import.ImportEnum\x12!\n\x15optional_string_piece\x18\x18 \x01(\tB\x02\x08\x02\x12\x19\n\roptional_cord\x18\x19 \x01(\tB\x02\x08\x01\x12U\n\x1eoptional_public_import_message\x18\x1a \x01(\x0b\x32-.protobuf_unittest_import.PublicImportMessage\x12P\n\x15optional_lazy_message\x18\x1b \x01(\x0b\x32-.protobuf_unittest.TestAllTypes.NestedMessageB\x02(\x01\x12\x16\n\x0erepeated_int32\x18\x1f \x03(\x05\x12\x16\n\x0erepeated_int64\x18 \x03(\x03\x12\x17\n\x0frepeated_uint32\x18! \x03(\r\x12\x17\n\x0frepeated_uint64\x18\" \x03(\x04\x12\x17\n\x0frepeated_sint32\x18# \x03(\x11\x12\x17\n\x0frepeated_sint64\x18$ \x03(\x12\x12\x18\n\x10repeated_fixed32\x18% \x03(\x07\x12\x18\n\x10repeated_fixed64\x18& \x03(\x06\x12\x19\n\x11repeated_sfixed32\x18\' \x03(\x0f\x12\x19\n\x11repeated_sfixed64\x18( \x03(\x10\x12\x16\n\x0erepeated_float\x18) \x03(\x02\x12\x17\n\x0frepeated_double\x18* \x03(\x01\x12\x15\n\rrepeated_bool\x18+ \x03(\x08\x12\x17\n\x0frepeated_string\x18, \x03(\t\x12\x16\n\x0erepeated_bytes\x18- \x03(\x0c\x12\x44\n\rrepeatedgroup\x18. \x03(\n2-.protobuf_unittest.TestAllTypes.RepeatedGroup\x12N\n\x17repeated_nested_message\x18\x30 \x03(\x0b\x32-.protobuf_unittest.TestAllTypes.NestedMessage\x12\x43\n\x18repeated_foreign_message\x18\x31 \x03(\x0b\x32!.protobuf_unittest.ForeignMessage\x12H\n\x17repeated_import_message\x18\x32 \x03(\x0b\x32\'.protobuf_unittest_import.ImportMessage\x12H\n\x14repeated_nested_enum\x18\x33 \x03(\x0e\x32*.protobuf_unittest.TestAllTypes.NestedEnum\x12=\n\x15repeated_foreign_enum\x18\x34 \x03(\x0e\x32\x1e.protobuf_unittest.ForeignEnum\x12\x42\n\x14repeated_import_enum\x18\x35 \x03(\x0e\x32$.protobuf_unittest_import.ImportEnum\x12!\n\x15repeated_string_piece\x18\x36 \x03(\tB\x02\x08\x02\x12\x19\n\rrepeated_cord\x18\x37 \x03(\tB\x02\x08\x01\x12P\n\x15repeated_lazy_message\x18\x39 \x03(\x0b\x32-.protobuf_unittest.TestAllTypes.NestedMessageB\x02(\x01\x12\x19\n\rdefault_int32\x18= \x01(\x05:\x02\x34\x31\x12\x19\n\rdefault_int64\x18> \x01(\x03:\x02\x34\x32\x12\x1a\n\x0e\x64\x65\x66\x61ult_uint32\x18? \x01(\r:\x02\x34\x33\x12\x1a\n\x0e\x64\x65\x66\x61ult_uint64\x18@ \x01(\x04:\x02\x34\x34\x12\x1b\n\x0e\x64\x65\x66\x61ult_sint32\x18\x41 \x01(\x11:\x03-45\x12\x1a\n\x0e\x64\x65\x66\x61ult_sint64\x18\x42 \x01(\x12:\x02\x34\x36\x12\x1b\n\x0f\x64\x65\x66\x61ult_fixed32\x18\x43 \x01(\x07:\x02\x34\x37\x12\x1b\n\x0f\x64\x65\x66\x61ult_fixed64\x18\x44 \x01(\x06:\x02\x34\x38\x12\x1c\n\x10\x64\x65\x66\x61ult_sfixed32\x18\x45 \x01(\x0f:\x02\x34\x39\x12\x1d\n\x10\x64\x65\x66\x61ult_sfixed64\x18\x46 \x01(\x10:\x03-50\x12\x1b\n\rdefault_float\x18G \x01(\x02:\x04\x35\x31.5\x12\x1d\n\x0e\x64\x65\x66\x61ult_double\x18H \x01(\x01:\x05\x35\x32\x30\x30\x30\x12\x1a\n\x0c\x64\x65\x66\x61ult_bool\x18I \x01(\x08:\x04true\x12\x1d\n\x0e\x64\x65\x66\x61ult_string\x18J \x01(\t:\x05hello\x12\x1c\n\rdefault_bytes\x18K \x01(\x0c:\x05world\x12L\n\x13\x64\x65\x66\x61ult_nested_enum\x18Q \x01(\x0e\x32*.protobuf_unittest.TestAllTypes.NestedEnum:\x03\x42\x41R\x12I\n\x14\x64\x65\x66\x61ult_foreign_enum\x18R \x01(\x0e\x32\x1e.protobuf_unittest.ForeignEnum:\x0b\x46OREIGN_BAR\x12M\n\x13\x64\x65\x66\x61ult_import_enum\x18S \x01(\x0e\x32$.protobuf_unittest_import.ImportEnum:\nIMPORT_BAR\x12%\n\x14\x64\x65\x66\x61ult_string_piece\x18T \x01(\t:\x03\x61\x62\x63\x42\x02\x08\x02\x12\x1d\n\x0c\x64\x65\x66\x61ult_cord\x18U \x01(\t:\x03\x31\x32\x33\x42\x02\x08\x01\x12\x16\n\x0coneof_uint32\x18o \x01(\rH\x00\x12M\n\x14oneof_nested_message\x18p \x01(\x0b\x32-.protobuf_unittest.TestAllTypes.NestedMessageH\x00\x12\x16\n\x0coneof_string\x18q \x01(\tH\x00\x12\x15\n\x0boneof_bytes\x18r \x01(\x0cH\x00\x1a\x1b\n\rNestedMessage\x12\n\n\x02\x62\x62\x18\x01 \x01(\x05\x1a\x1a\n\rOptionalGroup\x12\t\n\x01\x61\x18\x11 \x01(\x05\x1a\x1a\n\rRepeatedGroup\x12\t\n\x01\x61\x18/ \x01(\x05\"9\n\nNestedEnum\x12\x07\n\x03\x46OO\x10\x01\x12\x07\n\x03\x42\x41R\x10\x02\x12\x07\n\x03\x42\x41Z\x10\x03\x12\x10\n\x03NEG\x10\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x42\r\n\x0boneof_field\"|\n\x12NestedTestAllTypes\x12\x34\n\x05\x63hild\x18\x01 \x01(\x0b\x32%.protobuf_unittest.NestedTestAllTypes\x12\x30\n\x07payload\x18\x02 \x01(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\"4\n\x14TestDeprecatedFields\x12\x1c\n\x10\x64\x65precated_int32\x18\x01 \x01(\x05\x42\x02\x18\x01\"\x1b\n\x0e\x46oreignMessage\x12\t\n\x01\x63\x18\x01 \x01(\x05\"\x1d\n\x11TestAllExtensions*\x08\x08\x01\x10\x80\x80\x80\x80\x02\"$\n\x17OptionalGroup_extension\x12\t\n\x01\x61\x18\x11 \x01(\x05\"$\n\x17RepeatedGroup_extension\x12\t\n\x01\x61\x18/ \x01(\x05\"\x98\x01\n\x13TestNestedExtension29\n\x04test\x12$.protobuf_unittest.TestAllExtensions\x18\xea\x07 \x01(\t:\x04test2F\n\x17nested_string_extension\x12$.protobuf_unittest.TestAllExtensions\x18\xeb\x07 \x01(\t\"\xd5\x05\n\x0cTestRequired\x12\t\n\x01\x61\x18\x01 \x02(\x05\x12\x0e\n\x06\x64ummy2\x18\x02 \x01(\x05\x12\t\n\x01\x62\x18\x03 \x02(\x05\x12\x0e\n\x06\x64ummy4\x18\x04 \x01(\x05\x12\x0e\n\x06\x64ummy5\x18\x05 \x01(\x05\x12\x0e\n\x06\x64ummy6\x18\x06 \x01(\x05\x12\x0e\n\x06\x64ummy7\x18\x07 \x01(\x05\x12\x0e\n\x06\x64ummy8\x18\x08 \x01(\x05\x12\x0e\n\x06\x64ummy9\x18\t \x01(\x05\x12\x0f\n\x07\x64ummy10\x18\n \x01(\x05\x12\x0f\n\x07\x64ummy11\x18\x0b \x01(\x05\x12\x0f\n\x07\x64ummy12\x18\x0c \x01(\x05\x12\x0f\n\x07\x64ummy13\x18\r \x01(\x05\x12\x0f\n\x07\x64ummy14\x18\x0e \x01(\x05\x12\x0f\n\x07\x64ummy15\x18\x0f \x01(\x05\x12\x0f\n\x07\x64ummy16\x18\x10 \x01(\x05\x12\x0f\n\x07\x64ummy17\x18\x11 \x01(\x05\x12\x0f\n\x07\x64ummy18\x18\x12 \x01(\x05\x12\x0f\n\x07\x64ummy19\x18\x13 \x01(\x05\x12\x0f\n\x07\x64ummy20\x18\x14 \x01(\x05\x12\x0f\n\x07\x64ummy21\x18\x15 \x01(\x05\x12\x0f\n\x07\x64ummy22\x18\x16 \x01(\x05\x12\x0f\n\x07\x64ummy23\x18\x17 \x01(\x05\x12\x0f\n\x07\x64ummy24\x18\x18 \x01(\x05\x12\x0f\n\x07\x64ummy25\x18\x19 \x01(\x05\x12\x0f\n\x07\x64ummy26\x18\x1a \x01(\x05\x12\x0f\n\x07\x64ummy27\x18\x1b \x01(\x05\x12\x0f\n\x07\x64ummy28\x18\x1c \x01(\x05\x12\x0f\n\x07\x64ummy29\x18\x1d \x01(\x05\x12\x0f\n\x07\x64ummy30\x18\x1e \x01(\x05\x12\x0f\n\x07\x64ummy31\x18\x1f \x01(\x05\x12\x0f\n\x07\x64ummy32\x18 \x01(\x05\x12\t\n\x01\x63\x18! \x02(\x05\x32V\n\x06single\x12$.protobuf_unittest.TestAllExtensions\x18\xe8\x07 \x01(\x0b\x32\x1f.protobuf_unittest.TestRequired2U\n\x05multi\x12$.protobuf_unittest.TestAllExtensions\x18\xe9\x07 \x03(\x0b\x32\x1f.protobuf_unittest.TestRequired\"\x9a\x01\n\x13TestRequiredForeign\x12\x39\n\x10optional_message\x18\x01 \x01(\x0b\x32\x1f.protobuf_unittest.TestRequired\x12\x39\n\x10repeated_message\x18\x02 \x03(\x0b\x32\x1f.protobuf_unittest.TestRequired\x12\r\n\x05\x64ummy\x18\x03 \x01(\x05\"Z\n\x11TestForeignNested\x12\x45\n\x0e\x66oreign_nested\x18\x01 \x01(\x0b\x32-.protobuf_unittest.TestAllTypes.NestedMessage\"\x12\n\x10TestEmptyMessage\"*\n\x1eTestEmptyMessageWithExtensions*\x08\x08\x01\x10\x80\x80\x80\x80\x02\"7\n\x1bTestMultipleExtensionRanges*\x04\x08*\x10+*\x06\x08\xaf \x10\x94!*\n\x08\x80\x80\x04\x10\x80\x80\x80\x80\x02\"4\n\x18TestReallyLargeTagNumber\x12\t\n\x01\x61\x18\x01 \x01(\x05\x12\r\n\x02\x62\x62\x18\xff\xff\xff\x7f \x01(\x05\"U\n\x14TestRecursiveMessage\x12\x32\n\x01\x61\x18\x01 \x01(\x0b\x32\'.protobuf_unittest.TestRecursiveMessage\x12\t\n\x01i\x18\x02 \x01(\x05\"K\n\x14TestMutualRecursionA\x12\x33\n\x02\x62\x62\x18\x01 \x01(\x0b\x32\'.protobuf_unittest.TestMutualRecursionB\"b\n\x14TestMutualRecursionB\x12\x32\n\x01\x61\x18\x01 \x01(\x0b\x32\'.protobuf_unittest.TestMutualRecursionA\x12\x16\n\x0eoptional_int32\x18\x02 \x01(\x05\"\xb3\x01\n\x12TestDupFieldNumber\x12\t\n\x01\x61\x18\x01 \x01(\x05\x12\x36\n\x03\x66oo\x18\x02 \x01(\n2).protobuf_unittest.TestDupFieldNumber.Foo\x12\x36\n\x03\x62\x61r\x18\x03 \x01(\n2).protobuf_unittest.TestDupFieldNumber.Bar\x1a\x10\n\x03\x46oo\x12\t\n\x01\x61\x18\x01 \x01(\x05\x1a\x10\n\x03\x42\x61r\x12\t\n\x01\x61\x18\x01 \x01(\x05\"L\n\x10TestEagerMessage\x12\x38\n\x0bsub_message\x18\x01 \x01(\x0b\x32\x1f.protobuf_unittest.TestAllTypesB\x02(\x00\"K\n\x0fTestLazyMessage\x12\x38\n\x0bsub_message\x18\x01 \x01(\x0b\x32\x1f.protobuf_unittest.TestAllTypesB\x02(\x01\"\x80\x02\n\x18TestNestedMessageHasBits\x12Z\n\x17optional_nested_message\x18\x01 \x01(\x0b\x32\x39.protobuf_unittest.TestNestedMessageHasBits.NestedMessage\x1a\x87\x01\n\rNestedMessage\x12$\n\x1cnestedmessage_repeated_int32\x18\x01 \x03(\x05\x12P\n%nestedmessage_repeated_foreignmessage\x18\x02 \x03(\x0b\x32!.protobuf_unittest.ForeignMessage\"\xe5\x03\n\x17TestCamelCaseFieldNames\x12\x16\n\x0ePrimitiveField\x18\x01 \x01(\x05\x12\x13\n\x0bStringField\x18\x02 \x01(\t\x12\x31\n\tEnumField\x18\x03 \x01(\x0e\x32\x1e.protobuf_unittest.ForeignEnum\x12\x37\n\x0cMessageField\x18\x04 \x01(\x0b\x32!.protobuf_unittest.ForeignMessage\x12\x1c\n\x10StringPieceField\x18\x05 \x01(\tB\x02\x08\x02\x12\x15\n\tCordField\x18\x06 \x01(\tB\x02\x08\x01\x12\x1e\n\x16RepeatedPrimitiveField\x18\x07 \x03(\x05\x12\x1b\n\x13RepeatedStringField\x18\x08 \x03(\t\x12\x39\n\x11RepeatedEnumField\x18\t \x03(\x0e\x32\x1e.protobuf_unittest.ForeignEnum\x12?\n\x14RepeatedMessageField\x18\n \x03(\x0b\x32!.protobuf_unittest.ForeignMessage\x12$\n\x18RepeatedStringPieceField\x18\x0b \x03(\tB\x02\x08\x02\x12\x1d\n\x11RepeatedCordField\x18\x0c \x03(\tB\x02\x08\x01\"U\n\x12TestFieldOrderings\x12\x11\n\tmy_string\x18\x0b \x01(\t\x12\x0e\n\x06my_int\x18\x01 \x01(\x03\x12\x10\n\x08my_float\x18\x65 \x01(\x02*\x04\x08\x02\x10\x0b*\x04\x08\x0c\x10\x65\"\xb8\x07\n\x18TestExtremeDefaultValues\x12?\n\rescaped_bytes\x18\x01 \x01(\x0c:(\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\\"\\376\x12 \n\x0clarge_uint32\x18\x02 \x01(\r:\n4294967295\x12*\n\x0clarge_uint64\x18\x03 \x01(\x04:\x14\x31\x38\x34\x34\x36\x37\x34\x34\x30\x37\x33\x37\x30\x39\x35\x35\x31\x36\x31\x35\x12 \n\x0bsmall_int32\x18\x04 \x01(\x05:\x0b-2147483647\x12)\n\x0bsmall_int64\x18\x05 \x01(\x03:\x14-9223372036854775807\x12\'\n\x12really_small_int32\x18\x15 \x01(\x05:\x0b-2147483648\x12\x30\n\x12really_small_int64\x18\x16 \x01(\x03:\x14-9223372036854775808\x12\x18\n\x0butf8_string\x18\x06 \x01(\t:\x03\xe1\x88\xb4\x12\x15\n\nzero_float\x18\x07 \x01(\x02:\x01\x30\x12\x14\n\tone_float\x18\x08 \x01(\x02:\x01\x31\x12\x18\n\x0bsmall_float\x18\t \x01(\x02:\x03\x31.5\x12\x1e\n\x12negative_one_float\x18\n \x01(\x02:\x02-1\x12\x1c\n\x0enegative_float\x18\x0b \x01(\x02:\x04-1.5\x12\x1b\n\x0blarge_float\x18\x0c \x01(\x02:\x06\x32\x65+008\x12%\n\x14small_negative_float\x18\r \x01(\x02:\x07-8e-028\x12\x17\n\ninf_double\x18\x0e \x01(\x01:\x03inf\x12\x1c\n\x0eneg_inf_double\x18\x0f \x01(\x01:\x04-inf\x12\x17\n\nnan_double\x18\x10 \x01(\x01:\x03nan\x12\x16\n\tinf_float\x18\x11 \x01(\x02:\x03inf\x12\x1b\n\rneg_inf_float\x18\x12 \x01(\x02:\x04-inf\x12\x16\n\tnan_float\x18\x13 \x01(\x02:\x03nan\x12+\n\x0c\x63pp_trigraph\x18\x14 \x01(\t:\x15? ? ?? ?? ??? ??/ ??-\x12 \n\x10string_with_zero\x18\x17 \x01(\t:\x06hel\x00lo\x12\"\n\x0f\x62ytes_with_zero\x18\x18 \x01(\x0c:\twor\\000ld\x12(\n\x16string_piece_with_zero\x18\x19 \x01(\t:\x04\x61\x62\x00\x63\x42\x02\x08\x02\x12 \n\x0e\x63ord_with_zero\x18\x1a \x01(\t:\x04\x31\x32\x00\x33\x42\x02\x08\x01\x12&\n\x12replacement_string\x18\x1b \x01(\t:\n${unknown}\"K\n\x11SparseEnumMessage\x12\x36\n\x0bsparse_enum\x18\x01 \x01(\x0e\x32!.protobuf_unittest.TestSparseEnum\"\x19\n\tOneString\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\t\"\x1a\n\nMoreString\x12\x0c\n\x04\x64\x61ta\x18\x01 \x03(\t\"\x18\n\x08OneBytes\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\x19\n\tMoreBytes\x12\x0c\n\x04\x64\x61ta\x18\x01 \x03(\x0c\"\x1c\n\x0cInt32Message\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x05\"\x1d\n\rUint32Message\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\r\"\x1c\n\x0cInt64Message\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x03\"\x1d\n\rUint64Message\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x04\"\x1b\n\x0b\x42oolMessage\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x08\"\xd0\x01\n\tTestOneof\x12\x11\n\x07\x66oo_int\x18\x01 \x01(\x05H\x00\x12\x14\n\nfoo_string\x18\x02 \x01(\tH\x00\x12\x36\n\x0b\x66oo_message\x18\x03 \x01(\x0b\x32\x1f.protobuf_unittest.TestAllTypesH\x00\x12\x39\n\x08\x66oogroup\x18\x04 \x01(\n2%.protobuf_unittest.TestOneof.FooGroupH\x00\x1a \n\x08\x46ooGroup\x12\t\n\x01\x61\x18\x05 \x01(\x05\x12\t\n\x01\x62\x18\x06 \x01(\tB\x05\n\x03\x66oo\"\xe7\x01\n\x1cTestOneofBackwardsCompatible\x12\x0f\n\x07\x66oo_int\x18\x01 \x01(\x05\x12\x12\n\nfoo_string\x18\x02 \x01(\t\x12\x34\n\x0b\x66oo_message\x18\x03 \x01(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\x12J\n\x08\x66oogroup\x18\x04 \x01(\n28.protobuf_unittest.TestOneofBackwardsCompatible.FooGroup\x1a \n\x08\x46ooGroup\x12\t\n\x01\x61\x18\x05 \x01(\x05\x12\t\n\x01\x62\x18\x06 \x01(\t\"\x9e\x06\n\nTestOneof2\x12\x11\n\x07\x66oo_int\x18\x01 \x01(\x05H\x00\x12\x14\n\nfoo_string\x18\x02 \x01(\tH\x00\x12\x16\n\x08\x66oo_cord\x18\x03 \x01(\tB\x02\x08\x01H\x00\x12\x1e\n\x10\x66oo_string_piece\x18\x04 \x01(\tB\x02\x08\x02H\x00\x12\x13\n\tfoo_bytes\x18\x05 \x01(\x0cH\x00\x12<\n\x08\x66oo_enum\x18\x06 \x01(\x0e\x32(.protobuf_unittest.TestOneof2.NestedEnumH\x00\x12\x42\n\x0b\x66oo_message\x18\x07 \x01(\x0b\x32+.protobuf_unittest.TestOneof2.NestedMessageH\x00\x12:\n\x08\x66oogroup\x18\x08 \x01(\n2&.protobuf_unittest.TestOneof2.FooGroupH\x00\x12K\n\x10\x66oo_lazy_message\x18\x0b \x01(\x0b\x32+.protobuf_unittest.TestOneof2.NestedMessageB\x02(\x01H\x00\x12\x14\n\x07\x62\x61r_int\x18\x0c \x01(\x05:\x01\x35H\x01\x12\x1c\n\nbar_string\x18\r \x01(\t:\x06STRINGH\x01\x12\x1c\n\x08\x62\x61r_cord\x18\x0e \x01(\t:\x04\x43ORDB\x02\x08\x01H\x01\x12&\n\x10\x62\x61r_string_piece\x18\x0f \x01(\t:\x06SPIECEB\x02\x08\x02H\x01\x12\x1a\n\tbar_bytes\x18\x10 \x01(\x0c:\x05\x42YTESH\x01\x12\x41\n\x08\x62\x61r_enum\x18\x11 \x01(\x0e\x32(.protobuf_unittest.TestOneof2.NestedEnum:\x03\x42\x41RH\x01\x12\x0f\n\x07\x62\x61z_int\x18\x12 \x01(\x05\x12\x17\n\nbaz_string\x18\x13 \x01(\t:\x03\x42\x41Z\x1a \n\x08\x46ooGroup\x12\t\n\x01\x61\x18\t \x01(\x05\x12\t\n\x01\x62\x18\n \x01(\t\x1a\x33\n\rNestedMessage\x12\x0f\n\x07qux_int\x18\x01 \x01(\x03\x12\x11\n\tcorge_int\x18\x02 \x03(\x05\"\'\n\nNestedEnum\x12\x07\n\x03\x46OO\x10\x01\x12\x07\n\x03\x42\x41R\x10\x02\x12\x07\n\x03\x42\x41Z\x10\x03\x42\x05\n\x03\x66ooB\x05\n\x03\x62\x61r\"\xb8\x01\n\x11TestRequiredOneof\x12\x11\n\x07\x66oo_int\x18\x01 \x01(\x05H\x00\x12\x14\n\nfoo_string\x18\x02 \x01(\tH\x00\x12I\n\x0b\x66oo_message\x18\x03 \x01(\x0b\x32\x32.protobuf_unittest.TestRequiredOneof.NestedMessageH\x00\x1a(\n\rNestedMessage\x12\x17\n\x0frequired_double\x18\x01 \x02(\x01\x42\x05\n\x03\x66oo\"\xaa\x03\n\x0fTestPackedTypes\x12\x18\n\x0cpacked_int32\x18Z \x03(\x05\x42\x02\x10\x01\x12\x18\n\x0cpacked_int64\x18[ \x03(\x03\x42\x02\x10\x01\x12\x19\n\rpacked_uint32\x18\\ \x03(\rB\x02\x10\x01\x12\x19\n\rpacked_uint64\x18] \x03(\x04\x42\x02\x10\x01\x12\x19\n\rpacked_sint32\x18^ \x03(\x11\x42\x02\x10\x01\x12\x19\n\rpacked_sint64\x18_ \x03(\x12\x42\x02\x10\x01\x12\x1a\n\x0epacked_fixed32\x18` \x03(\x07\x42\x02\x10\x01\x12\x1a\n\x0epacked_fixed64\x18\x61 \x03(\x06\x42\x02\x10\x01\x12\x1b\n\x0fpacked_sfixed32\x18\x62 \x03(\x0f\x42\x02\x10\x01\x12\x1b\n\x0fpacked_sfixed64\x18\x63 \x03(\x10\x42\x02\x10\x01\x12\x18\n\x0cpacked_float\x18\x64 \x03(\x02\x42\x02\x10\x01\x12\x19\n\rpacked_double\x18\x65 \x03(\x01\x42\x02\x10\x01\x12\x17\n\x0bpacked_bool\x18\x66 \x03(\x08\x42\x02\x10\x01\x12\x37\n\x0bpacked_enum\x18g \x03(\x0e\x32\x1e.protobuf_unittest.ForeignEnumB\x02\x10\x01\"\xc8\x03\n\x11TestUnpackedTypes\x12\x1a\n\x0eunpacked_int32\x18Z \x03(\x05\x42\x02\x10\x00\x12\x1a\n\x0eunpacked_int64\x18[ \x03(\x03\x42\x02\x10\x00\x12\x1b\n\x0funpacked_uint32\x18\\ \x03(\rB\x02\x10\x00\x12\x1b\n\x0funpacked_uint64\x18] \x03(\x04\x42\x02\x10\x00\x12\x1b\n\x0funpacked_sint32\x18^ \x03(\x11\x42\x02\x10\x00\x12\x1b\n\x0funpacked_sint64\x18_ \x03(\x12\x42\x02\x10\x00\x12\x1c\n\x10unpacked_fixed32\x18` \x03(\x07\x42\x02\x10\x00\x12\x1c\n\x10unpacked_fixed64\x18\x61 \x03(\x06\x42\x02\x10\x00\x12\x1d\n\x11unpacked_sfixed32\x18\x62 \x03(\x0f\x42\x02\x10\x00\x12\x1d\n\x11unpacked_sfixed64\x18\x63 \x03(\x10\x42\x02\x10\x00\x12\x1a\n\x0eunpacked_float\x18\x64 \x03(\x02\x42\x02\x10\x00\x12\x1b\n\x0funpacked_double\x18\x65 \x03(\x01\x42\x02\x10\x00\x12\x19\n\runpacked_bool\x18\x66 \x03(\x08\x42\x02\x10\x00\x12\x39\n\runpacked_enum\x18g \x03(\x0e\x32\x1e.protobuf_unittest.ForeignEnumB\x02\x10\x00\" \n\x14TestPackedExtensions*\x08\x08\x01\x10\x80\x80\x80\x80\x02\"\"\n\x16TestUnpackedExtensions*\x08\x08\x01\x10\x80\x80\x80\x80\x02\"\x99\x04\n\x15TestDynamicExtensions\x12\x19\n\x10scalar_extension\x18\xd0\x0f \x01(\x07\x12\x37\n\x0e\x65num_extension\x18\xd1\x0f \x01(\x0e\x32\x1e.protobuf_unittest.ForeignEnum\x12Y\n\x16\x64ynamic_enum_extension\x18\xd2\x0f \x01(\x0e\x32\x38.protobuf_unittest.TestDynamicExtensions.DynamicEnumType\x12=\n\x11message_extension\x18\xd3\x0f \x01(\x0b\x32!.protobuf_unittest.ForeignMessage\x12_\n\x19\x64ynamic_message_extension\x18\xd4\x0f \x01(\x0b\x32;.protobuf_unittest.TestDynamicExtensions.DynamicMessageType\x12\x1b\n\x12repeated_extension\x18\xd5\x0f \x03(\t\x12\x1d\n\x10packed_extension\x18\xd6\x0f \x03(\x11\x42\x02\x10\x01\x1a,\n\x12\x44ynamicMessageType\x12\x16\n\rdynamic_field\x18\xb4\x10 \x01(\x05\"G\n\x0f\x44ynamicEnumType\x12\x10\n\x0b\x44YNAMIC_FOO\x10\x98\x11\x12\x10\n\x0b\x44YNAMIC_BAR\x10\x99\x11\x12\x10\n\x0b\x44YNAMIC_BAZ\x10\x9a\x11\"\xc0\x01\n#TestRepeatedScalarDifferentTagSizes\x12\x18\n\x10repeated_fixed32\x18\x0c \x03(\x07\x12\x16\n\x0erepeated_int32\x18\r \x03(\x05\x12\x19\n\x10repeated_fixed64\x18\xfe\x0f \x03(\x06\x12\x17\n\x0erepeated_int64\x18\xff\x0f \x03(\x03\x12\x18\n\x0erepeated_float\x18\xfe\xff\x0f \x03(\x02\x12\x19\n\x0frepeated_uint64\x18\xff\xff\x0f \x03(\x04\"\xf7\t\n\x10TestParsingMerge\x12;\n\x12required_all_types\x18\x01 \x02(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\x12;\n\x12optional_all_types\x18\x02 \x01(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\x12;\n\x12repeated_all_types\x18\x03 \x03(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\x12H\n\roptionalgroup\x18\n \x01(\n21.protobuf_unittest.TestParsingMerge.OptionalGroup\x12H\n\rrepeatedgroup\x18\x14 \x03(\n21.protobuf_unittest.TestParsingMerge.RepeatedGroup\x1a\xaa\x04\n\x17RepeatedFieldsGenerator\x12/\n\x06\x66ield1\x18\x01 \x03(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\x12/\n\x06\x66ield2\x18\x02 \x03(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\x12/\n\x06\x66ield3\x18\x03 \x03(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\x12R\n\x06group1\x18\n \x03(\n2B.protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.Group1\x12R\n\x06group2\x18\x14 \x03(\n2B.protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.Group2\x12.\n\x04\x65xt1\x18\xe8\x07 \x03(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\x12.\n\x04\x65xt2\x18\xe9\x07 \x03(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\x1a\x39\n\x06Group1\x12/\n\x06\x66ield1\x18\x0b \x01(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\x1a\x39\n\x06Group2\x12/\n\x06\x66ield1\x18\x15 \x01(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\x1aR\n\rOptionalGroup\x12\x41\n\x18optional_group_all_types\x18\x0b \x01(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\x1aR\n\rRepeatedGroup\x12\x41\n\x18repeated_group_all_types\x18\x15 \x01(\x0b\x32\x1f.protobuf_unittest.TestAllTypes*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\x32[\n\x0coptional_ext\x12#.protobuf_unittest.TestParsingMerge\x18\xe8\x07 \x01(\x0b\x32\x1f.protobuf_unittest.TestAllTypes2[\n\x0crepeated_ext\x12#.protobuf_unittest.TestParsingMerge\x18\xe9\x07 \x03(\x0b\x32\x1f.protobuf_unittest.TestAllTypes\"D\n\x1bTestCommentInjectionMessage\x12%\n\x01\x61\x18\x01 \x01(\t:\x1a*/ <- Neither should this.\"\x0c\n\nFooRequest\"\r\n\x0b\x46ooResponse\"\x12\n\x10\x46ooClientMessage\"\x12\n\x10\x46ooServerMessage\"\x0c\n\nBarRequest\"\r\n\x0b\x42\x61rResponse*@\n\x0b\x46oreignEnum\x12\x0f\n\x0b\x46OREIGN_FOO\x10\x04\x12\x0f\n\x0b\x46OREIGN_BAR\x10\x05\x12\x0f\n\x0b\x46OREIGN_BAZ\x10\x06*K\n\x14TestEnumWithDupValue\x12\x08\n\x04\x46OO1\x10\x01\x12\x08\n\x04\x42\x41R1\x10\x02\x12\x07\n\x03\x42\x41Z\x10\x03\x12\x08\n\x04\x46OO2\x10\x01\x12\x08\n\x04\x42\x41R2\x10\x02\x1a\x02\x10\x01*\x89\x01\n\x0eTestSparseEnum\x12\x0c\n\x08SPARSE_A\x10{\x12\x0e\n\x08SPARSE_B\x10\xa6\xe7\x03\x12\x0f\n\x08SPARSE_C\x10\xb2\xb1\x80\x06\x12\x15\n\x08SPARSE_D\x10\xf1\xff\xff\xff\xff\xff\xff\xff\xff\x01\x12\x15\n\x08SPARSE_E\x10\xb4\xde\xfc\xff\xff\xff\xff\xff\xff\x01\x12\x0c\n\x08SPARSE_F\x10\x00\x12\x0c\n\x08SPARSE_G\x10\x02\x32\x99\x01\n\x0bTestService\x12\x44\n\x03\x46oo\x12\x1d.protobuf_unittest.FooRequest\x1a\x1e.protobuf_unittest.FooResponse\x12\x44\n\x03\x42\x61r\x12\x1d.protobuf_unittest.BarRequest\x1a\x1e.protobuf_unittest.BarResponse:F\n\x18optional_int32_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x01 \x01(\x05:F\n\x18optional_int64_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x02 \x01(\x03:G\n\x19optional_uint32_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x03 \x01(\r:G\n\x19optional_uint64_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x04 \x01(\x04:G\n\x19optional_sint32_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x05 \x01(\x11:G\n\x19optional_sint64_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x06 \x01(\x12:H\n\x1aoptional_fixed32_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x07 \x01(\x07:H\n\x1aoptional_fixed64_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x08 \x01(\x06:I\n\x1boptional_sfixed32_extension\x12$.protobuf_unittest.TestAllExtensions\x18\t \x01(\x0f:I\n\x1boptional_sfixed64_extension\x12$.protobuf_unittest.TestAllExtensions\x18\n \x01(\x10:F\n\x18optional_float_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x0b \x01(\x02:G\n\x19optional_double_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x0c \x01(\x01:E\n\x17optional_bool_extension\x12$.protobuf_unittest.TestAllExtensions\x18\r \x01(\x08:G\n\x19optional_string_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x0e \x01(\t:F\n\x18optional_bytes_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x0f \x01(\x0c:q\n\x17optionalgroup_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x10 \x01(\n2*.protobuf_unittest.OptionalGroup_extension:~\n!optional_nested_message_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x12 \x01(\x0b\x32-.protobuf_unittest.TestAllTypes.NestedMessage:s\n\"optional_foreign_message_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x13 \x01(\x0b\x32!.protobuf_unittest.ForeignMessage:x\n!optional_import_message_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x14 \x01(\x0b\x32\'.protobuf_unittest_import.ImportMessage:x\n\x1eoptional_nested_enum_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x15 \x01(\x0e\x32*.protobuf_unittest.TestAllTypes.NestedEnum:m\n\x1foptional_foreign_enum_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x16 \x01(\x0e\x32\x1e.protobuf_unittest.ForeignEnum:r\n\x1eoptional_import_enum_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x17 \x01(\x0e\x32$.protobuf_unittest_import.ImportEnum:Q\n\x1foptional_string_piece_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x18 \x01(\tB\x02\x08\x02:I\n\x17optional_cord_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x19 \x01(\tB\x02\x08\x01:\x85\x01\n(optional_public_import_message_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x1a \x01(\x0b\x32-.protobuf_unittest_import.PublicImportMessage:\x80\x01\n\x1foptional_lazy_message_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x1b \x01(\x0b\x32-.protobuf_unittest.TestAllTypes.NestedMessageB\x02(\x01:F\n\x18repeated_int32_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x1f \x03(\x05:F\n\x18repeated_int64_extension\x12$.protobuf_unittest.TestAllExtensions\x18 \x03(\x03:G\n\x19repeated_uint32_extension\x12$.protobuf_unittest.TestAllExtensions\x18! \x03(\r:G\n\x19repeated_uint64_extension\x12$.protobuf_unittest.TestAllExtensions\x18\" \x03(\x04:G\n\x19repeated_sint32_extension\x12$.protobuf_unittest.TestAllExtensions\x18# \x03(\x11:G\n\x19repeated_sint64_extension\x12$.protobuf_unittest.TestAllExtensions\x18$ \x03(\x12:H\n\x1arepeated_fixed32_extension\x12$.protobuf_unittest.TestAllExtensions\x18% \x03(\x07:H\n\x1arepeated_fixed64_extension\x12$.protobuf_unittest.TestAllExtensions\x18& \x03(\x06:I\n\x1brepeated_sfixed32_extension\x12$.protobuf_unittest.TestAllExtensions\x18\' \x03(\x0f:I\n\x1brepeated_sfixed64_extension\x12$.protobuf_unittest.TestAllExtensions\x18( \x03(\x10:F\n\x18repeated_float_extension\x12$.protobuf_unittest.TestAllExtensions\x18) \x03(\x02:G\n\x19repeated_double_extension\x12$.protobuf_unittest.TestAllExtensions\x18* \x03(\x01:E\n\x17repeated_bool_extension\x12$.protobuf_unittest.TestAllExtensions\x18+ \x03(\x08:G\n\x19repeated_string_extension\x12$.protobuf_unittest.TestAllExtensions\x18, \x03(\t:F\n\x18repeated_bytes_extension\x12$.protobuf_unittest.TestAllExtensions\x18- \x03(\x0c:q\n\x17repeatedgroup_extension\x12$.protobuf_unittest.TestAllExtensions\x18. \x03(\n2*.protobuf_unittest.RepeatedGroup_extension:~\n!repeated_nested_message_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x30 \x03(\x0b\x32-.protobuf_unittest.TestAllTypes.NestedMessage:s\n\"repeated_foreign_message_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x31 \x03(\x0b\x32!.protobuf_unittest.ForeignMessage:x\n!repeated_import_message_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x32 \x03(\x0b\x32\'.protobuf_unittest_import.ImportMessage:x\n\x1erepeated_nested_enum_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x33 \x03(\x0e\x32*.protobuf_unittest.TestAllTypes.NestedEnum:m\n\x1frepeated_foreign_enum_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x34 \x03(\x0e\x32\x1e.protobuf_unittest.ForeignEnum:r\n\x1erepeated_import_enum_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x35 \x03(\x0e\x32$.protobuf_unittest_import.ImportEnum:Q\n\x1frepeated_string_piece_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x36 \x03(\tB\x02\x08\x02:I\n\x17repeated_cord_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x37 \x03(\tB\x02\x08\x01:\x80\x01\n\x1frepeated_lazy_message_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x39 \x03(\x0b\x32-.protobuf_unittest.TestAllTypes.NestedMessageB\x02(\x01:I\n\x17\x64\x65\x66\x61ult_int32_extension\x12$.protobuf_unittest.TestAllExtensions\x18= \x01(\x05:\x02\x34\x31:I\n\x17\x64\x65\x66\x61ult_int64_extension\x12$.protobuf_unittest.TestAllExtensions\x18> \x01(\x03:\x02\x34\x32:J\n\x18\x64\x65\x66\x61ult_uint32_extension\x12$.protobuf_unittest.TestAllExtensions\x18? \x01(\r:\x02\x34\x33:J\n\x18\x64\x65\x66\x61ult_uint64_extension\x12$.protobuf_unittest.TestAllExtensions\x18@ \x01(\x04:\x02\x34\x34:K\n\x18\x64\x65\x66\x61ult_sint32_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x41 \x01(\x11:\x03-45:J\n\x18\x64\x65\x66\x61ult_sint64_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x42 \x01(\x12:\x02\x34\x36:K\n\x19\x64\x65\x66\x61ult_fixed32_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x43 \x01(\x07:\x02\x34\x37:K\n\x19\x64\x65\x66\x61ult_fixed64_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x44 \x01(\x06:\x02\x34\x38:L\n\x1a\x64\x65\x66\x61ult_sfixed32_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x45 \x01(\x0f:\x02\x34\x39:M\n\x1a\x64\x65\x66\x61ult_sfixed64_extension\x12$.protobuf_unittest.TestAllExtensions\x18\x46 \x01(\x10:\x03-50:K\n\x17\x64\x65\x66\x61ult_float_extension\x12$.protobuf_unittest.TestAllExtensions\x18G \x01(\x02:\x04\x35\x31.5:M\n\x18\x64\x65\x66\x61ult_double_extension\x12$.protobuf_unittest.TestAllExtensions\x18H \x01(\x01:\x05\x35\x32\x30\x30\x30:J\n\x16\x64\x65\x66\x61ult_bool_extension\x12$.protobuf_unittest.TestAllExtensions\x18I \x01(\x08:\x04true:M\n\x18\x64\x65\x66\x61ult_string_extension\x12$.protobuf_unittest.TestAllExtensions\x18J \x01(\t:\x05hello:L\n\x17\x64\x65\x66\x61ult_bytes_extension\x12$.protobuf_unittest.TestAllExtensions\x18K \x01(\x0c:\x05world:|\n\x1d\x64\x65\x66\x61ult_nested_enum_extension\x12$.protobuf_unittest.TestAllExtensions\x18Q \x01(\x0e\x32*.protobuf_unittest.TestAllTypes.NestedEnum:\x03\x42\x41R:y\n\x1e\x64\x65\x66\x61ult_foreign_enum_extension\x12$.protobuf_unittest.TestAllExtensions\x18R \x01(\x0e\x32\x1e.protobuf_unittest.ForeignEnum:\x0b\x46OREIGN_BAR:}\n\x1d\x64\x65\x66\x61ult_import_enum_extension\x12$.protobuf_unittest.TestAllExtensions\x18S \x01(\x0e\x32$.protobuf_unittest_import.ImportEnum:\nIMPORT_BAR:U\n\x1e\x64\x65\x66\x61ult_string_piece_extension\x12$.protobuf_unittest.TestAllExtensions\x18T \x01(\t:\x03\x61\x62\x63\x42\x02\x08\x02:M\n\x16\x64\x65\x66\x61ult_cord_extension\x12$.protobuf_unittest.TestAllExtensions\x18U \x01(\t:\x03\x31\x32\x33\x42\x02\x08\x01:D\n\x16oneof_uint32_extension\x12$.protobuf_unittest.TestAllExtensions\x18o \x01(\r:{\n\x1eoneof_nested_message_extension\x12$.protobuf_unittest.TestAllExtensions\x18p \x01(\x0b\x32-.protobuf_unittest.TestAllTypes.NestedMessage:D\n\x16oneof_string_extension\x12$.protobuf_unittest.TestAllExtensions\x18q \x01(\t:C\n\x15oneof_bytes_extension\x12$.protobuf_unittest.TestAllExtensions\x18r \x01(\x0c:B\n\x13my_extension_string\x12%.protobuf_unittest.TestFieldOrderings\x18\x32 \x01(\t:?\n\x10my_extension_int\x12%.protobuf_unittest.TestFieldOrderings\x18\x05 \x01(\x05:K\n\x16packed_int32_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18Z \x03(\x05\x42\x02\x10\x01:K\n\x16packed_int64_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18[ \x03(\x03\x42\x02\x10\x01:L\n\x17packed_uint32_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18\\ \x03(\rB\x02\x10\x01:L\n\x17packed_uint64_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18] \x03(\x04\x42\x02\x10\x01:L\n\x17packed_sint32_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18^ \x03(\x11\x42\x02\x10\x01:L\n\x17packed_sint64_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18_ \x03(\x12\x42\x02\x10\x01:M\n\x18packed_fixed32_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18` \x03(\x07\x42\x02\x10\x01:M\n\x18packed_fixed64_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18\x61 \x03(\x06\x42\x02\x10\x01:N\n\x19packed_sfixed32_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18\x62 \x03(\x0f\x42\x02\x10\x01:N\n\x19packed_sfixed64_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18\x63 \x03(\x10\x42\x02\x10\x01:K\n\x16packed_float_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18\x64 \x03(\x02\x42\x02\x10\x01:L\n\x17packed_double_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18\x65 \x03(\x01\x42\x02\x10\x01:J\n\x15packed_bool_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18\x66 \x03(\x08\x42\x02\x10\x01:j\n\x15packed_enum_extension\x12\'.protobuf_unittest.TestPackedExtensions\x18g \x03(\x0e\x32\x1e.protobuf_unittest.ForeignEnumB\x02\x10\x01:O\n\x18unpacked_int32_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18Z \x03(\x05\x42\x02\x10\x00:O\n\x18unpacked_int64_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18[ \x03(\x03\x42\x02\x10\x00:P\n\x19unpacked_uint32_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18\\ \x03(\rB\x02\x10\x00:P\n\x19unpacked_uint64_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18] \x03(\x04\x42\x02\x10\x00:P\n\x19unpacked_sint32_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18^ \x03(\x11\x42\x02\x10\x00:P\n\x19unpacked_sint64_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18_ \x03(\x12\x42\x02\x10\x00:Q\n\x1aunpacked_fixed32_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18` \x03(\x07\x42\x02\x10\x00:Q\n\x1aunpacked_fixed64_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18\x61 \x03(\x06\x42\x02\x10\x00:R\n\x1bunpacked_sfixed32_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18\x62 \x03(\x0f\x42\x02\x10\x00:R\n\x1bunpacked_sfixed64_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18\x63 \x03(\x10\x42\x02\x10\x00:O\n\x18unpacked_float_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18\x64 \x03(\x02\x42\x02\x10\x00:P\n\x19unpacked_double_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18\x65 \x03(\x01\x42\x02\x10\x00:N\n\x17unpacked_bool_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18\x66 \x03(\x08\x42\x02\x10\x00:n\n\x17unpacked_enum_extension\x12).protobuf_unittest.TestUnpackedExtensions\x18g \x03(\x0e\x32\x1e.protobuf_unittest.ForeignEnumB\x02\x10\x00\x42\x1a\x42\rUnittestProtoH\x01\x80\x01\x01\x88\x01\x01\x90\x01\x01') + , + dependencies=[google.protobuf.unittest_import_pb2.DESCRIPTOR,]) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +_FOREIGNENUM = _descriptor.EnumDescriptor( + name='ForeignEnum', + full_name='protobuf_unittest.ForeignEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='FOREIGN_FOO', index=0, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='FOREIGN_BAR', index=1, number=5, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='FOREIGN_BAZ', index=2, number=6, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=12193, + serialized_end=12257, +) +_sym_db.RegisterEnumDescriptor(_FOREIGNENUM) + +ForeignEnum = enum_type_wrapper.EnumTypeWrapper(_FOREIGNENUM) +_TESTENUMWITHDUPVALUE = _descriptor.EnumDescriptor( + name='TestEnumWithDupValue', + full_name='protobuf_unittest.TestEnumWithDupValue', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='FOO1', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BAR1', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BAZ', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='FOO2', index=3, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BAR2', index=4, number=2, + options=None, + type=None), + ], + containing_type=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumOptions(), _b('\020\001')), + serialized_start=12259, + serialized_end=12334, +) +_sym_db.RegisterEnumDescriptor(_TESTENUMWITHDUPVALUE) + +TestEnumWithDupValue = enum_type_wrapper.EnumTypeWrapper(_TESTENUMWITHDUPVALUE) +_TESTSPARSEENUM = _descriptor.EnumDescriptor( + name='TestSparseEnum', + full_name='protobuf_unittest.TestSparseEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SPARSE_A', index=0, number=123, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SPARSE_B', index=1, number=62374, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SPARSE_C', index=2, number=12589234, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SPARSE_D', index=3, number=-15, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SPARSE_E', index=4, number=-53452, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SPARSE_F', index=5, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SPARSE_G', index=6, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=12337, + serialized_end=12474, +) +_sym_db.RegisterEnumDescriptor(_TESTSPARSEENUM) + +TestSparseEnum = enum_type_wrapper.EnumTypeWrapper(_TESTSPARSEENUM) +FOREIGN_FOO = 4 +FOREIGN_BAR = 5 +FOREIGN_BAZ = 6 +FOO1 = 1 +BAR1 = 2 +BAZ = 3 +FOO2 = 1 +BAR2 = 2 +SPARSE_A = 123 +SPARSE_B = 62374 +SPARSE_C = 12589234 +SPARSE_D = -15 +SPARSE_E = -53452 +SPARSE_F = 0 +SPARSE_G = 2 + +OPTIONAL_INT32_EXTENSION_FIELD_NUMBER = 1 +optional_int32_extension = _descriptor.FieldDescriptor( + name='optional_int32_extension', full_name='protobuf_unittest.optional_int32_extension', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_INT64_EXTENSION_FIELD_NUMBER = 2 +optional_int64_extension = _descriptor.FieldDescriptor( + name='optional_int64_extension', full_name='protobuf_unittest.optional_int64_extension', index=1, + number=2, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_UINT32_EXTENSION_FIELD_NUMBER = 3 +optional_uint32_extension = _descriptor.FieldDescriptor( + name='optional_uint32_extension', full_name='protobuf_unittest.optional_uint32_extension', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_UINT64_EXTENSION_FIELD_NUMBER = 4 +optional_uint64_extension = _descriptor.FieldDescriptor( + name='optional_uint64_extension', full_name='protobuf_unittest.optional_uint64_extension', index=3, + number=4, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_SINT32_EXTENSION_FIELD_NUMBER = 5 +optional_sint32_extension = _descriptor.FieldDescriptor( + name='optional_sint32_extension', full_name='protobuf_unittest.optional_sint32_extension', index=4, + number=5, type=17, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_SINT64_EXTENSION_FIELD_NUMBER = 6 +optional_sint64_extension = _descriptor.FieldDescriptor( + name='optional_sint64_extension', full_name='protobuf_unittest.optional_sint64_extension', index=5, + number=6, type=18, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_FIXED32_EXTENSION_FIELD_NUMBER = 7 +optional_fixed32_extension = _descriptor.FieldDescriptor( + name='optional_fixed32_extension', full_name='protobuf_unittest.optional_fixed32_extension', index=6, + number=7, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_FIXED64_EXTENSION_FIELD_NUMBER = 8 +optional_fixed64_extension = _descriptor.FieldDescriptor( + name='optional_fixed64_extension', full_name='protobuf_unittest.optional_fixed64_extension', index=7, + number=8, type=6, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_SFIXED32_EXTENSION_FIELD_NUMBER = 9 +optional_sfixed32_extension = _descriptor.FieldDescriptor( + name='optional_sfixed32_extension', full_name='protobuf_unittest.optional_sfixed32_extension', index=8, + number=9, type=15, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_SFIXED64_EXTENSION_FIELD_NUMBER = 10 +optional_sfixed64_extension = _descriptor.FieldDescriptor( + name='optional_sfixed64_extension', full_name='protobuf_unittest.optional_sfixed64_extension', index=9, + number=10, type=16, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_FLOAT_EXTENSION_FIELD_NUMBER = 11 +optional_float_extension = _descriptor.FieldDescriptor( + name='optional_float_extension', full_name='protobuf_unittest.optional_float_extension', index=10, + number=11, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_DOUBLE_EXTENSION_FIELD_NUMBER = 12 +optional_double_extension = _descriptor.FieldDescriptor( + name='optional_double_extension', full_name='protobuf_unittest.optional_double_extension', index=11, + number=12, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_BOOL_EXTENSION_FIELD_NUMBER = 13 +optional_bool_extension = _descriptor.FieldDescriptor( + name='optional_bool_extension', full_name='protobuf_unittest.optional_bool_extension', index=12, + number=13, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_STRING_EXTENSION_FIELD_NUMBER = 14 +optional_string_extension = _descriptor.FieldDescriptor( + name='optional_string_extension', full_name='protobuf_unittest.optional_string_extension', index=13, + number=14, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_BYTES_EXTENSION_FIELD_NUMBER = 15 +optional_bytes_extension = _descriptor.FieldDescriptor( + name='optional_bytes_extension', full_name='protobuf_unittest.optional_bytes_extension', index=14, + number=15, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONALGROUP_EXTENSION_FIELD_NUMBER = 16 +optionalgroup_extension = _descriptor.FieldDescriptor( + name='optionalgroup_extension', full_name='protobuf_unittest.optionalgroup_extension', index=15, + number=16, type=10, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER = 18 +optional_nested_message_extension = _descriptor.FieldDescriptor( + name='optional_nested_message_extension', full_name='protobuf_unittest.optional_nested_message_extension', index=16, + number=18, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_FOREIGN_MESSAGE_EXTENSION_FIELD_NUMBER = 19 +optional_foreign_message_extension = _descriptor.FieldDescriptor( + name='optional_foreign_message_extension', full_name='protobuf_unittest.optional_foreign_message_extension', index=17, + number=19, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_IMPORT_MESSAGE_EXTENSION_FIELD_NUMBER = 20 +optional_import_message_extension = _descriptor.FieldDescriptor( + name='optional_import_message_extension', full_name='protobuf_unittest.optional_import_message_extension', index=18, + number=20, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER = 21 +optional_nested_enum_extension = _descriptor.FieldDescriptor( + name='optional_nested_enum_extension', full_name='protobuf_unittest.optional_nested_enum_extension', index=19, + number=21, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_FOREIGN_ENUM_EXTENSION_FIELD_NUMBER = 22 +optional_foreign_enum_extension = _descriptor.FieldDescriptor( + name='optional_foreign_enum_extension', full_name='protobuf_unittest.optional_foreign_enum_extension', index=20, + number=22, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=4, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_IMPORT_ENUM_EXTENSION_FIELD_NUMBER = 23 +optional_import_enum_extension = _descriptor.FieldDescriptor( + name='optional_import_enum_extension', full_name='protobuf_unittest.optional_import_enum_extension', index=21, + number=23, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=7, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_STRING_PIECE_EXTENSION_FIELD_NUMBER = 24 +optional_string_piece_extension = _descriptor.FieldDescriptor( + name='optional_string_piece_extension', full_name='protobuf_unittest.optional_string_piece_extension', index=22, + number=24, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002'))) +OPTIONAL_CORD_EXTENSION_FIELD_NUMBER = 25 +optional_cord_extension = _descriptor.FieldDescriptor( + name='optional_cord_extension', full_name='protobuf_unittest.optional_cord_extension', index=23, + number=25, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001'))) +OPTIONAL_PUBLIC_IMPORT_MESSAGE_EXTENSION_FIELD_NUMBER = 26 +optional_public_import_message_extension = _descriptor.FieldDescriptor( + name='optional_public_import_message_extension', full_name='protobuf_unittest.optional_public_import_message_extension', index=24, + number=26, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +OPTIONAL_LAZY_MESSAGE_EXTENSION_FIELD_NUMBER = 27 +optional_lazy_message_extension = _descriptor.FieldDescriptor( + name='optional_lazy_message_extension', full_name='protobuf_unittest.optional_lazy_message_extension', index=25, + number=27, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\001'))) +REPEATED_INT32_EXTENSION_FIELD_NUMBER = 31 +repeated_int32_extension = _descriptor.FieldDescriptor( + name='repeated_int32_extension', full_name='protobuf_unittest.repeated_int32_extension', index=26, + number=31, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_INT64_EXTENSION_FIELD_NUMBER = 32 +repeated_int64_extension = _descriptor.FieldDescriptor( + name='repeated_int64_extension', full_name='protobuf_unittest.repeated_int64_extension', index=27, + number=32, type=3, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_UINT32_EXTENSION_FIELD_NUMBER = 33 +repeated_uint32_extension = _descriptor.FieldDescriptor( + name='repeated_uint32_extension', full_name='protobuf_unittest.repeated_uint32_extension', index=28, + number=33, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_UINT64_EXTENSION_FIELD_NUMBER = 34 +repeated_uint64_extension = _descriptor.FieldDescriptor( + name='repeated_uint64_extension', full_name='protobuf_unittest.repeated_uint64_extension', index=29, + number=34, type=4, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_SINT32_EXTENSION_FIELD_NUMBER = 35 +repeated_sint32_extension = _descriptor.FieldDescriptor( + name='repeated_sint32_extension', full_name='protobuf_unittest.repeated_sint32_extension', index=30, + number=35, type=17, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_SINT64_EXTENSION_FIELD_NUMBER = 36 +repeated_sint64_extension = _descriptor.FieldDescriptor( + name='repeated_sint64_extension', full_name='protobuf_unittest.repeated_sint64_extension', index=31, + number=36, type=18, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_FIXED32_EXTENSION_FIELD_NUMBER = 37 +repeated_fixed32_extension = _descriptor.FieldDescriptor( + name='repeated_fixed32_extension', full_name='protobuf_unittest.repeated_fixed32_extension', index=32, + number=37, type=7, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_FIXED64_EXTENSION_FIELD_NUMBER = 38 +repeated_fixed64_extension = _descriptor.FieldDescriptor( + name='repeated_fixed64_extension', full_name='protobuf_unittest.repeated_fixed64_extension', index=33, + number=38, type=6, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_SFIXED32_EXTENSION_FIELD_NUMBER = 39 +repeated_sfixed32_extension = _descriptor.FieldDescriptor( + name='repeated_sfixed32_extension', full_name='protobuf_unittest.repeated_sfixed32_extension', index=34, + number=39, type=15, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_SFIXED64_EXTENSION_FIELD_NUMBER = 40 +repeated_sfixed64_extension = _descriptor.FieldDescriptor( + name='repeated_sfixed64_extension', full_name='protobuf_unittest.repeated_sfixed64_extension', index=35, + number=40, type=16, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_FLOAT_EXTENSION_FIELD_NUMBER = 41 +repeated_float_extension = _descriptor.FieldDescriptor( + name='repeated_float_extension', full_name='protobuf_unittest.repeated_float_extension', index=36, + number=41, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_DOUBLE_EXTENSION_FIELD_NUMBER = 42 +repeated_double_extension = _descriptor.FieldDescriptor( + name='repeated_double_extension', full_name='protobuf_unittest.repeated_double_extension', index=37, + number=42, type=1, cpp_type=5, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_BOOL_EXTENSION_FIELD_NUMBER = 43 +repeated_bool_extension = _descriptor.FieldDescriptor( + name='repeated_bool_extension', full_name='protobuf_unittest.repeated_bool_extension', index=38, + number=43, type=8, cpp_type=7, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_STRING_EXTENSION_FIELD_NUMBER = 44 +repeated_string_extension = _descriptor.FieldDescriptor( + name='repeated_string_extension', full_name='protobuf_unittest.repeated_string_extension', index=39, + number=44, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_BYTES_EXTENSION_FIELD_NUMBER = 45 +repeated_bytes_extension = _descriptor.FieldDescriptor( + name='repeated_bytes_extension', full_name='protobuf_unittest.repeated_bytes_extension', index=40, + number=45, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATEDGROUP_EXTENSION_FIELD_NUMBER = 46 +repeatedgroup_extension = _descriptor.FieldDescriptor( + name='repeatedgroup_extension', full_name='protobuf_unittest.repeatedgroup_extension', index=41, + number=46, type=10, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER = 48 +repeated_nested_message_extension = _descriptor.FieldDescriptor( + name='repeated_nested_message_extension', full_name='protobuf_unittest.repeated_nested_message_extension', index=42, + number=48, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_FOREIGN_MESSAGE_EXTENSION_FIELD_NUMBER = 49 +repeated_foreign_message_extension = _descriptor.FieldDescriptor( + name='repeated_foreign_message_extension', full_name='protobuf_unittest.repeated_foreign_message_extension', index=43, + number=49, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_IMPORT_MESSAGE_EXTENSION_FIELD_NUMBER = 50 +repeated_import_message_extension = _descriptor.FieldDescriptor( + name='repeated_import_message_extension', full_name='protobuf_unittest.repeated_import_message_extension', index=44, + number=50, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER = 51 +repeated_nested_enum_extension = _descriptor.FieldDescriptor( + name='repeated_nested_enum_extension', full_name='protobuf_unittest.repeated_nested_enum_extension', index=45, + number=51, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_FOREIGN_ENUM_EXTENSION_FIELD_NUMBER = 52 +repeated_foreign_enum_extension = _descriptor.FieldDescriptor( + name='repeated_foreign_enum_extension', full_name='protobuf_unittest.repeated_foreign_enum_extension', index=46, + number=52, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_IMPORT_ENUM_EXTENSION_FIELD_NUMBER = 53 +repeated_import_enum_extension = _descriptor.FieldDescriptor( + name='repeated_import_enum_extension', full_name='protobuf_unittest.repeated_import_enum_extension', index=47, + number=53, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +REPEATED_STRING_PIECE_EXTENSION_FIELD_NUMBER = 54 +repeated_string_piece_extension = _descriptor.FieldDescriptor( + name='repeated_string_piece_extension', full_name='protobuf_unittest.repeated_string_piece_extension', index=48, + number=54, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002'))) +REPEATED_CORD_EXTENSION_FIELD_NUMBER = 55 +repeated_cord_extension = _descriptor.FieldDescriptor( + name='repeated_cord_extension', full_name='protobuf_unittest.repeated_cord_extension', index=49, + number=55, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001'))) +REPEATED_LAZY_MESSAGE_EXTENSION_FIELD_NUMBER = 57 +repeated_lazy_message_extension = _descriptor.FieldDescriptor( + name='repeated_lazy_message_extension', full_name='protobuf_unittest.repeated_lazy_message_extension', index=50, + number=57, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\001'))) +DEFAULT_INT32_EXTENSION_FIELD_NUMBER = 61 +default_int32_extension = _descriptor.FieldDescriptor( + name='default_int32_extension', full_name='protobuf_unittest.default_int32_extension', index=51, + number=61, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=41, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_INT64_EXTENSION_FIELD_NUMBER = 62 +default_int64_extension = _descriptor.FieldDescriptor( + name='default_int64_extension', full_name='protobuf_unittest.default_int64_extension', index=52, + number=62, type=3, cpp_type=2, label=1, + has_default_value=True, default_value=42, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_UINT32_EXTENSION_FIELD_NUMBER = 63 +default_uint32_extension = _descriptor.FieldDescriptor( + name='default_uint32_extension', full_name='protobuf_unittest.default_uint32_extension', index=53, + number=63, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=43, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_UINT64_EXTENSION_FIELD_NUMBER = 64 +default_uint64_extension = _descriptor.FieldDescriptor( + name='default_uint64_extension', full_name='protobuf_unittest.default_uint64_extension', index=54, + number=64, type=4, cpp_type=4, label=1, + has_default_value=True, default_value=44, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_SINT32_EXTENSION_FIELD_NUMBER = 65 +default_sint32_extension = _descriptor.FieldDescriptor( + name='default_sint32_extension', full_name='protobuf_unittest.default_sint32_extension', index=55, + number=65, type=17, cpp_type=1, label=1, + has_default_value=True, default_value=-45, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_SINT64_EXTENSION_FIELD_NUMBER = 66 +default_sint64_extension = _descriptor.FieldDescriptor( + name='default_sint64_extension', full_name='protobuf_unittest.default_sint64_extension', index=56, + number=66, type=18, cpp_type=2, label=1, + has_default_value=True, default_value=46, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_FIXED32_EXTENSION_FIELD_NUMBER = 67 +default_fixed32_extension = _descriptor.FieldDescriptor( + name='default_fixed32_extension', full_name='protobuf_unittest.default_fixed32_extension', index=57, + number=67, type=7, cpp_type=3, label=1, + has_default_value=True, default_value=47, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_FIXED64_EXTENSION_FIELD_NUMBER = 68 +default_fixed64_extension = _descriptor.FieldDescriptor( + name='default_fixed64_extension', full_name='protobuf_unittest.default_fixed64_extension', index=58, + number=68, type=6, cpp_type=4, label=1, + has_default_value=True, default_value=48, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_SFIXED32_EXTENSION_FIELD_NUMBER = 69 +default_sfixed32_extension = _descriptor.FieldDescriptor( + name='default_sfixed32_extension', full_name='protobuf_unittest.default_sfixed32_extension', index=59, + number=69, type=15, cpp_type=1, label=1, + has_default_value=True, default_value=49, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_SFIXED64_EXTENSION_FIELD_NUMBER = 70 +default_sfixed64_extension = _descriptor.FieldDescriptor( + name='default_sfixed64_extension', full_name='protobuf_unittest.default_sfixed64_extension', index=60, + number=70, type=16, cpp_type=2, label=1, + has_default_value=True, default_value=-50, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_FLOAT_EXTENSION_FIELD_NUMBER = 71 +default_float_extension = _descriptor.FieldDescriptor( + name='default_float_extension', full_name='protobuf_unittest.default_float_extension', index=61, + number=71, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=51.5, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_DOUBLE_EXTENSION_FIELD_NUMBER = 72 +default_double_extension = _descriptor.FieldDescriptor( + name='default_double_extension', full_name='protobuf_unittest.default_double_extension', index=62, + number=72, type=1, cpp_type=5, label=1, + has_default_value=True, default_value=52000, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_BOOL_EXTENSION_FIELD_NUMBER = 73 +default_bool_extension = _descriptor.FieldDescriptor( + name='default_bool_extension', full_name='protobuf_unittest.default_bool_extension', index=63, + number=73, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_STRING_EXTENSION_FIELD_NUMBER = 74 +default_string_extension = _descriptor.FieldDescriptor( + name='default_string_extension', full_name='protobuf_unittest.default_string_extension', index=64, + number=74, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("hello").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_BYTES_EXTENSION_FIELD_NUMBER = 75 +default_bytes_extension = _descriptor.FieldDescriptor( + name='default_bytes_extension', full_name='protobuf_unittest.default_bytes_extension', index=65, + number=75, type=12, cpp_type=9, label=1, + has_default_value=True, default_value=_b("world"), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_NESTED_ENUM_EXTENSION_FIELD_NUMBER = 81 +default_nested_enum_extension = _descriptor.FieldDescriptor( + name='default_nested_enum_extension', full_name='protobuf_unittest.default_nested_enum_extension', index=66, + number=81, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=2, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_FOREIGN_ENUM_EXTENSION_FIELD_NUMBER = 82 +default_foreign_enum_extension = _descriptor.FieldDescriptor( + name='default_foreign_enum_extension', full_name='protobuf_unittest.default_foreign_enum_extension', index=67, + number=82, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=5, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_IMPORT_ENUM_EXTENSION_FIELD_NUMBER = 83 +default_import_enum_extension = _descriptor.FieldDescriptor( + name='default_import_enum_extension', full_name='protobuf_unittest.default_import_enum_extension', index=68, + number=83, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=8, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +DEFAULT_STRING_PIECE_EXTENSION_FIELD_NUMBER = 84 +default_string_piece_extension = _descriptor.FieldDescriptor( + name='default_string_piece_extension', full_name='protobuf_unittest.default_string_piece_extension', index=69, + number=84, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("abc").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002'))) +DEFAULT_CORD_EXTENSION_FIELD_NUMBER = 85 +default_cord_extension = _descriptor.FieldDescriptor( + name='default_cord_extension', full_name='protobuf_unittest.default_cord_extension', index=70, + number=85, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("123").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001'))) +ONEOF_UINT32_EXTENSION_FIELD_NUMBER = 111 +oneof_uint32_extension = _descriptor.FieldDescriptor( + name='oneof_uint32_extension', full_name='protobuf_unittest.oneof_uint32_extension', index=71, + number=111, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +ONEOF_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER = 112 +oneof_nested_message_extension = _descriptor.FieldDescriptor( + name='oneof_nested_message_extension', full_name='protobuf_unittest.oneof_nested_message_extension', index=72, + number=112, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +ONEOF_STRING_EXTENSION_FIELD_NUMBER = 113 +oneof_string_extension = _descriptor.FieldDescriptor( + name='oneof_string_extension', full_name='protobuf_unittest.oneof_string_extension', index=73, + number=113, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +ONEOF_BYTES_EXTENSION_FIELD_NUMBER = 114 +oneof_bytes_extension = _descriptor.FieldDescriptor( + name='oneof_bytes_extension', full_name='protobuf_unittest.oneof_bytes_extension', index=74, + number=114, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +MY_EXTENSION_STRING_FIELD_NUMBER = 50 +my_extension_string = _descriptor.FieldDescriptor( + name='my_extension_string', full_name='protobuf_unittest.my_extension_string', index=75, + number=50, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +MY_EXTENSION_INT_FIELD_NUMBER = 5 +my_extension_int = _descriptor.FieldDescriptor( + name='my_extension_int', full_name='protobuf_unittest.my_extension_int', index=76, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +PACKED_INT32_EXTENSION_FIELD_NUMBER = 90 +packed_int32_extension = _descriptor.FieldDescriptor( + name='packed_int32_extension', full_name='protobuf_unittest.packed_int32_extension', index=77, + number=90, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_INT64_EXTENSION_FIELD_NUMBER = 91 +packed_int64_extension = _descriptor.FieldDescriptor( + name='packed_int64_extension', full_name='protobuf_unittest.packed_int64_extension', index=78, + number=91, type=3, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_UINT32_EXTENSION_FIELD_NUMBER = 92 +packed_uint32_extension = _descriptor.FieldDescriptor( + name='packed_uint32_extension', full_name='protobuf_unittest.packed_uint32_extension', index=79, + number=92, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_UINT64_EXTENSION_FIELD_NUMBER = 93 +packed_uint64_extension = _descriptor.FieldDescriptor( + name='packed_uint64_extension', full_name='protobuf_unittest.packed_uint64_extension', index=80, + number=93, type=4, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_SINT32_EXTENSION_FIELD_NUMBER = 94 +packed_sint32_extension = _descriptor.FieldDescriptor( + name='packed_sint32_extension', full_name='protobuf_unittest.packed_sint32_extension', index=81, + number=94, type=17, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_SINT64_EXTENSION_FIELD_NUMBER = 95 +packed_sint64_extension = _descriptor.FieldDescriptor( + name='packed_sint64_extension', full_name='protobuf_unittest.packed_sint64_extension', index=82, + number=95, type=18, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_FIXED32_EXTENSION_FIELD_NUMBER = 96 +packed_fixed32_extension = _descriptor.FieldDescriptor( + name='packed_fixed32_extension', full_name='protobuf_unittest.packed_fixed32_extension', index=83, + number=96, type=7, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_FIXED64_EXTENSION_FIELD_NUMBER = 97 +packed_fixed64_extension = _descriptor.FieldDescriptor( + name='packed_fixed64_extension', full_name='protobuf_unittest.packed_fixed64_extension', index=84, + number=97, type=6, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_SFIXED32_EXTENSION_FIELD_NUMBER = 98 +packed_sfixed32_extension = _descriptor.FieldDescriptor( + name='packed_sfixed32_extension', full_name='protobuf_unittest.packed_sfixed32_extension', index=85, + number=98, type=15, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_SFIXED64_EXTENSION_FIELD_NUMBER = 99 +packed_sfixed64_extension = _descriptor.FieldDescriptor( + name='packed_sfixed64_extension', full_name='protobuf_unittest.packed_sfixed64_extension', index=86, + number=99, type=16, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_FLOAT_EXTENSION_FIELD_NUMBER = 100 +packed_float_extension = _descriptor.FieldDescriptor( + name='packed_float_extension', full_name='protobuf_unittest.packed_float_extension', index=87, + number=100, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_DOUBLE_EXTENSION_FIELD_NUMBER = 101 +packed_double_extension = _descriptor.FieldDescriptor( + name='packed_double_extension', full_name='protobuf_unittest.packed_double_extension', index=88, + number=101, type=1, cpp_type=5, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_BOOL_EXTENSION_FIELD_NUMBER = 102 +packed_bool_extension = _descriptor.FieldDescriptor( + name='packed_bool_extension', full_name='protobuf_unittest.packed_bool_extension', index=89, + number=102, type=8, cpp_type=7, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +PACKED_ENUM_EXTENSION_FIELD_NUMBER = 103 +packed_enum_extension = _descriptor.FieldDescriptor( + name='packed_enum_extension', full_name='protobuf_unittest.packed_enum_extension', index=90, + number=103, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))) +UNPACKED_INT32_EXTENSION_FIELD_NUMBER = 90 +unpacked_int32_extension = _descriptor.FieldDescriptor( + name='unpacked_int32_extension', full_name='protobuf_unittest.unpacked_int32_extension', index=91, + number=90, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_INT64_EXTENSION_FIELD_NUMBER = 91 +unpacked_int64_extension = _descriptor.FieldDescriptor( + name='unpacked_int64_extension', full_name='protobuf_unittest.unpacked_int64_extension', index=92, + number=91, type=3, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_UINT32_EXTENSION_FIELD_NUMBER = 92 +unpacked_uint32_extension = _descriptor.FieldDescriptor( + name='unpacked_uint32_extension', full_name='protobuf_unittest.unpacked_uint32_extension', index=93, + number=92, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_UINT64_EXTENSION_FIELD_NUMBER = 93 +unpacked_uint64_extension = _descriptor.FieldDescriptor( + name='unpacked_uint64_extension', full_name='protobuf_unittest.unpacked_uint64_extension', index=94, + number=93, type=4, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_SINT32_EXTENSION_FIELD_NUMBER = 94 +unpacked_sint32_extension = _descriptor.FieldDescriptor( + name='unpacked_sint32_extension', full_name='protobuf_unittest.unpacked_sint32_extension', index=95, + number=94, type=17, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_SINT64_EXTENSION_FIELD_NUMBER = 95 +unpacked_sint64_extension = _descriptor.FieldDescriptor( + name='unpacked_sint64_extension', full_name='protobuf_unittest.unpacked_sint64_extension', index=96, + number=95, type=18, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_FIXED32_EXTENSION_FIELD_NUMBER = 96 +unpacked_fixed32_extension = _descriptor.FieldDescriptor( + name='unpacked_fixed32_extension', full_name='protobuf_unittest.unpacked_fixed32_extension', index=97, + number=96, type=7, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_FIXED64_EXTENSION_FIELD_NUMBER = 97 +unpacked_fixed64_extension = _descriptor.FieldDescriptor( + name='unpacked_fixed64_extension', full_name='protobuf_unittest.unpacked_fixed64_extension', index=98, + number=97, type=6, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_SFIXED32_EXTENSION_FIELD_NUMBER = 98 +unpacked_sfixed32_extension = _descriptor.FieldDescriptor( + name='unpacked_sfixed32_extension', full_name='protobuf_unittest.unpacked_sfixed32_extension', index=99, + number=98, type=15, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_SFIXED64_EXTENSION_FIELD_NUMBER = 99 +unpacked_sfixed64_extension = _descriptor.FieldDescriptor( + name='unpacked_sfixed64_extension', full_name='protobuf_unittest.unpacked_sfixed64_extension', index=100, + number=99, type=16, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_FLOAT_EXTENSION_FIELD_NUMBER = 100 +unpacked_float_extension = _descriptor.FieldDescriptor( + name='unpacked_float_extension', full_name='protobuf_unittest.unpacked_float_extension', index=101, + number=100, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_DOUBLE_EXTENSION_FIELD_NUMBER = 101 +unpacked_double_extension = _descriptor.FieldDescriptor( + name='unpacked_double_extension', full_name='protobuf_unittest.unpacked_double_extension', index=102, + number=101, type=1, cpp_type=5, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_BOOL_EXTENSION_FIELD_NUMBER = 102 +unpacked_bool_extension = _descriptor.FieldDescriptor( + name='unpacked_bool_extension', full_name='protobuf_unittest.unpacked_bool_extension', index=103, + number=102, type=8, cpp_type=7, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) +UNPACKED_ENUM_EXTENSION_FIELD_NUMBER = 103 +unpacked_enum_extension = _descriptor.FieldDescriptor( + name='unpacked_enum_extension', full_name='protobuf_unittest.unpacked_enum_extension', index=104, + number=103, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))) + +_TESTALLTYPES_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='protobuf_unittest.TestAllTypes.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='FOO', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BAR', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BAZ', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NEG', index=3, number=-1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3202, + serialized_end=3259, +) +_sym_db.RegisterEnumDescriptor(_TESTALLTYPES_NESTEDENUM) + +_TESTONEOF2_NESTEDENUM = _descriptor.EnumDescriptor( + name='NestedEnum', + full_name='protobuf_unittest.TestOneof2.NestedEnum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='FOO', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BAR', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BAZ', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3202, + serialized_end=3241, +) +_sym_db.RegisterEnumDescriptor(_TESTONEOF2_NESTEDENUM) + +_TESTDYNAMICEXTENSIONS_DYNAMICENUMTYPE = _descriptor.EnumDescriptor( + name='DynamicEnumType', + full_name='protobuf_unittest.TestDynamicExtensions.DynamicEnumType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DYNAMIC_FOO', index=0, number=2200, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DYNAMIC_BAR', index=1, number=2201, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DYNAMIC_BAZ', index=2, number=2202, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=10483, + serialized_end=10554, +) +_sym_db.RegisterEnumDescriptor(_TESTDYNAMICEXTENSIONS_DYNAMICENUMTYPE) + + +_TESTALLTYPES_NESTEDMESSAGE = _descriptor.Descriptor( + name='NestedMessage', + full_name='protobuf_unittest.TestAllTypes.NestedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='bb', full_name='protobuf_unittest.TestAllTypes.NestedMessage.bb', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=3117, + serialized_end=3144, +) + +_TESTALLTYPES_OPTIONALGROUP = _descriptor.Descriptor( + name='OptionalGroup', + full_name='protobuf_unittest.TestAllTypes.OptionalGroup', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestAllTypes.OptionalGroup.a', index=0, + number=17, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=3146, + serialized_end=3172, +) + +_TESTALLTYPES_REPEATEDGROUP = _descriptor.Descriptor( + name='RepeatedGroup', + full_name='protobuf_unittest.TestAllTypes.RepeatedGroup', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestAllTypes.RepeatedGroup.a', index=0, + number=47, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=3174, + serialized_end=3200, +) + +_TESTALLTYPES = _descriptor.Descriptor( + name='TestAllTypes', + full_name='protobuf_unittest.TestAllTypes', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='optional_int32', full_name='protobuf_unittest.TestAllTypes.optional_int32', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_int64', full_name='protobuf_unittest.TestAllTypes.optional_int64', index=1, + number=2, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_uint32', full_name='protobuf_unittest.TestAllTypes.optional_uint32', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_uint64', full_name='protobuf_unittest.TestAllTypes.optional_uint64', index=3, + number=4, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_sint32', full_name='protobuf_unittest.TestAllTypes.optional_sint32', index=4, + number=5, type=17, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_sint64', full_name='protobuf_unittest.TestAllTypes.optional_sint64', index=5, + number=6, type=18, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_fixed32', full_name='protobuf_unittest.TestAllTypes.optional_fixed32', index=6, + number=7, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_fixed64', full_name='protobuf_unittest.TestAllTypes.optional_fixed64', index=7, + number=8, type=6, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_sfixed32', full_name='protobuf_unittest.TestAllTypes.optional_sfixed32', index=8, + number=9, type=15, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_sfixed64', full_name='protobuf_unittest.TestAllTypes.optional_sfixed64', index=9, + number=10, type=16, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_float', full_name='protobuf_unittest.TestAllTypes.optional_float', index=10, + number=11, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_double', full_name='protobuf_unittest.TestAllTypes.optional_double', index=11, + number=12, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_bool', full_name='protobuf_unittest.TestAllTypes.optional_bool', index=12, + number=13, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_string', full_name='protobuf_unittest.TestAllTypes.optional_string', index=13, + number=14, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_bytes', full_name='protobuf_unittest.TestAllTypes.optional_bytes', index=14, + number=15, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optionalgroup', full_name='protobuf_unittest.TestAllTypes.optionalgroup', index=15, + number=16, type=10, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_nested_message', full_name='protobuf_unittest.TestAllTypes.optional_nested_message', index=16, + number=18, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_foreign_message', full_name='protobuf_unittest.TestAllTypes.optional_foreign_message', index=17, + number=19, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_import_message', full_name='protobuf_unittest.TestAllTypes.optional_import_message', index=18, + number=20, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_nested_enum', full_name='protobuf_unittest.TestAllTypes.optional_nested_enum', index=19, + number=21, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_foreign_enum', full_name='protobuf_unittest.TestAllTypes.optional_foreign_enum', index=20, + number=22, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=4, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_import_enum', full_name='protobuf_unittest.TestAllTypes.optional_import_enum', index=21, + number=23, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=7, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_string_piece', full_name='protobuf_unittest.TestAllTypes.optional_string_piece', index=22, + number=24, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002'))), + _descriptor.FieldDescriptor( + name='optional_cord', full_name='protobuf_unittest.TestAllTypes.optional_cord', index=23, + number=25, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001'))), + _descriptor.FieldDescriptor( + name='optional_public_import_message', full_name='protobuf_unittest.TestAllTypes.optional_public_import_message', index=24, + number=26, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_lazy_message', full_name='protobuf_unittest.TestAllTypes.optional_lazy_message', index=25, + number=27, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\001'))), + _descriptor.FieldDescriptor( + name='repeated_int32', full_name='protobuf_unittest.TestAllTypes.repeated_int32', index=26, + number=31, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_int64', full_name='protobuf_unittest.TestAllTypes.repeated_int64', index=27, + number=32, type=3, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_uint32', full_name='protobuf_unittest.TestAllTypes.repeated_uint32', index=28, + number=33, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_uint64', full_name='protobuf_unittest.TestAllTypes.repeated_uint64', index=29, + number=34, type=4, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_sint32', full_name='protobuf_unittest.TestAllTypes.repeated_sint32', index=30, + number=35, type=17, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_sint64', full_name='protobuf_unittest.TestAllTypes.repeated_sint64', index=31, + number=36, type=18, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_fixed32', full_name='protobuf_unittest.TestAllTypes.repeated_fixed32', index=32, + number=37, type=7, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_fixed64', full_name='protobuf_unittest.TestAllTypes.repeated_fixed64', index=33, + number=38, type=6, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_sfixed32', full_name='protobuf_unittest.TestAllTypes.repeated_sfixed32', index=34, + number=39, type=15, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_sfixed64', full_name='protobuf_unittest.TestAllTypes.repeated_sfixed64', index=35, + number=40, type=16, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_float', full_name='protobuf_unittest.TestAllTypes.repeated_float', index=36, + number=41, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_double', full_name='protobuf_unittest.TestAllTypes.repeated_double', index=37, + number=42, type=1, cpp_type=5, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_bool', full_name='protobuf_unittest.TestAllTypes.repeated_bool', index=38, + number=43, type=8, cpp_type=7, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_string', full_name='protobuf_unittest.TestAllTypes.repeated_string', index=39, + number=44, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_bytes', full_name='protobuf_unittest.TestAllTypes.repeated_bytes', index=40, + number=45, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeatedgroup', full_name='protobuf_unittest.TestAllTypes.repeatedgroup', index=41, + number=46, type=10, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_nested_message', full_name='protobuf_unittest.TestAllTypes.repeated_nested_message', index=42, + number=48, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_foreign_message', full_name='protobuf_unittest.TestAllTypes.repeated_foreign_message', index=43, + number=49, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_import_message', full_name='protobuf_unittest.TestAllTypes.repeated_import_message', index=44, + number=50, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_nested_enum', full_name='protobuf_unittest.TestAllTypes.repeated_nested_enum', index=45, + number=51, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_foreign_enum', full_name='protobuf_unittest.TestAllTypes.repeated_foreign_enum', index=46, + number=52, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_import_enum', full_name='protobuf_unittest.TestAllTypes.repeated_import_enum', index=47, + number=53, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_string_piece', full_name='protobuf_unittest.TestAllTypes.repeated_string_piece', index=48, + number=54, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002'))), + _descriptor.FieldDescriptor( + name='repeated_cord', full_name='protobuf_unittest.TestAllTypes.repeated_cord', index=49, + number=55, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001'))), + _descriptor.FieldDescriptor( + name='repeated_lazy_message', full_name='protobuf_unittest.TestAllTypes.repeated_lazy_message', index=50, + number=57, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\001'))), + _descriptor.FieldDescriptor( + name='default_int32', full_name='protobuf_unittest.TestAllTypes.default_int32', index=51, + number=61, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=41, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_int64', full_name='protobuf_unittest.TestAllTypes.default_int64', index=52, + number=62, type=3, cpp_type=2, label=1, + has_default_value=True, default_value=42, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_uint32', full_name='protobuf_unittest.TestAllTypes.default_uint32', index=53, + number=63, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=43, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_uint64', full_name='protobuf_unittest.TestAllTypes.default_uint64', index=54, + number=64, type=4, cpp_type=4, label=1, + has_default_value=True, default_value=44, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_sint32', full_name='protobuf_unittest.TestAllTypes.default_sint32', index=55, + number=65, type=17, cpp_type=1, label=1, + has_default_value=True, default_value=-45, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_sint64', full_name='protobuf_unittest.TestAllTypes.default_sint64', index=56, + number=66, type=18, cpp_type=2, label=1, + has_default_value=True, default_value=46, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_fixed32', full_name='protobuf_unittest.TestAllTypes.default_fixed32', index=57, + number=67, type=7, cpp_type=3, label=1, + has_default_value=True, default_value=47, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_fixed64', full_name='protobuf_unittest.TestAllTypes.default_fixed64', index=58, + number=68, type=6, cpp_type=4, label=1, + has_default_value=True, default_value=48, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_sfixed32', full_name='protobuf_unittest.TestAllTypes.default_sfixed32', index=59, + number=69, type=15, cpp_type=1, label=1, + has_default_value=True, default_value=49, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_sfixed64', full_name='protobuf_unittest.TestAllTypes.default_sfixed64', index=60, + number=70, type=16, cpp_type=2, label=1, + has_default_value=True, default_value=-50, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_float', full_name='protobuf_unittest.TestAllTypes.default_float', index=61, + number=71, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=51.5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_double', full_name='protobuf_unittest.TestAllTypes.default_double', index=62, + number=72, type=1, cpp_type=5, label=1, + has_default_value=True, default_value=52000, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_bool', full_name='protobuf_unittest.TestAllTypes.default_bool', index=63, + number=73, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_string', full_name='protobuf_unittest.TestAllTypes.default_string', index=64, + number=74, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("hello").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_bytes', full_name='protobuf_unittest.TestAllTypes.default_bytes', index=65, + number=75, type=12, cpp_type=9, label=1, + has_default_value=True, default_value=_b("world"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_nested_enum', full_name='protobuf_unittest.TestAllTypes.default_nested_enum', index=66, + number=81, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=2, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_foreign_enum', full_name='protobuf_unittest.TestAllTypes.default_foreign_enum', index=67, + number=82, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_import_enum', full_name='protobuf_unittest.TestAllTypes.default_import_enum', index=68, + number=83, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=8, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='default_string_piece', full_name='protobuf_unittest.TestAllTypes.default_string_piece', index=69, + number=84, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("abc").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002'))), + _descriptor.FieldDescriptor( + name='default_cord', full_name='protobuf_unittest.TestAllTypes.default_cord', index=70, + number=85, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("123").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001'))), + _descriptor.FieldDescriptor( + name='oneof_uint32', full_name='protobuf_unittest.TestAllTypes.oneof_uint32', index=71, + number=111, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='oneof_nested_message', full_name='protobuf_unittest.TestAllTypes.oneof_nested_message', index=72, + number=112, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='oneof_string', full_name='protobuf_unittest.TestAllTypes.oneof_string', index=73, + number=113, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='oneof_bytes', full_name='protobuf_unittest.TestAllTypes.oneof_bytes', index=74, + number=114, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_TESTALLTYPES_NESTEDMESSAGE, _TESTALLTYPES_OPTIONALGROUP, _TESTALLTYPES_REPEATEDGROUP, ], + enum_types=[ + _TESTALLTYPES_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='oneof_field', full_name='protobuf_unittest.TestAllTypes.oneof_field', + index=0, containing_type=None, fields=[]), + ], + serialized_start=93, + serialized_end=3274, +) + + +_NESTEDTESTALLTYPES = _descriptor.Descriptor( + name='NestedTestAllTypes', + full_name='protobuf_unittest.NestedTestAllTypes', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='child', full_name='protobuf_unittest.NestedTestAllTypes.child', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='payload', full_name='protobuf_unittest.NestedTestAllTypes.payload', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=3276, + serialized_end=3400, +) + + +_TESTDEPRECATEDFIELDS = _descriptor.Descriptor( + name='TestDeprecatedFields', + full_name='protobuf_unittest.TestDeprecatedFields', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='deprecated_int32', full_name='protobuf_unittest.TestDeprecatedFields.deprecated_int32', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=3402, + serialized_end=3454, +) + + +_FOREIGNMESSAGE = _descriptor.Descriptor( + name='ForeignMessage', + full_name='protobuf_unittest.ForeignMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='c', full_name='protobuf_unittest.ForeignMessage.c', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=3456, + serialized_end=3483, +) + + +_TESTALLEXTENSIONS = _descriptor.Descriptor( + name='TestAllExtensions', + full_name='protobuf_unittest.TestAllExtensions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1, 536870912), ], + oneofs=[ + ], + serialized_start=3485, + serialized_end=3514, +) + + +_OPTIONALGROUP_EXTENSION = _descriptor.Descriptor( + name='OptionalGroup_extension', + full_name='protobuf_unittest.OptionalGroup_extension', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.OptionalGroup_extension.a', index=0, + number=17, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=3516, + serialized_end=3552, +) + + +_REPEATEDGROUP_EXTENSION = _descriptor.Descriptor( + name='RepeatedGroup_extension', + full_name='protobuf_unittest.RepeatedGroup_extension', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.RepeatedGroup_extension.a', index=0, + number=47, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=3554, + serialized_end=3590, +) + + +_TESTNESTEDEXTENSION = _descriptor.Descriptor( + name='TestNestedExtension', + full_name='protobuf_unittest.TestNestedExtension', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + _descriptor.FieldDescriptor( + name='test', full_name='protobuf_unittest.TestNestedExtension.test', index=0, + number=1002, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("test").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nested_string_extension', full_name='protobuf_unittest.TestNestedExtension.nested_string_extension', index=1, + number=1003, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=3593, + serialized_end=3745, +) + + +_TESTREQUIRED = _descriptor.Descriptor( + name='TestRequired', + full_name='protobuf_unittest.TestRequired', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestRequired.a', index=0, + number=1, type=5, cpp_type=1, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy2', full_name='protobuf_unittest.TestRequired.dummy2', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='b', full_name='protobuf_unittest.TestRequired.b', index=2, + number=3, type=5, cpp_type=1, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy4', full_name='protobuf_unittest.TestRequired.dummy4', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy5', full_name='protobuf_unittest.TestRequired.dummy5', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy6', full_name='protobuf_unittest.TestRequired.dummy6', index=5, + number=6, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy7', full_name='protobuf_unittest.TestRequired.dummy7', index=6, + number=7, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy8', full_name='protobuf_unittest.TestRequired.dummy8', index=7, + number=8, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy9', full_name='protobuf_unittest.TestRequired.dummy9', index=8, + number=9, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy10', full_name='protobuf_unittest.TestRequired.dummy10', index=9, + number=10, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy11', full_name='protobuf_unittest.TestRequired.dummy11', index=10, + number=11, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy12', full_name='protobuf_unittest.TestRequired.dummy12', index=11, + number=12, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy13', full_name='protobuf_unittest.TestRequired.dummy13', index=12, + number=13, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy14', full_name='protobuf_unittest.TestRequired.dummy14', index=13, + number=14, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy15', full_name='protobuf_unittest.TestRequired.dummy15', index=14, + number=15, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy16', full_name='protobuf_unittest.TestRequired.dummy16', index=15, + number=16, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy17', full_name='protobuf_unittest.TestRequired.dummy17', index=16, + number=17, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy18', full_name='protobuf_unittest.TestRequired.dummy18', index=17, + number=18, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy19', full_name='protobuf_unittest.TestRequired.dummy19', index=18, + number=19, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy20', full_name='protobuf_unittest.TestRequired.dummy20', index=19, + number=20, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy21', full_name='protobuf_unittest.TestRequired.dummy21', index=20, + number=21, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy22', full_name='protobuf_unittest.TestRequired.dummy22', index=21, + number=22, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy23', full_name='protobuf_unittest.TestRequired.dummy23', index=22, + number=23, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy24', full_name='protobuf_unittest.TestRequired.dummy24', index=23, + number=24, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy25', full_name='protobuf_unittest.TestRequired.dummy25', index=24, + number=25, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy26', full_name='protobuf_unittest.TestRequired.dummy26', index=25, + number=26, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy27', full_name='protobuf_unittest.TestRequired.dummy27', index=26, + number=27, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy28', full_name='protobuf_unittest.TestRequired.dummy28', index=27, + number=28, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy29', full_name='protobuf_unittest.TestRequired.dummy29', index=28, + number=29, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy30', full_name='protobuf_unittest.TestRequired.dummy30', index=29, + number=30, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy31', full_name='protobuf_unittest.TestRequired.dummy31', index=30, + number=31, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy32', full_name='protobuf_unittest.TestRequired.dummy32', index=31, + number=32, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='c', full_name='protobuf_unittest.TestRequired.c', index=32, + number=33, type=5, cpp_type=1, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + _descriptor.FieldDescriptor( + name='single', full_name='protobuf_unittest.TestRequired.single', index=0, + number=1000, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='multi', full_name='protobuf_unittest.TestRequired.multi', index=1, + number=1001, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=3748, + serialized_end=4473, +) + + +_TESTREQUIREDFOREIGN = _descriptor.Descriptor( + name='TestRequiredForeign', + full_name='protobuf_unittest.TestRequiredForeign', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='optional_message', full_name='protobuf_unittest.TestRequiredForeign.optional_message', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_message', full_name='protobuf_unittest.TestRequiredForeign.repeated_message', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy', full_name='protobuf_unittest.TestRequiredForeign.dummy', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=4476, + serialized_end=4630, +) + + +_TESTFOREIGNNESTED = _descriptor.Descriptor( + name='TestForeignNested', + full_name='protobuf_unittest.TestForeignNested', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='foreign_nested', full_name='protobuf_unittest.TestForeignNested.foreign_nested', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=4632, + serialized_end=4722, +) + + +_TESTEMPTYMESSAGE = _descriptor.Descriptor( + name='TestEmptyMessage', + full_name='protobuf_unittest.TestEmptyMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=4724, + serialized_end=4742, +) + + +_TESTEMPTYMESSAGEWITHEXTENSIONS = _descriptor.Descriptor( + name='TestEmptyMessageWithExtensions', + full_name='protobuf_unittest.TestEmptyMessageWithExtensions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1, 536870912), ], + oneofs=[ + ], + serialized_start=4744, + serialized_end=4786, +) + + +_TESTMULTIPLEEXTENSIONRANGES = _descriptor.Descriptor( + name='TestMultipleExtensionRanges', + full_name='protobuf_unittest.TestMultipleExtensionRanges', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(42, 43), (4143, 4244), (65536, 536870912), ], + oneofs=[ + ], + serialized_start=4788, + serialized_end=4843, +) + + +_TESTREALLYLARGETAGNUMBER = _descriptor.Descriptor( + name='TestReallyLargeTagNumber', + full_name='protobuf_unittest.TestReallyLargeTagNumber', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestReallyLargeTagNumber.a', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bb', full_name='protobuf_unittest.TestReallyLargeTagNumber.bb', index=1, + number=268435455, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=4845, + serialized_end=4897, +) + + +_TESTRECURSIVEMESSAGE = _descriptor.Descriptor( + name='TestRecursiveMessage', + full_name='protobuf_unittest.TestRecursiveMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestRecursiveMessage.a', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='i', full_name='protobuf_unittest.TestRecursiveMessage.i', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=4899, + serialized_end=4984, +) + + +_TESTMUTUALRECURSIONA = _descriptor.Descriptor( + name='TestMutualRecursionA', + full_name='protobuf_unittest.TestMutualRecursionA', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='bb', full_name='protobuf_unittest.TestMutualRecursionA.bb', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=4986, + serialized_end=5061, +) + + +_TESTMUTUALRECURSIONB = _descriptor.Descriptor( + name='TestMutualRecursionB', + full_name='protobuf_unittest.TestMutualRecursionB', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestMutualRecursionB.a', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_int32', full_name='protobuf_unittest.TestMutualRecursionB.optional_int32', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=5063, + serialized_end=5161, +) + + +_TESTDUPFIELDNUMBER_FOO = _descriptor.Descriptor( + name='Foo', + full_name='protobuf_unittest.TestDupFieldNumber.Foo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestDupFieldNumber.Foo.a', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=5309, + serialized_end=5325, +) + +_TESTDUPFIELDNUMBER_BAR = _descriptor.Descriptor( + name='Bar', + full_name='protobuf_unittest.TestDupFieldNumber.Bar', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestDupFieldNumber.Bar.a', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=5327, + serialized_end=5343, +) + +_TESTDUPFIELDNUMBER = _descriptor.Descriptor( + name='TestDupFieldNumber', + full_name='protobuf_unittest.TestDupFieldNumber', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestDupFieldNumber.a', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo', full_name='protobuf_unittest.TestDupFieldNumber.foo', index=1, + number=2, type=10, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bar', full_name='protobuf_unittest.TestDupFieldNumber.bar', index=2, + number=3, type=10, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_TESTDUPFIELDNUMBER_FOO, _TESTDUPFIELDNUMBER_BAR, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=5164, + serialized_end=5343, +) + + +_TESTEAGERMESSAGE = _descriptor.Descriptor( + name='TestEagerMessage', + full_name='protobuf_unittest.TestEagerMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='sub_message', full_name='protobuf_unittest.TestEagerMessage.sub_message', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\000'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=5345, + serialized_end=5421, +) + + +_TESTLAZYMESSAGE = _descriptor.Descriptor( + name='TestLazyMessage', + full_name='protobuf_unittest.TestLazyMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='sub_message', full_name='protobuf_unittest.TestLazyMessage.sub_message', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\001'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=5423, + serialized_end=5498, +) + + +_TESTNESTEDMESSAGEHASBITS_NESTEDMESSAGE = _descriptor.Descriptor( + name='NestedMessage', + full_name='protobuf_unittest.TestNestedMessageHasBits.NestedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='nestedmessage_repeated_int32', full_name='protobuf_unittest.TestNestedMessageHasBits.NestedMessage.nestedmessage_repeated_int32', index=0, + number=1, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nestedmessage_repeated_foreignmessage', full_name='protobuf_unittest.TestNestedMessageHasBits.NestedMessage.nestedmessage_repeated_foreignmessage', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=5622, + serialized_end=5757, +) + +_TESTNESTEDMESSAGEHASBITS = _descriptor.Descriptor( + name='TestNestedMessageHasBits', + full_name='protobuf_unittest.TestNestedMessageHasBits', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='optional_nested_message', full_name='protobuf_unittest.TestNestedMessageHasBits.optional_nested_message', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_TESTNESTEDMESSAGEHASBITS_NESTEDMESSAGE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=5501, + serialized_end=5757, +) + + +_TESTCAMELCASEFIELDNAMES = _descriptor.Descriptor( + name='TestCamelCaseFieldNames', + full_name='protobuf_unittest.TestCamelCaseFieldNames', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='PrimitiveField', full_name='protobuf_unittest.TestCamelCaseFieldNames.PrimitiveField', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='StringField', full_name='protobuf_unittest.TestCamelCaseFieldNames.StringField', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EnumField', full_name='protobuf_unittest.TestCamelCaseFieldNames.EnumField', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=4, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MessageField', full_name='protobuf_unittest.TestCamelCaseFieldNames.MessageField', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='StringPieceField', full_name='protobuf_unittest.TestCamelCaseFieldNames.StringPieceField', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002'))), + _descriptor.FieldDescriptor( + name='CordField', full_name='protobuf_unittest.TestCamelCaseFieldNames.CordField', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001'))), + _descriptor.FieldDescriptor( + name='RepeatedPrimitiveField', full_name='protobuf_unittest.TestCamelCaseFieldNames.RepeatedPrimitiveField', index=6, + number=7, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RepeatedStringField', full_name='protobuf_unittest.TestCamelCaseFieldNames.RepeatedStringField', index=7, + number=8, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RepeatedEnumField', full_name='protobuf_unittest.TestCamelCaseFieldNames.RepeatedEnumField', index=8, + number=9, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RepeatedMessageField', full_name='protobuf_unittest.TestCamelCaseFieldNames.RepeatedMessageField', index=9, + number=10, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RepeatedStringPieceField', full_name='protobuf_unittest.TestCamelCaseFieldNames.RepeatedStringPieceField', index=10, + number=11, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002'))), + _descriptor.FieldDescriptor( + name='RepeatedCordField', full_name='protobuf_unittest.TestCamelCaseFieldNames.RepeatedCordField', index=11, + number=12, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=5760, + serialized_end=6245, +) + + +_TESTFIELDORDERINGS = _descriptor.Descriptor( + name='TestFieldOrderings', + full_name='protobuf_unittest.TestFieldOrderings', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='my_string', full_name='protobuf_unittest.TestFieldOrderings.my_string', index=0, + number=11, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='my_int', full_name='protobuf_unittest.TestFieldOrderings.my_int', index=1, + number=1, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='my_float', full_name='protobuf_unittest.TestFieldOrderings.my_float', index=2, + number=101, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(2, 11), (12, 101), ], + oneofs=[ + ], + serialized_start=6247, + serialized_end=6332, +) + + +_TESTEXTREMEDEFAULTVALUES = _descriptor.Descriptor( + name='TestExtremeDefaultValues', + full_name='protobuf_unittest.TestExtremeDefaultValues', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='escaped_bytes', full_name='protobuf_unittest.TestExtremeDefaultValues.escaped_bytes', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=True, default_value=_b("\000\001\007\010\014\n\r\t\013\\\'\"\376"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='large_uint32', full_name='protobuf_unittest.TestExtremeDefaultValues.large_uint32', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=4294967295, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='large_uint64', full_name='protobuf_unittest.TestExtremeDefaultValues.large_uint64', index=2, + number=3, type=4, cpp_type=4, label=1, + has_default_value=True, default_value=18446744073709551615, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='small_int32', full_name='protobuf_unittest.TestExtremeDefaultValues.small_int32', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=-2147483647, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='small_int64', full_name='protobuf_unittest.TestExtremeDefaultValues.small_int64', index=4, + number=5, type=3, cpp_type=2, label=1, + has_default_value=True, default_value=-9223372036854775807, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='really_small_int32', full_name='protobuf_unittest.TestExtremeDefaultValues.really_small_int32', index=5, + number=21, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=-2147483648, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='really_small_int64', full_name='protobuf_unittest.TestExtremeDefaultValues.really_small_int64', index=6, + number=22, type=3, cpp_type=2, label=1, + has_default_value=True, default_value=-9223372036854775808, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='utf8_string', full_name='protobuf_unittest.TestExtremeDefaultValues.utf8_string', index=7, + number=6, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("\341\210\264").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='zero_float', full_name='protobuf_unittest.TestExtremeDefaultValues.zero_float', index=8, + number=7, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='one_float', full_name='protobuf_unittest.TestExtremeDefaultValues.one_float', index=9, + number=8, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='small_float', full_name='protobuf_unittest.TestExtremeDefaultValues.small_float', index=10, + number=9, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1.5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='negative_one_float', full_name='protobuf_unittest.TestExtremeDefaultValues.negative_one_float', index=11, + number=10, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=-1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='negative_float', full_name='protobuf_unittest.TestExtremeDefaultValues.negative_float', index=12, + number=11, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=-1.5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='large_float', full_name='protobuf_unittest.TestExtremeDefaultValues.large_float', index=13, + number=12, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=2e+008, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='small_negative_float', full_name='protobuf_unittest.TestExtremeDefaultValues.small_negative_float', index=14, + number=13, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=-8e-028, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='inf_double', full_name='protobuf_unittest.TestExtremeDefaultValues.inf_double', index=15, + number=14, type=1, cpp_type=5, label=1, + has_default_value=True, default_value=1e10000, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='neg_inf_double', full_name='protobuf_unittest.TestExtremeDefaultValues.neg_inf_double', index=16, + number=15, type=1, cpp_type=5, label=1, + has_default_value=True, default_value=-1e10000, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nan_double', full_name='protobuf_unittest.TestExtremeDefaultValues.nan_double', index=17, + number=16, type=1, cpp_type=5, label=1, + has_default_value=True, default_value=(1e10000 * 0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='inf_float', full_name='protobuf_unittest.TestExtremeDefaultValues.inf_float', index=18, + number=17, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1e10000, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='neg_inf_float', full_name='protobuf_unittest.TestExtremeDefaultValues.neg_inf_float', index=19, + number=18, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=-1e10000, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nan_float', full_name='protobuf_unittest.TestExtremeDefaultValues.nan_float', index=20, + number=19, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=(1e10000 * 0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='cpp_trigraph', full_name='protobuf_unittest.TestExtremeDefaultValues.cpp_trigraph', index=21, + number=20, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("? ? ?? ?? ??? ??/ ??-").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='string_with_zero', full_name='protobuf_unittest.TestExtremeDefaultValues.string_with_zero', index=22, + number=23, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("hel\000lo").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bytes_with_zero', full_name='protobuf_unittest.TestExtremeDefaultValues.bytes_with_zero', index=23, + number=24, type=12, cpp_type=9, label=1, + has_default_value=True, default_value=_b("wor\000ld"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='string_piece_with_zero', full_name='protobuf_unittest.TestExtremeDefaultValues.string_piece_with_zero', index=24, + number=25, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("ab\000c").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002'))), + _descriptor.FieldDescriptor( + name='cord_with_zero', full_name='protobuf_unittest.TestExtremeDefaultValues.cord_with_zero', index=25, + number=26, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("12\0003").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001'))), + _descriptor.FieldDescriptor( + name='replacement_string', full_name='protobuf_unittest.TestExtremeDefaultValues.replacement_string', index=26, + number=27, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("${unknown}").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=6335, + serialized_end=7287, +) + + +_SPARSEENUMMESSAGE = _descriptor.Descriptor( + name='SparseEnumMessage', + full_name='protobuf_unittest.SparseEnumMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='sparse_enum', full_name='protobuf_unittest.SparseEnumMessage.sparse_enum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=123, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7289, + serialized_end=7364, +) + + +_ONESTRING = _descriptor.Descriptor( + name='OneString', + full_name='protobuf_unittest.OneString', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='protobuf_unittest.OneString.data', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7366, + serialized_end=7391, +) + + +_MORESTRING = _descriptor.Descriptor( + name='MoreString', + full_name='protobuf_unittest.MoreString', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='protobuf_unittest.MoreString.data', index=0, + number=1, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7393, + serialized_end=7419, +) + + +_ONEBYTES = _descriptor.Descriptor( + name='OneBytes', + full_name='protobuf_unittest.OneBytes', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='protobuf_unittest.OneBytes.data', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7421, + serialized_end=7445, +) + + +_MOREBYTES = _descriptor.Descriptor( + name='MoreBytes', + full_name='protobuf_unittest.MoreBytes', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='protobuf_unittest.MoreBytes.data', index=0, + number=1, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7447, + serialized_end=7472, +) + + +_INT32MESSAGE = _descriptor.Descriptor( + name='Int32Message', + full_name='protobuf_unittest.Int32Message', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='protobuf_unittest.Int32Message.data', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7474, + serialized_end=7502, +) + + +_UINT32MESSAGE = _descriptor.Descriptor( + name='Uint32Message', + full_name='protobuf_unittest.Uint32Message', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='protobuf_unittest.Uint32Message.data', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7504, + serialized_end=7533, +) + + +_INT64MESSAGE = _descriptor.Descriptor( + name='Int64Message', + full_name='protobuf_unittest.Int64Message', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='protobuf_unittest.Int64Message.data', index=0, + number=1, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7535, + serialized_end=7563, +) + + +_UINT64MESSAGE = _descriptor.Descriptor( + name='Uint64Message', + full_name='protobuf_unittest.Uint64Message', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='protobuf_unittest.Uint64Message.data', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7565, + serialized_end=7594, +) + + +_BOOLMESSAGE = _descriptor.Descriptor( + name='BoolMessage', + full_name='protobuf_unittest.BoolMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='protobuf_unittest.BoolMessage.data', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7596, + serialized_end=7623, +) + + +_TESTONEOF_FOOGROUP = _descriptor.Descriptor( + name='FooGroup', + full_name='protobuf_unittest.TestOneof.FooGroup', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestOneof.FooGroup.a', index=0, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='b', full_name='protobuf_unittest.TestOneof.FooGroup.b', index=1, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7795, + serialized_end=7827, +) + +_TESTONEOF = _descriptor.Descriptor( + name='TestOneof', + full_name='protobuf_unittest.TestOneof', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='foo_int', full_name='protobuf_unittest.TestOneof.foo_int', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo_string', full_name='protobuf_unittest.TestOneof.foo_string', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo_message', full_name='protobuf_unittest.TestOneof.foo_message', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foogroup', full_name='protobuf_unittest.TestOneof.foogroup', index=3, + number=4, type=10, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_TESTONEOF_FOOGROUP, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='foo', full_name='protobuf_unittest.TestOneof.foo', + index=0, containing_type=None, fields=[]), + ], + serialized_start=7626, + serialized_end=7834, +) + + +_TESTONEOFBACKWARDSCOMPATIBLE_FOOGROUP = _descriptor.Descriptor( + name='FooGroup', + full_name='protobuf_unittest.TestOneofBackwardsCompatible.FooGroup', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestOneofBackwardsCompatible.FooGroup.a', index=0, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='b', full_name='protobuf_unittest.TestOneofBackwardsCompatible.FooGroup.b', index=1, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7795, + serialized_end=7827, +) + +_TESTONEOFBACKWARDSCOMPATIBLE = _descriptor.Descriptor( + name='TestOneofBackwardsCompatible', + full_name='protobuf_unittest.TestOneofBackwardsCompatible', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='foo_int', full_name='protobuf_unittest.TestOneofBackwardsCompatible.foo_int', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo_string', full_name='protobuf_unittest.TestOneofBackwardsCompatible.foo_string', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo_message', full_name='protobuf_unittest.TestOneofBackwardsCompatible.foo_message', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foogroup', full_name='protobuf_unittest.TestOneofBackwardsCompatible.foogroup', index=3, + number=4, type=10, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_TESTONEOFBACKWARDSCOMPATIBLE_FOOGROUP, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=7837, + serialized_end=8068, +) + + +_TESTONEOF2_FOOGROUP = _descriptor.Descriptor( + name='FooGroup', + full_name='protobuf_unittest.TestOneof2.FooGroup', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestOneof2.FooGroup.a', index=0, + number=9, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='b', full_name='protobuf_unittest.TestOneof2.FooGroup.b', index=1, + number=10, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=8729, + serialized_end=8761, +) + +_TESTONEOF2_NESTEDMESSAGE = _descriptor.Descriptor( + name='NestedMessage', + full_name='protobuf_unittest.TestOneof2.NestedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='qux_int', full_name='protobuf_unittest.TestOneof2.NestedMessage.qux_int', index=0, + number=1, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='corge_int', full_name='protobuf_unittest.TestOneof2.NestedMessage.corge_int', index=1, + number=2, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=8763, + serialized_end=8814, +) + +_TESTONEOF2 = _descriptor.Descriptor( + name='TestOneof2', + full_name='protobuf_unittest.TestOneof2', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='foo_int', full_name='protobuf_unittest.TestOneof2.foo_int', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo_string', full_name='protobuf_unittest.TestOneof2.foo_string', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo_cord', full_name='protobuf_unittest.TestOneof2.foo_cord', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001'))), + _descriptor.FieldDescriptor( + name='foo_string_piece', full_name='protobuf_unittest.TestOneof2.foo_string_piece', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002'))), + _descriptor.FieldDescriptor( + name='foo_bytes', full_name='protobuf_unittest.TestOneof2.foo_bytes', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo_enum', full_name='protobuf_unittest.TestOneof2.foo_enum', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo_message', full_name='protobuf_unittest.TestOneof2.foo_message', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foogroup', full_name='protobuf_unittest.TestOneof2.foogroup', index=7, + number=8, type=10, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo_lazy_message', full_name='protobuf_unittest.TestOneof2.foo_lazy_message', index=8, + number=11, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\001'))), + _descriptor.FieldDescriptor( + name='bar_int', full_name='protobuf_unittest.TestOneof2.bar_int', index=9, + number=12, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bar_string', full_name='protobuf_unittest.TestOneof2.bar_string', index=10, + number=13, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("STRING").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bar_cord', full_name='protobuf_unittest.TestOneof2.bar_cord', index=11, + number=14, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("CORD").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001'))), + _descriptor.FieldDescriptor( + name='bar_string_piece', full_name='protobuf_unittest.TestOneof2.bar_string_piece', index=12, + number=15, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("SPIECE").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002'))), + _descriptor.FieldDescriptor( + name='bar_bytes', full_name='protobuf_unittest.TestOneof2.bar_bytes', index=13, + number=16, type=12, cpp_type=9, label=1, + has_default_value=True, default_value=_b("BYTES"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bar_enum', full_name='protobuf_unittest.TestOneof2.bar_enum', index=14, + number=17, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=2, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='baz_int', full_name='protobuf_unittest.TestOneof2.baz_int', index=15, + number=18, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='baz_string', full_name='protobuf_unittest.TestOneof2.baz_string', index=16, + number=19, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("BAZ").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_TESTONEOF2_FOOGROUP, _TESTONEOF2_NESTEDMESSAGE, ], + enum_types=[ + _TESTONEOF2_NESTEDENUM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='foo', full_name='protobuf_unittest.TestOneof2.foo', + index=0, containing_type=None, fields=[]), + _descriptor.OneofDescriptor( + name='bar', full_name='protobuf_unittest.TestOneof2.bar', + index=1, containing_type=None, fields=[]), + ], + serialized_start=8071, + serialized_end=8869, +) + + +_TESTREQUIREDONEOF_NESTEDMESSAGE = _descriptor.Descriptor( + name='NestedMessage', + full_name='protobuf_unittest.TestRequiredOneof.NestedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='required_double', full_name='protobuf_unittest.TestRequiredOneof.NestedMessage.required_double', index=0, + number=1, type=1, cpp_type=5, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=9009, + serialized_end=9049, +) + +_TESTREQUIREDONEOF = _descriptor.Descriptor( + name='TestRequiredOneof', + full_name='protobuf_unittest.TestRequiredOneof', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='foo_int', full_name='protobuf_unittest.TestRequiredOneof.foo_int', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo_string', full_name='protobuf_unittest.TestRequiredOneof.foo_string', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='foo_message', full_name='protobuf_unittest.TestRequiredOneof.foo_message', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_TESTREQUIREDONEOF_NESTEDMESSAGE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='foo', full_name='protobuf_unittest.TestRequiredOneof.foo', + index=0, containing_type=None, fields=[]), + ], + serialized_start=8872, + serialized_end=9056, +) + + +_TESTPACKEDTYPES = _descriptor.Descriptor( + name='TestPackedTypes', + full_name='protobuf_unittest.TestPackedTypes', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='packed_int32', full_name='protobuf_unittest.TestPackedTypes.packed_int32', index=0, + number=90, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_int64', full_name='protobuf_unittest.TestPackedTypes.packed_int64', index=1, + number=91, type=3, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_uint32', full_name='protobuf_unittest.TestPackedTypes.packed_uint32', index=2, + number=92, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_uint64', full_name='protobuf_unittest.TestPackedTypes.packed_uint64', index=3, + number=93, type=4, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_sint32', full_name='protobuf_unittest.TestPackedTypes.packed_sint32', index=4, + number=94, type=17, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_sint64', full_name='protobuf_unittest.TestPackedTypes.packed_sint64', index=5, + number=95, type=18, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_fixed32', full_name='protobuf_unittest.TestPackedTypes.packed_fixed32', index=6, + number=96, type=7, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_fixed64', full_name='protobuf_unittest.TestPackedTypes.packed_fixed64', index=7, + number=97, type=6, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_sfixed32', full_name='protobuf_unittest.TestPackedTypes.packed_sfixed32', index=8, + number=98, type=15, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_sfixed64', full_name='protobuf_unittest.TestPackedTypes.packed_sfixed64', index=9, + number=99, type=16, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_float', full_name='protobuf_unittest.TestPackedTypes.packed_float', index=10, + number=100, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_double', full_name='protobuf_unittest.TestPackedTypes.packed_double', index=11, + number=101, type=1, cpp_type=5, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_bool', full_name='protobuf_unittest.TestPackedTypes.packed_bool', index=12, + number=102, type=8, cpp_type=7, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + _descriptor.FieldDescriptor( + name='packed_enum', full_name='protobuf_unittest.TestPackedTypes.packed_enum', index=13, + number=103, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=9059, + serialized_end=9485, +) + + +_TESTUNPACKEDTYPES = _descriptor.Descriptor( + name='TestUnpackedTypes', + full_name='protobuf_unittest.TestUnpackedTypes', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='unpacked_int32', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_int32', index=0, + number=90, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_int64', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_int64', index=1, + number=91, type=3, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_uint32', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_uint32', index=2, + number=92, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_uint64', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_uint64', index=3, + number=93, type=4, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_sint32', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_sint32', index=4, + number=94, type=17, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_sint64', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_sint64', index=5, + number=95, type=18, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_fixed32', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_fixed32', index=6, + number=96, type=7, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_fixed64', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_fixed64', index=7, + number=97, type=6, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_sfixed32', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_sfixed32', index=8, + number=98, type=15, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_sfixed64', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_sfixed64', index=9, + number=99, type=16, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_float', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_float', index=10, + number=100, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_double', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_double', index=11, + number=101, type=1, cpp_type=5, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_bool', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_bool', index=12, + number=102, type=8, cpp_type=7, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + _descriptor.FieldDescriptor( + name='unpacked_enum', full_name='protobuf_unittest.TestUnpackedTypes.unpacked_enum', index=13, + number=103, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=9488, + serialized_end=9944, +) + + +_TESTPACKEDEXTENSIONS = _descriptor.Descriptor( + name='TestPackedExtensions', + full_name='protobuf_unittest.TestPackedExtensions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1, 536870912), ], + oneofs=[ + ], + serialized_start=9946, + serialized_end=9978, +) + + +_TESTUNPACKEDEXTENSIONS = _descriptor.Descriptor( + name='TestUnpackedExtensions', + full_name='protobuf_unittest.TestUnpackedExtensions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1, 536870912), ], + oneofs=[ + ], + serialized_start=9980, + serialized_end=10014, +) + + +_TESTDYNAMICEXTENSIONS_DYNAMICMESSAGETYPE = _descriptor.Descriptor( + name='DynamicMessageType', + full_name='protobuf_unittest.TestDynamicExtensions.DynamicMessageType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='dynamic_field', full_name='protobuf_unittest.TestDynamicExtensions.DynamicMessageType.dynamic_field', index=0, + number=2100, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=10437, + serialized_end=10481, +) + +_TESTDYNAMICEXTENSIONS = _descriptor.Descriptor( + name='TestDynamicExtensions', + full_name='protobuf_unittest.TestDynamicExtensions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='scalar_extension', full_name='protobuf_unittest.TestDynamicExtensions.scalar_extension', index=0, + number=2000, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='enum_extension', full_name='protobuf_unittest.TestDynamicExtensions.enum_extension', index=1, + number=2001, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=4, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dynamic_enum_extension', full_name='protobuf_unittest.TestDynamicExtensions.dynamic_enum_extension', index=2, + number=2002, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=2200, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message_extension', full_name='protobuf_unittest.TestDynamicExtensions.message_extension', index=3, + number=2003, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dynamic_message_extension', full_name='protobuf_unittest.TestDynamicExtensions.dynamic_message_extension', index=4, + number=2004, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_extension', full_name='protobuf_unittest.TestDynamicExtensions.repeated_extension', index=5, + number=2005, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='packed_extension', full_name='protobuf_unittest.TestDynamicExtensions.packed_extension', index=6, + number=2006, type=17, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))), + ], + extensions=[ + ], + nested_types=[_TESTDYNAMICEXTENSIONS_DYNAMICMESSAGETYPE, ], + enum_types=[ + _TESTDYNAMICEXTENSIONS_DYNAMICENUMTYPE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=10017, + serialized_end=10554, +) + + +_TESTREPEATEDSCALARDIFFERENTTAGSIZES = _descriptor.Descriptor( + name='TestRepeatedScalarDifferentTagSizes', + full_name='protobuf_unittest.TestRepeatedScalarDifferentTagSizes', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='repeated_fixed32', full_name='protobuf_unittest.TestRepeatedScalarDifferentTagSizes.repeated_fixed32', index=0, + number=12, type=7, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_int32', full_name='protobuf_unittest.TestRepeatedScalarDifferentTagSizes.repeated_int32', index=1, + number=13, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_fixed64', full_name='protobuf_unittest.TestRepeatedScalarDifferentTagSizes.repeated_fixed64', index=2, + number=2046, type=6, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_int64', full_name='protobuf_unittest.TestRepeatedScalarDifferentTagSizes.repeated_int64', index=3, + number=2047, type=3, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_float', full_name='protobuf_unittest.TestRepeatedScalarDifferentTagSizes.repeated_float', index=4, + number=262142, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_uint64', full_name='protobuf_unittest.TestRepeatedScalarDifferentTagSizes.repeated_uint64', index=5, + number=262143, type=4, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=10557, + serialized_end=10749, +) + + +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR_GROUP1 = _descriptor.Descriptor( + name='Group1', + full_name='protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.Group1', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='field1', full_name='protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.Group1.field1', index=0, + number=11, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=11542, + serialized_end=11599, +) + +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR_GROUP2 = _descriptor.Descriptor( + name='Group2', + full_name='protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.Group2', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='field1', full_name='protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.Group2.field1', index=0, + number=21, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=11601, + serialized_end=11658, +) + +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR = _descriptor.Descriptor( + name='RepeatedFieldsGenerator', + full_name='protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='field1', full_name='protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.field1', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='field2', full_name='protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.field2', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='field3', full_name='protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.field3', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='group1', full_name='protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.group1', index=3, + number=10, type=10, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='group2', full_name='protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.group2', index=4, + number=20, type=10, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ext1', full_name='protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.ext1', index=5, + number=1000, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ext2', full_name='protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.ext2', index=6, + number=1001, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR_GROUP1, _TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR_GROUP2, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=11104, + serialized_end=11658, +) + +_TESTPARSINGMERGE_OPTIONALGROUP = _descriptor.Descriptor( + name='OptionalGroup', + full_name='protobuf_unittest.TestParsingMerge.OptionalGroup', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='optional_group_all_types', full_name='protobuf_unittest.TestParsingMerge.OptionalGroup.optional_group_all_types', index=0, + number=11, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=11660, + serialized_end=11742, +) + +_TESTPARSINGMERGE_REPEATEDGROUP = _descriptor.Descriptor( + name='RepeatedGroup', + full_name='protobuf_unittest.TestParsingMerge.RepeatedGroup', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='repeated_group_all_types', full_name='protobuf_unittest.TestParsingMerge.RepeatedGroup.repeated_group_all_types', index=0, + number=21, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=11744, + serialized_end=11826, +) + +_TESTPARSINGMERGE = _descriptor.Descriptor( + name='TestParsingMerge', + full_name='protobuf_unittest.TestParsingMerge', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='required_all_types', full_name='protobuf_unittest.TestParsingMerge.required_all_types', index=0, + number=1, type=11, cpp_type=10, label=2, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optional_all_types', full_name='protobuf_unittest.TestParsingMerge.optional_all_types', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_all_types', full_name='protobuf_unittest.TestParsingMerge.repeated_all_types', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='optionalgroup', full_name='protobuf_unittest.TestParsingMerge.optionalgroup', index=3, + number=10, type=10, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeatedgroup', full_name='protobuf_unittest.TestParsingMerge.repeatedgroup', index=4, + number=20, type=10, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + _descriptor.FieldDescriptor( + name='optional_ext', full_name='protobuf_unittest.TestParsingMerge.optional_ext', index=0, + number=1000, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='repeated_ext', full_name='protobuf_unittest.TestParsingMerge.repeated_ext', index=1, + number=1001, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None), + ], + nested_types=[_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR, _TESTPARSINGMERGE_OPTIONALGROUP, _TESTPARSINGMERGE_REPEATEDGROUP, ], + enum_types=[ + ], + options=None, + is_extendable=True, + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + serialized_start=10752, + serialized_end=12023, +) + + +_TESTCOMMENTINJECTIONMESSAGE = _descriptor.Descriptor( + name='TestCommentInjectionMessage', + full_name='protobuf_unittest.TestCommentInjectionMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='a', full_name='protobuf_unittest.TestCommentInjectionMessage.a', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=_b("*/ <- Neither should this.").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=12025, + serialized_end=12093, +) + + +_FOOREQUEST = _descriptor.Descriptor( + name='FooRequest', + full_name='protobuf_unittest.FooRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=12095, + serialized_end=12107, +) + + +_FOORESPONSE = _descriptor.Descriptor( + name='FooResponse', + full_name='protobuf_unittest.FooResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=12109, + serialized_end=12122, +) + + +_FOOCLIENTMESSAGE = _descriptor.Descriptor( + name='FooClientMessage', + full_name='protobuf_unittest.FooClientMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=12124, + serialized_end=12142, +) + + +_FOOSERVERMESSAGE = _descriptor.Descriptor( + name='FooServerMessage', + full_name='protobuf_unittest.FooServerMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=12144, + serialized_end=12162, +) + + +_BARREQUEST = _descriptor.Descriptor( + name='BarRequest', + full_name='protobuf_unittest.BarRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=12164, + serialized_end=12176, +) + + +_BARRESPONSE = _descriptor.Descriptor( + name='BarResponse', + full_name='protobuf_unittest.BarResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=12178, + serialized_end=12191, +) + +_TESTALLTYPES_NESTEDMESSAGE.containing_type = _TESTALLTYPES +_TESTALLTYPES_OPTIONALGROUP.containing_type = _TESTALLTYPES +_TESTALLTYPES_REPEATEDGROUP.containing_type = _TESTALLTYPES +_TESTALLTYPES.fields_by_name['optionalgroup'].message_type = _TESTALLTYPES_OPTIONALGROUP +_TESTALLTYPES.fields_by_name['optional_nested_message'].message_type = _TESTALLTYPES_NESTEDMESSAGE +_TESTALLTYPES.fields_by_name['optional_foreign_message'].message_type = _FOREIGNMESSAGE +_TESTALLTYPES.fields_by_name['optional_import_message'].message_type = google.protobuf.unittest_import_pb2._IMPORTMESSAGE +_TESTALLTYPES.fields_by_name['optional_nested_enum'].enum_type = _TESTALLTYPES_NESTEDENUM +_TESTALLTYPES.fields_by_name['optional_foreign_enum'].enum_type = _FOREIGNENUM +_TESTALLTYPES.fields_by_name['optional_import_enum'].enum_type = google.protobuf.unittest_import_pb2._IMPORTENUM +_TESTALLTYPES.fields_by_name['optional_public_import_message'].message_type = google.protobuf.unittest_import_public_pb2._PUBLICIMPORTMESSAGE +_TESTALLTYPES.fields_by_name['optional_lazy_message'].message_type = _TESTALLTYPES_NESTEDMESSAGE +_TESTALLTYPES.fields_by_name['repeatedgroup'].message_type = _TESTALLTYPES_REPEATEDGROUP +_TESTALLTYPES.fields_by_name['repeated_nested_message'].message_type = _TESTALLTYPES_NESTEDMESSAGE +_TESTALLTYPES.fields_by_name['repeated_foreign_message'].message_type = _FOREIGNMESSAGE +_TESTALLTYPES.fields_by_name['repeated_import_message'].message_type = google.protobuf.unittest_import_pb2._IMPORTMESSAGE +_TESTALLTYPES.fields_by_name['repeated_nested_enum'].enum_type = _TESTALLTYPES_NESTEDENUM +_TESTALLTYPES.fields_by_name['repeated_foreign_enum'].enum_type = _FOREIGNENUM +_TESTALLTYPES.fields_by_name['repeated_import_enum'].enum_type = google.protobuf.unittest_import_pb2._IMPORTENUM +_TESTALLTYPES.fields_by_name['repeated_lazy_message'].message_type = _TESTALLTYPES_NESTEDMESSAGE +_TESTALLTYPES.fields_by_name['default_nested_enum'].enum_type = _TESTALLTYPES_NESTEDENUM +_TESTALLTYPES.fields_by_name['default_foreign_enum'].enum_type = _FOREIGNENUM +_TESTALLTYPES.fields_by_name['default_import_enum'].enum_type = google.protobuf.unittest_import_pb2._IMPORTENUM +_TESTALLTYPES.fields_by_name['oneof_nested_message'].message_type = _TESTALLTYPES_NESTEDMESSAGE +_TESTALLTYPES_NESTEDENUM.containing_type = _TESTALLTYPES +_TESTALLTYPES.oneofs_by_name['oneof_field'].fields.append( + _TESTALLTYPES.fields_by_name['oneof_uint32']) +_TESTALLTYPES.fields_by_name['oneof_uint32'].containing_oneof = _TESTALLTYPES.oneofs_by_name['oneof_field'] +_TESTALLTYPES.oneofs_by_name['oneof_field'].fields.append( + _TESTALLTYPES.fields_by_name['oneof_nested_message']) +_TESTALLTYPES.fields_by_name['oneof_nested_message'].containing_oneof = _TESTALLTYPES.oneofs_by_name['oneof_field'] +_TESTALLTYPES.oneofs_by_name['oneof_field'].fields.append( + _TESTALLTYPES.fields_by_name['oneof_string']) +_TESTALLTYPES.fields_by_name['oneof_string'].containing_oneof = _TESTALLTYPES.oneofs_by_name['oneof_field'] +_TESTALLTYPES.oneofs_by_name['oneof_field'].fields.append( + _TESTALLTYPES.fields_by_name['oneof_bytes']) +_TESTALLTYPES.fields_by_name['oneof_bytes'].containing_oneof = _TESTALLTYPES.oneofs_by_name['oneof_field'] +_NESTEDTESTALLTYPES.fields_by_name['child'].message_type = _NESTEDTESTALLTYPES +_NESTEDTESTALLTYPES.fields_by_name['payload'].message_type = _TESTALLTYPES +_TESTREQUIREDFOREIGN.fields_by_name['optional_message'].message_type = _TESTREQUIRED +_TESTREQUIREDFOREIGN.fields_by_name['repeated_message'].message_type = _TESTREQUIRED +_TESTFOREIGNNESTED.fields_by_name['foreign_nested'].message_type = _TESTALLTYPES_NESTEDMESSAGE +_TESTRECURSIVEMESSAGE.fields_by_name['a'].message_type = _TESTRECURSIVEMESSAGE +_TESTMUTUALRECURSIONA.fields_by_name['bb'].message_type = _TESTMUTUALRECURSIONB +_TESTMUTUALRECURSIONB.fields_by_name['a'].message_type = _TESTMUTUALRECURSIONA +_TESTDUPFIELDNUMBER_FOO.containing_type = _TESTDUPFIELDNUMBER +_TESTDUPFIELDNUMBER_BAR.containing_type = _TESTDUPFIELDNUMBER +_TESTDUPFIELDNUMBER.fields_by_name['foo'].message_type = _TESTDUPFIELDNUMBER_FOO +_TESTDUPFIELDNUMBER.fields_by_name['bar'].message_type = _TESTDUPFIELDNUMBER_BAR +_TESTEAGERMESSAGE.fields_by_name['sub_message'].message_type = _TESTALLTYPES +_TESTLAZYMESSAGE.fields_by_name['sub_message'].message_type = _TESTALLTYPES +_TESTNESTEDMESSAGEHASBITS_NESTEDMESSAGE.fields_by_name['nestedmessage_repeated_foreignmessage'].message_type = _FOREIGNMESSAGE +_TESTNESTEDMESSAGEHASBITS_NESTEDMESSAGE.containing_type = _TESTNESTEDMESSAGEHASBITS +_TESTNESTEDMESSAGEHASBITS.fields_by_name['optional_nested_message'].message_type = _TESTNESTEDMESSAGEHASBITS_NESTEDMESSAGE +_TESTCAMELCASEFIELDNAMES.fields_by_name['EnumField'].enum_type = _FOREIGNENUM +_TESTCAMELCASEFIELDNAMES.fields_by_name['MessageField'].message_type = _FOREIGNMESSAGE +_TESTCAMELCASEFIELDNAMES.fields_by_name['RepeatedEnumField'].enum_type = _FOREIGNENUM +_TESTCAMELCASEFIELDNAMES.fields_by_name['RepeatedMessageField'].message_type = _FOREIGNMESSAGE +_SPARSEENUMMESSAGE.fields_by_name['sparse_enum'].enum_type = _TESTSPARSEENUM +_TESTONEOF_FOOGROUP.containing_type = _TESTONEOF +_TESTONEOF.fields_by_name['foo_message'].message_type = _TESTALLTYPES +_TESTONEOF.fields_by_name['foogroup'].message_type = _TESTONEOF_FOOGROUP +_TESTONEOF.oneofs_by_name['foo'].fields.append( + _TESTONEOF.fields_by_name['foo_int']) +_TESTONEOF.fields_by_name['foo_int'].containing_oneof = _TESTONEOF.oneofs_by_name['foo'] +_TESTONEOF.oneofs_by_name['foo'].fields.append( + _TESTONEOF.fields_by_name['foo_string']) +_TESTONEOF.fields_by_name['foo_string'].containing_oneof = _TESTONEOF.oneofs_by_name['foo'] +_TESTONEOF.oneofs_by_name['foo'].fields.append( + _TESTONEOF.fields_by_name['foo_message']) +_TESTONEOF.fields_by_name['foo_message'].containing_oneof = _TESTONEOF.oneofs_by_name['foo'] +_TESTONEOF.oneofs_by_name['foo'].fields.append( + _TESTONEOF.fields_by_name['foogroup']) +_TESTONEOF.fields_by_name['foogroup'].containing_oneof = _TESTONEOF.oneofs_by_name['foo'] +_TESTONEOFBACKWARDSCOMPATIBLE_FOOGROUP.containing_type = _TESTONEOFBACKWARDSCOMPATIBLE +_TESTONEOFBACKWARDSCOMPATIBLE.fields_by_name['foo_message'].message_type = _TESTALLTYPES +_TESTONEOFBACKWARDSCOMPATIBLE.fields_by_name['foogroup'].message_type = _TESTONEOFBACKWARDSCOMPATIBLE_FOOGROUP +_TESTONEOF2_FOOGROUP.containing_type = _TESTONEOF2 +_TESTONEOF2_NESTEDMESSAGE.containing_type = _TESTONEOF2 +_TESTONEOF2.fields_by_name['foo_enum'].enum_type = _TESTONEOF2_NESTEDENUM +_TESTONEOF2.fields_by_name['foo_message'].message_type = _TESTONEOF2_NESTEDMESSAGE +_TESTONEOF2.fields_by_name['foogroup'].message_type = _TESTONEOF2_FOOGROUP +_TESTONEOF2.fields_by_name['foo_lazy_message'].message_type = _TESTONEOF2_NESTEDMESSAGE +_TESTONEOF2.fields_by_name['bar_enum'].enum_type = _TESTONEOF2_NESTEDENUM +_TESTONEOF2_NESTEDENUM.containing_type = _TESTONEOF2 +_TESTONEOF2.oneofs_by_name['foo'].fields.append( + _TESTONEOF2.fields_by_name['foo_int']) +_TESTONEOF2.fields_by_name['foo_int'].containing_oneof = _TESTONEOF2.oneofs_by_name['foo'] +_TESTONEOF2.oneofs_by_name['foo'].fields.append( + _TESTONEOF2.fields_by_name['foo_string']) +_TESTONEOF2.fields_by_name['foo_string'].containing_oneof = _TESTONEOF2.oneofs_by_name['foo'] +_TESTONEOF2.oneofs_by_name['foo'].fields.append( + _TESTONEOF2.fields_by_name['foo_cord']) +_TESTONEOF2.fields_by_name['foo_cord'].containing_oneof = _TESTONEOF2.oneofs_by_name['foo'] +_TESTONEOF2.oneofs_by_name['foo'].fields.append( + _TESTONEOF2.fields_by_name['foo_string_piece']) +_TESTONEOF2.fields_by_name['foo_string_piece'].containing_oneof = _TESTONEOF2.oneofs_by_name['foo'] +_TESTONEOF2.oneofs_by_name['foo'].fields.append( + _TESTONEOF2.fields_by_name['foo_bytes']) +_TESTONEOF2.fields_by_name['foo_bytes'].containing_oneof = _TESTONEOF2.oneofs_by_name['foo'] +_TESTONEOF2.oneofs_by_name['foo'].fields.append( + _TESTONEOF2.fields_by_name['foo_enum']) +_TESTONEOF2.fields_by_name['foo_enum'].containing_oneof = _TESTONEOF2.oneofs_by_name['foo'] +_TESTONEOF2.oneofs_by_name['foo'].fields.append( + _TESTONEOF2.fields_by_name['foo_message']) +_TESTONEOF2.fields_by_name['foo_message'].containing_oneof = _TESTONEOF2.oneofs_by_name['foo'] +_TESTONEOF2.oneofs_by_name['foo'].fields.append( + _TESTONEOF2.fields_by_name['foogroup']) +_TESTONEOF2.fields_by_name['foogroup'].containing_oneof = _TESTONEOF2.oneofs_by_name['foo'] +_TESTONEOF2.oneofs_by_name['foo'].fields.append( + _TESTONEOF2.fields_by_name['foo_lazy_message']) +_TESTONEOF2.fields_by_name['foo_lazy_message'].containing_oneof = _TESTONEOF2.oneofs_by_name['foo'] +_TESTONEOF2.oneofs_by_name['bar'].fields.append( + _TESTONEOF2.fields_by_name['bar_int']) +_TESTONEOF2.fields_by_name['bar_int'].containing_oneof = _TESTONEOF2.oneofs_by_name['bar'] +_TESTONEOF2.oneofs_by_name['bar'].fields.append( + _TESTONEOF2.fields_by_name['bar_string']) +_TESTONEOF2.fields_by_name['bar_string'].containing_oneof = _TESTONEOF2.oneofs_by_name['bar'] +_TESTONEOF2.oneofs_by_name['bar'].fields.append( + _TESTONEOF2.fields_by_name['bar_cord']) +_TESTONEOF2.fields_by_name['bar_cord'].containing_oneof = _TESTONEOF2.oneofs_by_name['bar'] +_TESTONEOF2.oneofs_by_name['bar'].fields.append( + _TESTONEOF2.fields_by_name['bar_string_piece']) +_TESTONEOF2.fields_by_name['bar_string_piece'].containing_oneof = _TESTONEOF2.oneofs_by_name['bar'] +_TESTONEOF2.oneofs_by_name['bar'].fields.append( + _TESTONEOF2.fields_by_name['bar_bytes']) +_TESTONEOF2.fields_by_name['bar_bytes'].containing_oneof = _TESTONEOF2.oneofs_by_name['bar'] +_TESTONEOF2.oneofs_by_name['bar'].fields.append( + _TESTONEOF2.fields_by_name['bar_enum']) +_TESTONEOF2.fields_by_name['bar_enum'].containing_oneof = _TESTONEOF2.oneofs_by_name['bar'] +_TESTREQUIREDONEOF_NESTEDMESSAGE.containing_type = _TESTREQUIREDONEOF +_TESTREQUIREDONEOF.fields_by_name['foo_message'].message_type = _TESTREQUIREDONEOF_NESTEDMESSAGE +_TESTREQUIREDONEOF.oneofs_by_name['foo'].fields.append( + _TESTREQUIREDONEOF.fields_by_name['foo_int']) +_TESTREQUIREDONEOF.fields_by_name['foo_int'].containing_oneof = _TESTREQUIREDONEOF.oneofs_by_name['foo'] +_TESTREQUIREDONEOF.oneofs_by_name['foo'].fields.append( + _TESTREQUIREDONEOF.fields_by_name['foo_string']) +_TESTREQUIREDONEOF.fields_by_name['foo_string'].containing_oneof = _TESTREQUIREDONEOF.oneofs_by_name['foo'] +_TESTREQUIREDONEOF.oneofs_by_name['foo'].fields.append( + _TESTREQUIREDONEOF.fields_by_name['foo_message']) +_TESTREQUIREDONEOF.fields_by_name['foo_message'].containing_oneof = _TESTREQUIREDONEOF.oneofs_by_name['foo'] +_TESTPACKEDTYPES.fields_by_name['packed_enum'].enum_type = _FOREIGNENUM +_TESTUNPACKEDTYPES.fields_by_name['unpacked_enum'].enum_type = _FOREIGNENUM +_TESTDYNAMICEXTENSIONS_DYNAMICMESSAGETYPE.containing_type = _TESTDYNAMICEXTENSIONS +_TESTDYNAMICEXTENSIONS.fields_by_name['enum_extension'].enum_type = _FOREIGNENUM +_TESTDYNAMICEXTENSIONS.fields_by_name['dynamic_enum_extension'].enum_type = _TESTDYNAMICEXTENSIONS_DYNAMICENUMTYPE +_TESTDYNAMICEXTENSIONS.fields_by_name['message_extension'].message_type = _FOREIGNMESSAGE +_TESTDYNAMICEXTENSIONS.fields_by_name['dynamic_message_extension'].message_type = _TESTDYNAMICEXTENSIONS_DYNAMICMESSAGETYPE +_TESTDYNAMICEXTENSIONS_DYNAMICENUMTYPE.containing_type = _TESTDYNAMICEXTENSIONS +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR_GROUP1.fields_by_name['field1'].message_type = _TESTALLTYPES +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR_GROUP1.containing_type = _TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR_GROUP2.fields_by_name['field1'].message_type = _TESTALLTYPES +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR_GROUP2.containing_type = _TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR.fields_by_name['field1'].message_type = _TESTALLTYPES +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR.fields_by_name['field2'].message_type = _TESTALLTYPES +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR.fields_by_name['field3'].message_type = _TESTALLTYPES +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR.fields_by_name['group1'].message_type = _TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR_GROUP1 +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR.fields_by_name['group2'].message_type = _TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR_GROUP2 +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR.fields_by_name['ext1'].message_type = _TESTALLTYPES +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR.fields_by_name['ext2'].message_type = _TESTALLTYPES +_TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR.containing_type = _TESTPARSINGMERGE +_TESTPARSINGMERGE_OPTIONALGROUP.fields_by_name['optional_group_all_types'].message_type = _TESTALLTYPES +_TESTPARSINGMERGE_OPTIONALGROUP.containing_type = _TESTPARSINGMERGE +_TESTPARSINGMERGE_REPEATEDGROUP.fields_by_name['repeated_group_all_types'].message_type = _TESTALLTYPES +_TESTPARSINGMERGE_REPEATEDGROUP.containing_type = _TESTPARSINGMERGE +_TESTPARSINGMERGE.fields_by_name['required_all_types'].message_type = _TESTALLTYPES +_TESTPARSINGMERGE.fields_by_name['optional_all_types'].message_type = _TESTALLTYPES +_TESTPARSINGMERGE.fields_by_name['repeated_all_types'].message_type = _TESTALLTYPES +_TESTPARSINGMERGE.fields_by_name['optionalgroup'].message_type = _TESTPARSINGMERGE_OPTIONALGROUP +_TESTPARSINGMERGE.fields_by_name['repeatedgroup'].message_type = _TESTPARSINGMERGE_REPEATEDGROUP +DESCRIPTOR.message_types_by_name['TestAllTypes'] = _TESTALLTYPES +DESCRIPTOR.message_types_by_name['NestedTestAllTypes'] = _NESTEDTESTALLTYPES +DESCRIPTOR.message_types_by_name['TestDeprecatedFields'] = _TESTDEPRECATEDFIELDS +DESCRIPTOR.message_types_by_name['ForeignMessage'] = _FOREIGNMESSAGE +DESCRIPTOR.message_types_by_name['TestAllExtensions'] = _TESTALLEXTENSIONS +DESCRIPTOR.message_types_by_name['OptionalGroup_extension'] = _OPTIONALGROUP_EXTENSION +DESCRIPTOR.message_types_by_name['RepeatedGroup_extension'] = _REPEATEDGROUP_EXTENSION +DESCRIPTOR.message_types_by_name['TestNestedExtension'] = _TESTNESTEDEXTENSION +DESCRIPTOR.message_types_by_name['TestRequired'] = _TESTREQUIRED +DESCRIPTOR.message_types_by_name['TestRequiredForeign'] = _TESTREQUIREDFOREIGN +DESCRIPTOR.message_types_by_name['TestForeignNested'] = _TESTFOREIGNNESTED +DESCRIPTOR.message_types_by_name['TestEmptyMessage'] = _TESTEMPTYMESSAGE +DESCRIPTOR.message_types_by_name['TestEmptyMessageWithExtensions'] = _TESTEMPTYMESSAGEWITHEXTENSIONS +DESCRIPTOR.message_types_by_name['TestMultipleExtensionRanges'] = _TESTMULTIPLEEXTENSIONRANGES +DESCRIPTOR.message_types_by_name['TestReallyLargeTagNumber'] = _TESTREALLYLARGETAGNUMBER +DESCRIPTOR.message_types_by_name['TestRecursiveMessage'] = _TESTRECURSIVEMESSAGE +DESCRIPTOR.message_types_by_name['TestMutualRecursionA'] = _TESTMUTUALRECURSIONA +DESCRIPTOR.message_types_by_name['TestMutualRecursionB'] = _TESTMUTUALRECURSIONB +DESCRIPTOR.message_types_by_name['TestDupFieldNumber'] = _TESTDUPFIELDNUMBER +DESCRIPTOR.message_types_by_name['TestEagerMessage'] = _TESTEAGERMESSAGE +DESCRIPTOR.message_types_by_name['TestLazyMessage'] = _TESTLAZYMESSAGE +DESCRIPTOR.message_types_by_name['TestNestedMessageHasBits'] = _TESTNESTEDMESSAGEHASBITS +DESCRIPTOR.message_types_by_name['TestCamelCaseFieldNames'] = _TESTCAMELCASEFIELDNAMES +DESCRIPTOR.message_types_by_name['TestFieldOrderings'] = _TESTFIELDORDERINGS +DESCRIPTOR.message_types_by_name['TestExtremeDefaultValues'] = _TESTEXTREMEDEFAULTVALUES +DESCRIPTOR.message_types_by_name['SparseEnumMessage'] = _SPARSEENUMMESSAGE +DESCRIPTOR.message_types_by_name['OneString'] = _ONESTRING +DESCRIPTOR.message_types_by_name['MoreString'] = _MORESTRING +DESCRIPTOR.message_types_by_name['OneBytes'] = _ONEBYTES +DESCRIPTOR.message_types_by_name['MoreBytes'] = _MOREBYTES +DESCRIPTOR.message_types_by_name['Int32Message'] = _INT32MESSAGE +DESCRIPTOR.message_types_by_name['Uint32Message'] = _UINT32MESSAGE +DESCRIPTOR.message_types_by_name['Int64Message'] = _INT64MESSAGE +DESCRIPTOR.message_types_by_name['Uint64Message'] = _UINT64MESSAGE +DESCRIPTOR.message_types_by_name['BoolMessage'] = _BOOLMESSAGE +DESCRIPTOR.message_types_by_name['TestOneof'] = _TESTONEOF +DESCRIPTOR.message_types_by_name['TestOneofBackwardsCompatible'] = _TESTONEOFBACKWARDSCOMPATIBLE +DESCRIPTOR.message_types_by_name['TestOneof2'] = _TESTONEOF2 +DESCRIPTOR.message_types_by_name['TestRequiredOneof'] = _TESTREQUIREDONEOF +DESCRIPTOR.message_types_by_name['TestPackedTypes'] = _TESTPACKEDTYPES +DESCRIPTOR.message_types_by_name['TestUnpackedTypes'] = _TESTUNPACKEDTYPES +DESCRIPTOR.message_types_by_name['TestPackedExtensions'] = _TESTPACKEDEXTENSIONS +DESCRIPTOR.message_types_by_name['TestUnpackedExtensions'] = _TESTUNPACKEDEXTENSIONS +DESCRIPTOR.message_types_by_name['TestDynamicExtensions'] = _TESTDYNAMICEXTENSIONS +DESCRIPTOR.message_types_by_name['TestRepeatedScalarDifferentTagSizes'] = _TESTREPEATEDSCALARDIFFERENTTAGSIZES +DESCRIPTOR.message_types_by_name['TestParsingMerge'] = _TESTPARSINGMERGE +DESCRIPTOR.message_types_by_name['TestCommentInjectionMessage'] = _TESTCOMMENTINJECTIONMESSAGE +DESCRIPTOR.message_types_by_name['FooRequest'] = _FOOREQUEST +DESCRIPTOR.message_types_by_name['FooResponse'] = _FOORESPONSE +DESCRIPTOR.message_types_by_name['FooClientMessage'] = _FOOCLIENTMESSAGE +DESCRIPTOR.message_types_by_name['FooServerMessage'] = _FOOSERVERMESSAGE +DESCRIPTOR.message_types_by_name['BarRequest'] = _BARREQUEST +DESCRIPTOR.message_types_by_name['BarResponse'] = _BARRESPONSE +DESCRIPTOR.enum_types_by_name['ForeignEnum'] = _FOREIGNENUM +DESCRIPTOR.enum_types_by_name['TestEnumWithDupValue'] = _TESTENUMWITHDUPVALUE +DESCRIPTOR.enum_types_by_name['TestSparseEnum'] = _TESTSPARSEENUM +DESCRIPTOR.extensions_by_name['optional_int32_extension'] = optional_int32_extension +DESCRIPTOR.extensions_by_name['optional_int64_extension'] = optional_int64_extension +DESCRIPTOR.extensions_by_name['optional_uint32_extension'] = optional_uint32_extension +DESCRIPTOR.extensions_by_name['optional_uint64_extension'] = optional_uint64_extension +DESCRIPTOR.extensions_by_name['optional_sint32_extension'] = optional_sint32_extension +DESCRIPTOR.extensions_by_name['optional_sint64_extension'] = optional_sint64_extension +DESCRIPTOR.extensions_by_name['optional_fixed32_extension'] = optional_fixed32_extension +DESCRIPTOR.extensions_by_name['optional_fixed64_extension'] = optional_fixed64_extension +DESCRIPTOR.extensions_by_name['optional_sfixed32_extension'] = optional_sfixed32_extension +DESCRIPTOR.extensions_by_name['optional_sfixed64_extension'] = optional_sfixed64_extension +DESCRIPTOR.extensions_by_name['optional_float_extension'] = optional_float_extension +DESCRIPTOR.extensions_by_name['optional_double_extension'] = optional_double_extension +DESCRIPTOR.extensions_by_name['optional_bool_extension'] = optional_bool_extension +DESCRIPTOR.extensions_by_name['optional_string_extension'] = optional_string_extension +DESCRIPTOR.extensions_by_name['optional_bytes_extension'] = optional_bytes_extension +DESCRIPTOR.extensions_by_name['optionalgroup_extension'] = optionalgroup_extension +DESCRIPTOR.extensions_by_name['optional_nested_message_extension'] = optional_nested_message_extension +DESCRIPTOR.extensions_by_name['optional_foreign_message_extension'] = optional_foreign_message_extension +DESCRIPTOR.extensions_by_name['optional_import_message_extension'] = optional_import_message_extension +DESCRIPTOR.extensions_by_name['optional_nested_enum_extension'] = optional_nested_enum_extension +DESCRIPTOR.extensions_by_name['optional_foreign_enum_extension'] = optional_foreign_enum_extension +DESCRIPTOR.extensions_by_name['optional_import_enum_extension'] = optional_import_enum_extension +DESCRIPTOR.extensions_by_name['optional_string_piece_extension'] = optional_string_piece_extension +DESCRIPTOR.extensions_by_name['optional_cord_extension'] = optional_cord_extension +DESCRIPTOR.extensions_by_name['optional_public_import_message_extension'] = optional_public_import_message_extension +DESCRIPTOR.extensions_by_name['optional_lazy_message_extension'] = optional_lazy_message_extension +DESCRIPTOR.extensions_by_name['repeated_int32_extension'] = repeated_int32_extension +DESCRIPTOR.extensions_by_name['repeated_int64_extension'] = repeated_int64_extension +DESCRIPTOR.extensions_by_name['repeated_uint32_extension'] = repeated_uint32_extension +DESCRIPTOR.extensions_by_name['repeated_uint64_extension'] = repeated_uint64_extension +DESCRIPTOR.extensions_by_name['repeated_sint32_extension'] = repeated_sint32_extension +DESCRIPTOR.extensions_by_name['repeated_sint64_extension'] = repeated_sint64_extension +DESCRIPTOR.extensions_by_name['repeated_fixed32_extension'] = repeated_fixed32_extension +DESCRIPTOR.extensions_by_name['repeated_fixed64_extension'] = repeated_fixed64_extension +DESCRIPTOR.extensions_by_name['repeated_sfixed32_extension'] = repeated_sfixed32_extension +DESCRIPTOR.extensions_by_name['repeated_sfixed64_extension'] = repeated_sfixed64_extension +DESCRIPTOR.extensions_by_name['repeated_float_extension'] = repeated_float_extension +DESCRIPTOR.extensions_by_name['repeated_double_extension'] = repeated_double_extension +DESCRIPTOR.extensions_by_name['repeated_bool_extension'] = repeated_bool_extension +DESCRIPTOR.extensions_by_name['repeated_string_extension'] = repeated_string_extension +DESCRIPTOR.extensions_by_name['repeated_bytes_extension'] = repeated_bytes_extension +DESCRIPTOR.extensions_by_name['repeatedgroup_extension'] = repeatedgroup_extension +DESCRIPTOR.extensions_by_name['repeated_nested_message_extension'] = repeated_nested_message_extension +DESCRIPTOR.extensions_by_name['repeated_foreign_message_extension'] = repeated_foreign_message_extension +DESCRIPTOR.extensions_by_name['repeated_import_message_extension'] = repeated_import_message_extension +DESCRIPTOR.extensions_by_name['repeated_nested_enum_extension'] = repeated_nested_enum_extension +DESCRIPTOR.extensions_by_name['repeated_foreign_enum_extension'] = repeated_foreign_enum_extension +DESCRIPTOR.extensions_by_name['repeated_import_enum_extension'] = repeated_import_enum_extension +DESCRIPTOR.extensions_by_name['repeated_string_piece_extension'] = repeated_string_piece_extension +DESCRIPTOR.extensions_by_name['repeated_cord_extension'] = repeated_cord_extension +DESCRIPTOR.extensions_by_name['repeated_lazy_message_extension'] = repeated_lazy_message_extension +DESCRIPTOR.extensions_by_name['default_int32_extension'] = default_int32_extension +DESCRIPTOR.extensions_by_name['default_int64_extension'] = default_int64_extension +DESCRIPTOR.extensions_by_name['default_uint32_extension'] = default_uint32_extension +DESCRIPTOR.extensions_by_name['default_uint64_extension'] = default_uint64_extension +DESCRIPTOR.extensions_by_name['default_sint32_extension'] = default_sint32_extension +DESCRIPTOR.extensions_by_name['default_sint64_extension'] = default_sint64_extension +DESCRIPTOR.extensions_by_name['default_fixed32_extension'] = default_fixed32_extension +DESCRIPTOR.extensions_by_name['default_fixed64_extension'] = default_fixed64_extension +DESCRIPTOR.extensions_by_name['default_sfixed32_extension'] = default_sfixed32_extension +DESCRIPTOR.extensions_by_name['default_sfixed64_extension'] = default_sfixed64_extension +DESCRIPTOR.extensions_by_name['default_float_extension'] = default_float_extension +DESCRIPTOR.extensions_by_name['default_double_extension'] = default_double_extension +DESCRIPTOR.extensions_by_name['default_bool_extension'] = default_bool_extension +DESCRIPTOR.extensions_by_name['default_string_extension'] = default_string_extension +DESCRIPTOR.extensions_by_name['default_bytes_extension'] = default_bytes_extension +DESCRIPTOR.extensions_by_name['default_nested_enum_extension'] = default_nested_enum_extension +DESCRIPTOR.extensions_by_name['default_foreign_enum_extension'] = default_foreign_enum_extension +DESCRIPTOR.extensions_by_name['default_import_enum_extension'] = default_import_enum_extension +DESCRIPTOR.extensions_by_name['default_string_piece_extension'] = default_string_piece_extension +DESCRIPTOR.extensions_by_name['default_cord_extension'] = default_cord_extension +DESCRIPTOR.extensions_by_name['oneof_uint32_extension'] = oneof_uint32_extension +DESCRIPTOR.extensions_by_name['oneof_nested_message_extension'] = oneof_nested_message_extension +DESCRIPTOR.extensions_by_name['oneof_string_extension'] = oneof_string_extension +DESCRIPTOR.extensions_by_name['oneof_bytes_extension'] = oneof_bytes_extension +DESCRIPTOR.extensions_by_name['my_extension_string'] = my_extension_string +DESCRIPTOR.extensions_by_name['my_extension_int'] = my_extension_int +DESCRIPTOR.extensions_by_name['packed_int32_extension'] = packed_int32_extension +DESCRIPTOR.extensions_by_name['packed_int64_extension'] = packed_int64_extension +DESCRIPTOR.extensions_by_name['packed_uint32_extension'] = packed_uint32_extension +DESCRIPTOR.extensions_by_name['packed_uint64_extension'] = packed_uint64_extension +DESCRIPTOR.extensions_by_name['packed_sint32_extension'] = packed_sint32_extension +DESCRIPTOR.extensions_by_name['packed_sint64_extension'] = packed_sint64_extension +DESCRIPTOR.extensions_by_name['packed_fixed32_extension'] = packed_fixed32_extension +DESCRIPTOR.extensions_by_name['packed_fixed64_extension'] = packed_fixed64_extension +DESCRIPTOR.extensions_by_name['packed_sfixed32_extension'] = packed_sfixed32_extension +DESCRIPTOR.extensions_by_name['packed_sfixed64_extension'] = packed_sfixed64_extension +DESCRIPTOR.extensions_by_name['packed_float_extension'] = packed_float_extension +DESCRIPTOR.extensions_by_name['packed_double_extension'] = packed_double_extension +DESCRIPTOR.extensions_by_name['packed_bool_extension'] = packed_bool_extension +DESCRIPTOR.extensions_by_name['packed_enum_extension'] = packed_enum_extension +DESCRIPTOR.extensions_by_name['unpacked_int32_extension'] = unpacked_int32_extension +DESCRIPTOR.extensions_by_name['unpacked_int64_extension'] = unpacked_int64_extension +DESCRIPTOR.extensions_by_name['unpacked_uint32_extension'] = unpacked_uint32_extension +DESCRIPTOR.extensions_by_name['unpacked_uint64_extension'] = unpacked_uint64_extension +DESCRIPTOR.extensions_by_name['unpacked_sint32_extension'] = unpacked_sint32_extension +DESCRIPTOR.extensions_by_name['unpacked_sint64_extension'] = unpacked_sint64_extension +DESCRIPTOR.extensions_by_name['unpacked_fixed32_extension'] = unpacked_fixed32_extension +DESCRIPTOR.extensions_by_name['unpacked_fixed64_extension'] = unpacked_fixed64_extension +DESCRIPTOR.extensions_by_name['unpacked_sfixed32_extension'] = unpacked_sfixed32_extension +DESCRIPTOR.extensions_by_name['unpacked_sfixed64_extension'] = unpacked_sfixed64_extension +DESCRIPTOR.extensions_by_name['unpacked_float_extension'] = unpacked_float_extension +DESCRIPTOR.extensions_by_name['unpacked_double_extension'] = unpacked_double_extension +DESCRIPTOR.extensions_by_name['unpacked_bool_extension'] = unpacked_bool_extension +DESCRIPTOR.extensions_by_name['unpacked_enum_extension'] = unpacked_enum_extension + +TestAllTypes = _reflection.GeneratedProtocolMessageType('TestAllTypes', (_message.Message,), dict( + + NestedMessage = _reflection.GeneratedProtocolMessageType('NestedMessage', (_message.Message,), dict( + DESCRIPTOR = _TESTALLTYPES_NESTEDMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestAllTypes.NestedMessage) + )) + , + + OptionalGroup = _reflection.GeneratedProtocolMessageType('OptionalGroup', (_message.Message,), dict( + DESCRIPTOR = _TESTALLTYPES_OPTIONALGROUP, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestAllTypes.OptionalGroup) + )) + , + + RepeatedGroup = _reflection.GeneratedProtocolMessageType('RepeatedGroup', (_message.Message,), dict( + DESCRIPTOR = _TESTALLTYPES_REPEATEDGROUP, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestAllTypes.RepeatedGroup) + )) + , + DESCRIPTOR = _TESTALLTYPES, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestAllTypes) + )) +_sym_db.RegisterMessage(TestAllTypes) +_sym_db.RegisterMessage(TestAllTypes.NestedMessage) +_sym_db.RegisterMessage(TestAllTypes.OptionalGroup) +_sym_db.RegisterMessage(TestAllTypes.RepeatedGroup) + +NestedTestAllTypes = _reflection.GeneratedProtocolMessageType('NestedTestAllTypes', (_message.Message,), dict( + DESCRIPTOR = _NESTEDTESTALLTYPES, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.NestedTestAllTypes) + )) +_sym_db.RegisterMessage(NestedTestAllTypes) + +TestDeprecatedFields = _reflection.GeneratedProtocolMessageType('TestDeprecatedFields', (_message.Message,), dict( + DESCRIPTOR = _TESTDEPRECATEDFIELDS, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestDeprecatedFields) + )) +_sym_db.RegisterMessage(TestDeprecatedFields) + +ForeignMessage = _reflection.GeneratedProtocolMessageType('ForeignMessage', (_message.Message,), dict( + DESCRIPTOR = _FOREIGNMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.ForeignMessage) + )) +_sym_db.RegisterMessage(ForeignMessage) + +TestAllExtensions = _reflection.GeneratedProtocolMessageType('TestAllExtensions', (_message.Message,), dict( + DESCRIPTOR = _TESTALLEXTENSIONS, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestAllExtensions) + )) +_sym_db.RegisterMessage(TestAllExtensions) + +OptionalGroup_extension = _reflection.GeneratedProtocolMessageType('OptionalGroup_extension', (_message.Message,), dict( + DESCRIPTOR = _OPTIONALGROUP_EXTENSION, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.OptionalGroup_extension) + )) +_sym_db.RegisterMessage(OptionalGroup_extension) + +RepeatedGroup_extension = _reflection.GeneratedProtocolMessageType('RepeatedGroup_extension', (_message.Message,), dict( + DESCRIPTOR = _REPEATEDGROUP_EXTENSION, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.RepeatedGroup_extension) + )) +_sym_db.RegisterMessage(RepeatedGroup_extension) + +TestNestedExtension = _reflection.GeneratedProtocolMessageType('TestNestedExtension', (_message.Message,), dict( + DESCRIPTOR = _TESTNESTEDEXTENSION, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestNestedExtension) + )) +_sym_db.RegisterMessage(TestNestedExtension) + +TestRequired = _reflection.GeneratedProtocolMessageType('TestRequired', (_message.Message,), dict( + DESCRIPTOR = _TESTREQUIRED, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestRequired) + )) +_sym_db.RegisterMessage(TestRequired) + +TestRequiredForeign = _reflection.GeneratedProtocolMessageType('TestRequiredForeign', (_message.Message,), dict( + DESCRIPTOR = _TESTREQUIREDFOREIGN, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestRequiredForeign) + )) +_sym_db.RegisterMessage(TestRequiredForeign) + +TestForeignNested = _reflection.GeneratedProtocolMessageType('TestForeignNested', (_message.Message,), dict( + DESCRIPTOR = _TESTFOREIGNNESTED, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestForeignNested) + )) +_sym_db.RegisterMessage(TestForeignNested) + +TestEmptyMessage = _reflection.GeneratedProtocolMessageType('TestEmptyMessage', (_message.Message,), dict( + DESCRIPTOR = _TESTEMPTYMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestEmptyMessage) + )) +_sym_db.RegisterMessage(TestEmptyMessage) + +TestEmptyMessageWithExtensions = _reflection.GeneratedProtocolMessageType('TestEmptyMessageWithExtensions', (_message.Message,), dict( + DESCRIPTOR = _TESTEMPTYMESSAGEWITHEXTENSIONS, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestEmptyMessageWithExtensions) + )) +_sym_db.RegisterMessage(TestEmptyMessageWithExtensions) + +TestMultipleExtensionRanges = _reflection.GeneratedProtocolMessageType('TestMultipleExtensionRanges', (_message.Message,), dict( + DESCRIPTOR = _TESTMULTIPLEEXTENSIONRANGES, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestMultipleExtensionRanges) + )) +_sym_db.RegisterMessage(TestMultipleExtensionRanges) + +TestReallyLargeTagNumber = _reflection.GeneratedProtocolMessageType('TestReallyLargeTagNumber', (_message.Message,), dict( + DESCRIPTOR = _TESTREALLYLARGETAGNUMBER, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestReallyLargeTagNumber) + )) +_sym_db.RegisterMessage(TestReallyLargeTagNumber) + +TestRecursiveMessage = _reflection.GeneratedProtocolMessageType('TestRecursiveMessage', (_message.Message,), dict( + DESCRIPTOR = _TESTRECURSIVEMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestRecursiveMessage) + )) +_sym_db.RegisterMessage(TestRecursiveMessage) + +TestMutualRecursionA = _reflection.GeneratedProtocolMessageType('TestMutualRecursionA', (_message.Message,), dict( + DESCRIPTOR = _TESTMUTUALRECURSIONA, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestMutualRecursionA) + )) +_sym_db.RegisterMessage(TestMutualRecursionA) + +TestMutualRecursionB = _reflection.GeneratedProtocolMessageType('TestMutualRecursionB', (_message.Message,), dict( + DESCRIPTOR = _TESTMUTUALRECURSIONB, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestMutualRecursionB) + )) +_sym_db.RegisterMessage(TestMutualRecursionB) + +TestDupFieldNumber = _reflection.GeneratedProtocolMessageType('TestDupFieldNumber', (_message.Message,), dict( + + Foo = _reflection.GeneratedProtocolMessageType('Foo', (_message.Message,), dict( + DESCRIPTOR = _TESTDUPFIELDNUMBER_FOO, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestDupFieldNumber.Foo) + )) + , + + Bar = _reflection.GeneratedProtocolMessageType('Bar', (_message.Message,), dict( + DESCRIPTOR = _TESTDUPFIELDNUMBER_BAR, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestDupFieldNumber.Bar) + )) + , + DESCRIPTOR = _TESTDUPFIELDNUMBER, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestDupFieldNumber) + )) +_sym_db.RegisterMessage(TestDupFieldNumber) +_sym_db.RegisterMessage(TestDupFieldNumber.Foo) +_sym_db.RegisterMessage(TestDupFieldNumber.Bar) + +TestEagerMessage = _reflection.GeneratedProtocolMessageType('TestEagerMessage', (_message.Message,), dict( + DESCRIPTOR = _TESTEAGERMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestEagerMessage) + )) +_sym_db.RegisterMessage(TestEagerMessage) + +TestLazyMessage = _reflection.GeneratedProtocolMessageType('TestLazyMessage', (_message.Message,), dict( + DESCRIPTOR = _TESTLAZYMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestLazyMessage) + )) +_sym_db.RegisterMessage(TestLazyMessage) + +TestNestedMessageHasBits = _reflection.GeneratedProtocolMessageType('TestNestedMessageHasBits', (_message.Message,), dict( + + NestedMessage = _reflection.GeneratedProtocolMessageType('NestedMessage', (_message.Message,), dict( + DESCRIPTOR = _TESTNESTEDMESSAGEHASBITS_NESTEDMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestNestedMessageHasBits.NestedMessage) + )) + , + DESCRIPTOR = _TESTNESTEDMESSAGEHASBITS, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestNestedMessageHasBits) + )) +_sym_db.RegisterMessage(TestNestedMessageHasBits) +_sym_db.RegisterMessage(TestNestedMessageHasBits.NestedMessage) + +TestCamelCaseFieldNames = _reflection.GeneratedProtocolMessageType('TestCamelCaseFieldNames', (_message.Message,), dict( + DESCRIPTOR = _TESTCAMELCASEFIELDNAMES, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestCamelCaseFieldNames) + )) +_sym_db.RegisterMessage(TestCamelCaseFieldNames) + +TestFieldOrderings = _reflection.GeneratedProtocolMessageType('TestFieldOrderings', (_message.Message,), dict( + DESCRIPTOR = _TESTFIELDORDERINGS, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestFieldOrderings) + )) +_sym_db.RegisterMessage(TestFieldOrderings) + +TestExtremeDefaultValues = _reflection.GeneratedProtocolMessageType('TestExtremeDefaultValues', (_message.Message,), dict( + DESCRIPTOR = _TESTEXTREMEDEFAULTVALUES, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestExtremeDefaultValues) + )) +_sym_db.RegisterMessage(TestExtremeDefaultValues) + +SparseEnumMessage = _reflection.GeneratedProtocolMessageType('SparseEnumMessage', (_message.Message,), dict( + DESCRIPTOR = _SPARSEENUMMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.SparseEnumMessage) + )) +_sym_db.RegisterMessage(SparseEnumMessage) + +OneString = _reflection.GeneratedProtocolMessageType('OneString', (_message.Message,), dict( + DESCRIPTOR = _ONESTRING, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.OneString) + )) +_sym_db.RegisterMessage(OneString) + +MoreString = _reflection.GeneratedProtocolMessageType('MoreString', (_message.Message,), dict( + DESCRIPTOR = _MORESTRING, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.MoreString) + )) +_sym_db.RegisterMessage(MoreString) + +OneBytes = _reflection.GeneratedProtocolMessageType('OneBytes', (_message.Message,), dict( + DESCRIPTOR = _ONEBYTES, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.OneBytes) + )) +_sym_db.RegisterMessage(OneBytes) + +MoreBytes = _reflection.GeneratedProtocolMessageType('MoreBytes', (_message.Message,), dict( + DESCRIPTOR = _MOREBYTES, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.MoreBytes) + )) +_sym_db.RegisterMessage(MoreBytes) + +Int32Message = _reflection.GeneratedProtocolMessageType('Int32Message', (_message.Message,), dict( + DESCRIPTOR = _INT32MESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.Int32Message) + )) +_sym_db.RegisterMessage(Int32Message) + +Uint32Message = _reflection.GeneratedProtocolMessageType('Uint32Message', (_message.Message,), dict( + DESCRIPTOR = _UINT32MESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.Uint32Message) + )) +_sym_db.RegisterMessage(Uint32Message) + +Int64Message = _reflection.GeneratedProtocolMessageType('Int64Message', (_message.Message,), dict( + DESCRIPTOR = _INT64MESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.Int64Message) + )) +_sym_db.RegisterMessage(Int64Message) + +Uint64Message = _reflection.GeneratedProtocolMessageType('Uint64Message', (_message.Message,), dict( + DESCRIPTOR = _UINT64MESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.Uint64Message) + )) +_sym_db.RegisterMessage(Uint64Message) + +BoolMessage = _reflection.GeneratedProtocolMessageType('BoolMessage', (_message.Message,), dict( + DESCRIPTOR = _BOOLMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.BoolMessage) + )) +_sym_db.RegisterMessage(BoolMessage) + +TestOneof = _reflection.GeneratedProtocolMessageType('TestOneof', (_message.Message,), dict( + + FooGroup = _reflection.GeneratedProtocolMessageType('FooGroup', (_message.Message,), dict( + DESCRIPTOR = _TESTONEOF_FOOGROUP, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestOneof.FooGroup) + )) + , + DESCRIPTOR = _TESTONEOF, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestOneof) + )) +_sym_db.RegisterMessage(TestOneof) +_sym_db.RegisterMessage(TestOneof.FooGroup) + +TestOneofBackwardsCompatible = _reflection.GeneratedProtocolMessageType('TestOneofBackwardsCompatible', (_message.Message,), dict( + + FooGroup = _reflection.GeneratedProtocolMessageType('FooGroup', (_message.Message,), dict( + DESCRIPTOR = _TESTONEOFBACKWARDSCOMPATIBLE_FOOGROUP, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestOneofBackwardsCompatible.FooGroup) + )) + , + DESCRIPTOR = _TESTONEOFBACKWARDSCOMPATIBLE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestOneofBackwardsCompatible) + )) +_sym_db.RegisterMessage(TestOneofBackwardsCompatible) +_sym_db.RegisterMessage(TestOneofBackwardsCompatible.FooGroup) + +TestOneof2 = _reflection.GeneratedProtocolMessageType('TestOneof2', (_message.Message,), dict( + + FooGroup = _reflection.GeneratedProtocolMessageType('FooGroup', (_message.Message,), dict( + DESCRIPTOR = _TESTONEOF2_FOOGROUP, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestOneof2.FooGroup) + )) + , + + NestedMessage = _reflection.GeneratedProtocolMessageType('NestedMessage', (_message.Message,), dict( + DESCRIPTOR = _TESTONEOF2_NESTEDMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestOneof2.NestedMessage) + )) + , + DESCRIPTOR = _TESTONEOF2, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestOneof2) + )) +_sym_db.RegisterMessage(TestOneof2) +_sym_db.RegisterMessage(TestOneof2.FooGroup) +_sym_db.RegisterMessage(TestOneof2.NestedMessage) + +TestRequiredOneof = _reflection.GeneratedProtocolMessageType('TestRequiredOneof', (_message.Message,), dict( + + NestedMessage = _reflection.GeneratedProtocolMessageType('NestedMessage', (_message.Message,), dict( + DESCRIPTOR = _TESTREQUIREDONEOF_NESTEDMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestRequiredOneof.NestedMessage) + )) + , + DESCRIPTOR = _TESTREQUIREDONEOF, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestRequiredOneof) + )) +_sym_db.RegisterMessage(TestRequiredOneof) +_sym_db.RegisterMessage(TestRequiredOneof.NestedMessage) + +TestPackedTypes = _reflection.GeneratedProtocolMessageType('TestPackedTypes', (_message.Message,), dict( + DESCRIPTOR = _TESTPACKEDTYPES, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestPackedTypes) + )) +_sym_db.RegisterMessage(TestPackedTypes) + +TestUnpackedTypes = _reflection.GeneratedProtocolMessageType('TestUnpackedTypes', (_message.Message,), dict( + DESCRIPTOR = _TESTUNPACKEDTYPES, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestUnpackedTypes) + )) +_sym_db.RegisterMessage(TestUnpackedTypes) + +TestPackedExtensions = _reflection.GeneratedProtocolMessageType('TestPackedExtensions', (_message.Message,), dict( + DESCRIPTOR = _TESTPACKEDEXTENSIONS, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestPackedExtensions) + )) +_sym_db.RegisterMessage(TestPackedExtensions) + +TestUnpackedExtensions = _reflection.GeneratedProtocolMessageType('TestUnpackedExtensions', (_message.Message,), dict( + DESCRIPTOR = _TESTUNPACKEDEXTENSIONS, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestUnpackedExtensions) + )) +_sym_db.RegisterMessage(TestUnpackedExtensions) + +TestDynamicExtensions = _reflection.GeneratedProtocolMessageType('TestDynamicExtensions', (_message.Message,), dict( + + DynamicMessageType = _reflection.GeneratedProtocolMessageType('DynamicMessageType', (_message.Message,), dict( + DESCRIPTOR = _TESTDYNAMICEXTENSIONS_DYNAMICMESSAGETYPE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestDynamicExtensions.DynamicMessageType) + )) + , + DESCRIPTOR = _TESTDYNAMICEXTENSIONS, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestDynamicExtensions) + )) +_sym_db.RegisterMessage(TestDynamicExtensions) +_sym_db.RegisterMessage(TestDynamicExtensions.DynamicMessageType) + +TestRepeatedScalarDifferentTagSizes = _reflection.GeneratedProtocolMessageType('TestRepeatedScalarDifferentTagSizes', (_message.Message,), dict( + DESCRIPTOR = _TESTREPEATEDSCALARDIFFERENTTAGSIZES, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestRepeatedScalarDifferentTagSizes) + )) +_sym_db.RegisterMessage(TestRepeatedScalarDifferentTagSizes) + +TestParsingMerge = _reflection.GeneratedProtocolMessageType('TestParsingMerge', (_message.Message,), dict( + + RepeatedFieldsGenerator = _reflection.GeneratedProtocolMessageType('RepeatedFieldsGenerator', (_message.Message,), dict( + + Group1 = _reflection.GeneratedProtocolMessageType('Group1', (_message.Message,), dict( + DESCRIPTOR = _TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR_GROUP1, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.Group1) + )) + , + + Group2 = _reflection.GeneratedProtocolMessageType('Group2', (_message.Message,), dict( + DESCRIPTOR = _TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR_GROUP2, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator.Group2) + )) + , + DESCRIPTOR = _TESTPARSINGMERGE_REPEATEDFIELDSGENERATOR, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestParsingMerge.RepeatedFieldsGenerator) + )) + , + + OptionalGroup = _reflection.GeneratedProtocolMessageType('OptionalGroup', (_message.Message,), dict( + DESCRIPTOR = _TESTPARSINGMERGE_OPTIONALGROUP, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestParsingMerge.OptionalGroup) + )) + , + + RepeatedGroup = _reflection.GeneratedProtocolMessageType('RepeatedGroup', (_message.Message,), dict( + DESCRIPTOR = _TESTPARSINGMERGE_REPEATEDGROUP, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestParsingMerge.RepeatedGroup) + )) + , + DESCRIPTOR = _TESTPARSINGMERGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestParsingMerge) + )) +_sym_db.RegisterMessage(TestParsingMerge) +_sym_db.RegisterMessage(TestParsingMerge.RepeatedFieldsGenerator) +_sym_db.RegisterMessage(TestParsingMerge.RepeatedFieldsGenerator.Group1) +_sym_db.RegisterMessage(TestParsingMerge.RepeatedFieldsGenerator.Group2) +_sym_db.RegisterMessage(TestParsingMerge.OptionalGroup) +_sym_db.RegisterMessage(TestParsingMerge.RepeatedGroup) + +TestCommentInjectionMessage = _reflection.GeneratedProtocolMessageType('TestCommentInjectionMessage', (_message.Message,), dict( + DESCRIPTOR = _TESTCOMMENTINJECTIONMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.TestCommentInjectionMessage) + )) +_sym_db.RegisterMessage(TestCommentInjectionMessage) + +FooRequest = _reflection.GeneratedProtocolMessageType('FooRequest', (_message.Message,), dict( + DESCRIPTOR = _FOOREQUEST, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.FooRequest) + )) +_sym_db.RegisterMessage(FooRequest) + +FooResponse = _reflection.GeneratedProtocolMessageType('FooResponse', (_message.Message,), dict( + DESCRIPTOR = _FOORESPONSE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.FooResponse) + )) +_sym_db.RegisterMessage(FooResponse) + +FooClientMessage = _reflection.GeneratedProtocolMessageType('FooClientMessage', (_message.Message,), dict( + DESCRIPTOR = _FOOCLIENTMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.FooClientMessage) + )) +_sym_db.RegisterMessage(FooClientMessage) + +FooServerMessage = _reflection.GeneratedProtocolMessageType('FooServerMessage', (_message.Message,), dict( + DESCRIPTOR = _FOOSERVERMESSAGE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.FooServerMessage) + )) +_sym_db.RegisterMessage(FooServerMessage) + +BarRequest = _reflection.GeneratedProtocolMessageType('BarRequest', (_message.Message,), dict( + DESCRIPTOR = _BARREQUEST, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.BarRequest) + )) +_sym_db.RegisterMessage(BarRequest) + +BarResponse = _reflection.GeneratedProtocolMessageType('BarResponse', (_message.Message,), dict( + DESCRIPTOR = _BARRESPONSE, + __module__ = 'google.protobuf.unittest_pb2' + # @@protoc_insertion_point(class_scope:protobuf_unittest.BarResponse) + )) +_sym_db.RegisterMessage(BarResponse) + +TestAllExtensions.RegisterExtension(optional_int32_extension) +TestAllExtensions.RegisterExtension(optional_int64_extension) +TestAllExtensions.RegisterExtension(optional_uint32_extension) +TestAllExtensions.RegisterExtension(optional_uint64_extension) +TestAllExtensions.RegisterExtension(optional_sint32_extension) +TestAllExtensions.RegisterExtension(optional_sint64_extension) +TestAllExtensions.RegisterExtension(optional_fixed32_extension) +TestAllExtensions.RegisterExtension(optional_fixed64_extension) +TestAllExtensions.RegisterExtension(optional_sfixed32_extension) +TestAllExtensions.RegisterExtension(optional_sfixed64_extension) +TestAllExtensions.RegisterExtension(optional_float_extension) +TestAllExtensions.RegisterExtension(optional_double_extension) +TestAllExtensions.RegisterExtension(optional_bool_extension) +TestAllExtensions.RegisterExtension(optional_string_extension) +TestAllExtensions.RegisterExtension(optional_bytes_extension) +optionalgroup_extension.message_type = _OPTIONALGROUP_EXTENSION +TestAllExtensions.RegisterExtension(optionalgroup_extension) +optional_nested_message_extension.message_type = _TESTALLTYPES_NESTEDMESSAGE +TestAllExtensions.RegisterExtension(optional_nested_message_extension) +optional_foreign_message_extension.message_type = _FOREIGNMESSAGE +TestAllExtensions.RegisterExtension(optional_foreign_message_extension) +optional_import_message_extension.message_type = google.protobuf.unittest_import_pb2._IMPORTMESSAGE +TestAllExtensions.RegisterExtension(optional_import_message_extension) +optional_nested_enum_extension.enum_type = _TESTALLTYPES_NESTEDENUM +TestAllExtensions.RegisterExtension(optional_nested_enum_extension) +optional_foreign_enum_extension.enum_type = _FOREIGNENUM +TestAllExtensions.RegisterExtension(optional_foreign_enum_extension) +optional_import_enum_extension.enum_type = google.protobuf.unittest_import_pb2._IMPORTENUM +TestAllExtensions.RegisterExtension(optional_import_enum_extension) +TestAllExtensions.RegisterExtension(optional_string_piece_extension) +TestAllExtensions.RegisterExtension(optional_cord_extension) +optional_public_import_message_extension.message_type = google.protobuf.unittest_import_public_pb2._PUBLICIMPORTMESSAGE +TestAllExtensions.RegisterExtension(optional_public_import_message_extension) +optional_lazy_message_extension.message_type = _TESTALLTYPES_NESTEDMESSAGE +TestAllExtensions.RegisterExtension(optional_lazy_message_extension) +TestAllExtensions.RegisterExtension(repeated_int32_extension) +TestAllExtensions.RegisterExtension(repeated_int64_extension) +TestAllExtensions.RegisterExtension(repeated_uint32_extension) +TestAllExtensions.RegisterExtension(repeated_uint64_extension) +TestAllExtensions.RegisterExtension(repeated_sint32_extension) +TestAllExtensions.RegisterExtension(repeated_sint64_extension) +TestAllExtensions.RegisterExtension(repeated_fixed32_extension) +TestAllExtensions.RegisterExtension(repeated_fixed64_extension) +TestAllExtensions.RegisterExtension(repeated_sfixed32_extension) +TestAllExtensions.RegisterExtension(repeated_sfixed64_extension) +TestAllExtensions.RegisterExtension(repeated_float_extension) +TestAllExtensions.RegisterExtension(repeated_double_extension) +TestAllExtensions.RegisterExtension(repeated_bool_extension) +TestAllExtensions.RegisterExtension(repeated_string_extension) +TestAllExtensions.RegisterExtension(repeated_bytes_extension) +repeatedgroup_extension.message_type = _REPEATEDGROUP_EXTENSION +TestAllExtensions.RegisterExtension(repeatedgroup_extension) +repeated_nested_message_extension.message_type = _TESTALLTYPES_NESTEDMESSAGE +TestAllExtensions.RegisterExtension(repeated_nested_message_extension) +repeated_foreign_message_extension.message_type = _FOREIGNMESSAGE +TestAllExtensions.RegisterExtension(repeated_foreign_message_extension) +repeated_import_message_extension.message_type = google.protobuf.unittest_import_pb2._IMPORTMESSAGE +TestAllExtensions.RegisterExtension(repeated_import_message_extension) +repeated_nested_enum_extension.enum_type = _TESTALLTYPES_NESTEDENUM +TestAllExtensions.RegisterExtension(repeated_nested_enum_extension) +repeated_foreign_enum_extension.enum_type = _FOREIGNENUM +TestAllExtensions.RegisterExtension(repeated_foreign_enum_extension) +repeated_import_enum_extension.enum_type = google.protobuf.unittest_import_pb2._IMPORTENUM +TestAllExtensions.RegisterExtension(repeated_import_enum_extension) +TestAllExtensions.RegisterExtension(repeated_string_piece_extension) +TestAllExtensions.RegisterExtension(repeated_cord_extension) +repeated_lazy_message_extension.message_type = _TESTALLTYPES_NESTEDMESSAGE +TestAllExtensions.RegisterExtension(repeated_lazy_message_extension) +TestAllExtensions.RegisterExtension(default_int32_extension) +TestAllExtensions.RegisterExtension(default_int64_extension) +TestAllExtensions.RegisterExtension(default_uint32_extension) +TestAllExtensions.RegisterExtension(default_uint64_extension) +TestAllExtensions.RegisterExtension(default_sint32_extension) +TestAllExtensions.RegisterExtension(default_sint64_extension) +TestAllExtensions.RegisterExtension(default_fixed32_extension) +TestAllExtensions.RegisterExtension(default_fixed64_extension) +TestAllExtensions.RegisterExtension(default_sfixed32_extension) +TestAllExtensions.RegisterExtension(default_sfixed64_extension) +TestAllExtensions.RegisterExtension(default_float_extension) +TestAllExtensions.RegisterExtension(default_double_extension) +TestAllExtensions.RegisterExtension(default_bool_extension) +TestAllExtensions.RegisterExtension(default_string_extension) +TestAllExtensions.RegisterExtension(default_bytes_extension) +default_nested_enum_extension.enum_type = _TESTALLTYPES_NESTEDENUM +TestAllExtensions.RegisterExtension(default_nested_enum_extension) +default_foreign_enum_extension.enum_type = _FOREIGNENUM +TestAllExtensions.RegisterExtension(default_foreign_enum_extension) +default_import_enum_extension.enum_type = google.protobuf.unittest_import_pb2._IMPORTENUM +TestAllExtensions.RegisterExtension(default_import_enum_extension) +TestAllExtensions.RegisterExtension(default_string_piece_extension) +TestAllExtensions.RegisterExtension(default_cord_extension) +TestAllExtensions.RegisterExtension(oneof_uint32_extension) +oneof_nested_message_extension.message_type = _TESTALLTYPES_NESTEDMESSAGE +TestAllExtensions.RegisterExtension(oneof_nested_message_extension) +TestAllExtensions.RegisterExtension(oneof_string_extension) +TestAllExtensions.RegisterExtension(oneof_bytes_extension) +TestFieldOrderings.RegisterExtension(my_extension_string) +TestFieldOrderings.RegisterExtension(my_extension_int) +TestPackedExtensions.RegisterExtension(packed_int32_extension) +TestPackedExtensions.RegisterExtension(packed_int64_extension) +TestPackedExtensions.RegisterExtension(packed_uint32_extension) +TestPackedExtensions.RegisterExtension(packed_uint64_extension) +TestPackedExtensions.RegisterExtension(packed_sint32_extension) +TestPackedExtensions.RegisterExtension(packed_sint64_extension) +TestPackedExtensions.RegisterExtension(packed_fixed32_extension) +TestPackedExtensions.RegisterExtension(packed_fixed64_extension) +TestPackedExtensions.RegisterExtension(packed_sfixed32_extension) +TestPackedExtensions.RegisterExtension(packed_sfixed64_extension) +TestPackedExtensions.RegisterExtension(packed_float_extension) +TestPackedExtensions.RegisterExtension(packed_double_extension) +TestPackedExtensions.RegisterExtension(packed_bool_extension) +packed_enum_extension.enum_type = _FOREIGNENUM +TestPackedExtensions.RegisterExtension(packed_enum_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_int32_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_int64_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_uint32_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_uint64_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_sint32_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_sint64_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_fixed32_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_fixed64_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_sfixed32_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_sfixed64_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_float_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_double_extension) +TestUnpackedExtensions.RegisterExtension(unpacked_bool_extension) +unpacked_enum_extension.enum_type = _FOREIGNENUM +TestUnpackedExtensions.RegisterExtension(unpacked_enum_extension) +TestAllExtensions.RegisterExtension(_TESTNESTEDEXTENSION.extensions_by_name['test']) +TestAllExtensions.RegisterExtension(_TESTNESTEDEXTENSION.extensions_by_name['nested_string_extension']) +_TESTREQUIRED.extensions_by_name['single'].message_type = _TESTREQUIRED +TestAllExtensions.RegisterExtension(_TESTREQUIRED.extensions_by_name['single']) +_TESTREQUIRED.extensions_by_name['multi'].message_type = _TESTREQUIRED +TestAllExtensions.RegisterExtension(_TESTREQUIRED.extensions_by_name['multi']) +_TESTPARSINGMERGE.extensions_by_name['optional_ext'].message_type = _TESTALLTYPES +TestParsingMerge.RegisterExtension(_TESTPARSINGMERGE.extensions_by_name['optional_ext']) +_TESTPARSINGMERGE.extensions_by_name['repeated_ext'].message_type = _TESTALLTYPES +TestParsingMerge.RegisterExtension(_TESTPARSINGMERGE.extensions_by_name['repeated_ext']) + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('B\rUnittestProtoH\001\200\001\001\210\001\001\220\001\001')) +_TESTENUMWITHDUPVALUE.has_options = True +_TESTENUMWITHDUPVALUE._options = _descriptor._ParseOptions(descriptor_pb2.EnumOptions(), _b('\020\001')) +optional_string_piece_extension.has_options = True +optional_string_piece_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002')) +optional_cord_extension.has_options = True +optional_cord_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001')) +optional_lazy_message_extension.has_options = True +optional_lazy_message_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\001')) +repeated_string_piece_extension.has_options = True +repeated_string_piece_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002')) +repeated_cord_extension.has_options = True +repeated_cord_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001')) +repeated_lazy_message_extension.has_options = True +repeated_lazy_message_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\001')) +default_string_piece_extension.has_options = True +default_string_piece_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002')) +default_cord_extension.has_options = True +default_cord_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001')) +packed_int32_extension.has_options = True +packed_int32_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_int64_extension.has_options = True +packed_int64_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_uint32_extension.has_options = True +packed_uint32_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_uint64_extension.has_options = True +packed_uint64_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_sint32_extension.has_options = True +packed_sint32_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_sint64_extension.has_options = True +packed_sint64_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_fixed32_extension.has_options = True +packed_fixed32_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_fixed64_extension.has_options = True +packed_fixed64_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_sfixed32_extension.has_options = True +packed_sfixed32_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_sfixed64_extension.has_options = True +packed_sfixed64_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_float_extension.has_options = True +packed_float_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_double_extension.has_options = True +packed_double_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_bool_extension.has_options = True +packed_bool_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +packed_enum_extension.has_options = True +packed_enum_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +unpacked_int32_extension.has_options = True +unpacked_int32_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_int64_extension.has_options = True +unpacked_int64_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_uint32_extension.has_options = True +unpacked_uint32_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_uint64_extension.has_options = True +unpacked_uint64_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_sint32_extension.has_options = True +unpacked_sint32_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_sint64_extension.has_options = True +unpacked_sint64_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_fixed32_extension.has_options = True +unpacked_fixed32_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_fixed64_extension.has_options = True +unpacked_fixed64_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_sfixed32_extension.has_options = True +unpacked_sfixed32_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_sfixed64_extension.has_options = True +unpacked_sfixed64_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_float_extension.has_options = True +unpacked_float_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_double_extension.has_options = True +unpacked_double_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_bool_extension.has_options = True +unpacked_bool_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +unpacked_enum_extension.has_options = True +unpacked_enum_extension._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTALLTYPES.fields_by_name['optional_string_piece'].has_options = True +_TESTALLTYPES.fields_by_name['optional_string_piece']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002')) +_TESTALLTYPES.fields_by_name['optional_cord'].has_options = True +_TESTALLTYPES.fields_by_name['optional_cord']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001')) +_TESTALLTYPES.fields_by_name['optional_lazy_message'].has_options = True +_TESTALLTYPES.fields_by_name['optional_lazy_message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\001')) +_TESTALLTYPES.fields_by_name['repeated_string_piece'].has_options = True +_TESTALLTYPES.fields_by_name['repeated_string_piece']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002')) +_TESTALLTYPES.fields_by_name['repeated_cord'].has_options = True +_TESTALLTYPES.fields_by_name['repeated_cord']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001')) +_TESTALLTYPES.fields_by_name['repeated_lazy_message'].has_options = True +_TESTALLTYPES.fields_by_name['repeated_lazy_message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\001')) +_TESTALLTYPES.fields_by_name['default_string_piece'].has_options = True +_TESTALLTYPES.fields_by_name['default_string_piece']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002')) +_TESTALLTYPES.fields_by_name['default_cord'].has_options = True +_TESTALLTYPES.fields_by_name['default_cord']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001')) +_TESTDEPRECATEDFIELDS.fields_by_name['deprecated_int32'].has_options = True +_TESTDEPRECATEDFIELDS.fields_by_name['deprecated_int32']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001')) +_TESTEAGERMESSAGE.fields_by_name['sub_message'].has_options = True +_TESTEAGERMESSAGE.fields_by_name['sub_message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\000')) +_TESTLAZYMESSAGE.fields_by_name['sub_message'].has_options = True +_TESTLAZYMESSAGE.fields_by_name['sub_message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\001')) +_TESTCAMELCASEFIELDNAMES.fields_by_name['StringPieceField'].has_options = True +_TESTCAMELCASEFIELDNAMES.fields_by_name['StringPieceField']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002')) +_TESTCAMELCASEFIELDNAMES.fields_by_name['CordField'].has_options = True +_TESTCAMELCASEFIELDNAMES.fields_by_name['CordField']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001')) +_TESTCAMELCASEFIELDNAMES.fields_by_name['RepeatedStringPieceField'].has_options = True +_TESTCAMELCASEFIELDNAMES.fields_by_name['RepeatedStringPieceField']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002')) +_TESTCAMELCASEFIELDNAMES.fields_by_name['RepeatedCordField'].has_options = True +_TESTCAMELCASEFIELDNAMES.fields_by_name['RepeatedCordField']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001')) +_TESTEXTREMEDEFAULTVALUES.fields_by_name['string_piece_with_zero'].has_options = True +_TESTEXTREMEDEFAULTVALUES.fields_by_name['string_piece_with_zero']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002')) +_TESTEXTREMEDEFAULTVALUES.fields_by_name['cord_with_zero'].has_options = True +_TESTEXTREMEDEFAULTVALUES.fields_by_name['cord_with_zero']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001')) +_TESTONEOF2.fields_by_name['foo_cord'].has_options = True +_TESTONEOF2.fields_by_name['foo_cord']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001')) +_TESTONEOF2.fields_by_name['foo_string_piece'].has_options = True +_TESTONEOF2.fields_by_name['foo_string_piece']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002')) +_TESTONEOF2.fields_by_name['foo_lazy_message'].has_options = True +_TESTONEOF2.fields_by_name['foo_lazy_message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('(\001')) +_TESTONEOF2.fields_by_name['bar_cord'].has_options = True +_TESTONEOF2.fields_by_name['bar_cord']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\001')) +_TESTONEOF2.fields_by_name['bar_string_piece'].has_options = True +_TESTONEOF2.fields_by_name['bar_string_piece']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\010\002')) +_TESTPACKEDTYPES.fields_by_name['packed_int32'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_int32']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_int64'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_int64']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_uint32'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_uint32']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_uint64'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_uint64']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_sint32'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_sint32']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_sint64'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_sint64']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_fixed32'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_fixed32']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_fixed64'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_fixed64']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_sfixed32'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_sfixed32']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_sfixed64'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_sfixed64']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_float'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_float']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_double'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_double']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_bool'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_bool']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTPACKEDTYPES.fields_by_name['packed_enum'].has_options = True +_TESTPACKEDTYPES.fields_by_name['packed_enum']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_int32'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_int32']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_int64'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_int64']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_uint32'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_uint32']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_uint64'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_uint64']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_sint32'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_sint32']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_sint64'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_sint64']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_fixed32'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_fixed32']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_fixed64'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_fixed64']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_sfixed32'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_sfixed32']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_sfixed64'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_sfixed64']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_float'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_float']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_double'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_double']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_bool'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_bool']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTUNPACKEDTYPES.fields_by_name['unpacked_enum'].has_options = True +_TESTUNPACKEDTYPES.fields_by_name['unpacked_enum']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\000')) +_TESTDYNAMICEXTENSIONS.fields_by_name['packed_extension'].has_options = True +_TESTDYNAMICEXTENSIONS.fields_by_name['packed_extension']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001')) + +_TESTSERVICE = _descriptor.ServiceDescriptor( + name='TestService', + full_name='protobuf_unittest.TestService', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=12477, + serialized_end=12630, + methods=[ + _descriptor.MethodDescriptor( + name='Foo', + full_name='protobuf_unittest.TestService.Foo', + index=0, + containing_service=None, + input_type=_FOOREQUEST, + output_type=_FOORESPONSE, + options=None, + ), + _descriptor.MethodDescriptor( + name='Bar', + full_name='protobuf_unittest.TestService.Bar', + index=1, + containing_service=None, + input_type=_BARREQUEST, + output_type=_BARRESPONSE, + options=None, + ), +]) + +TestService = service_reflection.GeneratedServiceType('TestService', (_service.Service,), dict( + DESCRIPTOR = _TESTSERVICE, + __module__ = 'google.protobuf.unittest_pb2' + )) + +TestService_Stub = service_reflection.GeneratedServiceStubType('TestService_Stub', (TestService,), dict( + DESCRIPTOR = _TESTSERVICE, + __module__ = 'google.protobuf.unittest_pb2' + )) + + +# @@protoc_insertion_point(module_scope) diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/PKG-INFO b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/PKG-INFO new file mode 100644 index 0000000..efb69bb --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: google-apputils +Version: 0.4.2 +Summary: UNKNOWN +Home-page: http://code.google.com/p/google-apputils-python +Author: Google Inc. +Author-email: opensource@google.com +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/SOURCES.txt b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/SOURCES.txt new file mode 100644 index 0000000..1f3858e --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/SOURCES.txt @@ -0,0 +1,44 @@ +LICENSE +MANIFEST.in +README +ez_setup.py +setup.py +tox.ini +google/__init__.py +google/apputils/__init__.py +google/apputils/app.py +google/apputils/appcommands.py +google/apputils/basetest.py +google/apputils/datelib.py +google/apputils/debug.py +google/apputils/file_util.py +google/apputils/humanize.py +google/apputils/resources.py +google/apputils/run_script_module.py +google/apputils/setup_command.py +google/apputils/shellutil.py +google/apputils/stopwatch.py +google_apputils.egg-info/PKG-INFO +google_apputils.egg-info/SOURCES.txt +google_apputils.egg-info/dependency_links.txt +google_apputils.egg-info/entry_points.txt +google_apputils.egg-info/namespace_packages.txt +google_apputils.egg-info/requires.txt +google_apputils.egg-info/top_level.txt +tests/__init__.py +tests/app_test.py +tests/app_test_helper.py +tests/app_unittest.sh +tests/appcommands_example.py +tests/appcommands_unittest.sh +tests/basetest_sh_test.sh +tests/basetest_test.py +tests/datelib_unittest.py +tests/file_util_test.py +tests/humanize_test.py +tests/resources_test.py +tests/sh_test.py +tests/shellutil_unittest.py +tests/stopwatch_unittest.py +tests/data/a +tests/data/b \ No newline at end of file diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/dependency_links.txt b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/entry_points.txt b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/entry_points.txt new file mode 100644 index 0000000..1d5aeea --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/entry_points.txt @@ -0,0 +1,6 @@ +[distutils.setup_keywords] +google_test_dir = google.apputils.setup_command:ValidateGoogleTestDir + +[distutils.commands] +google_test = google.apputils.setup_command:GoogleTest + diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/namespace_packages.txt b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/namespace_packages.txt new file mode 100644 index 0000000..cb42911 --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/namespace_packages.txt @@ -0,0 +1 @@ +google diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/not-zip-safe b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/not-zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/not-zip-safe @@ -0,0 +1 @@ + diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/requires.txt b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/requires.txt new file mode 100644 index 0000000..9afef20 --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/requires.txt @@ -0,0 +1,3 @@ +python-dateutil>=1.4 +python-gflags>=1.4 +pytz>=2010 \ No newline at end of file diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/top_level.txt b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/top_level.txt new file mode 100644 index 0000000..cb42911 --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/EGG-INFO/top_level.txt @@ -0,0 +1 @@ +google diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/__init__.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/__init__.py new file mode 100644 index 0000000..679704d --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/__init__.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python +try: + import pkg_resources + pkg_resources.declare_namespace(__name__) +except ImportError: + from pkgutil import extend_path + __path__ = extend_path(__path__, __name__) diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/__init__.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/__init__.py new file mode 100644 index 0000000..679704d --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/__init__.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python +try: + import pkg_resources + pkg_resources.declare_namespace(__name__) +except ImportError: + from pkgutil import extend_path + __path__ = extend_path(__path__, __name__) diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/app.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/app.py new file mode 100644 index 0000000..c2031cf --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/app.py @@ -0,0 +1,379 @@ +#!/usr/bin/env python +# Copyright 2003 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Generic entry point for Google applications. + +To use this module, simply define a 'main' function with a single +'argv' argument and add the following to the end of your source file: + +if __name__ == '__main__': + app.run() + +TODO(user): Remove silly main-detection logic, and force all clients +of this module to check __name__ explicitly. Fix all current clients +that don't check __name__. +""" +import errno +import os +import pdb +import socket +import stat +import struct +import sys +import time +import traceback +import gflags as flags +FLAGS = flags.FLAGS + +flags.DEFINE_boolean('run_with_pdb', 0, 'Set to true for PDB debug mode') +flags.DEFINE_boolean('pdb_post_mortem', 0, + 'Set to true to handle uncaught exceptions with PDB ' + 'post mortem.') +flags.DEFINE_boolean('run_with_profiling', 0, + 'Set to true for profiling the script. ' + 'Execution will be slower, and the output format might ' + 'change over time.') +flags.DEFINE_string('profile_file', None, + 'Dump profile information to a file (for python -m ' + 'pstats). Implies --run_with_profiling.') +flags.DEFINE_boolean('use_cprofile_for_profiling', True, + 'Use cProfile instead of the profile module for ' + 'profiling. This has no effect unless ' + '--run_with_profiling is set.') + +# If main() exits via an abnormal exception, call into these +# handlers before exiting. + +EXCEPTION_HANDLERS = [] +help_text_wrap = False # Whether to enable TextWrap in help output + + +class Error(Exception): + pass + + +class UsageError(Error): + """The arguments supplied by the user are invalid. + + Raise this when the arguments supplied are invalid from the point of + view of the application. For example when two mutually exclusive + flags have been supplied or when there are not enough non-flag + arguments. It is distinct from flags.FlagsError which covers the lower + level of parsing and validating individual flags. + """ + + def __init__(self, message, exitcode=1): + Error.__init__(self, message) + self.exitcode = exitcode + + +class HelpFlag(flags.BooleanFlag): + """Special boolean flag that displays usage and raises SystemExit.""" + NAME = 'help' + + def __init__(self): + flags.BooleanFlag.__init__(self, self.NAME, 0, 'show this help', + short_name='?', allow_override=1) + + def Parse(self, arg): + if arg: + usage(shorthelp=1, writeto_stdout=1) + # Advertise --helpfull on stdout, since usage() was on stdout. + print + print 'Try --helpfull to get a list of all flags.' + sys.exit(1) + + +class HelpshortFlag(HelpFlag): + """--helpshort is an alias for --help.""" + NAME = 'helpshort' + + +class HelpfullFlag(flags.BooleanFlag): + """Display help for flags in this module and all dependent modules.""" + + def __init__(self): + flags.BooleanFlag.__init__(self, 'helpfull', 0, 'show full help', + allow_override=1) + + def Parse(self, arg): + if arg: + usage(writeto_stdout=1) + sys.exit(1) + + +class HelpXMLFlag(flags.BooleanFlag): + """Similar to HelpfullFlag, but generates output in XML format.""" + + def __init__(self): + flags.BooleanFlag.__init__(self, 'helpxml', False, + 'like --helpfull, but generates XML output', + allow_override=1) + + def Parse(self, arg): + if arg: + flags.FLAGS.WriteHelpInXMLFormat(sys.stdout) + sys.exit(1) + + +class BuildDataFlag(flags.BooleanFlag): + """Boolean flag that writes build data to stdout and exits.""" + + def __init__(self): + flags.BooleanFlag.__init__(self, 'show_build_data', 0, + 'show build data and exit') + + def Parse(self, arg): + if arg: + sys.stdout.write(build_data.BuildData()) + sys.exit(0) + + +def parse_flags_with_usage(args): + """Try parsing the flags, printing usage and exiting if unparseable.""" + try: + argv = FLAGS(args) + return argv + except flags.FlagsError, error: + sys.stderr.write('FATAL Flags parsing error: %s\n' % error) + sys.stderr.write('Pass --helpshort or --helpfull to see help on flags.\n') + sys.exit(1) + + +_define_help_flags_called = False + + +def DefineHelpFlags(): + """Register help flags. Idempotent.""" + # Use a global to ensure idempotence. + # pylint: disable=global-statement + global _define_help_flags_called + + if not _define_help_flags_called: + flags.DEFINE_flag(HelpFlag()) + flags.DEFINE_flag(HelpshortFlag()) # alias for --help + flags.DEFINE_flag(HelpfullFlag()) + flags.DEFINE_flag(HelpXMLFlag()) + flags.DEFINE_flag(BuildDataFlag()) + _define_help_flags_called = True + + +def RegisterAndParseFlagsWithUsage(): + """Register help flags, parse arguments and show usage if appropriate. + + Returns: + remaining arguments after flags parsing + """ + DefineHelpFlags() + + argv = parse_flags_with_usage(sys.argv) + return argv + + +def really_start(main=None): + """Initializes flag values, and calls main with non-flag arguments. + + Only non-flag arguments are passed to main(). The return value of main() is + used as the exit status. + + Args: + main: Main function to run with the list of non-flag arguments, or None + so that sys.modules['__main__'].main is to be used. + """ + argv = RegisterAndParseFlagsWithUsage() + + if main is None: + main = sys.modules['__main__'].main + + try: + if FLAGS.run_with_pdb: + sys.exit(pdb.runcall(main, argv)) + else: + if FLAGS.run_with_profiling or FLAGS.profile_file: + # Avoid import overhead since most apps (including performance-sensitive + # ones) won't be run with profiling. + import atexit + if FLAGS.use_cprofile_for_profiling: + import cProfile as profile + else: + import profile + profiler = profile.Profile() + if FLAGS.profile_file: + atexit.register(profiler.dump_stats, FLAGS.profile_file) + else: + atexit.register(profiler.print_stats) + retval = profiler.runcall(main, argv) + sys.exit(retval) + else: + sys.exit(main(argv)) + except UsageError, error: + usage(shorthelp=1, detailed_error=error, exitcode=error.exitcode) + except: + if FLAGS.pdb_post_mortem: + traceback.print_exc() + pdb.post_mortem() + raise + + +def run(): + """Begin executing the program. + + - Parses command line flags with the flag module. + - If there are any errors, print usage(). + - Calls main() with the remaining arguments. + - If main() raises a UsageError, print usage and the error message. + """ + return _actual_start() + + +def _actual_start(): + """Another layer in the starting stack.""" + # Get raw traceback + tb = None + try: + raise ZeroDivisionError('') + except ZeroDivisionError: + tb = sys.exc_info()[2] + assert tb + + # Look at previous stack frame's previous stack frame (previous + # frame is run() or start(); the frame before that should be the + # frame of the original caller, which should be __main__ or appcommands + prev_prev_frame = tb.tb_frame.f_back.f_back + if not prev_prev_frame: + return + prev_prev_name = prev_prev_frame.f_globals.get('__name__', None) + if (prev_prev_name != '__main__' + and not prev_prev_name.endswith('.appcommands')): + return + # just in case there's non-trivial stuff happening in __main__ + del tb + if hasattr(sys, 'exc_clear'): + sys.exc_clear() # This functionality is gone in Python 3. + + try: + really_start() + except SystemExit, e: + raise + except Exception, e: + # Call any installed exception handlers which may, for example, + # log to a file or send email. + for handler in EXCEPTION_HANDLERS: + try: + if handler.Wants(e): + handler.Handle(e) + except: + # We don't want to stop for exceptions in the exception handlers but + # we shouldn't hide them either. + sys.stderr.write(traceback.format_exc()) + raise + # All handlers have had their chance, now die as we would have normally. + raise + + +def usage(shorthelp=0, writeto_stdout=0, detailed_error=None, exitcode=None): + """Write __main__'s docstring to stderr with some help text. + + Args: + shorthelp: print only flags from this module, rather than all flags. + writeto_stdout: write help message to stdout, rather than to stderr. + detailed_error: additional detail about why usage info was presented. + exitcode: if set, exit with this status code after writing help. + """ + if writeto_stdout: + stdfile = sys.stdout + else: + stdfile = sys.stderr + + doc = sys.modules['__main__'].__doc__ + if not doc: + doc = '\nUSAGE: %s [flags]\n' % sys.argv[0] + doc = flags.TextWrap(doc, indent=' ', firstline_indent='') + else: + # Replace all '%s' with sys.argv[0], and all '%%' with '%'. + num_specifiers = doc.count('%') - 2 * doc.count('%%') + try: + doc %= (sys.argv[0],) * num_specifiers + except (OverflowError, TypeError, ValueError): + # Just display the docstring as-is. + pass + if help_text_wrap: + doc = flags.TextWrap(flags.DocToHelp(doc)) + if shorthelp: + flag_str = FLAGS.MainModuleHelp() + else: + flag_str = str(FLAGS) + try: + stdfile.write(doc) + if flag_str: + stdfile.write('\nflags:\n') + stdfile.write(flag_str) + stdfile.write('\n') + if detailed_error is not None: + stdfile.write('\n%s\n' % detailed_error) + except IOError, e: + # We avoid printing a huge backtrace if we get EPIPE, because + # "foo.par --help | less" is a frequent use case. + if e.errno != errno.EPIPE: + raise + if exitcode is not None: + sys.exit(exitcode) + + +class ExceptionHandler(object): + """Base exception handler from which other may inherit.""" + + def Wants(self, unused_exc): + """Check if this exception handler want to handle this exception. + + Args: + unused_exc: Exception, the current exception + + Returns: + boolean + + This base handler wants to handle all exceptions, override this + method if you want to be more selective. + """ + return True + + def Handle(self, exc): + """Do something with the current exception. + + Args: + exc: Exception, the current exception + + This method must be overridden. + """ + raise NotImplementedError() + + +def InstallExceptionHandler(handler): + """Install an exception handler. + + Args: + handler: an object conforming to the interface defined in ExceptionHandler + + Raises: + TypeError: handler was not of the correct type + + All installed exception handlers will be called if main() exits via + an abnormal exception, i.e. not one of SystemExit, KeyboardInterrupt, + FlagsError or UsageError. + """ + if not isinstance(handler, ExceptionHandler): + raise TypeError('handler of type %s does not inherit from ExceptionHandler' + % type(handler)) + EXCEPTION_HANDLERS.append(handler) diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/appcommands.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/appcommands.py new file mode 100644 index 0000000..4f0c48d --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/appcommands.py @@ -0,0 +1,805 @@ +#!/usr/bin/env python +# Copyright 2007 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""This module is the base for programs that provide multiple commands. + +This provides command line tools that have a few shared global flags, +followed by a command name, followed by command specific flags, +then by arguments. That is: + tool [--global_flags] command [--command_flags] [args] + +The module is built on top of app.py and 'overrides' a bit of it. However +the interface is mostly the same. The main difference is that your main +is supposed to register commands and return without further execution +of the commands; pre checking is of course welcome! Also your +global initialization should call appcommands.Run() rather than app.run(). + +To register commands use AddCmd() or AddCmdFunc(). AddCmd() is used +for commands that derive from class Cmd and the AddCmdFunc() is used +to wrap simple functions. + +This module itself registers the command 'help' that allows users +to retrieve help for all or specific commands. 'help' is the default +command executed if no command is expressed, unless a different default +command is set with SetDefaultCommand. + +Example: + + +from mx import DateTime + + +class CmdDate(appcommands.Cmd): + \"\"\"This docstring contains the help for the date command.\"\"\" + + def Run(self, argv): + print DateTime.now() + + +def main(argv): + appcommands.AddCmd('date', CmdDate, command_aliases=['data_now']) + + +if __name__ == '__main__': + appcommands.Run() + + +In the above example the name of the registered command on the command line is +'date'. Thus, to get the date you would execute: + tool date +The above example also added the command alias 'data_now' which allows to +replace 'tool date' with 'tool data_now'. + +To get a list of available commands run: + tool help +For help with a specific command, you would execute: + tool help date +For help on flags run one of the following: + tool --help +Note that 'tool --help' gives you information on global flags, just like for +applications that do not use appcommand. Likewise 'tool --helpshort' and the +other help-flags from app.py are also available. + +The above example also demonstrates that you only have to call + appcommands.Run() +and register your commands in main() to initialize your program with appcommands +(and app). + +Handling of flags: + Flags can be registered just as with any other google tool using flags.py. + In addition you can also provide command specific flags. To do so simply add + flags registering code into the __init__ function of your Cmd classes passing + parameter flag_values to any flags registering calls. These flags will get + copied to the global flag list, so that once the command is detected they + behave just like any other flag. That means these flags won't be available + for other commands. Note that it is possible to register flags with more + than one command. + +Getting help: + This module activates formatting and wrapping to help output. That is + the main difference to help created from app.py. So just as with app.py, + appcommands.py will create help from the main modules main __doc__. + But it adds the new 'help' command that allows you to get a list of + all available commands. Each command's help will be followed by the + registered command specific flags along with their defaults and help. + After help for all commands there will also be a list of all registered + global flags with their defaults and help. + + The text for the command's help can best be supplied by overwriting the + __doc__ property of the Cmd classes for commands registered with AddCmd() or + the __doc__ property of command functions registered AddCmdFunc(). + +Inner working: + This module interacts with app.py by replacing its inner start dispatcher. + The replacement version basically does the same, registering help flags, + checking whether help flags were present, and calling the main module's main + function. However unlike app.py, this module epxpects main() to only register + commands and then to return. After having all commands registered + appcommands.py will then parse the remaining arguments for any registered + command. If one is found it will get executed. Otherwise a short usage info + will be displayed. + + Each provided command must be an instance of Cmd. If commands get registered + from global functions using AddCmdFunc() then the helper class _FunctionalCmd + will be used in the registering process. +""" + + + +import os +import pdb +import sys +import traceback + +from google.apputils import app +import gflags as flags + +FLAGS = flags.FLAGS + + +# module exceptions: +class AppCommandsError(Exception): + """The base class for all flags errors.""" + pass + + +_cmd_argv = None # remaining arguments with index 0 = sys.argv[0] +_cmd_list = {} # list of commands index by name (_Cmd instances) +_cmd_alias_list = {} # list of command_names index by command_alias +_cmd_default = 'help' # command to execute if none explicitly given + + +def GetAppBasename(): + """Returns the friendly basename of this application.""" + return os.path.basename(sys.argv[0]) + + +def ShortHelpAndExit(message=None): + """Display optional message, followed by a note on how to get help, then exit. + + Args: + message: optional message to display + """ + sys.stdout.flush() + if message is not None: + sys.stderr.write('%s\n' % message) + sys.stderr.write("Run '%s help' to get help\n" % GetAppBasename()) + sys.exit(1) + + +def GetCommandList(): + """Return list of registered commands.""" + # pylint: disable=global-variable-not-assigned + global _cmd_list + return _cmd_list + + +def GetCommandAliasList(): + """Return list of registered command aliases.""" + # pylint: disable=global-variable-not-assigned + global _cmd_alias_list + return _cmd_alias_list + + +def GetFullCommandList(): + """Return list of registered commands, including aliases.""" + all_cmds = dict(GetCommandList()) + for cmd_alias, cmd_name in GetCommandAliasList().iteritems(): + all_cmds[cmd_alias] = all_cmds.get(cmd_name) + return all_cmds + + +def GetCommandByName(name): + """Get the command or None if name is not a registered command. + + Args: + name: name of command to look for + + Returns: + Cmd instance holding the command or None + """ + return GetCommandList().get(GetCommandAliasList().get(name)) + + +def GetCommandArgv(): + """Return list of remaining args.""" + return _cmd_argv + + +def GetMaxCommandLength(): + """Returns the length of the longest registered command.""" + return max([len(cmd_name) for cmd_name in GetCommandList()]) + + +class Cmd(object): + """Abstract class describing and implementing a command. + + When creating code for a command, at least you have to derive this class + and override method Run(). The other methods of this class might be + overridden as well. Check their documentation for details. If the command + needs any specific flags, use __init__ for registration. + """ + + def __init__(self, name, flag_values, command_aliases=None, + all_commands_help=None, help_full=None): + """Initialize and check whether self is actually a Cmd instance. + + This can be used to register command specific flags. If you do so + remember that you have to provide the 'flag_values=flag_values' + parameter to any flags.DEFINE_*() call. + + Args: + name: Name of the command + flag_values: FlagValues() instance that needs to be passed as + flag_values parameter to any flags registering call. + command_aliases: A list of aliases that the command can be run as. + all_commands_help: A short description of the command that is shown when + the user requests help for all commands at once. + help_full: A long description of the command and usage that is + shown when the user requests help for just this + command. If unspecified, the command's docstring is + used instead. + + Raises: + AppCommandsError: if self is Cmd (Cmd is abstract) + """ + self._command_name = name + self._command_aliases = command_aliases + self._command_flags = flag_values + self._all_commands_help = all_commands_help + self._help_full = help_full + if type(self) is Cmd: + raise AppCommandsError('Cmd is abstract and cannot be instantiated') + + def Run(self, unused_argv): + """Execute the command. Must be provided by the implementing class. + + Args: + unused_argv: Remaining command line arguments after parsing flags and + command (in other words, a copy of sys.argv at the time of + the function call with all parsed flags removed). + + Returns: + 0 for success, anything else for failure (must return with integer). + Alternatively you may return None (or not use a return statement at all). + + Raises: + AppCommandsError: Always, as in must be overwritten + """ + raise AppCommandsError('%s.%s.Run() is not implemented' % ( + type(self).__module__, type(self).__name__)) + + def CommandRun(self, argv): + """Execute the command with given arguments. + + First register and parse additional flags. Then run the command. + + Returns: + Command return value. + + Args: + argv: Remaining command line arguments after parsing command and flags + (that is a copy of sys.argv at the time of the function call with + all parsed flags removed). + """ + # Register flags global when run normally + FLAGS.AppendFlagValues(self._command_flags) + # Prepare flags parsing, to redirect help, to show help for command + orig_app_usage = app.usage + + def ReplacementAppUsage(shorthelp=0, writeto_stdout=1, detailed_error=None, + exitcode=None): + AppcommandsUsage(shorthelp, writeto_stdout, detailed_error, + exitcode=exitcode, show_cmd=self._command_name, + show_global_flags=True) + app.usage = ReplacementAppUsage + # Parse flags and restore app.usage afterwards + try: + try: + argv = ParseFlagsWithUsage(argv) + # Run command + ret = self.Run(argv) + if ret is None: + ret = 0 + else: + assert isinstance(ret, int) + return ret + except app.UsageError, error: + app.usage(shorthelp=1, detailed_error=error, exitcode=error.exitcode) + except: + if FLAGS.pdb_post_mortem: + traceback.print_exc() + pdb.post_mortem() + raise + finally: + # Restore app.usage and remove this command's flags from the global flags. + app.usage = orig_app_usage + for flag_name in self._command_flags.FlagDict(): + delattr(FLAGS, flag_name) + + def CommandGetHelp(self, unused_argv, cmd_names=None): + """Get help string for command. + + Args: + unused_argv: Remaining command line flags and arguments after parsing + command (that is a copy of sys.argv at the time of the + function call with all parsed flags removed); unused in this + default implementation, but may be used in subclasses. + cmd_names: Complete list of commands for which help is being shown at + the same time. This is used to determine whether to return + _all_commands_help, or the command's docstring. + (_all_commands_help is used, if not None, when help is being + shown for more than one command, otherwise the command's + docstring is used.) + + Returns: + Help string, one of the following (by order): + - Result of the registered 'help' function (if any) + - Doc string of the Cmd class (if any) + - Default fallback string + """ + if (type(cmd_names) is list and len(cmd_names) > 1 and + self._all_commands_help is not None): + return flags.DocToHelp(self._all_commands_help) + elif self._help_full is not None: + return flags.DocToHelp(self._help_full) + elif self.__doc__: + return flags.DocToHelp(self.__doc__) + else: + return 'No help available' + + def CommandGetAliases(self): + """Get aliases for command. + + Returns: + aliases: list of aliases for the command. + """ + return self._command_aliases + + def CommandGetName(self): + """Get name of command. + + Returns: + Command name. + """ + return self._command_name + + +class _FunctionalCmd(Cmd): + """Class to wrap functions as CMD instances. + + Args: + cmd_func: command function + """ + + def __init__(self, name, flag_values, cmd_func, **kargs): + """Create a functional command. + + Args: + name: Name of command + flag_values: FlagValues() instance that needs to be passed as flag_values + parameter to any flags registering call. + cmd_func: Function to call when command is to be executed. + **kargs: Additional keyword arguments to be passed to the + superclass constructor. + """ + if 'help_full' not in kargs: + kargs['help_full'] = cmd_func.__doc__ + super(_FunctionalCmd, self).__init__(name, flag_values, **kargs) + self._cmd_func = cmd_func + + def Run(self, argv): + """Execute the command with given arguments. + + Args: + argv: Remaining command line flags and arguments after parsing command + (that is a copy of sys.argv at the time of the function call with + all parsed flags removed). + + Returns: + Command return value. + """ + return self._cmd_func(argv) + + +def _AddCmdInstance(command_name, cmd, command_aliases=None, **_): + """Add a command from a Cmd instance. + + Args: + command_name: name of the command which will be used in argument parsing + cmd: Cmd instance to register + command_aliases: A list of command aliases that the command can be run as. + + Raises: + AppCommandsError: If cmd is not a subclass of Cmd. + AppCommandsError: If name is already registered OR name is not a string OR + name is too short OR name does not start with a letter OR + name contains any non alphanumeric characters besides + '_'. + """ + # Update global command list. + # pylint: disable=global-variable-not-assigned + global _cmd_list + global _cmd_alias_list + if not issubclass(cmd.__class__, Cmd): + raise AppCommandsError('Command must be an instance of commands.Cmd') + + for name in [command_name] + (command_aliases or []): + _CheckCmdName(name) + _cmd_alias_list[name] = command_name + + _cmd_list[command_name] = cmd + + +def _CheckCmdName(name_or_alias): + """Only allow strings for command names and aliases (reject unicode as well). + + Args: + name_or_alias: properly formatted string name or alias. + + Raises: + AppCommandsError: If name is already registered OR name is not a string OR + name is too short OR name does not start with a letter OR + name contains any non alphanumeric characters besides + '_'. + """ + if name_or_alias in GetCommandAliasList(): + raise AppCommandsError("Command or Alias '%s' already defined" % + name_or_alias) + if not isinstance(name_or_alias, str) or len(name_or_alias) <= 1: + raise AppCommandsError("Command '%s' not a string or too short" + % str(name_or_alias)) + if not name_or_alias[0].isalpha(): + raise AppCommandsError("Command '%s' does not start with a letter" + % name_or_alias) + if [c for c in name_or_alias if not (c.isalnum() or c == '_')]: + raise AppCommandsError("Command '%s' contains non alphanumeric characters" + % name_or_alias) + + +def AddCmd(command_name, cmd_factory, **kwargs): + """Add a command from a Cmd subclass or factory. + + Args: + command_name: name of the command which will be used in argument parsing + cmd_factory: A callable whose arguments match those of Cmd.__init__ and + returns a Cmd. In the simplest case this is just a subclass + of Cmd. + **kwargs: Additional keyword arguments to be passed to the + cmd_factory at initialization. Also passed to + _AddCmdInstance to catch command_aliases. + + Raises: + AppCommandsError: if calling cmd_factory does not return an instance of Cmd. + """ + cmd = cmd_factory(command_name, flags.FlagValues(), **kwargs) + + if not isinstance(cmd, Cmd): + raise AppCommandsError('Command must be an instance of commands.Cmd') + + _AddCmdInstance(command_name, cmd, **kwargs) + + +def AddCmdFunc(command_name, cmd_func, command_aliases=None, + all_commands_help=None): + """Add a new command to the list of registered commands. + + Args: + command_name: name of the command which will be used in argument + parsing + cmd_func: command function, this function received the remaining + arguments as its only parameter. It is supposed to do the + command work and then return with the command result that + is being used as the shell exit code. + command_aliases: A list of command aliases that the command can be run as. + all_commands_help: Help message to be displayed in place of func.__doc__ + when all commands are displayed. + """ + _AddCmdInstance(command_name, + _FunctionalCmd(command_name, flags.FlagValues(), cmd_func, + command_aliases=command_aliases, + all_commands_help=all_commands_help), + command_aliases=command_aliases) + + +class _CmdHelp(Cmd): + """Standard help command. + + Allows to provide help for all or specific commands. + """ + + def __init__(self, *args, **kwargs): + if 'help_full' not in kwargs: + kwargs['help_full'] = ( + 'Help for all or selected command:\n' + '\t%(prog)s help []\n\n' + 'To retrieve help with global flags:\n' + '\t%(prog)s --help\n\n' + 'To retrieve help with flags only from the main module:\n' + '\t%(prog)s --helpshort []\n\n' + % {'prog': GetAppBasename()}) + super(_CmdHelp, self).__init__(*args, **kwargs) + + def Run(self, argv): + """Execute help command. + + If an argument is given and that argument is a registered command + name, then help specific to that command is being displayed. + If the command is unknown then a fatal error will be displayed. If + no argument is present then help for all commands will be presented. + + If a specific command help is being generated, the list of commands is + temporarily replaced with one containing only that command. Thus the call + to usage() will only show help for that command. Otherwise call usage() + will show help for all registered commands as it sees all commands. + + Args: + argv: Remaining command line flags and arguments after parsing command + (that is a copy of sys.argv at the time of the function call with + all parsed flags removed). + So argv[0] is the program and argv[1] will be the first argument to + the call. For instance 'tool.py help command' will result in argv + containing ('tool.py', 'command'). In this case the list of + commands is searched for 'command'. + + Returns: + 1 for failure + """ + if len(argv) > 1 and argv[1] in GetFullCommandList(): + show_cmd = argv[1] + else: + show_cmd = None + AppcommandsUsage(shorthelp=0, writeto_stdout=1, detailed_error=None, + exitcode=1, show_cmd=show_cmd, show_global_flags=False) + + +def GetSynopsis(): + """Get synopsis for program. + + Returns: + Synopsis including program basename. + """ + return '%s [--global_flags] [--command_flags] [args]' % ( + GetAppBasename()) + + +def _UsageFooter(detailed_error, cmd_names): + """Output a footer at the end of usage or help output. + + Args: + detailed_error: additional detail about why usage info was presented. + cmd_names: list of command names for which help was shown or None. + Returns: + Generated footer that contains 'Run..' messages if appropriate. + """ + footer = [] + if not cmd_names or len(cmd_names) == 1: + footer.append("Run '%s help' to see the list of available commands." + % GetAppBasename()) + if not cmd_names or len(cmd_names) == len(GetCommandList()): + footer.append("Run '%s help ' to get help for ." + % GetAppBasename()) + if detailed_error is not None: + if footer: + footer.append('') + footer.append('%s' % detailed_error) + return '\n'.join(footer) + + +def AppcommandsUsage(shorthelp=0, writeto_stdout=0, detailed_error=None, + exitcode=None, show_cmd=None, show_global_flags=False): + """Output usage or help information. + + Extracts the __doc__ string from the __main__ module and writes it to + stderr. If that string contains a '%s' then that is replaced by the command + pathname. Otherwise a default usage string is being generated. + + The output varies depending on the following: + - FLAGS.help + - FLAGS.helpshort + - show_cmd + - show_global_flags + + Args: + shorthelp: print only command and main module flags, rather than all. + writeto_stdout: write help message to stdout, rather than to stderr. + detailed_error: additional details about why usage info was presented. + exitcode: if set, exit with this status code after writing help. + show_cmd: show help for this command only (name of command). + show_global_flags: show help for global flags. + """ + if writeto_stdout: + stdfile = sys.stdout + else: + stdfile = sys.stderr + + prefix = ''.rjust(GetMaxCommandLength() + 2) + # Deal with header, containing general tool documentation + doc = sys.modules['__main__'].__doc__ + if doc: + help_msg = flags.DocToHelp(doc.replace('%s', sys.argv[0])) + stdfile.write(flags.TextWrap(help_msg, flags.GetHelpWidth())) + stdfile.write('\n\n\n') + if not doc or doc.find('%s') == -1: + synopsis = 'USAGE: ' + GetSynopsis() + stdfile.write(flags.TextWrap(synopsis, flags.GetHelpWidth(), ' ', + '')) + stdfile.write('\n\n\n') + # Special case just 'help' registered, that means run as 'tool --help'. + if len(GetCommandList()) == 1: + cmd_names = [] + else: + # Show list of commands + if show_cmd is None or show_cmd == 'help': + cmd_names = GetCommandList().keys() + cmd_names.sort() + stdfile.write('Any of the following commands:\n') + doc = ', '.join(cmd_names) + stdfile.write(flags.TextWrap(doc, flags.GetHelpWidth(), ' ')) + stdfile.write('\n\n\n') + # Prepare list of commands to show help for + if show_cmd is not None: + cmd_names = [show_cmd] # show only one command + elif FLAGS.help or FLAGS.helpshort or shorthelp: + cmd_names = [] + else: + cmd_names = GetCommandList().keys() # show all commands + cmd_names.sort() + # Show the command help (none, one specific, or all) + for name in cmd_names: + command = GetCommandByName(name) + try: + cmd_help = command.CommandGetHelp(GetCommandArgv(), cmd_names=cmd_names) + except Exception as error: # pylint: disable=broad-except + cmd_help = "Internal error for command '%s': %s." % (name, str(error)) + cmd_help = cmd_help.strip() + all_names = ', '.join( + [command.CommandGetName()] + (command.CommandGetAliases() or [])) + if len(all_names) + 1 >= len(prefix) or not cmd_help: + # If command/alias list would reach over help block-indent + # start the help block on a new line. + stdfile.write(flags.TextWrap(all_names, flags.GetHelpWidth())) + stdfile.write('\n') + prefix1 = prefix + else: + prefix1 = all_names.ljust(GetMaxCommandLength() + 2) + if cmd_help: + stdfile.write(flags.TextWrap(cmd_help, flags.GetHelpWidth(), prefix, + prefix1)) + stdfile.write('\n\n') + else: + stdfile.write('\n') + # When showing help for exactly one command we show its flags + if len(cmd_names) == 1: + # Need to register flags for command prior to be able to use them. + # We do not register them globally so that they do not reappear. + # pylint: disable=protected-access + cmd_flags = command._command_flags + if cmd_flags.RegisteredFlags(): + stdfile.write('%sFlags for %s:\n' % (prefix, name)) + stdfile.write(cmd_flags.GetHelp(prefix+' ')) + stdfile.write('\n\n') + stdfile.write('\n') + # Now show global flags as asked for + if show_global_flags: + stdfile.write('Global flags:\n') + if shorthelp: + stdfile.write(FLAGS.MainModuleHelp()) + else: + stdfile.write(FLAGS.GetHelp()) + stdfile.write('\n') + else: + stdfile.write("Run '%s --help' to get help for global flags." + % GetAppBasename()) + stdfile.write('\n%s\n' % _UsageFooter(detailed_error, cmd_names)) + if exitcode is not None: + sys.exit(exitcode) + + +def ParseFlagsWithUsage(argv): + """Parse the flags, exiting (after printing usage) if they are unparseable. + + Args: + argv: command line arguments + + Returns: + remaining command line arguments after parsing flags + """ + # Update the global commands. + # pylint: disable=global-statement + global _cmd_argv + try: + _cmd_argv = FLAGS(argv) + return _cmd_argv + except flags.FlagsError, error: + ShortHelpAndExit('FATAL Flags parsing error: %s' % error) + + +def GetCommand(command_required): + """Get the command or return None (or issue an error) if there is none. + + Args: + command_required: whether to issue an error if no command is present + + Returns: + command or None, if command_required is True then return value is a valid + command or the program will exit. The program also exits if a command was + specified but that command does not exist. + """ + # Update the global commands. + # pylint: disable=global-statement + global _cmd_argv + _cmd_argv = ParseFlagsWithUsage(_cmd_argv) + if len(_cmd_argv) < 2: + if command_required: + ShortHelpAndExit('FATAL Command expected but none given') + return None + command = GetCommandByName(_cmd_argv[1]) + if command is None: + ShortHelpAndExit("FATAL Command '%s' unknown" % _cmd_argv[1]) + del _cmd_argv[1] + return command + + +def SetDefaultCommand(default_command): + """Change the default command to execute if none is explicitly given. + + Args: + default_command: str, the name of the command to execute by default. + """ + # pylint: disable=global-statement,g-bad-name + global _cmd_default + _cmd_default = default_command + + +def _CommandsStart(unused_argv): + """Main initialization. + + Calls __main__.main(), and then the command indicated by the first + non-flag argument, or 'help' if no argument was given. (The command + to execute if no flag is given can be changed via SetDefaultCommand). + + Only non-flag arguments are passed to main(). If main does not call + sys.exit, the return value of the command is used as the exit status. + """ + # The following is supposed to return after registering additional commands + try: + sys.modules['__main__'].main(GetCommandArgv()) + # If sys.exit was called, return with error code. + except SystemExit, e: + sys.exit(e.code) + except Exception, error: + traceback.print_exc() # Print a backtrace to stderr. + ShortHelpAndExit('\nFATAL error in main: %s' % error) + + if len(GetCommandArgv()) > 1: + command = GetCommand(command_required=True) + else: + command = GetCommandByName(_cmd_default) + if command is None: + ShortHelpAndExit("FATAL Command '%s' unknown" % _cmd_default) + sys.exit(command.CommandRun(GetCommandArgv())) + + +def Run(): + """This must be called from __main__ modules main, instead of app.run(). + + app.run will base its actions on its stacktrace. + + Returns: + app.run() + """ + app.parse_flags_with_usage = ParseFlagsWithUsage + original_really_start = app.really_start + + def InterceptReallyStart(): + original_really_start(main=_CommandsStart) + app.really_start = InterceptReallyStart + app.usage = _ReplacementAppUsage + return app.run() + + +# Always register 'help' command +AddCmd('help', _CmdHelp) + + +def _ReplacementAppUsage(shorthelp=0, writeto_stdout=0, detailed_error=None, + exitcode=None): + AppcommandsUsage(shorthelp, writeto_stdout, detailed_error, exitcode=exitcode, + show_cmd=None, show_global_flags=True) + + +if __name__ == '__main__': + Run() diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/basetest.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/basetest.py new file mode 100644 index 0000000..58b8152 --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/basetest.py @@ -0,0 +1,1644 @@ +#!/usr/bin/env python +# Copyright 2010 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Base functionality for google tests. + +This module contains base classes and high-level functions for Google-style +tests. +""" + +__author__ = 'dborowitz@google.com (Dave Borowitz)' + +import collections +import difflib +import getpass +import itertools +import json +import os +import re +import signal +import subprocess +import sys +import tempfile +import types +import unittest +import urlparse + +try: + import faulthandler # pylint: disable=g-import-not-at-top +except ImportError: + # //testing/pybase:pybase can't have deps on any extension modules as it + # is used by code that is executed in such a way it cannot import them. :( + # We use faulthandler if it is available (either via a user declared dep + # or from the Python 3.3+ standard library). + faulthandler = None + +from google.apputils import app # pylint: disable=g-import-not-at-top +import gflags as flags +from google.apputils import shellutil + +FLAGS = flags.FLAGS + +# ---------------------------------------------------------------------- +# Internal functions to extract default flag values from environment. +# ---------------------------------------------------------------------- +def _GetDefaultTestRandomSeed(): + random_seed = 301 + value = os.environ.get('TEST_RANDOM_SEED', '') + try: + random_seed = int(value) + except ValueError: + pass + return random_seed + + +def _GetDefaultTestTmpdir(): + """Get default test temp dir.""" + tmpdir = os.environ.get('TEST_TMPDIR', '') + if not tmpdir: + tmpdir = os.path.join(tempfile.gettempdir(), 'google_apputils_basetest') + + return tmpdir + + +flags.DEFINE_integer('test_random_seed', _GetDefaultTestRandomSeed(), + 'Random seed for testing. Some test frameworks may ' + 'change the default value of this flag between runs, so ' + 'it is not appropriate for seeding probabilistic tests.', + allow_override=1) +flags.DEFINE_string('test_srcdir', + os.environ.get('TEST_SRCDIR', ''), + 'Root of directory tree where source files live', + allow_override=1) +flags.DEFINE_string('test_tmpdir', _GetDefaultTestTmpdir(), + 'Directory for temporary testing files', + allow_override=1) + + +# We might need to monkey-patch TestResult so that it stops considering an +# unexpected pass as a as a "successful result". For details, see +# http://bugs.python.org/issue20165 +def _MonkeyPatchTestResultForUnexpectedPasses(): + """Workaround for .""" + + # pylint: disable=g-doc-return-or-yield,g-doc-args,g-wrong-blank-lines + + def wasSuccessful(self): + """Tells whether or not this result was a success. + + Any unexpected pass is to be counted as a non-success. + """ + return (len(self.failures) == len(self.errors) == + len(self.unexpectedSuccesses) == 0) + + # pylint: enable=g-doc-return-or-yield,g-doc-args,g-wrong-blank-lines + + test_result = unittest.result.TestResult() + test_result.addUnexpectedSuccess('test') + if test_result.wasSuccessful(): # The bug is present. + unittest.result.TestResult.wasSuccessful = wasSuccessful + if test_result.wasSuccessful(): # Warn the user if our hot-fix failed. + sys.stderr.write('unittest.result.TestResult monkey patch to report' + ' unexpected passes as failures did not work.\n') + + +_MonkeyPatchTestResultForUnexpectedPasses() + + +class TestCase(unittest.TestCase): + """Extension of unittest.TestCase providing more powerful assertions.""" + + maxDiff = 80 * 20 + + def __init__(self, methodName='runTest'): + super(TestCase, self).__init__(methodName) + self.__recorded_properties = {} + + def shortDescription(self): + """Format both the test method name and the first line of its docstring. + + If no docstring is given, only returns the method name. + + This method overrides unittest.TestCase.shortDescription(), which + only returns the first line of the docstring, obscuring the name + of the test upon failure. + + Returns: + desc: A short description of a test method. + """ + desc = str(self) + # NOTE: super() is used here instead of directly invoking + # unittest.TestCase.shortDescription(self), because of the + # following line that occurs later on: + # unittest.TestCase = TestCase + # Because of this, direct invocation of what we think is the + # superclass will actually cause infinite recursion. + doc_first_line = super(TestCase, self).shortDescription() + if doc_first_line is not None: + desc = '\n'.join((desc, doc_first_line)) + return desc + + def assertStartsWith(self, actual, expected_start): + """Assert that actual.startswith(expected_start) is True. + + Args: + actual: str + expected_start: str + """ + if not actual.startswith(expected_start): + self.fail('%r does not start with %r' % (actual, expected_start)) + + def assertNotStartsWith(self, actual, unexpected_start): + """Assert that actual.startswith(unexpected_start) is False. + + Args: + actual: str + unexpected_start: str + """ + if actual.startswith(unexpected_start): + self.fail('%r does start with %r' % (actual, unexpected_start)) + + def assertEndsWith(self, actual, expected_end): + """Assert that actual.endswith(expected_end) is True. + + Args: + actual: str + expected_end: str + """ + if not actual.endswith(expected_end): + self.fail('%r does not end with %r' % (actual, expected_end)) + + def assertNotEndsWith(self, actual, unexpected_end): + """Assert that actual.endswith(unexpected_end) is False. + + Args: + actual: str + unexpected_end: str + """ + if actual.endswith(unexpected_end): + self.fail('%r does end with %r' % (actual, unexpected_end)) + + def assertSequenceStartsWith(self, prefix, whole, msg=None): + """An equality assertion for the beginning of ordered sequences. + + If prefix is an empty sequence, it will raise an error unless whole is also + an empty sequence. + + If prefix is not a sequence, it will raise an error if the first element of + whole does not match. + + Args: + prefix: A sequence expected at the beginning of the whole parameter. + whole: The sequence in which to look for prefix. + msg: Optional message to append on failure. + """ + try: + prefix_len = len(prefix) + except (TypeError, NotImplementedError): + prefix = [prefix] + prefix_len = 1 + + try: + whole_len = len(whole) + except (TypeError, NotImplementedError): + self.fail('For whole: len(%s) is not supported, it appears to be type: ' + '%s' % (whole, type(whole))) + + assert prefix_len <= whole_len, ( + 'Prefix length (%d) is longer than whole length (%d).' % + (prefix_len, whole_len)) + + if not prefix_len and whole_len: + self.fail('Prefix length is 0 but whole length is %d: %s' % + (len(whole), whole)) + + try: + self.assertSequenceEqual(prefix, whole[:prefix_len], msg) + except AssertionError: + self.fail(msg or 'prefix: %s not found at start of whole: %s.' % + (prefix, whole)) + + def assertContainsSubset(self, expected_subset, actual_set, msg=None): + """Checks whether actual iterable is a superset of expected iterable.""" + missing = set(expected_subset) - set(actual_set) + if not missing: + return + + missing_msg = 'Missing elements %s\nExpected: %s\nActual: %s' % ( + missing, expected_subset, actual_set) + if msg: + msg += ': %s' % missing_msg + else: + msg = missing_msg + self.fail(msg) + + def assertNoCommonElements(self, expected_seq, actual_seq, msg=None): + """Checks whether actual iterable and expected iterable are disjoint.""" + common = set(expected_seq) & set(actual_seq) + if not common: + return + + common_msg = 'Common elements %s\nExpected: %s\nActual: %s' % ( + common, expected_seq, actual_seq) + if msg: + msg += ': %s' % common_msg + else: + msg = common_msg + self.fail(msg) + + # TODO(user): Provide an assertItemsEqual method when our super class + # does not provide one. That method went away in Python 3.2 (renamed + # to assertCountEqual, or is that different? investigate). + + def assertItemsEqual(self, *args, **kwargs): + # pylint: disable=g-doc-args + """An unordered sequence specific comparison. + + It asserts that actual_seq and expected_seq have the same element counts. + Equivalent to:: + + self.assertEqual(Counter(iter(actual_seq)), + Counter(iter(expected_seq))) + + Asserts that each element has the same count in both sequences. + Example: + - [0, 1, 1] and [1, 0, 1] compare equal. + - [0, 0, 1] and [0, 1] compare unequal. + + Args: + expected_seq: A sequence containing elements we are expecting. + actual_seq: The sequence that we are testing. + msg: The message to be printed if the test fails. + """ + # pylint: enable=g-doc-args + # In Python 3k this method is called assertCountEqual() + if sys.version_info.major > 2: + self.assertItemsEqual = super(TestCase, self).assertCountEqual + self.assertItemsEqual(*args, **kwargs) + return + # For Python 2.x we must check for the issue below + super_assert_items_equal = super(TestCase, self).assertItemsEqual + try: + super_assert_items_equal([23], []) # Force a fail to check behavior. + except self.failureException as error_to_introspect: + if 'First has 0, Second has 1: 23' in str(error_to_introspect): + # It exhibits http://bugs.python.org/issue14832 + # Always use our repaired method that swaps the arguments. + self.assertItemsEqual = self._FixedAssertItemsEqual + else: + # It exhibits correct behavior. Always use the super's method. + self.assertItemsEqual = super_assert_items_equal + # Delegate this call to the correct method. All future calls will skip + # this error patching code. + self.assertItemsEqual(*args, **kwargs) + assert 'Impossible: TestCase assertItemsEqual is broken.' + + def _FixedAssertItemsEqual(self, expected_seq, actual_seq, msg=None): + """A version of assertItemsEqual that works around issue14832.""" + super(TestCase, self).assertItemsEqual(actual_seq, expected_seq, msg=msg) + + def assertCountEqual(self, *args, **kwargs): + # pylint: disable=g-doc-args + """An unordered sequence specific comparison. + + Equivalent to assertItemsEqual(). This method is a compatibility layer + for Python 3k, since 2to3 does not convert assertItemsEqual() calls into + assertCountEqual() calls. + + Args: + expected_seq: A sequence containing elements we are expecting. + actual_seq: The sequence that we are testing. + msg: The message to be printed if the test fails. + """ + # pylint: enable=g-doc-args + self.assertItemsEqual(*args, **kwargs) + + def assertSameElements(self, expected_seq, actual_seq, msg=None): + """Assert that two sequences have the same elements (in any order). + + This method, unlike assertItemsEqual, doesn't care about any + duplicates in the expected and actual sequences. + + >> assertSameElements([1, 1, 1, 0, 0, 0], [0, 1]) + # Doesn't raise an AssertionError + + If possible, you should use assertItemsEqual instead of + assertSameElements. + + Args: + expected_seq: A sequence containing elements we are expecting. + actual_seq: The sequence that we are testing. + msg: The message to be printed if the test fails. + """ + # `unittest2.TestCase` used to have assertSameElements, but it was + # removed in favor of assertItemsEqual. As there's a unit test + # that explicitly checks this behavior, I am leaving this method + # alone. + # Fail on strings: empirically, passing strings to this test method + # is almost always a bug. If comparing the character sets of two strings + # is desired, cast the inputs to sets or lists explicitly. + if (isinstance(expected_seq, basestring) or + isinstance(actual_seq, basestring)): + self.fail('Passing a string to assertSameElements is usually a bug. ' + 'Did you mean to use assertEqual?\n' + 'Expected: %s\nActual: %s' % (expected_seq, actual_seq)) + try: + expected = dict([(element, None) for element in expected_seq]) + actual = dict([(element, None) for element in actual_seq]) + missing = [element for element in expected if element not in actual] + unexpected = [element for element in actual if element not in expected] + missing.sort() + unexpected.sort() + except TypeError: + # Fall back to slower list-compare if any of the objects are + # not hashable. + expected = list(expected_seq) + actual = list(actual_seq) + expected.sort() + actual.sort() + missing, unexpected = _SortedListDifference(expected, actual) + errors = [] + if missing: + errors.append('Expected, but missing:\n %r\n' % missing) + if unexpected: + errors.append('Unexpected, but present:\n %r\n' % unexpected) + if errors: + self.fail(msg or ''.join(errors)) + + # unittest2.TestCase.assertMulitilineEqual works very similarly, but it + # has a different error format. However, I find this slightly more readable. + def assertMultiLineEqual(self, first, second, msg=None): + """Assert that two multi-line strings are equal.""" + assert isinstance(first, types.StringTypes), ( + 'First argument is not a string: %r' % (first,)) + assert isinstance(second, types.StringTypes), ( + 'Second argument is not a string: %r' % (second,)) + + if first == second: + return + if msg: + failure_message = [msg, ':\n'] + else: + failure_message = ['\n'] + for line in difflib.ndiff(first.splitlines(True), second.splitlines(True)): + failure_message.append(line) + if not line.endswith('\n'): + failure_message.append('\n') + raise self.failureException(''.join(failure_message)) + + def assertBetween(self, value, minv, maxv, msg=None): + """Asserts that value is between minv and maxv (inclusive).""" + if msg is None: + msg = '"%r" unexpectedly not between "%r" and "%r"' % (value, minv, maxv) + self.assert_(minv <= value, msg) + self.assert_(maxv >= value, msg) + + def assertRegexMatch(self, actual_str, regexes, message=None): + # pylint: disable=g-doc-bad-indent + """Asserts that at least one regex in regexes matches str. + + If possible you should use assertRegexpMatches, which is a simpler + version of this method. assertRegexpMatches takes a single regular + expression (a string or re compiled object) instead of a list. + + Notes: + 1. This function uses substring matching, i.e. the matching + succeeds if *any* substring of the error message matches *any* + regex in the list. This is more convenient for the user than + full-string matching. + + 2. If regexes is the empty list, the matching will always fail. + + 3. Use regexes=[''] for a regex that will always pass. + + 4. '.' matches any single character *except* the newline. To + match any character, use '(.|\n)'. + + 5. '^' matches the beginning of each line, not just the beginning + of the string. Similarly, '$' matches the end of each line. + + 6. An exception will be thrown if regexes contains an invalid + regex. + + Args: + actual_str: The string we try to match with the items in regexes. + regexes: The regular expressions we want to match against str. + See "Notes" above for detailed notes on how this is interpreted. + message: The message to be printed if the test fails. + """ + # pylint: enable=g-doc-bad-indent + if isinstance(regexes, basestring): + self.fail('regexes is a string; use assertRegexpMatches instead.') + if not regexes: + self.fail('No regexes specified.') + + regex_type = type(regexes[0]) + for regex in regexes[1:]: + if type(regex) is not regex_type: + self.fail('regexes list must all be the same type.') + + if regex_type is bytes and isinstance(actual_str, unicode): + regexes = [regex.decode('utf-8') for regex in regexes] + regex_type = unicode + elif regex_type is unicode and isinstance(actual_str, bytes): + regexes = [regex.encode('utf-8') for regex in regexes] + regex_type = bytes + + if regex_type is unicode: + regex = u'(?:%s)' % u')|(?:'.join(regexes) + elif regex_type is bytes: + regex = b'(?:' + (b')|(?:'.join(regexes)) + b')' + else: + self.fail('Only know how to deal with unicode str or bytes regexes.') + + if not re.search(regex, actual_str, re.MULTILINE): + self.fail(message or ('"%s" does not contain any of these ' + 'regexes: %s.' % (actual_str, regexes))) + + def assertCommandSucceeds(self, command, regexes=(b'',), env=None, + close_fds=True): + """Asserts that a shell command succeeds (i.e. exits with code 0). + + Args: + command: List or string representing the command to run. + regexes: List of regular expression byte strings that match success. + env: Dictionary of environment variable settings. + close_fds: Whether or not to close all open fd's in the child after + forking. + """ + (ret_code, err) = GetCommandStderr(command, env, close_fds) + + # Accommodate code which listed their output regexes w/o the b'' prefix by + # converting them to bytes for the user. + if isinstance(regexes[0], unicode): + regexes = [regex.encode('utf-8') for regex in regexes] + + command_string = GetCommandString(command) + self.assertEqual( + ret_code, 0, + 'Running command\n' + '%s failed with error code %s and message\n' + '%s' % ( + _QuoteLongString(command_string), + ret_code, + _QuoteLongString(err))) + self.assertRegexMatch( + err, + regexes, + message=( + 'Running command\n' + '%s failed with error code %s and message\n' + '%s which matches no regex in %s' % ( + _QuoteLongString(command_string), + ret_code, + _QuoteLongString(err), + regexes))) + + def assertCommandFails(self, command, regexes, env=None, close_fds=True): + """Asserts a shell command fails and the error matches a regex in a list. + + Args: + command: List or string representing the command to run. + regexes: the list of regular expression strings. + env: Dictionary of environment variable settings. + close_fds: Whether or not to close all open fd's in the child after + forking. + """ + (ret_code, err) = GetCommandStderr(command, env, close_fds) + + # Accommodate code which listed their output regexes w/o the b'' prefix by + # converting them to bytes for the user. + if isinstance(regexes[0], unicode): + regexes = [regex.encode('utf-8') for regex in regexes] + + command_string = GetCommandString(command) + self.assertNotEqual( + ret_code, 0, + 'The following command succeeded while expected to fail:\n%s' % + _QuoteLongString(command_string)) + self.assertRegexMatch( + err, + regexes, + message=( + 'Running command\n' + '%s failed with error code %s and message\n' + '%s which matches no regex in %s' % ( + _QuoteLongString(command_string), + ret_code, + _QuoteLongString(err), + regexes))) + + class _AssertRaisesContext(object): + + def __init__(self, expected_exception, test_case, test_func): + self.expected_exception = expected_exception + self.test_case = test_case + self.test_func = test_func + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + if exc_type is None: + self.test_case.fail(self.expected_exception.__name__ + ' not raised') + if not issubclass(exc_type, self.expected_exception): + return False + self.test_func(exc_value) + return True + + def assertRaisesWithPredicateMatch(self, expected_exception, predicate, + callable_obj=None, *args, **kwargs): + # pylint: disable=g-doc-args + """Asserts that exception is thrown and predicate(exception) is true. + + Args: + expected_exception: Exception class expected to be raised. + predicate: Function of one argument that inspects the passed-in exception + and returns True (success) or False (please fail the test). + callable_obj: Function to be called. + args: Extra args. + kwargs: Extra keyword args. + + Returns: + A context manager if callable_obj is None. Otherwise, None. + + Raises: + self.failureException if callable_obj does not raise a macthing exception. + """ + # pylint: enable=g-doc-args + def Check(err): + self.assert_(predicate(err), + '%r does not match predicate %r' % (err, predicate)) + + context = self._AssertRaisesContext(expected_exception, self, Check) + if callable_obj is None: + return context + with context: + callable_obj(*args, **kwargs) + + def assertRaisesWithLiteralMatch(self, expected_exception, + expected_exception_message, + callable_obj=None, *args, **kwargs): + # pylint: disable=g-doc-args + """Asserts that the message in a raised exception equals the given string. + + Unlike assertRaisesRegexp, this method takes a literal string, not + a regular expression. + + with self.assertRaisesWithLiteralMatch(ExType, 'message'): + DoSomething() + + Args: + expected_exception: Exception class expected to be raised. + expected_exception_message: String message expected in the raised + exception. For a raise exception e, expected_exception_message must + equal str(e). + callable_obj: Function to be called, or None to return a context. + args: Extra args. + kwargs: Extra kwargs. + + Returns: + A context manager if callable_obj is None. Otherwise, None. + + Raises: + self.failureException if callable_obj does not raise a macthing exception. + """ + # pylint: enable=g-doc-args + def Check(err): + actual_exception_message = str(err) + self.assert_(expected_exception_message == actual_exception_message, + 'Exception message does not match.\n' + 'Expected: %r\n' + 'Actual: %r' % (expected_exception_message, + actual_exception_message)) + + context = self._AssertRaisesContext(expected_exception, self, Check) + if callable_obj is None: + return context + with context: + callable_obj(*args, **kwargs) + + def assertRaisesWithRegexpMatch(self, expected_exception, expected_regexp, + callable_obj=None, *args, **kwargs): + # pylint: disable=g-doc-args + """Asserts that the message in a raised exception matches the given regexp. + + This is just a wrapper around assertRaisesRegexp. Please use + assertRaisesRegexp instead of assertRaisesWithRegexpMatch. + + Args: + expected_exception: Exception class expected to be raised. + expected_regexp: Regexp (re pattern object or string) expected to be + found in error message. + callable_obj: Function to be called, or None to return a context. + args: Extra args. + kwargs: Extra keyword args. + + Returns: + A context manager if callable_obj is None. Otherwise, None. + + Raises: + self.failureException if callable_obj does not raise a macthing exception. + """ + # pylint: enable=g-doc-args + # TODO(user): this is a good candidate for a global search-and-replace. + return self.assertRaisesRegexp(expected_exception, expected_regexp, + callable_obj, *args, **kwargs) + + def assertContainsInOrder(self, strings, target): + """Asserts that the strings provided are found in the target in order. + + This may be useful for checking HTML output. + + Args: + strings: A list of strings, such as [ 'fox', 'dog' ] + target: A target string in which to look for the strings, such as + 'The quick brown fox jumped over the lazy dog'. + """ + if not isinstance(strings, list): + strings = [strings] + + current_index = 0 + last_string = None + for string in strings: + index = target.find(str(string), current_index) + if index == -1 and current_index == 0: + self.fail("Did not find '%s' in '%s'" % + (string, target)) + elif index == -1: + self.fail("Did not find '%s' after '%s' in '%s'" % + (string, last_string, target)) + last_string = string + current_index = index + + def assertContainsSubsequence(self, container, subsequence): + """Assert that "container" contains "subsequence" as a subsequence. + + Asserts that big_list contains all the elements of small_list, in order, but + possibly with other elements interspersed. For example, [1, 2, 3] is a + subsequence of [0, 0, 1, 2, 0, 3, 0] but not of [0, 0, 1, 3, 0, 2, 0]. + + Args: + container: the list we're testing for subsequence inclusion. + subsequence: the list we hope will be a subsequence of container. + """ + first_nonmatching = None + reversed_container = list(reversed(container)) + subsequence = list(subsequence) + + for e in subsequence: + if e not in reversed_container: + first_nonmatching = e + break + while e != reversed_container.pop(): + pass + + if first_nonmatching is not None: + self.fail('%s not a subsequence of %s. First non-matching element: %s' % + (subsequence, container, first_nonmatching)) + + def assertTotallyOrdered(self, *groups): + # pylint: disable=g-doc-args + """Asserts that total ordering has been implemented correctly. + + For example, say you have a class A that compares only on its attribute x. + Comparators other than __lt__ are omitted for brevity. + + class A(object): + def __init__(self, x, y): + self.x = xio + self.y = y + + def __hash__(self): + return hash(self.x) + + def __lt__(self, other): + try: + return self.x < other.x + except AttributeError: + return NotImplemented + + assertTotallyOrdered will check that instances can be ordered correctly. + For example, + + self.assertTotallyOrdered( + [None], # None should come before everything else. + [1], # Integers sort earlier. + [A(1, 'a')], + [A(2, 'b')], # 2 is after 1. + [A(3, 'c'), A(3, 'd')], # The second argument is irrelevant. + [A(4, 'z')], + ['foo']) # Strings sort last. + + Args: + groups: A list of groups of elements. Each group of elements is a list + of objects that are equal. The elements in each group must be less than + the elements in the group after it. For example, these groups are + totally ordered: [None], [1], [2, 2], [3]. + """ + # pylint: enable=g-doc-args + + def CheckOrder(small, big): + """Ensures small is ordered before big.""" + self.assertFalse(small == big, + '%r unexpectedly equals %r' % (small, big)) + self.assertTrue(small != big, + '%r unexpectedly equals %r' % (small, big)) + self.assertLess(small, big) + self.assertFalse(big < small, + '%r unexpectedly less than %r' % (big, small)) + self.assertLessEqual(small, big) + self.assertFalse(big <= small, + '%r unexpectedly less than or equal to %r' + % (big, small)) + self.assertGreater(big, small) + self.assertFalse(small > big, + '%r unexpectedly greater than %r' % (small, big)) + self.assertGreaterEqual(big, small) + self.assertFalse(small >= big, + '%r unexpectedly greater than or equal to %r' + % (small, big)) + + def CheckEqual(a, b): + """Ensures that a and b are equal.""" + self.assertEqual(a, b) + self.assertFalse(a != b, '%r unexpectedly equals %r' % (a, b)) + self.assertEqual(hash(a), hash(b), + 'hash %d of %r unexpectedly not equal to hash %d of %r' + % (hash(a), a, hash(b), b)) + self.assertFalse(a < b, '%r unexpectedly less than %r' % (a, b)) + self.assertFalse(b < a, '%r unexpectedly less than %r' % (b, a)) + self.assertLessEqual(a, b) + self.assertLessEqual(b, a) + self.assertFalse(a > b, '%r unexpectedly greater than %r' % (a, b)) + self.assertFalse(b > a, '%r unexpectedly greater than %r' % (b, a)) + self.assertGreaterEqual(a, b) + self.assertGreaterEqual(b, a) + + # For every combination of elements, check the order of every pair of + # elements. + for elements in itertools.product(*groups): + elements = list(elements) + for index, small in enumerate(elements[:-1]): + for big in elements[index + 1:]: + CheckOrder(small, big) + + # Check that every element in each group is equal. + for group in groups: + for a in group: + CheckEqual(a, a) + for a, b in itertools.product(group, group): + CheckEqual(a, b) + + def assertDictEqual(self, a, b, msg=None): + """Raises AssertionError if a and b are not equal dictionaries. + + Args: + a: A dict, the expected value. + b: A dict, the actual value. + msg: An optional str, the associated message. + + Raises: + AssertionError: if the dictionaries are not equal. + """ + self.assertIsInstance(a, dict, 'First argument is not a dictionary') + self.assertIsInstance(b, dict, 'Second argument is not a dictionary') + + def Sorted(list_of_items): + try: + return sorted(list_of_items) # In 3.3, unordered are possible. + except TypeError: + return list_of_items + + if a == b: + return + a_items = Sorted(list(a.iteritems())) + b_items = Sorted(list(b.iteritems())) + + unexpected = [] + missing = [] + different = [] + + safe_repr = unittest.util.safe_repr + + def Repr(dikt): + """Deterministic repr for dict.""" + # Sort the entries based on their repr, not based on their sort order, + # which will be non-deterministic across executions, for many types. + entries = sorted((safe_repr(k), safe_repr(v)) + for k, v in dikt.iteritems()) + return '{%s}' % (', '.join('%s: %s' % pair for pair in entries)) + + message = ['%s != %s%s' % (Repr(a), Repr(b), ' (%s)' % msg if msg else '')] + + # The standard library default output confounds lexical difference with + # value difference; treat them separately. + for a_key, a_value in a_items: + if a_key not in b: + missing.append((a_key, a_value)) + elif a_value != b[a_key]: + different.append((a_key, a_value, b[a_key])) + + for b_key, b_value in b_items: + if b_key not in a: + unexpected.append((b_key, b_value)) + + if unexpected: + message.append( + 'Unexpected, but present entries:\n%s' % ''.join( + '%s: %s\n' % (safe_repr(k), safe_repr(v)) for k, v in unexpected)) + + if different: + message.append( + 'repr() of differing entries:\n%s' % ''.join( + '%s: %s != %s\n' % (safe_repr(k), safe_repr(a_value), + safe_repr(b_value)) + for k, a_value, b_value in different)) + + if missing: + message.append( + 'Missing entries:\n%s' % ''.join( + ('%s: %s\n' % (safe_repr(k), safe_repr(v)) for k, v in missing))) + + raise self.failureException('\n'.join(message)) + + def assertUrlEqual(self, a, b): + """Asserts that urls are equal, ignoring ordering of query params.""" + parsed_a = urlparse.urlparse(a) + parsed_b = urlparse.urlparse(b) + self.assertEqual(parsed_a.scheme, parsed_b.scheme) + self.assertEqual(parsed_a.netloc, parsed_b.netloc) + self.assertEqual(parsed_a.path, parsed_b.path) + self.assertEqual(parsed_a.fragment, parsed_b.fragment) + self.assertEqual(sorted(parsed_a.params.split(';')), + sorted(parsed_b.params.split(';'))) + self.assertDictEqual( + urlparse.parse_qs(parsed_a.query, keep_blank_values=True), + urlparse.parse_qs(parsed_b.query, keep_blank_values=True)) + + def assertSameStructure(self, a, b, aname='a', bname='b', msg=None): + """Asserts that two values contain the same structural content. + + The two arguments should be data trees consisting of trees of dicts and + lists. They will be deeply compared by walking into the contents of dicts + and lists; other items will be compared using the == operator. + If the two structures differ in content, the failure message will indicate + the location within the structures where the first difference is found. + This may be helpful when comparing large structures. + + Args: + a: The first structure to compare. + b: The second structure to compare. + aname: Variable name to use for the first structure in assertion messages. + bname: Variable name to use for the second structure. + msg: Additional text to include in the failure message. + """ + + # Accumulate all the problems found so we can report all of them at once + # rather than just stopping at the first + problems = [] + + _WalkStructureForProblems(a, b, aname, bname, problems) + + # Avoid spamming the user toooo much + max_problems_to_show = self.maxDiff // 80 + if len(problems) > max_problems_to_show: + problems = problems[0:max_problems_to_show-1] + ['...'] + + if problems: + failure_message = '; '.join(problems) + if msg: + failure_message += (': ' + msg) + self.fail(failure_message) + + def assertJsonEqual(self, first, second, msg=None): + """Asserts that the JSON objects defined in two strings are equal. + + A summary of the differences will be included in the failure message + using assertSameStructure. + + Args: + first: A string contining JSON to decode and compare to second. + second: A string contining JSON to decode and compare to first. + msg: Additional text to include in the failure message. + """ + try: + first_structured = json.loads(first) + except ValueError as e: + raise ValueError('could not decode first JSON value %s: %s' % + (first, e)) + + try: + second_structured = json.loads(second) + except ValueError as e: + raise ValueError('could not decode second JSON value %s: %s' % + (second, e)) + + self.assertSameStructure(first_structured, second_structured, + aname='first', bname='second', msg=msg) + + def getRecordedProperties(self): + """Return any properties that the user has recorded.""" + return self.__recorded_properties + + def recordProperty(self, property_name, property_value): + """Record an arbitrary property for later use. + + Args: + property_name: str, name of property to record; must be a valid XML + attribute name + property_value: value of property; must be valid XML attribute value + """ + self.__recorded_properties[property_name] = property_value + + def _getAssertEqualityFunc(self, first, second): + try: + return super(TestCase, self)._getAssertEqualityFunc(first, second) + except AttributeError: + # This happens if unittest2.TestCase.__init__ was never run. It + # usually means that somebody created a subclass just for the + # assertions and has overriden __init__. "assertTrue" is a safe + # value that will not make __init__ raise a ValueError (this is + # a bit hacky). + test_method = getattr(self, '_testMethodName', 'assertTrue') + super(TestCase, self).__init__(test_method) + + return super(TestCase, self)._getAssertEqualityFunc(first, second) + + +# This is not really needed here, but some unrelated code calls this +# function. +# TODO(user): sort it out. +def _SortedListDifference(expected, actual): + """Finds elements in only one or the other of two, sorted input lists. + + Returns a two-element tuple of lists. The first list contains those + elements in the "expected" list but not in the "actual" list, and the + second contains those elements in the "actual" list but not in the + "expected" list. Duplicate elements in either input list are ignored. + + Args: + expected: The list we expected. + actual: The list we actualy got. + Returns: + (missing, unexpected) + missing: items in expected that are not in actual. + unexpected: items in actual that are not in expected. + """ + i = j = 0 + missing = [] + unexpected = [] + while True: + try: + e = expected[i] + a = actual[j] + if e < a: + missing.append(e) + i += 1 + while expected[i] == e: + i += 1 + elif e > a: + unexpected.append(a) + j += 1 + while actual[j] == a: + j += 1 + else: + i += 1 + try: + while expected[i] == e: + i += 1 + finally: + j += 1 + while actual[j] == a: + j += 1 + except IndexError: + missing.extend(expected[i:]) + unexpected.extend(actual[j:]) + break + return missing, unexpected + + +# ---------------------------------------------------------------------- +# Functions to compare the actual output of a test to the expected +# (golden) output. +# +# Note: We could just replace the sys.stdout and sys.stderr objects, +# but we actually redirect the underlying file objects so that if the +# Python script execs any subprocess, their output will also be +# redirected. +# +# Usage: +# basetest.CaptureTestStdout() +# ... do something ... +# basetest.DiffTestStdout("... path to golden file ...") +# ---------------------------------------------------------------------- + + +class CapturedStream(object): + """A temporarily redirected output stream.""" + + def __init__(self, stream, filename): + self._stream = stream + self._fd = stream.fileno() + self._filename = filename + + # Keep original stream for later + self._uncaptured_fd = os.dup(self._fd) + + # Open file to save stream to + cap_fd = os.open(self._filename, + os.O_CREAT | os.O_TRUNC | os.O_WRONLY, + 0600) + + # Send stream to this file + self._stream.flush() + os.dup2(cap_fd, self._fd) + os.close(cap_fd) + + def RestartCapture(self): + """Resume capturing output to a file (after calling StopCapture).""" + # Original stream fd + assert self._uncaptured_fd + + # Append stream to file + cap_fd = os.open(self._filename, + os.O_CREAT | os.O_APPEND | os.O_WRONLY, + 0600) + + # Send stream to this file + self._stream.flush() + os.dup2(cap_fd, self._fd) + os.close(cap_fd) + + def StopCapture(self): + """Remove output redirection.""" + self._stream.flush() + os.dup2(self._uncaptured_fd, self._fd) + + def filename(self): + return self._filename + + def __del__(self): + self.StopCapture() + os.close(self._uncaptured_fd) + del self._uncaptured_fd + + +_captured_streams = {} + + +def _CaptureTestOutput(stream, filename): + """Redirect an output stream to a file. + + Args: + stream: Should be sys.stdout or sys.stderr. + filename: File where output should be stored. + """ + assert not _captured_streams.has_key(stream) + _captured_streams[stream] = CapturedStream(stream, filename) + + +def _StopCapturingStream(stream): + """Stops capturing the given output stream. + + Args: + stream: Should be sys.stdout or sys.stderr. + """ + assert _captured_streams.has_key(stream) + for cap_stream in _captured_streams.itervalues(): + cap_stream.StopCapture() + + +def _DiffTestOutput(stream, golden_filename): + """Compare ouput of redirected stream to contents of golden file. + + Args: + stream: Should be sys.stdout or sys.stderr. + golden_filename: Absolute path to golden file. + """ + _StopCapturingStream(stream) + + cap = _captured_streams[stream] + try: + _Diff(cap.filename(), golden_filename) + finally: + # remove the current stream + del _captured_streams[stream] + # restore other stream capture + for cap_stream in _captured_streams.itervalues(): + cap_stream.RestartCapture() + + +# We want to emit exactly one notice to stderr telling the user where to look +# for their stdout or stderr that may have been consumed to aid debugging. +_notified_test_output_path = '' + + +def _MaybeNotifyAboutTestOutput(outdir): + global _notified_test_output_path + if _notified_test_output_path != outdir: + _notified_test_output_path = outdir + sys.stderr.write('\nNOTE: Some tests capturing output into: %s\n' % outdir) + + +class _DiffingTestOutputContext(object): + + def __init__(self, diff_fn): + self._diff_fn = diff_fn + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self._diff_fn() + return True + + +# Public interface +def CaptureTestStdout(outfile='', expected_output_filepath=None): + """Capture the stdout stream to a file. + + If expected_output_filepath, then this function returns a context manager + that stops capturing and performs a diff when the context is exited. + + with basetest.CaptureTestStdout(expected_output_filepath=some_filepath): + sys.stdout.print(....) + + Otherwise, StopCapturing() must be called to stop capturing stdout, and then + DiffTestStdout() must be called to do the comparison. + + Args: + outfile: The path to the local filesystem file to which to capture output; + if omitted, a standard filepath in --test_tmpdir will be used. + expected_output_filepath: The path to the local filesystem file containing + the expected output to be diffed against when the context is exited. + Returns: + A context manager if expected_output_filepath is specified, otherwise + None. + """ + if not outfile: + outfile = os.path.join(FLAGS.test_tmpdir, 'captured.out') + outdir = FLAGS.test_tmpdir + else: + outdir = os.path.dirname(outfile) + _MaybeNotifyAboutTestOutput(outdir) + _CaptureTestOutput(sys.stdout, outfile) + if expected_output_filepath is not None: + return _DiffingTestOutputContext( + lambda: DiffTestStdout(expected_output_filepath)) + + +def CaptureTestStderr(outfile='', expected_output_filepath=None): + """Capture the stderr stream to a file. + + If expected_output_filepath, then this function returns a context manager + that stops capturing and performs a diff when the context is exited. + + with basetest.CaptureTestStderr(expected_output_filepath=some_filepath): + sys.stderr.print(....) + + Otherwise, StopCapturing() must be called to stop capturing stderr, and then + DiffTestStderr() must be called to do the comparison. + + Args: + outfile: The path to the local filesystem file to which to capture output; + if omitted, a standard filepath in --test_tmpdir will be used. + expected_output_filepath: The path to the local filesystem file containing + the expected output, to be diffed against when the context is exited. + Returns: + A context manager if expected_output_filepath is specified, otherwise + None. + """ + if not outfile: + outfile = os.path.join(FLAGS.test_tmpdir, 'captured.err') + outdir = FLAGS.test_tmpdir + else: + outdir = os.path.dirname(outfile) + _MaybeNotifyAboutTestOutput(outdir) + _CaptureTestOutput(sys.stderr, outfile) + if expected_output_filepath is not None: + return _DiffingTestOutputContext( + lambda: DiffTestStderr(expected_output_filepath)) + + +def DiffTestStdout(golden): + _DiffTestOutput(sys.stdout, golden) + + +def DiffTestStderr(golden): + _DiffTestOutput(sys.stderr, golden) + + +def StopCapturing(): + """Stop capturing redirected output. Debugging sucks if you forget!""" + while _captured_streams: + _, cap_stream = _captured_streams.popitem() + cap_stream.StopCapture() + del cap_stream + + +def _WriteTestData(data, filename): + """Write data into file named filename.""" + fd = os.open(filename, os.O_CREAT | os.O_TRUNC | os.O_WRONLY, 0o600) + if not isinstance(data, (bytes, bytearray)): + data = data.encode('utf-8') + os.write(fd, data) + os.close(fd) + + +_INT_TYPES = (int, long) # Sadly there is no types.IntTypes defined for us. + + +def _WalkStructureForProblems(a, b, aname, bname, problem_list): + """The recursive comparison behind assertSameStructure.""" + if type(a) != type(b) and not ( + isinstance(a, _INT_TYPES) and isinstance(b, _INT_TYPES)): + # We do not distinguish between int and long types as 99.99% of Python 2 + # code should never care. They collapse into a single type in Python 3. + problem_list.append('%s is a %r but %s is a %r' % + (aname, type(a), bname, type(b))) + # If they have different types there's no point continuing + return + + if isinstance(a, collections.Mapping): + for k in a: + if k in b: + _WalkStructureForProblems(a[k], b[k], + '%s[%r]' % (aname, k), '%s[%r]' % (bname, k), + problem_list) + else: + problem_list.append('%s has [%r] but %s does not' % (aname, k, bname)) + for k in b: + if k not in a: + problem_list.append('%s lacks [%r] but %s has it' % (aname, k, bname)) + + # Strings are Sequences but we'll just do those with regular != + elif isinstance(a, collections.Sequence) and not isinstance(a, basestring): + minlen = min(len(a), len(b)) + for i in xrange(minlen): + _WalkStructureForProblems(a[i], b[i], + '%s[%d]' % (aname, i), '%s[%d]' % (bname, i), + problem_list) + for i in xrange(minlen, len(a)): + problem_list.append('%s has [%i] but %s does not' % (aname, i, bname)) + for i in xrange(minlen, len(b)): + problem_list.append('%s lacks [%i] but %s has it' % (aname, i, bname)) + + else: + if a != b: + problem_list.append('%s is %r but %s is %r' % (aname, a, bname, b)) + + +class OutputDifferedError(AssertionError): + pass + + +class DiffFailureError(Exception): + pass + + +def _DiffViaExternalProgram(lhs, rhs, external_diff): + """Compare two files using an external program; raise if it reports error.""" + # The behavior of this function matches the old _Diff() method behavior + # when a TEST_DIFF environment variable was set. A few old things at + # Google depended on that functionality. + command = [external_diff, lhs, rhs] + try: + subprocess.check_output(command, close_fds=True, stderr=subprocess.STDOUT) + return True # No diffs. + except subprocess.CalledProcessError as error: + failure_output = error.output + if error.returncode == 1: + raise OutputDifferedError('\nRunning %s\n%s\nTest output differed from' + ' golden file\n' % (command, failure_output)) + except EnvironmentError as error: + failure_output = str(error) + + # Running the program failed in some way that wasn't a diff. + raise DiffFailureError('\nRunning %s\n%s\nFailure diffing test output' + ' with golden file\n' % (command, failure_output)) + + +def _Diff(lhs, rhs): + """Given two pathnames, compare two files. Raise if they differ.""" + # Some people rely on being able to specify TEST_DIFF in the environment to + # have tests use their own diff wrapper for use when updating golden data. + external_diff = os.environ.get('TEST_DIFF') + if external_diff: + return _DiffViaExternalProgram(lhs, rhs, external_diff) + try: + with open(lhs, 'r') as lhs_f: + with open(rhs, 'r') as rhs_f: + diff_text = ''.join( + difflib.unified_diff(lhs_f.readlines(), rhs_f.readlines())) + if not diff_text: + return True + raise OutputDifferedError('\nComparing %s and %s\nTest output differed ' + 'from golden file:\n%s' % (lhs, rhs, diff_text)) + except EnvironmentError as error: + # Unable to read the files. + raise DiffFailureError('\nComparing %s and %s\nFailure diffing test output ' + 'with golden file: %s\n' % (lhs, rhs, error)) + + +def DiffTestStringFile(data, golden): + """Diff data agains a golden file.""" + data_file = os.path.join(FLAGS.test_tmpdir, 'provided.dat') + _WriteTestData(data, data_file) + _Diff(data_file, golden) + + +def DiffTestStrings(data1, data2): + """Diff two strings.""" + diff_text = ''.join( + difflib.unified_diff(data1.splitlines(True), data2.splitlines(True))) + if not diff_text: + return + raise OutputDifferedError('\nTest strings differed:\n%s' % diff_text) + + +def DiffTestFiles(testgen, golden): + _Diff(testgen, golden) + + +def GetCommandString(command): + """Returns an escaped string that can be used as a shell command. + + Args: + command: List or string representing the command to run. + Returns: + A string suitable for use as a shell command. + """ + if isinstance(command, types.StringTypes): + return command + else: + return shellutil.ShellEscapeList(command) + + +def GetCommandStderr(command, env=None, close_fds=True): + """Runs the given shell command and returns a tuple. + + Args: + command: List or string representing the command to run. + env: Dictionary of environment variable settings. + close_fds: Whether or not to close all open fd's in the child after forking. + + Returns: + Tuple of (exit status, text printed to stdout and stderr by the command). + """ + if env is None: env = {} + # Forge needs PYTHON_RUNFILES in order to find the runfiles directory when a + # Python executable is run by a Python test. Pass this through from the + # parent environment if not explicitly defined. + if os.environ.get('PYTHON_RUNFILES') and not env.get('PYTHON_RUNFILES'): + env['PYTHON_RUNFILES'] = os.environ['PYTHON_RUNFILES'] + + use_shell = isinstance(command, types.StringTypes) + process = subprocess.Popen( + command, + close_fds=close_fds, + env=env, + shell=use_shell, + stderr=subprocess.STDOUT, + stdout=subprocess.PIPE) + output = process.communicate()[0] + exit_status = process.wait() + return (exit_status, output) + + +def _QuoteLongString(s): + """Quotes a potentially multi-line string to make the start and end obvious. + + Args: + s: A string. + + Returns: + The quoted string. + """ + if isinstance(s, (bytes, bytearray)): + try: + s = s.decode('utf-8') + except UnicodeDecodeError: + s = str(s) + return ('8<-----------\n' + + s + '\n' + + '----------->8\n') + + +class TestProgramManualRun(unittest.TestProgram): + """A TestProgram which runs the tests manually.""" + + def runTests(self, do_run=False): + """Run the tests.""" + if do_run: + unittest.TestProgram.runTests(self) + + +def main(*args, **kwargs): + # pylint: disable=g-doc-args + """Executes a set of Python unit tests. + + Usually this function is called without arguments, so the + unittest.TestProgram instance will get created with the default settings, + so it will run all test methods of all TestCase classes in the __main__ + module. + + + Args: + args: Positional arguments passed through to unittest.TestProgram.__init__. + kwargs: Keyword arguments passed through to unittest.TestProgram.__init__. + """ + # pylint: enable=g-doc-args + _RunInApp(RunTests, args, kwargs) + + +def _IsInAppMain(): + """Returns True iff app.main or app.really_start is active.""" + f = sys._getframe().f_back # pylint: disable=protected-access + app_dict = app.__dict__ + while f: + if f.f_globals is app_dict and f.f_code.co_name in ('run', 'really_start'): + return True + f = f.f_back + return False + + +class SavedFlag(object): + """Helper class for saving and restoring a flag value.""" + + def __init__(self, flag): + self.flag = flag + self.value = flag.value + self.present = flag.present + + def RestoreFlag(self): + self.flag.value = self.value + self.flag.present = self.present + + + + +def _RunInApp(function, args, kwargs): + """Executes a set of Python unit tests, ensuring app.really_start. + + Most users should call basetest.main() instead of _RunInApp. + + _RunInApp calculates argv to be the command-line arguments of this program + (without the flags), sets the default of FLAGS.alsologtostderr to True, + then it calls function(argv, args, kwargs), making sure that `function' + will get called within app.run() or app.really_start(). _RunInApp does this + by checking whether it is called by either app.run() or + app.really_start(), or by calling app.really_start() explicitly. + + The reason why app.really_start has to be ensured is to make sure that + flags are parsed and stripped properly, and other initializations done by + the app module are also carried out, no matter if basetest.run() is called + from within or outside app.run(). + + If _RunInApp is called from within app.run(), then it will reparse + sys.argv and pass the result without command-line flags into the argv + argument of `function'. The reason why this parsing is needed is that + __main__.main() calls basetest.main() without passing its argv. So the + only way _RunInApp could get to know the argv without the flags is that + it reparses sys.argv. + + _RunInApp changes the default of FLAGS.alsologtostderr to True so that the + test program's stderr will contain all the log messages unless otherwise + specified on the command-line. This overrides any explicit assignment to + FLAGS.alsologtostderr by the test program prior to the call to _RunInApp() + (e.g. in __main__.main). + + Please note that _RunInApp (and the function it calls) is allowed to make + changes to kwargs. + + Args: + function: basetest.RunTests or a similar function. It will be called as + function(argv, args, kwargs) where argv is a list containing the + elements of sys.argv without the command-line flags. + args: Positional arguments passed through to unittest.TestProgram.__init__. + kwargs: Keyword arguments passed through to unittest.TestProgram.__init__. + """ + if faulthandler: + try: + faulthandler.enable() + except Exception as e: # pylint: disable=broad-except + sys.stderr.write('faulthandler.enable() failed %r; ignoring.\n' % e) + else: + faulthandler.register(signal.SIGTERM) + if _IsInAppMain(): + # Save command-line flags so the side effects of FLAGS(sys.argv) can be + # undone. + saved_flags = dict((f.name, SavedFlag(f)) + for f in FLAGS.FlagDict().itervalues()) + + # Here we'd like to change the default of alsologtostderr from False to + # True, so the test programs's stderr will contain all the log messages. + # The desired effect is that if --alsologtostderr is not specified in + # the command-line, and __main__.main doesn't set FLAGS.logtostderr + # before calling us (basetest.main), then our changed default takes + # effect and alsologtostderr becomes True. + # + # However, we cannot achive this exact effect, because here we cannot + # distinguish these situations: + # + # A. main.__main__ has changed it to False, it hasn't been specified on + # the command-line, and the default was kept as False. We should keep + # it as False. + # + # B. main.__main__ hasn't changed it, it hasn't been specified on the + # command-line, and the default was kept as False. We should change + # it to True here. + # + # As a workaround, we assume that main.__main__ never changes + # FLAGS.alsologstderr to False, thus the value of the flag is determined + # by its default unless the command-line overrides it. We want to change + # the default to True, and we do it by setting the flag value to True, and + # letting the command-line override it in FLAGS(sys.argv) below by not + # restoring it in saved_flag.RestoreFlag(). + if 'alsologtostderr' in saved_flags: + FLAGS.alsologtostderr = True + del saved_flags['alsologtostderr'] + + # The call FLAGS(sys.argv) parses sys.argv, returns the arguments + # without the flags, and -- as a side effect -- modifies flag values in + # FLAGS. We don't want the side effect, because we don't want to + # override flag changes the program did (e.g. in __main__.main) + # after the command-line has been parsed. So we have the for loop below + # to change back flags to their old values. + argv = FLAGS(sys.argv) + for saved_flag in saved_flags.itervalues(): + saved_flag.RestoreFlag() + + + function(argv, args, kwargs) + else: + # Send logging to stderr. Use --alsologtostderr instead of --logtostderr + # in case tests are reading their own logs. + if 'alsologtostderr' in FLAGS: + FLAGS.SetDefault('alsologtostderr', True) + + def Main(argv): + function(argv, args, kwargs) + + app.really_start(main=Main) + + +def RunTests(argv, args, kwargs): + """Executes a set of Python unit tests within app.really_start. + + Most users should call basetest.main() instead of RunTests. + + Please note that RunTests should be called from app.really_start (which is + called from app.run()). Calling basetest.main() would ensure that. + + Please note that RunTests is allowed to make changes to kwargs. + + Args: + argv: sys.argv with the command-line flags removed from the front, i.e. the + argv with which app.run() has called __main__.main. + args: Positional arguments passed through to unittest.TestProgram.__init__. + kwargs: Keyword arguments passed through to unittest.TestProgram.__init__. + """ + test_runner = kwargs.get('testRunner') + + # Make sure tmpdir exists + if not os.path.isdir(FLAGS.test_tmpdir): + os.makedirs(FLAGS.test_tmpdir) + + # Run main module setup, if it exists + main_mod = sys.modules['__main__'] + if hasattr(main_mod, 'setUp') and callable(main_mod.setUp): + main_mod.setUp() + + # Let unittest.TestProgram.__init__ called by + # TestProgramManualRun.__init__ do its own argv parsing, e.g. for '-v', + # on argv, which is sys.argv without the command-line flags. + kwargs.setdefault('argv', argv) + + try: + result = None + test_program = TestProgramManualRun(*args, **kwargs) + if test_runner: + test_program.testRunner = test_runner + else: + test_program.testRunner = unittest.TextTestRunner( + verbosity=test_program.verbosity) + result = test_program.testRunner.run(test_program.test) + finally: + # Run main module teardown, if it exists + if hasattr(main_mod, 'tearDown') and callable(main_mod.tearDown): + main_mod.tearDown() + + sys.exit(not result.wasSuccessful()) diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/datelib.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/datelib.py new file mode 100644 index 0000000..d63ecf1 --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/datelib.py @@ -0,0 +1,525 @@ +#!/usr/bin/env python +# Copyright 2002 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Set of classes and functions for dealing with dates and timestamps. + +The BaseTimestamp and Timestamp are timezone-aware wrappers around Python +datetime.datetime class. +""" + + + +import calendar +import copy +import datetime +import re +import sys +import time +import types +import warnings + +import dateutil.parser +import pytz + + +_MICROSECONDS_PER_SECOND = 1000000 +_MICROSECONDS_PER_SECOND_F = float(_MICROSECONDS_PER_SECOND) + + +def SecondsToMicroseconds(seconds): + """Convert seconds to microseconds. + + Args: + seconds: number + Returns: + microseconds + """ + return seconds * _MICROSECONDS_PER_SECOND + + +def MicrosecondsToSeconds(microseconds): + """Convert microseconds to seconds. + + Args: + microseconds: A number representing some duration of time measured in + microseconds. + Returns: + A number representing the same duration of time measured in seconds. + """ + return microseconds / _MICROSECONDS_PER_SECOND_F + + +def _GetCurrentTimeMicros(): + """Get the current time in microseconds, in UTC. + + Returns: + The number of microseconds since the epoch. + """ + return int(SecondsToMicroseconds(time.time())) + + +def GetSecondsSinceEpoch(time_tuple): + """Convert time_tuple (in UTC) to seconds (also in UTC). + + Args: + time_tuple: tuple with at least 6 items. + Returns: + seconds. + """ + return calendar.timegm(time_tuple[:6] + (0, 0, 0)) + + +def GetTimeMicros(time_tuple): + """Get a time in microseconds. + + Arguments: + time_tuple: A (year, month, day, hour, minute, second) tuple (the python + time tuple format) in the UTC time zone. + + Returns: + The number of microseconds since the epoch represented by the input tuple. + """ + return int(SecondsToMicroseconds(GetSecondsSinceEpoch(time_tuple))) + + +def DatetimeToUTCMicros(date): + """Converts a datetime object to microseconds since the epoch in UTC. + + Args: + date: A datetime to convert. + Returns: + The number of microseconds since the epoch, in UTC, represented by the input + datetime. + """ + # Using this guide: http://wiki.python.org/moin/WorkingWithTime + # And this conversion guide: http://docs.python.org/library/time.html + + # Turn the date parameter into a tuple (struct_time) that can then be + # manipulated into a long value of seconds. During the conversion from + # struct_time to long, the source date in UTC, and so it follows that the + # correct transformation is calendar.timegm() + micros = calendar.timegm(date.utctimetuple()) * _MICROSECONDS_PER_SECOND + return micros + date.microsecond + + +def DatetimeToUTCMillis(date): + """Converts a datetime object to milliseconds since the epoch in UTC. + + Args: + date: A datetime to convert. + Returns: + The number of milliseconds since the epoch, in UTC, represented by the input + datetime. + """ + return DatetimeToUTCMicros(date) / 1000 + + +def UTCMicrosToDatetime(micros, tz=None): + """Converts a microsecond epoch time to a datetime object. + + Args: + micros: A UTC time, expressed in microseconds since the epoch. + tz: The desired tzinfo for the datetime object. If None, the + datetime will be naive. + Returns: + The datetime represented by the input value. + """ + # The conversion from micros to seconds for input into the + # utcfromtimestamp function needs to be done as a float to make sure + # we dont lose the sub-second resolution of the input time. + dt = datetime.datetime.utcfromtimestamp( + micros / _MICROSECONDS_PER_SECOND_F) + if tz is not None: + dt = tz.fromutc(dt) + return dt + + +def UTCMillisToDatetime(millis, tz=None): + """Converts a millisecond epoch time to a datetime object. + + Args: + millis: A UTC time, expressed in milliseconds since the epoch. + tz: The desired tzinfo for the datetime object. If None, the + datetime will be naive. + Returns: + The datetime represented by the input value. + """ + return UTCMicrosToDatetime(millis * 1000, tz) + + +UTC = pytz.UTC +US_PACIFIC = pytz.timezone('US/Pacific') + + +class TimestampError(ValueError): + """Generic timestamp-related error.""" + pass + + +class TimezoneNotSpecifiedError(TimestampError): + """This error is raised when timezone is not specified.""" + pass + + +class TimeParseError(TimestampError): + """This error is raised when we can't parse the input.""" + pass + + +# TODO(user): this class needs to handle daylight better + + +class LocalTimezoneClass(datetime.tzinfo): + """This class defines local timezone.""" + + ZERO = datetime.timedelta(0) + HOUR = datetime.timedelta(hours=1) + + STDOFFSET = datetime.timedelta(seconds=-time.timezone) + if time.daylight: + DSTOFFSET = datetime.timedelta(seconds=-time.altzone) + else: + DSTOFFSET = STDOFFSET + + DSTDIFF = DSTOFFSET - STDOFFSET + + def utcoffset(self, dt): + """datetime -> minutes east of UTC (negative for west of UTC).""" + if self._isdst(dt): + return self.DSTOFFSET + else: + return self.STDOFFSET + + def dst(self, dt): + """datetime -> DST offset in minutes east of UTC.""" + if self._isdst(dt): + return self.DSTDIFF + else: + return self.ZERO + + def tzname(self, dt): + """datetime -> string name of time zone.""" + return time.tzname[self._isdst(dt)] + + def _isdst(self, dt): + """Return true if given datetime is within local DST.""" + tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, + dt.weekday(), 0, -1) + stamp = time.mktime(tt) + tt = time.localtime(stamp) + return tt.tm_isdst > 0 + + def __repr__(self): + """Return string ''.""" + return '' + + def localize(self, dt, unused_is_dst=False): + """Convert naive time to local time.""" + if dt.tzinfo is not None: + raise ValueError('Not naive datetime (tzinfo is already set)') + return dt.replace(tzinfo=self) + + def normalize(self, dt, unused_is_dst=False): + """Correct the timezone information on the given datetime.""" + if dt.tzinfo is None: + raise ValueError('Naive time - no tzinfo set') + return dt.replace(tzinfo=self) + + +LocalTimezone = LocalTimezoneClass() + + +class BaseTimestamp(datetime.datetime): + """Our kind of wrapper over datetime.datetime. + + The objects produced by methods now, today, fromtimestamp, utcnow, + utcfromtimestamp are timezone-aware (with correct timezone). + We also overload __add__ and __sub__ method, to fix the result of arithmetic + operations. + """ + + LocalTimezone = LocalTimezone + + @classmethod + def AddLocalTimezone(cls, obj): + """If obj is naive, add local timezone to it.""" + if not obj.tzinfo: + return obj.replace(tzinfo=cls.LocalTimezone) + return obj + + @classmethod + def Localize(cls, obj): + """If obj is naive, localize it to cls.LocalTimezone.""" + if not obj.tzinfo: + return cls.LocalTimezone.localize(obj) + return obj + + def __add__(self, *args, **kwargs): + """x.__add__(y) <==> x+y.""" + r = super(BaseTimestamp, self).__add__(*args, **kwargs) + return type(self)(r.year, r.month, r.day, r.hour, r.minute, r.second, + r.microsecond, r.tzinfo) + + def __sub__(self, *args, **kwargs): + """x.__add__(y) <==> x-y.""" + r = super(BaseTimestamp, self).__sub__(*args, **kwargs) + if isinstance(r, datetime.datetime): + return type(self)(r.year, r.month, r.day, r.hour, r.minute, r.second, + r.microsecond, r.tzinfo) + return r + + @classmethod + def now(cls, *args, **kwargs): + """Get a timestamp corresponding to right now. + + Args: + args: Positional arguments to pass to datetime.datetime.now(). + kwargs: Keyword arguments to pass to datetime.datetime.now(). If tz is not + specified, local timezone is assumed. + + Returns: + A new BaseTimestamp with tz's local day and time. + """ + return cls.AddLocalTimezone( + super(BaseTimestamp, cls).now(*args, **kwargs)) + + @classmethod + def today(cls): + """Current BaseTimestamp. + + Same as self.__class__.fromtimestamp(time.time()). + Returns: + New self.__class__. + """ + return cls.AddLocalTimezone(super(BaseTimestamp, cls).today()) + + @classmethod + def fromtimestamp(cls, *args, **kwargs): + """Get a new localized timestamp from a POSIX timestamp. + + Args: + args: Positional arguments to pass to datetime.datetime.fromtimestamp(). + kwargs: Keyword arguments to pass to datetime.datetime.fromtimestamp(). + If tz is not specified, local timezone is assumed. + + Returns: + A new BaseTimestamp with tz's local day and time. + """ + return cls.Localize( + super(BaseTimestamp, cls).fromtimestamp(*args, **kwargs)) + + @classmethod + def utcnow(cls): + """Return a new BaseTimestamp representing UTC day and time.""" + return super(BaseTimestamp, cls).utcnow().replace(tzinfo=pytz.utc) + + @classmethod + def utcfromtimestamp(cls, *args, **kwargs): + """timestamp -> UTC datetime from a POSIX timestamp (like time.time()).""" + return super(BaseTimestamp, cls).utcfromtimestamp( + *args, **kwargs).replace(tzinfo=pytz.utc) + + @classmethod + def strptime(cls, date_string, format, tz=None): + """Parse date_string according to format and construct BaseTimestamp. + + Args: + date_string: string passed to time.strptime. + format: format string passed to time.strptime. + tz: if not specified, local timezone assumed. + Returns: + New BaseTimestamp. + """ + date_time = super(BaseTimestamp, cls).strptime(date_string, format) + return (tz.localize if tz else cls.Localize)(date_time) + + def astimezone(self, *args, **kwargs): + """tz -> convert to time in new timezone tz.""" + r = super(BaseTimestamp, self).astimezone(*args, **kwargs) + return type(self)(r.year, r.month, r.day, r.hour, r.minute, r.second, + r.microsecond, r.tzinfo) + + @classmethod + def FromMicroTimestamp(cls, ts): + """Create new Timestamp object from microsecond UTC timestamp value. + + Args: + ts: integer microsecond UTC timestamp + Returns: + New cls() + """ + return cls.utcfromtimestamp(ts/_MICROSECONDS_PER_SECOND_F) + + def AsSecondsSinceEpoch(self): + """Return number of seconds since epoch (timestamp in seconds).""" + return GetSecondsSinceEpoch(self.utctimetuple()) + + def AsMicroTimestamp(self): + """Return microsecond timestamp constructed from this object.""" + return (SecondsToMicroseconds(self.AsSecondsSinceEpoch()) + + self.microsecond) + + @classmethod + def combine(cls, datepart, timepart, tz=None): + """Combine date and time into timestamp, timezone-aware. + + Args: + datepart: datetime.date + timepart: datetime.time + tz: timezone or None + Returns: + timestamp object + """ + result = super(BaseTimestamp, cls).combine(datepart, timepart) + if tz: + result = tz.localize(result) + return result + + +# Conversions from interval suffixes to number of seconds. +# (m => 60s, d => 86400s, etc) +_INTERVAL_CONV_DICT = {'s': 1} +_INTERVAL_CONV_DICT['m'] = 60 * _INTERVAL_CONV_DICT['s'] +_INTERVAL_CONV_DICT['h'] = 60 * _INTERVAL_CONV_DICT['m'] +_INTERVAL_CONV_DICT['d'] = 24 * _INTERVAL_CONV_DICT['h'] +_INTERVAL_CONV_DICT['D'] = _INTERVAL_CONV_DICT['d'] +_INTERVAL_CONV_DICT['w'] = 7 * _INTERVAL_CONV_DICT['d'] +_INTERVAL_CONV_DICT['W'] = _INTERVAL_CONV_DICT['w'] +_INTERVAL_CONV_DICT['M'] = 30 * _INTERVAL_CONV_DICT['d'] +_INTERVAL_CONV_DICT['Y'] = 365 * _INTERVAL_CONV_DICT['d'] +_INTERVAL_REGEXP = re.compile('^([0-9]+)([%s])?' % ''.join(_INTERVAL_CONV_DICT)) + + +def ConvertIntervalToSeconds(interval): + """Convert a formatted string representing an interval into seconds. + + Args: + interval: String to interpret as an interval. A basic interval looks like + "". Complex intervals consisting of a chain of basic + intervals are also allowed. + + Returns: + An integer representing the number of seconds represented by the interval + string, or None if the interval string could not be decoded. + """ + total = 0 + while interval: + match = _INTERVAL_REGEXP.match(interval) + if not match: + return None + + try: + num = int(match.group(1)) + except ValueError: + return None + + suffix = match.group(2) + if suffix: + multiplier = _INTERVAL_CONV_DICT.get(suffix) + if not multiplier: + return None + num *= multiplier + + total += num + interval = interval[match.end(0):] + return total + + +class Timestamp(BaseTimestamp): + """This subclass contains methods to parse W3C and interval date spec. + + The interval date specification is in the form "1D", where "D" can be + "s"econds "m"inutes "h"ours "D"ays "W"eeks "M"onths "Y"ears. + """ + INTERVAL_CONV_DICT = _INTERVAL_CONV_DICT + INTERVAL_REGEXP = _INTERVAL_REGEXP + + @classmethod + def _StringToTime(cls, timestring, tz=None): + """Use dateutil.parser to convert string into timestamp. + + dateutil.parser understands ISO8601 which is really handy. + + Args: + timestring: string with datetime + tz: optional timezone, if timezone is omitted from timestring. + + Returns: + New Timestamp or None if unable to parse the timestring. + """ + try: + r = dateutil.parser.parse(timestring) + # dateutil will raise ValueError if it's an unknown format -- or + # TypeError in some cases, due to bugs. + except (TypeError, ValueError): + return None + if not r.tzinfo: + r = (tz or cls.LocalTimezone).localize(r) + result = cls(r.year, r.month, r.day, r.hour, r.minute, r.second, + r.microsecond, r.tzinfo) + + return result + + @classmethod + def _IntStringToInterval(cls, timestring): + """Parse interval date specification and create a timedelta object. + + Args: + timestring: string interval. + + Returns: + A datetime.timedelta representing the specified interval or None if + unable to parse the timestring. + """ + seconds = ConvertIntervalToSeconds(timestring) + return datetime.timedelta(seconds=seconds) if seconds else None + + @classmethod + def FromString(cls, value, tz=None): + """Create a Timestamp from a string. + + Args: + value: String interval or datetime. + e.g. "2013-01-05 13:00:00" or "1d" + tz: optional timezone, if timezone is omitted from timestring. + + Returns: + A new Timestamp. + + Raises: + TimeParseError if unable to parse value. + """ + result = cls._StringToTime(value, tz=tz) + if result: + return result + + result = cls._IntStringToInterval(value) + if result: + return cls.utcnow() - result + + raise TimeParseError(value) + + +# What's written below is a clear python bug. I mean, okay, I can apply +# negative timezone to it and end result will be inconversible. + +MAXIMUM_PYTHON_TIMESTAMP = Timestamp( + 9999, 12, 31, 23, 59, 59, 999999, UTC) + +# This is also a bug. It is called 32bit time_t. I hate it. +# This is fixed in 2.5, btw. + +MAXIMUM_MICROSECOND_TIMESTAMP = 0x80000000 * _MICROSECONDS_PER_SECOND - 1 +MAXIMUM_MICROSECOND_TIMESTAMP_AS_TS = Timestamp(2038, 1, 19, 3, 14, 7, 999999) diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/debug.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/debug.py new file mode 100644 index 0000000..cff780d --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/debug.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# Copyright 2004 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# This code must be source compatible with Python 2.6 through 3.3. + +"""Import this module to add a hook to call pdb on uncaught exceptions. + +To enable this, do the following in your top-level application: + +import google.apputils.debug + +and then in your main(): + +google.apputils.debug.Init() + +Then run your program with --pdb. +""" + + + +import sys + +import gflags as flags + +flags.DEFINE_boolean('pdb', 0, 'Drop into pdb on uncaught exceptions') + +old_excepthook = None + + +def _DebugHandler(exc_class, value, tb): + if not flags.FLAGS.pdb or hasattr(sys, 'ps1') or not sys.stderr.isatty(): + # we aren't in interactive mode or we don't have a tty-like + # device, so we call the default hook + old_excepthook(exc_class, value, tb) + else: + # Don't impose import overhead on apps that never raise an exception. + import traceback + import pdb + # we are in interactive mode, print the exception... + traceback.print_exception(exc_class, value, tb) + sys.stdout.write('\n') + # ...then start the debugger in post-mortem mode. + pdb.pm() + + +def Init(): + # Must back up old excepthook. + global old_excepthook # pylint: disable=global-statement + if old_excepthook is None: + old_excepthook = sys.excepthook + sys.excepthook = _DebugHandler diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/file_util.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/file_util.py new file mode 100644 index 0000000..f41e204 --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/file_util.py @@ -0,0 +1,252 @@ +#!/usr/bin/env python +# Copyright 2007 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Simple file system utilities.""" + +__author__ = ('elaforge@google.com (Evan LaForge)', + 'matthewb@google.com (Matthew Blecker)') + +import contextlib +import errno +import os +import pwd +import shutil +import stat +import tempfile + + +class PasswdError(Exception): + """Exception class for errors loading a password from a file.""" + + +def ListDirPath(dir_name): + """Like os.listdir with prepended dir_name, which is often more convenient.""" + return [os.path.join(dir_name, fn) for fn in os.listdir(dir_name)] + + +def Read(filename): + """Read entire contents of file with name 'filename'.""" + with open(filename) as fp: + return fp.read() + + +def Write(filename, contents, overwrite_existing=True, mode=0666, gid=None): + """Create a file 'filename' with 'contents', with the mode given in 'mode'. + + The 'mode' is modified by the umask, as in open(2). If + 'overwrite_existing' is False, the file will be opened in O_EXCL mode. + + An optional gid can be specified. + + Args: + filename: str; the name of the file + contents: str; the data to write to the file + overwrite_existing: bool; whether or not to allow the write if the file + already exists + mode: int; permissions with which to create the file (default is 0666 octal) + gid: int; group id with which to create the file + """ + flags = os.O_WRONLY | os.O_TRUNC | os.O_CREAT + if not overwrite_existing: + flags |= os.O_EXCL + fd = os.open(filename, flags, mode) + try: + os.write(fd, contents) + finally: + os.close(fd) + if gid is not None: + os.chown(filename, -1, gid) + + +def AtomicWrite(filename, contents, mode=0666, gid=None): + """Create a file 'filename' with 'contents' atomically. + + As in Write, 'mode' is modified by the umask. This creates and moves + a temporary file, and errors doing the above will be propagated normally, + though it will try to clean up the temporary file in that case. + + This is very similar to the prodlib function with the same name. + + An optional gid can be specified. + + Args: + filename: str; the name of the file + contents: str; the data to write to the file + mode: int; permissions with which to create the file (default is 0666 octal) + gid: int; group id with which to create the file + """ + fd, tmp_filename = tempfile.mkstemp(dir=os.path.dirname(filename)) + try: + os.write(fd, contents) + finally: + os.close(fd) + try: + os.chmod(tmp_filename, mode) + if gid is not None: + os.chown(tmp_filename, -1, gid) + os.rename(tmp_filename, filename) + except OSError, exc: + try: + os.remove(tmp_filename) + except OSError, e: + exc = OSError('%s. Additional errors cleaning up: %s' % (exc, e)) + raise exc + + +@contextlib.contextmanager +def TemporaryFileWithContents(contents, **kw): + """A contextmanager that writes out a string to a file on disk. + + This is useful whenever you need to call a function or command that expects a + file on disk with some contents that you have in memory. The context manager + abstracts the writing, flushing, and deletion of the temporary file. This is a + common idiom that boils down to a single with statement. + + Note: if you need a temporary file-like object for calling an internal + function, you should use a StringIO as a file-like object and not this. + Temporary files should be avoided unless you need a file name or contents in a + file on disk to be read by some other function or program. + + Args: + contents: a string with the contents to write to the file. + **kw: Optional arguments passed on to tempfile.NamedTemporaryFile. + Yields: + The temporary file object, opened in 'w' mode. + + """ + temporary_file = tempfile.NamedTemporaryFile(**kw) + temporary_file.write(contents) + temporary_file.flush() + yield temporary_file + temporary_file.close() + + +# TODO(user): remove after migration to Python 3.2. +# This context manager can be replaced with tempfile.TemporaryDirectory in +# Python 3.2 (http://bugs.python.org/issue5178, +# http://docs.python.org/dev/library/tempfile.html#tempfile.TemporaryDirectory). +@contextlib.contextmanager +def TemporaryDirectory(suffix='', prefix='tmp', base_path=None): + """A context manager to create a temporary directory and clean up on exit. + + The parameters are the same ones expected by tempfile.mkdtemp. + The directory will be securely and atomically created. + Everything under it will be removed when exiting the context. + + Args: + suffix: optional suffix. + prefix: options prefix. + base_path: the base path under which to create the temporary directory. + Yields: + The absolute path of the new temporary directory. + """ + temp_dir_path = tempfile.mkdtemp(suffix, prefix, base_path) + try: + yield temp_dir_path + finally: + try: + shutil.rmtree(temp_dir_path) + except OSError, e: + if e.message == 'Cannot call rmtree on a symbolic link': + # Interesting synthetic exception made up by shutil.rmtree. + # Means we received a symlink from mkdtemp. + # Also means must clean up the symlink instead. + os.unlink(temp_dir_path) + else: + raise + + +def MkDirs(directory, force_mode=None): + """Makes a directory including its parent directories. + + This function is equivalent to os.makedirs() but it avoids a race + condition that os.makedirs() has. The race is between os.mkdir() and + os.path.exists() which fail with errors when run in parallel. + + Args: + directory: str; the directory to make + force_mode: optional octal, chmod dir to get rid of umask interaction + Raises: + Whatever os.mkdir() raises when it fails for any reason EXCLUDING + "dir already exists". If a directory already exists, it does not + raise anything. This behaviour is different than os.makedirs() + """ + name = os.path.normpath(directory) + dirs = name.split(os.path.sep) + for i in range(0, len(dirs)): + path = os.path.sep.join(dirs[:i+1]) + try: + if path: + os.mkdir(path) + # only chmod if we created + if force_mode is not None: + os.chmod(path, force_mode) + except OSError, exc: + if not (exc.errno == errno.EEXIST and os.path.isdir(path)): + raise + + +def RmDirs(dir_name): + """Removes dir_name and every subsequently empty directory above it. + + Unlike os.removedirs and shutil.rmtree, this function doesn't raise an error + if the directory does not exist. + + Args: + dir_name: Directory to be removed. + """ + try: + shutil.rmtree(dir_name) + except OSError, err: + if err.errno != errno.ENOENT: + raise + + try: + parent_directory = os.path.dirname(dir_name) + while parent_directory: + try: + os.rmdir(parent_directory) + except OSError, err: + if err.errno != errno.ENOENT: + raise + + parent_directory = os.path.dirname(parent_directory) + except OSError, err: + if err.errno not in (errno.EACCES, errno.ENOTEMPTY, errno.EPERM): + raise + + +def HomeDir(user=None): + """Find the home directory of a user. + + Args: + user: int, str, or None - the uid or login of the user to query for, + or None (the default) to query for the current process' effective user + + Returns: + str - the user's home directory + + Raises: + TypeError: if user is not int, str, or None. + """ + if user is None: + pw_struct = pwd.getpwuid(os.geteuid()) + elif isinstance(user, int): + pw_struct = pwd.getpwuid(user) + elif isinstance(user, str): + pw_struct = pwd.getpwnam(user) + else: + raise TypeError('user must be None or an instance of int or str') + return pw_struct.pw_dir diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/humanize.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/humanize.py new file mode 100644 index 0000000..43637e2 --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/humanize.py @@ -0,0 +1,507 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright 2008 Google Inc. All Rights Reserved. + +"""Lightweight routines for producing more friendly output. + +Usage examples: + + 'New messages: %s' % humanize.Commas(star_count) + -> 'New messages: 58,192' + + 'Found %s.' % humanize.Plural(error_count, 'error') + -> 'Found 2 errors.' + + 'Found %s.' % humanize.Plural(error_count, 'ox', 'oxen') + -> 'Found 2 oxen.' + + 'Copied at %s.' % humanize.DecimalPrefix(rate, 'bps', precision=3) + -> 'Copied at 42.6 Mbps.' + + 'Free RAM: %s' % humanize.BinaryPrefix(bytes_free, 'B') + -> 'Free RAM: 742 MiB' + + 'Finished all tasks in %s.' % humanize.Duration(elapsed_time) + -> 'Finished all tasks in 34m 5s.' + +These libraries are not a substitute for full localization. If you +need localization, then you will have to think about translating +strings, formatting numbers in different ways, and so on. Use +ICU if your application is user-facing. Use these libraries if +your application is an English-only internal tool, and you are +tired of seeing "1 results" or "3450134804 bytes used". + +Compare humanize.*Prefix() to C++ utilites HumanReadableNumBytes and +HumanReadableInt in strings/human_readable.h. +""" + + + +import datetime +import math +import re + +SIBILANT_ENDINGS = frozenset(['sh', 'ss', 'tch', 'ax', 'ix', 'ex']) +DIGIT_SPLITTER = re.compile(r'\d+|\D+').findall + +# These are included because they are common technical terms. +SPECIAL_PLURALS = { + 'index': 'indices', + 'matrix': 'matrices', + 'vertex': 'vertices', +} + +VOWELS = frozenset('AEIOUaeiou') + + +def Commas(value): + """Formats an integer with thousands-separating commas. + + Args: + value: An integer. + + Returns: + A string. + """ + if value < 0: + sign = '-' + value = -value + else: + sign = '' + result = [] + while value >= 1000: + result.append('%03d' % (value % 1000)) + value /= 1000 + result.append('%d' % value) + return sign + ','.join(reversed(result)) + + +def Plural(quantity, singular, plural=None): + """Formats an integer and a string into a single pluralized string. + + Args: + quantity: An integer. + singular: A string, the singular form of a noun. + plural: A string, the plural form. If not specified, then simple + English rules of regular pluralization will be used. + + Returns: + A string. + """ + return '%d %s' % (quantity, PluralWord(quantity, singular, plural)) + + +def PluralWord(quantity, singular, plural=None): + """Builds the plural of an English word. + + Args: + quantity: An integer. + singular: A string, the singular form of a noun. + plural: A string, the plural form. If not specified, then simple + English rules of regular pluralization will be used. + + Returns: + the plural form of the word. + """ + if quantity == 1: + return singular + if plural: + return plural + if singular in SPECIAL_PLURALS: + return SPECIAL_PLURALS[singular] + + # We need to guess what the English plural might be. Keep this + # function simple! It doesn't need to know about every possiblity; + # only regular rules and the most common special cases. + # + # Reference: http://en.wikipedia.org/wiki/English_plural + + for ending in SIBILANT_ENDINGS: + if singular.endswith(ending): + return '%ses' % singular + if singular.endswith('o') and singular[-2:-1] not in VOWELS: + return '%ses' % singular + if singular.endswith('y') and singular[-2:-1] not in VOWELS: + return '%sies' % singular[:-1] + return '%ss' % singular + + +def WordSeries(words, conjunction='and'): + """Convert a list of words to an English-language word series. + + Args: + words: A list of word strings. + conjunction: A coordinating conjunction. + + Returns: + A single string containing all the words in the list separated by commas, + the coordinating conjunction, and a serial comma, as appropriate. + """ + num_words = len(words) + if num_words == 0: + return '' + elif num_words == 1: + return words[0] + elif num_words == 2: + return (' %s ' % conjunction).join(words) + else: + return '%s, %s %s' % (', '.join(words[:-1]), conjunction, words[-1]) + + +def AddIndefiniteArticle(noun): + """Formats a noun with an appropriate indefinite article. + + Args: + noun: A string representing a noun. + + Returns: + A string containing noun prefixed with an indefinite article, e.g., + "a thing" or "an object". + """ + if not noun: + raise ValueError('argument must be a word: {!r}'.format(noun)) + if noun[0] in VOWELS: + return 'an ' + noun + else: + return 'a ' + noun + + +def DecimalPrefix(quantity, unit, precision=1, min_scale=0, max_scale=None): + """Formats an integer and a unit into a string, using decimal prefixes. + + The unit will be prefixed with an appropriate multiplier such that + the formatted integer is less than 1,000 (as long as the raw integer + is less than 10**27). For example: + + DecimalPrefix(576012, 'bps') -> '576 kbps' + DecimalPrefix(576012, '') -> '576 k' + DecimalPrefix(576, '') -> '576' + DecimalPrefix(1574215, 'bps', 2) -> '1.6 Mbps' + + Only the SI prefixes which are powers of 10**3 will be used, so + DecimalPrefix(100, 'thread') is '100 thread', not '1 hthread'. + + See also: + BinaryPrefix() + + Args: + quantity: A number. + unit: A string, the dimension for quantity, with no multipliers (e.g. + "bps"). If quantity is dimensionless, the empty string. + precision: An integer, the minimum number of digits to display. + min_scale: minimum power of 1000 to scale to, (None = unbounded). + max_scale: maximum power of 1000 to scale to, (None = unbounded). + + Returns: + A string, composed by the decimal (scaled) representation of quantity at the + required precision, possibly followed by a space, the appropriate multiplier + and the unit. + """ + return _Prefix(quantity, unit, precision, DecimalScale, min_scale=min_scale, + max_scale=max_scale) + + +def BinaryPrefix(quantity, unit, precision=1): + """Formats an integer and a unit into a string, using binary prefixes. + + The unit will be prefixed with an appropriate multiplier such that + the formatted integer is less than 1,024 (as long as the raw integer + is less than 2**90). For example: + + BinaryPrefix(576012, 'B') -> '562 KiB' + BinaryPrefix(576012, '') -> '562 Ki' + + See also: + DecimalPrefix() + + Args: + quantity: A number. + unit: A string, the dimension for quantity, with no multipliers (e.g. + "B"). If quantity is dimensionless, the empty string. + precision: An integer, the minimum number of digits to display. + + Returns: + A string, composed by the decimal (scaled) representation of quantity at the + required precision, possibly followed by a space, the appropriate multiplier + and the unit. + """ + return _Prefix(quantity, unit, precision, BinaryScale) + + +def _Prefix(quantity, unit, precision, scale_callable, **args): + """Formats an integer and a unit into a string. + + Args: + quantity: A number. + unit: A string, the dimension for quantity, with no multipliers (e.g. + "bps"). If quantity is dimensionless, the empty string. + precision: An integer, the minimum number of digits to display. + scale_callable: A callable, scales the number and units. + **args: named arguments passed to scale_callable. + + Returns: + A string. + """ + separator = ' ' if unit else '' + + if not quantity: + return '0%s%s' % (separator, unit) + + if quantity in [float('inf'), float('-inf')] or math.isnan(quantity): + return '%f%s%s' % (quantity, separator, unit) + + scaled_quantity, scaled_unit = scale_callable(quantity, unit, **args) + + if scaled_unit: + separator = ' ' + + print_pattern = '%%.%df%%s%%s' % max(0, (precision - int( + math.log(abs(scaled_quantity), 10)) - 1)) + + return print_pattern % (scaled_quantity, separator, scaled_unit) + + +# Prefixes and corresponding min_scale and max_scale for decimal formating. +DECIMAL_PREFIXES = ('y', 'z', 'a', 'f', 'p', 'n', u'µ', 'm', + '', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y') +DECIMAL_MIN_SCALE = -8 +DECIMAL_MAX_SCALE = 8 + + +def DecimalScale(quantity, unit, min_scale=0, max_scale=None): + """Get the scaled value and decimal prefixed unit in a tupple. + + DecimalScale(576012, 'bps') -> (576.012, 'kbps') + DecimalScale(1574215, 'bps') -> (1.574215, 'Mbps') + + Args: + quantity: A number. + unit: A string. + min_scale: minimum power of 1000 to normalize to (None = unbounded) + max_scale: maximum power of 1000 to normalize to (None = unbounded) + + Returns: + A tuple of a scaled quantity (float) and BinaryPrefix for the + units (string). + """ + if min_scale is None or min_scale < DECIMAL_MIN_SCALE: + min_scale = DECIMAL_MIN_SCALE + if max_scale is None or max_scale > DECIMAL_MAX_SCALE: + max_scale = DECIMAL_MAX_SCALE + powers = DECIMAL_PREFIXES[ + min_scale - DECIMAL_MIN_SCALE:max_scale - DECIMAL_MIN_SCALE + 1] + return _Scale(quantity, unit, 1000, powers, min_scale) + + +def BinaryScale(quantity, unit): + """Get the scaled value and binary prefixed unit in a tupple. + + BinaryPrefix(576012, 'B') -> (562.51171875, 'KiB') + + Args: + quantity: A number. + unit: A string. + + Returns: + A tuple of a scaled quantity (float) and BinaryPrefix for the + units (string). + """ + return _Scale(quantity, unit, 1024, + ('Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi')) + + +def _Scale(quantity, unit, multiplier, prefixes=None, min_scale=None): + """Returns the formatted quantity and unit into a tuple. + + Args: + quantity: A number. + unit: A string + multiplier: An integer, the ratio between prefixes. + prefixes: A sequence of strings. + If empty or None, no scaling is done. + min_scale: minimum power of multiplier corresponding to the first prefix. + If None assumes prefixes are for positive powers only. + + Returns: + A tuple containing the raw scaled quantity (float) and the prefixed unit. + """ + if (not prefixes or not quantity or math.isnan(quantity) or + quantity in [float('inf'), float('-inf')]): + return float(quantity), unit + + if min_scale is None: + min_scale = 0 + prefixes = ('',) + tuple(prefixes) + value, prefix = quantity, '' + for power, prefix in enumerate(prefixes, min_scale): + # This is more numerically accurate than '/ multiplier ** power'. + value = float(quantity) * multiplier ** -power + if abs(value) < multiplier: + break + return value, prefix + unit + +# Contains the fractions where the full range [1/n ... (n - 1) / n] +# is defined in Unicode. +FRACTIONS = { + 3: (None, u'⅓', u'⅔', None), + 5: (None, u'⅕', u'⅖', u'⅗', u'⅘', None), + 8: (None, u'⅛', u'¼', u'⅜', u'½', u'⅝', u'¾', u'⅞', None), +} + +FRACTION_ROUND_DOWN = 1.0 / (max(FRACTIONS.keys()) * 2.0) +FRACTION_ROUND_UP = 1.0 - FRACTION_ROUND_DOWN + + +def PrettyFraction(number, spacer=''): + """Convert a number into a string that might include a unicode fraction. + + This method returns the integer representation followed by the closest + fraction of a denominator 2, 3, 4, 5 or 8. + For instance, 0.33 will be converted to 1/3. + The resulting representation should be less than 1/16 off. + + Args: + number: a python number + spacer: an optional string to insert between the integer and the fraction + default is an empty string. + + Returns: + a unicode string representing the number. + """ + # We do not want small negative numbers to display as -0. + if number < -FRACTION_ROUND_DOWN: + return u'-%s' % PrettyFraction(-number) + number = abs(number) + rounded = int(number) + fract = number - rounded + if fract >= FRACTION_ROUND_UP: + return str(rounded + 1) + errors_fractions = [] + for denominator, fraction_elements in FRACTIONS.items(): + numerator = int(round(denominator * fract)) + error = abs(fract - (float(numerator) / float(denominator))) + errors_fractions.append((error, fraction_elements[numerator])) + unused_error, fraction_text = min(errors_fractions) + if rounded and fraction_text: + return u'%d%s%s' % (rounded, spacer, fraction_text) + if rounded: + return str(rounded) + if fraction_text: + return fraction_text + return u'0' + + +def Duration(duration, separator=' '): + """Formats a nonnegative number of seconds into a human-readable string. + + Args: + duration: A float duration in seconds. + separator: A string separator between days, hours, minutes and seconds. + + Returns: + Formatted string like '5d 12h 30m 45s'. + """ + try: + delta = datetime.timedelta(seconds=duration) + except OverflowError: + return '>=' + TimeDelta(datetime.timedelta.max) + return TimeDelta(delta, separator=separator) + + +def TimeDelta(delta, separator=' '): + """Format a datetime.timedelta into a human-readable string. + + Args: + delta: The datetime.timedelta to format. + separator: A string separator between days, hours, minutes and seconds. + + Returns: + Formatted string like '5d 12h 30m 45s'. + """ + parts = [] + seconds = delta.seconds + if delta.days: + parts.append('%dd' % delta.days) + if seconds >= 3600: + parts.append('%dh' % (seconds // 3600)) + seconds %= 3600 + if seconds >= 60: + parts.append('%dm' % (seconds // 60)) + seconds %= 60 + seconds += delta.microseconds / 1e6 + if seconds or not parts: + parts.append('%gs' % seconds) + return separator.join(parts) + + +def NaturalSortKey(data): + """Key function for "natural sort" ordering. + + This key function results in a lexigraph sort. For example: + - ['1, '3', '20'] (not ['1', '20', '3']). + - ['Model 9', 'Model 70 SE', 'Model 70 SE2'] + (not ['Model 70 SE', 'Model 70 SE2', 'Model 9']). + + Usage: + new_list = sorted(old_list, key=humanize.NaturalSortKey) + or + list_sort_in_place.sort(key=humanize.NaturalSortKey) + + Based on code by Steven Bazyl . + + Args: + data: str, The key being compared in a sort. + + Returns: + A list which is comparable to other lists for the purpose of sorting. + """ + segments = DIGIT_SPLITTER(data) + for i, value in enumerate(segments): + if value.isdigit(): + segments[i] = int(value) + return segments + + +def UnixTimestamp(unix_ts, tz): + """Format a UNIX timestamp into a human-readable string. + + Args: + unix_ts: UNIX timestamp (number of seconds since epoch). May be a floating + point number. + tz: datetime.tzinfo object, timezone to use when formatting. Typical uses + might want to rely on datelib or pytz to provide the tzinfo object, e.g. + use datelib.UTC, datelib.US_PACIFIC, or pytz.timezone('Europe/Dublin'). + + Returns: + Formatted string like '2013-11-17 11:08:27.720000 PST'. + """ + date_time = datetime.datetime.fromtimestamp(unix_ts, tz) + return date_time.strftime('%Y-%m-%d %H:%M:%S.%f %Z') + + +def AddOrdinalSuffix(value): + """Adds an ordinal suffix to a non-negative integer (e.g. 1 -> '1st'). + + Args: + value: A non-negative integer. + + Returns: + A string containing the integer with a two-letter ordinal suffix. + """ + if value < 0 or value != int(value): + raise ValueError('argument must be a non-negative integer: %s' % value) + + if value % 100 in (11, 12, 13): + suffix = 'th' + else: + rem = value % 10 + if rem == 1: + suffix = 'st' + elif rem == 2: + suffix = 'nd' + elif rem == 3: + suffix = 'rd' + else: + suffix = 'th' + + return str(value) + suffix diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/resources.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/resources.py new file mode 100644 index 0000000..f58fe8d --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/resources.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python +# Copyright 2010 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Wrapper around setuptools' pkg_resources with more Google-like names. + +This module is not very useful on its own, but many Google open-source projects +are used to a different naming scheme, and this module makes the transition +easier. +""" + +__author__ = 'dborowitz@google.com (Dave Borowitz)' + +import atexit + +import pkg_resources + + +def _Call(func, name): + """Call a pkg_resources function. + + Args: + func: A function from pkg_resources that takes the arguments + (package_or_requirement, resource_name); for more info, + see http://peak.telecommunity.com/DevCenter/PkgResources + name: A name of the form 'module.name:path/to/resource'; this should + generally be built from __name__ in the calling module. + + Returns: + The result of calling the function on the split resource name. + """ + pkg_name, resource_name = name.split(':', 1) + return func(pkg_name, resource_name) + + +def GetResource(name): + """Get a resource as a string; see _Call.""" + return _Call(pkg_resources.resource_string, name) + + +def GetResourceAsFile(name): + """Get a resource as a file-like object; see _Call.""" + return _Call(pkg_resources.resource_stream, name) + + +_extracted_files = False + + +def GetResourceFilename(name): + """Get a filename for a resource; see _Call.""" + global _extracted_files # pylint: disable=global-statement + if not _extracted_files: + atexit.register(pkg_resources.cleanup_resources) + _extracted_files = True + + return _Call(pkg_resources.resource_filename, name) diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/run_script_module.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/run_script_module.py new file mode 100644 index 0000000..7526842 --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/run_script_module.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python +# Copyright 2010 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Script for running Google-style applications. + +Unlike normal scripts run through setuptools console_script entry points, +Google-style applications must be run as top-level scripts. + +Given an already-imported module, users can use the RunScriptModule function to +set up the appropriate executable environment to spawn a new Python process to +run the module as a script. + +To use this technique in your project, first create a module called e.g. +stubs.py with contents like: + + from google.apputils import run_script_module + + def RunMyScript(): + import my.script + run_script_module.RunScriptModule(my.script) + + def RunMyOtherScript(): + import my.other_script + run_script_module.RunScriptModule(my.other_script) + +Then, set up entry points in your setup.py that point to the functions in your +stubs module: + + setup( + ... + entry_points = { + 'console_scripts': [ + 'my_script = my.stubs:RunMyScript', + 'my_other_script = my.stubs.RunMyOtherScript', + ], + }, + ) + +When your project is installed, setuptools will generate minimal wrapper scripts +to call your stub functions, which in turn execv your script modules. That's it! +""" + +__author__ = 'dborowitz@google.com (Dave Borowitz)' + +import os +import re +import sys + + +def FindEnv(progname): + """Find the program in the system path. + + Args: + progname: The name of the program. + + Returns: + The full pathname of the program. + + Raises: + AssertionError: if the program was not found. + """ + for path in os.environ['PATH'].split(':'): + fullname = os.path.join(path, progname) + if os.access(fullname, os.X_OK): + return fullname + raise AssertionError( + "Could not find an executable named '%s' in the system path" % progname) + + +def GetPdbArgs(python): + """Try to get the path to pdb.py and return it in a list. + + Args: + python: The full path to a Python executable. + + Returns: + A list of strings. If a relevant pdb.py was found, this will be + ['/path/to/pdb.py']; if not, return ['-m', 'pdb'] and hope for the best. + (This latter technique will fail for Python 2.2.) + """ + # Usually, python is /usr/bin/pythonxx and pdb is /usr/lib/pythonxx/pdb.py + components = python.split('/') + if len(components) >= 2: + pdb_path = '/'.join(components[0:-2] + ['lib'] + + components[-1:] + ['pdb.py']) + if os.access(pdb_path, os.R_OK): + return [pdb_path] + + # No pdb module found in the python path, default to -m pdb + return ['-m', 'pdb'] + + +def StripDelimiters(s, beg, end): + if s[0] == beg: + assert s[-1] == end + return (s[1:-1], True) + else: + return (s, False) + + +def StripQuotes(s): + (s, stripped) = StripDelimiters(s, '"', '"') + if not stripped: + (s, stripped) = StripDelimiters(s, "'", "'") + return s + + +def PrintOurUsage(): + """Print usage for the stub script.""" + print 'Stub script %s (auto-generated). Options:' % sys.argv[0] + print ('--helpstub ' + 'Show help for stub script.') + print ('--debug_binary ' + 'Run python under debugger specified by --debugger.') + print ('--debugger= ' + "Debugger for --debug_binary. Default: 'gdb --args'.") + print ('--debug_script ' + 'Run wrapped script with python debugger module (pdb).') + print ('--show_command_and_exit ' + 'Print command which would be executed and exit.') + print ('These options must appear first in the command line, all others will ' + 'be passed to the wrapped script.') + + +def RunScriptModule(module): + """Run a module as a script. + + Locates the module's file and runs it in the current interpreter, or + optionally a debugger. + + Args: + module: The module object to run. + """ + args = sys.argv[1:] + + debug_binary = False + debugger = 'gdb --args' + debug_script = False + show_command_and_exit = False + + while args: + if args[0] == '--helpstub': + PrintOurUsage() + sys.exit(0) + if args[0] == '--debug_binary': + debug_binary = True + args = args[1:] + continue + if args[0] == '--debug_script': + debug_script = True + args = args[1:] + continue + if args[0] == '--show_command_and_exit': + show_command_and_exit = True + args = args[1:] + continue + matchobj = re.match('--debugger=(.+)', args[0]) + if matchobj is not None: + debugger = StripQuotes(matchobj.group(1)) + args = args[1:] + continue + break + + # Now look for my main python source file + # TODO(dborowitz): This will fail if the module was zipimported, which means + # no egg depending on this script runner can be zip_safe. + main_filename = module.__file__ + assert os.path.exists(main_filename), ('Cannot exec() %r: file not found.' % + main_filename) + assert os.access(main_filename, os.R_OK), ('Cannot exec() %r: file not' + ' readable.' % main_filename) + + args = [main_filename] + args + + if debug_binary: + debugger_args = debugger.split() + program = debugger_args[0] + # If pathname is not absolute, determine full path using PATH + if not os.path.isabs(program): + program = FindEnv(program) + python_path = sys.executable + command_vec = [python_path] + if debug_script: + command_vec.extend(GetPdbArgs(python_path)) + args = [program] + debugger_args[1:] + command_vec + args + + elif debug_script: + args = [sys.executable] + GetPdbArgs(program) + args + + else: + program = sys.executable + args = [sys.executable] + args + + if show_command_and_exit: + print 'program: "%s"' % program + print 'args:', args + sys.exit(0) + + try: + sys.stdout.flush() + os.execv(program, args) + except EnvironmentError as e: + if not getattr(e, 'filename', None): + e.filename = program # Add info to error message + raise diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/setup_command.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/setup_command.py new file mode 100644 index 0000000..30ef01e --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/setup_command.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python +# Copyright 2010 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Setuptools extension for running Google-style Python tests. + +Google-style Python tests differ from normal Python tests in that each test +module is intended to be executed as an independent script. In particular, the +test fixture code in basetest.main() that executes module-wide setUp() and +tearDown() depends on __main__ being the module under test. This conflicts with +the usual setuptools test style, which uses a single TestSuite to run all of a +package's tests. + +This package provides a new setuptools command, google_test, that runs all of +the google-style tests found in a specified directory. + +NOTE: This works by overriding sys.modules['__main__'] with the module under +test, but still runs tests in the same process. Thus it will *not* work if your +tests depend on any of the following: + - Per-process (as opposed to per-module) initialization. + - Any entry point that is not basetest.main(). + +To use the google_test command in your project, do something like the following: + +In setup.py: + setup( + name = "mypackage", + ... + setup_requires = ["google-apputils>=0.2"], + google_test_dir = "tests", + ) + +Run: + $ python setup.py google_test +""" + +from distutils import errors +import imp +import os +import re +import shlex +import sys +import traceback + +from setuptools.command import test + + +def ValidateGoogleTestDir(unused_dist, unused_attr, value): + """Validate that the test directory is a directory.""" + if not os.path.isdir(value): + raise errors.DistutilsSetupError('%s is not a directory' % value) + + +class GoogleTest(test.test): + """Command to run Google-style tests after in-place build.""" + + description = 'run Google-style tests after in-place build' + + _DEFAULT_PATTERN = r'_(?:unit|reg)?test\.py$' + + user_options = [ + ('test-dir=', 'd', 'Look for test modules in specified directory.'), + ('test-module-pattern=', 'p', + ('Pattern for matching test modules. Defaults to %r. ' + 'Only source files (*.py) will be considered, even if more files match ' + 'this pattern.' % _DEFAULT_PATTERN)), + ('test-args=', 'a', + ('Arguments to pass to basetest.main(). May only make sense if ' + 'test_module_pattern matches exactly one test.')), + ] + + def initialize_options(self): + self.test_dir = None + self.test_module_pattern = self._DEFAULT_PATTERN + self.test_args = '' + + # Set to a dummy value, since we don't call the superclass methods for + # options parsing. + self.test_suite = True + + def finalize_options(self): + if self.test_dir is None: + if self.distribution.google_test_dir: + self.test_dir = self.distribution.google_test_dir + else: + raise errors.DistutilsOptionError('No test directory specified') + + self.test_module_pattern = re.compile(self.test_module_pattern) + self.test_args = shlex.split(self.test_args) + + def _RunTestModule(self, module_path): + """Run a module as a test module given its path. + + Args: + module_path: The path to the module to test; must end in '.py'. + + Returns: + True if the tests in this module pass, False if not or if an error occurs. + """ + + path, filename = os.path.split(module_path) + + old_argv = sys.argv[:] + old_path = sys.path[:] + old_modules = sys.modules.copy() + + # Make relative imports in test modules work with our mangled sys.path. + sys.path.insert(0, path) + + module_name = filename.replace('.py', '') + import_tuple = imp.find_module(module_name, [path]) + module = imp.load_module(module_name, *import_tuple) + + sys.modules['__main__'] = module + sys.argv = [module.__file__] + self.test_args + + # Late import since this must be run with the project's sys.path. + import basetest + try: + try: + sys.stderr.write('Testing %s\n' % module_name) + basetest.main() + + # basetest.main() should always call sys.exit, so this is very bad. + return False + except SystemExit as e: + returncode, = e.args + return not returncode + except: + traceback.print_exc() + return False + finally: + sys.argv[:] = old_argv + sys.path[:] = old_path + sys.modules.clear() + sys.modules.update(old_modules) + + def run_tests(self): + ok = True + for path, _, filenames in os.walk(self.test_dir): + for filename in filenames: + if not filename.endswith('.py'): + continue + file_path = os.path.join(path, filename) + if self.test_module_pattern.search(file_path): + ok &= self._RunTestModule(file_path) + + sys.exit(int(not ok)) diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/shellutil.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/shellutil.py new file mode 100644 index 0000000..29584a9 --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/shellutil.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# This code must be source compatible with Python 2.4 through 3.3. +# +# Copyright 2003 Google Inc. All Rights Reserved. + +"""Utility functions for dealing with command interpreters.""" + + + +import os + +# Running windows? +win32 = (os.name == 'nt') + + +def ShellEscapeList(words): + """Turn a list of words into a shell-safe string. + + Args: + words: A list of words, e.g. for a command. + + Returns: + A string of shell-quoted and space-separated words. + """ + + if win32: + return ' '.join(words) + + s = '' + for word in words: + # Single quote word, and replace each ' in word with '"'"' + s += "'" + word.replace("'", "'\"'\"'") + "' " + + return s[:-1] + + +def ShellifyStatus(status): + """Translate from a wait() exit status to a command shell exit status.""" + + if not win32: + if os.WIFEXITED(status): + # decode and return exit status + status = os.WEXITSTATUS(status) + else: + # On Unix, the wait() produces a 16 bit return code. Unix shells + # lossily compress this to an 8 bit value, using the formula below. + # Shell status code < 128 means the process exited normally, status + # code >= 128 means the process died because of a signal. + status = 128 + os.WTERMSIG(status) + return status diff --git a/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/stopwatch.py b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/stopwatch.py new file mode 100644 index 0000000..6b6f01a --- /dev/null +++ b/pythonlib/google_apputils-0.4.2-py2.7.egg/google/apputils/stopwatch.py @@ -0,0 +1,204 @@ +#!/usr/bin/env python +# Copyright 2005 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A useful class for digesting, on a high-level, where time in a program goes. + +Usage: + +sw = StopWatch() +sw.start() +sw.start('foo') +foo() +sw.stop('foo') +args = overhead_code() +sw.start('bar') +bar(args) +sw.stop('bar') +sw.dump() + +If you start a new timer when one is already running, then the other one will +stop running, and restart when you stop this timer. This behavior is very +useful for when you want to try timing for a subcall without remembering +what is already running. For instance: + +sw.start('all_this') +do_some_stuff() +sw.start('just_that') +small_but_expensive_function() +sw.stop('just_that') +cleanup_code() +sw.stop('all_this') + +In this case, the output will be what you want: the time spent in +small_but_expensive function will show up in the timer for just_that and not +all_this. +""" + +import StringIO +import time + + +__owner__ = 'dbentley@google.com (Dan Bentley)' + + +class StopWatch(object): + """Class encapsulating a timer; see above for example usage. + + Instance variables: + timers: map of stopwatch name -> time for each currently running stopwatch, + where time is seconds from the epoch of when this stopwatch was + started. + accum: map of stopwatch name -> accumulated time, in seconds, it has + already been run for. + stopped: map of timer name -> list of timer names that are blocking it. + counters: map of timer name -> number of times it has been started. + """ + + def __init__(self): + self.timers = {} + self.accum = {} + self.stopped = {} + self.counters = {} + + def start(self, timer='total', stop_others=True): + """Start a timer. + + Args: + timer: str; name of the timer to start, defaults to the overall timer. + stop_others: bool; if True, stop all other running timers. If False, then + you can have time that is spent inside more than one timer + and there's a good chance that the overhead measured will be + negative. + """ + if stop_others: + stopped = [] + for other in list(self.timers): + if not other == 'total': + self.stop(other) + stopped.append(other) + self.stopped[timer] = stopped + self.counters[timer] = self.counters.get(timer, 0) + 1 + self.timers[timer] = time.time() + + def stop(self, timer='total'): + """Stop a running timer. + + This includes restarting anything that was stopped on behalf of this timer. + + Args: + timer: str; name of the timer to stop, defaults to the overall timer. + + Raises: + RuntimeError: if timer refers to a timer that was never started. + """ + if timer not in self.timers: + raise RuntimeError( + 'Tried to stop timer that was never started: %s' % timer) + self.accum[timer] = self.timervalue(timer) + del self.timers[timer] + for stopped in self.stopped.get(timer, []): + self.start(stopped, stop_others=0) + + def timervalue(self, timer='total', now=None): + """Return the value seen by this timer so far. + + If the timer is stopped, this will be the accumulated time it has seen. + If the timer is running, this will be the time it has seen up to now. + If the timer has never been started, this will be zero. + + Args: + timer: str; the name of the timer to report on. + now: long; if provided, the time to use for 'now' for running timers. + """ + if not now: + now = time.time() + + if timer in self.timers: + # Timer is running now. + return self.accum.get(timer, 0.0) + (now - self.timers[timer]) + elif timer in self.accum: + # Timer is stopped. + return self.accum[timer] + else: + # Timer is never started. + return 0.0 + + def overhead(self, now=None): + """Calculate the overhead. + + Args: + now: (optional) time to use as the current time. + + Returns: + The overhead, that is, time spent in total but not in any sub timer. This + may be negative if time was counted in two sub timers. Avoid this by + always using stop_others. + """ + total = self.timervalue('total', now) + if total == 0.0: + return 0.0 + + all_timers = sum(self.accum.itervalues()) + return total - (all_timers - total) + + def results(self, verbose=False): + """Get the results of this stopwatch. + + Args: + verbose: bool; if True, show all times; otherwise, show only the total. + + Returns: + A list of tuples showing the output of this stopwatch, of the form + (name, value, num_starts) for each timer. Note that if the total timer + is not used, non-verbose results will be the empty list. + """ + now = time.time() + + all_names = self.accum.keys() + names = [] + + if 'total' in all_names: + all_names.remove('total') + all_names.sort() + if verbose: + names = all_names + + results = [(name, self.timervalue(name, now=now), self.counters[name]) + for name in names] + if verbose: + results.append(('overhead', self.overhead(now=now), 1)) + if 'total' in self.accum or 'total' in self.timers: + results.append(('total', self.timervalue('total', now=now), + self.counters['total'])) + return results + + def dump(self, verbose=False): + """Describes where time in this stopwatch was spent. + + Args: + verbose: bool; if True, show all timers; otherwise, show only the total. + + Returns: + A string describing the stopwatch. + """ + output = StringIO.StringIO() + results = self.results(verbose=verbose) + maxlength = max([len(result[0]) for result in results]) + for result in results: + output.write('%*s: %6.2fs\n' % (maxlength, result[0], result[1])) + return output.getvalue() + +# Create a stopwatch to be publicly used. +sw = StopWatch() diff --git a/pythonlib/mox.py b/pythonlib/mox.py new file mode 100644 index 0000000..ce80ba5 --- /dev/null +++ b/pythonlib/mox.py @@ -0,0 +1,1401 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file is used for testing. The original is at: +# http://code.google.com/p/pymox/ + +"""Mox, an object-mocking framework for Python. + +Mox works in the record-replay-verify paradigm. When you first create +a mock object, it is in record mode. You then programmatically set +the expected behavior of the mock object (what methods are to be +called on it, with what parameters, what they should return, and in +what order). + +Once you have set up the expected mock behavior, you put it in replay +mode. Now the mock responds to method calls just as you told it to. +If an unexpected method (or an expected method with unexpected +parameters) is called, then an exception will be raised. + +Once you are done interacting with the mock, you need to verify that +all the expected interactions occured. (Maybe your code exited +prematurely without calling some cleanup method!) The verify phase +ensures that every expected method was called; otherwise, an exception +will be raised. + +Suggested usage / workflow: + + # Create Mox factory + my_mox = Mox() + + # Create a mock data access object + mock_dao = my_mox.CreateMock(DAOClass) + + # Set up expected behavior + mock_dao.RetrievePersonWithIdentifier('1').AndReturn(person) + mock_dao.DeletePerson(person) + + # Put mocks in replay mode + my_mox.ReplayAll() + + # Inject mock object and run test + controller.SetDao(mock_dao) + controller.DeletePersonById('1') + + # Verify all methods were called as expected + my_mox.VerifyAll() +""" + +from collections import deque +import re +import types +import unittest + +import stubout + +class Error(AssertionError): + """Base exception for this module.""" + + pass + + +class ExpectedMethodCallsError(Error): + """Raised when Verify() is called before all expected methods have been called + """ + + def __init__(self, expected_methods): + """Init exception. + + Args: + # expected_methods: A sequence of MockMethod objects that should have been + # called. + expected_methods: [MockMethod] + + Raises: + ValueError: if expected_methods contains no methods. + """ + + if not expected_methods: + raise ValueError("There must be at least one expected method") + Error.__init__(self) + self._expected_methods = expected_methods + + def __str__(self): + calls = "\n".join(["%3d. %s" % (i, m) + for i, m in enumerate(self._expected_methods)]) + return "Verify: Expected methods never called:\n%s" % (calls,) + + +class UnexpectedMethodCallError(Error): + """Raised when an unexpected method is called. + + This can occur if a method is called with incorrect parameters, or out of the + specified order. + """ + + def __init__(self, unexpected_method, expected): + """Init exception. + + Args: + # unexpected_method: MockMethod that was called but was not at the head of + # the expected_method queue. + # expected: MockMethod or UnorderedGroup the method should have + # been in. + unexpected_method: MockMethod + expected: MockMethod or UnorderedGroup + """ + + Error.__init__(self) + self._unexpected_method = unexpected_method + self._expected = expected + + def __str__(self): + return "Unexpected method call: %s. Expecting: %s" % \ + (self._unexpected_method, self._expected) + + +class UnknownMethodCallError(Error): + """Raised if an unknown method is requested of the mock object.""" + + def __init__(self, unknown_method_name): + """Init exception. + + Args: + # unknown_method_name: Method call that is not part of the mocked class's + # public interface. + unknown_method_name: str + """ + + Error.__init__(self) + self._unknown_method_name = unknown_method_name + + def __str__(self): + return "Method called is not a member of the object: %s" % \ + self._unknown_method_name + + +class Mox(object): + """Mox: a factory for creating mock objects.""" + + # A list of types that should be stubbed out with MockObjects (as + # opposed to MockAnythings). + _USE_MOCK_OBJECT = [types.ClassType, types.InstanceType, types.ModuleType, + types.ObjectType, types.TypeType] + + def __init__(self): + """Initialize a new Mox.""" + + self._mock_objects = [] + self.stubs = stubout.StubOutForTesting() + + def CreateMock(self, class_to_mock): + """Create a new mock object. + + Args: + # class_to_mock: the class to be mocked + class_to_mock: class + + Returns: + MockObject that can be used as the class_to_mock would be. + """ + + new_mock = MockObject(class_to_mock) + self._mock_objects.append(new_mock) + return new_mock + + def CreateMockAnything(self): + """Create a mock that will accept any method calls. + + This does not enforce an interface. + """ + + new_mock = MockAnything() + self._mock_objects.append(new_mock) + return new_mock + + def ReplayAll(self): + """Set all mock objects to replay mode.""" + + for mock_obj in self._mock_objects: + mock_obj._Replay() + + + def VerifyAll(self): + """Call verify on all mock objects created.""" + + for mock_obj in self._mock_objects: + mock_obj._Verify() + + def ResetAll(self): + """Call reset on all mock objects. This does not unset stubs.""" + + for mock_obj in self._mock_objects: + mock_obj._Reset() + + def StubOutWithMock(self, obj, attr_name, use_mock_anything=False): + """Replace a method, attribute, etc. with a Mock. + + This will replace a class or module with a MockObject, and everything else + (method, function, etc) with a MockAnything. This can be overridden to + always use a MockAnything by setting use_mock_anything to True. + + Args: + obj: A Python object (class, module, instance, callable). + attr_name: str. The name of the attribute to replace with a mock. + use_mock_anything: bool. True if a MockAnything should be used regardless + of the type of attribute. + """ + + attr_to_replace = getattr(obj, attr_name) + if type(attr_to_replace) in self._USE_MOCK_OBJECT and not use_mock_anything: + stub = self.CreateMock(attr_to_replace) + else: + stub = self.CreateMockAnything() + + self.stubs.Set(obj, attr_name, stub) + + def UnsetStubs(self): + """Restore stubs to their original state.""" + + self.stubs.UnsetAll() + +def Replay(*args): + """Put mocks into Replay mode. + + Args: + # args is any number of mocks to put into replay mode. + """ + + for mock in args: + mock._Replay() + + +def Verify(*args): + """Verify mocks. + + Args: + # args is any number of mocks to be verified. + """ + + for mock in args: + mock._Verify() + + +def Reset(*args): + """Reset mocks. + + Args: + # args is any number of mocks to be reset. + """ + + for mock in args: + mock._Reset() + + +class MockAnything: + """A mock that can be used to mock anything. + + This is helpful for mocking classes that do not provide a public interface. + """ + + def __init__(self): + """ """ + self._Reset() + + def __getattr__(self, method_name): + """Intercept method calls on this object. + + A new MockMethod is returned that is aware of the MockAnything's + state (record or replay). The call will be recorded or replayed + by the MockMethod's __call__. + + Args: + # method name: the name of the method being called. + method_name: str + + Returns: + A new MockMethod aware of MockAnything's state (record or replay). + """ + + return self._CreateMockMethod(method_name) + + def _CreateMockMethod(self, method_name): + """Create a new mock method call and return it. + + Args: + # method name: the name of the method being called. + method_name: str + + Returns: + A new MockMethod aware of MockAnything's state (record or replay). + """ + + return MockMethod(method_name, self._expected_calls_queue, + self._replay_mode) + + def __nonzero__(self): + """Return 1 for nonzero so the mock can be used as a conditional.""" + + return 1 + + def __eq__(self, rhs): + """Provide custom logic to compare objects.""" + + return (isinstance(rhs, MockAnything) and + self._replay_mode == rhs._replay_mode and + self._expected_calls_queue == rhs._expected_calls_queue) + + def __ne__(self, rhs): + """Provide custom logic to compare objects.""" + + return not self == rhs + + def _Replay(self): + """Start replaying expected method calls.""" + + self._replay_mode = True + + def _Verify(self): + """Verify that all of the expected calls have been made. + + Raises: + ExpectedMethodCallsError: if there are still more method calls in the + expected queue. + """ + + # If the list of expected calls is not empty, raise an exception + if self._expected_calls_queue: + # The last MultipleTimesGroup is not popped from the queue. + if (len(self._expected_calls_queue) == 1 and + isinstance(self._expected_calls_queue[0], MultipleTimesGroup) and + self._expected_calls_queue[0].IsSatisfied()): + pass + else: + raise ExpectedMethodCallsError(self._expected_calls_queue) + + def _Reset(self): + """Reset the state of this mock to record mode with an empty queue.""" + + # Maintain a list of method calls we are expecting + self._expected_calls_queue = deque() + + # Make sure we are in setup mode, not replay mode + self._replay_mode = False + + +class MockObject(MockAnything, object): + """A mock object that simulates the public/protected interface of a class.""" + + def __init__(self, class_to_mock): + """Initialize a mock object. + + This determines the methods and properties of the class and stores them. + + Args: + # class_to_mock: class to be mocked + class_to_mock: class + """ + + # This is used to hack around the mixin/inheritance of MockAnything, which + # is not a proper object (it can be anything. :-) + MockAnything.__dict__['__init__'](self) + + # Get a list of all the public and special methods we should mock. + self._known_methods = set() + self._known_vars = set() + self._class_to_mock = class_to_mock + for method in dir(class_to_mock): + if callable(getattr(class_to_mock, method)): + self._known_methods.add(method) + else: + self._known_vars.add(method) + + def __getattr__(self, name): + """Intercept attribute request on this object. + + If the attribute is a public class variable, it will be returned and not + recorded as a call. + + If the attribute is not a variable, it is handled like a method + call. The method name is checked against the set of mockable + methods, and a new MockMethod is returned that is aware of the + MockObject's state (record or replay). The call will be recorded + or replayed by the MockMethod's __call__. + + Args: + # name: the name of the attribute being requested. + name: str + + Returns: + Either a class variable or a new MockMethod that is aware of the state + of the mock (record or replay). + + Raises: + UnknownMethodCallError if the MockObject does not mock the requested + method. + """ + + if name in self._known_vars: + return getattr(self._class_to_mock, name) + + if name in self._known_methods: + return self._CreateMockMethod(name) + + raise UnknownMethodCallError(name) + + def __eq__(self, rhs): + """Provide custom logic to compare objects.""" + + return (isinstance(rhs, MockObject) and + self._class_to_mock == rhs._class_to_mock and + self._replay_mode == rhs._replay_mode and + self._expected_calls_queue == rhs._expected_calls_queue) + + def __setitem__(self, key, value): + """Provide custom logic for mocking classes that support item assignment. + + Args: + key: Key to set the value for. + value: Value to set. + + Returns: + Expected return value in replay mode. A MockMethod object for the + __setitem__ method that has already been called if not in replay mode. + + Raises: + TypeError if the underlying class does not support item assignment. + UnexpectedMethodCallError if the object does not expect the call to + __setitem__. + + """ + setitem = self._class_to_mock.__dict__.get('__setitem__', None) + + # Verify the class supports item assignment. + if setitem is None: + raise TypeError('object does not support item assignment') + + # If we are in replay mode then simply call the mock __setitem__ method. + if self._replay_mode: + return MockMethod('__setitem__', self._expected_calls_queue, + self._replay_mode)(key, value) + + + # Otherwise, create a mock method __setitem__. + return self._CreateMockMethod('__setitem__')(key, value) + + def __getitem__(self, key): + """Provide custom logic for mocking classes that are subscriptable. + + Args: + key: Key to return the value for. + + Returns: + Expected return value in replay mode. A MockMethod object for the + __getitem__ method that has already been called if not in replay mode. + + Raises: + TypeError if the underlying class is not subscriptable. + UnexpectedMethodCallError if the object does not expect the call to + __setitem__. + + """ + getitem = self._class_to_mock.__dict__.get('__getitem__', None) + + # Verify the class supports item assignment. + if getitem is None: + raise TypeError('unsubscriptable object') + + # If we are in replay mode then simply call the mock __getitem__ method. + if self._replay_mode: + return MockMethod('__getitem__', self._expected_calls_queue, + self._replay_mode)(key) + + + # Otherwise, create a mock method __getitem__. + return self._CreateMockMethod('__getitem__')(key) + + def __call__(self, *params, **named_params): + """Provide custom logic for mocking classes that are callable.""" + + # Verify the class we are mocking is callable + callable = self._class_to_mock.__dict__.get('__call__', None) + if callable is None: + raise TypeError('Not callable') + + # Because the call is happening directly on this object instead of a method, + # the call on the mock method is made right here + mock_method = self._CreateMockMethod('__call__') + return mock_method(*params, **named_params) + + @property + def __class__(self): + """Return the class that is being mocked.""" + + return self._class_to_mock + + +class MockMethod(object): + """Callable mock method. + + A MockMethod should act exactly like the method it mocks, accepting parameters + and returning a value, or throwing an exception (as specified). When this + method is called, it can optionally verify whether the called method (name and + signature) matches the expected method. + """ + + def __init__(self, method_name, call_queue, replay_mode): + """Construct a new mock method. + + Args: + # method_name: the name of the method + # call_queue: deque of calls, verify this call against the head, or add + # this call to the queue. + # replay_mode: False if we are recording, True if we are verifying calls + # against the call queue. + method_name: str + call_queue: list or deque + replay_mode: bool + """ + + self._name = method_name + self._call_queue = call_queue + if not isinstance(call_queue, deque): + self._call_queue = deque(self._call_queue) + self._replay_mode = replay_mode + + self._params = None + self._named_params = None + self._return_value = None + self._exception = None + self._side_effects = None + + def __call__(self, *params, **named_params): + """Log parameters and return the specified return value. + + If the Mock(Anything/Object) associated with this call is in record mode, + this MockMethod will be pushed onto the expected call queue. If the mock + is in replay mode, this will pop a MockMethod off the top of the queue and + verify this call is equal to the expected call. + + Raises: + UnexpectedMethodCall if this call is supposed to match an expected method + call and it does not. + """ + + self._params = params + self._named_params = named_params + + if not self._replay_mode: + self._call_queue.append(self) + return self + + expected_method = self._VerifyMethodCall() + + if expected_method._side_effects: + expected_method._side_effects(*params, **named_params) + + if expected_method._exception: + raise expected_method._exception + + return expected_method._return_value + + def __getattr__(self, name): + """Raise an AttributeError with a helpful message.""" + + raise AttributeError('MockMethod has no attribute "%s". ' + 'Did you remember to put your mocks in replay mode?' % name) + + def _PopNextMethod(self): + """Pop the next method from our call queue.""" + try: + return self._call_queue.popleft() + except IndexError: + raise UnexpectedMethodCallError(self, None) + + def _VerifyMethodCall(self): + """Verify the called method is expected. + + This can be an ordered method, or part of an unordered set. + + Returns: + The expected mock method. + + Raises: + UnexpectedMethodCall if the method called was not expected. + """ + + expected = self._PopNextMethod() + + # Loop here, because we might have a MethodGroup followed by another + # group. + while isinstance(expected, MethodGroup): + expected, method = expected.MethodCalled(self) + if method is not None: + return method + + # This is a mock method, so just check equality. + if expected != self: + raise UnexpectedMethodCallError(self, expected) + + return expected + + def __str__(self): + params = ', '.join( + [repr(p) for p in self._params or []] + + ['%s=%r' % x for x in sorted((self._named_params or {}).items())]) + desc = "%s(%s) -> %r" % (self._name, params, self._return_value) + return desc + + def __eq__(self, rhs): + """Test whether this MockMethod is equivalent to another MockMethod. + + Args: + # rhs: the right hand side of the test + rhs: MockMethod + """ + + return (isinstance(rhs, MockMethod) and + self._name == rhs._name and + self._params == rhs._params and + self._named_params == rhs._named_params) + + def __ne__(self, rhs): + """Test whether this MockMethod is not equivalent to another MockMethod. + + Args: + # rhs: the right hand side of the test + rhs: MockMethod + """ + + return not self == rhs + + def GetPossibleGroup(self): + """Returns a possible group from the end of the call queue or None if no + other methods are on the stack. + """ + + # Remove this method from the tail of the queue so we can add it to a group. + this_method = self._call_queue.pop() + assert this_method == self + + # Determine if the tail of the queue is a group, or just a regular ordered + # mock method. + group = None + try: + group = self._call_queue[-1] + except IndexError: + pass + + return group + + def _CheckAndCreateNewGroup(self, group_name, group_class): + """Checks if the last method (a possible group) is an instance of our + group_class. Adds the current method to this group or creates a new one. + + Args: + + group_name: the name of the group. + group_class: the class used to create instance of this new group + """ + group = self.GetPossibleGroup() + + # If this is a group, and it is the correct group, add the method. + if isinstance(group, group_class) and group.group_name() == group_name: + group.AddMethod(self) + return self + + # Create a new group and add the method. + new_group = group_class(group_name) + new_group.AddMethod(self) + self._call_queue.append(new_group) + return self + + def InAnyOrder(self, group_name="default"): + """Move this method into a group of unordered calls. + + A group of unordered calls must be defined together, and must be executed + in full before the next expected method can be called. There can be + multiple groups that are expected serially, if they are given + different group names. The same group name can be reused if there is a + standard method call, or a group with a different name, spliced between + usages. + + Args: + group_name: the name of the unordered group. + + Returns: + self + """ + return self._CheckAndCreateNewGroup(group_name, UnorderedGroup) + + def MultipleTimes(self, group_name="default"): + """Move this method into group of calls which may be called multiple times. + + A group of repeating calls must be defined together, and must be executed in + full before the next expected mehtod can be called. + + Args: + group_name: the name of the unordered group. + + Returns: + self + """ + return self._CheckAndCreateNewGroup(group_name, MultipleTimesGroup) + + def AndReturn(self, return_value): + """Set the value to return when this method is called. + + Args: + # return_value can be anything. + """ + + self._return_value = return_value + return return_value + + def AndRaise(self, exception): + """Set the exception to raise when this method is called. + + Args: + # exception: the exception to raise when this method is called. + exception: Exception + """ + + self._exception = exception + + def WithSideEffects(self, side_effects): + """Set the side effects that are simulated when this method is called. + + Args: + side_effects: A callable which modifies the parameters or other relevant + state which a given test case depends on. + + Returns: + Self for chaining with AndReturn and AndRaise. + """ + self._side_effects = side_effects + return self + +class Comparator: + """Base class for all Mox comparators. + + A Comparator can be used as a parameter to a mocked method when the exact + value is not known. For example, the code you are testing might build up a + long SQL string that is passed to your mock DAO. You're only interested that + the IN clause contains the proper primary keys, so you can set your mock + up as follows: + + mock_dao.RunQuery(StrContains('IN (1, 2, 4, 5)')).AndReturn(mock_result) + + Now whatever query is passed in must contain the string 'IN (1, 2, 4, 5)'. + + A Comparator may replace one or more parameters, for example: + # return at most 10 rows + mock_dao.RunQuery(StrContains('SELECT'), 10) + + or + + # Return some non-deterministic number of rows + mock_dao.RunQuery(StrContains('SELECT'), IsA(int)) + """ + + def equals(self, rhs): + """Special equals method that all comparators must implement. + + Args: + rhs: any python object + """ + + raise NotImplementedError, 'method must be implemented by a subclass.' + + def __eq__(self, rhs): + return self.equals(rhs) + + def __ne__(self, rhs): + return not self.equals(rhs) + + +class IsA(Comparator): + """This class wraps a basic Python type or class. It is used to verify + that a parameter is of the given type or class. + + Example: + mock_dao.Connect(IsA(DbConnectInfo)) + """ + + def __init__(self, class_name): + """Initialize IsA + + Args: + class_name: basic python type or a class + """ + + self._class_name = class_name + + def equals(self, rhs): + """Check to see if the RHS is an instance of class_name. + + Args: + # rhs: the right hand side of the test + rhs: object + + Returns: + bool + """ + + try: + return isinstance(rhs, self._class_name) + except TypeError: + # Check raw types if there was a type error. This is helpful for + # things like cStringIO.StringIO. + return type(rhs) == type(self._class_name) + + def __repr__(self): + return str(self._class_name) + +class IsAlmost(Comparator): + """Comparison class used to check whether a parameter is nearly equal + to a given value. Generally useful for floating point numbers. + + Example mock_dao.SetTimeout((IsAlmost(3.9))) + """ + + def __init__(self, float_value, places=7): + """Initialize IsAlmost. + + Args: + float_value: The value for making the comparison. + places: The number of decimal places to round to. + """ + + self._float_value = float_value + self._places = places + + def equals(self, rhs): + """Check to see if RHS is almost equal to float_value + + Args: + rhs: the value to compare to float_value + + Returns: + bool + """ + + try: + return round(rhs-self._float_value, self._places) == 0 + except TypeError: + # This is probably because either float_value or rhs is not a number. + return False + + def __repr__(self): + return str(self._float_value) + +class StrContains(Comparator): + """Comparison class used to check whether a substring exists in a + string parameter. This can be useful in mocking a database with SQL + passed in as a string parameter, for example. + + Example: + mock_dao.RunQuery(StrContains('IN (1, 2, 4, 5)')).AndReturn(mock_result) + """ + + def __init__(self, search_string): + """Initialize. + + Args: + # search_string: the string you are searching for + search_string: str + """ + + self._search_string = search_string + + def equals(self, rhs): + """Check to see if the search_string is contained in the rhs string. + + Args: + # rhs: the right hand side of the test + rhs: object + + Returns: + bool + """ + + try: + return rhs.find(self._search_string) > -1 + except Exception: + return False + + def __repr__(self): + return '' % self._search_string + + +class Regex(Comparator): + """Checks if a string matches a regular expression. + + This uses a given regular expression to determine equality. + """ + + def __init__(self, pattern, flags=0): + """Initialize. + + Args: + # pattern is the regular expression to search for + pattern: str + # flags passed to re.compile function as the second argument + flags: int + """ + + self.regex = re.compile(pattern, flags=flags) + + def equals(self, rhs): + """Check to see if rhs matches regular expression pattern. + + Returns: + bool + """ + + return self.regex.search(rhs) is not None + + def __repr__(self): + s = '' % self._key + + +class ContainsKeyValue(Comparator): + """Checks whether a key/value pair is in a dict parameter. + + Example: + mock_dao.UpdateUsers(ContainsKeyValue('stevepm', stevepm_user_info)) + """ + + def __init__(self, key, value): + """Initialize. + + Args: + # key: a key in a dict + # value: the corresponding value + """ + + self._key = key + self._value = value + + def equals(self, rhs): + """Check whether the given key/value pair is in the rhs dict. + + Returns: + bool + """ + + try: + return rhs[self._key] == self._value + except Exception: + return False + + def __repr__(self): + return '' % (self._key, self._value) + + +class SameElementsAs(Comparator): + """Checks whether iterables contain the same elements (ignoring order). + + Example: + mock_dao.ProcessUsers(SameElementsAs('stevepm', 'salomaki')) + """ + + def __init__(self, expected_seq): + """Initialize. + + Args: + expected_seq: a sequence + """ + + self._expected_seq = expected_seq + + def equals(self, actual_seq): + """Check to see whether actual_seq has same elements as expected_seq. + + Args: + actual_seq: sequence + + Returns: + bool + """ + + try: + expected = dict([(element, None) for element in self._expected_seq]) + actual = dict([(element, None) for element in actual_seq]) + except TypeError: + # Fall back to slower list-compare if any of the objects are unhashable. + expected = list(self._expected_seq) + actual = list(actual_seq) + expected.sort() + actual.sort() + return expected == actual + + def __repr__(self): + return '' % self._expected_seq + + +class And(Comparator): + """Evaluates one or more Comparators on RHS and returns an AND of the results. + """ + + def __init__(self, *args): + """Initialize. + + Args: + *args: One or more Comparator + """ + + self._comparators = args + + def equals(self, rhs): + """Checks whether all Comparators are equal to rhs. + + Args: + # rhs: can be anything + + Returns: + bool + """ + + for comparator in self._comparators: + if not comparator.equals(rhs): + return False + + return True + + def __repr__(self): + return '' % str(self._comparators) + + +class Or(Comparator): + """Evaluates one or more Comparators on RHS and returns an OR of the results. + """ + + def __init__(self, *args): + """Initialize. + + Args: + *args: One or more Mox comparators + """ + + self._comparators = args + + def equals(self, rhs): + """Checks whether any Comparator is equal to rhs. + + Args: + # rhs: can be anything + + Returns: + bool + """ + + for comparator in self._comparators: + if comparator.equals(rhs): + return True + + return False + + def __repr__(self): + return '' % str(self._comparators) + + +class Func(Comparator): + """Call a function that should verify the parameter passed in is correct. + + You may need the ability to perform more advanced operations on the parameter + in order to validate it. You can use this to have a callable validate any + parameter. The callable should return either True or False. + + + Example: + + def myParamValidator(param): + # Advanced logic here + return True + + mock_dao.DoSomething(Func(myParamValidator), true) + """ + + def __init__(self, func): + """Initialize. + + Args: + func: callable that takes one parameter and returns a bool + """ + + self._func = func + + def equals(self, rhs): + """Test whether rhs passes the function test. + + rhs is passed into func. + + Args: + rhs: any python object + + Returns: + the result of func(rhs) + """ + + return self._func(rhs) + + def __repr__(self): + return str(self._func) + + +class IgnoreArg(Comparator): + """Ignore an argument. + + This can be used when we don't care about an argument of a method call. + + Example: + # Check if CastMagic is called with 3 as first arg and 'disappear' as third. + mymock.CastMagic(3, IgnoreArg(), 'disappear') + """ + + def equals(self, unused_rhs): + """Ignores arguments and returns True. + + Args: + unused_rhs: any python object + + Returns: + always returns True + """ + + return True + + def __repr__(self): + return '' + + +class MethodGroup(object): + """Base class containing common behaviour for MethodGroups.""" + + def __init__(self, group_name): + self._group_name = group_name + + def group_name(self): + return self._group_name + + def __str__(self): + return '<%s "%s">' % (self.__class__.__name__, self._group_name) + + def AddMethod(self, mock_method): + raise NotImplementedError + + def MethodCalled(self, mock_method): + raise NotImplementedError + + def IsSatisfied(self): + raise NotImplementedError + +class UnorderedGroup(MethodGroup): + """UnorderedGroup holds a set of method calls that may occur in any order. + + This construct is helpful for non-deterministic events, such as iterating + over the keys of a dict. + """ + + def __init__(self, group_name): + super(UnorderedGroup, self).__init__(group_name) + self._methods = [] + + def AddMethod(self, mock_method): + """Add a method to this group. + + Args: + mock_method: A mock method to be added to this group. + """ + + self._methods.append(mock_method) + + def MethodCalled(self, mock_method): + """Remove a method call from the group. + + If the method is not in the set, an UnexpectedMethodCallError will be + raised. + + Args: + mock_method: a mock method that should be equal to a method in the group. + + Returns: + The mock method from the group + + Raises: + UnexpectedMethodCallError if the mock_method was not in the group. + """ + + # Check to see if this method exists, and if so, remove it from the set + # and return it. + for method in self._methods: + if method == mock_method: + # Remove the called mock_method instead of the method in the group. + # The called method will match any comparators when equality is checked + # during removal. The method in the group could pass a comparator to + # another comparator during the equality check. + self._methods.remove(mock_method) + + # If this group is not empty, put it back at the head of the queue. + if not self.IsSatisfied(): + mock_method._call_queue.appendleft(self) + + return self, method + + raise UnexpectedMethodCallError(mock_method, self) + + def IsSatisfied(self): + """Return True if there are not any methods in this group.""" + + return len(self._methods) == 0 + + +class MultipleTimesGroup(MethodGroup): + """MultipleTimesGroup holds methods that may be called any number of times. + + Note: Each method must be called at least once. + + This is helpful, if you don't know or care how many times a method is called. + """ + + def __init__(self, group_name): + super(MultipleTimesGroup, self).__init__(group_name) + self._methods = set() + self._methods_called = set() + + def AddMethod(self, mock_method): + """Add a method to this group. + + Args: + mock_method: A mock method to be added to this group. + """ + + self._methods.add(mock_method) + + def MethodCalled(self, mock_method): + """Remove a method call from the group. + + If the method is not in the set, an UnexpectedMethodCallError will be + raised. + + Args: + mock_method: a mock method that should be equal to a method in the group. + + Returns: + The mock method from the group + + Raises: + UnexpectedMethodCallError if the mock_method was not in the group. + """ + + # Check to see if this method exists, and if so add it to the set of + # called methods. + + for method in self._methods: + if method == mock_method: + self._methods_called.add(mock_method) + # Always put this group back on top of the queue, because we don't know + # when we are done. + mock_method._call_queue.appendleft(self) + return self, method + + if self.IsSatisfied(): + next_method = mock_method._PopNextMethod(); + return next_method, None + else: + raise UnexpectedMethodCallError(mock_method, self) + + def IsSatisfied(self): + """Return True if all methods in this group are called at least once.""" + # NOTE(psycho): We can't use the simple set difference here because we want + # to match different parameters which are considered the same e.g. IsA(str) + # and some string. This solution is O(n^2) but n should be small. + tmp = self._methods.copy() + for called in self._methods_called: + for expected in tmp: + if called == expected: + tmp.remove(expected) + if not tmp: + return True + break + return False + + +class MoxMetaTestBase(type): + """Metaclass to add mox cleanup and verification to every test. + + As the mox unit testing class is being constructed (MoxTestBase or a + subclass), this metaclass will modify all test functions to call the + CleanUpMox method of the test class after they finish. This means that + unstubbing and verifying will happen for every test with no additional code, + and any failures will result in test failures as opposed to errors. + """ + + def __init__(cls, name, bases, d): + type.__init__(cls, name, bases, d) + + # also get all the attributes from the base classes to account + # for a case when test class is not the immediate child of MoxTestBase + for base in bases: + for attr_name in dir(base): + d[attr_name] = getattr(base, attr_name) + + for func_name, func in d.items(): + if func_name.startswith('test') and callable(func): + setattr(cls, func_name, MoxMetaTestBase.CleanUpTest(cls, func)) + + @staticmethod + def CleanUpTest(cls, func): + """Adds Mox cleanup code to any MoxTestBase method. + + Always unsets stubs after a test. Will verify all mocks for tests that + otherwise pass. + + Args: + cls: MoxTestBase or subclass; the class whose test method we are altering. + func: method; the method of the MoxTestBase test class we wish to alter. + + Returns: + The modified method. + """ + def new_method(self, *args, **kwargs): + mox_obj = getattr(self, 'mox', None) + cleanup_mox = False + if mox_obj and isinstance(mox_obj, Mox): + cleanup_mox = True + try: + func(self, *args, **kwargs) + finally: + if cleanup_mox: + mox_obj.UnsetStubs() + if cleanup_mox: + mox_obj.VerifyAll() + new_method.__name__ = func.__name__ + new_method.__doc__ = func.__doc__ + new_method.__module__ = func.__module__ + return new_method + + +class MoxTestBase(unittest.TestCase): + """Convenience test class to make stubbing easier. + + Sets up a "mox" attribute which is an instance of Mox - any mox tests will + want this. Also automatically unsets any stubs and verifies that all mock + methods have been called at the end of each test, eliminating boilerplate + code. + """ + + __metaclass__ = MoxMetaTestBase + + def setUp(self): + self.mox = Mox() diff --git a/pythonlib/protobuf.egg-info/PKG-INFO b/pythonlib/protobuf.egg-info/PKG-INFO new file mode 100644 index 0000000..c4a0793 --- /dev/null +++ b/pythonlib/protobuf.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: protobuf +Version: 2.6.0 +Summary: Protocol Buffers +Home-page: http://code.google.com/p/protobuf/ +Author: protobuf@googlegroups.com +Author-email: protobuf@googlegroups.com +License: New BSD License +Description: Protocol Buffers are Google's data interchange format. +Platform: UNKNOWN diff --git a/pythonlib/protobuf.egg-info/SOURCES.txt b/pythonlib/protobuf.egg-info/SOURCES.txt new file mode 100644 index 0000000..f6c687f --- /dev/null +++ b/pythonlib/protobuf.egg-info/SOURCES.txt @@ -0,0 +1,35 @@ +README.txt +setup.py +google/__init__.py +google/protobuf/__init__.py +google/protobuf/descriptor.py +google/protobuf/descriptor_database.py +google/protobuf/descriptor_pb2.py +google/protobuf/descriptor_pool.py +google/protobuf/message.py +google/protobuf/message_factory.py +google/protobuf/reflection.py +google/protobuf/service.py +google/protobuf/service_reflection.py +google/protobuf/symbol_database.py +google/protobuf/text_encoding.py +google/protobuf/text_format.py +google/protobuf/compiler/__init__.py +google/protobuf/compiler/plugin_pb2.py +google/protobuf/internal/__init__.py +google/protobuf/internal/api_implementation.py +google/protobuf/internal/containers.py +google/protobuf/internal/cpp_message.py +google/protobuf/internal/decoder.py +google/protobuf/internal/encoder.py +google/protobuf/internal/enum_type_wrapper.py +google/protobuf/internal/message_listener.py +google/protobuf/internal/python_message.py +google/protobuf/internal/type_checkers.py +google/protobuf/internal/wire_format.py +protobuf.egg-info/PKG-INFO +protobuf.egg-info/SOURCES.txt +protobuf.egg-info/dependency_links.txt +protobuf.egg-info/namespace_packages.txt +protobuf.egg-info/requires.txt +protobuf.egg-info/top_level.txt \ No newline at end of file diff --git a/pythonlib/protobuf.egg-info/dependency_links.txt b/pythonlib/protobuf.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/pythonlib/protobuf.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/pythonlib/protobuf.egg-info/namespace_packages.txt b/pythonlib/protobuf.egg-info/namespace_packages.txt new file mode 100644 index 0000000..cb42911 --- /dev/null +++ b/pythonlib/protobuf.egg-info/namespace_packages.txt @@ -0,0 +1 @@ +google diff --git a/pythonlib/protobuf.egg-info/requires.txt b/pythonlib/protobuf.egg-info/requires.txt new file mode 100644 index 0000000..49fe098 --- /dev/null +++ b/pythonlib/protobuf.egg-info/requires.txt @@ -0,0 +1 @@ +setuptools diff --git a/pythonlib/protobuf.egg-info/top_level.txt b/pythonlib/protobuf.egg-info/top_level.txt new file mode 100644 index 0000000..cb42911 --- /dev/null +++ b/pythonlib/protobuf.egg-info/top_level.txt @@ -0,0 +1 @@ +google diff --git a/pythonlib/python_dateutil-2.4.2-py2.7.egg b/pythonlib/python_dateutil-2.4.2-py2.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..c9524c6df412e6ba0e32e1ad8011d331bec23bef GIT binary patch literal 234832 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

3phC%a0pUN&W~oC_@9 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%0Ad{U$z8 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

6HTL`PX#r`OGt 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 z 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

  • GG-lGGLZNTGt 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 X!P)`}{#F10!r+Goyi-WnEbjgT1X+2V literal 0 HcmV?d00001 diff --git a/pythonlib/python_gflags-2.0-py2.7.egg b/pythonlib/python_gflags-2.0-py2.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..952d84978a78565727b45fe23f156b4556c646e4 GIT binary patch literal 73738 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 os.path.getmtime(output))): + print ("Generating %s..." % output) + + if not os.path.exists(source): + sys.stderr.write("Can't find required file: %s\n" % source) + sys.exit(-1) + + if protoc == None: + sys.stderr.write( + "protoc is not installed nor found in ../src. Please compile it " + "or install the binary package.\n") + sys.exit(-1) + + protoc_command = [ protoc, "-I../src", "-I.", "--python_out=.", source ] + if subprocess.call(protoc_command) != 0: + sys.exit(-1) + +def GenerateUnittestProtos(): + generate_proto("../src/google/protobuf/unittest.proto") + generate_proto("../src/google/protobuf/unittest_custom_options.proto") + generate_proto("../src/google/protobuf/unittest_import.proto") + generate_proto("../src/google/protobuf/unittest_import_public.proto") + generate_proto("../src/google/protobuf/unittest_mset.proto") + generate_proto("../src/google/protobuf/unittest_no_generic_services.proto") + generate_proto("google/protobuf/internal/descriptor_pool_test1.proto") + generate_proto("google/protobuf/internal/descriptor_pool_test2.proto") + generate_proto("google/protobuf/internal/test_bad_identifiers.proto") + generate_proto("google/protobuf/internal/missing_enum_values.proto") + generate_proto("google/protobuf/internal/more_extensions.proto") + generate_proto("google/protobuf/internal/more_extensions_dynamic.proto") + generate_proto("google/protobuf/internal/more_messages.proto") + generate_proto("google/protobuf/internal/factory_test1.proto") + generate_proto("google/protobuf/internal/factory_test2.proto") + generate_proto("google/protobuf/pyext/python.proto") + +def MakeTestSuite(): + # Test C++ implementation + import unittest + import google.protobuf.pyext.descriptor_cpp2_test as descriptor_cpp2_test + import google.protobuf.pyext.message_factory_cpp2_test \ + as message_factory_cpp2_test + import google.protobuf.pyext.reflection_cpp2_generated_test \ + as reflection_cpp2_generated_test + + loader = unittest.defaultTestLoader + suite = unittest.TestSuite() + for test in [ descriptor_cpp2_test, + message_factory_cpp2_test, + reflection_cpp2_generated_test]: + suite.addTest(loader.loadTestsFromModule(test)) + return suite + +class clean(_clean): + def run(self): + # Delete generated files in the code tree. + for (dirpath, dirnames, filenames) in os.walk("."): + for filename in filenames: + filepath = os.path.join(dirpath, filename) + if filepath.endswith("_pb2.py") or filepath.endswith(".pyc") or \ + filepath.endswith(".so") or filepath.endswith(".o") or \ + filepath.endswith('google/protobuf/compiler/__init__.py'): + os.remove(filepath) + # _clean is an old-style class, so super() doesn't work. + _clean.run(self) + +class build_py(_build_py): + def run(self): + # Generate necessary .proto file if it doesn't exist. + generate_proto("../src/google/protobuf/descriptor.proto") + generate_proto("../src/google/protobuf/compiler/plugin.proto") + GenerateUnittestProtos() + + # Make sure google.protobuf/** are valid packages. + for path in ['', 'internal/', 'compiler/', 'pyext/']: + try: + open('google/protobuf/%s__init__.py' % path, 'a').close() + except EnvironmentError: + pass + # _build_py is an old-style class, so super() doesn't work. + _build_py.run(self) + # TODO(mrovner): Subclass to run 2to3 on some files only. + # Tracing what https://wiki.python.org/moin/PortingPythonToPy3k's "Approach 2" + # section on how to get 2to3 to run on source files during install under + # Python 3. This class seems like a good place to put logic that calls + # python3's distutils.util.run_2to3 on the subset of the files we have in our + # release that are subject to conversion. + # See code reference in previous code review. + +if __name__ == '__main__': + ext_module_list = [] + cpp_impl = '--cpp_implementation' + if cpp_impl in sys.argv: + sys.argv.remove(cpp_impl) + # C++ implementation extension + ext_module_list.append(Extension( + "google.protobuf.pyext._message", + [ "google/protobuf/pyext/descriptor.cc", + "google/protobuf/pyext/message.cc", + "google/protobuf/pyext/extension_dict.cc", + "google/protobuf/pyext/repeated_scalar_container.cc", + "google/protobuf/pyext/repeated_composite_container.cc" ], + define_macros=[('GOOGLE_PROTOBUF_HAS_ONEOF', '1')], + include_dirs = [ ".", "../src"], + libraries = [ "protobuf" ], + library_dirs = [ '../src/.libs' ], + )) + + setup(name = 'protobuf', + version = '2.6.0', + packages = [ 'google' ], + namespace_packages = [ 'google' ], + test_suite = 'setup.MakeTestSuite', + google_test_dir = "google/protobuf/internal", + # Must list modules explicitly so that we don't install tests. + py_modules = [ + 'google.protobuf.internal.api_implementation', + 'google.protobuf.internal.containers', + 'google.protobuf.internal.cpp_message', + 'google.protobuf.internal.decoder', + 'google.protobuf.internal.encoder', + 'google.protobuf.internal.enum_type_wrapper', + 'google.protobuf.internal.message_listener', + 'google.protobuf.internal.python_message', + 'google.protobuf.internal.type_checkers', + 'google.protobuf.internal.wire_format', + 'google.protobuf.descriptor', + 'google.protobuf.descriptor_pb2', + 'google.protobuf.compiler.plugin_pb2', + 'google.protobuf.message', + 'google.protobuf.descriptor_database', + 'google.protobuf.descriptor_pool', + 'google.protobuf.message_factory', + 'google.protobuf.reflection', + 'google.protobuf.service', + 'google.protobuf.service_reflection', + 'google.protobuf.symbol_database', + 'google.protobuf.text_encoding', + 'google.protobuf.text_format'], + cmdclass = { 'clean': clean, 'build_py': build_py }, + install_requires = ['setuptools'], + setup_requires = ['google-apputils'], + ext_modules = ext_module_list, + url = 'http://code.google.com/p/protobuf/', + maintainer = maintainer_email, + maintainer_email = 'protobuf@googlegroups.com', + license = 'New BSD License', + description = 'Protocol Buffers', + long_description = + "Protocol Buffers are Google's data interchange format.", + ) diff --git a/pythonlib/setuptools-0.6c11-py2.7.egg b/pythonlib/setuptools-0.6c11-py2.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..8a51424a41f5fcf57b66f73c7ae9af5e931d2257 GIT binary patch literal 332005 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�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%0DE*tq%`GAqJ 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 I+lM9p59+_GKmY&$ literal 0 HcmV?d00001 diff --git a/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/PKG-INFO b/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/PKG-INFO new file mode 100644 index 0000000..6fddf85 --- /dev/null +++ b/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/PKG-INFO @@ -0,0 +1,32 @@ +Metadata-Version: 1.1 +Name: six +Version: 1.9.0 +Summary: Python 2 and 3 compatibility utilities +Home-page: http://pypi.python.org/pypi/six/ +Author: Benjamin Peterson +Author-email: benjamin@python.org +License: MIT +Description: Six is a Python 2 and 3 compatibility library. It provides utility functions + for smoothing over the differences between the Python versions with the goal of + writing Python code that is compatible on both Python versions. See the + documentation for more information on what is provided. + + Six supports every Python version since 2.5. It is contained in only one Python + file, so it can be easily copied into your project. (The copyright and license + notice must be retained.) + + Online documentation is at http://pythonhosted.org/six/. + + Bugs can be reported to https://bitbucket.org/gutworth/six. The code can also + be found there. + + For questions about six or porting in general, email the python-porting mailing + list: http://mail.python.org/mailman/listinfo/python-porting + +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities diff --git a/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/SOURCES.txt b/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/SOURCES.txt new file mode 100644 index 0000000..9aa7c20 --- /dev/null +++ b/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/SOURCES.txt @@ -0,0 +1,15 @@ +CHANGES +LICENSE +MANIFEST.in +README +setup.cfg +setup.py +six.py +test_six.py +documentation/Makefile +documentation/conf.py +documentation/index.rst +six.egg-info/PKG-INFO +six.egg-info/SOURCES.txt +six.egg-info/dependency_links.txt +six.egg-info/top_level.txt \ No newline at end of file diff --git a/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/dependency_links.txt b/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/not-zip-safe b/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/not-zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/not-zip-safe @@ -0,0 +1 @@ + diff --git a/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/top_level.txt b/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/top_level.txt new file mode 100644 index 0000000..ffe2fce --- /dev/null +++ b/pythonlib/six-1.9.0-py2.7.egg/EGG-INFO/top_level.txt @@ -0,0 +1 @@ +six diff --git a/pythonlib/six-1.9.0-py2.7.egg/six.py b/pythonlib/six-1.9.0-py2.7.egg/six.py new file mode 100644 index 0000000..ffa3fe1 --- /dev/null +++ b/pythonlib/six-1.9.0-py2.7.egg/six.py @@ -0,0 +1,838 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.9.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), + MovedModule("winreg", "_winreg"), +] +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return iter(d.iterkeys(**kw)) + + def itervalues(d, **kw): + return iter(d.itervalues(**kw)) + + def iteritems(d, **kw): + return iter(d.iteritems(**kw)) + + def iterlists(d, **kw): + return iter(d.iterlists(**kw)) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + def u(s): + return s + unichr = chr + if sys.version_info[1] <= 1: + def int2byte(i): + return bytes((i,)) + else: + # This is about 2x faster than the implementation above on 3.2+ + int2byte = operator.methodcaller("to_bytes", 1, "big") + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + def byte2int(bs): + return ord(bs[0]) + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/pythonlib/stubout.py b/pythonlib/stubout.py new file mode 100644 index 0000000..aee4f2d --- /dev/null +++ b/pythonlib/stubout.py @@ -0,0 +1,140 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file is used for testing. The original is at: +# http://code.google.com/p/pymox/ + +class StubOutForTesting: + """Sample Usage: + You want os.path.exists() to always return true during testing. + + stubs = StubOutForTesting() + stubs.Set(os.path, 'exists', lambda x: 1) + ... + stubs.UnsetAll() + + The above changes os.path.exists into a lambda that returns 1. Once + the ... part of the code finishes, the UnsetAll() looks up the old value + of os.path.exists and restores it. + + """ + def __init__(self): + self.cache = [] + self.stubs = [] + + def __del__(self): + self.SmartUnsetAll() + self.UnsetAll() + + def SmartSet(self, obj, attr_name, new_attr): + """Replace obj.attr_name with new_attr. This method is smart and works + at the module, class, and instance level while preserving proper + inheritance. It will not stub out C types however unless that has been + explicitly allowed by the type. + + This method supports the case where attr_name is a staticmethod or a + classmethod of obj. + + Notes: + - If obj is an instance, then it is its class that will actually be + stubbed. Note that the method Set() does not do that: if obj is + an instance, it (and not its class) will be stubbed. + - The stubbing is using the builtin getattr and setattr. So, the __get__ + and __set__ will be called when stubbing (TODO: A better idea would + probably be to manipulate obj.__dict__ instead of getattr() and + setattr()). + + Raises AttributeError if the attribute cannot be found. + """ + if (inspect.ismodule(obj) or + (not inspect.isclass(obj) and obj.__dict__.has_key(attr_name))): + orig_obj = obj + orig_attr = getattr(obj, attr_name) + + else: + if not inspect.isclass(obj): + mro = list(inspect.getmro(obj.__class__)) + else: + mro = list(inspect.getmro(obj)) + + mro.reverse() + + orig_attr = None + + for cls in mro: + try: + orig_obj = cls + orig_attr = getattr(obj, attr_name) + except AttributeError: + continue + + if orig_attr is None: + raise AttributeError("Attribute not found.") + + # Calling getattr() on a staticmethod transforms it to a 'normal' function. + # We need to ensure that we put it back as a staticmethod. + old_attribute = obj.__dict__.get(attr_name) + if old_attribute is not None and isinstance(old_attribute, staticmethod): + orig_attr = staticmethod(orig_attr) + + self.stubs.append((orig_obj, attr_name, orig_attr)) + setattr(orig_obj, attr_name, new_attr) + + def SmartUnsetAll(self): + """Reverses all the SmartSet() calls, restoring things to their original + definition. Its okay to call SmartUnsetAll() repeatedly, as later calls + have no effect if no SmartSet() calls have been made. + + """ + self.stubs.reverse() + + for args in self.stubs: + setattr(*args) + + self.stubs = [] + + def Set(self, parent, child_name, new_child): + """Replace child_name's old definition with new_child, in the context + of the given parent. The parent could be a module when the child is a + function at module scope. Or the parent could be a class when a class' + method is being replaced. The named child is set to new_child, while + the prior definition is saved away for later, when UnsetAll() is called. + + This method supports the case where child_name is a staticmethod or a + classmethod of parent. + """ + old_child = getattr(parent, child_name) + + old_attribute = parent.__dict__.get(child_name) + if old_attribute is not None and isinstance(old_attribute, staticmethod): + old_child = staticmethod(old_child) + + self.cache.append((parent, old_child, child_name)) + setattr(parent, child_name, new_child) + + def UnsetAll(self): + """Reverses all the Set() calls, restoring things to their original + definition. Its okay to call UnsetAll() repeatedly, as later calls have + no effect if no Set() calls have been made. + + """ + # Undo calls to Set() in reverse order, in case Set() was called on the + # same arguments repeatedly (want the original call to be last one undone) + self.cache.reverse() + + for (parent, old_child, child_name) in self.cache: + setattr(parent, child_name, old_child) + self.cache = []

    F^3#yQ`zWx01W^R5T;7|l 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