// Generated by the protocol buffer compiler.  DO NOT EDIT!

#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
#include "debugger_message.pb.h"
#include <google/protobuf/stubs/once.h>
#include <google/protobuf/io/coded_stream.h>
#include <google/protobuf/wire_format_lite_inl.h>
// @@protoc_insertion_point(includes)

namespace com {
namespace android {
namespace glesv2debugger {

void protobuf_ShutdownFile_debugger_5fmessage_2eproto() {
  delete Message::default_instance_;
}

void protobuf_AddDesc_debugger_5fmessage_2eproto() {
  static bool already_here = false;
  if (already_here) return;
  already_here = true;
  GOOGLE_PROTOBUF_VERIFY_VERSION;

  Message::default_instance_ = new Message();
  Message::default_instance_->InitAsDefaultInstance();
  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_debugger_5fmessage_2eproto);
}

// Force AddDescriptors() to be called at static initialization time.
struct StaticDescriptorInitializer_debugger_5fmessage_2eproto {
  StaticDescriptorInitializer_debugger_5fmessage_2eproto() {
    protobuf_AddDesc_debugger_5fmessage_2eproto();
  }
} static_descriptor_initializer_debugger_5fmessage_2eproto_;


// ===================================================================

bool Message_Function_IsValid(int value) {
  switch(value) {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
    case 10:
    case 11:
    case 12:
    case 13:
    case 14:
    case 15:
    case 16:
    case 17:
    case 18:
    case 19:
    case 20:
    case 21:
    case 22:
    case 23:
    case 24:
    case 25:
    case 26:
    case 27:
    case 28:
    case 29:
    case 30:
    case 31:
    case 32:
    case 33:
    case 34:
    case 35:
    case 36:
    case 37:
    case 38:
    case 39:
    case 40:
    case 41:
    case 42:
    case 43:
    case 44:
    case 45:
    case 46:
    case 47:
    case 48:
    case 49:
    case 50:
    case 51:
    case 52:
    case 53:
    case 54:
    case 55:
    case 56:
    case 57:
    case 58:
    case 59:
    case 60:
    case 61:
    case 62:
    case 63:
    case 64:
    case 65:
    case 66:
    case 67:
    case 68:
    case 69:
    case 70:
    case 71:
    case 72:
    case 73:
    case 74:
    case 75:
    case 76:
    case 77:
    case 78:
    case 79:
    case 80:
    case 81:
    case 82:
    case 83:
    case 84:
    case 85:
    case 86:
    case 87:
    case 88:
    case 89:
    case 90:
    case 91:
    case 92:
    case 93:
    case 94:
    case 95:
    case 96:
    case 97:
    case 98:
    case 99:
    case 100:
    case 101:
    case 102:
    case 103:
    case 104:
    case 105:
    case 106:
    case 107:
    case 108:
    case 109:
    case 110:
    case 111:
    case 112:
    case 113:
    case 114:
    case 115:
    case 116:
    case 117:
    case 118:
    case 119:
    case 120:
    case 121:
    case 122:
    case 123:
    case 124:
    case 125:
    case 126:
    case 127:
    case 128:
    case 129:
    case 130:
    case 131:
    case 132:
    case 133:
    case 134:
    case 135:
    case 136:
    case 137:
    case 138:
    case 139:
    case 140:
    case 141:
    case 142:
    case 143:
    case 144:
    case 145:
    case 146:
    case 147:
    case 148:
    case 149:
    case 150:
    case 151:
    case 152:
    case 153:
    case 154:
    case 155:
    case 156:
    case 157:
    case 158:
    case 159:
    case 160:
    case 161:
    case 162:
    case 163:
    case 164:
    case 165:
    case 166:
    case 167:
    case 168:
    case 169:
    case 170:
    case 171:
    case 172:
    case 173:
    case 174:
    case 175:
    case 176:
    case 177:
    case 178:
    case 179:
    case 180:
    case 181:
    case 182:
    case 183:
    case 184:
    case 185:
    case 186:
    case 187:
    case 188:
    case 189:
    case 190:
      return true;
    default:
      return false;
  }
}

#ifndef _MSC_VER
const Message_Function Message::glActiveTexture;
const Message_Function Message::glAttachShader;
const Message_Function Message::glBindAttribLocation;
const Message_Function Message::glBindBuffer;
const Message_Function Message::glBindFramebuffer;
const Message_Function Message::glBindRenderbuffer;
const Message_Function Message::glBindTexture;
const Message_Function Message::glBlendColor;
const Message_Function Message::glBlendEquation;
const Message_Function Message::glBlendEquationSeparate;
const Message_Function Message::glBlendFunc;
const Message_Function Message::glBlendFuncSeparate;
const Message_Function Message::glBufferData;
const Message_Function Message::glBufferSubData;
const Message_Function Message::glCheckFramebufferStatus;
const Message_Function Message::glClear;
const Message_Function Message::glClearColor;
const Message_Function Message::glClearDepthf;
const Message_Function Message::glClearStencil;
const Message_Function Message::glColorMask;
const Message_Function Message::glCompileShader;
const Message_Function Message::glCompressedTexImage2D;
const Message_Function Message::glCompressedTexSubImage2D;
const Message_Function Message::glCopyTexImage2D;
const Message_Function Message::glCopyTexSubImage2D;
const Message_Function Message::glCreateProgram;
const Message_Function Message::glCreateShader;
const Message_Function Message::glCullFace;
const Message_Function Message::glDeleteBuffers;
const Message_Function Message::glDeleteFramebuffers;
const Message_Function Message::glDeleteProgram;
const Message_Function Message::glDeleteRenderbuffers;
const Message_Function Message::glDeleteShader;
const Message_Function Message::glDeleteTextures;
const Message_Function Message::glDepthFunc;
const Message_Function Message::glDepthMask;
const Message_Function Message::glDepthRangef;
const Message_Function Message::glDetachShader;
const Message_Function Message::glDisable;
const Message_Function Message::glDisableVertexAttribArray;
const Message_Function Message::glDrawArrays;
const Message_Function Message::glDrawElements;
const Message_Function Message::glEnable;
const Message_Function Message::glEnableVertexAttribArray;
const Message_Function Message::glFinish;
const Message_Function Message::glFlush;
const Message_Function Message::glFramebufferRenderbuffer;
const Message_Function Message::glFramebufferTexture2D;
const Message_Function Message::glFrontFace;
const Message_Function Message::glGenBuffers;
const Message_Function Message::glGenerateMipmap;
const Message_Function Message::glGenFramebuffers;
const Message_Function Message::glGenRenderbuffers;
const Message_Function Message::glGenTextures;
const Message_Function Message::glGetActiveAttrib;
const Message_Function Message::glGetActiveUniform;
const Message_Function Message::glGetAttachedShaders;
const Message_Function Message::glGetAttribLocation;
const Message_Function Message::glGetBooleanv;
const Message_Function Message::glGetBufferParameteriv;
const Message_Function Message::glGetError;
const Message_Function Message::glGetFloatv;
const Message_Function Message::glGetFramebufferAttachmentParameteriv;
const Message_Function Message::glGetIntegerv;
const Message_Function Message::glGetProgramiv;
const Message_Function Message::glGetProgramInfoLog;
const Message_Function Message::glGetRenderbufferParameteriv;
const Message_Function Message::glGetShaderiv;
const Message_Function Message::glGetShaderInfoLog;
const Message_Function Message::glGetShaderPrecisionFormat;
const Message_Function Message::glGetShaderSource;
const Message_Function Message::glGetString;
const Message_Function Message::glGetTexParameterfv;
const Message_Function Message::glGetTexParameteriv;
const Message_Function Message::glGetUniformfv;
const Message_Function Message::glGetUniformiv;
const Message_Function Message::glGetUniformLocation;
const Message_Function Message::glGetVertexAttribfv;
const Message_Function Message::glGetVertexAttribiv;
const Message_Function Message::glGetVertexAttribPointerv;
const Message_Function Message::glHint;
const Message_Function Message::glIsBuffer;
const Message_Function Message::glIsEnabled;
const Message_Function Message::glIsFramebuffer;
const Message_Function Message::glIsProgram;
const Message_Function Message::glIsRenderbuffer;
const Message_Function Message::glIsShader;
const Message_Function Message::glIsTexture;
const Message_Function Message::glLineWidth;
const Message_Function Message::glLinkProgram;
const Message_Function Message::glPixelStorei;
const Message_Function Message::glPolygonOffset;
const Message_Function Message::glReadPixels;
const Message_Function Message::glReleaseShaderCompiler;
const Message_Function Message::glRenderbufferStorage;
const Message_Function Message::glSampleCoverage;
const Message_Function Message::glScissor;
const Message_Function Message::glShaderBinary;
const Message_Function Message::glShaderSource;
const Message_Function Message::glStencilFunc;
const Message_Function Message::glStencilFuncSeparate;
const Message_Function Message::glStencilMask;
const Message_Function Message::glStencilMaskSeparate;
const Message_Function Message::glStencilOp;
const Message_Function Message::glStencilOpSeparate;
const Message_Function Message::glTexImage2D;
const Message_Function Message::glTexParameterf;
const Message_Function Message::glTexParameterfv;
const Message_Function Message::glTexParameteri;
const Message_Function Message::glTexParameteriv;
const Message_Function Message::glTexSubImage2D;
const Message_Function Message::glUniform1f;
const Message_Function Message::glUniform1fv;
const Message_Function Message::glUniform1i;
const Message_Function Message::glUniform1iv;
const Message_Function Message::glUniform2f;
const Message_Function Message::glUniform2fv;
const Message_Function Message::glUniform2i;
const Message_Function Message::glUniform2iv;
const Message_Function Message::glUniform3f;
const Message_Function Message::glUniform3fv;
const Message_Function Message::glUniform3i;
const Message_Function Message::glUniform3iv;
const Message_Function Message::glUniform4f;
const Message_Function Message::glUniform4fv;
const Message_Function Message::glUniform4i;
const Message_Function Message::glUniform4iv;
const Message_Function Message::glUniformMatrix2fv;
const Message_Function Message::glUniformMatrix3fv;
const Message_Function Message::glUniformMatrix4fv;
const Message_Function Message::glUseProgram;
const Message_Function Message::glValidateProgram;
const Message_Function Message::glVertexAttrib1f;
const Message_Function Message::glVertexAttrib1fv;
const Message_Function Message::glVertexAttrib2f;
const Message_Function Message::glVertexAttrib2fv;
const Message_Function Message::glVertexAttrib3f;
const Message_Function Message::glVertexAttrib3fv;
const Message_Function Message::glVertexAttrib4f;
const Message_Function Message::glVertexAttrib4fv;
const Message_Function Message::glVertexAttribPointer;
const Message_Function Message::glViewport;
const Message_Function Message::eglGetDisplay;
const Message_Function Message::eglInitialize;
const Message_Function Message::eglTerminate;
const Message_Function Message::eglGetConfigs;
const Message_Function Message::eglChooseConfig;
const Message_Function Message::eglGetConfigAttrib;
const Message_Function Message::eglCreateWindowSurface;
const Message_Function Message::eglCreatePixmapSurface;
const Message_Function Message::eglCreatePbufferSurface;
const Message_Function Message::eglDestroySurface;
const Message_Function Message::eglQuerySurface;
const Message_Function Message::eglCreateContext;
const Message_Function Message::eglDestroyContext;
const Message_Function Message::eglMakeCurrent;
const Message_Function Message::eglGetCurrentContext;
const Message_Function Message::eglGetCurrentSurface;
const Message_Function Message::eglGetCurrentDisplay;
const Message_Function Message::eglQueryContext;
const Message_Function Message::eglWaitGL;
const Message_Function Message::eglWaitNative;
const Message_Function Message::eglSwapBuffers;
const Message_Function Message::eglCopyBuffers;
const Message_Function Message::eglGetError;
const Message_Function Message::eglQueryString;
const Message_Function Message::eglGetProcAddress;
const Message_Function Message::eglSurfaceAttrib;
const Message_Function Message::eglBindTexImage;
const Message_Function Message::eglReleaseTexImage;
const Message_Function Message::eglSwapInterval;
const Message_Function Message::eglBindAPI;
const Message_Function Message::eglQueryAPI;
const Message_Function Message::eglWaitClient;
const Message_Function Message::eglReleaseThread;
const Message_Function Message::eglCreatePbufferFromClientBuffer;
const Message_Function Message::eglLockSurfaceKHR;
const Message_Function Message::eglUnlockSurfaceKHR;
const Message_Function Message::eglCreateImageKHR;
const Message_Function Message::eglDestroyImageKHR;
const Message_Function Message::eglCreateSyncKHR;
const Message_Function Message::eglDestroySyncKHR;
const Message_Function Message::eglClientWaitSyncKHR;
const Message_Function Message::eglGetSyncAttribKHR;
const Message_Function Message::eglSetSwapRectangleANDROID;
const Message_Function Message::eglGetRenderBufferANDROID;
const Message_Function Message::ACK;
const Message_Function Message::NEG;
const Message_Function Message::CONTINUE;
const Message_Function Message::SKIP;
const Message_Function Message::SETPROP;
const Message_Function Message::Function_MIN;
const Message_Function Message::Function_MAX;
const int Message::Function_ARRAYSIZE;
#endif  // _MSC_VER
bool Message_Type_IsValid(int value) {
  switch(value) {
    case 0:
    case 1:
    case 2:
      return true;
    default:
      return false;
  }
}

#ifndef _MSC_VER
const Message_Type Message::BeforeCall;
const Message_Type Message::AfterCall;
const Message_Type Message::Response;
const Message_Type Message::Type_MIN;
const Message_Type Message::Type_MAX;
const int Message::Type_ARRAYSIZE;
#endif  // _MSC_VER
bool Message_DataType_IsValid(int value) {
  switch(value) {
    case 0:
    case 1:
      return true;
    default:
      return false;
  }
}

#ifndef _MSC_VER
const Message_DataType Message::ReferencedImage;
const Message_DataType Message::NonreferencedImage;
const Message_DataType Message::DataType_MIN;
const Message_DataType Message::DataType_MAX;
const int Message::DataType_ARRAYSIZE;
#endif  // _MSC_VER
bool Message_Prop_IsValid(int value) {
  switch(value) {
    case 0:
    case 1:
    case 2:
      return true;
    default:
      return false;
  }
}

#ifndef _MSC_VER
const Message_Prop Message::Capture;
const Message_Prop Message::TimeMode;
const Message_Prop Message::ExpectResponse;
const Message_Prop Message::Prop_MIN;
const Message_Prop Message::Prop_MAX;
const int Message::Prop_ARRAYSIZE;
#endif  // _MSC_VER
const ::std::string Message::_default_data_;
#ifndef _MSC_VER
const int Message::kContextIdFieldNumber;
const int Message::kFunctionFieldNumber;
const int Message::kTypeFieldNumber;
const int Message::kExpectResponseFieldNumber;
const int Message::kRetFieldNumber;
const int Message::kArg0FieldNumber;
const int Message::kArg1FieldNumber;
const int Message::kArg2FieldNumber;
const int Message::kArg3FieldNumber;
const int Message::kArg4FieldNumber;
const int Message::kArg5FieldNumber;
const int Message::kArg6FieldNumber;
const int Message::kArg7FieldNumber;
const int Message::kArg8FieldNumber;
const int Message::kDataFieldNumber;
const int Message::kDataTypeFieldNumber;
const int Message::kPixelFormatFieldNumber;
const int Message::kPixelTypeFieldNumber;
const int Message::kTimeFieldNumber;
const int Message::kPropFieldNumber;
const int Message::kClockFieldNumber;
#endif  // !_MSC_VER

Message::Message()
  : ::google::protobuf::MessageLite() {
  SharedCtor();
}

void Message::InitAsDefaultInstance() {
}

Message::Message(const Message& from)
  : ::google::protobuf::MessageLite() {
  SharedCtor();
  MergeFrom(from);
}

void Message::SharedCtor() {
  _cached_size_ = 0;
  context_id_ = 0;
  function_ = 187;
  type_ = 0;
  expect_response_ = false;
  ret_ = 0;
  arg0_ = 0;
  arg1_ = 0;
  arg2_ = 0;
  arg3_ = 0;
  arg4_ = 0;
  arg5_ = 0;
  arg6_ = 0;
  arg7_ = 0;
  arg8_ = 0;
  data_ = const_cast< ::std::string*>(&_default_data_);
  data_type_ = 0;
  pixel_format_ = 0;
  pixel_type_ = 0;
  time_ = 0;
  prop_ = 0;
  clock_ = 0;
  ::memset(_has_bits_, 0, sizeof(_has_bits_));
}

Message::~Message() {
  SharedDtor();
}

void Message::SharedDtor() {
  if (data_ != &_default_data_) {
    delete data_;
  }
  if (this != default_instance_) {
  }
}

void Message::SetCachedSize(int size) const {
  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
  _cached_size_ = size;
  GOOGLE_SAFE_CONCURRENT_WRITES_END();
}
const Message& Message::default_instance() {
  if (default_instance_ == NULL) protobuf_AddDesc_debugger_5fmessage_2eproto();  return *default_instance_;
}

Message* Message::default_instance_ = NULL;

Message* Message::New() const {
  return new Message;
}

void Message::Clear() {
  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
    context_id_ = 0;
    function_ = 187;
    type_ = 0;
    expect_response_ = false;
    ret_ = 0;
    arg0_ = 0;
    arg1_ = 0;
    arg2_ = 0;
  }
  if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) {
    arg3_ = 0;
    arg4_ = 0;
    arg5_ = 0;
    arg6_ = 0;
    arg7_ = 0;
    arg8_ = 0;
    if (_has_bit(14)) {
      if (data_ != &_default_data_) {
        data_->clear();
      }
    }
    data_type_ = 0;
  }
  if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) {
    pixel_format_ = 0;
    pixel_type_ = 0;
    time_ = 0;
    prop_ = 0;
    clock_ = 0;
  }
  ::memset(_has_bits_, 0, sizeof(_has_bits_));
}

bool Message::MergePartialFromCodedStream(
    ::google::protobuf::io::CodedInputStream* input) {
#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
  ::google::protobuf::uint32 tag;
  while ((tag = input->ReadTag()) != 0) {
    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
      // required int32 context_id = 1;
      case 1: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &context_id_)));
          _set_bit(0);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(16)) goto parse_function;
        break;
      }
      
      // required .com.android.glesv2debugger.Message.Function function = 2 [default = NEG];
      case 2: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_function:
          int value;
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
                 input, &value)));
          if (::com::android::glesv2debugger::Message_Function_IsValid(value)) {
            set_function(static_cast< ::com::android::glesv2debugger::Message_Function >(value));
          }
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(24)) goto parse_type;
        break;
      }
      
      // required .com.android.glesv2debugger.Message.Type type = 3;
      case 3: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_type:
          int value;
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
                 input, &value)));
          if (::com::android::glesv2debugger::Message_Type_IsValid(value)) {
            set_type(static_cast< ::com::android::glesv2debugger::Message_Type >(value));
          }
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(32)) goto parse_expect_response;
        break;
      }
      
      // required bool expect_response = 4;
      case 4: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_expect_response:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                 input, &expect_response_)));
          _set_bit(3);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(40)) goto parse_ret;
        break;
      }
      
      // optional int32 ret = 5;
      case 5: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_ret:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &ret_)));
          _set_bit(4);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(48)) goto parse_arg0;
        break;
      }
      
      // optional int32 arg0 = 6;
      case 6: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_arg0:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &arg0_)));
          _set_bit(5);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(56)) goto parse_arg1;
        break;
      }
      
      // optional int32 arg1 = 7;
      case 7: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_arg1:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &arg1_)));
          _set_bit(6);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(64)) goto parse_arg2;
        break;
      }
      
      // optional int32 arg2 = 8;
      case 8: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_arg2:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &arg2_)));
          _set_bit(7);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(72)) goto parse_arg3;
        break;
      }
      
      // optional int32 arg3 = 9;
      case 9: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_arg3:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &arg3_)));
          _set_bit(8);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(82)) goto parse_data;
        break;
      }
      
      // optional bytes data = 10;
      case 10: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
         parse_data:
          DO_(::google::protobuf::internal::WireFormatLite::ReadBytes(
                input, this->mutable_data()));
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(93)) goto parse_time;
        break;
      }
      
      // optional float time = 11;
      case 11: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) {
         parse_time:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>(
                 input, &time_)));
          _set_bit(18);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(128)) goto parse_arg4;
        break;
      }
      
      // optional int32 arg4 = 16;
      case 16: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_arg4:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &arg4_)));
          _set_bit(9);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(136)) goto parse_arg5;
        break;
      }
      
      // optional int32 arg5 = 17;
      case 17: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_arg5:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &arg5_)));
          _set_bit(10);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(144)) goto parse_arg6;
        break;
      }
      
      // optional int32 arg6 = 18;
      case 18: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_arg6:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &arg6_)));
          _set_bit(11);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(152)) goto parse_arg7;
        break;
      }
      
      // optional int32 arg7 = 19;
      case 19: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_arg7:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &arg7_)));
          _set_bit(12);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(160)) goto parse_arg8;
        break;
      }
      
      // optional int32 arg8 = 20;
      case 20: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_arg8:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &arg8_)));
          _set_bit(13);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(168)) goto parse_prop;
        break;
      }
      
      // optional .com.android.glesv2debugger.Message.Prop prop = 21;
      case 21: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_prop:
          int value;
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
                 input, &value)));
          if (::com::android::glesv2debugger::Message_Prop_IsValid(value)) {
            set_prop(static_cast< ::com::android::glesv2debugger::Message_Prop >(value));
          }
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(181)) goto parse_clock;
        break;
      }
      
      // optional float clock = 22;
      case 22: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) {
         parse_clock:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>(
                 input, &clock_)));
          _set_bit(20);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(184)) goto parse_data_type;
        break;
      }
      
      // optional .com.android.glesv2debugger.Message.DataType data_type = 23;
      case 23: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_data_type:
          int value;
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
                 input, &value)));
          if (::com::android::glesv2debugger::Message_DataType_IsValid(value)) {
            set_data_type(static_cast< ::com::android::glesv2debugger::Message_DataType >(value));
          }
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(192)) goto parse_pixel_format;
        break;
      }
      
      // optional int32 pixel_format = 24;
      case 24: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_pixel_format:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &pixel_format_)));
          _set_bit(16);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectTag(200)) goto parse_pixel_type;
        break;
      }
      
      // optional int32 pixel_type = 25;
      case 25: {
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
         parse_pixel_type:
          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                 input, &pixel_type_)));
          _set_bit(17);
        } else {
          goto handle_uninterpreted;
        }
        if (input->ExpectAtEnd()) return true;
        break;
      }
      
      default: {
      handle_uninterpreted:
        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
          return true;
        }
        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
        break;
      }
    }
  }
  return true;
#undef DO_
}

void Message::SerializeWithCachedSizes(
    ::google::protobuf::io::CodedOutputStream* output) const {
  // required int32 context_id = 1;
  if (_has_bit(0)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->context_id(), output);
  }
  
  // required .com.android.glesv2debugger.Message.Function function = 2 [default = NEG];
  if (_has_bit(1)) {
    ::google::protobuf::internal::WireFormatLite::WriteEnum(
      2, this->function(), output);
  }
  
  // required .com.android.glesv2debugger.Message.Type type = 3;
  if (_has_bit(2)) {
    ::google::protobuf::internal::WireFormatLite::WriteEnum(
      3, this->type(), output);
  }
  
  // required bool expect_response = 4;
  if (_has_bit(3)) {
    ::google::protobuf::internal::WireFormatLite::WriteBool(4, this->expect_response(), output);
  }
  
  // optional int32 ret = 5;
  if (_has_bit(4)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(5, this->ret(), output);
  }
  
  // optional int32 arg0 = 6;
  if (_has_bit(5)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(6, this->arg0(), output);
  }
  
  // optional int32 arg1 = 7;
  if (_has_bit(6)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(7, this->arg1(), output);
  }
  
  // optional int32 arg2 = 8;
  if (_has_bit(7)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(8, this->arg2(), output);
  }
  
  // optional int32 arg3 = 9;
  if (_has_bit(8)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(9, this->arg3(), output);
  }
  
  // optional bytes data = 10;
  if (_has_bit(14)) {
    ::google::protobuf::internal::WireFormatLite::WriteBytes(
      10, this->data(), output);
  }
  
  // optional float time = 11;
  if (_has_bit(18)) {
    ::google::protobuf::internal::WireFormatLite::WriteFloat(11, this->time(), output);
  }
  
  // optional int32 arg4 = 16;
  if (_has_bit(9)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(16, this->arg4(), output);
  }
  
  // optional int32 arg5 = 17;
  if (_has_bit(10)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(17, this->arg5(), output);
  }
  
  // optional int32 arg6 = 18;
  if (_has_bit(11)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(18, this->arg6(), output);
  }
  
  // optional int32 arg7 = 19;
  if (_has_bit(12)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(19, this->arg7(), output);
  }
  
  // optional int32 arg8 = 20;
  if (_has_bit(13)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(20, this->arg8(), output);
  }
  
  // optional .com.android.glesv2debugger.Message.Prop prop = 21;
  if (_has_bit(19)) {
    ::google::protobuf::internal::WireFormatLite::WriteEnum(
      21, this->prop(), output);
  }
  
  // optional float clock = 22;
  if (_has_bit(20)) {
    ::google::protobuf::internal::WireFormatLite::WriteFloat(22, this->clock(), output);
  }
  
  // optional .com.android.glesv2debugger.Message.DataType data_type = 23;
  if (_has_bit(15)) {
    ::google::protobuf::internal::WireFormatLite::WriteEnum(
      23, this->data_type(), output);
  }
  
  // optional int32 pixel_format = 24;
  if (_has_bit(16)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(24, this->pixel_format(), output);
  }
  
  // optional int32 pixel_type = 25;
  if (_has_bit(17)) {
    ::google::protobuf::internal::WireFormatLite::WriteInt32(25, this->pixel_type(), output);
  }
  
}

int Message::ByteSize() const {
  int total_size = 0;
  
  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
    // required int32 context_id = 1;
    if (has_context_id()) {
      total_size += 1 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->context_id());
    }
    
    // required .com.android.glesv2debugger.Message.Function function = 2 [default = NEG];
    if (has_function()) {
      total_size += 1 +
        ::google::protobuf::internal::WireFormatLite::EnumSize(this->function());
    }
    
    // required .com.android.glesv2debugger.Message.Type type = 3;
    if (has_type()) {
      total_size += 1 +
        ::google::protobuf::internal::WireFormatLite::EnumSize(this->type());
    }
    
    // required bool expect_response = 4;
    if (has_expect_response()) {
      total_size += 1 + 1;
    }
    
    // optional int32 ret = 5;
    if (has_ret()) {
      total_size += 1 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->ret());
    }
    
    // optional int32 arg0 = 6;
    if (has_arg0()) {
      total_size += 1 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->arg0());
    }
    
    // optional int32 arg1 = 7;
    if (has_arg1()) {
      total_size += 1 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->arg1());
    }
    
    // optional int32 arg2 = 8;
    if (has_arg2()) {
      total_size += 1 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->arg2());
    }
    
  }
  if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) {
    // optional int32 arg3 = 9;
    if (has_arg3()) {
      total_size += 1 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->arg3());
    }
    
    // optional int32 arg4 = 16;
    if (has_arg4()) {
      total_size += 2 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->arg4());
    }
    
    // optional int32 arg5 = 17;
    if (has_arg5()) {
      total_size += 2 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->arg5());
    }
    
    // optional int32 arg6 = 18;
    if (has_arg6()) {
      total_size += 2 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->arg6());
    }
    
    // optional int32 arg7 = 19;
    if (has_arg7()) {
      total_size += 2 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->arg7());
    }
    
    // optional int32 arg8 = 20;
    if (has_arg8()) {
      total_size += 2 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->arg8());
    }
    
    // optional bytes data = 10;
    if (has_data()) {
      total_size += 1 +
        ::google::protobuf::internal::WireFormatLite::BytesSize(
          this->data());
    }
    
    // optional .com.android.glesv2debugger.Message.DataType data_type = 23;
    if (has_data_type()) {
      total_size += 2 +
        ::google::protobuf::internal::WireFormatLite::EnumSize(this->data_type());
    }
    
  }
  if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) {
    // optional int32 pixel_format = 24;
    if (has_pixel_format()) {
      total_size += 2 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->pixel_format());
    }
    
    // optional int32 pixel_type = 25;
    if (has_pixel_type()) {
      total_size += 2 +
        ::google::protobuf::internal::WireFormatLite::Int32Size(
          this->pixel_type());
    }
    
    // optional float time = 11;
    if (has_time()) {
      total_size += 1 + 4;
    }
    
    // optional .com.android.glesv2debugger.Message.Prop prop = 21;
    if (has_prop()) {
      total_size += 2 +
        ::google::protobuf::internal::WireFormatLite::EnumSize(this->prop());
    }
    
    // optional float clock = 22;
    if (has_clock()) {
      total_size += 2 + 4;
    }
    
  }
  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
  _cached_size_ = total_size;
  GOOGLE_SAFE_CONCURRENT_WRITES_END();
  return total_size;
}

void Message::CheckTypeAndMergeFrom(
    const ::google::protobuf::MessageLite& from) {
  MergeFrom(*::google::protobuf::down_cast<const Message*>(&from));
}

void Message::MergeFrom(const Message& from) {
  GOOGLE_CHECK_NE(&from, this);
  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
    if (from._has_bit(0)) {
      set_context_id(from.context_id());
    }
    if (from._has_bit(1)) {
      set_function(from.function());
    }
    if (from._has_bit(2)) {
      set_type(from.type());
    }
    if (from._has_bit(3)) {
      set_expect_response(from.expect_response());
    }
    if (from._has_bit(4)) {
      set_ret(from.ret());
    }
    if (from._has_bit(5)) {
      set_arg0(from.arg0());
    }
    if (from._has_bit(6)) {
      set_arg1(from.arg1());
    }
    if (from._has_bit(7)) {
      set_arg2(from.arg2());
    }
  }
  if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) {
    if (from._has_bit(8)) {
      set_arg3(from.arg3());
    }
    if (from._has_bit(9)) {
      set_arg4(from.arg4());
    }
    if (from._has_bit(10)) {
      set_arg5(from.arg5());
    }
    if (from._has_bit(11)) {
      set_arg6(from.arg6());
    }
    if (from._has_bit(12)) {
      set_arg7(from.arg7());
    }
    if (from._has_bit(13)) {
      set_arg8(from.arg8());
    }
    if (from._has_bit(14)) {
      set_data(from.data());
    }
    if (from._has_bit(15)) {
      set_data_type(from.data_type());
    }
  }
  if (from._has_bits_[16 / 32] & (0xffu << (16 % 32))) {
    if (from._has_bit(16)) {
      set_pixel_format(from.pixel_format());
    }
    if (from._has_bit(17)) {
      set_pixel_type(from.pixel_type());
    }
    if (from._has_bit(18)) {
      set_time(from.time());
    }
    if (from._has_bit(19)) {
      set_prop(from.prop());
    }
    if (from._has_bit(20)) {
      set_clock(from.clock());
    }
  }
}

void Message::CopyFrom(const Message& from) {
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

bool Message::IsInitialized() const {
  if ((_has_bits_[0] & 0x0000000f) != 0x0000000f) return false;
  
  return true;
}

void Message::Swap(Message* other) {
  if (other != this) {
    std::swap(context_id_, other->context_id_);
    std::swap(function_, other->function_);
    std::swap(type_, other->type_);
    std::swap(expect_response_, other->expect_response_);
    std::swap(ret_, other->ret_);
    std::swap(arg0_, other->arg0_);
    std::swap(arg1_, other->arg1_);
    std::swap(arg2_, other->arg2_);
    std::swap(arg3_, other->arg3_);
    std::swap(arg4_, other->arg4_);
    std::swap(arg5_, other->arg5_);
    std::swap(arg6_, other->arg6_);
    std::swap(arg7_, other->arg7_);
    std::swap(arg8_, other->arg8_);
    std::swap(data_, other->data_);
    std::swap(data_type_, other->data_type_);
    std::swap(pixel_format_, other->pixel_format_);
    std::swap(pixel_type_, other->pixel_type_);
    std::swap(time_, other->time_);
    std::swap(prop_, other->prop_);
    std::swap(clock_, other->clock_);
    std::swap(_has_bits_[0], other->_has_bits_[0]);
    std::swap(_cached_size_, other->_cached_size_);
  }
}

::std::string Message::GetTypeName() const {
  return "com.android.glesv2debugger.Message";
}


// @@protoc_insertion_point(namespace_scope)

}  // namespace glesv2debugger
}  // namespace android
}  // namespace com

// @@protoc_insertion_point(global_scope)
