You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			658 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			658 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Specialized;
 | |
| using System.Xml;
 | |
| using System.Xml.Schema;
 | |
| using Commons.Xml.Relaxng;
 | |
| 
 | |
| //using Map = Commons.Xml.Relaxng.ObjectMapping.RelaxngMapping;
 | |
| //using Choice = Commons.Xml.Relaxng.ObjectMapping.RelaxngMappingChoice;
 | |
| 
 | |
| namespace Commons.Xml.Nvdl
 | |
| {
 | |
| 	public class Nvdl
 | |
| 	{
 | |
| 		private Nvdl () {}
 | |
| 
 | |
| 		public const string Namespace = "http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0";
 | |
| 		public const string BuiltInValidationNamespace = "http://purl.oclc.org/dsdl/nvdl/ns/predefinedSchema/1.0";
 | |
| 
 | |
| 		public const string InstanceNamespace = "http://purl.oclc.org/dsdl/nvdl/ns/instance/1.0";
 | |
| 
 | |
| 		internal const string XmlNamespaceUri = "http://www.w3.org/xml/1998/namespace";
 | |
| 
 | |
| 		private static void OnDefaultEvent (object o, 
 | |
| 			NvdlMessageEventArgs e)
 | |
| 		{
 | |
| 			Console.WriteLine (e.Message);
 | |
| 		}
 | |
| 
 | |
| 		internal static NvdlMessageEventHandler HandlePrintMessage =
 | |
| 			new NvdlMessageEventHandler (OnDefaultEvent);
 | |
| 
 | |
| 		readonly static NvdlConfig defaultConfig;
 | |
| 
 | |
| 		static Nvdl ()
 | |
| 		{
 | |
| 			defaultConfig = new NvdlConfig ();
 | |
| 			defaultConfig.AddProvider (new NvdlXsdValidatorProvider ());
 | |
| 			defaultConfig.AddProvider (new NvdlRelaxngValidatorProvider ());
 | |
| 		}
 | |
| 
 | |
| 		internal static NvdlConfig DefaultConfig {
 | |
| 			get { return defaultConfig; }
 | |
| 		}
 | |
| 
 | |
| 		internal static readonly char [] Whitespaces =
 | |
| 			new char [] {' ', '\r', '\n', '\t'};
 | |
| 
 | |
| 		// See 6.4.12.
 | |
| 		internal static bool NSMatches (string n1, int i1, string w1,
 | |
| 			string n2, int i2, string w2)
 | |
| 		{
 | |
| 			// quick check
 | |
| 			if (n1 == n2)
 | |
| 				return true;
 | |
| 
 | |
| 			// Case 1:
 | |
| 			if (n1.Length <= i1 && n2.Length <= i2)
 | |
| 				return true;
 | |
| 			// Case 2:
 | |
| 			if (n1.Length <= i1 && n2 == w2 ||
 | |
| 				n2.Length <= i2 && n1 == w1)
 | |
| 				return true;
 | |
| 			// Case 3:
 | |
| 			if (n1.Length > i1 && n2.Length > i2 &&
 | |
| 				n1 [i1] == n2 [i2] &&
 | |
| 				(w1.Length == 0 || n1 [i1] != w1 [0]) &&
 | |
| 				(w2.Length == 0 || n2 [i2] != w2 [0]) &&
 | |
| 				NSMatches (n1, i1 + 1, w1, n2, i2 + 1, w2))
 | |
| 				return true;
 | |
| 			// Case 4:
 | |
| 			if (w1 != "" &&
 | |
| 				n1.Length > i1 && n1 [i1] == w1 [0] &&
 | |
| 				NSMatches (n1, i1, w1, n2, i2 + 1, w2))
 | |
| 				return true;
 | |
| 			// Case 5:
 | |
| 			if (w2 != "" &&
 | |
| 				n2.Length > i2 && n2 [i2] == w2 [0] &&
 | |
| 				NSMatches (n1, i1 + 1, w1, n2, i2, w2))
 | |
| 				return true;
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlMessageEventArgs : EventArgs
 | |
| 	{
 | |
| 		string message;
 | |
| 
 | |
| 		public NvdlMessageEventArgs (string message)
 | |
| 		{
 | |
| 			this.message = message;
 | |
| 		}
 | |
| 
 | |
| 		public string Message {
 | |
| 			get { return message; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public delegate void NvdlMessageEventHandler (object o, NvdlMessageEventArgs e);
 | |
| 
 | |
| 	public class NvdlElementBase : IXmlLineInfo
 | |
| 	{
 | |
| 		int line, column;
 | |
| 		string sourceUri;
 | |
| 
 | |
| 		public int LineNumber {
 | |
| 			get { return line; }
 | |
| 			set { line = value; }
 | |
| 		}
 | |
| 		
 | |
| 		public int LinePosition {
 | |
| 			get { return column; }
 | |
| 			set { column = value; }
 | |
| 		}
 | |
| 		
 | |
| 		public bool HasLineInfo ()
 | |
| 		{
 | |
| 			return line > 0 && column > 0;
 | |
| 		}
 | |
| 
 | |
| 		public string SourceUri {
 | |
| 			get { return sourceUri; }
 | |
| 			set { sourceUri = value; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlAttributable : NvdlElementBase
 | |
| 	{
 | |
| 		ArrayList foreign = new ArrayList ();
 | |
| 
 | |
| 		public ArrayList Foreign {
 | |
| 			get { return foreign; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	element rules {
 | |
| 		(schemaType?,
 | |
| 		trigger*,
 | |
| 		(rule* | (attribute startMode { xsd:NCName }, mode+)))
 | |
| 		& foreign
 | |
| 	}
 | |
| 	*/
 | |
| 	public class NvdlRules : NvdlAttributable
 | |
| 	{
 | |
| 		string schemaType;
 | |
| 		NvdlTriggerList triggers = new NvdlTriggerList ();
 | |
| 		NvdlRuleList rules = new NvdlRuleList ();
 | |
| 		NvdlModeList modes = new NvdlModeList ();
 | |
| 		string startMode;
 | |
| 
 | |
| //		[Map.Optional]
 | |
| //		[Map.Attribute]
 | |
| 		public string SchemaType {
 | |
| 			get { return schemaType; }
 | |
| 			set { schemaType = value != null ? value.Trim (Nvdl.Whitespaces) : null; }
 | |
| 		}
 | |
| 
 | |
| //		[Map.ZeroOrMore]
 | |
| 		public NvdlTriggerList Triggers {
 | |
| 			get { return triggers; }
 | |
| 		}
 | |
| 
 | |
| //		[Map.ZeroOrMore]
 | |
| 		public NvdlRuleList Rules {
 | |
| 			get { return rules; }
 | |
| 		}
 | |
| 
 | |
| //		[Map.Attribute]
 | |
| //		[MapType ("NCName", XmlSchema.Namespace)]
 | |
| 		public string StartMode {
 | |
| 			get { return startMode; }
 | |
| 			set { startMode = value != null ? value.Trim (Nvdl.Whitespaces) : null; }
 | |
| 		}
 | |
| 
 | |
| //		[Map.OneOrMore]
 | |
| 		public NvdlModeList Modes {
 | |
| 			get { return modes; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	element trigger {
 | |
| 		(attribute ns { xsd:string },
 | |
| 		attribute nameList { list { xsd:NCName } })
 | |
| 		& foreign
 | |
| 	}
 | |
| 	*/
 | |
| 	public class NvdlTrigger : NvdlAttributable
 | |
| 	{
 | |
| 		string ns;
 | |
| 		string nameList;
 | |
| 
 | |
| //		[Map.Attribute]
 | |
| 		public string NS {
 | |
| 			get { return ns; }
 | |
| 			set { ns = value; }
 | |
| 		}
 | |
| 
 | |
| //		[Map.Attribute]
 | |
| //		[Map.List]
 | |
| 		public string NameList {
 | |
| 			get { return nameList; }
 | |
| 			set { nameList = value != null ? value.Trim (Nvdl.Whitespaces) : null; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	element mode {
 | |
| 		(attribute name { xsd:NCName },
 | |
| 		includedMode*,
 | |
| 		rule*)
 | |
| 		& foreign
 | |
| 	}
 | |
| 	*/
 | |
| 	public abstract class NvdlModeBase : NvdlAttributable
 | |
| 	{
 | |
| 		NvdlModeList includedModes = new NvdlModeList ();
 | |
| 		NvdlRuleList rules = new NvdlRuleList ();
 | |
| 
 | |
| //		[Map.ZeroOrMore]
 | |
| 		public NvdlModeList IncludedModes {
 | |
| 			get { return includedModes; }
 | |
| 		}
 | |
| 
 | |
| //		[Map.ZeroOrMore]
 | |
| 		public NvdlRuleList Rules {
 | |
| 			get { return rules; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlNestedMode : NvdlModeBase
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlMode : NvdlModeBase
 | |
| 	{
 | |
| 		string name;
 | |
| 
 | |
| //		[Map.Attribute]
 | |
| //		[MapType ("NCName", XmlSchema.Namespace)]
 | |
| 		public string Name {
 | |
| 			get { return name; }
 | |
| 			set { name = value != null ? value.Trim (Nvdl.Whitespaces) : null; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlIncludedMode : NvdlModeBase
 | |
| 	{
 | |
| 		string name;
 | |
| 
 | |
| //		[Map.Attribute]
 | |
| //		[Map.Optional]
 | |
| //		[MapType ("NCName", XmlSchema.Namespace)]
 | |
| 		public string Name {
 | |
| 			get { return name; }
 | |
| 			set { name = value != null ? value.Trim (Nvdl.Whitespaces) : null; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public enum NvdlRuleTarget {
 | |
| 		None,
 | |
| 		Elements,
 | |
| 		Attributes,
 | |
| 		Both
 | |
| 	}
 | |
| 
 | |
| 	public abstract class NvdlRule : NvdlAttributable
 | |
| 	{
 | |
| 		NvdlRuleTarget match;
 | |
| 		NvdlActionList actions = new NvdlActionList ();
 | |
| 
 | |
| 		public NvdlRuleTarget Match {
 | |
| 			get { return match; }
 | |
| 			set { match = value; }
 | |
| 		}
 | |
| 
 | |
| 		public NvdlActionList Actions {
 | |
| 			get { return actions; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	element namespace {
 | |
| 		(attribute ns { xsd:string },
 | |
| 		attribute wildCard {xsd:string{maxLength = "1"}}?,
 | |
| 		ruleModel)
 | |
| 		& foreign
 | |
| 	}
 | |
| 	*/
 | |
| 	public class NvdlNamespace : NvdlRule
 | |
| 	{
 | |
| 		string ns;
 | |
| 		string wildcard;
 | |
| 
 | |
| //		[Map.Attribute]
 | |
| 		public string NS {
 | |
| 			get { return ns; }
 | |
| 			set { ns = value; }
 | |
| 		}
 | |
| 
 | |
| //		[Map.Attribute]
 | |
| 		public string Wildcard {
 | |
| 			get { return wildcard; }
 | |
| 			set {
 | |
| 				if (value != null && value.Length > 1)
 | |
| 					throw new ArgumentException ("wildCard attribute can contain at most one character.");
 | |
| 				wildcard = value;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	element anyNamespace { ruleModel & foreign}
 | |
| 	*/
 | |
| 	public class NvdlAnyNamespace : NvdlRule
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	public abstract class NvdlAction : NvdlAttributable
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	element cancelNestedActions {foreign}
 | |
| 	*/
 | |
| 	public class NvdlCancelAction : NvdlAction
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	public abstract class NvdlNoCancelAction : NvdlAction
 | |
| 	{
 | |
| 		NvdlModeUsage modeUsage;
 | |
| 		string messageAttr;
 | |
| 		NvdlMessageList messages = new NvdlMessageList ();
 | |
| 
 | |
| 		public NvdlModeUsage ModeUsage {
 | |
| 			get { return modeUsage; }
 | |
| 			set { modeUsage = value; }
 | |
| 		}
 | |
| 
 | |
| 		public string SimpleMessage {
 | |
| 			get { return messageAttr; }
 | |
| 			set { messageAttr = value; }
 | |
| 		}
 | |
| 
 | |
| 		public NvdlMessageList Messages {
 | |
| 			get { return messages; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public abstract class NvdlNoResultAction : NvdlNoCancelAction
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	public enum NvdlResultType {
 | |
| 		Attach,
 | |
| 		AttachPlaceholder,
 | |
| 		Unwrap
 | |
| 	}
 | |
| 
 | |
| 	public abstract class NvdlResultAction : NvdlNoCancelAction
 | |
| 	{
 | |
| 		public abstract NvdlResultType ResultType { get; }
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlAttach : NvdlResultAction
 | |
| 	{
 | |
| 		public override NvdlResultType ResultType {
 | |
| 			get { return NvdlResultType.Attach; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlAttachPlaceholder : NvdlResultAction
 | |
| 	{
 | |
| 		public override NvdlResultType ResultType {
 | |
| 			get { return NvdlResultType.AttachPlaceholder; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlUnwrap : NvdlResultAction
 | |
| 	{
 | |
| 		public override NvdlResultType ResultType {
 | |
| 			get { return NvdlResultType.Unwrap; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	element validate {
 | |
| 		(schemaType?,
 | |
| 		(message | option)*,
 | |
| 		schema,
 | |
| 		modeUsage) & foreign
 | |
| 	}
 | |
| 
 | |
| 	schema =
 | |
| 		attribute schema { xsd:anyURI } |
 | |
| 		element schema {(text | foreignElement), foreignAttribute*}
 | |
| 	*/
 | |
| 	public class NvdlValidate : NvdlNoResultAction
 | |
| 	{
 | |
| 		string schemaType;
 | |
| 		NvdlOptionList options = new NvdlOptionList ();
 | |
| 		string schemaUri;
 | |
| 		XmlElement schemaBody;
 | |
| 
 | |
| //		[Map.Attribute]
 | |
| //		[MapType ("NCName", XmlSchema.Namespace)]
 | |
| 		public string SchemaType {
 | |
| 			get { return schemaType; }
 | |
| 			set { schemaType = value != null ? value.Trim (Nvdl.Whitespaces) : null; }
 | |
| 		}
 | |
| 
 | |
| 		public NvdlOptionList Options {
 | |
| 			get { return options; }
 | |
| 		}
 | |
| 
 | |
| //		[MapType ("anyURI", XmlSchema.Namespace)]
 | |
| 		public string SchemaUri {
 | |
| 			get { return schemaUri; }
 | |
| 			set { schemaUri = value; }
 | |
| 		}
 | |
| 
 | |
| 		public XmlElement SchemaBody {
 | |
| 			get { return schemaBody; }
 | |
| 			set { schemaBody = value; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlAllow : NvdlNoResultAction
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlReject : NvdlNoResultAction
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlMessage : NvdlElementBase
 | |
| 	{
 | |
| 		string text;
 | |
| 		string xmlLang;
 | |
| 		ArrayList foreignAttributes = new ArrayList ();
 | |
| 
 | |
| 		public string Text {
 | |
| 			get { return text; }
 | |
| 			set { text = value; }
 | |
| 		}
 | |
| 
 | |
| 		public string XmlLang {
 | |
| 			get { return xmlLang; }
 | |
| 			set { xmlLang = value; }
 | |
| 		}
 | |
| 
 | |
| 		public ArrayList ForeignAttributes {
 | |
| 			get { return foreignAttributes; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlOption : NvdlAttributable
 | |
| 	{
 | |
| 		string name;
 | |
| 		string arg;
 | |
| 		string mustSupport;
 | |
| 
 | |
| 		public string Name {
 | |
| 			get { return name; }
 | |
| 			set { name = value; }
 | |
| 		}
 | |
| 
 | |
| 		public string Arg {
 | |
| 			get { return arg; }
 | |
| 			set { arg = value; }
 | |
| 		}
 | |
| 
 | |
| 		public string MustSupport {
 | |
| 			get { return mustSupport; }
 | |
| 			set { mustSupport = value != null ? value.Trim (Nvdl.Whitespaces) : null; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	(attribute useMode { xsd:NCName } | nestedMode)?,
 | |
| 	element context {
 | |
| 		(attribute path { path },
 | |
| 		(attribute useMode { xsd:NCName } | nestedMode)?)
 | |
| 		& foreign
 | |
| 	}*
 | |
| 	*/
 | |
| 	public class NvdlModeUsage
 | |
| 	{
 | |
| 		string useMode;
 | |
| 		NvdlNestedMode nestedMode;
 | |
| 		NvdlContextList contexts = new NvdlContextList ();
 | |
| 
 | |
| 		public string UseMode {
 | |
| 			get { return useMode; }
 | |
| 			set { useMode = value != null ? value.Trim (Nvdl.Whitespaces) : null; }
 | |
| 		}
 | |
| 
 | |
| 		public NvdlNestedMode NestedMode {
 | |
| 			get { return nestedMode; }
 | |
| 			set { nestedMode = value; }
 | |
| 		}
 | |
| 
 | |
| 		public NvdlContextList Contexts {
 | |
| 			get { return contexts; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlContext : NvdlAttributable
 | |
| 	{
 | |
| 		string path;
 | |
| 		string useMode;
 | |
| 		NvdlNestedMode nestedMode;
 | |
| 
 | |
| 		public string Path {
 | |
| 			get { return path; }
 | |
| 			set { path = value; }
 | |
| 		}
 | |
| 
 | |
| 		public string UseMode {
 | |
| 			get { return useMode; }
 | |
| 			set { useMode = value != null ? value.Trim (Nvdl.Whitespaces) : null; }
 | |
| 		}
 | |
| 
 | |
| 		public NvdlNestedMode NestedMode {
 | |
| 			get { return nestedMode; }
 | |
| 			set { nestedMode = value; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlTriggerList : CollectionBase
 | |
| 	{
 | |
| 		public NvdlTrigger this [int i] {
 | |
| 			get { return (NvdlTrigger) List [i]; }
 | |
| 			set { List [i] = (NvdlTrigger) value; }
 | |
| 		}
 | |
| 
 | |
| 		public void Add (NvdlTrigger item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 
 | |
| 		public void Remove (NvdlTrigger item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlRuleList : CollectionBase
 | |
| 	{
 | |
| 		public NvdlRule this [int i] {
 | |
| 			get { return (NvdlRule) List [i]; }
 | |
| 			set { List [i] = (NvdlRule) value; }
 | |
| 		}
 | |
| 
 | |
| 		public void Add (NvdlRule item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 
 | |
| 		public void Remove (NvdlRule item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlModeList : CollectionBase
 | |
| 	{
 | |
| 		public NvdlModeBase this [int i] {
 | |
| 			get { return (NvdlModeBase) List [i]; }
 | |
| 			set { List [i] = (NvdlModeBase) value; }
 | |
| 		}
 | |
| 
 | |
| 		public void Add (NvdlModeBase item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 
 | |
| 		public void Remove (NvdlModeBase item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlContextList : CollectionBase
 | |
| 	{
 | |
| 		public NvdlContext this [int i] {
 | |
| 			get { return (NvdlContext) List [i]; }
 | |
| 			set { List [i] = (NvdlContext) value; }
 | |
| 		}
 | |
| 
 | |
| 		public void Add (NvdlContext item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 
 | |
| 		public void Remove (NvdlContext item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlActionList : CollectionBase
 | |
| 	{
 | |
| 		public NvdlAction this [int i] {
 | |
| 			get { return (NvdlAction) List [i]; }
 | |
| 			set { List [i] = (NvdlAction) value; }
 | |
| 		}
 | |
| 
 | |
| 		public void Add (NvdlAction item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 
 | |
| 		public void Remove (NvdlAction item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlOptionList : CollectionBase
 | |
| 	{
 | |
| 		public NvdlOption this [int i] {
 | |
| 			get { return (NvdlOption) List [i]; }
 | |
| 			set { List [i] = (NvdlOption) value; }
 | |
| 		}
 | |
| 
 | |
| 		public void Add (NvdlOption item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 
 | |
| 		public void Remove (NvdlOption item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class NvdlMessageList : CollectionBase
 | |
| 	{
 | |
| 		public NvdlMessage this [int i] {
 | |
| 			get { return (NvdlMessage) List [i]; }
 | |
| 			set { List [i] = (NvdlMessage) value; }
 | |
| 		}
 | |
| 
 | |
| 		public void Add (NvdlMessage item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 
 | |
| 		public void Remove (NvdlMessage item)
 | |
| 		{
 | |
| 			List.Add (item);
 | |
| 		}
 | |
| 	}
 | |
| }
 |