Inheritance: XmlSchemaSubstitutionGroup
 private void Prepare() {
     foreach (XmlSchemaElement element in this.schema.Elements.Values) {
         if (!element.SubstitutionGroup.IsEmpty) {
             XmlSchemaSubstitutionGroup substitutionGroup = (XmlSchemaSubstitutionGroup)this.examplars[element.SubstitutionGroup];
             if (substitutionGroup == null) {
                 substitutionGroup = new XmlSchemaSubstitutionGroupV1Compat();
                 substitutionGroup.Examplar = element.SubstitutionGroup;
                 examplars.Add(element.SubstitutionGroup, substitutionGroup);
             }
             ArrayList members = substitutionGroup.Members;
             Debug.Assert(!members.Contains(element));
             members.Add(element);
         }
     }
 }
 private void Prepare()
 {
     foreach (XmlSchemaElement element in this.schema.Elements.Values)
     {
         if (!element.SubstitutionGroup.IsEmpty)
         {
             XmlSchemaSubstitutionGroup group = (XmlSchemaSubstitutionGroup) this.examplars[element.SubstitutionGroup];
             if (group == null)
             {
                 group = new XmlSchemaSubstitutionGroupV1Compat {
                     Examplar = element.SubstitutionGroup
                 };
                 this.examplars.Add(element.SubstitutionGroup, group);
             }
             group.Members.Add(element);
         }
     }
 }
 private void CompileSubstitutionGroup(XmlSchemaSubstitutionGroupV1Compat substitutionGroup)
 {
     if (substitutionGroup.IsProcessing && (substitutionGroup.Members.Count > 0))
     {
         base.SendValidationEvent("Sch_SubstitutionCircularRef", (XmlSchemaElement) substitutionGroup.Members[0]);
     }
     else
     {
         XmlSchemaElement item = (XmlSchemaElement) this.schema.Elements[substitutionGroup.Examplar];
         if (!substitutionGroup.Members.Contains(item))
         {
             substitutionGroup.IsProcessing = true;
             if (item != null)
             {
                 if (item.FinalResolved == XmlSchemaDerivationMethod.All)
                 {
                     base.SendValidationEvent("Sch_InvalidExamplar", item);
                 }
                 for (int i = 0; i < substitutionGroup.Members.Count; i++)
                 {
                     XmlSchemaElement element2 = (XmlSchemaElement) substitutionGroup.Members[i];
                     XmlSchemaSubstitutionGroupV1Compat compat = (XmlSchemaSubstitutionGroupV1Compat) this.examplars[element2.QualifiedName];
                     if (compat != null)
                     {
                         this.CompileSubstitutionGroup(compat);
                         for (int j = 0; j < compat.Choice.Items.Count; j++)
                         {
                             substitutionGroup.Choice.Items.Add(compat.Choice.Items[j]);
                         }
                     }
                     else
                     {
                         substitutionGroup.Choice.Items.Add(element2);
                     }
                 }
                 substitutionGroup.Choice.Items.Add(item);
                 substitutionGroup.Members.Add(item);
             }
             else if (substitutionGroup.Members.Count > 0)
             {
                 base.SendValidationEvent("Sch_NoExamplar", (XmlSchemaElement) substitutionGroup.Members[0]);
             }
             substitutionGroup.IsProcessing = false;
         }
     }
 }
        private void CompileSubstitutionGroup(XmlSchemaSubstitutionGroupV1Compat substitutionGroup) {
            if (substitutionGroup.IsProcessing && substitutionGroup.Members.Count > 0) {
                SendValidationEvent(Res.Sch_SubstitutionCircularRef, (XmlSchemaElement)substitutionGroup.Members[0]);
                return;
            }
            XmlSchemaElement examplar = (XmlSchemaElement)this.schema.Elements[substitutionGroup.Examplar];
            if (substitutionGroup.Members.Contains(examplar)) {// already checked
                return;
            }
            substitutionGroup.IsProcessing = true; 
            if (examplar != null) {
                if (examplar.FinalResolved == XmlSchemaDerivationMethod.All) {
                    SendValidationEvent(Res.Sch_InvalidExamplar, examplar);
                }

                for (int i = 0; i < substitutionGroup.Members.Count; ++i) {
                    XmlSchemaElement element = (XmlSchemaElement)substitutionGroup.Members[i];
                    //Chain to other head's that are members of this head's substGroup
                    XmlSchemaSubstitutionGroupV1Compat g = (XmlSchemaSubstitutionGroupV1Compat)examplars[element.QualifiedName];
                    if (g != null) {
                        CompileSubstitutionGroup(g);
                        for (int j = 0; j < g.Choice.Items.Count; ++j) {
                            substitutionGroup.Choice.Items.Add(g.Choice.Items[j]);
                        }
                    }
                    else {
                        substitutionGroup.Choice.Items.Add(element);
                    }
                }
                substitutionGroup.Choice.Items.Add(examplar);
                substitutionGroup.Members.Add(examplar); // Compiled mark
            }
            else if (substitutionGroup.Members.Count > 0) {
                SendValidationEvent(Res.Sch_NoExamplar, (XmlSchemaElement)substitutionGroup.Members[0]);
            }
            substitutionGroup.IsProcessing = false;
        }