# pylint: skip-file
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: proto/clientanalytics.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='proto/clientanalytics.proto',
  package='',
  syntax='proto2',
  serialized_pb=_b('\n\x1bproto/clientanalytics.proto\"y\n\nLogRequest\x12 \n\x0b\x63lient_info\x18\x01 \x01(\x0b\x32\x0b.ClientInfo\x12\x12\n\nlog_source\x18\x02 \x01(\x05\x12\x17\n\x0frequest_time_ms\x18\x04 \x01(\x03\x12\x1c\n\tlog_event\x18\x03 \x03(\x0b\x32\t.LogEvent\"!\n\nClientInfo\x12\x13\n\x0b\x63lient_type\x18\x01 \x01(\x05\"/\n\x0bLogResponse\x12 \n\x18next_request_wait_millis\x18\x01 \x01(\x03\";\n\x08LogEvent\x12\x15\n\revent_time_ms\x18\x01 \x01(\x03\x12\x18\n\x10source_extension\x18\x06 \x01(\x0c')
)
_sym_db.RegisterFileDescriptor(DESCRIPTOR)




_LOGREQUEST = _descriptor.Descriptor(
  name='LogRequest',
  full_name='LogRequest',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='client_info', full_name='LogRequest.client_info', 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='log_source', full_name='LogRequest.log_source', 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='request_time_ms', full_name='LogRequest.request_time_ms', index=2,
      number=4, 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='log_event', full_name='LogRequest.log_event', 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),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=31,
  serialized_end=152,
)


_CLIENTINFO = _descriptor.Descriptor(
  name='ClientInfo',
  full_name='ClientInfo',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='client_type', full_name='ClientInfo.client_type', 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,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=154,
  serialized_end=187,
)


_LOGRESPONSE = _descriptor.Descriptor(
  name='LogResponse',
  full_name='LogResponse',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='next_request_wait_millis', full_name='LogResponse.next_request_wait_millis', 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,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=189,
  serialized_end=236,
)


_LOGEVENT = _descriptor.Descriptor(
  name='LogEvent',
  full_name='LogEvent',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='event_time_ms', full_name='LogEvent.event_time_ms', 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='source_extension', full_name='LogEvent.source_extension', index=1,
      number=6, 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,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=238,
  serialized_end=297,
)

_LOGREQUEST.fields_by_name['client_info'].message_type = _CLIENTINFO
_LOGREQUEST.fields_by_name['log_event'].message_type = _LOGEVENT
DESCRIPTOR.message_types_by_name['LogRequest'] = _LOGREQUEST
DESCRIPTOR.message_types_by_name['ClientInfo'] = _CLIENTINFO
DESCRIPTOR.message_types_by_name['LogResponse'] = _LOGRESPONSE
DESCRIPTOR.message_types_by_name['LogEvent'] = _LOGEVENT

LogRequest = _reflection.GeneratedProtocolMessageType('LogRequest', (_message.Message,), dict(
  DESCRIPTOR = _LOGREQUEST,
  __module__ = 'proto.clientanalytics_pb2'
  # @@protoc_insertion_point(class_scope:LogRequest)
  ))
_sym_db.RegisterMessage(LogRequest)

ClientInfo = _reflection.GeneratedProtocolMessageType('ClientInfo', (_message.Message,), dict(
  DESCRIPTOR = _CLIENTINFO,
  __module__ = 'proto.clientanalytics_pb2'
  # @@protoc_insertion_point(class_scope:ClientInfo)
  ))
_sym_db.RegisterMessage(ClientInfo)

LogResponse = _reflection.GeneratedProtocolMessageType('LogResponse', (_message.Message,), dict(
  DESCRIPTOR = _LOGRESPONSE,
  __module__ = 'proto.clientanalytics_pb2'
  # @@protoc_insertion_point(class_scope:LogResponse)
  ))
_sym_db.RegisterMessage(LogResponse)

LogEvent = _reflection.GeneratedProtocolMessageType('LogEvent', (_message.Message,), dict(
  DESCRIPTOR = _LOGEVENT,
  __module__ = 'proto.clientanalytics_pb2'
  # @@protoc_insertion_point(class_scope:LogEvent)
  ))
_sym_db.RegisterMessage(LogEvent)


# @@protoc_insertion_point(module_scope)
