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

#import "Fabric_info.pb.h"
// @@protoc_insertion_point(imports)

@implementation FabricInfoRoot
static PBExtensionRegistry* extensionRegistry = nil;
+ (PBExtensionRegistry*) extensionRegistry {
  return extensionRegistry;
}

+ (void) initialize {
  if (self == [FabricInfoRoot class]) {
    PBMutableExtensionRegistry* registry = [PBMutableExtensionRegistry registry];
    [self registerAllExtensions:registry];
    extensionRegistry = registry;
  }
}
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry {
}
@end

@interface FabricInfo ()
@property (strong) NSString* primaryFabricId;
@property (strong) NSMutableArray * assistingDeviceIdsArray;
@end

@implementation FabricInfo

- (BOOL) hasPrimaryFabricId {
  return !!hasPrimaryFabricId_;
}
- (void) setHasPrimaryFabricId:(BOOL) value_ {
  hasPrimaryFabricId_ = !!value_;
}
@synthesize primaryFabricId;
@synthesize assistingDeviceIdsArray;
@dynamic assistingDeviceIds;
- (id) init {
  if ((self = [super init])) {
    self.primaryFabricId = @"";
  }
  return self;
}
static FabricInfo* defaultFabricInfoInstance = nil;
+ (void) initialize {
  if (self == [FabricInfo class]) {
    defaultFabricInfoInstance = [[FabricInfo alloc] init];
  }
}
+ (FabricInfo*) defaultInstance {
  return defaultFabricInfoInstance;
}
- (FabricInfo*) defaultInstance {
  return defaultFabricInfoInstance;
}
- (NSArray *)assistingDeviceIds {
  return assistingDeviceIdsArray;
}
- (NSString*)assistingDeviceIdsAtIndex:(NSUInteger)index {
  return [assistingDeviceIdsArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasPrimaryFabricId) {
    [output writeString:1 value:self.primaryFabricId];
  }
  [self.assistingDeviceIdsArray enumerateObjectsUsingBlock:^(NSString *element, NSUInteger idx, BOOL *stop) {
    [output writeString:2 value:element];
  }];
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasPrimaryFabricId) {
    size_ += computeStringSize(1, self.primaryFabricId);
  }
  {
    __block SInt32 dataSize = 0;
    const NSUInteger count = self.assistingDeviceIdsArray.count;
    [self.assistingDeviceIdsArray enumerateObjectsUsingBlock:^(NSString *element, NSUInteger idx, BOOL *stop) {
      dataSize += computeStringSizeNoTag(element);
    }];
    size_ += dataSize;
    size_ += (SInt32)(1 * count);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (FabricInfo*) parseFromData:(NSData*) data {
  return (FabricInfo*)[[[FabricInfo builder] mergeFromData:data] build];
}
+ (FabricInfo*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (FabricInfo*)[[[FabricInfo builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (FabricInfo*) parseFromInputStream:(NSInputStream*) input {
  return (FabricInfo*)[[[FabricInfo builder] mergeFromInputStream:input] build];
}
+ (FabricInfo*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (FabricInfo*)[[[FabricInfo builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (FabricInfo*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (FabricInfo*)[[[FabricInfo builder] mergeFromCodedInputStream:input] build];
}
+ (FabricInfo*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (FabricInfo*)[[[FabricInfo builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (FabricInfoBuilder*) builder {
  return [[FabricInfoBuilder alloc] init];
}
+ (FabricInfoBuilder*) builderWithPrototype:(FabricInfo*) prototype {
  return [[FabricInfo builder] mergeFrom:prototype];
}
- (FabricInfoBuilder*) builder {
  return [FabricInfo builder];
}
- (FabricInfoBuilder*) toBuilder {
  return [FabricInfo builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasPrimaryFabricId) {
    [output appendFormat:@"%@%@: %@\n", indent, @"primaryFabricId", self.primaryFabricId];
  }
  [self.assistingDeviceIdsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@: %@\n", indent, @"assistingDeviceIds", obj];
  }];
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[FabricInfo class]]) {
    return NO;
  }
  FabricInfo *otherMessage = other;
  return
      self.hasPrimaryFabricId == otherMessage.hasPrimaryFabricId &&
      (!self.hasPrimaryFabricId || [self.primaryFabricId isEqual:otherMessage.primaryFabricId]) &&
      [self.assistingDeviceIdsArray isEqualToArray:otherMessage.assistingDeviceIdsArray] &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasPrimaryFabricId) {
    hashCode = hashCode * 31 + [self.primaryFabricId hash];
  }
  [self.assistingDeviceIdsArray enumerateObjectsUsingBlock:^(id element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface FabricInfoBuilder()
@property (strong) FabricInfo* result;
@end

@implementation FabricInfoBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[FabricInfo alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (FabricInfoBuilder*) clear {
  self.result = [[FabricInfo alloc] init];
  return self;
}
- (FabricInfoBuilder*) clone {
  return [FabricInfo builderWithPrototype:result];
}
- (FabricInfo*) defaultInstance {
  return [FabricInfo defaultInstance];
}
- (FabricInfo*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (FabricInfo*) buildPartial {
  FabricInfo* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (FabricInfoBuilder*) mergeFrom:(FabricInfo*) other {
  if (other == [FabricInfo defaultInstance]) {
    return self;
  }
  if (other.hasPrimaryFabricId) {
    [self setPrimaryFabricId:other.primaryFabricId];
  }
  if (other.assistingDeviceIdsArray.count > 0) {
    if (result.assistingDeviceIdsArray == nil) {
      result.assistingDeviceIdsArray = [[NSMutableArray alloc] initWithArray:other.assistingDeviceIdsArray];
    } else {
      [result.assistingDeviceIdsArray addObjectsFromArray:other.assistingDeviceIdsArray];
    }
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (FabricInfoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (FabricInfoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setPrimaryFabricId:[input readString]];
        break;
      }
      case 18: {
        [self addAssistingDeviceIds:[input readString]];
        break;
      }
    }
  }
}
- (BOOL) hasPrimaryFabricId {
  return result.hasPrimaryFabricId;
}
- (NSString*) primaryFabricId {
  return result.primaryFabricId;
}
- (FabricInfoBuilder*) setPrimaryFabricId:(NSString*) value {
  result.hasPrimaryFabricId = YES;
  result.primaryFabricId = value;
  return self;
}
- (FabricInfoBuilder*) clearPrimaryFabricId {
  result.hasPrimaryFabricId = NO;
  result.primaryFabricId = @"";
  return self;
}
- (NSMutableArray *)assistingDeviceIds {
  return result.assistingDeviceIdsArray;
}
- (NSString*)assistingDeviceIdsAtIndex:(NSUInteger)index {
  return [result assistingDeviceIdsAtIndex:index];
}
- (FabricInfoBuilder *)addAssistingDeviceIds:(NSString*)value {
  if (result.assistingDeviceIdsArray == nil) {
    result.assistingDeviceIdsArray = [[NSMutableArray alloc]init];
  }
  [result.assistingDeviceIdsArray addObject:value];
  return self;
}
- (FabricInfoBuilder *)setAssistingDeviceIdsArray:(NSArray *)array {
  result.assistingDeviceIdsArray = [[NSMutableArray alloc] initWithArray:array];
  return self;
}
- (FabricInfoBuilder *)clearAssistingDeviceIds {
  result.assistingDeviceIdsArray = nil;
  return self;
}
@end


// @@protoc_insertion_point(global_scope)
