Added unit tests for Lite runtime services and serialization
diff --git a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestRpcInteropLite.cs b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestRpcInteropLite.cs
new file mode 100644
index 0000000..25f4884
--- /dev/null
+++ b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestRpcInteropLite.cs
@@ -0,0 +1,1405 @@
+// Generated by ProtoGen, Version=2.3.0.277, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48.  DO NOT EDIT!

+#pragma warning disable 1591, 0612

+#region Designer generated code

+

+using pb = global::Google.ProtocolBuffers;

+using pbc = global::Google.ProtocolBuffers.Collections;

+using pbd = global::Google.ProtocolBuffers.Descriptors;

+using scg = global::System.Collections.Generic;

+namespace Google.ProtocolBuffers.TestProtos {

+  

+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+  public static partial class UnitTestRpcInteropLite {

+  

+    #region Extension registration

+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {

+    }

+    #endregion

+    #region Static variables

+    #endregion

+    #region Extensions

+    internal static readonly object Descriptor;

+    static UnitTestRpcInteropLite() {

+      Descriptor = null;

+    }

+    #endregion

+    

+  }

+  #region Messages

+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+  public sealed partial class SearchRequest : pb::GeneratedMessageLite<SearchRequest, SearchRequest.Builder> {

+    private SearchRequest() { }

+    private static readonly SearchRequest defaultInstance = new SearchRequest().MakeReadOnly();

+    private static readonly string[] _searchRequestFieldNames = new string[] { "Criteria" };

+    private static readonly uint[] _searchRequestFieldTags = new uint[] { 10 };

+    public static SearchRequest DefaultInstance {

+      get { return defaultInstance; }

+    }

+    

+    public override SearchRequest DefaultInstanceForType {

+      get { return DefaultInstance; }

+    }

+    

+    protected override SearchRequest ThisMessage {

+      get { return this; }

+    }

+    

+    public const int CriteriaFieldNumber = 1;

+    private pbc::PopsicleList<string> criteria_ = new pbc::PopsicleList<string>();

+    public scg::IList<string> CriteriaList {

+      get { return pbc::Lists.AsReadOnly(criteria_); }

+    }

+    public int CriteriaCount {

+      get { return criteria_.Count; }

+    }

+    public string GetCriteria(int index) {

+      return criteria_[index];

+    }

+    

+    public override bool IsInitialized {

+      get {

+        return true;

+      }

+    }

+    

+    public override void WriteTo(pb::ICodedOutputStream output) {

+      int size = SerializedSize;

+      string[] field_names = _searchRequestFieldNames;

+      if (criteria_.Count > 0) {

+        output.WriteStringArray(1, field_names[0], criteria_);

+      }

+    }

+    

+    private int memoizedSerializedSize = -1;

+    public override int SerializedSize {

+      get {

+        int size = memoizedSerializedSize;

+        if (size != -1) return size;

+        

+        size = 0;

+        {

+          int dataSize = 0;

+          foreach (string element in CriteriaList) {

+            dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);

+          }

+          size += dataSize;

+          size += 1 * criteria_.Count;

+        }

+        memoizedSerializedSize = size;

+        return size;

+      }

+    }

+    

+    #region Lite runtime methods

+    public override int GetHashCode() {

+      int hash = GetType().GetHashCode();

+      foreach(string i in criteria_)

+        hash ^= i.GetHashCode();

+      return hash;

+    }

+    

+    public override bool Equals(object obj) {

+      SearchRequest other = obj as SearchRequest;

+      if (other == null) return false;

+      if(criteria_.Count != other.criteria_.Count) return false;

+      for(int ix=0; ix < criteria_.Count; ix++)

+        if(!criteria_[ix].Equals(other.criteria_[ix])) return false;

+      return true;

+    }

+    

+    public override void PrintTo(global::System.IO.TextWriter writer) {

+      PrintField("Criteria", criteria_, writer);

+    }

+    #endregion

+    

+    public static SearchRequest ParseFrom(pb::ByteString data) {

+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();

+    }

+    public static SearchRequest ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();

+    }

+    public static SearchRequest ParseFrom(byte[] data) {

+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();

+    }

+    public static SearchRequest ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();

+    }

+    public static SearchRequest ParseFrom(global::System.IO.Stream input) {

+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();

+    }

+    public static SearchRequest ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

+    }

+    public static SearchRequest ParseDelimitedFrom(global::System.IO.Stream input) {

+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();

+    }

+    public static SearchRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

+    }

+    public static SearchRequest ParseFrom(pb::ICodedInputStream input) {

+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();

+    }

+    public static SearchRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

+    }

+    private SearchRequest MakeReadOnly() {

+      criteria_.MakeReadOnly();

+      return this;

+    }

+    

+    public static Builder CreateBuilder() { return new Builder(); }

+    public override Builder ToBuilder() { return CreateBuilder(this); }

+    public override Builder CreateBuilderForType() { return new Builder(); }

+    public static Builder CreateBuilder(SearchRequest prototype) {

+      return new Builder(prototype);

+    }

+    

+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+    public sealed partial class Builder : pb::GeneratedBuilderLite<SearchRequest, Builder> {

+      protected override Builder ThisBuilder {

+        get { return this; }

+      }

+      public Builder() {

+        result = DefaultInstance;

+        resultIsReadOnly = true;

+      }

+      internal Builder(SearchRequest cloneFrom) {

+        result = cloneFrom;

+        resultIsReadOnly = true;

+      }

+      

+      private bool resultIsReadOnly;

+      private SearchRequest result;

+      

+      private SearchRequest PrepareBuilder() {

+        if (resultIsReadOnly) {

+          SearchRequest original = result;

+          result = new SearchRequest();

+          resultIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

+      

+      protected override SearchRequest MessageBeingBuilt {

+        get { return PrepareBuilder(); }

+      }

+      

+      public override Builder Clear() {

+        result = DefaultInstance;

+        resultIsReadOnly = true;

+        return this;

+      }

+      

+      public override Builder Clone() {

+        if (resultIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

+      }

+      

+      public override SearchRequest DefaultInstanceForType {

+        get { return global::Google.ProtocolBuffers.TestProtos.SearchRequest.DefaultInstance; }

+      }

+      

+      public override SearchRequest BuildPartial() {

+        if (resultIsReadOnly) {

+          return result;

+        }

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

+      }

+      

+      public override Builder MergeFrom(pb::IMessageLite other) {

+        if (other is SearchRequest) {

+          return MergeFrom((SearchRequest) other);

+        } else {

+          base.MergeFrom(other);

+          return this;

+        }

+      }

+      

+      public override Builder MergeFrom(SearchRequest other) {

+        if (other == global::Google.ProtocolBuffers.TestProtos.SearchRequest.DefaultInstance) return this;

+        PrepareBuilder();

+        if (other.criteria_.Count != 0) {

+          result.criteria_.Add(other.criteria_);

+        }

+        return this;

+      }

+      

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

+        return MergeFrom(input, pb::ExtensionRegistry.Empty);

+      }

+      

+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

+        uint tag;

+        string field_name;

+        while (input.ReadTag(out tag, out field_name)) {

+          if(tag == 0 && field_name != null) {

+            int field_ordinal = global::System.Array.BinarySearch(_searchRequestFieldNames, field_name, global::System.StringComparer.Ordinal);

+            if(field_ordinal >= 0)

+              tag = _searchRequestFieldTags[field_ordinal];

+            else {

+              ParseUnknownField(input, extensionRegistry, tag, field_name);

+              continue;

+            }

+          }

+          switch (tag) {

+            case 0: {

+              throw pb::InvalidProtocolBufferException.InvalidTag();

+            }

+            default: {

+              if (pb::WireFormat.IsEndGroupTag(tag)) {

+                return this;

+              }

+              ParseUnknownField(input, extensionRegistry, tag, field_name);

+              break;

+            }

+            case 10: {

+              input.ReadStringArray(tag, field_name, result.criteria_);

+              break;

+            }

+          }

+        }

+        

+        return this;

+      }

+      

+      

+      public pbc::IPopsicleList<string> CriteriaList {

+        get { return PrepareBuilder().criteria_; }

+      }

+      public int CriteriaCount {

+        get { return result.CriteriaCount; }

+      }

+      public string GetCriteria(int index) {

+        return result.GetCriteria(index);

+      }

+      public Builder SetCriteria(int index, string value) {

+        pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

+        result.criteria_[index] = value;

+        return this;

+      }

+      public Builder AddCriteria(string value) {

+        pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

+        result.criteria_.Add(value);

+        return this;

+      }

+      public Builder AddRangeCriteria(scg::IEnumerable<string> values) {

+        PrepareBuilder();

+        result.criteria_.Add(values);

+        return this;

+      }

+      public Builder ClearCriteria() {

+        PrepareBuilder();

+        result.criteria_.Clear();

+        return this;

+      }

+    }

+    static SearchRequest() {

+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestRpcInteropLite.Descriptor, null);

+    }

+  }

+  

+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+  public sealed partial class SearchResponse : pb::GeneratedMessageLite<SearchResponse, SearchResponse.Builder> {

+    private SearchResponse() { }

+    private static readonly SearchResponse defaultInstance = new SearchResponse().MakeReadOnly();

+    private static readonly string[] _searchResponseFieldNames = new string[] { "results" };

+    private static readonly uint[] _searchResponseFieldTags = new uint[] { 10 };

+    public static SearchResponse DefaultInstance {

+      get { return defaultInstance; }

+    }

+    

+    public override SearchResponse DefaultInstanceForType {

+      get { return DefaultInstance; }

+    }

+    

+    protected override SearchResponse ThisMessage {

+      get { return this; }

+    }

+    

+    #region Nested types

+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+    public static class Types {

+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+      public sealed partial class ResultItem : pb::GeneratedMessageLite<ResultItem, ResultItem.Builder> {

+        private ResultItem() { }

+        private static readonly ResultItem defaultInstance = new ResultItem().MakeReadOnly();

+        private static readonly string[] _resultItemFieldNames = new string[] { "name", "url" };

+        private static readonly uint[] _resultItemFieldTags = new uint[] { 18, 10 };

+        public static ResultItem DefaultInstance {

+          get { return defaultInstance; }

+        }

+        

+        public override ResultItem DefaultInstanceForType {

+          get { return DefaultInstance; }

+        }

+        

+        protected override ResultItem ThisMessage {

+          get { return this; }

+        }

+        

+        public const int UrlFieldNumber = 1;

+        private bool hasUrl;

+        private string url_ = "";

+        public bool HasUrl {

+          get { return hasUrl; }

+        }

+        public string Url {

+          get { return url_; }

+        }

+        

+        public const int NameFieldNumber = 2;

+        private bool hasName;

+        private string name_ = "";

+        public bool HasName {

+          get { return hasName; }

+        }

+        public string Name {

+          get { return name_; }

+        }

+        

+        public override bool IsInitialized {

+          get {

+            if (!hasUrl) return false;

+            return true;

+          }

+        }

+        

+        public override void WriteTo(pb::ICodedOutputStream output) {

+          int size = SerializedSize;

+          string[] field_names = _resultItemFieldNames;

+          if (hasUrl) {

+            output.WriteString(1, field_names[1], Url);

+          }

+          if (hasName) {

+            output.WriteString(2, field_names[0], Name);

+          }

+        }

+        

+        private int memoizedSerializedSize = -1;

+        public override int SerializedSize {

+          get {

+            int size = memoizedSerializedSize;

+            if (size != -1) return size;

+            

+            size = 0;

+            if (hasUrl) {

+              size += pb::CodedOutputStream.ComputeStringSize(1, Url);

+            }

+            if (hasName) {

+              size += pb::CodedOutputStream.ComputeStringSize(2, Name);

+            }

+            memoizedSerializedSize = size;

+            return size;

+          }

+        }

+        

+        #region Lite runtime methods

+        public override int GetHashCode() {

+          int hash = GetType().GetHashCode();

+          if (hasUrl) hash ^= url_.GetHashCode();

+          if (hasName) hash ^= name_.GetHashCode();

+          return hash;

+        }

+        

+        public override bool Equals(object obj) {

+          ResultItem other = obj as ResultItem;

+          if (other == null) return false;

+          if (hasUrl != other.hasUrl || (hasUrl && !url_.Equals(other.url_))) return false;

+          if (hasName != other.hasName || (hasName && !name_.Equals(other.name_))) return false;

+          return true;

+        }

+        

+        public override void PrintTo(global::System.IO.TextWriter writer) {

+          PrintField("url", hasUrl, url_, writer);

+          PrintField("name", hasName, name_, writer);

+        }

+        #endregion

+        

+        public static ResultItem ParseFrom(pb::ByteString data) {

+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();

+        }

+        public static ResultItem ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {

+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();

+        }

+        public static ResultItem ParseFrom(byte[] data) {

+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();

+        }

+        public static ResultItem ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {

+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();

+        }

+        public static ResultItem ParseFrom(global::System.IO.Stream input) {

+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();

+        }

+        public static ResultItem ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

+        }

+        public static ResultItem ParseDelimitedFrom(global::System.IO.Stream input) {

+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();

+        }

+        public static ResultItem ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

+        }

+        public static ResultItem ParseFrom(pb::ICodedInputStream input) {

+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();

+        }

+        public static ResultItem ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

+        }

+        private ResultItem MakeReadOnly() {

+          return this;

+        }

+        

+        public static Builder CreateBuilder() { return new Builder(); }

+        public override Builder ToBuilder() { return CreateBuilder(this); }

+        public override Builder CreateBuilderForType() { return new Builder(); }

+        public static Builder CreateBuilder(ResultItem prototype) {

+          return new Builder(prototype);

+        }

+        

+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+        public sealed partial class Builder : pb::GeneratedBuilderLite<ResultItem, Builder> {

+          protected override Builder ThisBuilder {

+            get { return this; }

+          }

+          public Builder() {

+            result = DefaultInstance;

+            resultIsReadOnly = true;

+          }

+          internal Builder(ResultItem cloneFrom) {

+            result = cloneFrom;

+            resultIsReadOnly = true;

+          }

+          

+          private bool resultIsReadOnly;

+          private ResultItem result;

+          

+          private ResultItem PrepareBuilder() {

+            if (resultIsReadOnly) {

+              ResultItem original = result;

+              result = new ResultItem();

+              resultIsReadOnly = false;

+              MergeFrom(original);

+            }

+            return result;

+          }

+          

+          public override bool IsInitialized {

+            get { return result.IsInitialized; }

+          }

+          

+          protected override ResultItem MessageBeingBuilt {

+            get { return PrepareBuilder(); }

+          }

+          

+          public override Builder Clear() {

+            result = DefaultInstance;

+            resultIsReadOnly = true;

+            return this;

+          }

+          

+          public override Builder Clone() {

+            if (resultIsReadOnly) {

+              return new Builder(result);

+            } else {

+              return new Builder().MergeFrom(result);

+            }

+          }

+          

+          public override ResultItem DefaultInstanceForType {

+            get { return global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem.DefaultInstance; }

+          }

+          

+          public override ResultItem BuildPartial() {

+            if (resultIsReadOnly) {

+              return result;

+            }

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

+          }

+          

+          public override Builder MergeFrom(pb::IMessageLite other) {

+            if (other is ResultItem) {

+              return MergeFrom((ResultItem) other);

+            } else {

+              base.MergeFrom(other);

+              return this;

+            }

+          }

+          

+          public override Builder MergeFrom(ResultItem other) {

+            if (other == global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem.DefaultInstance) return this;

+            PrepareBuilder();

+            if (other.HasUrl) {

+              Url = other.Url;

+            }

+            if (other.HasName) {

+              Name = other.Name;

+            }

+            return this;

+          }

+          

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

+            return MergeFrom(input, pb::ExtensionRegistry.Empty);

+          }

+          

+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+            PrepareBuilder();

+            uint tag;

+            string field_name;

+            while (input.ReadTag(out tag, out field_name)) {

+              if(tag == 0 && field_name != null) {

+                int field_ordinal = global::System.Array.BinarySearch(_resultItemFieldNames, field_name, global::System.StringComparer.Ordinal);

+                if(field_ordinal >= 0)

+                  tag = _resultItemFieldTags[field_ordinal];

+                else {

+                  ParseUnknownField(input, extensionRegistry, tag, field_name);

+                  continue;

+                }

+              }

+              switch (tag) {

+                case 0: {

+                  throw pb::InvalidProtocolBufferException.InvalidTag();

+                }

+                default: {

+                  if (pb::WireFormat.IsEndGroupTag(tag)) {

+                    return this;

+                  }

+                  ParseUnknownField(input, extensionRegistry, tag, field_name);

+                  break;

+                }

+                case 10: {

+                  result.hasUrl = input.ReadString(ref result.url_);

+                  break;

+                }

+                case 18: {

+                  result.hasName = input.ReadString(ref result.name_);

+                  break;

+                }

+              }

+            }

+            

+            return this;

+          }

+          

+          

+          public bool HasUrl {

+            get { return result.hasUrl; }

+          }

+          public string Url {

+            get { return result.Url; }

+            set { SetUrl(value); }

+          }

+          public Builder SetUrl(string value) {

+            pb::ThrowHelper.ThrowIfNull(value, "value");

+            PrepareBuilder();

+            result.hasUrl = true;

+            result.url_ = value;

+            return this;

+          }

+          public Builder ClearUrl() {

+            PrepareBuilder();

+            result.hasUrl = false;

+            result.url_ = "";

+            return this;

+          }

+          

+          public bool HasName {

+            get { return result.hasName; }

+          }

+          public string Name {

+            get { return result.Name; }

+            set { SetName(value); }

+          }

+          public Builder SetName(string value) {

+            pb::ThrowHelper.ThrowIfNull(value, "value");

+            PrepareBuilder();

+            result.hasName = true;

+            result.name_ = value;

+            return this;

+          }

+          public Builder ClearName() {

+            PrepareBuilder();

+            result.hasName = false;

+            result.name_ = "";

+            return this;

+          }

+        }

+        static ResultItem() {

+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestRpcInteropLite.Descriptor, null);

+        }

+      }

+      

+    }

+    #endregion

+    

+    public const int ResultsFieldNumber = 1;

+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem> results_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem>();

+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem> ResultsList {

+      get { return results_; }

+    }

+    public int ResultsCount {

+      get { return results_.Count; }

+    }

+    public global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem GetResults(int index) {

+      return results_[index];

+    }

+    

+    public override bool IsInitialized {

+      get {

+        foreach (global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem element in ResultsList) {

+          if (!element.IsInitialized) return false;

+        }

+        return true;

+      }

+    }

+    

+    public override void WriteTo(pb::ICodedOutputStream output) {

+      int size = SerializedSize;

+      string[] field_names = _searchResponseFieldNames;

+      if (results_.Count > 0) {

+        output.WriteMessageArray(1, field_names[0], results_);

+      }

+    }

+    

+    private int memoizedSerializedSize = -1;

+    public override int SerializedSize {

+      get {

+        int size = memoizedSerializedSize;

+        if (size != -1) return size;

+        

+        size = 0;

+        foreach (global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem element in ResultsList) {

+          size += pb::CodedOutputStream.ComputeMessageSize(1, element);

+        }

+        memoizedSerializedSize = size;

+        return size;

+      }

+    }

+    

+    #region Lite runtime methods

+    public override int GetHashCode() {

+      int hash = GetType().GetHashCode();

+      foreach(global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem i in results_)

+        hash ^= i.GetHashCode();

+      return hash;

+    }

+    

+    public override bool Equals(object obj) {

+      SearchResponse other = obj as SearchResponse;

+      if (other == null) return false;

+      if(results_.Count != other.results_.Count) return false;

+      for(int ix=0; ix < results_.Count; ix++)

+        if(!results_[ix].Equals(other.results_[ix])) return false;

+      return true;

+    }

+    

+    public override void PrintTo(global::System.IO.TextWriter writer) {

+      PrintField("results", results_, writer);

+    }

+    #endregion

+    

+    public static SearchResponse ParseFrom(pb::ByteString data) {

+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();

+    }

+    public static SearchResponse ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();

+    }

+    public static SearchResponse ParseFrom(byte[] data) {

+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();

+    }

+    public static SearchResponse ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();

+    }

+    public static SearchResponse ParseFrom(global::System.IO.Stream input) {

+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();

+    }

+    public static SearchResponse ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

+    }

+    public static SearchResponse ParseDelimitedFrom(global::System.IO.Stream input) {

+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();

+    }

+    public static SearchResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

+    }

+    public static SearchResponse ParseFrom(pb::ICodedInputStream input) {

+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();

+    }

+    public static SearchResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

+    }

+    private SearchResponse MakeReadOnly() {

+      results_.MakeReadOnly();

+      return this;

+    }

+    

+    public static Builder CreateBuilder() { return new Builder(); }

+    public override Builder ToBuilder() { return CreateBuilder(this); }

+    public override Builder CreateBuilderForType() { return new Builder(); }

+    public static Builder CreateBuilder(SearchResponse prototype) {

+      return new Builder(prototype);

+    }

+    

+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+    public sealed partial class Builder : pb::GeneratedBuilderLite<SearchResponse, Builder> {

+      protected override Builder ThisBuilder {

+        get { return this; }

+      }

+      public Builder() {

+        result = DefaultInstance;

+        resultIsReadOnly = true;

+      }

+      internal Builder(SearchResponse cloneFrom) {

+        result = cloneFrom;

+        resultIsReadOnly = true;

+      }

+      

+      private bool resultIsReadOnly;

+      private SearchResponse result;

+      

+      private SearchResponse PrepareBuilder() {

+        if (resultIsReadOnly) {

+          SearchResponse original = result;

+          result = new SearchResponse();

+          resultIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

+      

+      protected override SearchResponse MessageBeingBuilt {

+        get { return PrepareBuilder(); }

+      }

+      

+      public override Builder Clear() {

+        result = DefaultInstance;

+        resultIsReadOnly = true;

+        return this;

+      }

+      

+      public override Builder Clone() {

+        if (resultIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

+      }

+      

+      public override SearchResponse DefaultInstanceForType {

+        get { return global::Google.ProtocolBuffers.TestProtos.SearchResponse.DefaultInstance; }

+      }

+      

+      public override SearchResponse BuildPartial() {

+        if (resultIsReadOnly) {

+          return result;

+        }

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

+      }

+      

+      public override Builder MergeFrom(pb::IMessageLite other) {

+        if (other is SearchResponse) {

+          return MergeFrom((SearchResponse) other);

+        } else {

+          base.MergeFrom(other);

+          return this;

+        }

+      }

+      

+      public override Builder MergeFrom(SearchResponse other) {

+        if (other == global::Google.ProtocolBuffers.TestProtos.SearchResponse.DefaultInstance) return this;

+        PrepareBuilder();

+        if (other.results_.Count != 0) {

+          result.results_.Add(other.results_);

+        }

+        return this;

+      }

+      

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

+        return MergeFrom(input, pb::ExtensionRegistry.Empty);

+      }

+      

+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

+        uint tag;

+        string field_name;

+        while (input.ReadTag(out tag, out field_name)) {

+          if(tag == 0 && field_name != null) {

+            int field_ordinal = global::System.Array.BinarySearch(_searchResponseFieldNames, field_name, global::System.StringComparer.Ordinal);

+            if(field_ordinal >= 0)

+              tag = _searchResponseFieldTags[field_ordinal];

+            else {

+              ParseUnknownField(input, extensionRegistry, tag, field_name);

+              continue;

+            }

+          }

+          switch (tag) {

+            case 0: {

+              throw pb::InvalidProtocolBufferException.InvalidTag();

+            }

+            default: {

+              if (pb::WireFormat.IsEndGroupTag(tag)) {

+                return this;

+              }

+              ParseUnknownField(input, extensionRegistry, tag, field_name);

+              break;

+            }

+            case 10: {

+              input.ReadMessageArray(tag, field_name, result.results_, global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem.DefaultInstance, extensionRegistry);

+              break;

+            }

+          }

+        }

+        

+        return this;

+      }

+      

+      

+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem> ResultsList {

+        get { return PrepareBuilder().results_; }

+      }

+      public int ResultsCount {

+        get { return result.ResultsCount; }

+      }

+      public global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem GetResults(int index) {

+        return result.GetResults(index);

+      }

+      public Builder SetResults(int index, global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem value) {

+        pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

+        result.results_[index] = value;

+        return this;

+      }

+      public Builder SetResults(int index, global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem.Builder builderForValue) {

+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");

+        PrepareBuilder();

+        result.results_[index] = builderForValue.Build();

+        return this;

+      }

+      public Builder AddResults(global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem value) {

+        pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

+        result.results_.Add(value);

+        return this;

+      }

+      public Builder AddResults(global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem.Builder builderForValue) {

+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");

+        PrepareBuilder();

+        result.results_.Add(builderForValue.Build());

+        return this;

+      }

+      public Builder AddRangeResults(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.SearchResponse.Types.ResultItem> values) {

+        PrepareBuilder();

+        result.results_.Add(values);

+        return this;

+      }

+      public Builder ClearResults() {

+        PrepareBuilder();

+        result.results_.Clear();

+        return this;

+      }

+    }

+    static SearchResponse() {

+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestRpcInteropLite.Descriptor, null);

+    }

+  }

+  

+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+  public sealed partial class RefineSearchRequest : pb::GeneratedMessageLite<RefineSearchRequest, RefineSearchRequest.Builder> {

+    private RefineSearchRequest() { }

+    private static readonly RefineSearchRequest defaultInstance = new RefineSearchRequest().MakeReadOnly();

+    private static readonly string[] _refineSearchRequestFieldNames = new string[] { "Criteria", "previous_results" };

+    private static readonly uint[] _refineSearchRequestFieldTags = new uint[] { 10, 18 };

+    public static RefineSearchRequest DefaultInstance {

+      get { return defaultInstance; }

+    }

+    

+    public override RefineSearchRequest DefaultInstanceForType {

+      get { return DefaultInstance; }

+    }

+    

+    protected override RefineSearchRequest ThisMessage {

+      get { return this; }

+    }

+    

+    public const int CriteriaFieldNumber = 1;

+    private pbc::PopsicleList<string> criteria_ = new pbc::PopsicleList<string>();

+    public scg::IList<string> CriteriaList {

+      get { return pbc::Lists.AsReadOnly(criteria_); }

+    }

+    public int CriteriaCount {

+      get { return criteria_.Count; }

+    }

+    public string GetCriteria(int index) {

+      return criteria_[index];

+    }

+    

+    public const int PreviousResultsFieldNumber = 2;

+    private bool hasPreviousResults;

+    private global::Google.ProtocolBuffers.TestProtos.SearchResponse previousResults_;

+    public bool HasPreviousResults {

+      get { return hasPreviousResults; }

+    }

+    public global::Google.ProtocolBuffers.TestProtos.SearchResponse PreviousResults {

+      get { return previousResults_ ?? global::Google.ProtocolBuffers.TestProtos.SearchResponse.DefaultInstance; }

+    }

+    

+    public override bool IsInitialized {

+      get {

+        if (!hasPreviousResults) return false;

+        if (!PreviousResults.IsInitialized) return false;

+        return true;

+      }

+    }

+    

+    public override void WriteTo(pb::ICodedOutputStream output) {

+      int size = SerializedSize;

+      string[] field_names = _refineSearchRequestFieldNames;

+      if (criteria_.Count > 0) {

+        output.WriteStringArray(1, field_names[0], criteria_);

+      }

+      if (hasPreviousResults) {

+        output.WriteMessage(2, field_names[1], PreviousResults);

+      }

+    }

+    

+    private int memoizedSerializedSize = -1;

+    public override int SerializedSize {

+      get {

+        int size = memoizedSerializedSize;

+        if (size != -1) return size;

+        

+        size = 0;

+        {

+          int dataSize = 0;

+          foreach (string element in CriteriaList) {

+            dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);

+          }

+          size += dataSize;

+          size += 1 * criteria_.Count;

+        }

+        if (hasPreviousResults) {

+          size += pb::CodedOutputStream.ComputeMessageSize(2, PreviousResults);

+        }

+        memoizedSerializedSize = size;

+        return size;

+      }

+    }

+    

+    #region Lite runtime methods

+    public override int GetHashCode() {

+      int hash = GetType().GetHashCode();

+      foreach(string i in criteria_)

+        hash ^= i.GetHashCode();

+      if (hasPreviousResults) hash ^= previousResults_.GetHashCode();

+      return hash;

+    }

+    

+    public override bool Equals(object obj) {

+      RefineSearchRequest other = obj as RefineSearchRequest;

+      if (other == null) return false;

+      if(criteria_.Count != other.criteria_.Count) return false;

+      for(int ix=0; ix < criteria_.Count; ix++)

+        if(!criteria_[ix].Equals(other.criteria_[ix])) return false;

+      if (hasPreviousResults != other.hasPreviousResults || (hasPreviousResults && !previousResults_.Equals(other.previousResults_))) return false;

+      return true;

+    }

+    

+    public override void PrintTo(global::System.IO.TextWriter writer) {

+      PrintField("Criteria", criteria_, writer);

+      PrintField("previous_results", hasPreviousResults, previousResults_, writer);

+    }

+    #endregion

+    

+    public static RefineSearchRequest ParseFrom(pb::ByteString data) {

+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();

+    }

+    public static RefineSearchRequest ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();

+    }

+    public static RefineSearchRequest ParseFrom(byte[] data) {

+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();

+    }

+    public static RefineSearchRequest ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();

+    }

+    public static RefineSearchRequest ParseFrom(global::System.IO.Stream input) {

+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();

+    }

+    public static RefineSearchRequest ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

+    }

+    public static RefineSearchRequest ParseDelimitedFrom(global::System.IO.Stream input) {

+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();

+    }

+    public static RefineSearchRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

+    }

+    public static RefineSearchRequest ParseFrom(pb::ICodedInputStream input) {

+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();

+    }

+    public static RefineSearchRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

+    }

+    private RefineSearchRequest MakeReadOnly() {

+      criteria_.MakeReadOnly();

+      return this;

+    }

+    

+    public static Builder CreateBuilder() { return new Builder(); }

+    public override Builder ToBuilder() { return CreateBuilder(this); }

+    public override Builder CreateBuilderForType() { return new Builder(); }

+    public static Builder CreateBuilder(RefineSearchRequest prototype) {

+      return new Builder(prototype);

+    }

+    

+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+    public sealed partial class Builder : pb::GeneratedBuilderLite<RefineSearchRequest, Builder> {

+      protected override Builder ThisBuilder {

+        get { return this; }

+      }

+      public Builder() {

+        result = DefaultInstance;

+        resultIsReadOnly = true;

+      }

+      internal Builder(RefineSearchRequest cloneFrom) {

+        result = cloneFrom;

+        resultIsReadOnly = true;

+      }

+      

+      private bool resultIsReadOnly;

+      private RefineSearchRequest result;

+      

+      private RefineSearchRequest PrepareBuilder() {

+        if (resultIsReadOnly) {

+          RefineSearchRequest original = result;

+          result = new RefineSearchRequest();

+          resultIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

+      

+      protected override RefineSearchRequest MessageBeingBuilt {

+        get { return PrepareBuilder(); }

+      }

+      

+      public override Builder Clear() {

+        result = DefaultInstance;

+        resultIsReadOnly = true;

+        return this;

+      }

+      

+      public override Builder Clone() {

+        if (resultIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

+      }

+      

+      public override RefineSearchRequest DefaultInstanceForType {

+        get { return global::Google.ProtocolBuffers.TestProtos.RefineSearchRequest.DefaultInstance; }

+      }

+      

+      public override RefineSearchRequest BuildPartial() {

+        if (resultIsReadOnly) {

+          return result;

+        }

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

+      }

+      

+      public override Builder MergeFrom(pb::IMessageLite other) {

+        if (other is RefineSearchRequest) {

+          return MergeFrom((RefineSearchRequest) other);

+        } else {

+          base.MergeFrom(other);

+          return this;

+        }

+      }

+      

+      public override Builder MergeFrom(RefineSearchRequest other) {

+        if (other == global::Google.ProtocolBuffers.TestProtos.RefineSearchRequest.DefaultInstance) return this;

+        PrepareBuilder();

+        if (other.criteria_.Count != 0) {

+          result.criteria_.Add(other.criteria_);

+        }

+        if (other.HasPreviousResults) {

+          MergePreviousResults(other.PreviousResults);

+        }

+        return this;

+      }

+      

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

+        return MergeFrom(input, pb::ExtensionRegistry.Empty);

+      }

+      

+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

+        uint tag;

+        string field_name;

+        while (input.ReadTag(out tag, out field_name)) {

+          if(tag == 0 && field_name != null) {

+            int field_ordinal = global::System.Array.BinarySearch(_refineSearchRequestFieldNames, field_name, global::System.StringComparer.Ordinal);

+            if(field_ordinal >= 0)

+              tag = _refineSearchRequestFieldTags[field_ordinal];

+            else {

+              ParseUnknownField(input, extensionRegistry, tag, field_name);

+              continue;

+            }

+          }

+          switch (tag) {

+            case 0: {

+              throw pb::InvalidProtocolBufferException.InvalidTag();

+            }

+            default: {

+              if (pb::WireFormat.IsEndGroupTag(tag)) {

+                return this;

+              }

+              ParseUnknownField(input, extensionRegistry, tag, field_name);

+              break;

+            }

+            case 10: {

+              input.ReadStringArray(tag, field_name, result.criteria_);

+              break;

+            }

+            case 18: {

+              global::Google.ProtocolBuffers.TestProtos.SearchResponse.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.SearchResponse.CreateBuilder();

+              if (result.hasPreviousResults) {

+                subBuilder.MergeFrom(PreviousResults);

+              }

+              input.ReadMessage(subBuilder, extensionRegistry);

+              PreviousResults = subBuilder.BuildPartial();

+              break;

+            }

+          }

+        }

+        

+        return this;

+      }

+      

+      

+      public pbc::IPopsicleList<string> CriteriaList {

+        get { return PrepareBuilder().criteria_; }

+      }

+      public int CriteriaCount {

+        get { return result.CriteriaCount; }

+      }

+      public string GetCriteria(int index) {

+        return result.GetCriteria(index);

+      }

+      public Builder SetCriteria(int index, string value) {

+        pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

+        result.criteria_[index] = value;

+        return this;

+      }

+      public Builder AddCriteria(string value) {

+        pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

+        result.criteria_.Add(value);

+        return this;

+      }

+      public Builder AddRangeCriteria(scg::IEnumerable<string> values) {

+        PrepareBuilder();

+        result.criteria_.Add(values);

+        return this;

+      }

+      public Builder ClearCriteria() {

+        PrepareBuilder();

+        result.criteria_.Clear();

+        return this;

+      }

+      

+      public bool HasPreviousResults {

+       get { return result.hasPreviousResults; }

+      }

+      public global::Google.ProtocolBuffers.TestProtos.SearchResponse PreviousResults {

+        get { return result.PreviousResults; }

+        set { SetPreviousResults(value); }

+      }

+      public Builder SetPreviousResults(global::Google.ProtocolBuffers.TestProtos.SearchResponse value) {

+        pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

+        result.hasPreviousResults = true;

+        result.previousResults_ = value;

+        return this;

+      }

+      public Builder SetPreviousResults(global::Google.ProtocolBuffers.TestProtos.SearchResponse.Builder builderForValue) {

+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");

+        PrepareBuilder();

+        result.hasPreviousResults = true;

+        result.previousResults_ = builderForValue.Build();

+        return this;

+      }

+      public Builder MergePreviousResults(global::Google.ProtocolBuffers.TestProtos.SearchResponse value) {

+        pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

+        if (result.hasPreviousResults &&

+            result.previousResults_ != global::Google.ProtocolBuffers.TestProtos.SearchResponse.DefaultInstance) {

+            result.previousResults_ = global::Google.ProtocolBuffers.TestProtos.SearchResponse.CreateBuilder(result.previousResults_).MergeFrom(value).BuildPartial();

+        } else {

+          result.previousResults_ = value;

+        }

+        result.hasPreviousResults = true;

+        return this;

+      }

+      public Builder ClearPreviousResults() {

+        PrepareBuilder();

+        result.hasPreviousResults = false;

+        result.previousResults_ = null;

+        return this;

+      }

+    }

+    static RefineSearchRequest() {

+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestRpcInteropLite.Descriptor, null);

+    }

+  }

+  

+  #endregion

+  

+  #region Services

+  [global::System.Runtime.InteropServices.GuidAttribute("a65f0925-fd11-4f94-b166-89ac4f027205")]

+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+  public partial interface ISearchService {

+    [global::System.Runtime.InteropServices.DispId(5)]

+    global::Google.ProtocolBuffers.TestProtos.SearchResponse Search(global::Google.ProtocolBuffers.TestProtos.SearchRequest searchRequest);

+    global::Google.ProtocolBuffers.TestProtos.SearchResponse RefineSearch(global::Google.ProtocolBuffers.TestProtos.RefineSearchRequest refineSearchRequest);

+  }

+  

+  [global::System.CLSCompliant(false)]

+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+  public partial class SearchService : ISearchService, pb::IRpcDispatch, global::System.IDisposable {

+    private readonly bool dispose;

+    private readonly pb::IRpcDispatch dispatch;

+    public SearchService(pb::IRpcDispatch dispatch) : this(dispatch, true) {

+    }

+    public SearchService(pb::IRpcDispatch dispatch, bool dispose) {

+      if (null == (this.dispatch = dispatch)) throw new global::System.ArgumentNullException();

+      this.dispose = dispose && dispatch is global::System.IDisposable;

+    }

+    

+    public void Dispose() {

+      if (dispose) ((global::System.IDisposable)dispatch).Dispose();

+    }

+    

+    TMessage pb::IRpcDispatch.CallMethod<TMessage, TBuilder>(string method, pb::IMessageLite request, pb::IBuilderLite<TMessage, TBuilder> response) {

+      return dispatch.CallMethod(method, request, response);

+    }

+    

+    public global::Google.ProtocolBuffers.TestProtos.SearchResponse Search(global::Google.ProtocolBuffers.TestProtos.SearchRequest searchRequest) {

+       return dispatch.CallMethod("Search", searchRequest, global::Google.ProtocolBuffers.TestProtos.SearchResponse.CreateBuilder());

+    }

+    

+    public global::Google.ProtocolBuffers.TestProtos.SearchResponse RefineSearch(global::Google.ProtocolBuffers.TestProtos.RefineSearchRequest refineSearchRequest) {

+       return dispatch.CallMethod("RefineSearch", refineSearchRequest, global::Google.ProtocolBuffers.TestProtos.SearchResponse.CreateBuilder());

+    }

+    

+    [global::System.CLSCompliant(false)]

+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+    public partial class Dispatch : pb::IRpcDispatch, global::System.IDisposable {

+      private readonly bool dispose;

+      private readonly ISearchService implementation;

+      public Dispatch(ISearchService implementation) : this(implementation, true) {

+      }

+      public Dispatch(ISearchService implementation, bool dispose) {

+        if (null == (this.implementation = implementation)) throw new global::System.ArgumentNullException();

+        this.dispose = dispose && implementation is global::System.IDisposable;

+      }

+      

+      public void Dispose() {

+        if (dispose) ((global::System.IDisposable)implementation).Dispose();

+      }

+      

+      public TMessage CallMethod<TMessage, TBuilder>(string methodName, pb::IMessageLite request, pb::IBuilderLite<TMessage, TBuilder> response)

+        where TMessage : pb::IMessageLite<TMessage, TBuilder>

+        where TBuilder : pb::IBuilderLite<TMessage, TBuilder> {

+        switch(methodName) {

+          case "Search": return response.MergeFrom(implementation.Search((global::Google.ProtocolBuffers.TestProtos.SearchRequest)request)).Build();

+          case "RefineSearch": return response.MergeFrom(implementation.RefineSearch((global::Google.ProtocolBuffers.TestProtos.RefineSearchRequest)request)).Build();

+          default: throw new global::System.MissingMethodException(typeof(ISearchService).FullName, methodName);

+        }

+      }

+    }

+    [global::System.CLSCompliant(false)]

+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

+    public partial class ServerStub : pb::IRpcServerStub, global::System.IDisposable {

+      private readonly bool dispose;

+      private readonly pb::IRpcDispatch implementation;

+      public ServerStub(ISearchService implementation) : this(implementation, true) {

+      }

+      public ServerStub(ISearchService implementation, bool dispose) : this(new Dispatch(implementation, dispose), dispose) {

+      }

+      public ServerStub(pb::IRpcDispatch implementation) : this(implementation, true) {

+      }

+      public ServerStub(pb::IRpcDispatch implementation, bool dispose) {

+        if (null == (this.implementation = implementation)) throw new global::System.ArgumentNullException();

+        this.dispose = dispose && implementation is global::System.IDisposable;

+      }

+      

+      public void Dispose() {

+        if (dispose) ((global::System.IDisposable)implementation).Dispose();

+      }

+      

+      public pb::IMessageLite CallMethod(string methodName, pb::ICodedInputStream input, pb::ExtensionRegistry registry) {

+        switch(methodName) {

+          case "Search": return implementation.CallMethod(methodName, global::Google.ProtocolBuffers.TestProtos.SearchRequest.ParseFrom(input, registry), global::Google.ProtocolBuffers.TestProtos.SearchResponse.CreateBuilder());

+          case "RefineSearch": return implementation.CallMethod(methodName, global::Google.ProtocolBuffers.TestProtos.RefineSearchRequest.ParseFrom(input, registry), global::Google.ProtocolBuffers.TestProtos.SearchResponse.CreateBuilder());

+          default: throw new global::System.MissingMethodException(typeof(ISearchService).FullName, methodName);

+        }

+      }

+    }

+  }

+  #endregion

+  

+}

+

+#endregion Designer generated code