static int Main(string[] raw)
        {
            String temp;
		    bool wait = ArgumentList.Remove(ref raw, "wait", out temp);
            bool addMissing = ArgumentList.Remove(ref raw, "add-missing", out temp);

            try
		    {
		        var entryAssembly = Assembly.GetEntryAssembly();
		        if (entryAssembly != null && !ArgumentList.Remove(ref raw, "nologo", out temp))
		        {
		            var aname = entryAssembly.GetName();
		            aname.CultureInfo = null;
		            Console.WriteLine("{0}", aname);
		            foreach (
		                AssemblyCopyrightAttribute a in
		                    entryAssembly.GetCustomAttributes(typeof (AssemblyCopyrightAttribute), false))
		                Console.WriteLine("{0}", a.Copyright);
		            Console.WriteLine();
		        }

		        if (ArgumentList.Remove(ref raw, "verbose", out temp) || ArgumentList.Remove(ref raw, "verbosity", out temp))
		        {
		            SourceLevels traceLevel;
		            try
		            {
		                traceLevel = (SourceLevels) Enum.Parse(typeof (SourceLevels), temp);
		            }
		            catch
		            {
		                traceLevel = SourceLevels.All;
		            }

		            Trace.Listeners.Add(new ConsoleTraceListener()
		            {
		                Filter = new EventTypeFilter(traceLevel),
		                IndentLevel = 0,
		                TraceOutputOptions = TraceOptions.None
		            });
		        }

		        var argsList = new List<string>();
		        foreach (string arg in raw)
		        {
		            if (arg.StartsWith("@"))
		            {
		                foreach (var line in File.ReadAllLines(arg.Substring(1)))
		                {
		                    if (!String.IsNullOrEmpty(line) && line.Trim().Length > 0)
		                        argsList.Add(line.Trim());
		                }
		            }
		            else
		            {
		                argsList.Add(arg);
		            }
		        }

		        raw = argsList.ToArray();
		        if (ArgumentList.Remove(ref raw, "?", out temp) || ArgumentList.Remove(ref raw, "help", out temp))
		            return DoHelp();

                var args = new ArgumentList(StringComparer.Ordinal, raw);
		        if (args.Unnamed.Count == 0 || args.Count == 0)
		            return DoHelp();

		        var files = new FileList();
		        files.ProhibitedAttributes = FileAttributes.Hidden | FileAttributes.System;
		        files.RecurseFolders = true;
		        files.FileFound +=
		            delegate(object sender, FileList.FileFoundEventArgs eventArgs)
		            {
		                eventArgs.Ignore = !eventArgs.File.Name.StartsWith("AssemblyInfo");
		            };

		        foreach (var arg in args.Unnamed)
		            files.Add(arg);

		        var processor = new AssemblyFileProcessor(args, addMissing);
		        foreach (FileInfo file in files.ToArray())
		        {
		            processor.ProcessFile(file);
		        }
		    }
		    catch (ApplicationException ae)
		    {
		        Trace.TraceError("{0}", ae);
		        Console.Error.WriteLine();
		        Console.Error.WriteLine(ae.Message);
		        Environment.ExitCode = -1;
		    }
		    catch (Exception e)
		    {
		        Trace.TraceError("{0}", e);
		        Console.Error.WriteLine();
		        Console.Error.WriteLine(e.ToString());
		        Environment.ExitCode = -1;
		    }
		    finally
		    {
		        if (wait)
		        {
		            Console.WriteLine();
		            Console.WriteLine("Press [Enter] to continue...");
		            Console.ReadLine();
		        }
		    }
		    return Environment.ExitCode;
		}
        static int Main(string[] raw)
        {
            String temp;
            bool   wait       = ArgumentList.Remove(ref raw, "wait", out temp);
            bool   addMissing = ArgumentList.Remove(ref raw, "add-missing", out temp);

            try
            {
                var entryAssembly = Assembly.GetEntryAssembly();
                if (entryAssembly != null && !ArgumentList.Remove(ref raw, "nologo", out temp))
                {
                    var aname = entryAssembly.GetName();
                    aname.CultureInfo = null;
                    Console.WriteLine("{0}", aname);
                    foreach (
                        AssemblyCopyrightAttribute a in
                        entryAssembly.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false))
                    {
                        Console.WriteLine("{0}", a.Copyright);
                    }
                    Console.WriteLine();
                }

                if (ArgumentList.Remove(ref raw, "verbose", out temp) || ArgumentList.Remove(ref raw, "verbosity", out temp))
                {
                    SourceLevels traceLevel;
                    try
                    {
                        traceLevel = (SourceLevels)Enum.Parse(typeof(SourceLevels), temp);
                    }
                    catch
                    {
                        traceLevel = SourceLevels.All;
                    }

                    Trace.Listeners.Add(new ConsoleTraceListener()
                    {
                        Filter             = new EventTypeFilter(traceLevel),
                        IndentLevel        = 0,
                        TraceOutputOptions = TraceOptions.None
                    });
                }

                var argsList = new List <string>();
                foreach (string arg in raw)
                {
                    if (arg.StartsWith("@"))
                    {
                        foreach (var line in File.ReadAllLines(arg.Substring(1)))
                        {
                            if (!String.IsNullOrEmpty(line) && line.Trim().Length > 0)
                            {
                                argsList.Add(line.Trim());
                            }
                        }
                    }
                    else
                    {
                        argsList.Add(arg);
                    }
                }

                raw = argsList.ToArray();
                if (ArgumentList.Remove(ref raw, "?", out temp) || ArgumentList.Remove(ref raw, "help", out temp))
                {
                    return(DoHelp());
                }

                var args = new ArgumentList(StringComparer.Ordinal, raw);
                if (args.Unnamed.Count == 0 || args.Count == 0)
                {
                    return(DoHelp());
                }

                var files = new FileList();
                files.ProhibitedAttributes = FileAttributes.Hidden | FileAttributes.System;
                files.RecurseFolders       = true;
                files.FileFound           +=
                    delegate(object sender, FileList.FileFoundEventArgs eventArgs)
                {
                    eventArgs.Ignore = !eventArgs.File.Name.StartsWith("AssemblyInfo");
                };

                foreach (var arg in args.Unnamed)
                {
                    files.Add(arg);
                }

                var processor = new AssemblyFileProcessor(args, addMissing);
                foreach (FileInfo file in files.ToArray())
                {
                    processor.ProcessFile(file);
                }
            }
            catch (ApplicationException ae)
            {
                Trace.TraceError("{0}", ae);
                Console.Error.WriteLine();
                Console.Error.WriteLine(ae.Message);
                Environment.ExitCode = -1;
            }
            catch (Exception e)
            {
                Trace.TraceError("{0}", e);
                Console.Error.WriteLine();
                Console.Error.WriteLine(e.ToString());
                Environment.ExitCode = -1;
            }
            finally
            {
                if (wait)
                {
                    Console.WriteLine();
                    Console.WriteLine("Press [Enter] to continue...");
                    Console.ReadLine();
                }
            }
            return(Environment.ExitCode);
        }