First pass at implementation and testing of reusable builders.
diff --git a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestProtoFile.cs b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestProtoFile.cs
index d8824d4..aeea673 100644
--- a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestProtoFile.cs
+++ b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestProtoFile.cs
@@ -1260,7 +1260,7 @@
         public override Builder ToBuilder() { return CreateBuilder(this); }

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

         public static Builder CreateBuilder(NestedMessage prototype) {

-          return (Builder) new Builder().MergeFrom(prototype);

+          return new Builder(prototype);

         }

         

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

@@ -1270,21 +1270,48 @@
           protected override Builder ThisBuilder {

             get { return this; }

           }

-          public Builder() {}

+          public Builder() {

+            result = DefaultInstance ?? new NestedMessage();

+            builderIsReadOnly = result == DefaultInstance;

+          }

+          internal Builder(NestedMessage cloneFrom) {

+            result = cloneFrom;

+            builderIsReadOnly = true;

+          }

           

-          NestedMessage result = new NestedMessage();

+          bool builderIsReadOnly;

+          NestedMessage result;

+          

+          private NestedMessage PrepareBuilder() {

+            if (builderIsReadOnly) {

+              NestedMessage original = result;

+              result = new NestedMessage();

+              builderIsReadOnly = false;

+              MergeFrom(original);

+            }

+            return result;

+          }

+          

+          public override bool IsInitialized {

+            get { return result.IsInitialized; }

+          }

           

           protected override NestedMessage MessageBeingBuilt {

-            get { return result; }

+            get { return PrepareBuilder(); }

           }

           

           public override Builder Clear() {

-            result = new NestedMessage();

+            result = DefaultInstance ?? new NestedMessage();

+            builderIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

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

+            if (builderIsReadOnly) {

+              return new Builder(result);

+            } else {

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

+            }

           }

           

           public override pbd::MessageDescriptor DescriptorForType {

@@ -1296,12 +1323,11 @@
           }

           

           public override NestedMessage BuildPartial() {

-            if (result == null) {

-              throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+            if (builderIsReadOnly) {

+              return result;

             }

-            NestedMessage returnMe = result;

-            result = null;

-            return returnMe;

+            builderIsReadOnly = true;

+            return result;

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -1315,6 +1341,7 @@
           

           public override Builder MergeFrom(NestedMessage other) {

             if (other == global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance) return this;

+            PrepareBuilder();

             if (other.HasBb) {

               Bb = other.Bb;

             }

@@ -1327,6 +1354,7 @@
           }

           

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

+            PrepareBuilder();

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -1382,11 +1410,13 @@
             set { SetBb(value); }

           }

           public Builder SetBb(int value) {

+            PrepareBuilder();

             result.hasBb = true;

             result.bb_ = value;

             return this;

           }

           public Builder ClearBb() {

+            PrepareBuilder();

             result.hasBb = false;

             result.bb_ = 0;

             return this;

@@ -1499,7 +1529,7 @@
         public override Builder ToBuilder() { return CreateBuilder(this); }

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

         public static Builder CreateBuilder(OptionalGroup prototype) {

-          return (Builder) new Builder().MergeFrom(prototype);

+          return new Builder(prototype);

         }

         

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

@@ -1509,21 +1539,48 @@
           protected override Builder ThisBuilder {

             get { return this; }

           }

-          public Builder() {}

+          public Builder() {

+            result = DefaultInstance ?? new OptionalGroup();

+            builderIsReadOnly = result == DefaultInstance;

+          }

+          internal Builder(OptionalGroup cloneFrom) {

+            result = cloneFrom;

+            builderIsReadOnly = true;

+          }

           

-          OptionalGroup result = new OptionalGroup();

+          bool builderIsReadOnly;

+          OptionalGroup result;

+          

+          private OptionalGroup PrepareBuilder() {

+            if (builderIsReadOnly) {

+              OptionalGroup original = result;

+              result = new OptionalGroup();

+              builderIsReadOnly = false;

+              MergeFrom(original);

+            }

+            return result;

+          }

+          

+          public override bool IsInitialized {

+            get { return result.IsInitialized; }

+          }

           

           protected override OptionalGroup MessageBeingBuilt {

-            get { return result; }

+            get { return PrepareBuilder(); }

           }

           

           public override Builder Clear() {

-            result = new OptionalGroup();

+            result = DefaultInstance ?? new OptionalGroup();

+            builderIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

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

+            if (builderIsReadOnly) {

+              return new Builder(result);

+            } else {

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

+            }

           }

           

           public override pbd::MessageDescriptor DescriptorForType {

@@ -1535,12 +1592,11 @@
           }

           

           public override OptionalGroup BuildPartial() {

-            if (result == null) {

-              throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+            if (builderIsReadOnly) {

+              return result;

             }

-            OptionalGroup returnMe = result;

-            result = null;

-            return returnMe;

+            builderIsReadOnly = true;

+            return result;

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -1554,6 +1610,7 @@
           

           public override Builder MergeFrom(OptionalGroup other) {

             if (other == global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance) return this;

+            PrepareBuilder();

             if (other.HasA) {

               A = other.A;

             }

@@ -1566,6 +1623,7 @@
           }

           

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

+            PrepareBuilder();

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -1621,11 +1679,13 @@
             set { SetA(value); }

           }

           public Builder SetA(int value) {

+            PrepareBuilder();

             result.hasA = true;

             result.a_ = value;

             return this;

           }

           public Builder ClearA() {

+            PrepareBuilder();

             result.hasA = false;

             result.a_ = 0;

             return this;

@@ -1738,7 +1798,7 @@
         public override Builder ToBuilder() { return CreateBuilder(this); }

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

         public static Builder CreateBuilder(RepeatedGroup prototype) {

-          return (Builder) new Builder().MergeFrom(prototype);

+          return new Builder(prototype);

         }

         

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

@@ -1748,21 +1808,48 @@
           protected override Builder ThisBuilder {

             get { return this; }

           }

-          public Builder() {}

+          public Builder() {

+            result = DefaultInstance ?? new RepeatedGroup();

+            builderIsReadOnly = result == DefaultInstance;

+          }

+          internal Builder(RepeatedGroup cloneFrom) {

+            result = cloneFrom;

+            builderIsReadOnly = true;

+          }

           

-          RepeatedGroup result = new RepeatedGroup();

+          bool builderIsReadOnly;

+          RepeatedGroup result;

+          

+          private RepeatedGroup PrepareBuilder() {

+            if (builderIsReadOnly) {

+              RepeatedGroup original = result;

+              result = new RepeatedGroup();

+              builderIsReadOnly = false;

+              MergeFrom(original);

+            }

+            return result;

+          }

+          

+          public override bool IsInitialized {

+            get { return result.IsInitialized; }

+          }

           

           protected override RepeatedGroup MessageBeingBuilt {

-            get { return result; }

+            get { return PrepareBuilder(); }

           }

           

           public override Builder Clear() {

-            result = new RepeatedGroup();

+            result = DefaultInstance ?? new RepeatedGroup();

+            builderIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

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

+            if (builderIsReadOnly) {

+              return new Builder(result);

+            } else {

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

+            }

           }

           

           public override pbd::MessageDescriptor DescriptorForType {

@@ -1774,12 +1861,11 @@
           }

           

           public override RepeatedGroup BuildPartial() {

-            if (result == null) {

-              throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+            if (builderIsReadOnly) {

+              return result;

             }

-            RepeatedGroup returnMe = result;

-            result = null;

-            return returnMe;

+            builderIsReadOnly = true;

+            return result;

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -1793,6 +1879,7 @@
           

           public override Builder MergeFrom(RepeatedGroup other) {

             if (other == global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.DefaultInstance) return this;

+            PrepareBuilder();

             if (other.HasA) {

               A = other.A;

             }

@@ -1805,6 +1892,7 @@
           }

           

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

+            PrepareBuilder();

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -1860,11 +1948,13 @@
             set { SetA(value); }

           }

           public Builder SetA(int value) {

+            PrepareBuilder();

             result.hasA = true;

             result.a_ = value;

             return this;

           }

           public Builder ClearA() {

+            PrepareBuilder();

             result.hasA = false;

             result.a_ = 0;

             return this;

@@ -3181,7 +3271,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestAllTypes prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -3191,21 +3281,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestAllTypes();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestAllTypes cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestAllTypes result = new TestAllTypes();

+      bool builderIsReadOnly;

+      TestAllTypes result;

+      

+      private TestAllTypes PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestAllTypes original = result;

+          result = new TestAllTypes();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestAllTypes MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestAllTypes();

+        result = DefaultInstance ?? new TestAllTypes();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -3217,8 +3334,8 @@
       }

       

       public override TestAllTypes BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

         result.repeatedInt32_.MakeReadOnly();

         result.repeatedInt64_.MakeReadOnly();

@@ -3244,9 +3361,8 @@
         result.repeatedImportEnum_.MakeReadOnly();

         result.repeatedStringPiece_.MakeReadOnly();

         result.repeatedCord_.MakeReadOnly();

-        TestAllTypes returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -3260,6 +3376,7 @@
       

       public override Builder MergeFrom(TestAllTypes other) {

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

+        PrepareBuilder();

         if (other.HasOptionalInt32) {

           OptionalInt32 = other.OptionalInt32;

         }

@@ -3473,6 +3590,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -3907,11 +4025,13 @@
         set { SetOptionalInt32(value); }

       }

       public Builder SetOptionalInt32(int value) {

+        PrepareBuilder();

         result.hasOptionalInt32 = true;

         result.optionalInt32_ = value;

         return this;

       }

       public Builder ClearOptionalInt32() {

+        PrepareBuilder();

         result.hasOptionalInt32 = false;

         result.optionalInt32_ = 0;

         return this;

@@ -3925,11 +4045,13 @@
         set { SetOptionalInt64(value); }

       }

       public Builder SetOptionalInt64(long value) {

+        PrepareBuilder();

         result.hasOptionalInt64 = true;

         result.optionalInt64_ = value;

         return this;

       }

       public Builder ClearOptionalInt64() {

+        PrepareBuilder();

         result.hasOptionalInt64 = false;

         result.optionalInt64_ = 0L;

         return this;

@@ -3945,11 +4067,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetOptionalUint32(uint value) {

+        PrepareBuilder();

         result.hasOptionalUint32 = true;

         result.optionalUint32_ = value;

         return this;

       }

       public Builder ClearOptionalUint32() {

+        PrepareBuilder();

         result.hasOptionalUint32 = false;

         result.optionalUint32_ = 0;

         return this;

@@ -3965,11 +4089,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetOptionalUint64(ulong value) {

+        PrepareBuilder();

         result.hasOptionalUint64 = true;

         result.optionalUint64_ = value;

         return this;

       }

       public Builder ClearOptionalUint64() {

+        PrepareBuilder();

         result.hasOptionalUint64 = false;

         result.optionalUint64_ = 0UL;

         return this;

@@ -3983,11 +4109,13 @@
         set { SetOptionalSint32(value); }

       }

       public Builder SetOptionalSint32(int value) {

+        PrepareBuilder();

         result.hasOptionalSint32 = true;

         result.optionalSint32_ = value;

         return this;

       }

       public Builder ClearOptionalSint32() {

+        PrepareBuilder();

         result.hasOptionalSint32 = false;

         result.optionalSint32_ = 0;

         return this;

@@ -4001,11 +4129,13 @@
         set { SetOptionalSint64(value); }

       }

       public Builder SetOptionalSint64(long value) {

+        PrepareBuilder();

         result.hasOptionalSint64 = true;

         result.optionalSint64_ = value;

         return this;

       }

       public Builder ClearOptionalSint64() {

+        PrepareBuilder();

         result.hasOptionalSint64 = false;

         result.optionalSint64_ = 0;

         return this;

@@ -4021,11 +4151,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetOptionalFixed32(uint value) {

+        PrepareBuilder();

         result.hasOptionalFixed32 = true;

         result.optionalFixed32_ = value;

         return this;

       }

       public Builder ClearOptionalFixed32() {

+        PrepareBuilder();

         result.hasOptionalFixed32 = false;

         result.optionalFixed32_ = 0;

         return this;

@@ -4041,11 +4173,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetOptionalFixed64(ulong value) {

+        PrepareBuilder();

         result.hasOptionalFixed64 = true;

         result.optionalFixed64_ = value;

         return this;

       }

       public Builder ClearOptionalFixed64() {

+        PrepareBuilder();

         result.hasOptionalFixed64 = false;

         result.optionalFixed64_ = 0;

         return this;

@@ -4059,11 +4193,13 @@
         set { SetOptionalSfixed32(value); }

       }

       public Builder SetOptionalSfixed32(int value) {

+        PrepareBuilder();

         result.hasOptionalSfixed32 = true;

         result.optionalSfixed32_ = value;

         return this;

       }

       public Builder ClearOptionalSfixed32() {

+        PrepareBuilder();

         result.hasOptionalSfixed32 = false;

         result.optionalSfixed32_ = 0;

         return this;

@@ -4077,11 +4213,13 @@
         set { SetOptionalSfixed64(value); }

       }

       public Builder SetOptionalSfixed64(long value) {

+        PrepareBuilder();

         result.hasOptionalSfixed64 = true;

         result.optionalSfixed64_ = value;

         return this;

       }

       public Builder ClearOptionalSfixed64() {

+        PrepareBuilder();

         result.hasOptionalSfixed64 = false;

         result.optionalSfixed64_ = 0;

         return this;

@@ -4095,11 +4233,13 @@
         set { SetOptionalFloat(value); }

       }

       public Builder SetOptionalFloat(float value) {

+        PrepareBuilder();

         result.hasOptionalFloat = true;

         result.optionalFloat_ = value;

         return this;

       }

       public Builder ClearOptionalFloat() {

+        PrepareBuilder();

         result.hasOptionalFloat = false;

         result.optionalFloat_ = 0F;

         return this;

@@ -4113,11 +4253,13 @@
         set { SetOptionalDouble(value); }

       }

       public Builder SetOptionalDouble(double value) {

+        PrepareBuilder();

         result.hasOptionalDouble = true;

         result.optionalDouble_ = value;

         return this;

       }

       public Builder ClearOptionalDouble() {

+        PrepareBuilder();

         result.hasOptionalDouble = false;

         result.optionalDouble_ = 0D;

         return this;

@@ -4131,11 +4273,13 @@
         set { SetOptionalBool(value); }

       }

       public Builder SetOptionalBool(bool value) {

+        PrepareBuilder();

         result.hasOptionalBool = true;

         result.optionalBool_ = value;

         return this;

       }

       public Builder ClearOptionalBool() {

+        PrepareBuilder();

         result.hasOptionalBool = false;

         result.optionalBool_ = false;

         return this;

@@ -4150,11 +4294,13 @@
       }

       public Builder SetOptionalString(string value) {

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

+        PrepareBuilder();

         result.hasOptionalString = true;

         result.optionalString_ = value;

         return this;

       }

       public Builder ClearOptionalString() {

+        PrepareBuilder();

         result.hasOptionalString = false;

         result.optionalString_ = "";

         return this;

@@ -4169,11 +4315,13 @@
       }

       public Builder SetOptionalBytes(pb::ByteString value) {

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

+        PrepareBuilder();

         result.hasOptionalBytes = true;

         result.optionalBytes_ = value;

         return this;

       }

       public Builder ClearOptionalBytes() {

+        PrepareBuilder();

         result.hasOptionalBytes = false;

         result.optionalBytes_ = pb::ByteString.Empty;

         return this;

@@ -4188,18 +4336,21 @@
       }

       public Builder SetOptionalGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup value) {

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

+        PrepareBuilder();

         result.hasOptionalGroup = true;

         result.optionalGroup_ = value;

         return this;

       }

       public Builder SetOptionalGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasOptionalGroup = true;

         result.optionalGroup_ = builderForValue.Build();

         return this;

       }

       public Builder MergeOptionalGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup value) {

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

+        PrepareBuilder();

         if (result.hasOptionalGroup &&

             result.optionalGroup_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance) {

             result.optionalGroup_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.CreateBuilder(result.optionalGroup_).MergeFrom(value).BuildPartial();

@@ -4210,6 +4361,7 @@
         return this;

       }

       public Builder ClearOptionalGroup() {

+        PrepareBuilder();

         result.hasOptionalGroup = false;

         result.optionalGroup_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance;

         return this;

@@ -4224,18 +4376,21 @@
       }

       public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {

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

+        PrepareBuilder();

         result.hasOptionalNestedMessage = true;

         result.optionalNestedMessage_ = value;

         return this;

       }

       public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasOptionalNestedMessage = true;

         result.optionalNestedMessage_ = builderForValue.Build();

         return this;

       }

       public Builder MergeOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {

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

+        PrepareBuilder();

         if (result.hasOptionalNestedMessage &&

             result.optionalNestedMessage_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance) {

             result.optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder(result.optionalNestedMessage_).MergeFrom(value).BuildPartial();

@@ -4246,6 +4401,7 @@
         return this;

       }

       public Builder ClearOptionalNestedMessage() {

+        PrepareBuilder();

         result.hasOptionalNestedMessage = false;

         result.optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance;

         return this;

@@ -4260,18 +4416,21 @@
       }

       public Builder SetOptionalForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {

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

+        PrepareBuilder();

         result.hasOptionalForeignMessage = true;

         result.optionalForeignMessage_ = value;

         return this;

       }

       public Builder SetOptionalForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasOptionalForeignMessage = true;

         result.optionalForeignMessage_ = builderForValue.Build();

         return this;

       }

       public Builder MergeOptionalForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {

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

+        PrepareBuilder();

         if (result.hasOptionalForeignMessage &&

             result.optionalForeignMessage_ != global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance) {

             result.optionalForeignMessage_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder(result.optionalForeignMessage_).MergeFrom(value).BuildPartial();

@@ -4282,6 +4441,7 @@
         return this;

       }

       public Builder ClearOptionalForeignMessage() {

+        PrepareBuilder();

         result.hasOptionalForeignMessage = false;

         result.optionalForeignMessage_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance;

         return this;

@@ -4296,18 +4456,21 @@
       }

       public Builder SetOptionalImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage value) {

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

+        PrepareBuilder();

         result.hasOptionalImportMessage = true;

         result.optionalImportMessage_ = value;

         return this;

       }

       public Builder SetOptionalImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasOptionalImportMessage = true;

         result.optionalImportMessage_ = builderForValue.Build();

         return this;

       }

       public Builder MergeOptionalImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage value) {

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

+        PrepareBuilder();

         if (result.hasOptionalImportMessage &&

             result.optionalImportMessage_ != global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance) {

             result.optionalImportMessage_ = global::Google.ProtocolBuffers.TestProtos.ImportMessage.CreateBuilder(result.optionalImportMessage_).MergeFrom(value).BuildPartial();

@@ -4318,6 +4481,7 @@
         return this;

       }

       public Builder ClearOptionalImportMessage() {

+        PrepareBuilder();

         result.hasOptionalImportMessage = false;

         result.optionalImportMessage_ = global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance;

         return this;

@@ -4331,11 +4495,13 @@
         set { SetOptionalNestedEnum(value); }

       }

       public Builder SetOptionalNestedEnum(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum value) {

+        PrepareBuilder();

         result.hasOptionalNestedEnum = true;

         result.optionalNestedEnum_ = value;

         return this;

       }

       public Builder ClearOptionalNestedEnum() {

+        PrepareBuilder();

         result.hasOptionalNestedEnum = false;

         result.optionalNestedEnum_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum.FOO;

         return this;

@@ -4349,11 +4515,13 @@
         set { SetOptionalForeignEnum(value); }

       }

       public Builder SetOptionalForeignEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {

+        PrepareBuilder();

         result.hasOptionalForeignEnum = true;

         result.optionalForeignEnum_ = value;

         return this;

       }

       public Builder ClearOptionalForeignEnum() {

+        PrepareBuilder();

         result.hasOptionalForeignEnum = false;

         result.optionalForeignEnum_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;

         return this;

@@ -4367,11 +4535,13 @@
         set { SetOptionalImportEnum(value); }

       }

       public Builder SetOptionalImportEnum(global::Google.ProtocolBuffers.TestProtos.ImportEnum value) {

+        PrepareBuilder();

         result.hasOptionalImportEnum = true;

         result.optionalImportEnum_ = value;

         return this;

       }

       public Builder ClearOptionalImportEnum() {

+        PrepareBuilder();

         result.hasOptionalImportEnum = false;

         result.optionalImportEnum_ = global::Google.ProtocolBuffers.TestProtos.ImportEnum.IMPORT_FOO;

         return this;

@@ -4386,11 +4556,13 @@
       }

       public Builder SetOptionalStringPiece(string value) {

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

+        PrepareBuilder();

         result.hasOptionalStringPiece = true;

         result.optionalStringPiece_ = value;

         return this;

       }

       public Builder ClearOptionalStringPiece() {

+        PrepareBuilder();

         result.hasOptionalStringPiece = false;

         result.optionalStringPiece_ = "";

         return this;

@@ -4405,18 +4577,20 @@
       }

       public Builder SetOptionalCord(string value) {

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

+        PrepareBuilder();

         result.hasOptionalCord = true;

         result.optionalCord_ = value;

         return this;

       }

       public Builder ClearOptionalCord() {

+        PrepareBuilder();

         result.hasOptionalCord = false;

         result.optionalCord_ = "";

         return this;

       }

       

       public pbc::IPopsicleList<int> RepeatedInt32List {

-        get { return result.repeatedInt32_; }

+        get { return PrepareBuilder().repeatedInt32_; }

       }

       public int RepeatedInt32Count {

         get { return result.RepeatedInt32Count; }

@@ -4425,24 +4599,28 @@
         return result.GetRepeatedInt32(index);

       }

       public Builder SetRepeatedInt32(int index, int value) {

+        PrepareBuilder();

         result.repeatedInt32_[index] = value;

         return this;

       }

       public Builder AddRepeatedInt32(int value) {

+        PrepareBuilder();

         result.repeatedInt32_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedInt32(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedInt32_);

         return this;

       }

       public Builder ClearRepeatedInt32() {

+        PrepareBuilder();

         result.repeatedInt32_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<long> RepeatedInt64List {

-        get { return result.repeatedInt64_; }

+        get { return PrepareBuilder().repeatedInt64_; }

       }

       public int RepeatedInt64Count {

         get { return result.RepeatedInt64Count; }

@@ -4451,25 +4629,29 @@
         return result.GetRepeatedInt64(index);

       }

       public Builder SetRepeatedInt64(int index, long value) {

+        PrepareBuilder();

         result.repeatedInt64_[index] = value;

         return this;

       }

       public Builder AddRepeatedInt64(long value) {

+        PrepareBuilder();

         result.repeatedInt64_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedInt64(scg::IEnumerable<long> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedInt64_);

         return this;

       }

       public Builder ClearRepeatedInt64() {

+        PrepareBuilder();

         result.repeatedInt64_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<uint> RepeatedUint32List {

-        get { return result.repeatedUint32_; }

+        get { return PrepareBuilder().repeatedUint32_; }

       }

       public int RepeatedUint32Count {

         get { return result.RepeatedUint32Count; }

@@ -4480,27 +4662,31 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetRepeatedUint32(int index, uint value) {

+        PrepareBuilder();

         result.repeatedUint32_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRepeatedUint32(uint value) {

+        PrepareBuilder();

         result.repeatedUint32_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangeRepeatedUint32(scg::IEnumerable<uint> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedUint32_);

         return this;

       }

       public Builder ClearRepeatedUint32() {

+        PrepareBuilder();

         result.repeatedUint32_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<ulong> RepeatedUint64List {

-        get { return result.repeatedUint64_; }

+        get { return PrepareBuilder().repeatedUint64_; }

       }

       public int RepeatedUint64Count {

         get { return result.RepeatedUint64Count; }

@@ -4511,26 +4697,30 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetRepeatedUint64(int index, ulong value) {

+        PrepareBuilder();

         result.repeatedUint64_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRepeatedUint64(ulong value) {

+        PrepareBuilder();

         result.repeatedUint64_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangeRepeatedUint64(scg::IEnumerable<ulong> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedUint64_);

         return this;

       }

       public Builder ClearRepeatedUint64() {

+        PrepareBuilder();

         result.repeatedUint64_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<int> RepeatedSint32List {

-        get { return result.repeatedSint32_; }

+        get { return PrepareBuilder().repeatedSint32_; }

       }

       public int RepeatedSint32Count {

         get { return result.RepeatedSint32Count; }

@@ -4539,24 +4729,28 @@
         return result.GetRepeatedSint32(index);

       }

       public Builder SetRepeatedSint32(int index, int value) {

+        PrepareBuilder();

         result.repeatedSint32_[index] = value;

         return this;

       }

       public Builder AddRepeatedSint32(int value) {

+        PrepareBuilder();

         result.repeatedSint32_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedSint32(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedSint32_);

         return this;

       }

       public Builder ClearRepeatedSint32() {

+        PrepareBuilder();

         result.repeatedSint32_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<long> RepeatedSint64List {

-        get { return result.repeatedSint64_; }

+        get { return PrepareBuilder().repeatedSint64_; }

       }

       public int RepeatedSint64Count {

         get { return result.RepeatedSint64Count; }

@@ -4565,25 +4759,29 @@
         return result.GetRepeatedSint64(index);

       }

       public Builder SetRepeatedSint64(int index, long value) {

+        PrepareBuilder();

         result.repeatedSint64_[index] = value;

         return this;

       }

       public Builder AddRepeatedSint64(long value) {

+        PrepareBuilder();

         result.repeatedSint64_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedSint64(scg::IEnumerable<long> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedSint64_);

         return this;

       }

       public Builder ClearRepeatedSint64() {

+        PrepareBuilder();

         result.repeatedSint64_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<uint> RepeatedFixed32List {

-        get { return result.repeatedFixed32_; }

+        get { return PrepareBuilder().repeatedFixed32_; }

       }

       public int RepeatedFixed32Count {

         get { return result.RepeatedFixed32Count; }

@@ -4594,27 +4792,31 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetRepeatedFixed32(int index, uint value) {

+        PrepareBuilder();

         result.repeatedFixed32_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRepeatedFixed32(uint value) {

+        PrepareBuilder();

         result.repeatedFixed32_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangeRepeatedFixed32(scg::IEnumerable<uint> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedFixed32_);

         return this;

       }

       public Builder ClearRepeatedFixed32() {

+        PrepareBuilder();

         result.repeatedFixed32_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<ulong> RepeatedFixed64List {

-        get { return result.repeatedFixed64_; }

+        get { return PrepareBuilder().repeatedFixed64_; }

       }

       public int RepeatedFixed64Count {

         get { return result.RepeatedFixed64Count; }

@@ -4625,26 +4827,30 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetRepeatedFixed64(int index, ulong value) {

+        PrepareBuilder();

         result.repeatedFixed64_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRepeatedFixed64(ulong value) {

+        PrepareBuilder();

         result.repeatedFixed64_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangeRepeatedFixed64(scg::IEnumerable<ulong> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedFixed64_);

         return this;

       }

       public Builder ClearRepeatedFixed64() {

+        PrepareBuilder();

         result.repeatedFixed64_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<int> RepeatedSfixed32List {

-        get { return result.repeatedSfixed32_; }

+        get { return PrepareBuilder().repeatedSfixed32_; }

       }

       public int RepeatedSfixed32Count {

         get { return result.RepeatedSfixed32Count; }

@@ -4653,24 +4859,28 @@
         return result.GetRepeatedSfixed32(index);

       }

       public Builder SetRepeatedSfixed32(int index, int value) {

+        PrepareBuilder();

         result.repeatedSfixed32_[index] = value;

         return this;

       }

       public Builder AddRepeatedSfixed32(int value) {

+        PrepareBuilder();

         result.repeatedSfixed32_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedSfixed32(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedSfixed32_);

         return this;

       }

       public Builder ClearRepeatedSfixed32() {

+        PrepareBuilder();

         result.repeatedSfixed32_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<long> RepeatedSfixed64List {

-        get { return result.repeatedSfixed64_; }

+        get { return PrepareBuilder().repeatedSfixed64_; }

       }

       public int RepeatedSfixed64Count {

         get { return result.RepeatedSfixed64Count; }

@@ -4679,24 +4889,28 @@
         return result.GetRepeatedSfixed64(index);

       }

       public Builder SetRepeatedSfixed64(int index, long value) {

+        PrepareBuilder();

         result.repeatedSfixed64_[index] = value;

         return this;

       }

       public Builder AddRepeatedSfixed64(long value) {

+        PrepareBuilder();

         result.repeatedSfixed64_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedSfixed64(scg::IEnumerable<long> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedSfixed64_);

         return this;

       }

       public Builder ClearRepeatedSfixed64() {

+        PrepareBuilder();

         result.repeatedSfixed64_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<float> RepeatedFloatList {

-        get { return result.repeatedFloat_; }

+        get { return PrepareBuilder().repeatedFloat_; }

       }

       public int RepeatedFloatCount {

         get { return result.RepeatedFloatCount; }

@@ -4705,24 +4919,28 @@
         return result.GetRepeatedFloat(index);

       }

       public Builder SetRepeatedFloat(int index, float value) {

+        PrepareBuilder();

         result.repeatedFloat_[index] = value;

         return this;

       }

       public Builder AddRepeatedFloat(float value) {

+        PrepareBuilder();

         result.repeatedFloat_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedFloat(scg::IEnumerable<float> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedFloat_);

         return this;

       }

       public Builder ClearRepeatedFloat() {

+        PrepareBuilder();

         result.repeatedFloat_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<double> RepeatedDoubleList {

-        get { return result.repeatedDouble_; }

+        get { return PrepareBuilder().repeatedDouble_; }

       }

       public int RepeatedDoubleCount {

         get { return result.RepeatedDoubleCount; }

@@ -4731,24 +4949,28 @@
         return result.GetRepeatedDouble(index);

       }

       public Builder SetRepeatedDouble(int index, double value) {

+        PrepareBuilder();

         result.repeatedDouble_[index] = value;

         return this;

       }

       public Builder AddRepeatedDouble(double value) {

+        PrepareBuilder();

         result.repeatedDouble_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedDouble(scg::IEnumerable<double> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedDouble_);

         return this;

       }

       public Builder ClearRepeatedDouble() {

+        PrepareBuilder();

         result.repeatedDouble_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<bool> RepeatedBoolList {

-        get { return result.repeatedBool_; }

+        get { return PrepareBuilder().repeatedBool_; }

       }

       public int RepeatedBoolCount {

         get { return result.RepeatedBoolCount; }

@@ -4757,24 +4979,28 @@
         return result.GetRepeatedBool(index);

       }

       public Builder SetRepeatedBool(int index, bool value) {

+        PrepareBuilder();

         result.repeatedBool_[index] = value;

         return this;

       }

       public Builder AddRepeatedBool(bool value) {

+        PrepareBuilder();

         result.repeatedBool_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedBool(scg::IEnumerable<bool> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedBool_);

         return this;

       }

       public Builder ClearRepeatedBool() {

+        PrepareBuilder();

         result.repeatedBool_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<string> RepeatedStringList {

-        get { return result.repeatedString_; }

+        get { return PrepareBuilder().repeatedString_; }

       }

       public int RepeatedStringCount {

         get { return result.RepeatedStringCount; }

@@ -4784,25 +5010,29 @@
       }

       public Builder SetRepeatedString(int index, string value) {

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

+        PrepareBuilder();

         result.repeatedString_[index] = value;

         return this;

       }

       public Builder AddRepeatedString(string value) {

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

+        PrepareBuilder();

         result.repeatedString_.Add(value);

         return this;

       }

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

+        PrepareBuilder();

         base.AddRange(values, result.repeatedString_);

         return this;

       }

       public Builder ClearRepeatedString() {

+        PrepareBuilder();

         result.repeatedString_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<pb::ByteString> RepeatedBytesList {

-        get { return result.repeatedBytes_; }

+        get { return PrepareBuilder().repeatedBytes_; }

       }

       public int RepeatedBytesCount {

         get { return result.RepeatedBytesCount; }

@@ -4812,25 +5042,29 @@
       }

       public Builder SetRepeatedBytes(int index, pb::ByteString value) {

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

+        PrepareBuilder();

         result.repeatedBytes_[index] = value;

         return this;

       }

       public Builder AddRepeatedBytes(pb::ByteString value) {

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

+        PrepareBuilder();

         result.repeatedBytes_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedBytes(scg::IEnumerable<pb::ByteString> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedBytes_);

         return this;

       }

       public Builder ClearRepeatedBytes() {

+        PrepareBuilder();

         result.repeatedBytes_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup> RepeatedGroupList {

-        get { return result.repeatedGroup_; }

+        get { return PrepareBuilder().repeatedGroup_; }

       }

       public int RepeatedGroupCount {

         get { return result.RepeatedGroupCount; }

@@ -4840,35 +5074,41 @@
       }

       public Builder SetRepeatedGroup(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup value) {

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

+        PrepareBuilder();

         result.repeatedGroup_[index] = value;

         return this;

       }

       public Builder SetRepeatedGroup(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder builderForValue) {

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

+        PrepareBuilder();

         result.repeatedGroup_[index] = builderForValue.Build();

         return this;

       }

       public Builder AddRepeatedGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup value) {

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

+        PrepareBuilder();

         result.repeatedGroup_.Add(value);

         return this;

       }

       public Builder AddRepeatedGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder builderForValue) {

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

+        PrepareBuilder();

         result.repeatedGroup_.Add(builderForValue.Build());

         return this;

       }

       public Builder AddRangeRepeatedGroup(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedGroup_);

         return this;

       }

       public Builder ClearRepeatedGroup() {

+        PrepareBuilder();

         result.repeatedGroup_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> RepeatedNestedMessageList {

-        get { return result.repeatedNestedMessage_; }

+        get { return PrepareBuilder().repeatedNestedMessage_; }

       }

       public int RepeatedNestedMessageCount {

         get { return result.RepeatedNestedMessageCount; }

@@ -4878,35 +5118,41 @@
       }

       public Builder SetRepeatedNestedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {

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

+        PrepareBuilder();

         result.repeatedNestedMessage_[index] = value;

         return this;

       }

       public Builder SetRepeatedNestedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.repeatedNestedMessage_[index] = builderForValue.Build();

         return this;

       }

       public Builder AddRepeatedNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {

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

+        PrepareBuilder();

         result.repeatedNestedMessage_.Add(value);

         return this;

       }

       public Builder AddRepeatedNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.repeatedNestedMessage_.Add(builderForValue.Build());

         return this;

       }

       public Builder AddRangeRepeatedNestedMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedNestedMessage_);

         return this;

       }

       public Builder ClearRepeatedNestedMessage() {

+        PrepareBuilder();

         result.repeatedNestedMessage_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> RepeatedForeignMessageList {

-        get { return result.repeatedForeignMessage_; }

+        get { return PrepareBuilder().repeatedForeignMessage_; }

       }

       public int RepeatedForeignMessageCount {

         get { return result.RepeatedForeignMessageCount; }

@@ -4916,35 +5162,41 @@
       }

       public Builder SetRepeatedForeignMessage(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {

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

+        PrepareBuilder();

         result.repeatedForeignMessage_[index] = value;

         return this;

       }

       public Builder SetRepeatedForeignMessage(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.repeatedForeignMessage_[index] = builderForValue.Build();

         return this;

       }

       public Builder AddRepeatedForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {

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

+        PrepareBuilder();

         result.repeatedForeignMessage_.Add(value);

         return this;

       }

       public Builder AddRepeatedForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.repeatedForeignMessage_.Add(builderForValue.Build());

         return this;

       }

       public Builder AddRangeRepeatedForeignMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedForeignMessage_);

         return this;

       }

       public Builder ClearRepeatedForeignMessage() {

+        PrepareBuilder();

         result.repeatedForeignMessage_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportMessage> RepeatedImportMessageList {

-        get { return result.repeatedImportMessage_; }

+        get { return PrepareBuilder().repeatedImportMessage_; }

       }

       public int RepeatedImportMessageCount {

         get { return result.RepeatedImportMessageCount; }

@@ -4954,35 +5206,41 @@
       }

       public Builder SetRepeatedImportMessage(int index, global::Google.ProtocolBuffers.TestProtos.ImportMessage value) {

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

+        PrepareBuilder();

         result.repeatedImportMessage_[index] = value;

         return this;

       }

       public Builder SetRepeatedImportMessage(int index, global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.repeatedImportMessage_[index] = builderForValue.Build();

         return this;

       }

       public Builder AddRepeatedImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage value) {

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

+        PrepareBuilder();

         result.repeatedImportMessage_.Add(value);

         return this;

       }

       public Builder AddRepeatedImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.repeatedImportMessage_.Add(builderForValue.Build());

         return this;

       }

       public Builder AddRangeRepeatedImportMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ImportMessage> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedImportMessage_);

         return this;

       }

       public Builder ClearRepeatedImportMessage() {

+        PrepareBuilder();

         result.repeatedImportMessage_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> RepeatedNestedEnumList {

-        get { return result.repeatedNestedEnum_; }

+        get { return PrepareBuilder().repeatedNestedEnum_; }

       }

       public int RepeatedNestedEnumCount {

         get { return result.RepeatedNestedEnumCount; }

@@ -4991,24 +5249,28 @@
         return result.GetRepeatedNestedEnum(index);

       }

       public Builder SetRepeatedNestedEnum(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum value) {

+        PrepareBuilder();

         result.repeatedNestedEnum_[index] = value;

         return this;

       }

       public Builder AddRepeatedNestedEnum(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum value) {

+        PrepareBuilder();

         result.repeatedNestedEnum_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedNestedEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedNestedEnum_);

         return this;

       }

       public Builder ClearRepeatedNestedEnum() {

+        PrepareBuilder();

         result.repeatedNestedEnum_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> RepeatedForeignEnumList {

-        get { return result.repeatedForeignEnum_; }

+        get { return PrepareBuilder().repeatedForeignEnum_; }

       }

       public int RepeatedForeignEnumCount {

         get { return result.RepeatedForeignEnumCount; }

@@ -5017,24 +5279,28 @@
         return result.GetRepeatedForeignEnum(index);

       }

       public Builder SetRepeatedForeignEnum(int index, global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {

+        PrepareBuilder();

         result.repeatedForeignEnum_[index] = value;

         return this;

       }

       public Builder AddRepeatedForeignEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {

+        PrepareBuilder();

         result.repeatedForeignEnum_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedForeignEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedForeignEnum_);

         return this;

       }

       public Builder ClearRepeatedForeignEnum() {

+        PrepareBuilder();

         result.repeatedForeignEnum_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportEnum> RepeatedImportEnumList {

-        get { return result.repeatedImportEnum_; }

+        get { return PrepareBuilder().repeatedImportEnum_; }

       }

       public int RepeatedImportEnumCount {

         get { return result.RepeatedImportEnumCount; }

@@ -5043,24 +5309,28 @@
         return result.GetRepeatedImportEnum(index);

       }

       public Builder SetRepeatedImportEnum(int index, global::Google.ProtocolBuffers.TestProtos.ImportEnum value) {

+        PrepareBuilder();

         result.repeatedImportEnum_[index] = value;

         return this;

       }

       public Builder AddRepeatedImportEnum(global::Google.ProtocolBuffers.TestProtos.ImportEnum value) {

+        PrepareBuilder();

         result.repeatedImportEnum_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedImportEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ImportEnum> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedImportEnum_);

         return this;

       }

       public Builder ClearRepeatedImportEnum() {

+        PrepareBuilder();

         result.repeatedImportEnum_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<string> RepeatedStringPieceList {

-        get { return result.repeatedStringPiece_; }

+        get { return PrepareBuilder().repeatedStringPiece_; }

       }

       public int RepeatedStringPieceCount {

         get { return result.RepeatedStringPieceCount; }

@@ -5070,25 +5340,29 @@
       }

       public Builder SetRepeatedStringPiece(int index, string value) {

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

+        PrepareBuilder();

         result.repeatedStringPiece_[index] = value;

         return this;

       }

       public Builder AddRepeatedStringPiece(string value) {

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

+        PrepareBuilder();

         result.repeatedStringPiece_.Add(value);

         return this;

       }

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

+        PrepareBuilder();

         base.AddRange(values, result.repeatedStringPiece_);

         return this;

       }

       public Builder ClearRepeatedStringPiece() {

+        PrepareBuilder();

         result.repeatedStringPiece_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<string> RepeatedCordList {

-        get { return result.repeatedCord_; }

+        get { return PrepareBuilder().repeatedCord_; }

       }

       public int RepeatedCordCount {

         get { return result.RepeatedCordCount; }

@@ -5098,19 +5372,23 @@
       }

       public Builder SetRepeatedCord(int index, string value) {

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

+        PrepareBuilder();

         result.repeatedCord_[index] = value;

         return this;

       }

       public Builder AddRepeatedCord(string value) {

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

+        PrepareBuilder();

         result.repeatedCord_.Add(value);

         return this;

       }

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

+        PrepareBuilder();

         base.AddRange(values, result.repeatedCord_);

         return this;

       }

       public Builder ClearRepeatedCord() {

+        PrepareBuilder();

         result.repeatedCord_.Clear();

         return this;

       }

@@ -5123,11 +5401,13 @@
         set { SetDefaultInt32(value); }

       }

       public Builder SetDefaultInt32(int value) {

+        PrepareBuilder();

         result.hasDefaultInt32 = true;

         result.defaultInt32_ = value;

         return this;

       }

       public Builder ClearDefaultInt32() {

+        PrepareBuilder();

         result.hasDefaultInt32 = false;

         result.defaultInt32_ = 41;

         return this;

@@ -5141,11 +5421,13 @@
         set { SetDefaultInt64(value); }

       }

       public Builder SetDefaultInt64(long value) {

+        PrepareBuilder();

         result.hasDefaultInt64 = true;

         result.defaultInt64_ = value;

         return this;

       }

       public Builder ClearDefaultInt64() {

+        PrepareBuilder();

         result.hasDefaultInt64 = false;

         result.defaultInt64_ = 42L;

         return this;

@@ -5161,11 +5443,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetDefaultUint32(uint value) {

+        PrepareBuilder();

         result.hasDefaultUint32 = true;

         result.defaultUint32_ = value;

         return this;

       }

       public Builder ClearDefaultUint32() {

+        PrepareBuilder();

         result.hasDefaultUint32 = false;

         result.defaultUint32_ = 43;

         return this;

@@ -5181,11 +5465,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetDefaultUint64(ulong value) {

+        PrepareBuilder();

         result.hasDefaultUint64 = true;

         result.defaultUint64_ = value;

         return this;

       }

       public Builder ClearDefaultUint64() {

+        PrepareBuilder();

         result.hasDefaultUint64 = false;

         result.defaultUint64_ = 44UL;

         return this;

@@ -5199,11 +5485,13 @@
         set { SetDefaultSint32(value); }

       }

       public Builder SetDefaultSint32(int value) {

+        PrepareBuilder();

         result.hasDefaultSint32 = true;

         result.defaultSint32_ = value;

         return this;

       }

       public Builder ClearDefaultSint32() {

+        PrepareBuilder();

         result.hasDefaultSint32 = false;

         result.defaultSint32_ = -45;

         return this;

@@ -5217,11 +5505,13 @@
         set { SetDefaultSint64(value); }

       }

       public Builder SetDefaultSint64(long value) {

+        PrepareBuilder();

         result.hasDefaultSint64 = true;

         result.defaultSint64_ = value;

         return this;

       }

       public Builder ClearDefaultSint64() {

+        PrepareBuilder();

         result.hasDefaultSint64 = false;

         result.defaultSint64_ = 46;

         return this;

@@ -5237,11 +5527,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetDefaultFixed32(uint value) {

+        PrepareBuilder();

         result.hasDefaultFixed32 = true;

         result.defaultFixed32_ = value;

         return this;

       }

       public Builder ClearDefaultFixed32() {

+        PrepareBuilder();

         result.hasDefaultFixed32 = false;

         result.defaultFixed32_ = 47;

         return this;

@@ -5257,11 +5549,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetDefaultFixed64(ulong value) {

+        PrepareBuilder();

         result.hasDefaultFixed64 = true;

         result.defaultFixed64_ = value;

         return this;

       }

       public Builder ClearDefaultFixed64() {

+        PrepareBuilder();

         result.hasDefaultFixed64 = false;

         result.defaultFixed64_ = 48;

         return this;

@@ -5275,11 +5569,13 @@
         set { SetDefaultSfixed32(value); }

       }

       public Builder SetDefaultSfixed32(int value) {

+        PrepareBuilder();

         result.hasDefaultSfixed32 = true;

         result.defaultSfixed32_ = value;

         return this;

       }

       public Builder ClearDefaultSfixed32() {

+        PrepareBuilder();

         result.hasDefaultSfixed32 = false;

         result.defaultSfixed32_ = 49;

         return this;

@@ -5293,11 +5589,13 @@
         set { SetDefaultSfixed64(value); }

       }

       public Builder SetDefaultSfixed64(long value) {

+        PrepareBuilder();

         result.hasDefaultSfixed64 = true;

         result.defaultSfixed64_ = value;

         return this;

       }

       public Builder ClearDefaultSfixed64() {

+        PrepareBuilder();

         result.hasDefaultSfixed64 = false;

         result.defaultSfixed64_ = -50;

         return this;

@@ -5311,11 +5609,13 @@
         set { SetDefaultFloat(value); }

       }

       public Builder SetDefaultFloat(float value) {

+        PrepareBuilder();

         result.hasDefaultFloat = true;

         result.defaultFloat_ = value;

         return this;

       }

       public Builder ClearDefaultFloat() {

+        PrepareBuilder();

         result.hasDefaultFloat = false;

         result.defaultFloat_ = 51.5F;

         return this;

@@ -5329,11 +5629,13 @@
         set { SetDefaultDouble(value); }

       }

       public Builder SetDefaultDouble(double value) {

+        PrepareBuilder();

         result.hasDefaultDouble = true;

         result.defaultDouble_ = value;

         return this;

       }

       public Builder ClearDefaultDouble() {

+        PrepareBuilder();

         result.hasDefaultDouble = false;

         result.defaultDouble_ = 52000D;

         return this;

@@ -5347,11 +5649,13 @@
         set { SetDefaultBool(value); }

       }

       public Builder SetDefaultBool(bool value) {

+        PrepareBuilder();

         result.hasDefaultBool = true;

         result.defaultBool_ = value;

         return this;

       }

       public Builder ClearDefaultBool() {

+        PrepareBuilder();

         result.hasDefaultBool = false;

         result.defaultBool_ = true;

         return this;

@@ -5366,11 +5670,13 @@
       }

       public Builder SetDefaultString(string value) {

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

+        PrepareBuilder();

         result.hasDefaultString = true;

         result.defaultString_ = value;

         return this;

       }

       public Builder ClearDefaultString() {

+        PrepareBuilder();

         result.hasDefaultString = false;

         result.defaultString_ = "hello";

         return this;

@@ -5385,11 +5691,13 @@
       }

       public Builder SetDefaultBytes(pb::ByteString value) {

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

+        PrepareBuilder();

         result.hasDefaultBytes = true;

         result.defaultBytes_ = value;

         return this;

       }

       public Builder ClearDefaultBytes() {

+        PrepareBuilder();

         result.hasDefaultBytes = false;

         result.defaultBytes_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Descriptor.Fields[62].DefaultValue;

         return this;

@@ -5403,11 +5711,13 @@
         set { SetDefaultNestedEnum(value); }

       }

       public Builder SetDefaultNestedEnum(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum value) {

+        PrepareBuilder();

         result.hasDefaultNestedEnum = true;

         result.defaultNestedEnum_ = value;

         return this;

       }

       public Builder ClearDefaultNestedEnum() {

+        PrepareBuilder();

         result.hasDefaultNestedEnum = false;

         result.defaultNestedEnum_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum.BAR;

         return this;

@@ -5421,11 +5731,13 @@
         set { SetDefaultForeignEnum(value); }

       }

       public Builder SetDefaultForeignEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {

+        PrepareBuilder();

         result.hasDefaultForeignEnum = true;

         result.defaultForeignEnum_ = value;

         return this;

       }

       public Builder ClearDefaultForeignEnum() {

+        PrepareBuilder();

         result.hasDefaultForeignEnum = false;

         result.defaultForeignEnum_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_BAR;

         return this;

@@ -5439,11 +5751,13 @@
         set { SetDefaultImportEnum(value); }

       }

       public Builder SetDefaultImportEnum(global::Google.ProtocolBuffers.TestProtos.ImportEnum value) {

+        PrepareBuilder();

         result.hasDefaultImportEnum = true;

         result.defaultImportEnum_ = value;

         return this;

       }

       public Builder ClearDefaultImportEnum() {

+        PrepareBuilder();

         result.hasDefaultImportEnum = false;

         result.defaultImportEnum_ = global::Google.ProtocolBuffers.TestProtos.ImportEnum.IMPORT_BAR;

         return this;

@@ -5458,11 +5772,13 @@
       }

       public Builder SetDefaultStringPiece(string value) {

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

+        PrepareBuilder();

         result.hasDefaultStringPiece = true;

         result.defaultStringPiece_ = value;

         return this;

       }

       public Builder ClearDefaultStringPiece() {

+        PrepareBuilder();

         result.hasDefaultStringPiece = false;

         result.defaultStringPiece_ = "abc";

         return this;

@@ -5477,11 +5793,13 @@
       }

       public Builder SetDefaultCord(string value) {

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

+        PrepareBuilder();

         result.hasDefaultCord = true;

         result.defaultCord_ = value;

         return this;

       }

       public Builder ClearDefaultCord() {

+        PrepareBuilder();

         result.hasDefaultCord = false;

         result.defaultCord_ = "123";

         return this;

@@ -5594,7 +5912,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestDeprecatedFields prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -5604,21 +5922,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestDeprecatedFields();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestDeprecatedFields cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestDeprecatedFields result = new TestDeprecatedFields();

+      bool builderIsReadOnly;

+      TestDeprecatedFields result;

+      

+      private TestDeprecatedFields PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestDeprecatedFields original = result;

+          result = new TestDeprecatedFields();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestDeprecatedFields MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestDeprecatedFields();

+        result = DefaultInstance ?? new TestDeprecatedFields();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -5630,12 +5975,11 @@
       }

       

       public override TestDeprecatedFields BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestDeprecatedFields returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -5649,6 +5993,7 @@
       

       public override Builder MergeFrom(TestDeprecatedFields other) {

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

+        PrepareBuilder();

         if (other.HasDeprecatedInt32) {

           DeprecatedInt32 = other.DeprecatedInt32;

         }

@@ -5661,6 +6006,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -5716,11 +6062,13 @@
         set { SetDeprecatedInt32(value); }

       }

       public Builder SetDeprecatedInt32(int value) {

+        PrepareBuilder();

         result.hasDeprecatedInt32 = true;

         result.deprecatedInt32_ = value;

         return this;

       }

       public Builder ClearDeprecatedInt32() {

+        PrepareBuilder();

         result.hasDeprecatedInt32 = false;

         result.deprecatedInt32_ = 0;

         return this;

@@ -5833,7 +6181,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(ForeignMessage prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -5843,21 +6191,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new ForeignMessage();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(ForeignMessage cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      ForeignMessage result = new ForeignMessage();

+      bool builderIsReadOnly;

+      ForeignMessage result;

+      

+      private ForeignMessage PrepareBuilder() {

+        if (builderIsReadOnly) {

+          ForeignMessage original = result;

+          result = new ForeignMessage();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override ForeignMessage MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new ForeignMessage();

+        result = DefaultInstance ?? new ForeignMessage();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -5869,12 +6244,11 @@
       }

       

       public override ForeignMessage BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        ForeignMessage returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -5888,6 +6262,7 @@
       

       public override Builder MergeFrom(ForeignMessage other) {

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

+        PrepareBuilder();

         if (other.HasC) {

           C = other.C;

         }

@@ -5900,6 +6275,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -5955,11 +6331,13 @@
         set { SetC(value); }

       }

       public Builder SetC(int value) {

+        PrepareBuilder();

         result.hasC = true;

         result.c_ = value;

         return this;

       }

       public Builder ClearC() {

+        PrepareBuilder();

         result.hasC = false;

         result.c_ = 0;

         return this;

@@ -6060,7 +6438,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestAllExtensions prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -6070,21 +6448,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestAllExtensions();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestAllExtensions cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestAllExtensions result = new TestAllExtensions();

+      bool builderIsReadOnly;

+      TestAllExtensions result;

+      

+      private TestAllExtensions PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestAllExtensions original = result;

+          result = new TestAllExtensions();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestAllExtensions MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestAllExtensions();

+        result = DefaultInstance ?? new TestAllExtensions();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -6096,12 +6501,11 @@
       }

       

       public override TestAllExtensions BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestAllExtensions returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -6115,6 +6519,7 @@
       

       public override Builder MergeFrom(TestAllExtensions other) {

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

+        PrepareBuilder();

           this.MergeExtensionFields(other);

         this.MergeUnknownFields(other.UnknownFields);

         return this;

@@ -6125,6 +6530,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -6275,7 +6681,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(OptionalGroup_extension prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -6285,21 +6691,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new OptionalGroup_extension();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(OptionalGroup_extension cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      OptionalGroup_extension result = new OptionalGroup_extension();

+      bool builderIsReadOnly;

+      OptionalGroup_extension result;

+      

+      private OptionalGroup_extension PrepareBuilder() {

+        if (builderIsReadOnly) {

+          OptionalGroup_extension original = result;

+          result = new OptionalGroup_extension();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override OptionalGroup_extension MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new OptionalGroup_extension();

+        result = DefaultInstance ?? new OptionalGroup_extension();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -6311,12 +6744,11 @@
       }

       

       public override OptionalGroup_extension BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        OptionalGroup_extension returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -6330,6 +6762,7 @@
       

       public override Builder MergeFrom(OptionalGroup_extension other) {

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

+        PrepareBuilder();

         if (other.HasA) {

           A = other.A;

         }

@@ -6342,6 +6775,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -6397,11 +6831,13 @@
         set { SetA(value); }

       }

       public Builder SetA(int value) {

+        PrepareBuilder();

         result.hasA = true;

         result.a_ = value;

         return this;

       }

       public Builder ClearA() {

+        PrepareBuilder();

         result.hasA = false;

         result.a_ = 0;

         return this;

@@ -6514,7 +6950,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(RepeatedGroup_extension prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -6524,21 +6960,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new RepeatedGroup_extension();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(RepeatedGroup_extension cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      RepeatedGroup_extension result = new RepeatedGroup_extension();

+      bool builderIsReadOnly;

+      RepeatedGroup_extension result;

+      

+      private RepeatedGroup_extension PrepareBuilder() {

+        if (builderIsReadOnly) {

+          RepeatedGroup_extension original = result;

+          result = new RepeatedGroup_extension();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override RepeatedGroup_extension MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new RepeatedGroup_extension();

+        result = DefaultInstance ?? new RepeatedGroup_extension();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -6550,12 +7013,11 @@
       }

       

       public override RepeatedGroup_extension BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        RepeatedGroup_extension returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -6569,6 +7031,7 @@
       

       public override Builder MergeFrom(RepeatedGroup_extension other) {

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

+        PrepareBuilder();

         if (other.HasA) {

           A = other.A;

         }

@@ -6581,6 +7044,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -6636,11 +7100,13 @@
         set { SetA(value); }

       }

       public Builder SetA(int value) {

+        PrepareBuilder();

         result.hasA = true;

         result.a_ = value;

         return this;

       }

       public Builder ClearA() {

+        PrepareBuilder();

         result.hasA = false;

         result.a_ = 0;

         return this;

@@ -6739,7 +7205,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestNestedExtension prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -6749,21 +7215,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestNestedExtension();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestNestedExtension cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestNestedExtension result = new TestNestedExtension();

+      bool builderIsReadOnly;

+      TestNestedExtension result;

+      

+      private TestNestedExtension PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestNestedExtension original = result;

+          result = new TestNestedExtension();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestNestedExtension MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestNestedExtension();

+        result = DefaultInstance ?? new TestNestedExtension();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -6775,12 +7268,11 @@
       }

       

       public override TestNestedExtension BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestNestedExtension returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -6794,6 +7286,7 @@
       

       public override Builder MergeFrom(TestNestedExtension other) {

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

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -6803,6 +7296,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -7472,7 +7966,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestRequired prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -7482,21 +7976,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestRequired();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestRequired cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestRequired result = new TestRequired();

+      bool builderIsReadOnly;

+      TestRequired result;

+      

+      private TestRequired PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestRequired original = result;

+          result = new TestRequired();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestRequired MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestRequired();

+        result = DefaultInstance ?? new TestRequired();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -7508,12 +8029,11 @@
       }

       

       public override TestRequired BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestRequired returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -7527,6 +8047,7 @@
       

       public override Builder MergeFrom(TestRequired other) {

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

+        PrepareBuilder();

         if (other.HasA) {

           A = other.A;

         }

@@ -7635,6 +8156,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -7818,11 +8340,13 @@
         set { SetA(value); }

       }

       public Builder SetA(int value) {

+        PrepareBuilder();

         result.hasA = true;

         result.a_ = value;

         return this;

       }

       public Builder ClearA() {

+        PrepareBuilder();

         result.hasA = false;

         result.a_ = 0;

         return this;

@@ -7836,11 +8360,13 @@
         set { SetDummy2(value); }

       }

       public Builder SetDummy2(int value) {

+        PrepareBuilder();

         result.hasDummy2 = true;

         result.dummy2_ = value;

         return this;

       }

       public Builder ClearDummy2() {

+        PrepareBuilder();

         result.hasDummy2 = false;

         result.dummy2_ = 0;

         return this;

@@ -7854,11 +8380,13 @@
         set { SetB(value); }

       }

       public Builder SetB(int value) {

+        PrepareBuilder();

         result.hasB = true;

         result.b_ = value;

         return this;

       }

       public Builder ClearB() {

+        PrepareBuilder();

         result.hasB = false;

         result.b_ = 0;

         return this;

@@ -7872,11 +8400,13 @@
         set { SetDummy4(value); }

       }

       public Builder SetDummy4(int value) {

+        PrepareBuilder();

         result.hasDummy4 = true;

         result.dummy4_ = value;

         return this;

       }

       public Builder ClearDummy4() {

+        PrepareBuilder();

         result.hasDummy4 = false;

         result.dummy4_ = 0;

         return this;

@@ -7890,11 +8420,13 @@
         set { SetDummy5(value); }

       }

       public Builder SetDummy5(int value) {

+        PrepareBuilder();

         result.hasDummy5 = true;

         result.dummy5_ = value;

         return this;

       }

       public Builder ClearDummy5() {

+        PrepareBuilder();

         result.hasDummy5 = false;

         result.dummy5_ = 0;

         return this;

@@ -7908,11 +8440,13 @@
         set { SetDummy6(value); }

       }

       public Builder SetDummy6(int value) {

+        PrepareBuilder();

         result.hasDummy6 = true;

         result.dummy6_ = value;

         return this;

       }

       public Builder ClearDummy6() {

+        PrepareBuilder();

         result.hasDummy6 = false;

         result.dummy6_ = 0;

         return this;

@@ -7926,11 +8460,13 @@
         set { SetDummy7(value); }

       }

       public Builder SetDummy7(int value) {

+        PrepareBuilder();

         result.hasDummy7 = true;

         result.dummy7_ = value;

         return this;

       }

       public Builder ClearDummy7() {

+        PrepareBuilder();

         result.hasDummy7 = false;

         result.dummy7_ = 0;

         return this;

@@ -7944,11 +8480,13 @@
         set { SetDummy8(value); }

       }

       public Builder SetDummy8(int value) {

+        PrepareBuilder();

         result.hasDummy8 = true;

         result.dummy8_ = value;

         return this;

       }

       public Builder ClearDummy8() {

+        PrepareBuilder();

         result.hasDummy8 = false;

         result.dummy8_ = 0;

         return this;

@@ -7962,11 +8500,13 @@
         set { SetDummy9(value); }

       }

       public Builder SetDummy9(int value) {

+        PrepareBuilder();

         result.hasDummy9 = true;

         result.dummy9_ = value;

         return this;

       }

       public Builder ClearDummy9() {

+        PrepareBuilder();

         result.hasDummy9 = false;

         result.dummy9_ = 0;

         return this;

@@ -7980,11 +8520,13 @@
         set { SetDummy10(value); }

       }

       public Builder SetDummy10(int value) {

+        PrepareBuilder();

         result.hasDummy10 = true;

         result.dummy10_ = value;

         return this;

       }

       public Builder ClearDummy10() {

+        PrepareBuilder();

         result.hasDummy10 = false;

         result.dummy10_ = 0;

         return this;

@@ -7998,11 +8540,13 @@
         set { SetDummy11(value); }

       }

       public Builder SetDummy11(int value) {

+        PrepareBuilder();

         result.hasDummy11 = true;

         result.dummy11_ = value;

         return this;

       }

       public Builder ClearDummy11() {

+        PrepareBuilder();

         result.hasDummy11 = false;

         result.dummy11_ = 0;

         return this;

@@ -8016,11 +8560,13 @@
         set { SetDummy12(value); }

       }

       public Builder SetDummy12(int value) {

+        PrepareBuilder();

         result.hasDummy12 = true;

         result.dummy12_ = value;

         return this;

       }

       public Builder ClearDummy12() {

+        PrepareBuilder();

         result.hasDummy12 = false;

         result.dummy12_ = 0;

         return this;

@@ -8034,11 +8580,13 @@
         set { SetDummy13(value); }

       }

       public Builder SetDummy13(int value) {

+        PrepareBuilder();

         result.hasDummy13 = true;

         result.dummy13_ = value;

         return this;

       }

       public Builder ClearDummy13() {

+        PrepareBuilder();

         result.hasDummy13 = false;

         result.dummy13_ = 0;

         return this;

@@ -8052,11 +8600,13 @@
         set { SetDummy14(value); }

       }

       public Builder SetDummy14(int value) {

+        PrepareBuilder();

         result.hasDummy14 = true;

         result.dummy14_ = value;

         return this;

       }

       public Builder ClearDummy14() {

+        PrepareBuilder();

         result.hasDummy14 = false;

         result.dummy14_ = 0;

         return this;

@@ -8070,11 +8620,13 @@
         set { SetDummy15(value); }

       }

       public Builder SetDummy15(int value) {

+        PrepareBuilder();

         result.hasDummy15 = true;

         result.dummy15_ = value;

         return this;

       }

       public Builder ClearDummy15() {

+        PrepareBuilder();

         result.hasDummy15 = false;

         result.dummy15_ = 0;

         return this;

@@ -8088,11 +8640,13 @@
         set { SetDummy16(value); }

       }

       public Builder SetDummy16(int value) {

+        PrepareBuilder();

         result.hasDummy16 = true;

         result.dummy16_ = value;

         return this;

       }

       public Builder ClearDummy16() {

+        PrepareBuilder();

         result.hasDummy16 = false;

         result.dummy16_ = 0;

         return this;

@@ -8106,11 +8660,13 @@
         set { SetDummy17(value); }

       }

       public Builder SetDummy17(int value) {

+        PrepareBuilder();

         result.hasDummy17 = true;

         result.dummy17_ = value;

         return this;

       }

       public Builder ClearDummy17() {

+        PrepareBuilder();

         result.hasDummy17 = false;

         result.dummy17_ = 0;

         return this;

@@ -8124,11 +8680,13 @@
         set { SetDummy18(value); }

       }

       public Builder SetDummy18(int value) {

+        PrepareBuilder();

         result.hasDummy18 = true;

         result.dummy18_ = value;

         return this;

       }

       public Builder ClearDummy18() {

+        PrepareBuilder();

         result.hasDummy18 = false;

         result.dummy18_ = 0;

         return this;

@@ -8142,11 +8700,13 @@
         set { SetDummy19(value); }

       }

       public Builder SetDummy19(int value) {

+        PrepareBuilder();

         result.hasDummy19 = true;

         result.dummy19_ = value;

         return this;

       }

       public Builder ClearDummy19() {

+        PrepareBuilder();

         result.hasDummy19 = false;

         result.dummy19_ = 0;

         return this;

@@ -8160,11 +8720,13 @@
         set { SetDummy20(value); }

       }

       public Builder SetDummy20(int value) {

+        PrepareBuilder();

         result.hasDummy20 = true;

         result.dummy20_ = value;

         return this;

       }

       public Builder ClearDummy20() {

+        PrepareBuilder();

         result.hasDummy20 = false;

         result.dummy20_ = 0;

         return this;

@@ -8178,11 +8740,13 @@
         set { SetDummy21(value); }

       }

       public Builder SetDummy21(int value) {

+        PrepareBuilder();

         result.hasDummy21 = true;

         result.dummy21_ = value;

         return this;

       }

       public Builder ClearDummy21() {

+        PrepareBuilder();

         result.hasDummy21 = false;

         result.dummy21_ = 0;

         return this;

@@ -8196,11 +8760,13 @@
         set { SetDummy22(value); }

       }

       public Builder SetDummy22(int value) {

+        PrepareBuilder();

         result.hasDummy22 = true;

         result.dummy22_ = value;

         return this;

       }

       public Builder ClearDummy22() {

+        PrepareBuilder();

         result.hasDummy22 = false;

         result.dummy22_ = 0;

         return this;

@@ -8214,11 +8780,13 @@
         set { SetDummy23(value); }

       }

       public Builder SetDummy23(int value) {

+        PrepareBuilder();

         result.hasDummy23 = true;

         result.dummy23_ = value;

         return this;

       }

       public Builder ClearDummy23() {

+        PrepareBuilder();

         result.hasDummy23 = false;

         result.dummy23_ = 0;

         return this;

@@ -8232,11 +8800,13 @@
         set { SetDummy24(value); }

       }

       public Builder SetDummy24(int value) {

+        PrepareBuilder();

         result.hasDummy24 = true;

         result.dummy24_ = value;

         return this;

       }

       public Builder ClearDummy24() {

+        PrepareBuilder();

         result.hasDummy24 = false;

         result.dummy24_ = 0;

         return this;

@@ -8250,11 +8820,13 @@
         set { SetDummy25(value); }

       }

       public Builder SetDummy25(int value) {

+        PrepareBuilder();

         result.hasDummy25 = true;

         result.dummy25_ = value;

         return this;

       }

       public Builder ClearDummy25() {

+        PrepareBuilder();

         result.hasDummy25 = false;

         result.dummy25_ = 0;

         return this;

@@ -8268,11 +8840,13 @@
         set { SetDummy26(value); }

       }

       public Builder SetDummy26(int value) {

+        PrepareBuilder();

         result.hasDummy26 = true;

         result.dummy26_ = value;

         return this;

       }

       public Builder ClearDummy26() {

+        PrepareBuilder();

         result.hasDummy26 = false;

         result.dummy26_ = 0;

         return this;

@@ -8286,11 +8860,13 @@
         set { SetDummy27(value); }

       }

       public Builder SetDummy27(int value) {

+        PrepareBuilder();

         result.hasDummy27 = true;

         result.dummy27_ = value;

         return this;

       }

       public Builder ClearDummy27() {

+        PrepareBuilder();

         result.hasDummy27 = false;

         result.dummy27_ = 0;

         return this;

@@ -8304,11 +8880,13 @@
         set { SetDummy28(value); }

       }

       public Builder SetDummy28(int value) {

+        PrepareBuilder();

         result.hasDummy28 = true;

         result.dummy28_ = value;

         return this;

       }

       public Builder ClearDummy28() {

+        PrepareBuilder();

         result.hasDummy28 = false;

         result.dummy28_ = 0;

         return this;

@@ -8322,11 +8900,13 @@
         set { SetDummy29(value); }

       }

       public Builder SetDummy29(int value) {

+        PrepareBuilder();

         result.hasDummy29 = true;

         result.dummy29_ = value;

         return this;

       }

       public Builder ClearDummy29() {

+        PrepareBuilder();

         result.hasDummy29 = false;

         result.dummy29_ = 0;

         return this;

@@ -8340,11 +8920,13 @@
         set { SetDummy30(value); }

       }

       public Builder SetDummy30(int value) {

+        PrepareBuilder();

         result.hasDummy30 = true;

         result.dummy30_ = value;

         return this;

       }

       public Builder ClearDummy30() {

+        PrepareBuilder();

         result.hasDummy30 = false;

         result.dummy30_ = 0;

         return this;

@@ -8358,11 +8940,13 @@
         set { SetDummy31(value); }

       }

       public Builder SetDummy31(int value) {

+        PrepareBuilder();

         result.hasDummy31 = true;

         result.dummy31_ = value;

         return this;

       }

       public Builder ClearDummy31() {

+        PrepareBuilder();

         result.hasDummy31 = false;

         result.dummy31_ = 0;

         return this;

@@ -8376,11 +8960,13 @@
         set { SetDummy32(value); }

       }

       public Builder SetDummy32(int value) {

+        PrepareBuilder();

         result.hasDummy32 = true;

         result.dummy32_ = value;

         return this;

       }

       public Builder ClearDummy32() {

+        PrepareBuilder();

         result.hasDummy32 = false;

         result.dummy32_ = 0;

         return this;

@@ -8394,11 +8980,13 @@
         set { SetC(value); }

       }

       public Builder SetC(int value) {

+        PrepareBuilder();

         result.hasC = true;

         result.c_ = value;

         return this;

       }

       public Builder ClearC() {

+        PrepareBuilder();

         result.hasC = false;

         result.c_ = 0;

         return this;

@@ -8551,7 +9139,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestRequiredForeign prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -8561,21 +9149,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestRequiredForeign();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestRequiredForeign cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestRequiredForeign result = new TestRequiredForeign();

+      bool builderIsReadOnly;

+      TestRequiredForeign result;

+      

+      private TestRequiredForeign PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestRequiredForeign original = result;

+          result = new TestRequiredForeign();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestRequiredForeign MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestRequiredForeign();

+        result = DefaultInstance ?? new TestRequiredForeign();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -8587,13 +9202,12 @@
       }

       

       public override TestRequiredForeign BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

         result.repeatedMessage_.MakeReadOnly();

-        TestRequiredForeign returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -8607,6 +9221,7 @@
       

       public override Builder MergeFrom(TestRequiredForeign other) {

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

+        PrepareBuilder();

         if (other.HasOptionalMessage) {

           MergeOptionalMessage(other.OptionalMessage);

         }

@@ -8625,6 +9240,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -8694,18 +9310,21 @@
       }

       public Builder SetOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired value) {

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

+        PrepareBuilder();

         result.hasOptionalMessage = true;

         result.optionalMessage_ = value;

         return this;

       }

       public Builder SetOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasOptionalMessage = true;

         result.optionalMessage_ = builderForValue.Build();

         return this;

       }

       public Builder MergeOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired value) {

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

+        PrepareBuilder();

         if (result.hasOptionalMessage &&

             result.optionalMessage_ != global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance) {

             result.optionalMessage_ = global::Google.ProtocolBuffers.TestProtos.TestRequired.CreateBuilder(result.optionalMessage_).MergeFrom(value).BuildPartial();

@@ -8716,13 +9335,14 @@
         return this;

       }

       public Builder ClearOptionalMessage() {

+        PrepareBuilder();

         result.hasOptionalMessage = false;

         result.optionalMessage_ = global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance;

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestRequired> RepeatedMessageList {

-        get { return result.repeatedMessage_; }

+        get { return PrepareBuilder().repeatedMessage_; }

       }

       public int RepeatedMessageCount {

         get { return result.RepeatedMessageCount; }

@@ -8732,29 +9352,35 @@
       }

       public Builder SetRepeatedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestRequired value) {

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

+        PrepareBuilder();

         result.repeatedMessage_[index] = value;

         return this;

       }

       public Builder SetRepeatedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder builderForValue) {

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

+        PrepareBuilder();

         result.repeatedMessage_[index] = builderForValue.Build();

         return this;

       }

       public Builder AddRepeatedMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired value) {

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

+        PrepareBuilder();

         result.repeatedMessage_.Add(value);

         return this;

       }

       public Builder AddRepeatedMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder builderForValue) {

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

+        PrepareBuilder();

         result.repeatedMessage_.Add(builderForValue.Build());

         return this;

       }

       public Builder AddRangeRepeatedMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestRequired> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedMessage_);

         return this;

       }

       public Builder ClearRepeatedMessage() {

+        PrepareBuilder();

         result.repeatedMessage_.Clear();

         return this;

       }

@@ -8767,11 +9393,13 @@
         set { SetDummy(value); }

       }

       public Builder SetDummy(int value) {

+        PrepareBuilder();

         result.hasDummy = true;

         result.dummy_ = value;

         return this;

       }

       public Builder ClearDummy() {

+        PrepareBuilder();

         result.hasDummy = false;

         result.dummy_ = 0;

         return this;

@@ -8884,7 +9512,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestForeignNested prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -8894,21 +9522,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestForeignNested();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestForeignNested cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestForeignNested result = new TestForeignNested();

+      bool builderIsReadOnly;

+      TestForeignNested result;

+      

+      private TestForeignNested PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestForeignNested original = result;

+          result = new TestForeignNested();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestForeignNested MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestForeignNested();

+        result = DefaultInstance ?? new TestForeignNested();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -8920,12 +9575,11 @@
       }

       

       public override TestForeignNested BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestForeignNested returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -8939,6 +9593,7 @@
       

       public override Builder MergeFrom(TestForeignNested other) {

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

+        PrepareBuilder();

         if (other.HasForeignNested) {

           MergeForeignNested(other.ForeignNested);

         }

@@ -8951,6 +9606,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -9012,18 +9668,21 @@
       }

       public Builder SetForeignNested(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {

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

+        PrepareBuilder();

         result.hasForeignNested = true;

         result.foreignNested_ = value;

         return this;

       }

       public Builder SetForeignNested(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasForeignNested = true;

         result.foreignNested_ = builderForValue.Build();

         return this;

       }

       public Builder MergeForeignNested(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {

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

+        PrepareBuilder();

         if (result.hasForeignNested &&

             result.foreignNested_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance) {

             result.foreignNested_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder(result.foreignNested_).MergeFrom(value).BuildPartial();

@@ -9034,6 +9693,7 @@
         return this;

       }

       public Builder ClearForeignNested() {

+        PrepareBuilder();

         result.hasForeignNested = false;

         result.foreignNested_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance;

         return this;

@@ -9130,7 +9790,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestEmptyMessage prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -9140,21 +9800,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestEmptyMessage();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestEmptyMessage cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestEmptyMessage result = new TestEmptyMessage();

+      bool builderIsReadOnly;

+      TestEmptyMessage result;

+      

+      private TestEmptyMessage PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestEmptyMessage original = result;

+          result = new TestEmptyMessage();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestEmptyMessage MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestEmptyMessage();

+        result = DefaultInstance ?? new TestEmptyMessage();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -9166,12 +9853,11 @@
       }

       

       public override TestEmptyMessage BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestEmptyMessage returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -9185,6 +9871,7 @@
       

       public override Builder MergeFrom(TestEmptyMessage other) {

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

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -9194,6 +9881,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -9332,7 +10020,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestEmptyMessageWithExtensions prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -9342,21 +10030,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestEmptyMessageWithExtensions();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestEmptyMessageWithExtensions cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestEmptyMessageWithExtensions result = new TestEmptyMessageWithExtensions();

+      bool builderIsReadOnly;

+      TestEmptyMessageWithExtensions result;

+      

+      private TestEmptyMessageWithExtensions PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestEmptyMessageWithExtensions original = result;

+          result = new TestEmptyMessageWithExtensions();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestEmptyMessageWithExtensions MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestEmptyMessageWithExtensions();

+        result = DefaultInstance ?? new TestEmptyMessageWithExtensions();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -9368,12 +10083,11 @@
       }

       

       public override TestEmptyMessageWithExtensions BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestEmptyMessageWithExtensions returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -9387,6 +10101,7 @@
       

       public override Builder MergeFrom(TestEmptyMessageWithExtensions other) {

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

+        PrepareBuilder();

           this.MergeExtensionFields(other);

         this.MergeUnknownFields(other.UnknownFields);

         return this;

@@ -9397,6 +10112,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -9537,7 +10253,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestMultipleExtensionRanges prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -9547,21 +10263,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestMultipleExtensionRanges();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestMultipleExtensionRanges cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestMultipleExtensionRanges result = new TestMultipleExtensionRanges();

+      bool builderIsReadOnly;

+      TestMultipleExtensionRanges result;

+      

+      private TestMultipleExtensionRanges PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestMultipleExtensionRanges original = result;

+          result = new TestMultipleExtensionRanges();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestMultipleExtensionRanges MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestMultipleExtensionRanges();

+        result = DefaultInstance ?? new TestMultipleExtensionRanges();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -9573,12 +10316,11 @@
       }

       

       public override TestMultipleExtensionRanges BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestMultipleExtensionRanges returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -9592,6 +10334,7 @@
       

       public override Builder MergeFrom(TestMultipleExtensionRanges other) {

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

+        PrepareBuilder();

           this.MergeExtensionFields(other);

         this.MergeUnknownFields(other.UnknownFields);

         return this;

@@ -9602,6 +10345,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -9768,7 +10512,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestReallyLargeTagNumber prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -9778,21 +10522,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestReallyLargeTagNumber();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestReallyLargeTagNumber cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestReallyLargeTagNumber result = new TestReallyLargeTagNumber();

+      bool builderIsReadOnly;

+      TestReallyLargeTagNumber result;

+      

+      private TestReallyLargeTagNumber PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestReallyLargeTagNumber original = result;

+          result = new TestReallyLargeTagNumber();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestReallyLargeTagNumber MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestReallyLargeTagNumber();

+        result = DefaultInstance ?? new TestReallyLargeTagNumber();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -9804,12 +10575,11 @@
       }

       

       public override TestReallyLargeTagNumber BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestReallyLargeTagNumber returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -9823,6 +10593,7 @@
       

       public override Builder MergeFrom(TestReallyLargeTagNumber other) {

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

+        PrepareBuilder();

         if (other.HasA) {

           A = other.A;

         }

@@ -9838,6 +10609,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -9897,11 +10669,13 @@
         set { SetA(value); }

       }

       public Builder SetA(int value) {

+        PrepareBuilder();

         result.hasA = true;

         result.a_ = value;

         return this;

       }

       public Builder ClearA() {

+        PrepareBuilder();

         result.hasA = false;

         result.a_ = 0;

         return this;

@@ -9915,11 +10689,13 @@
         set { SetBb(value); }

       }

       public Builder SetBb(int value) {

+        PrepareBuilder();

         result.hasBb = true;

         result.bb_ = value;

         return this;

       }

       public Builder ClearBb() {

+        PrepareBuilder();

         result.hasBb = false;

         result.bb_ = 0;

         return this;

@@ -10048,7 +10824,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestRecursiveMessage prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -10058,21 +10834,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestRecursiveMessage();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestRecursiveMessage cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestRecursiveMessage result = new TestRecursiveMessage();

+      bool builderIsReadOnly;

+      TestRecursiveMessage result;

+      

+      private TestRecursiveMessage PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestRecursiveMessage original = result;

+          result = new TestRecursiveMessage();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestRecursiveMessage MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestRecursiveMessage();

+        result = DefaultInstance ?? new TestRecursiveMessage();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -10084,12 +10887,11 @@
       }

       

       public override TestRecursiveMessage BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestRecursiveMessage returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -10103,6 +10905,7 @@
       

       public override Builder MergeFrom(TestRecursiveMessage other) {

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

+        PrepareBuilder();

         if (other.HasA) {

           MergeA(other.A);

         }

@@ -10118,6 +10921,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -10183,18 +10987,21 @@
       }

       public Builder SetA(global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage value) {

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

+        PrepareBuilder();

         result.hasA = true;

         result.a_ = value;

         return this;

       }

       public Builder SetA(global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasA = true;

         result.a_ = builderForValue.Build();

         return this;

       }

       public Builder MergeA(global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage value) {

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

+        PrepareBuilder();

         if (result.hasA &&

             result.a_ != global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance) {

             result.a_ = global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.CreateBuilder(result.a_).MergeFrom(value).BuildPartial();

@@ -10205,6 +11012,7 @@
         return this;

       }

       public Builder ClearA() {

+        PrepareBuilder();

         result.hasA = false;

         result.a_ = global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance;

         return this;

@@ -10218,11 +11026,13 @@
         set { SetI(value); }

       }

       public Builder SetI(int value) {

+        PrepareBuilder();

         result.hasI = true;

         result.i_ = value;

         return this;

       }

       public Builder ClearI() {

+        PrepareBuilder();

         result.hasI = false;

         result.i_ = 0;

         return this;

@@ -10335,7 +11145,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestMutualRecursionA prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -10345,21 +11155,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestMutualRecursionA();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestMutualRecursionA cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestMutualRecursionA result = new TestMutualRecursionA();

+      bool builderIsReadOnly;

+      TestMutualRecursionA result;

+      

+      private TestMutualRecursionA PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestMutualRecursionA original = result;

+          result = new TestMutualRecursionA();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestMutualRecursionA MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestMutualRecursionA();

+        result = DefaultInstance ?? new TestMutualRecursionA();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -10371,12 +11208,11 @@
       }

       

       public override TestMutualRecursionA BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestMutualRecursionA returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -10390,6 +11226,7 @@
       

       public override Builder MergeFrom(TestMutualRecursionA other) {

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

+        PrepareBuilder();

         if (other.HasBb) {

           MergeBb(other.Bb);

         }

@@ -10402,6 +11239,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -10463,18 +11301,21 @@
       }

       public Builder SetBb(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB value) {

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

+        PrepareBuilder();

         result.hasBb = true;

         result.bb_ = value;

         return this;

       }

       public Builder SetBb(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasBb = true;

         result.bb_ = builderForValue.Build();

         return this;

       }

       public Builder MergeBb(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB value) {

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

+        PrepareBuilder();

         if (result.hasBb &&

             result.bb_ != global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance) {

             result.bb_ = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.CreateBuilder(result.bb_).MergeFrom(value).BuildPartial();

@@ -10485,6 +11326,7 @@
         return this;

       }

       public Builder ClearBb() {

+        PrepareBuilder();

         result.hasBb = false;

         result.bb_ = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance;

         return this;

@@ -10613,7 +11455,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestMutualRecursionB prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -10623,21 +11465,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestMutualRecursionB();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestMutualRecursionB cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestMutualRecursionB result = new TestMutualRecursionB();

+      bool builderIsReadOnly;

+      TestMutualRecursionB result;

+      

+      private TestMutualRecursionB PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestMutualRecursionB original = result;

+          result = new TestMutualRecursionB();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestMutualRecursionB MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestMutualRecursionB();

+        result = DefaultInstance ?? new TestMutualRecursionB();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -10649,12 +11518,11 @@
       }

       

       public override TestMutualRecursionB BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestMutualRecursionB returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -10668,6 +11536,7 @@
       

       public override Builder MergeFrom(TestMutualRecursionB other) {

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

+        PrepareBuilder();

         if (other.HasA) {

           MergeA(other.A);

         }

@@ -10683,6 +11552,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -10748,18 +11618,21 @@
       }

       public Builder SetA(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA value) {

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

+        PrepareBuilder();

         result.hasA = true;

         result.a_ = value;

         return this;

       }

       public Builder SetA(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasA = true;

         result.a_ = builderForValue.Build();

         return this;

       }

       public Builder MergeA(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA value) {

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

+        PrepareBuilder();

         if (result.hasA &&

             result.a_ != global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance) {

             result.a_ = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.CreateBuilder(result.a_).MergeFrom(value).BuildPartial();

@@ -10770,6 +11643,7 @@
         return this;

       }

       public Builder ClearA() {

+        PrepareBuilder();

         result.hasA = false;

         result.a_ = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance;

         return this;

@@ -10783,11 +11657,13 @@
         set { SetOptionalInt32(value); }

       }

       public Builder SetOptionalInt32(int value) {

+        PrepareBuilder();

         result.hasOptionalInt32 = true;

         result.optionalInt32_ = value;

         return this;

       }

       public Builder ClearOptionalInt32() {

+        PrepareBuilder();

         result.hasOptionalInt32 = false;

         result.optionalInt32_ = 0;

         return this;

@@ -10932,7 +11808,7 @@
         public override Builder ToBuilder() { return CreateBuilder(this); }

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

         public static Builder CreateBuilder(Foo prototype) {

-          return (Builder) new Builder().MergeFrom(prototype);

+          return new Builder(prototype);

         }

         

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

@@ -10942,21 +11818,48 @@
           protected override Builder ThisBuilder {

             get { return this; }

           }

-          public Builder() {}

+          public Builder() {

+            result = DefaultInstance ?? new Foo();

+            builderIsReadOnly = result == DefaultInstance;

+          }

+          internal Builder(Foo cloneFrom) {

+            result = cloneFrom;

+            builderIsReadOnly = true;

+          }

           

-          Foo result = new Foo();

+          bool builderIsReadOnly;

+          Foo result;

+          

+          private Foo PrepareBuilder() {

+            if (builderIsReadOnly) {

+              Foo original = result;

+              result = new Foo();

+              builderIsReadOnly = false;

+              MergeFrom(original);

+            }

+            return result;

+          }

+          

+          public override bool IsInitialized {

+            get { return result.IsInitialized; }

+          }

           

           protected override Foo MessageBeingBuilt {

-            get { return result; }

+            get { return PrepareBuilder(); }

           }

           

           public override Builder Clear() {

-            result = new Foo();

+            result = DefaultInstance ?? new Foo();

+            builderIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

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

+            if (builderIsReadOnly) {

+              return new Builder(result);

+            } else {

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

+            }

           }

           

           public override pbd::MessageDescriptor DescriptorForType {

@@ -10968,12 +11871,11 @@
           }

           

           public override Foo BuildPartial() {

-            if (result == null) {

-              throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+            if (builderIsReadOnly) {

+              return result;

             }

-            Foo returnMe = result;

-            result = null;

-            return returnMe;

+            builderIsReadOnly = true;

+            return result;

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -10987,6 +11889,7 @@
           

           public override Builder MergeFrom(Foo other) {

             if (other == global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance) return this;

+            PrepareBuilder();

             if (other.HasA) {

               A = other.A;

             }

@@ -10999,6 +11902,7 @@
           }

           

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

+            PrepareBuilder();

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -11054,11 +11958,13 @@
             set { SetA(value); }

           }

           public Builder SetA(int value) {

+            PrepareBuilder();

             result.hasA = true;

             result.a_ = value;

             return this;

           }

           public Builder ClearA() {

+            PrepareBuilder();

             result.hasA = false;

             result.a_ = 0;

             return this;

@@ -11171,7 +12077,7 @@
         public override Builder ToBuilder() { return CreateBuilder(this); }

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

         public static Builder CreateBuilder(Bar prototype) {

-          return (Builder) new Builder().MergeFrom(prototype);

+          return new Builder(prototype);

         }

         

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

@@ -11181,21 +12087,48 @@
           protected override Builder ThisBuilder {

             get { return this; }

           }

-          public Builder() {}

+          public Builder() {

+            result = DefaultInstance ?? new Bar();

+            builderIsReadOnly = result == DefaultInstance;

+          }

+          internal Builder(Bar cloneFrom) {

+            result = cloneFrom;

+            builderIsReadOnly = true;

+          }

           

-          Bar result = new Bar();

+          bool builderIsReadOnly;

+          Bar result;

+          

+          private Bar PrepareBuilder() {

+            if (builderIsReadOnly) {

+              Bar original = result;

+              result = new Bar();

+              builderIsReadOnly = false;

+              MergeFrom(original);

+            }

+            return result;

+          }

+          

+          public override bool IsInitialized {

+            get { return result.IsInitialized; }

+          }

           

           protected override Bar MessageBeingBuilt {

-            get { return result; }

+            get { return PrepareBuilder(); }

           }

           

           public override Builder Clear() {

-            result = new Bar();

+            result = DefaultInstance ?? new Bar();

+            builderIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

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

+            if (builderIsReadOnly) {

+              return new Builder(result);

+            } else {

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

+            }

           }

           

           public override pbd::MessageDescriptor DescriptorForType {

@@ -11207,12 +12140,11 @@
           }

           

           public override Bar BuildPartial() {

-            if (result == null) {

-              throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+            if (builderIsReadOnly) {

+              return result;

             }

-            Bar returnMe = result;

-            result = null;

-            return returnMe;

+            builderIsReadOnly = true;

+            return result;

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -11226,6 +12158,7 @@
           

           public override Builder MergeFrom(Bar other) {

             if (other == global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance) return this;

+            PrepareBuilder();

             if (other.HasA) {

               A = other.A;

             }

@@ -11238,6 +12171,7 @@
           }

           

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

+            PrepareBuilder();

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -11293,11 +12227,13 @@
             set { SetA(value); }

           }

           public Builder SetA(int value) {

+            PrepareBuilder();

             result.hasA = true;

             result.a_ = value;

             return this;

           }

           public Builder ClearA() {

+            PrepareBuilder();

             result.hasA = false;

             result.a_ = 0;

             return this;

@@ -11418,7 +12354,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestDupFieldNumber prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -11428,21 +12364,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestDupFieldNumber();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestDupFieldNumber cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestDupFieldNumber result = new TestDupFieldNumber();

+      bool builderIsReadOnly;

+      TestDupFieldNumber result;

+      

+      private TestDupFieldNumber PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestDupFieldNumber original = result;

+          result = new TestDupFieldNumber();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestDupFieldNumber MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestDupFieldNumber();

+        result = DefaultInstance ?? new TestDupFieldNumber();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -11454,12 +12417,11 @@
       }

       

       public override TestDupFieldNumber BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestDupFieldNumber returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -11473,6 +12435,7 @@
       

       public override Builder MergeFrom(TestDupFieldNumber other) {

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

+        PrepareBuilder();

         if (other.HasA) {

           A = other.A;

         }

@@ -11491,6 +12454,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -11564,11 +12528,13 @@
         set { SetA(value); }

       }

       public Builder SetA(int value) {

+        PrepareBuilder();

         result.hasA = true;

         result.a_ = value;

         return this;

       }

       public Builder ClearA() {

+        PrepareBuilder();

         result.hasA = false;

         result.a_ = 0;

         return this;

@@ -11583,18 +12549,21 @@
       }

       public Builder SetFoo(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo value) {

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

+        PrepareBuilder();

         result.hasFoo = true;

         result.foo_ = value;

         return this;

       }

       public Builder SetFoo(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasFoo = true;

         result.foo_ = builderForValue.Build();

         return this;

       }

       public Builder MergeFoo(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo value) {

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

+        PrepareBuilder();

         if (result.hasFoo &&

             result.foo_ != global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance) {

             result.foo_ = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.CreateBuilder(result.foo_).MergeFrom(value).BuildPartial();

@@ -11605,6 +12574,7 @@
         return this;

       }

       public Builder ClearFoo() {

+        PrepareBuilder();

         result.hasFoo = false;

         result.foo_ = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance;

         return this;

@@ -11619,18 +12589,21 @@
       }

       public Builder SetBar(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar value) {

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

+        PrepareBuilder();

         result.hasBar = true;

         result.bar_ = value;

         return this;

       }

       public Builder SetBar(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasBar = true;

         result.bar_ = builderForValue.Build();

         return this;

       }

       public Builder MergeBar(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar value) {

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

+        PrepareBuilder();

         if (result.hasBar &&

             result.bar_ != global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance) {

             result.bar_ = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.CreateBuilder(result.bar_).MergeFrom(value).BuildPartial();

@@ -11641,6 +12614,7 @@
         return this;

       }

       public Builder ClearBar() {

+        PrepareBuilder();

         result.hasBar = false;

         result.bar_ = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance;

         return this;

@@ -11810,7 +12784,7 @@
         public override Builder ToBuilder() { return CreateBuilder(this); }

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

         public static Builder CreateBuilder(NestedMessage prototype) {

-          return (Builder) new Builder().MergeFrom(prototype);

+          return new Builder(prototype);

         }

         

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

@@ -11820,21 +12794,48 @@
           protected override Builder ThisBuilder {

             get { return this; }

           }

-          public Builder() {}

+          public Builder() {

+            result = DefaultInstance ?? new NestedMessage();

+            builderIsReadOnly = result == DefaultInstance;

+          }

+          internal Builder(NestedMessage cloneFrom) {

+            result = cloneFrom;

+            builderIsReadOnly = true;

+          }

           

-          NestedMessage result = new NestedMessage();

+          bool builderIsReadOnly;

+          NestedMessage result;

+          

+          private NestedMessage PrepareBuilder() {

+            if (builderIsReadOnly) {

+              NestedMessage original = result;

+              result = new NestedMessage();

+              builderIsReadOnly = false;

+              MergeFrom(original);

+            }

+            return result;

+          }

+          

+          public override bool IsInitialized {

+            get { return result.IsInitialized; }

+          }

           

           protected override NestedMessage MessageBeingBuilt {

-            get { return result; }

+            get { return PrepareBuilder(); }

           }

           

           public override Builder Clear() {

-            result = new NestedMessage();

+            result = DefaultInstance ?? new NestedMessage();

+            builderIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

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

+            if (builderIsReadOnly) {

+              return new Builder(result);

+            } else {

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

+            }

           }

           

           public override pbd::MessageDescriptor DescriptorForType {

@@ -11846,14 +12847,13 @@
           }

           

           public override NestedMessage BuildPartial() {

-            if (result == null) {

-              throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+            if (builderIsReadOnly) {

+              return result;

             }

             result.nestedmessageRepeatedInt32_.MakeReadOnly();

             result.nestedmessageRepeatedForeignmessage_.MakeReadOnly();

-            NestedMessage returnMe = result;

-            result = null;

-            return returnMe;

+            builderIsReadOnly = true;

+            return result;

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -11867,6 +12867,7 @@
           

           public override Builder MergeFrom(NestedMessage other) {

             if (other == global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance) return this;

+            PrepareBuilder();

             if (other.nestedmessageRepeatedInt32_.Count != 0) {

               base.AddRange(other.nestedmessageRepeatedInt32_, result.nestedmessageRepeatedInt32_);

             }

@@ -11882,6 +12883,7 @@
           }

           

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

+            PrepareBuilder();

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -11935,7 +12937,7 @@
           

           

           public pbc::IPopsicleList<int> NestedmessageRepeatedInt32List {

-            get { return result.nestedmessageRepeatedInt32_; }

+            get { return PrepareBuilder().nestedmessageRepeatedInt32_; }

           }

           public int NestedmessageRepeatedInt32Count {

             get { return result.NestedmessageRepeatedInt32Count; }

@@ -11944,24 +12946,28 @@
             return result.GetNestedmessageRepeatedInt32(index);

           }

           public Builder SetNestedmessageRepeatedInt32(int index, int value) {

+            PrepareBuilder();

             result.nestedmessageRepeatedInt32_[index] = value;

             return this;

           }

           public Builder AddNestedmessageRepeatedInt32(int value) {

+            PrepareBuilder();

             result.nestedmessageRepeatedInt32_.Add(value);

             return this;

           }

           public Builder AddRangeNestedmessageRepeatedInt32(scg::IEnumerable<int> values) {

+            PrepareBuilder();

             base.AddRange(values, result.nestedmessageRepeatedInt32_);

             return this;

           }

           public Builder ClearNestedmessageRepeatedInt32() {

+            PrepareBuilder();

             result.nestedmessageRepeatedInt32_.Clear();

             return this;

           }

           

           public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> NestedmessageRepeatedForeignmessageList {

-            get { return result.nestedmessageRepeatedForeignmessage_; }

+            get { return PrepareBuilder().nestedmessageRepeatedForeignmessage_; }

           }

           public int NestedmessageRepeatedForeignmessageCount {

             get { return result.NestedmessageRepeatedForeignmessageCount; }

@@ -11971,29 +12977,35 @@
           }

           public Builder SetNestedmessageRepeatedForeignmessage(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {

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

+            PrepareBuilder();

             result.nestedmessageRepeatedForeignmessage_[index] = value;

             return this;

           }

           public Builder SetNestedmessageRepeatedForeignmessage(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {

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

+            PrepareBuilder();

             result.nestedmessageRepeatedForeignmessage_[index] = builderForValue.Build();

             return this;

           }

           public Builder AddNestedmessageRepeatedForeignmessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {

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

+            PrepareBuilder();

             result.nestedmessageRepeatedForeignmessage_.Add(value);

             return this;

           }

           public Builder AddNestedmessageRepeatedForeignmessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {

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

+            PrepareBuilder();

             result.nestedmessageRepeatedForeignmessage_.Add(builderForValue.Build());

             return this;

           }

           public Builder AddRangeNestedmessageRepeatedForeignmessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> values) {

+            PrepareBuilder();

             base.AddRange(values, result.nestedmessageRepeatedForeignmessage_);

             return this;

           }

           public Builder ClearNestedmessageRepeatedForeignmessage() {

+            PrepareBuilder();

             result.nestedmessageRepeatedForeignmessage_.Clear();

             return this;

           }

@@ -12081,7 +13093,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestNestedMessageHasBits prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -12091,21 +13103,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestNestedMessageHasBits();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestNestedMessageHasBits cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestNestedMessageHasBits result = new TestNestedMessageHasBits();

+      bool builderIsReadOnly;

+      TestNestedMessageHasBits result;

+      

+      private TestNestedMessageHasBits PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestNestedMessageHasBits original = result;

+          result = new TestNestedMessageHasBits();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestNestedMessageHasBits MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestNestedMessageHasBits();

+        result = DefaultInstance ?? new TestNestedMessageHasBits();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -12117,12 +13156,11 @@
       }

       

       public override TestNestedMessageHasBits BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestNestedMessageHasBits returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -12136,6 +13174,7 @@
       

       public override Builder MergeFrom(TestNestedMessageHasBits other) {

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

+        PrepareBuilder();

         if (other.HasOptionalNestedMessage) {

           MergeOptionalNestedMessage(other.OptionalNestedMessage);

         }

@@ -12148,6 +13187,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -12209,18 +13249,21 @@
       }

       public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage value) {

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

+        PrepareBuilder();

         result.hasOptionalNestedMessage = true;

         result.optionalNestedMessage_ = value;

         return this;

       }

       public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasOptionalNestedMessage = true;

         result.optionalNestedMessage_ = builderForValue.Build();

         return this;

       }

       public Builder MergeOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage value) {

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

+        PrepareBuilder();

         if (result.hasOptionalNestedMessage &&

             result.optionalNestedMessage_ != global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance) {

             result.optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.CreateBuilder(result.optionalNestedMessage_).MergeFrom(value).BuildPartial();

@@ -12231,6 +13274,7 @@
         return this;

       }

       public Builder ClearOptionalNestedMessage() {

+        PrepareBuilder();

         result.hasOptionalNestedMessage = false;

         result.optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance;

         return this;

@@ -12558,7 +13602,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestCamelCaseFieldNames prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -12568,21 +13612,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestCamelCaseFieldNames();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestCamelCaseFieldNames cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestCamelCaseFieldNames result = new TestCamelCaseFieldNames();

+      bool builderIsReadOnly;

+      TestCamelCaseFieldNames result;

+      

+      private TestCamelCaseFieldNames PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestCamelCaseFieldNames original = result;

+          result = new TestCamelCaseFieldNames();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestCamelCaseFieldNames MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestCamelCaseFieldNames();

+        result = DefaultInstance ?? new TestCamelCaseFieldNames();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -12594,8 +13665,8 @@
       }

       

       public override TestCamelCaseFieldNames BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

         result.repeatedPrimitiveField_.MakeReadOnly();

         result.repeatedStringField_.MakeReadOnly();

@@ -12603,9 +13674,8 @@
         result.repeatedMessageField_.MakeReadOnly();

         result.repeatedStringPieceField_.MakeReadOnly();

         result.repeatedCordField_.MakeReadOnly();

-        TestCamelCaseFieldNames returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -12619,6 +13689,7 @@
       

       public override Builder MergeFrom(TestCamelCaseFieldNames other) {

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

+        PrepareBuilder();

         if (other.HasPrimitiveField) {

           PrimitiveField = other.PrimitiveField;

         }

@@ -12664,6 +13735,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -12787,11 +13859,13 @@
         set { SetPrimitiveField(value); }

       }

       public Builder SetPrimitiveField(int value) {

+        PrepareBuilder();

         result.hasPrimitiveField = true;

         result.primitiveField_ = value;

         return this;

       }

       public Builder ClearPrimitiveField() {

+        PrepareBuilder();

         result.hasPrimitiveField = false;

         result.primitiveField_ = 0;

         return this;

@@ -12806,11 +13880,13 @@
       }

       public Builder SetStringField(string value) {

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

+        PrepareBuilder();

         result.hasStringField = true;

         result.stringField_ = value;

         return this;

       }

       public Builder ClearStringField() {

+        PrepareBuilder();

         result.hasStringField = false;

         result.stringField_ = "";

         return this;

@@ -12824,11 +13900,13 @@
         set { SetEnumField(value); }

       }

       public Builder SetEnumField(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {

+        PrepareBuilder();

         result.hasEnumField = true;

         result.enumField_ = value;

         return this;

       }

       public Builder ClearEnumField() {

+        PrepareBuilder();

         result.hasEnumField = false;

         result.enumField_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;

         return this;

@@ -12843,18 +13921,21 @@
       }

       public Builder SetMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {

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

+        PrepareBuilder();

         result.hasMessageField = true;

         result.messageField_ = value;

         return this;

       }

       public Builder SetMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasMessageField = true;

         result.messageField_ = builderForValue.Build();

         return this;

       }

       public Builder MergeMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {

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

+        PrepareBuilder();

         if (result.hasMessageField &&

             result.messageField_ != global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance) {

             result.messageField_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder(result.messageField_).MergeFrom(value).BuildPartial();

@@ -12865,6 +13946,7 @@
         return this;

       }

       public Builder ClearMessageField() {

+        PrepareBuilder();

         result.hasMessageField = false;

         result.messageField_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance;

         return this;

@@ -12879,11 +13961,13 @@
       }

       public Builder SetStringPieceField(string value) {

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

+        PrepareBuilder();

         result.hasStringPieceField = true;

         result.stringPieceField_ = value;

         return this;

       }

       public Builder ClearStringPieceField() {

+        PrepareBuilder();

         result.hasStringPieceField = false;

         result.stringPieceField_ = "";

         return this;

@@ -12898,18 +13982,20 @@
       }

       public Builder SetCordField(string value) {

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

+        PrepareBuilder();

         result.hasCordField = true;

         result.cordField_ = value;

         return this;

       }

       public Builder ClearCordField() {

+        PrepareBuilder();

         result.hasCordField = false;

         result.cordField_ = "";

         return this;

       }

       

       public pbc::IPopsicleList<int> RepeatedPrimitiveFieldList {

-        get { return result.repeatedPrimitiveField_; }

+        get { return PrepareBuilder().repeatedPrimitiveField_; }

       }

       public int RepeatedPrimitiveFieldCount {

         get { return result.RepeatedPrimitiveFieldCount; }

@@ -12918,24 +14004,28 @@
         return result.GetRepeatedPrimitiveField(index);

       }

       public Builder SetRepeatedPrimitiveField(int index, int value) {

+        PrepareBuilder();

         result.repeatedPrimitiveField_[index] = value;

         return this;

       }

       public Builder AddRepeatedPrimitiveField(int value) {

+        PrepareBuilder();

         result.repeatedPrimitiveField_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedPrimitiveField(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedPrimitiveField_);

         return this;

       }

       public Builder ClearRepeatedPrimitiveField() {

+        PrepareBuilder();

         result.repeatedPrimitiveField_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<string> RepeatedStringFieldList {

-        get { return result.repeatedStringField_; }

+        get { return PrepareBuilder().repeatedStringField_; }

       }

       public int RepeatedStringFieldCount {

         get { return result.RepeatedStringFieldCount; }

@@ -12945,25 +14035,29 @@
       }

       public Builder SetRepeatedStringField(int index, string value) {

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

+        PrepareBuilder();

         result.repeatedStringField_[index] = value;

         return this;

       }

       public Builder AddRepeatedStringField(string value) {

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

+        PrepareBuilder();

         result.repeatedStringField_.Add(value);

         return this;

       }

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

+        PrepareBuilder();

         base.AddRange(values, result.repeatedStringField_);

         return this;

       }

       public Builder ClearRepeatedStringField() {

+        PrepareBuilder();

         result.repeatedStringField_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> RepeatedEnumFieldList {

-        get { return result.repeatedEnumField_; }

+        get { return PrepareBuilder().repeatedEnumField_; }

       }

       public int RepeatedEnumFieldCount {

         get { return result.RepeatedEnumFieldCount; }

@@ -12972,24 +14066,28 @@
         return result.GetRepeatedEnumField(index);

       }

       public Builder SetRepeatedEnumField(int index, global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {

+        PrepareBuilder();

         result.repeatedEnumField_[index] = value;

         return this;

       }

       public Builder AddRepeatedEnumField(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {

+        PrepareBuilder();

         result.repeatedEnumField_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedEnumField(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedEnumField_);

         return this;

       }

       public Builder ClearRepeatedEnumField() {

+        PrepareBuilder();

         result.repeatedEnumField_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> RepeatedMessageFieldList {

-        get { return result.repeatedMessageField_; }

+        get { return PrepareBuilder().repeatedMessageField_; }

       }

       public int RepeatedMessageFieldCount {

         get { return result.RepeatedMessageFieldCount; }

@@ -12999,35 +14097,41 @@
       }

       public Builder SetRepeatedMessageField(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {

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

+        PrepareBuilder();

         result.repeatedMessageField_[index] = value;

         return this;

       }

       public Builder SetRepeatedMessageField(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.repeatedMessageField_[index] = builderForValue.Build();

         return this;

       }

       public Builder AddRepeatedMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {

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

+        PrepareBuilder();

         result.repeatedMessageField_.Add(value);

         return this;

       }

       public Builder AddRepeatedMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.repeatedMessageField_.Add(builderForValue.Build());

         return this;

       }

       public Builder AddRangeRepeatedMessageField(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedMessageField_);

         return this;

       }

       public Builder ClearRepeatedMessageField() {

+        PrepareBuilder();

         result.repeatedMessageField_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<string> RepeatedStringPieceFieldList {

-        get { return result.repeatedStringPieceField_; }

+        get { return PrepareBuilder().repeatedStringPieceField_; }

       }

       public int RepeatedStringPieceFieldCount {

         get { return result.RepeatedStringPieceFieldCount; }

@@ -13037,25 +14141,29 @@
       }

       public Builder SetRepeatedStringPieceField(int index, string value) {

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

+        PrepareBuilder();

         result.repeatedStringPieceField_[index] = value;

         return this;

       }

       public Builder AddRepeatedStringPieceField(string value) {

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

+        PrepareBuilder();

         result.repeatedStringPieceField_.Add(value);

         return this;

       }

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

+        PrepareBuilder();

         base.AddRange(values, result.repeatedStringPieceField_);

         return this;

       }

       public Builder ClearRepeatedStringPieceField() {

+        PrepareBuilder();

         result.repeatedStringPieceField_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<string> RepeatedCordFieldList {

-        get { return result.repeatedCordField_; }

+        get { return PrepareBuilder().repeatedCordField_; }

       }

       public int RepeatedCordFieldCount {

         get { return result.RepeatedCordFieldCount; }

@@ -13065,19 +14173,23 @@
       }

       public Builder SetRepeatedCordField(int index, string value) {

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

+        PrepareBuilder();

         result.repeatedCordField_[index] = value;

         return this;

       }

       public Builder AddRepeatedCordField(string value) {

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

+        PrepareBuilder();

         result.repeatedCordField_.Add(value);

         return this;

       }

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

+        PrepareBuilder();

         base.AddRange(values, result.repeatedCordField_);

         return this;

       }

       public Builder ClearRepeatedCordField() {

+        PrepareBuilder();

         result.repeatedCordField_.Clear();

         return this;

       }

@@ -13226,7 +14338,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestFieldOrderings prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -13236,21 +14348,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestFieldOrderings();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestFieldOrderings cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestFieldOrderings result = new TestFieldOrderings();

+      bool builderIsReadOnly;

+      TestFieldOrderings result;

+      

+      private TestFieldOrderings PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestFieldOrderings original = result;

+          result = new TestFieldOrderings();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestFieldOrderings MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestFieldOrderings();

+        result = DefaultInstance ?? new TestFieldOrderings();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -13262,12 +14401,11 @@
       }

       

       public override TestFieldOrderings BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestFieldOrderings returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -13281,6 +14419,7 @@
       

       public override Builder MergeFrom(TestFieldOrderings other) {

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

+        PrepareBuilder();

         if (other.HasMyString) {

           MyString = other.MyString;

         }

@@ -13300,6 +14439,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -13364,11 +14504,13 @@
       }

       public Builder SetMyString(string value) {

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

+        PrepareBuilder();

         result.hasMyString = true;

         result.myString_ = value;

         return this;

       }

       public Builder ClearMyString() {

+        PrepareBuilder();

         result.hasMyString = false;

         result.myString_ = "";

         return this;

@@ -13382,11 +14524,13 @@
         set { SetMyInt(value); }

       }

       public Builder SetMyInt(long value) {

+        PrepareBuilder();

         result.hasMyInt = true;

         result.myInt_ = value;

         return this;

       }

       public Builder ClearMyInt() {

+        PrepareBuilder();

         result.hasMyInt = false;

         result.myInt_ = 0L;

         return this;

@@ -13400,11 +14544,13 @@
         set { SetMyFloat(value); }

       }

       public Builder SetMyFloat(float value) {

+        PrepareBuilder();

         result.hasMyFloat = true;

         result.myFloat_ = value;

         return this;

       }

       public Builder ClearMyFloat() {

+        PrepareBuilder();

         result.hasMyFloat = false;

         result.myFloat_ = 0F;

         return this;

@@ -13807,7 +14953,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestExtremeDefaultValues prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -13817,21 +14963,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestExtremeDefaultValues();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestExtremeDefaultValues cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestExtremeDefaultValues result = new TestExtremeDefaultValues();

+      bool builderIsReadOnly;

+      TestExtremeDefaultValues result;

+      

+      private TestExtremeDefaultValues PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestExtremeDefaultValues original = result;

+          result = new TestExtremeDefaultValues();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestExtremeDefaultValues MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestExtremeDefaultValues();

+        result = DefaultInstance ?? new TestExtremeDefaultValues();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -13843,12 +15016,11 @@
       }

       

       public override TestExtremeDefaultValues BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestExtremeDefaultValues returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -13862,6 +15034,7 @@
       

       public override Builder MergeFrom(TestExtremeDefaultValues other) {

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

+        PrepareBuilder();

         if (other.HasEscapedBytes) {

           EscapedBytes = other.EscapedBytes;

         }

@@ -13928,6 +15101,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -14056,11 +15230,13 @@
       }

       public Builder SetEscapedBytes(pb::ByteString value) {

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

+        PrepareBuilder();

         result.hasEscapedBytes = true;

         result.escapedBytes_ = value;

         return this;

       }

       public Builder ClearEscapedBytes() {

+        PrepareBuilder();

         result.hasEscapedBytes = false;

         result.escapedBytes_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[0].DefaultValue;

         return this;

@@ -14076,11 +15252,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetLargeUint32(uint value) {

+        PrepareBuilder();

         result.hasLargeUint32 = true;

         result.largeUint32_ = value;

         return this;

       }

       public Builder ClearLargeUint32() {

+        PrepareBuilder();

         result.hasLargeUint32 = false;

         result.largeUint32_ = 4294967295;

         return this;

@@ -14096,11 +15274,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetLargeUint64(ulong value) {

+        PrepareBuilder();

         result.hasLargeUint64 = true;

         result.largeUint64_ = value;

         return this;

       }

       public Builder ClearLargeUint64() {

+        PrepareBuilder();

         result.hasLargeUint64 = false;

         result.largeUint64_ = 18446744073709551615UL;

         return this;

@@ -14114,11 +15294,13 @@
         set { SetSmallInt32(value); }

       }

       public Builder SetSmallInt32(int value) {

+        PrepareBuilder();

         result.hasSmallInt32 = true;

         result.smallInt32_ = value;

         return this;

       }

       public Builder ClearSmallInt32() {

+        PrepareBuilder();

         result.hasSmallInt32 = false;

         result.smallInt32_ = -2147483647;

         return this;

@@ -14132,11 +15314,13 @@
         set { SetSmallInt64(value); }

       }

       public Builder SetSmallInt64(long value) {

+        PrepareBuilder();

         result.hasSmallInt64 = true;

         result.smallInt64_ = value;

         return this;

       }

       public Builder ClearSmallInt64() {

+        PrepareBuilder();

         result.hasSmallInt64 = false;

         result.smallInt64_ = -9223372036854775807L;

         return this;

@@ -14151,11 +15335,13 @@
       }

       public Builder SetUtf8String(string value) {

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

+        PrepareBuilder();

         result.hasUtf8String = true;

         result.utf8String_ = value;

         return this;

       }

       public Builder ClearUtf8String() {

+        PrepareBuilder();

         result.hasUtf8String = false;

         result.utf8String_ = (string) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[5].DefaultValue;

         return this;

@@ -14169,11 +15355,13 @@
         set { SetZeroFloat(value); }

       }

       public Builder SetZeroFloat(float value) {

+        PrepareBuilder();

         result.hasZeroFloat = true;

         result.zeroFloat_ = value;

         return this;

       }

       public Builder ClearZeroFloat() {

+        PrepareBuilder();

         result.hasZeroFloat = false;

         result.zeroFloat_ = 0F;

         return this;

@@ -14187,11 +15375,13 @@
         set { SetOneFloat(value); }

       }

       public Builder SetOneFloat(float value) {

+        PrepareBuilder();

         result.hasOneFloat = true;

         result.oneFloat_ = value;

         return this;

       }

       public Builder ClearOneFloat() {

+        PrepareBuilder();

         result.hasOneFloat = false;

         result.oneFloat_ = 1F;

         return this;

@@ -14205,11 +15395,13 @@
         set { SetSmallFloat(value); }

       }

       public Builder SetSmallFloat(float value) {

+        PrepareBuilder();

         result.hasSmallFloat = true;

         result.smallFloat_ = value;

         return this;

       }

       public Builder ClearSmallFloat() {

+        PrepareBuilder();

         result.hasSmallFloat = false;

         result.smallFloat_ = 1.5F;

         return this;

@@ -14223,11 +15415,13 @@
         set { SetNegativeOneFloat(value); }

       }

       public Builder SetNegativeOneFloat(float value) {

+        PrepareBuilder();

         result.hasNegativeOneFloat = true;

         result.negativeOneFloat_ = value;

         return this;

       }

       public Builder ClearNegativeOneFloat() {

+        PrepareBuilder();

         result.hasNegativeOneFloat = false;

         result.negativeOneFloat_ = -1F;

         return this;

@@ -14241,11 +15435,13 @@
         set { SetNegativeFloat(value); }

       }

       public Builder SetNegativeFloat(float value) {

+        PrepareBuilder();

         result.hasNegativeFloat = true;

         result.negativeFloat_ = value;

         return this;

       }

       public Builder ClearNegativeFloat() {

+        PrepareBuilder();

         result.hasNegativeFloat = false;

         result.negativeFloat_ = -1.5F;

         return this;

@@ -14259,11 +15455,13 @@
         set { SetLargeFloat(value); }

       }

       public Builder SetLargeFloat(float value) {

+        PrepareBuilder();

         result.hasLargeFloat = true;

         result.largeFloat_ = value;

         return this;

       }

       public Builder ClearLargeFloat() {

+        PrepareBuilder();

         result.hasLargeFloat = false;

         result.largeFloat_ = 2E+08F;

         return this;

@@ -14277,11 +15475,13 @@
         set { SetSmallNegativeFloat(value); }

       }

       public Builder SetSmallNegativeFloat(float value) {

+        PrepareBuilder();

         result.hasSmallNegativeFloat = true;

         result.smallNegativeFloat_ = value;

         return this;

       }

       public Builder ClearSmallNegativeFloat() {

+        PrepareBuilder();

         result.hasSmallNegativeFloat = false;

         result.smallNegativeFloat_ = -8E-28F;

         return this;

@@ -14295,11 +15495,13 @@
         set { SetInfDouble(value); }

       }

       public Builder SetInfDouble(double value) {

+        PrepareBuilder();

         result.hasInfDouble = true;

         result.infDouble_ = value;

         return this;

       }

       public Builder ClearInfDouble() {

+        PrepareBuilder();

         result.hasInfDouble = false;

         result.infDouble_ = double.PositiveInfinity;

         return this;

@@ -14313,11 +15515,13 @@
         set { SetNegInfDouble(value); }

       }

       public Builder SetNegInfDouble(double value) {

+        PrepareBuilder();

         result.hasNegInfDouble = true;

         result.negInfDouble_ = value;

         return this;

       }

       public Builder ClearNegInfDouble() {

+        PrepareBuilder();

         result.hasNegInfDouble = false;

         result.negInfDouble_ = double.NegativeInfinity;

         return this;

@@ -14331,11 +15535,13 @@
         set { SetNanDouble(value); }

       }

       public Builder SetNanDouble(double value) {

+        PrepareBuilder();

         result.hasNanDouble = true;

         result.nanDouble_ = value;

         return this;

       }

       public Builder ClearNanDouble() {

+        PrepareBuilder();

         result.hasNanDouble = false;

         result.nanDouble_ = double.NaN;

         return this;

@@ -14349,11 +15555,13 @@
         set { SetInfFloat(value); }

       }

       public Builder SetInfFloat(float value) {

+        PrepareBuilder();

         result.hasInfFloat = true;

         result.infFloat_ = value;

         return this;

       }

       public Builder ClearInfFloat() {

+        PrepareBuilder();

         result.hasInfFloat = false;

         result.infFloat_ = float.PositiveInfinity;

         return this;

@@ -14367,11 +15575,13 @@
         set { SetNegInfFloat(value); }

       }

       public Builder SetNegInfFloat(float value) {

+        PrepareBuilder();

         result.hasNegInfFloat = true;

         result.negInfFloat_ = value;

         return this;

       }

       public Builder ClearNegInfFloat() {

+        PrepareBuilder();

         result.hasNegInfFloat = false;

         result.negInfFloat_ = float.NegativeInfinity;

         return this;

@@ -14385,11 +15595,13 @@
         set { SetNanFloat(value); }

       }

       public Builder SetNanFloat(float value) {

+        PrepareBuilder();

         result.hasNanFloat = true;

         result.nanFloat_ = value;

         return this;

       }

       public Builder ClearNanFloat() {

+        PrepareBuilder();

         result.hasNanFloat = false;

         result.nanFloat_ = float.NaN;

         return this;

@@ -14502,7 +15714,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(OneString prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -14512,21 +15724,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new OneString();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(OneString cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      OneString result = new OneString();

+      bool builderIsReadOnly;

+      OneString result;

+      

+      private OneString PrepareBuilder() {

+        if (builderIsReadOnly) {

+          OneString original = result;

+          result = new OneString();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override OneString MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new OneString();

+        result = DefaultInstance ?? new OneString();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -14538,12 +15777,11 @@
       }

       

       public override OneString BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        OneString returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -14557,6 +15795,7 @@
       

       public override Builder MergeFrom(OneString other) {

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

+        PrepareBuilder();

         if (other.HasData) {

           Data = other.Data;

         }

@@ -14569,6 +15808,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -14625,11 +15865,13 @@
       }

       public Builder SetData(string value) {

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

+        PrepareBuilder();

         result.hasData = true;

         result.data_ = value;

         return this;

       }

       public Builder ClearData() {

+        PrepareBuilder();

         result.hasData = false;

         result.data_ = "";

         return this;

@@ -14742,7 +15984,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(OneBytes prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -14752,21 +15994,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new OneBytes();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(OneBytes cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      OneBytes result = new OneBytes();

+      bool builderIsReadOnly;

+      OneBytes result;

+      

+      private OneBytes PrepareBuilder() {

+        if (builderIsReadOnly) {

+          OneBytes original = result;

+          result = new OneBytes();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override OneBytes MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new OneBytes();

+        result = DefaultInstance ?? new OneBytes();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -14778,12 +16047,11 @@
       }

       

       public override OneBytes BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        OneBytes returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -14797,6 +16065,7 @@
       

       public override Builder MergeFrom(OneBytes other) {

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

+        PrepareBuilder();

         if (other.HasData) {

           Data = other.Data;

         }

@@ -14809,6 +16078,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -14865,11 +16135,13 @@
       }

       public Builder SetData(pb::ByteString value) {

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

+        PrepareBuilder();

         result.hasData = true;

         result.data_ = value;

         return this;

       }

       public Builder ClearData() {

+        PrepareBuilder();

         result.hasData = false;

         result.data_ = pb::ByteString.Empty;

         return this;

@@ -15339,7 +16611,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestPackedTypes prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -15349,21 +16621,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestPackedTypes();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestPackedTypes cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestPackedTypes result = new TestPackedTypes();

+      bool builderIsReadOnly;

+      TestPackedTypes result;

+      

+      private TestPackedTypes PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestPackedTypes original = result;

+          result = new TestPackedTypes();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestPackedTypes MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestPackedTypes();

+        result = DefaultInstance ?? new TestPackedTypes();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -15375,8 +16674,8 @@
       }

       

       public override TestPackedTypes BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

         result.packedInt32_.MakeReadOnly();

         result.packedInt64_.MakeReadOnly();

@@ -15392,9 +16691,8 @@
         result.packedDouble_.MakeReadOnly();

         result.packedBool_.MakeReadOnly();

         result.packedEnum_.MakeReadOnly();

-        TestPackedTypes returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -15408,6 +16706,7 @@
       

       public override Builder MergeFrom(TestPackedTypes other) {

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

+        PrepareBuilder();

         if (other.packedInt32_.Count != 0) {

           base.AddRange(other.packedInt32_, result.packedInt32_);

         }

@@ -15459,6 +16758,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -15582,7 +16882,7 @@
       

       

       public pbc::IPopsicleList<int> PackedInt32List {

-        get { return result.packedInt32_; }

+        get { return PrepareBuilder().packedInt32_; }

       }

       public int PackedInt32Count {

         get { return result.PackedInt32Count; }

@@ -15591,24 +16891,28 @@
         return result.GetPackedInt32(index);

       }

       public Builder SetPackedInt32(int index, int value) {

+        PrepareBuilder();

         result.packedInt32_[index] = value;

         return this;

       }

       public Builder AddPackedInt32(int value) {

+        PrepareBuilder();

         result.packedInt32_.Add(value);

         return this;

       }

       public Builder AddRangePackedInt32(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedInt32_);

         return this;

       }

       public Builder ClearPackedInt32() {

+        PrepareBuilder();

         result.packedInt32_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<long> PackedInt64List {

-        get { return result.packedInt64_; }

+        get { return PrepareBuilder().packedInt64_; }

       }

       public int PackedInt64Count {

         get { return result.PackedInt64Count; }

@@ -15617,25 +16921,29 @@
         return result.GetPackedInt64(index);

       }

       public Builder SetPackedInt64(int index, long value) {

+        PrepareBuilder();

         result.packedInt64_[index] = value;

         return this;

       }

       public Builder AddPackedInt64(long value) {

+        PrepareBuilder();

         result.packedInt64_.Add(value);

         return this;

       }

       public Builder AddRangePackedInt64(scg::IEnumerable<long> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedInt64_);

         return this;

       }

       public Builder ClearPackedInt64() {

+        PrepareBuilder();

         result.packedInt64_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<uint> PackedUint32List {

-        get { return result.packedUint32_; }

+        get { return PrepareBuilder().packedUint32_; }

       }

       public int PackedUint32Count {

         get { return result.PackedUint32Count; }

@@ -15646,27 +16954,31 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetPackedUint32(int index, uint value) {

+        PrepareBuilder();

         result.packedUint32_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddPackedUint32(uint value) {

+        PrepareBuilder();

         result.packedUint32_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangePackedUint32(scg::IEnumerable<uint> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedUint32_);

         return this;

       }

       public Builder ClearPackedUint32() {

+        PrepareBuilder();

         result.packedUint32_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<ulong> PackedUint64List {

-        get { return result.packedUint64_; }

+        get { return PrepareBuilder().packedUint64_; }

       }

       public int PackedUint64Count {

         get { return result.PackedUint64Count; }

@@ -15677,26 +16989,30 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetPackedUint64(int index, ulong value) {

+        PrepareBuilder();

         result.packedUint64_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddPackedUint64(ulong value) {

+        PrepareBuilder();

         result.packedUint64_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangePackedUint64(scg::IEnumerable<ulong> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedUint64_);

         return this;

       }

       public Builder ClearPackedUint64() {

+        PrepareBuilder();

         result.packedUint64_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<int> PackedSint32List {

-        get { return result.packedSint32_; }

+        get { return PrepareBuilder().packedSint32_; }

       }

       public int PackedSint32Count {

         get { return result.PackedSint32Count; }

@@ -15705,24 +17021,28 @@
         return result.GetPackedSint32(index);

       }

       public Builder SetPackedSint32(int index, int value) {

+        PrepareBuilder();

         result.packedSint32_[index] = value;

         return this;

       }

       public Builder AddPackedSint32(int value) {

+        PrepareBuilder();

         result.packedSint32_.Add(value);

         return this;

       }

       public Builder AddRangePackedSint32(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedSint32_);

         return this;

       }

       public Builder ClearPackedSint32() {

+        PrepareBuilder();

         result.packedSint32_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<long> PackedSint64List {

-        get { return result.packedSint64_; }

+        get { return PrepareBuilder().packedSint64_; }

       }

       public int PackedSint64Count {

         get { return result.PackedSint64Count; }

@@ -15731,25 +17051,29 @@
         return result.GetPackedSint64(index);

       }

       public Builder SetPackedSint64(int index, long value) {

+        PrepareBuilder();

         result.packedSint64_[index] = value;

         return this;

       }

       public Builder AddPackedSint64(long value) {

+        PrepareBuilder();

         result.packedSint64_.Add(value);

         return this;

       }

       public Builder AddRangePackedSint64(scg::IEnumerable<long> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedSint64_);

         return this;

       }

       public Builder ClearPackedSint64() {

+        PrepareBuilder();

         result.packedSint64_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<uint> PackedFixed32List {

-        get { return result.packedFixed32_; }

+        get { return PrepareBuilder().packedFixed32_; }

       }

       public int PackedFixed32Count {

         get { return result.PackedFixed32Count; }

@@ -15760,27 +17084,31 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetPackedFixed32(int index, uint value) {

+        PrepareBuilder();

         result.packedFixed32_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddPackedFixed32(uint value) {

+        PrepareBuilder();

         result.packedFixed32_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangePackedFixed32(scg::IEnumerable<uint> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedFixed32_);

         return this;

       }

       public Builder ClearPackedFixed32() {

+        PrepareBuilder();

         result.packedFixed32_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<ulong> PackedFixed64List {

-        get { return result.packedFixed64_; }

+        get { return PrepareBuilder().packedFixed64_; }

       }

       public int PackedFixed64Count {

         get { return result.PackedFixed64Count; }

@@ -15791,26 +17119,30 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetPackedFixed64(int index, ulong value) {

+        PrepareBuilder();

         result.packedFixed64_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddPackedFixed64(ulong value) {

+        PrepareBuilder();

         result.packedFixed64_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangePackedFixed64(scg::IEnumerable<ulong> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedFixed64_);

         return this;

       }

       public Builder ClearPackedFixed64() {

+        PrepareBuilder();

         result.packedFixed64_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<int> PackedSfixed32List {

-        get { return result.packedSfixed32_; }

+        get { return PrepareBuilder().packedSfixed32_; }

       }

       public int PackedSfixed32Count {

         get { return result.PackedSfixed32Count; }

@@ -15819,24 +17151,28 @@
         return result.GetPackedSfixed32(index);

       }

       public Builder SetPackedSfixed32(int index, int value) {

+        PrepareBuilder();

         result.packedSfixed32_[index] = value;

         return this;

       }

       public Builder AddPackedSfixed32(int value) {

+        PrepareBuilder();

         result.packedSfixed32_.Add(value);

         return this;

       }

       public Builder AddRangePackedSfixed32(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedSfixed32_);

         return this;

       }

       public Builder ClearPackedSfixed32() {

+        PrepareBuilder();

         result.packedSfixed32_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<long> PackedSfixed64List {

-        get { return result.packedSfixed64_; }

+        get { return PrepareBuilder().packedSfixed64_; }

       }

       public int PackedSfixed64Count {

         get { return result.PackedSfixed64Count; }

@@ -15845,24 +17181,28 @@
         return result.GetPackedSfixed64(index);

       }

       public Builder SetPackedSfixed64(int index, long value) {

+        PrepareBuilder();

         result.packedSfixed64_[index] = value;

         return this;

       }

       public Builder AddPackedSfixed64(long value) {

+        PrepareBuilder();

         result.packedSfixed64_.Add(value);

         return this;

       }

       public Builder AddRangePackedSfixed64(scg::IEnumerable<long> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedSfixed64_);

         return this;

       }

       public Builder ClearPackedSfixed64() {

+        PrepareBuilder();

         result.packedSfixed64_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<float> PackedFloatList {

-        get { return result.packedFloat_; }

+        get { return PrepareBuilder().packedFloat_; }

       }

       public int PackedFloatCount {

         get { return result.PackedFloatCount; }

@@ -15871,24 +17211,28 @@
         return result.GetPackedFloat(index);

       }

       public Builder SetPackedFloat(int index, float value) {

+        PrepareBuilder();

         result.packedFloat_[index] = value;

         return this;

       }

       public Builder AddPackedFloat(float value) {

+        PrepareBuilder();

         result.packedFloat_.Add(value);

         return this;

       }

       public Builder AddRangePackedFloat(scg::IEnumerable<float> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedFloat_);

         return this;

       }

       public Builder ClearPackedFloat() {

+        PrepareBuilder();

         result.packedFloat_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<double> PackedDoubleList {

-        get { return result.packedDouble_; }

+        get { return PrepareBuilder().packedDouble_; }

       }

       public int PackedDoubleCount {

         get { return result.PackedDoubleCount; }

@@ -15897,24 +17241,28 @@
         return result.GetPackedDouble(index);

       }

       public Builder SetPackedDouble(int index, double value) {

+        PrepareBuilder();

         result.packedDouble_[index] = value;

         return this;

       }

       public Builder AddPackedDouble(double value) {

+        PrepareBuilder();

         result.packedDouble_.Add(value);

         return this;

       }

       public Builder AddRangePackedDouble(scg::IEnumerable<double> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedDouble_);

         return this;

       }

       public Builder ClearPackedDouble() {

+        PrepareBuilder();

         result.packedDouble_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<bool> PackedBoolList {

-        get { return result.packedBool_; }

+        get { return PrepareBuilder().packedBool_; }

       }

       public int PackedBoolCount {

         get { return result.PackedBoolCount; }

@@ -15923,24 +17271,28 @@
         return result.GetPackedBool(index);

       }

       public Builder SetPackedBool(int index, bool value) {

+        PrepareBuilder();

         result.packedBool_[index] = value;

         return this;

       }

       public Builder AddPackedBool(bool value) {

+        PrepareBuilder();

         result.packedBool_.Add(value);

         return this;

       }

       public Builder AddRangePackedBool(scg::IEnumerable<bool> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedBool_);

         return this;

       }

       public Builder ClearPackedBool() {

+        PrepareBuilder();

         result.packedBool_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> PackedEnumList {

-        get { return result.packedEnum_; }

+        get { return PrepareBuilder().packedEnum_; }

       }

       public int PackedEnumCount {

         get { return result.PackedEnumCount; }

@@ -15949,18 +17301,22 @@
         return result.GetPackedEnum(index);

       }

       public Builder SetPackedEnum(int index, global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {

+        PrepareBuilder();

         result.packedEnum_[index] = value;

         return this;

       }

       public Builder AddPackedEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {

+        PrepareBuilder();

         result.packedEnum_.Add(value);

         return this;

       }

       public Builder AddRangePackedEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedEnum_);

         return this;

       }

       public Builder ClearPackedEnum() {

+        PrepareBuilder();

         result.packedEnum_.Clear();

         return this;

       }

@@ -16374,7 +17730,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestUnpackedTypes prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -16384,21 +17740,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestUnpackedTypes();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestUnpackedTypes cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestUnpackedTypes result = new TestUnpackedTypes();

+      bool builderIsReadOnly;

+      TestUnpackedTypes result;

+      

+      private TestUnpackedTypes PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestUnpackedTypes original = result;

+          result = new TestUnpackedTypes();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestUnpackedTypes MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestUnpackedTypes();

+        result = DefaultInstance ?? new TestUnpackedTypes();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -16410,8 +17793,8 @@
       }

       

       public override TestUnpackedTypes BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

         result.unpackedInt32_.MakeReadOnly();

         result.unpackedInt64_.MakeReadOnly();

@@ -16427,9 +17810,8 @@
         result.unpackedDouble_.MakeReadOnly();

         result.unpackedBool_.MakeReadOnly();

         result.unpackedEnum_.MakeReadOnly();

-        TestUnpackedTypes returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -16443,6 +17825,7 @@
       

       public override Builder MergeFrom(TestUnpackedTypes other) {

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

+        PrepareBuilder();

         if (other.unpackedInt32_.Count != 0) {

           base.AddRange(other.unpackedInt32_, result.unpackedInt32_);

         }

@@ -16494,6 +17877,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -16617,7 +18001,7 @@
       

       

       public pbc::IPopsicleList<int> UnpackedInt32List {

-        get { return result.unpackedInt32_; }

+        get { return PrepareBuilder().unpackedInt32_; }

       }

       public int UnpackedInt32Count {

         get { return result.UnpackedInt32Count; }

@@ -16626,24 +18010,28 @@
         return result.GetUnpackedInt32(index);

       }

       public Builder SetUnpackedInt32(int index, int value) {

+        PrepareBuilder();

         result.unpackedInt32_[index] = value;

         return this;

       }

       public Builder AddUnpackedInt32(int value) {

+        PrepareBuilder();

         result.unpackedInt32_.Add(value);

         return this;

       }

       public Builder AddRangeUnpackedInt32(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedInt32_);

         return this;

       }

       public Builder ClearUnpackedInt32() {

+        PrepareBuilder();

         result.unpackedInt32_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<long> UnpackedInt64List {

-        get { return result.unpackedInt64_; }

+        get { return PrepareBuilder().unpackedInt64_; }

       }

       public int UnpackedInt64Count {

         get { return result.UnpackedInt64Count; }

@@ -16652,25 +18040,29 @@
         return result.GetUnpackedInt64(index);

       }

       public Builder SetUnpackedInt64(int index, long value) {

+        PrepareBuilder();

         result.unpackedInt64_[index] = value;

         return this;

       }

       public Builder AddUnpackedInt64(long value) {

+        PrepareBuilder();

         result.unpackedInt64_.Add(value);

         return this;

       }

       public Builder AddRangeUnpackedInt64(scg::IEnumerable<long> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedInt64_);

         return this;

       }

       public Builder ClearUnpackedInt64() {

+        PrepareBuilder();

         result.unpackedInt64_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<uint> UnpackedUint32List {

-        get { return result.unpackedUint32_; }

+        get { return PrepareBuilder().unpackedUint32_; }

       }

       public int UnpackedUint32Count {

         get { return result.UnpackedUint32Count; }

@@ -16681,27 +18073,31 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetUnpackedUint32(int index, uint value) {

+        PrepareBuilder();

         result.unpackedUint32_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddUnpackedUint32(uint value) {

+        PrepareBuilder();

         result.unpackedUint32_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangeUnpackedUint32(scg::IEnumerable<uint> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedUint32_);

         return this;

       }

       public Builder ClearUnpackedUint32() {

+        PrepareBuilder();

         result.unpackedUint32_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<ulong> UnpackedUint64List {

-        get { return result.unpackedUint64_; }

+        get { return PrepareBuilder().unpackedUint64_; }

       }

       public int UnpackedUint64Count {

         get { return result.UnpackedUint64Count; }

@@ -16712,26 +18108,30 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetUnpackedUint64(int index, ulong value) {

+        PrepareBuilder();

         result.unpackedUint64_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddUnpackedUint64(ulong value) {

+        PrepareBuilder();

         result.unpackedUint64_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangeUnpackedUint64(scg::IEnumerable<ulong> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedUint64_);

         return this;

       }

       public Builder ClearUnpackedUint64() {

+        PrepareBuilder();

         result.unpackedUint64_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<int> UnpackedSint32List {

-        get { return result.unpackedSint32_; }

+        get { return PrepareBuilder().unpackedSint32_; }

       }

       public int UnpackedSint32Count {

         get { return result.UnpackedSint32Count; }

@@ -16740,24 +18140,28 @@
         return result.GetUnpackedSint32(index);

       }

       public Builder SetUnpackedSint32(int index, int value) {

+        PrepareBuilder();

         result.unpackedSint32_[index] = value;

         return this;

       }

       public Builder AddUnpackedSint32(int value) {

+        PrepareBuilder();

         result.unpackedSint32_.Add(value);

         return this;

       }

       public Builder AddRangeUnpackedSint32(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedSint32_);

         return this;

       }

       public Builder ClearUnpackedSint32() {

+        PrepareBuilder();

         result.unpackedSint32_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<long> UnpackedSint64List {

-        get { return result.unpackedSint64_; }

+        get { return PrepareBuilder().unpackedSint64_; }

       }

       public int UnpackedSint64Count {

         get { return result.UnpackedSint64Count; }

@@ -16766,25 +18170,29 @@
         return result.GetUnpackedSint64(index);

       }

       public Builder SetUnpackedSint64(int index, long value) {

+        PrepareBuilder();

         result.unpackedSint64_[index] = value;

         return this;

       }

       public Builder AddUnpackedSint64(long value) {

+        PrepareBuilder();

         result.unpackedSint64_.Add(value);

         return this;

       }

       public Builder AddRangeUnpackedSint64(scg::IEnumerable<long> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedSint64_);

         return this;

       }

       public Builder ClearUnpackedSint64() {

+        PrepareBuilder();

         result.unpackedSint64_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<uint> UnpackedFixed32List {

-        get { return result.unpackedFixed32_; }

+        get { return PrepareBuilder().unpackedFixed32_; }

       }

       public int UnpackedFixed32Count {

         get { return result.UnpackedFixed32Count; }

@@ -16795,27 +18203,31 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetUnpackedFixed32(int index, uint value) {

+        PrepareBuilder();

         result.unpackedFixed32_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddUnpackedFixed32(uint value) {

+        PrepareBuilder();

         result.unpackedFixed32_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangeUnpackedFixed32(scg::IEnumerable<uint> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedFixed32_);

         return this;

       }

       public Builder ClearUnpackedFixed32() {

+        PrepareBuilder();

         result.unpackedFixed32_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<ulong> UnpackedFixed64List {

-        get { return result.unpackedFixed64_; }

+        get { return PrepareBuilder().unpackedFixed64_; }

       }

       public int UnpackedFixed64Count {

         get { return result.UnpackedFixed64Count; }

@@ -16826,26 +18238,30 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetUnpackedFixed64(int index, ulong value) {

+        PrepareBuilder();

         result.unpackedFixed64_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddUnpackedFixed64(ulong value) {

+        PrepareBuilder();

         result.unpackedFixed64_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangeUnpackedFixed64(scg::IEnumerable<ulong> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedFixed64_);

         return this;

       }

       public Builder ClearUnpackedFixed64() {

+        PrepareBuilder();

         result.unpackedFixed64_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<int> UnpackedSfixed32List {

-        get { return result.unpackedSfixed32_; }

+        get { return PrepareBuilder().unpackedSfixed32_; }

       }

       public int UnpackedSfixed32Count {

         get { return result.UnpackedSfixed32Count; }

@@ -16854,24 +18270,28 @@
         return result.GetUnpackedSfixed32(index);

       }

       public Builder SetUnpackedSfixed32(int index, int value) {

+        PrepareBuilder();

         result.unpackedSfixed32_[index] = value;

         return this;

       }

       public Builder AddUnpackedSfixed32(int value) {

+        PrepareBuilder();

         result.unpackedSfixed32_.Add(value);

         return this;

       }

       public Builder AddRangeUnpackedSfixed32(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedSfixed32_);

         return this;

       }

       public Builder ClearUnpackedSfixed32() {

+        PrepareBuilder();

         result.unpackedSfixed32_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<long> UnpackedSfixed64List {

-        get { return result.unpackedSfixed64_; }

+        get { return PrepareBuilder().unpackedSfixed64_; }

       }

       public int UnpackedSfixed64Count {

         get { return result.UnpackedSfixed64Count; }

@@ -16880,24 +18300,28 @@
         return result.GetUnpackedSfixed64(index);

       }

       public Builder SetUnpackedSfixed64(int index, long value) {

+        PrepareBuilder();

         result.unpackedSfixed64_[index] = value;

         return this;

       }

       public Builder AddUnpackedSfixed64(long value) {

+        PrepareBuilder();

         result.unpackedSfixed64_.Add(value);

         return this;

       }

       public Builder AddRangeUnpackedSfixed64(scg::IEnumerable<long> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedSfixed64_);

         return this;

       }

       public Builder ClearUnpackedSfixed64() {

+        PrepareBuilder();

         result.unpackedSfixed64_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<float> UnpackedFloatList {

-        get { return result.unpackedFloat_; }

+        get { return PrepareBuilder().unpackedFloat_; }

       }

       public int UnpackedFloatCount {

         get { return result.UnpackedFloatCount; }

@@ -16906,24 +18330,28 @@
         return result.GetUnpackedFloat(index);

       }

       public Builder SetUnpackedFloat(int index, float value) {

+        PrepareBuilder();

         result.unpackedFloat_[index] = value;

         return this;

       }

       public Builder AddUnpackedFloat(float value) {

+        PrepareBuilder();

         result.unpackedFloat_.Add(value);

         return this;

       }

       public Builder AddRangeUnpackedFloat(scg::IEnumerable<float> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedFloat_);

         return this;

       }

       public Builder ClearUnpackedFloat() {

+        PrepareBuilder();

         result.unpackedFloat_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<double> UnpackedDoubleList {

-        get { return result.unpackedDouble_; }

+        get { return PrepareBuilder().unpackedDouble_; }

       }

       public int UnpackedDoubleCount {

         get { return result.UnpackedDoubleCount; }

@@ -16932,24 +18360,28 @@
         return result.GetUnpackedDouble(index);

       }

       public Builder SetUnpackedDouble(int index, double value) {

+        PrepareBuilder();

         result.unpackedDouble_[index] = value;

         return this;

       }

       public Builder AddUnpackedDouble(double value) {

+        PrepareBuilder();

         result.unpackedDouble_.Add(value);

         return this;

       }

       public Builder AddRangeUnpackedDouble(scg::IEnumerable<double> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedDouble_);

         return this;

       }

       public Builder ClearUnpackedDouble() {

+        PrepareBuilder();

         result.unpackedDouble_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<bool> UnpackedBoolList {

-        get { return result.unpackedBool_; }

+        get { return PrepareBuilder().unpackedBool_; }

       }

       public int UnpackedBoolCount {

         get { return result.UnpackedBoolCount; }

@@ -16958,24 +18390,28 @@
         return result.GetUnpackedBool(index);

       }

       public Builder SetUnpackedBool(int index, bool value) {

+        PrepareBuilder();

         result.unpackedBool_[index] = value;

         return this;

       }

       public Builder AddUnpackedBool(bool value) {

+        PrepareBuilder();

         result.unpackedBool_.Add(value);

         return this;

       }

       public Builder AddRangeUnpackedBool(scg::IEnumerable<bool> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedBool_);

         return this;

       }

       public Builder ClearUnpackedBool() {

+        PrepareBuilder();

         result.unpackedBool_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> UnpackedEnumList {

-        get { return result.unpackedEnum_; }

+        get { return PrepareBuilder().unpackedEnum_; }

       }

       public int UnpackedEnumCount {

         get { return result.UnpackedEnumCount; }

@@ -16984,18 +18420,22 @@
         return result.GetUnpackedEnum(index);

       }

       public Builder SetUnpackedEnum(int index, global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {

+        PrepareBuilder();

         result.unpackedEnum_[index] = value;

         return this;

       }

       public Builder AddUnpackedEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {

+        PrepareBuilder();

         result.unpackedEnum_.Add(value);

         return this;

       }

       public Builder AddRangeUnpackedEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> values) {

+        PrepareBuilder();

         base.AddRange(values, result.unpackedEnum_);

         return this;

       }

       public Builder ClearUnpackedEnum() {

+        PrepareBuilder();

         result.unpackedEnum_.Clear();

         return this;

       }

@@ -17095,7 +18535,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestPackedExtensions prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -17105,21 +18545,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestPackedExtensions();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestPackedExtensions cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestPackedExtensions result = new TestPackedExtensions();

+      bool builderIsReadOnly;

+      TestPackedExtensions result;

+      

+      private TestPackedExtensions PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestPackedExtensions original = result;

+          result = new TestPackedExtensions();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestPackedExtensions MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestPackedExtensions();

+        result = DefaultInstance ?? new TestPackedExtensions();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -17131,12 +18598,11 @@
       }

       

       public override TestPackedExtensions BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestPackedExtensions returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -17150,6 +18616,7 @@
       

       public override Builder MergeFrom(TestPackedExtensions other) {

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

+        PrepareBuilder();

           this.MergeExtensionFields(other);

         this.MergeUnknownFields(other.UnknownFields);

         return this;

@@ -17160,6 +18627,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -17298,7 +18766,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestUnpackedExtensions prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -17308,21 +18776,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestUnpackedExtensions();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestUnpackedExtensions cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestUnpackedExtensions result = new TestUnpackedExtensions();

+      bool builderIsReadOnly;

+      TestUnpackedExtensions result;

+      

+      private TestUnpackedExtensions PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestUnpackedExtensions original = result;

+          result = new TestUnpackedExtensions();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestUnpackedExtensions MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestUnpackedExtensions();

+        result = DefaultInstance ?? new TestUnpackedExtensions();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -17334,12 +18829,11 @@
       }

       

       public override TestUnpackedExtensions BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestUnpackedExtensions returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -17353,6 +18847,7 @@
       

       public override Builder MergeFrom(TestUnpackedExtensions other) {

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

+        PrepareBuilder();

           this.MergeExtensionFields(other);

         this.MergeUnknownFields(other.UnknownFields);

         return this;

@@ -17363,6 +18858,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -17553,7 +19049,7 @@
         public override Builder ToBuilder() { return CreateBuilder(this); }

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

         public static Builder CreateBuilder(DynamicMessageType prototype) {

-          return (Builder) new Builder().MergeFrom(prototype);

+          return new Builder(prototype);

         }

         

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

@@ -17563,21 +19059,48 @@
           protected override Builder ThisBuilder {

             get { return this; }

           }

-          public Builder() {}

+          public Builder() {

+            result = DefaultInstance ?? new DynamicMessageType();

+            builderIsReadOnly = result == DefaultInstance;

+          }

+          internal Builder(DynamicMessageType cloneFrom) {

+            result = cloneFrom;

+            builderIsReadOnly = true;

+          }

           

-          DynamicMessageType result = new DynamicMessageType();

+          bool builderIsReadOnly;

+          DynamicMessageType result;

+          

+          private DynamicMessageType PrepareBuilder() {

+            if (builderIsReadOnly) {

+              DynamicMessageType original = result;

+              result = new DynamicMessageType();

+              builderIsReadOnly = false;

+              MergeFrom(original);

+            }

+            return result;

+          }

+          

+          public override bool IsInitialized {

+            get { return result.IsInitialized; }

+          }

           

           protected override DynamicMessageType MessageBeingBuilt {

-            get { return result; }

+            get { return PrepareBuilder(); }

           }

           

           public override Builder Clear() {

-            result = new DynamicMessageType();

+            result = DefaultInstance ?? new DynamicMessageType();

+            builderIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

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

+            if (builderIsReadOnly) {

+              return new Builder(result);

+            } else {

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

+            }

           }

           

           public override pbd::MessageDescriptor DescriptorForType {

@@ -17589,12 +19112,11 @@
           }

           

           public override DynamicMessageType BuildPartial() {

-            if (result == null) {

-              throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+            if (builderIsReadOnly) {

+              return result;

             }

-            DynamicMessageType returnMe = result;

-            result = null;

-            return returnMe;

+            builderIsReadOnly = true;

+            return result;

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -17608,6 +19130,7 @@
           

           public override Builder MergeFrom(DynamicMessageType other) {

             if (other == global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance) return this;

+            PrepareBuilder();

             if (other.HasDynamicField) {

               DynamicField = other.DynamicField;

             }

@@ -17620,6 +19143,7 @@
           }

           

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

+            PrepareBuilder();

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -17675,11 +19199,13 @@
             set { SetDynamicField(value); }

           }

           public Builder SetDynamicField(int value) {

+            PrepareBuilder();

             result.hasDynamicField = true;

             result.dynamicField_ = value;

             return this;

           }

           public Builder ClearDynamicField() {

+            PrepareBuilder();

             result.hasDynamicField = false;

             result.dynamicField_ = 0;

             return this;

@@ -17883,7 +19409,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestDynamicExtensions prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -17893,21 +19419,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestDynamicExtensions();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestDynamicExtensions cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestDynamicExtensions result = new TestDynamicExtensions();

+      bool builderIsReadOnly;

+      TestDynamicExtensions result;

+      

+      private TestDynamicExtensions PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestDynamicExtensions original = result;

+          result = new TestDynamicExtensions();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestDynamicExtensions MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestDynamicExtensions();

+        result = DefaultInstance ?? new TestDynamicExtensions();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -17919,14 +19472,13 @@
       }

       

       public override TestDynamicExtensions BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

         result.repeatedExtension_.MakeReadOnly();

         result.packedExtension_.MakeReadOnly();

-        TestDynamicExtensions returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -17940,6 +19492,7 @@
       

       public override Builder MergeFrom(TestDynamicExtensions other) {

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

+        PrepareBuilder();

         if (other.HasScalarExtension) {

           ScalarExtension = other.ScalarExtension;

         }

@@ -17970,6 +19523,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -18078,11 +19632,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetScalarExtension(uint value) {

+        PrepareBuilder();

         result.hasScalarExtension = true;

         result.scalarExtension_ = value;

         return this;

       }

       public Builder ClearScalarExtension() {

+        PrepareBuilder();

         result.hasScalarExtension = false;

         result.scalarExtension_ = 0;

         return this;

@@ -18096,11 +19652,13 @@
         set { SetEnumExtension(value); }

       }

       public Builder SetEnumExtension(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {

+        PrepareBuilder();

         result.hasEnumExtension = true;

         result.enumExtension_ = value;

         return this;

       }

       public Builder ClearEnumExtension() {

+        PrepareBuilder();

         result.hasEnumExtension = false;

         result.enumExtension_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;

         return this;

@@ -18114,11 +19672,13 @@
         set { SetDynamicEnumExtension(value); }

       }

       public Builder SetDynamicEnumExtension(global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType value) {

+        PrepareBuilder();

         result.hasDynamicEnumExtension = true;

         result.dynamicEnumExtension_ = value;

         return this;

       }

       public Builder ClearDynamicEnumExtension() {

+        PrepareBuilder();

         result.hasDynamicEnumExtension = false;

         result.dynamicEnumExtension_ = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType.DYNAMIC_FOO;

         return this;

@@ -18133,18 +19693,21 @@
       }

       public Builder SetMessageExtension(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {

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

+        PrepareBuilder();

         result.hasMessageExtension = true;

         result.messageExtension_ = value;

         return this;

       }

       public Builder SetMessageExtension(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasMessageExtension = true;

         result.messageExtension_ = builderForValue.Build();

         return this;

       }

       public Builder MergeMessageExtension(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {

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

+        PrepareBuilder();

         if (result.hasMessageExtension &&

             result.messageExtension_ != global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance) {

             result.messageExtension_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder(result.messageExtension_).MergeFrom(value).BuildPartial();

@@ -18155,6 +19718,7 @@
         return this;

       }

       public Builder ClearMessageExtension() {

+        PrepareBuilder();

         result.hasMessageExtension = false;

         result.messageExtension_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance;

         return this;

@@ -18169,18 +19733,21 @@
       }

       public Builder SetDynamicMessageExtension(global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType value) {

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

+        PrepareBuilder();

         result.hasDynamicMessageExtension = true;

         result.dynamicMessageExtension_ = value;

         return this;

       }

       public Builder SetDynamicMessageExtension(global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasDynamicMessageExtension = true;

         result.dynamicMessageExtension_ = builderForValue.Build();

         return this;

       }

       public Builder MergeDynamicMessageExtension(global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType value) {

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

+        PrepareBuilder();

         if (result.hasDynamicMessageExtension &&

             result.dynamicMessageExtension_ != global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance) {

             result.dynamicMessageExtension_ = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.CreateBuilder(result.dynamicMessageExtension_).MergeFrom(value).BuildPartial();

@@ -18191,13 +19758,14 @@
         return this;

       }

       public Builder ClearDynamicMessageExtension() {

+        PrepareBuilder();

         result.hasDynamicMessageExtension = false;

         result.dynamicMessageExtension_ = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance;

         return this;

       }

       

       public pbc::IPopsicleList<string> RepeatedExtensionList {

-        get { return result.repeatedExtension_; }

+        get { return PrepareBuilder().repeatedExtension_; }

       }

       public int RepeatedExtensionCount {

         get { return result.RepeatedExtensionCount; }

@@ -18207,25 +19775,29 @@
       }

       public Builder SetRepeatedExtension(int index, string value) {

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

+        PrepareBuilder();

         result.repeatedExtension_[index] = value;

         return this;

       }

       public Builder AddRepeatedExtension(string value) {

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

+        PrepareBuilder();

         result.repeatedExtension_.Add(value);

         return this;

       }

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

+        PrepareBuilder();

         base.AddRange(values, result.repeatedExtension_);

         return this;

       }

       public Builder ClearRepeatedExtension() {

+        PrepareBuilder();

         result.repeatedExtension_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<int> PackedExtensionList {

-        get { return result.packedExtension_; }

+        get { return PrepareBuilder().packedExtension_; }

       }

       public int PackedExtensionCount {

         get { return result.PackedExtensionCount; }

@@ -18234,18 +19806,22 @@
         return result.GetPackedExtension(index);

       }

       public Builder SetPackedExtension(int index, int value) {

+        PrepareBuilder();

         result.packedExtension_[index] = value;

         return this;

       }

       public Builder AddPackedExtension(int value) {

+        PrepareBuilder();

         result.packedExtension_.Add(value);

         return this;

       }

       public Builder AddRangePackedExtension(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.packedExtension_);

         return this;

       }

       public Builder ClearPackedExtension() {

+        PrepareBuilder();

         result.packedExtension_.Clear();

         return this;

       }

@@ -18479,7 +20055,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestRepeatedScalarDifferentTagSizes prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -18489,21 +20065,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestRepeatedScalarDifferentTagSizes();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestRepeatedScalarDifferentTagSizes cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestRepeatedScalarDifferentTagSizes result = new TestRepeatedScalarDifferentTagSizes();

+      bool builderIsReadOnly;

+      TestRepeatedScalarDifferentTagSizes result;

+      

+      private TestRepeatedScalarDifferentTagSizes PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestRepeatedScalarDifferentTagSizes original = result;

+          result = new TestRepeatedScalarDifferentTagSizes();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestRepeatedScalarDifferentTagSizes MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestRepeatedScalarDifferentTagSizes();

+        result = DefaultInstance ?? new TestRepeatedScalarDifferentTagSizes();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -18515,8 +20118,8 @@
       }

       

       public override TestRepeatedScalarDifferentTagSizes BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

         result.repeatedFixed32_.MakeReadOnly();

         result.repeatedInt32_.MakeReadOnly();

@@ -18524,9 +20127,8 @@
         result.repeatedInt64_.MakeReadOnly();

         result.repeatedFloat_.MakeReadOnly();

         result.repeatedUint64_.MakeReadOnly();

-        TestRepeatedScalarDifferentTagSizes returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -18540,6 +20142,7 @@
       

       public override Builder MergeFrom(TestRepeatedScalarDifferentTagSizes other) {

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

+        PrepareBuilder();

         if (other.repeatedFixed32_.Count != 0) {

           base.AddRange(other.repeatedFixed32_, result.repeatedFixed32_);

         }

@@ -18567,6 +20170,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -18642,7 +20246,7 @@
       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<uint> RepeatedFixed32List {

-        get { return result.repeatedFixed32_; }

+        get { return PrepareBuilder().repeatedFixed32_; }

       }

       public int RepeatedFixed32Count {

         get { return result.RepeatedFixed32Count; }

@@ -18653,26 +20257,30 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetRepeatedFixed32(int index, uint value) {

+        PrepareBuilder();

         result.repeatedFixed32_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRepeatedFixed32(uint value) {

+        PrepareBuilder();

         result.repeatedFixed32_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangeRepeatedFixed32(scg::IEnumerable<uint> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedFixed32_);

         return this;

       }

       public Builder ClearRepeatedFixed32() {

+        PrepareBuilder();

         result.repeatedFixed32_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<int> RepeatedInt32List {

-        get { return result.repeatedInt32_; }

+        get { return PrepareBuilder().repeatedInt32_; }

       }

       public int RepeatedInt32Count {

         get { return result.RepeatedInt32Count; }

@@ -18681,25 +20289,29 @@
         return result.GetRepeatedInt32(index);

       }

       public Builder SetRepeatedInt32(int index, int value) {

+        PrepareBuilder();

         result.repeatedInt32_[index] = value;

         return this;

       }

       public Builder AddRepeatedInt32(int value) {

+        PrepareBuilder();

         result.repeatedInt32_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedInt32(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedInt32_);

         return this;

       }

       public Builder ClearRepeatedInt32() {

+        PrepareBuilder();

         result.repeatedInt32_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<ulong> RepeatedFixed64List {

-        get { return result.repeatedFixed64_; }

+        get { return PrepareBuilder().repeatedFixed64_; }

       }

       public int RepeatedFixed64Count {

         get { return result.RepeatedFixed64Count; }

@@ -18710,26 +20322,30 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetRepeatedFixed64(int index, ulong value) {

+        PrepareBuilder();

         result.repeatedFixed64_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRepeatedFixed64(ulong value) {

+        PrepareBuilder();

         result.repeatedFixed64_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangeRepeatedFixed64(scg::IEnumerable<ulong> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedFixed64_);

         return this;

       }

       public Builder ClearRepeatedFixed64() {

+        PrepareBuilder();

         result.repeatedFixed64_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<long> RepeatedInt64List {

-        get { return result.repeatedInt64_; }

+        get { return PrepareBuilder().repeatedInt64_; }

       }

       public int RepeatedInt64Count {

         get { return result.RepeatedInt64Count; }

@@ -18738,24 +20354,28 @@
         return result.GetRepeatedInt64(index);

       }

       public Builder SetRepeatedInt64(int index, long value) {

+        PrepareBuilder();

         result.repeatedInt64_[index] = value;

         return this;

       }

       public Builder AddRepeatedInt64(long value) {

+        PrepareBuilder();

         result.repeatedInt64_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedInt64(scg::IEnumerable<long> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedInt64_);

         return this;

       }

       public Builder ClearRepeatedInt64() {

+        PrepareBuilder();

         result.repeatedInt64_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<float> RepeatedFloatList {

-        get { return result.repeatedFloat_; }

+        get { return PrepareBuilder().repeatedFloat_; }

       }

       public int RepeatedFloatCount {

         get { return result.RepeatedFloatCount; }

@@ -18764,25 +20384,29 @@
         return result.GetRepeatedFloat(index);

       }

       public Builder SetRepeatedFloat(int index, float value) {

+        PrepareBuilder();

         result.repeatedFloat_[index] = value;

         return this;

       }

       public Builder AddRepeatedFloat(float value) {

+        PrepareBuilder();

         result.repeatedFloat_.Add(value);

         return this;

       }

       public Builder AddRangeRepeatedFloat(scg::IEnumerable<float> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedFloat_);

         return this;

       }

       public Builder ClearRepeatedFloat() {

+        PrepareBuilder();

         result.repeatedFloat_.Clear();

         return this;

       }

       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<ulong> RepeatedUint64List {

-        get { return result.repeatedUint64_; }

+        get { return PrepareBuilder().repeatedUint64_; }

       }

       public int RepeatedUint64Count {

         get { return result.RepeatedUint64Count; }

@@ -18793,20 +20417,24 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetRepeatedUint64(int index, ulong value) {

+        PrepareBuilder();

         result.repeatedUint64_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRepeatedUint64(ulong value) {

+        PrepareBuilder();

         result.repeatedUint64_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangeRepeatedUint64(scg::IEnumerable<ulong> values) {

+        PrepareBuilder();

         base.AddRange(values, result.repeatedUint64_);

         return this;

       }

       public Builder ClearRepeatedUint64() {

+        PrepareBuilder();

         result.repeatedUint64_.Clear();

         return this;

       }

@@ -18902,7 +20530,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(FooRequest prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -18912,21 +20540,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new FooRequest();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(FooRequest cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      FooRequest result = new FooRequest();

+      bool builderIsReadOnly;

+      FooRequest result;

+      

+      private FooRequest PrepareBuilder() {

+        if (builderIsReadOnly) {

+          FooRequest original = result;

+          result = new FooRequest();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override FooRequest MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new FooRequest();

+        result = DefaultInstance ?? new FooRequest();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -18938,12 +20593,11 @@
       }

       

       public override FooRequest BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        FooRequest returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -18957,6 +20611,7 @@
       

       public override Builder MergeFrom(FooRequest other) {

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

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -18966,6 +20621,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -19100,7 +20756,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(FooResponse prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -19110,21 +20766,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new FooResponse();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(FooResponse cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      FooResponse result = new FooResponse();

+      bool builderIsReadOnly;

+      FooResponse result;

+      

+      private FooResponse PrepareBuilder() {

+        if (builderIsReadOnly) {

+          FooResponse original = result;

+          result = new FooResponse();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override FooResponse MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new FooResponse();

+        result = DefaultInstance ?? new FooResponse();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -19136,12 +20819,11 @@
       }

       

       public override FooResponse BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        FooResponse returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -19155,6 +20837,7 @@
       

       public override Builder MergeFrom(FooResponse other) {

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

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -19164,6 +20847,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -19298,7 +20982,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(BarRequest prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -19308,21 +20992,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new BarRequest();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(BarRequest cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      BarRequest result = new BarRequest();

+      bool builderIsReadOnly;

+      BarRequest result;

+      

+      private BarRequest PrepareBuilder() {

+        if (builderIsReadOnly) {

+          BarRequest original = result;

+          result = new BarRequest();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override BarRequest MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new BarRequest();

+        result = DefaultInstance ?? new BarRequest();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -19334,12 +21045,11 @@
       }

       

       public override BarRequest BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        BarRequest returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -19353,6 +21063,7 @@
       

       public override Builder MergeFrom(BarRequest other) {

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

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -19362,6 +21073,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -19496,7 +21208,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(BarResponse prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -19506,21 +21218,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new BarResponse();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(BarResponse cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      BarResponse result = new BarResponse();

+      bool builderIsReadOnly;

+      BarResponse result;

+      

+      private BarResponse PrepareBuilder() {

+        if (builderIsReadOnly) {

+          BarResponse original = result;

+          result = new BarResponse();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override BarResponse MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new BarResponse();

+        result = DefaultInstance ?? new BarResponse();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -19532,12 +21271,11 @@
       }

       

       public override BarResponse BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        BarResponse returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -19551,6 +21289,7 @@
       

       public override Builder MergeFrom(BarResponse other) {

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

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -19560,6 +21299,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;