/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.18052
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;

// 
// This source code was auto-generated by xsd, Version=4.0.30319.17929.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class schema : openAttrs {
    
    private openAttrs[] itemsField;
    
    private topLevelSimpleType[] simpleTypeField;
    
    private topLevelComplexType[] complexTypeField;
    
    private namedGroup[] groupField;
    
    private namedAttributeGroup[] attributeGroupField;
    
    private topLevelElement[] elementField;
    
    private topLevelAttribute[] attributeField;
    
    private notation[] notationField;
    
    private annotation[] annotationField;
    
    private string targetNamespaceField;
    
    private string versionField;
    
    private string finalDefaultField;
    
    private string blockDefaultField;
    
    private formChoice attributeFormDefaultField;
    
    private formChoice elementFormDefaultField;
    
    private string idField;
    
    private string langField;
    
    public schema() {
        this.finalDefaultField = "";
        this.blockDefaultField = "";
        this.attributeFormDefaultField = formChoice.unqualified;
        this.elementFormDefaultField = formChoice.unqualified;
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("annotation", typeof(annotation))]
    [System.Xml.Serialization.XmlElementAttribute("import", typeof(import))]
    [System.Xml.Serialization.XmlElementAttribute("include", typeof(include))]
    [System.Xml.Serialization.XmlElementAttribute("redefine", typeof(redefine))]
    public openAttrs[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("simpleType")]
    public topLevelSimpleType[] simpleType {
        get {
            return this.simpleTypeField;
        }
        set {
            this.simpleTypeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("complexType")]
    public topLevelComplexType[] complexType {
        get {
            return this.complexTypeField;
        }
        set {
            this.complexTypeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("group")]
    public namedGroup[] group {
        get {
            return this.groupField;
        }
        set {
            this.groupField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("attributeGroup")]
    public namedAttributeGroup[] attributeGroup {
        get {
            return this.attributeGroupField;
        }
        set {
            this.attributeGroupField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("element")]
    public topLevelElement[] element {
        get {
            return this.elementField;
        }
        set {
            this.elementField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("attribute")]
    public topLevelAttribute[] attribute {
        get {
            return this.attributeField;
        }
        set {
            this.attributeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("notation")]
    public notation[] notation {
        get {
            return this.notationField;
        }
        set {
            this.notationField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("annotation")]
    public annotation[] annotation {
        get {
            return this.annotationField;
        }
        set {
            this.annotationField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
    public string targetNamespace {
        get {
            return this.targetNamespaceField;
        }
        set {
            this.targetNamespaceField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string version {
        get {
            return this.versionField;
        }
        set {
            this.versionField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute("")]
    public string finalDefault {
        get {
            return this.finalDefaultField;
        }
        set {
            this.finalDefaultField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute("")]
    public string blockDefault {
        get {
            return this.blockDefaultField;
        }
        set {
            this.blockDefaultField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(formChoice.unqualified)]
    public formChoice attributeFormDefault {
        get {
            return this.attributeFormDefaultField;
        }
        set {
            this.attributeFormDefaultField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(formChoice.unqualified)]
    public formChoice elementFormDefault {
        get {
            return this.elementFormDefaultField;
        }
        set {
            this.elementFormDefaultField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="ID")]
    public string id {
        get {
            return this.idField;
        }
        set {
            this.idField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(Form=System.Xml.Schema.XmlSchemaForm.Qualified, Namespace="http://www.w3.org/XML/1998/namespace")]
    public string lang {
        get {
            return this.langField;
        }
        set {
            this.langField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class annotation : openAttrs {
    
    private object[] itemsField;
    
    private string idField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("appinfo", typeof(appinfo))]
    [System.Xml.Serialization.XmlElementAttribute("documentation", typeof(documentation))]
    public object[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="ID")]
    public string id {
        get {
            return this.idField;
        }
        set {
            this.idField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class appinfo {
    
    private System.Xml.XmlNode[] anyField;
    
    private string sourceField;
    
    private System.Xml.XmlAttribute[] anyAttrField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    [System.Xml.Serialization.XmlAnyElementAttribute()]
    public System.Xml.XmlNode[] Any {
        get {
            return this.anyField;
        }
        set {
            this.anyField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
    public string source {
        get {
            return this.sourceField;
        }
        set {
            this.sourceField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAnyAttributeAttribute()]
    public System.Xml.XmlAttribute[] AnyAttr {
        get {
            return this.anyAttrField;
        }
        set {
            this.anyAttrField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(annotated))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(extensionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(simpleExtensionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(attributeGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(namedAttributeGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(attributeGroupRef))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(wildcard))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(keybase))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(element))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(localElement))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(narrowMaxMin))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(topLevelElement))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(group))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(explicitGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(all))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(simpleExplicitGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(realGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(groupRef))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(namedGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(restrictionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(simpleRestrictionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(complexRestrictionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(complexType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(topLevelComplexType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(localComplexType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(facet))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(numFacet))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(noFixedFacet))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(simpleType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(topLevelSimpleType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(localSimpleType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(attribute))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(topLevelAttribute))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class openAttrs {
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(extensionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(simpleExtensionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(attributeGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(namedAttributeGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(attributeGroupRef))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(wildcard))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(keybase))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(element))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(localElement))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(narrowMaxMin))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(topLevelElement))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(group))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(explicitGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(all))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(simpleExplicitGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(realGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(groupRef))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(namedGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(restrictionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(simpleRestrictionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(complexRestrictionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(complexType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(topLevelComplexType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(localComplexType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(facet))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(numFacet))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(noFixedFacet))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(simpleType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(topLevelSimpleType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(localSimpleType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(attribute))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(topLevelAttribute))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class annotated : openAttrs {
    
    private annotation annotationField;
    
    private string idField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public annotation annotation {
        get {
            return this.annotationField;
        }
        set {
            this.annotationField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="ID")]
    public string id {
        get {
            return this.idField;
        }
        set {
            this.idField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(simpleExtensionType))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class extensionType : annotated {
    
    private groupRef groupField;
    
    private all allField;
    
    private explicitGroup choiceField;
    
    private explicitGroup sequenceField;
    
    private annotated[] itemsField;
    
    private wildcard anyAttributeField;
    
    private System.Xml.XmlQualifiedName baseField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public groupRef group {
        get {
            return this.groupField;
        }
        set {
            this.groupField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=1)]
    public all all {
        get {
            return this.allField;
        }
        set {
            this.allField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=2)]
    public explicitGroup choice {
        get {
            return this.choiceField;
        }
        set {
            this.choiceField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=3)]
    public explicitGroup sequence {
        get {
            return this.sequenceField;
        }
        set {
            this.sequenceField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("attribute", typeof(attribute), Order=4)]
    [System.Xml.Serialization.XmlElementAttribute("attributeGroup", typeof(attributeGroupRef), Order=4)]
    public annotated[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=5)]
    public wildcard anyAttribute {
        get {
            return this.anyAttributeField;
        }
        set {
            this.anyAttributeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName @base {
        get {
            return this.baseField;
        }
        set {
            this.baseField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class groupRef : realGroup {
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(groupRef))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(namedGroup))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class realGroup : group {
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(explicitGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(all))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(simpleExplicitGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(realGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(groupRef))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(namedGroup))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public abstract partial class group : annotated {
    
    private annotated[] itemsField;
    
    private ItemsChoiceType[] itemsElementNameField;
    
    private string nameField;
    
    private System.Xml.XmlQualifiedName refField;
    
    private string minOccursField;
    
    private string maxOccursField;
    
    public group() {
        this.minOccursField = "1";
        this.maxOccursField = "1";
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("all", typeof(all), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("any", typeof(any), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("choice", typeof(explicitGroup), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("element", typeof(localElement), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("group", typeof(groupRef), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("sequence", typeof(explicitGroup), Order=0)]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
    public annotated[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("ItemsElementName", Order=1)]
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public ItemsChoiceType[] ItemsElementName {
        get {
            return this.itemsElementNameField;
        }
        set {
            this.itemsElementNameField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="NCName")]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName @ref {
        get {
            return this.refField;
        }
        set {
            this.refField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="nonNegativeInteger")]
    [System.ComponentModel.DefaultValueAttribute("1")]
    public string minOccurs {
        get {
            return this.minOccursField;
        }
        set {
            this.minOccursField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute("1")]
    public string maxOccurs {
        get {
            return this.maxOccursField;
        }
        set {
            this.maxOccursField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class all : explicitGroup {
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(all))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(simpleExplicitGroup))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute("choice", Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class explicitGroup : group {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class simpleExplicitGroup : explicitGroup {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class any : wildcard {
    
    private string minOccursField;
    
    private string maxOccursField;
    
    public any() {
        this.minOccursField = "1";
        this.maxOccursField = "1";
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="nonNegativeInteger")]
    [System.ComponentModel.DefaultValueAttribute("1")]
    public string minOccurs {
        get {
            return this.minOccursField;
        }
        set {
            this.minOccursField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute("1")]
    public string maxOccurs {
        get {
            return this.maxOccursField;
        }
        set {
            this.maxOccursField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute("anyAttribute", Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class wildcard : annotated {
    
    private string namespaceField;
    
    private wildcardProcessContents processContentsField;
    
    public wildcard() {
        this.namespaceField = "##any";
        this.processContentsField = wildcardProcessContents.strict;
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute("##any")]
    public string @namespace {
        get {
            return this.namespaceField;
        }
        set {
            this.namespaceField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(wildcardProcessContents.strict)]
    public wildcardProcessContents processContents {
        get {
            return this.processContentsField;
        }
        set {
            this.processContentsField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
public enum wildcardProcessContents {
    
    /// <remarks/>
    skip,
    
    /// <remarks/>
    lax,
    
    /// <remarks/>
    strict,
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(narrowMaxMin))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class localElement : element {
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(localElement))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(narrowMaxMin))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(topLevelElement))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public abstract partial class element : annotated {
    
    private annotated itemField;
    
    private keybase[] uniqueField;
    
    private keybase[] keyField;
    
    private keyref[] keyrefField;
    
    private string nameField;
    
    private System.Xml.XmlQualifiedName refField;
    
    private System.Xml.XmlQualifiedName typeField;
    
    private System.Xml.XmlQualifiedName substitutionGroupField;
    
    private string minOccursField;
    
    private string maxOccursField;
    
    private string defaultField;
    
    private string fixedField;
    
    private bool nillableField;
    
    private bool abstractField;
    
    private string finalField;
    
    private string blockField;
    
    private formChoice formField;
    
    private bool formFieldSpecified;
    
    public element() {
        this.minOccursField = "1";
        this.maxOccursField = "1";
        this.nillableField = false;
        this.abstractField = false;
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("complexType", typeof(localComplexType), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("simpleType", typeof(localSimpleType), Order=0)]
    public annotated Item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("unique", Order=1)]
    public keybase[] unique {
        get {
            return this.uniqueField;
        }
        set {
            this.uniqueField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("key", Order=2)]
    public keybase[] key {
        get {
            return this.keyField;
        }
        set {
            this.keyField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("keyref", Order=3)]
    public keyref[] keyref {
        get {
            return this.keyrefField;
        }
        set {
            this.keyrefField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="NCName")]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName @ref {
        get {
            return this.refField;
        }
        set {
            this.refField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName type {
        get {
            return this.typeField;
        }
        set {
            this.typeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName substitutionGroup {
        get {
            return this.substitutionGroupField;
        }
        set {
            this.substitutionGroupField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="nonNegativeInteger")]
    [System.ComponentModel.DefaultValueAttribute("1")]
    public string minOccurs {
        get {
            return this.minOccursField;
        }
        set {
            this.minOccursField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute("1")]
    public string maxOccurs {
        get {
            return this.maxOccursField;
        }
        set {
            this.maxOccursField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string @default {
        get {
            return this.defaultField;
        }
        set {
            this.defaultField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string @fixed {
        get {
            return this.fixedField;
        }
        set {
            this.fixedField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(false)]
    public bool nillable {
        get {
            return this.nillableField;
        }
        set {
            this.nillableField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(false)]
    public bool @abstract {
        get {
            return this.abstractField;
        }
        set {
            this.abstractField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string final {
        get {
            return this.finalField;
        }
        set {
            this.finalField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string block {
        get {
            return this.blockField;
        }
        set {
            this.blockField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public formChoice form {
        get {
            return this.formField;
        }
        set {
            this.formField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool formSpecified {
        get {
            return this.formFieldSpecified;
        }
        set {
            this.formFieldSpecified = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class localComplexType : complexType {
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(topLevelComplexType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(localComplexType))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public abstract partial class complexType : annotated {
    
    private annotated[] itemsField;
    
    private ItemsChoiceType2[] itemsElementNameField;
    
    private string nameField;
    
    private bool mixedField;
    
    private bool abstractField;
    
    private string finalField;
    
    private string blockField;
    
    public complexType() {
        this.mixedField = false;
        this.abstractField = false;
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("all", typeof(all), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("anyAttribute", typeof(wildcard), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("attribute", typeof(attribute), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("attributeGroup", typeof(attributeGroupRef), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("choice", typeof(explicitGroup), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("complexContent", typeof(complexContent), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("group", typeof(groupRef), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("sequence", typeof(explicitGroup), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("simpleContent", typeof(simpleContent), Order=0)]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
    public annotated[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("ItemsElementName", Order=1)]
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public ItemsChoiceType2[] ItemsElementName {
        get {
            return this.itemsElementNameField;
        }
        set {
            this.itemsElementNameField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="NCName")]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(false)]
    public bool mixed {
        get {
            return this.mixedField;
        }
        set {
            this.mixedField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(false)]
    public bool @abstract {
        get {
            return this.abstractField;
        }
        set {
            this.abstractField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string final {
        get {
            return this.finalField;
        }
        set {
            this.finalField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string block {
        get {
            return this.blockField;
        }
        set {
            this.blockField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(topLevelAttribute))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class attribute : annotated {
    
    private localSimpleType simpleTypeField;
    
    private string nameField;
    
    private System.Xml.XmlQualifiedName refField;
    
    private System.Xml.XmlQualifiedName typeField;
    
    private attributeUse useField;
    
    private string defaultField;
    
    private string fixedField;
    
    private formChoice formField;
    
    private bool formFieldSpecified;
    
    public attribute() {
        this.useField = attributeUse.optional;
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public localSimpleType simpleType {
        get {
            return this.simpleTypeField;
        }
        set {
            this.simpleTypeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="NCName")]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName @ref {
        get {
            return this.refField;
        }
        set {
            this.refField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName type {
        get {
            return this.typeField;
        }
        set {
            this.typeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(attributeUse.optional)]
    public attributeUse use {
        get {
            return this.useField;
        }
        set {
            this.useField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string @default {
        get {
            return this.defaultField;
        }
        set {
            this.defaultField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string @fixed {
        get {
            return this.fixedField;
        }
        set {
            this.fixedField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public formChoice form {
        get {
            return this.formField;
        }
        set {
            this.formField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool formSpecified {
        get {
            return this.formFieldSpecified;
        }
        set {
            this.formFieldSpecified = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class localSimpleType : simpleType {
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(topLevelSimpleType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(localSimpleType))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public abstract partial class simpleType : annotated {
    
    private annotated itemField;
    
    private string finalField;
    
    private string nameField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("list", typeof(list), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("restriction", typeof(restriction), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("union", typeof(union), Order=0)]
    public annotated Item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string final {
        get {
            return this.finalField;
        }
        set {
            this.finalField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="NCName")]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class list : annotated {
    
    private localSimpleType simpleTypeField;
    
    private System.Xml.XmlQualifiedName itemTypeField;
    
    /// <remarks/>
    public localSimpleType simpleType {
        get {
            return this.simpleTypeField;
        }
        set {
            this.simpleTypeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName itemType {
        get {
            return this.itemTypeField;
        }
        set {
            this.itemTypeField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class restriction : annotated {
    
    private localSimpleType simpleTypeField;
    
    private facet[] minExclusiveField;
    
    private facet[] minInclusiveField;
    
    private facet[] maxExclusiveField;
    
    private facet[] maxInclusiveField;
    
    private totalDigits[] totalDigitsField;
    
    private numFacet[] fractionDigitsField;
    
    private numFacet[] lengthField;
    
    private numFacet[] minLengthField;
    
    private numFacet[] maxLengthField;
    
    private noFixedFacet[] enumerationField;
    
    private whiteSpace[] whiteSpaceField;
    
    private pattern[] patternField;
    
    private System.Xml.XmlQualifiedName baseField;
    
    /// <remarks/>
    public localSimpleType simpleType {
        get {
            return this.simpleTypeField;
        }
        set {
            this.simpleTypeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("minExclusive")]
    public facet[] minExclusive {
        get {
            return this.minExclusiveField;
        }
        set {
            this.minExclusiveField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("minInclusive")]
    public facet[] minInclusive {
        get {
            return this.minInclusiveField;
        }
        set {
            this.minInclusiveField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("maxExclusive")]
    public facet[] maxExclusive {
        get {
            return this.maxExclusiveField;
        }
        set {
            this.maxExclusiveField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("maxInclusive")]
    public facet[] maxInclusive {
        get {
            return this.maxInclusiveField;
        }
        set {
            this.maxInclusiveField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("totalDigits")]
    public totalDigits[] totalDigits {
        get {
            return this.totalDigitsField;
        }
        set {
            this.totalDigitsField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("fractionDigits")]
    public numFacet[] fractionDigits {
        get {
            return this.fractionDigitsField;
        }
        set {
            this.fractionDigitsField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("length")]
    public numFacet[] length {
        get {
            return this.lengthField;
        }
        set {
            this.lengthField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("minLength")]
    public numFacet[] minLength {
        get {
            return this.minLengthField;
        }
        set {
            this.minLengthField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("maxLength")]
    public numFacet[] maxLength {
        get {
            return this.maxLengthField;
        }
        set {
            this.maxLengthField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("enumeration")]
    public noFixedFacet[] enumeration {
        get {
            return this.enumerationField;
        }
        set {
            this.enumerationField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("whiteSpace")]
    public whiteSpace[] whiteSpace {
        get {
            return this.whiteSpaceField;
        }
        set {
            this.whiteSpaceField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("pattern")]
    public pattern[] pattern {
        get {
            return this.patternField;
        }
        set {
            this.patternField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName @base {
        get {
            return this.baseField;
        }
        set {
            this.baseField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(numFacet))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(noFixedFacet))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute("minExclusive", Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class facet : annotated {
    
    private string valueField;
    
    private bool fixedField;
    
    public facet() {
        this.fixedField = false;
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string value {
        get {
            return this.valueField;
        }
        set {
            this.valueField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(false)]
    public bool @fixed {
        get {
            return this.fixedField;
        }
        set {
            this.fixedField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class totalDigits : numFacet {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute("fractionDigits", Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class numFacet : facet {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute("enumeration", Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class noFixedFacet : facet {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class whiteSpace : facet {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class pattern : noFixedFacet {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class union : annotated {
    
    private localSimpleType[] simpleTypeField;
    
    private System.Xml.XmlQualifiedName[] memberTypesField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("simpleType")]
    public localSimpleType[] simpleType {
        get {
            return this.simpleTypeField;
        }
        set {
            this.simpleTypeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName[] memberTypes {
        get {
            return this.memberTypesField;
        }
        set {
            this.memberTypesField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
public enum attributeUse {
    
    /// <remarks/>
    prohibited,
    
    /// <remarks/>
    optional,
    
    /// <remarks/>
    required,
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public enum formChoice {
    
    /// <remarks/>
    qualified,
    
    /// <remarks/>
    unqualified,
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class attributeGroupRef : attributeGroup {
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(namedAttributeGroup))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(attributeGroupRef))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public abstract partial class attributeGroup : annotated {
    
    private annotated[] itemsField;
    
    private wildcard anyAttributeField;
    
    private string nameField;
    
    private System.Xml.XmlQualifiedName refField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("attribute", typeof(attribute), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("attributeGroup", typeof(attributeGroupRef), Order=0)]
    public annotated[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=1)]
    public wildcard anyAttribute {
        get {
            return this.anyAttributeField;
        }
        set {
            this.anyAttributeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="NCName")]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName @ref {
        get {
            return this.refField;
        }
        set {
            this.refField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class complexContent : annotated {
    
    private annotated itemField;
    
    private bool mixedField;
    
    private bool mixedFieldSpecified;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("extension", typeof(extensionType))]
    [System.Xml.Serialization.XmlElementAttribute("restriction", typeof(complexRestrictionType))]
    public annotated Item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool mixed {
        get {
            return this.mixedField;
        }
        set {
            this.mixedField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool mixedSpecified {
        get {
            return this.mixedFieldSpecified;
        }
        set {
            this.mixedFieldSpecified = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class complexRestrictionType : restrictionType {
}

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(simpleRestrictionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(complexRestrictionType))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class restrictionType : annotated {
    
    private annotated[] itemsField;
    
    private ItemsChoiceType1[] itemsElementNameField;
    
    private annotated[] items1Field;
    
    private wildcard anyAttributeField;
    
    private System.Xml.XmlQualifiedName baseField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("all", typeof(all), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("choice", typeof(explicitGroup), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("enumeration", typeof(noFixedFacet), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("fractionDigits", typeof(numFacet), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("group", typeof(groupRef), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("length", typeof(numFacet), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("maxExclusive", typeof(facet), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("maxInclusive", typeof(facet), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("maxLength", typeof(numFacet), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("minExclusive", typeof(facet), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("minInclusive", typeof(facet), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("minLength", typeof(numFacet), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("pattern", typeof(pattern), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("sequence", typeof(explicitGroup), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("simpleType", typeof(localSimpleType), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("totalDigits", typeof(totalDigits), Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("whiteSpace", typeof(whiteSpace), Order=0)]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
    public annotated[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("ItemsElementName", Order=1)]
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public ItemsChoiceType1[] ItemsElementName {
        get {
            return this.itemsElementNameField;
        }
        set {
            this.itemsElementNameField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("attribute", typeof(attribute), Order=2)]
    [System.Xml.Serialization.XmlElementAttribute("attributeGroup", typeof(attributeGroupRef), Order=2)]
    public annotated[] Items1 {
        get {
            return this.items1Field;
        }
        set {
            this.items1Field = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=3)]
    public wildcard anyAttribute {
        get {
            return this.anyAttributeField;
        }
        set {
            this.anyAttributeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName @base {
        get {
            return this.baseField;
        }
        set {
            this.baseField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IncludeInSchema=false)]
public enum ItemsChoiceType1 {
    
    /// <remarks/>
    all,
    
    /// <remarks/>
    choice,
    
    /// <remarks/>
    enumeration,
    
    /// <remarks/>
    fractionDigits,
    
    /// <remarks/>
    group,
    
    /// <remarks/>
    length,
    
    /// <remarks/>
    maxExclusive,
    
    /// <remarks/>
    maxInclusive,
    
    /// <remarks/>
    maxLength,
    
    /// <remarks/>
    minExclusive,
    
    /// <remarks/>
    minInclusive,
    
    /// <remarks/>
    minLength,
    
    /// <remarks/>
    pattern,
    
    /// <remarks/>
    sequence,
    
    /// <remarks/>
    simpleType,
    
    /// <remarks/>
    totalDigits,
    
    /// <remarks/>
    whiteSpace,
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class simpleRestrictionType : restrictionType {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class simpleContent : annotated {
    
    private annotated itemField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("extension", typeof(simpleExtensionType))]
    [System.Xml.Serialization.XmlElementAttribute("restriction", typeof(simpleRestrictionType))]
    public annotated Item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class simpleExtensionType : extensionType {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IncludeInSchema=false)]
public enum ItemsChoiceType2 {
    
    /// <remarks/>
    all,
    
    /// <remarks/>
    anyAttribute,
    
    /// <remarks/>
    attribute,
    
    /// <remarks/>
    attributeGroup,
    
    /// <remarks/>
    choice,
    
    /// <remarks/>
    complexContent,
    
    /// <remarks/>
    group,
    
    /// <remarks/>
    sequence,
    
    /// <remarks/>
    simpleContent,
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute("unique", Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class keybase : annotated {
    
    private selector selectorField;
    
    private field[] fieldField;
    
    private string nameField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public selector selector {
        get {
            return this.selectorField;
        }
        set {
            this.selectorField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("field", Order=1)]
    public field[] field {
        get {
            return this.fieldField;
        }
        set {
            this.fieldField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="NCName")]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class selector : annotated {
    
    private string xpathField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string xpath {
        get {
            return this.xpathField;
        }
        set {
            this.xpathField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class field : annotated {
    
    private string xpathField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string xpath {
        get {
            return this.xpathField;
        }
        set {
            this.xpathField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class keyref : keybase {
    
    private System.Xml.XmlQualifiedName referField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.Xml.XmlQualifiedName refer {
        get {
            return this.referField;
        }
        set {
            this.referField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
public partial class narrowMaxMin : localElement {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IncludeInSchema=false)]
public enum ItemsChoiceType {
    
    /// <remarks/>
    all,
    
    /// <remarks/>
    any,
    
    /// <remarks/>
    choice,
    
    /// <remarks/>
    element,
    
    /// <remarks/>
    group,
    
    /// <remarks/>
    sequence,
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class documentation {
    
    private System.Xml.XmlNode[] anyField;
    
    private string sourceField;
    
    private string langField;
    
    private System.Xml.XmlAttribute[] anyAttrField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    [System.Xml.Serialization.XmlAnyElementAttribute()]
    public System.Xml.XmlNode[] Any {
        get {
            return this.anyField;
        }
        set {
            this.anyField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
    public string source {
        get {
            return this.sourceField;
        }
        set {
            this.sourceField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(Form=System.Xml.Schema.XmlSchemaForm.Qualified, Namespace="http://www.w3.org/XML/1998/namespace")]
    public string lang {
        get {
            return this.langField;
        }
        set {
            this.langField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAnyAttributeAttribute()]
    public System.Xml.XmlAttribute[] AnyAttr {
        get {
            return this.anyAttrField;
        }
        set {
            this.anyAttrField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class import : annotated {
    
    private string namespaceField;
    
    private string schemaLocationField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
    public string @namespace {
        get {
            return this.namespaceField;
        }
        set {
            this.namespaceField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
    public string schemaLocation {
        get {
            return this.schemaLocationField;
        }
        set {
            this.schemaLocationField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class include : annotated {
    
    private string schemaLocationField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
    public string schemaLocation {
        get {
            return this.schemaLocationField;
        }
        set {
            this.schemaLocationField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class redefine : openAttrs {
    
    private openAttrs[] itemsField;
    
    private string schemaLocationField;
    
    private string idField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("annotation", typeof(annotation))]
    [System.Xml.Serialization.XmlElementAttribute("attributeGroup", typeof(namedAttributeGroup))]
    [System.Xml.Serialization.XmlElementAttribute("complexType", typeof(topLevelComplexType))]
    [System.Xml.Serialization.XmlElementAttribute("group", typeof(namedGroup))]
    [System.Xml.Serialization.XmlElementAttribute("simpleType", typeof(topLevelSimpleType))]
    public openAttrs[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
    public string schemaLocation {
        get {
            return this.schemaLocationField;
        }
        set {
            this.schemaLocationField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="ID")]
    public string id {
        get {
            return this.idField;
        }
        set {
            this.idField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute("attributeGroup", Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class namedAttributeGroup : attributeGroup {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute("complexType", Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class topLevelComplexType : complexType {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute("group", Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class namedGroup : realGroup {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute("simpleType", Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class topLevelSimpleType : simpleType {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute("element", Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class topLevelElement : element {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute("attribute", Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class topLevelAttribute : attribute {
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.w3.org/2001/XMLSchema")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.w3.org/2001/XMLSchema", IsNullable=false)]
public partial class notation : annotated {
    
    private string nameField;
    
    private string publicField;
    
    private string systemField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="NCName")]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string @public {
        get {
            return this.publicField;
        }
        set {
            this.publicField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
    public string system {
        get {
            return this.systemField;
        }
        set {
            this.systemField = value;
        }
    }
}
