From 3aaaf142be657201a2664c10b96447acb1610187 Mon Sep 17 00:00:00 2001
From: Dimitri van Heesch <dimitri@stack.nl>
Date: Tue, 24 Aug 2004 20:00:14 +0000
Subject: Release-1.3.8-20040824

---
 INSTALL                         |   4 +-
 README                          |   4 +-
 VERSION                         |   2 +-
 addon/doxywizard/doxywizard.cpp |   9 ++
 addon/doxywizard/doxywizard.h   |   2 +-
 configure                       |  48 ++++----
 doc/commands.doc                |   5 +-
 packages/rpm/doxygen.spec       |   2 +-
 src/code.l                      |   5 +
 src/definition.h                |   2 +-
 src/dirdef.cpp                  | 134 +++++++++++++++++++++++
 src/dirdef.h                    |  61 +++++++++++
 src/docparser.cpp               |  25 ++++-
 src/docparser.h                 |   8 +-
 src/dot.cpp                     |  26 ++++-
 src/dot.h                       |   2 +
 src/doxygen.cpp                 |  16 ++-
 src/doxygen.h                   |   2 +
 src/filedef.cpp                 |   7 +-
 src/filedef.h                   |  21 ++--
 src/groupdef.cpp                |   3 +-
 src/groupdef.h                  |   3 +-
 src/htmldocvisitor.cpp          |  15 ++-
 src/htmlgen.cpp                 |  35 +++---
 src/htmlgen.h                   |   4 +-
 src/index.cpp                   |  69 ++++++++----
 src/libdoxygen.pro.in           |   2 +
 src/logos.cpp                   | 237 ++++++++++++++++++----------------------
 src/memberdef.cpp               |  45 +++++---
 src/memberdef.h                 |   5 +-
 src/membergroup.cpp             |   4 +-
 src/scanner.l                   |   4 +-
 src/util.cpp                    |  40 ++++++-
 tmake/lib/aix-xlc/tmake.conf    |   6 +-
 34 files changed, 606 insertions(+), 251 deletions(-)
 create mode 100644 src/dirdef.cpp
 create mode 100644 src/dirdef.h

diff --git a/INSTALL b/INSTALL
index cc051af..d631c9a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
-DOXYGEN Version 1.3.8-20040812
+DOXYGEN Version 1.3.8-20040824
 
 Please read the installation section of the manual 
 (http://www.doxygen.org/install.html) for instructions.
 
 --------
-Dimitri van Heesch (12 August 2004)
+Dimitri van Heesch (24 August 2004)
diff --git a/README b/README
index 4875825..916ed03 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.3.8_20040812
+DOXYGEN Version 1.3.8_20040824
 
 Please read INSTALL for compilation instructions.
 
@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
 
 Enjoy,
 
-Dimitri van Heesch (dimitri@stack.nl) (12 August 2004)
+Dimitri van Heesch (dimitri@stack.nl) (24 August 2004)
diff --git a/VERSION b/VERSION
index e2c7de3..b894654 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.3.8-20040812
+1.3.8-20040824
diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp
index 7060242..5680455 100644
--- a/addon/doxywizard/doxywizard.cpp
+++ b/addon/doxywizard/doxywizard.cpp
@@ -1370,6 +1370,15 @@ int main(int argc,char **argv)
 {
   QApplication a(argc,argv);
   MainWidget main;
+  if (argc==2 && argv[1][0]!='-') // name of config file as an argument
+  {
+    main.loadConfigFromFile(argv[1]);
+  }
+  else if (argc>1)
+  {
+    printf("Usage: %s [config file]\n",argv[0]);
+    exit(1);
+  }
   a.setMainWidget(&main);
   main.show();
   return a.exec();
diff --git a/addon/doxywizard/doxywizard.h b/addon/doxywizard/doxywizard.h
index 6964cfe..c937dae 100644
--- a/addon/doxywizard/doxywizard.h
+++ b/addon/doxywizard/doxywizard.h
@@ -242,6 +242,7 @@ class MainWidget : public QMainWindow
   public:
     MainWidget(QWidget *parent=0);
    ~MainWidget();
+    void loadConfigFromFile(const QString &);
 
   private slots:
     void launchWizard();
@@ -263,7 +264,6 @@ class MainWidget : public QMainWindow
     
   private:
     void setConfigSaved(bool);
-    void loadConfigFromFile(const QString &);
     void addRecentFile(const QString &);
 
     QPushButton *m_wizard;
diff --git a/configure b/configure
index b1f02ee..3985b91 100755
--- a/configure
+++ b/configure
@@ -234,27 +234,35 @@ if test "$f_wizard" = YES; then
   if test -z "$QTDIR"; then
     echo "  QTDIR environment variable not set!"
     echo -n "  Checking for Qt..."
-    if test -d "/usr/lib/qt3/lib"; then
-      if test -d "/usr/lib/qt3/include"; then
-        if test -x "/usr/lib/qt3/bin/moc"; then
-          QTDIR="/usr/lib/qt3"
-        fi
-      fi
-    fi
-    if test -d "/usr/lib/qt2/lib"; then
-      if test -d "/usr/lib/qt2/include"; then
-        if test -x "/usr/lib/qt2/bin/moc"; then
-          QTDIR="/usr/lib/qt2"
-        fi
-      fi
-    fi
-    if test -d "/usr/lib/qt/lib"; then
-      if test -d "/usr/lib/qt/include"; then
-        if test -x "/usr/lib/qt/bin/moc"; then
-          QTDIR="/usr/lib/qt"
-        fi
+    for d in /usr/lib/{qt-3.1,qt3,qt2,qt,qt*}; do
+      if test -d "$d/lib" -a -d "$d/include" -a -x "$d/bin/moc"; then
+        QTDIR=$d
       fi
-    fi
+    done
+#     if test -d "/usr/lib/qt3/lib"; then
+#       if test -d "/usr/lib/qt3/include"; then
+#         if test -x "/usr/lib/qt3/bin/moc"; then
+#           QTDIR="/usr/lib/qt3"
+#         fi
+#       fi
+#     fi
+#     if test -d "/usr/lib/qt2/lib"; then
+#       if test -d "/usr/lib/qt2/include"; then
+#         if test -x "/usr/lib/qt2/bin/moc"; then
+#           QTDIR="/usr/lib/qt2"
+#         fi
+#       fi
+#     fi
+#     if test -d "/usr/lib/qt/lib"; then
+#       if test -d "/usr/lib/qt/include"; then
+#         if test -x "/usr/lib/qt/bin/moc"; then
+#           QTDIR="/usr/lib/qt"
+#         fi
+#       fi
+#     fi
+  else
+    echo "  Detected Qt via the QTDIR environment variable..."
+    echo -n "                    "
   fi
   if test -z "$QTDIR"; then
     echo "QTDIR not set and Qt not found at standard locations!"
diff --git a/doc/commands.doc b/doc/commands.doc
index 4ca0aa6..e6d4ad3 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -20,7 +20,7 @@
 
 All commands in the documentation start with a backslash (<b>\\</b>) or an
 at-sign (<b>\@</b>). If you prefer you can replace all commands starting with a 
-backslash below, by their counterparts that start with an at-sign.
+backslash below by their counterparts that start with an at-sign.
 
 Some commands have one or more arguments. 
 Each argument has a certain range:
@@ -350,6 +350,9 @@ doxygen. Unrecognized commands are treated as normal text.
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
 
+  \note In the above example \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF"
+  has been set to YES in the configuration file.
+
 <hr>
 \section cmdfn \fn (function declaration)
  
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
index 7ab9201..ba01fa0 100644
--- a/packages/rpm/doxygen.spec
+++ b/packages/rpm/doxygen.spec
@@ -1,6 +1,6 @@
 Summary: A documentation system for C/C++.
 Name: doxygen
-Version: 1.3.8_20040812
+Version: 1.3.8_20040824
 Release: 1
 Epoch: 1
 Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
diff --git a/src/code.l b/src/code.l
index 4961c36..60a2b10 100644
--- a/src/code.l
+++ b/src/code.l
@@ -1995,6 +1995,11 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
 					  addType();
   					  g_name+=yytext; 
 					}
+<Body>{SCOPENAME}/{B}*[;,)\]]		{ // "int var;" or "var, var2" or "debug(f) macro" 
+					  generateClassOrGlobalLink(*g_code,yytext,TRUE);
+					  addType();
+  					  g_name+=yytext; 
+					}
 <Body>{SCOPENAME}/{B}* 			{ // p->func()
 					  generateClassOrGlobalLink(*g_code,yytext);
 					  addType();
diff --git a/src/definition.h b/src/definition.h
index c9c8d69..9b006d5 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -48,7 +48,7 @@ class Definition
     enum DefType 
     { 
       TypeClass, TypeMember, TypeFile, TypeGroup, 
-      TypeNamespace, TypePackage, TypePage
+      TypeNamespace, TypePackage, TypePage, TypeDir
     };
     /*! Use this for dynamic inspection of the type of the derived class */
     virtual DefType definitionType() = 0;
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
new file mode 100644
index 0000000..d7c46b1
--- /dev/null
+++ b/src/dirdef.cpp
@@ -0,0 +1,134 @@
+#include "dirdef.h"
+#include "filename.h"
+#include "doxygen.h"
+#include "util.h"
+
+//----------------------------------------------------------------------
+// method implementation
+
+DirDef::DirDef(const char *path) : Definition(path,1,path),
+   m_parent(0)
+{
+  // get short name (stipping the paths mentioned in STRIP_FROM_PATH)
+  m_dispName = stripFromPath(path);
+  m_subdirs.setAutoDelete(TRUE);
+  m_fileList = new FileList;
+  m_classSDict = new ClassSDict(17);
+}
+
+DirDef::~DirDef()
+{
+}
+
+void DirDef::addSubDir(DirDef *subdir)
+{
+  m_subdirs.append(subdir);
+  subdir->m_parent=this;
+}
+
+void DirDef::addFile(FileDef *fd)
+{
+  m_fileList->append(fd);
+  fd->setDirDef(this);
+}
+
+//----------------------------------------------------------------------
+// helper functions
+
+DirDef *DirDef::createNewDir(const char *path)
+{
+  ASSERT(path!=0);
+  DirDef *dir = Doxygen::directories.find(path);
+  if (dir==0) // new dir
+  {
+    //printf("Adding new dir %s\n",path);
+    dir = new DirDef(path);
+    Doxygen::directories.inSort(path,dir);
+  }
+  return dir;
+}
+
+bool DirDef::matchPath(const QCString &path,QStrList &l)
+{
+  const char *s=l.first();
+  while (s)
+  {
+    QCString prefix = s;
+    if (stricmp(prefix.left(path.length()),path)==0) // case insensitive compare
+    {
+      return TRUE;
+    }
+    s = l.next();
+  }
+  return FALSE;
+}
+
+/*! strip part of \a path if it matches
+ *  one of the paths in the Config_getList("STRIP_FROM_PATH") list
+ */
+DirDef *DirDef::mergeDirectoryInTree(const QCString &path)
+{
+  int p=0,i=0;
+  DirDef *dir=0;
+  while ((i=path.find('/',p))!=-1)
+  {
+    QCString part=path.left(i+1);
+    if (!matchPath(part,Config_getList("STRIP_FROM_PATH")))
+    {
+      dir=createNewDir(part); 
+    }
+    p=i+1;
+  }
+  return dir;
+}
+
+//----------------------------------------------------------------------
+// external functions
+
+void buildDirectories()
+{
+  // for each input file
+  FileNameListIterator fnli(Doxygen::inputNameList); 
+  FileName *fn;
+  for (fnli.toFirst();(fn=fnli.current());++fnli)
+  {
+    FileNameIterator fni(*fn);
+    FileDef *fd;
+    for (;(fd=fni.current());++fni)
+    {
+      if (!fd->getReference().isEmpty())
+      {
+        DirDef *dir;
+        if ((dir=Doxygen::directories.find(fd->getPath()))==0) // new directory
+        {
+          dir = DirDef::mergeDirectoryInTree(fd->getPath());
+        }
+        if (dir) dir->addFile(fd);
+      }
+      else
+      {
+        // do something for file imported via tag files.
+      }
+    }
+  }
+
+  DirDef *root = new DirDef("root:");
+  // compute relations between directories => introduce container dirs.
+  DirDef *dir;
+  SDict<DirDef>::Iterator sdi(Doxygen::directories);
+  for (sdi.toFirst();(dir=sdi.current());++sdi)
+  {
+    printf("New dir %s\n",dir->displayName().data());
+    QCString name = dir->name();
+    int i=name.findRev('/',name.length()-2);
+    if (i!=-1)
+    {
+      DirDef *parent = Doxygen::directories.find(name.left(i+1));
+      if (parent==0) parent=root;
+      parent->addSubDir(dir);
+      printf("DirDef::addSubdir(): Adding subdir\n%s to\n%s\n",
+          dir->displayName().data(), parent->displayName().data());
+    }
+  }
+}
+
diff --git a/src/dirdef.h b/src/dirdef.h
new file mode 100644
index 0000000..369bb09
--- /dev/null
+++ b/src/dirdef.h
@@ -0,0 +1,61 @@
+/******************************************************************************
+ *
+ * 
+ *
+ * Copyright (C) 1997-2004 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DIRDEF_H
+#define DIRDEF_H
+
+#include "qtbc.h"
+#include "sortdict.h"
+#include "definition.h"
+
+class FileList;
+class ClassSDict;
+class QStrList;
+class FileDef;
+
+class DirDef : public Definition
+{
+  public:
+    DirDef(const char *path);
+    virtual ~DirDef();
+    virtual DefType definitionType() { return TypeDir; }
+    virtual QCString getOutputFileBase() const { return ""; }
+    virtual bool isLinkableInProject() const { return FALSE; }
+    virtual bool isLinkable() const { return FALSE; }
+    QCString displayName() const { return m_dispName; }
+    void addSubDir(DirDef *subdir);
+    FileList *   getFiles() const        { return m_fileList; }
+    ClassSDict * getClasses() const      { return m_classSDict; }
+    DirDef *parent() const { return m_parent; }
+    void addFile(FileDef *fd);
+
+    static DirDef *mergeDirectoryInTree(const QCString &path);
+
+  private:
+    static DirDef *createNewDir(const char *path);
+    static bool matchPath(const QCString &path,QStrList &l);
+
+    QList<DirDef> m_subdirs;
+    DirDef *m_parent;
+    QCString m_dispName;
+    FileList *m_fileList;                 // list of files in the group
+    ClassSDict *m_classSDict;             // list of classes in the group
+};
+
+void buildDirectories();
+
+#endif
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 6043a2d..d474cfe 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -747,6 +747,7 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children)
   MemberDef  *member=0;
   QString name = linkToText(g_token->name,TRUE);
   int len = g_token->name.length();
+  ClassDef *cd=0;
   if (!g_insideHtmlLink && 
       resolveRef(g_context,g_token->name,g_inSeeBlock,&compound,&member))
   {
@@ -784,6 +785,16 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children)
     handleLinkedWord(parent,children);
     children.append(new DocWord(parent,":"));
   }
+  else if (!g_insideHtmlLink && (cd=getClass(g_token->name+"-p")))
+  {
+    // special case 2, where the token name is not a class, but could
+    // be a Obj-C protocol
+    children.append(new 
+        DocLinkedWord(parent,name,
+          cd->getReference(),
+          cd->getOutputFileBase(),
+          ""));
+  }
   else // normal non-linkable word
   {
     children.append(new DocWord(parent,g_token->name));
@@ -4383,15 +4394,25 @@ reparsetoken:
 	      goto endparagraph;
 	    }
 	  }
+
+          // determine list depth
+          int depth = 0;
+          n=parent();
+          while(n) {
+            if(n->kind() == DocNode::Kind_AutoList) ++depth;
+            n=n->parent();
+          }
+
 	  // first item or sub list => create new list
 	  DocAutoList *al=0;
 	  do
 	  {
-	    al = new DocAutoList(this,g_token->indent,g_token->isEnumList);
+	    al = new DocAutoList(this,g_token->indent,g_token->isEnumList,
+                                 depth);
 	    m_children.append(al);
 	    retval = al->parse();
 	  } while (retval==TK_LISTITEM &&         // new list
-	           al->indent()==g_token->indent  // at some indent level
+	           al->indent()==g_token->indent  // at same indent level
 		  );
 	      
 	  // check the return value
diff --git a/src/docparser.h b/src/docparser.h
index b5467c2..4b9b044 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -507,12 +507,15 @@ class DocCopy : public CompAccept<DocCopy>, public DocNode
 class DocAutoList : public CompAccept<DocAutoList>, public DocNode
 {
   public:
-    DocAutoList(DocNode *parent,int indent,bool isEnumList) : 
-      m_parent(parent), m_indent(indent), m_isEnumList(isEnumList) {}
+    DocAutoList(DocNode *parent,int indent,bool isEnumList,
+                int depth) : 
+      m_parent(parent), m_indent(indent), m_isEnumList(isEnumList),
+      m_depth(depth) {}
     Kind kind() const          { return Kind_AutoList; }
     bool isEnumList() const    { return m_isEnumList; }
     int  indent() const        { return m_indent; }
     DocNode *parent() const    { return m_parent; }
+    int depth() const          { return m_depth; }
     void accept(DocVisitor *v) { CompAccept<DocAutoList>::accept(this,v); }
     int parse();
 
@@ -520,6 +523,7 @@ class DocAutoList : public CompAccept<DocAutoList>, public DocNode
     DocNode *m_parent;
     int      m_indent;
     bool     m_isEnumList;
+    int      m_depth;
 };
 
 
diff --git a/src/dot.cpp b/src/dot.cpp
index 4bde818..9e26576 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -962,7 +962,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
   QDir thisDir;
 
   // put each connected subgraph of the hierarchy in a row of the HTML output
-  out << "<table border=0 cellspacing=10 cellpadding=0>" << endl;
+  out << "<table border=\"0\" cellspacing=\"10\" cellpadding=\"0\">" << endl;
 
   QListIterator<DotNode> dnli(*m_rootSubgraphs);
   DotNode *n;
@@ -2105,11 +2105,21 @@ DotCallGraph::DotCallGraph(MemberDef *md,int maxRecursionDepth)
   m_maxDistance = 0;
   m_recDepth = maxRecursionDepth;
   m_diskName = md->getOutputFileBase()+"_"+md->anchor();
+  m_scope    = md->getOuterScope();
   QCString uniqueId;
   uniqueId = md->getReference()+"$"+
              md->getOutputFileBase()+"#"+md->anchor();
+  QCString name;
+  if (Config_getBool("HIDE_SCOPE_NAMES"))
+  {
+    name = md->name();
+  }
+  else
+  {
+    name = md->qualifiedName();
+  }
   m_startNode = new DotNode(m_curNodeNumber++,
-                            md->qualifiedName(),
+                            linkToText(name,FALSE),
                             uniqueId.data(),
                             0,       // distance
                             TRUE     // root node
@@ -2280,9 +2290,19 @@ void DotCallGraph::buildGraph(DotNode *n,MemberDef *md,int distance)
         }
         else
         {
+          QCString name;
+          if (Config_getBool("HIDE_SCOPE_NAMES"))
+          {
+            name  = rmd->getOuterScope()==m_scope ? 
+                    rmd->name() : rmd->qualifiedName();
+          }
+          else
+          {
+            name = rmd->qualifiedName();
+          }
           bn = new DotNode(
               m_curNodeNumber++,
-              rmd->qualifiedName(),
+              linkToText(name,FALSE),
               uniqueId,
               distance
               );
diff --git a/src/dot.h b/src/dot.h
index a70f561..4bb218f 100644
--- a/src/dot.h
+++ b/src/dot.h
@@ -30,6 +30,7 @@ class QTextStream;
 class DotNodeList;
 class ClassSDict;
 class MemberDef;
+class Definition;
 
 enum GraphOutputFormat { BITMAP , EPS };
 
@@ -197,6 +198,7 @@ class DotCallGraph
     int             m_maxDistance;
     int             m_recDepth;
     QCString        m_diskName;
+    Definition *    m_scope;
 };
 
 void generateGraphLegend(const char *path);
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 7fe82bb..82cac55 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -43,6 +43,7 @@
 #include "tagreader.h"
 #include "dot.h"
 #include "docparser.h"
+#include "dirdef.h"
 
 #include "outputlist.h"
 #include "declinfo.h"
@@ -120,6 +121,7 @@ SDict<DefinitionList> *Doxygen::symbolMap;
 bool           Doxygen::outputToWizard=FALSE;
 QDict<int> *   Doxygen::htmlDirMap = 0;
 QCache<LookupInfo> Doxygen::lookupCache(20000,20000);
+SDict<DirDef>  Doxygen::directories(17);
 
 static StringList     inputFiles;         
 static StringDict     excludeNameDict(1009);   // sections
@@ -2731,7 +2733,8 @@ static void transferFunctionDocumentation()
                                   mdef->getGroupPri(),
                                   mdef->docFile(),
                                   mdef->docLine(),
-                                  mdef->hasDocumentation()
+                                  mdef->hasDocumentation(),
+                                  mdef
                                  );
               }
               else if (mdef->getGroupDef()==0 && mdec->getGroupDef()!=0)
@@ -2740,7 +2743,8 @@ static void transferFunctionDocumentation()
                                   mdec->getGroupPri(),
                                   mdec->docFile(),
                                   mdec->docLine(),
-                                  mdec->hasDocumentation()
+                                  mdec->hasDocumentation(),
+                                  mdec
                                  );
               }
 
@@ -6683,13 +6687,14 @@ static void buildExampleList(Entry *root)
       else
       {
         PageDef *pd=new PageDef(root->fileName,root->startLine,
-                                  root->name,root->doc,root->args);
+                                root->name,root->doc,root->args);
         pd->setFileName(convertNameToFile(pd->name()+"-example"));
         pd->addSectionsToDefinition(root->anchors);
         //pi->addSections(root->anchors);
         
         Doxygen::exampleSDict->inSort(root->name,pd);
-        addExampleToGroups(root,pd);
+        //we don't add example to groups 
+        //addExampleToGroups(root,pd);
       }
     }
   }
@@ -8252,6 +8257,9 @@ void parseInput()
   msg("Freeing input...\n");
   input.resize(0);
   
+  //msg("Building directory list...\n");
+  //buildDirectories();
+  
   msg("Building group list...\n");
   buildGroupList(root);
   organizeSubGroups(root);
diff --git a/src/doxygen.h b/src/doxygen.h
index 404ac22..f746cbf 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -40,6 +40,7 @@ class PageSList;
 class PageSDict;
 class PageDef;
 class SearchIndex;
+class DirDef;
 
 typedef QList<QCString>    StringList;
 typedef QDict<FileDef>     FileDict;
@@ -112,6 +113,7 @@ class Doxygen
     static bool                      outputToWizard;
     static QDict<int>               *htmlDirMap;
     static QCache<LookupInfo>        lookupCache;
+    static SDict<DirDef>             directories;
 };
 
 void initDoxygen();
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 12c9872..a05a5f8 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -904,6 +904,7 @@ static void mergeFileDef(Directory *root,FileDef *fd)
   dirNode->addChild(e);
 }
 
+#if 0
 static void generateIndent(QTextStream &t,DirEntry *de,int level)
 {
   if (de->parent())
@@ -949,7 +950,6 @@ static void generateIndent(QTextStream &t,DirEntry *de,int level)
   }
 }
 
-#if 0
 static void writeDirTreeNode(QTextStream &t,Directory *root,int level)
 {
   QCString indent;
@@ -989,16 +989,17 @@ static void addDirsAsGroups(Directory *root,GroupDef *parent,int level)
   {
     gd = new GroupDef("<generated>",
                       1,
-                      root->name(), // name
+                      root->path(), // name
                       root->name()  // title
                      );
     if (parent) 
     {
       parent->addGroup(gd);
+      gd->makePartOfGroup(parent);
     }
     else
     {
-      Doxygen::groupSDict.append(root->name(),gd);
+      Doxygen::groupSDict.append(root->path(),gd);
     }
   }
   QListIterator<DirEntry> dli(root->children());
diff --git a/src/filedef.h b/src/filedef.h
index c96f321..bceb878 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -38,6 +38,7 @@ class NamespaceDef;
 class NamespaceSDict;
 class MemberGroupSDict;
 class PackageDef;
+class DirDef;
 
 struct IncludeInfo
 {
@@ -133,6 +134,9 @@ class FileDef : public Definition
     void setPackageDef(PackageDef *pd) { package=pd; }
     PackageDef *packageDef() const { return package; }
     
+    void setDirDef(DirDef *dd) { dir=dd; }
+    DirDef *getDirDef() const { return dir; }
+
     void addUsingDirective(NamespaceDef *nd);
     NamespaceSDict *getUsedNamespaces() const { return usingDirList; }
     void addUsingDeclaration(Definition *def);
@@ -201,8 +205,8 @@ class FileDef : public Definition
     QIntDict<MemberDef> *srcMemberDict;
     bool isSource;
 
-
     PackageDef *package;
+    DirDef     *dir;
 };
 
 
@@ -250,18 +254,23 @@ class DirEntry
   public:
     enum EntryKind { Dir, File };
     DirEntry(DirEntry *parent,FileDef *fd)  
-       : m_parent(parent), m_kind(File), m_fd(fd), m_isLast(FALSE) { }
-    DirEntry(DirEntry *parent)              
-       : m_parent(parent), m_kind(Dir), m_fd(0), m_isLast(FALSE) { }
+       : m_parent(parent), m_name(fd->name()), m_kind(File), m_fd(fd), 
+         m_isLast(FALSE) { }
+    DirEntry(DirEntry *parent,QCString name)              
+       : m_parent(parent), m_name(name), m_kind(Dir), 
+         m_fd(0), m_isLast(FALSE) { }
     virtual ~DirEntry() { }
     EntryKind kind() const { return m_kind; }
     FileDef *file()  const { return m_fd; }
     bool isLast() const    { return m_isLast; }
     void setLast(bool b)   { m_isLast=b; }
     DirEntry *parent() const { return m_parent; }
+    QCString name() const  { return m_name; }
+    QCString path() const  { return parent() ? parent()->path()+"/"+name() : name(); }
 
   protected:
     DirEntry *m_parent;
+    QCString m_name;
   private:
     EntryKind m_kind;
     FileDef   *m_fd;
@@ -273,17 +282,15 @@ class Directory : public DirEntry
 {
   public:
     Directory(Directory *parent,const QCString &name) 
-       : DirEntry(parent), m_name(name)
+       : DirEntry(parent,name)
     { m_children.setAutoDelete(TRUE); }
     virtual ~Directory()              {}
     void addChild(DirEntry *d)        { m_children.append(d); d->setLast(TRUE); }
     QList<DirEntry> &children()       { return m_children; }
     void rename(const QCString &name) { m_name=name; }
     void reParent(Directory *parent)  { m_parent=parent; }
-    QCString name() const             { return m_name; }
 
   private:
-    QCString m_name;
     QList<DirEntry> m_children;
 };
 
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index aa4ec5b..ff39df4 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -828,7 +828,8 @@ void addMemberToGroups(Entry *root,MemberDef *md)
       if (success)
       {
         //printf("insertMember successful\n");
-        md->setGroupDef(fgd,pri,root->fileName,root->startLine,!root->doc.isEmpty());
+        md->setGroupDef(fgd,pri,root->fileName,root->startLine,
+                        !root->doc.isEmpty());
         ClassDef *cd = md->getClassDefOfAnonymousType();
         if (cd) cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
       }
diff --git a/src/groupdef.h b/src/groupdef.h
index bedc064..879b2a2 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -119,8 +119,7 @@ class GroupDef : public Definition
     FileList *fileList;                 // list of files in the group
     ClassSDict *classSDict;             // list of classes in the group
     NamespaceList *namespaceList;       // list of namespaces in the group
-    GroupList *groupList;              // list of sub groups.
-    //GroupList *parentGroupList;        // list of parent groups.
+    GroupList *groupList;               // list of sub groups.
     PageSDict *pageDict;                // list of pages in the group
     PageSDict *exampleDict;             // list of examples in the group
 
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index e6017ba..03a1759 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -29,6 +29,10 @@
 #include "htmlgen.h"
 
 
+static const int NUM_HTML_LIST_TYPES = 4;
+static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
+
+
 static QString htmlAttribsToString(const HtmlAttribList &attribs)
 {
   QString result;
@@ -327,12 +331,21 @@ void HtmlDocVisitor::visit(DocIndexEntry *)
 // visitor functions for compound nodes
 //--------------------------------------
 
+
 void HtmlDocVisitor::visitPre(DocAutoList *l)
 {
   if (m_hide) return;
   if (l->isEnumList())
   {
-    m_t << "<ol>";
+    //
+    // Do list type based on depth:
+    // 1.
+    //   a.
+    //     i.
+    //       A. 
+    //         1. (repeat)...
+    //
+    m_t << "<ol type=" << types[l->depth() % NUM_HTML_LIST_TYPES] << ">";
   }
   else
   {
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index a17c256..007827d 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -52,42 +52,37 @@ static const char *defaultStyleSheet =
 "DIV.qindex {\n"
 "	width: 100%;\n"
 "	background-color: #eeeeff;\n"
-"	border: 1px solid #B0B0B0;\n"
+"	border: 1px solid #b0b0b0;\n"
 "	text-align: center;\n"
 "	margin: 2px;\n"
 "	padding: 2px;\n"
-"	line-height: 120%;\n"
+"	line-height: 140%;\n"
 "}\n"
 "A.qindex {\n"
 "       text-decoration: none;\n"
 "       font-weight: bold;\n"
 "       color: #1A419D;\n"
-"       padding: 2px;\n"
 "}\n"
 "A.qindex:visited {\n"
 "       text-decoration: none;\n"
 "       font-weight: bold;\n"
 "       color: #1A419D\n"
-"       padding: 2px;\n"
 "}\n"
 "A.qindex:hover {\n"
 "	text-decoration: none;\n"
 "	background-color: #ddddff;\n"
-"	padding: 2px;\n"
 "}\n"
 "A.qindexHL {\n"
 "	text-decoration: none;\n"
 "	font-weight: bold;\n"
 "	background-color: #6666cc;\n"
 "	color: #ffffff;\n"
-"	padding: 2px 6px;\n"
 "	border: 1px double #9295C2;\n"
 "}\n"
 "A.qindexHL:hover {\n"
 "	text-decoration: none;\n"
 "	background-color: #6666cc;\n"
 "	color: #ffffff;\n"
-"	padding: 2px 6px;\n"
 "}\n"
 "A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff }\n"
 "A.el { text-decoration: none; font-weight: bold }\n"
@@ -359,9 +354,9 @@ void HtmlGenerator::writeFooterFile(QFile &file)
   QTextStream t(&file);
   t << "<hr size=\"1\"><address style=\"align: right;\"><small>\n";
   t << theTranslator->trGeneratedAt( "$datetime", "$projectname" );
-  t << " <a href=\"http://www.doxygen.org/index.html\">"
+  t << "&nbsp;<a href=\"http://www.doxygen.org/index.html\">"
     << "<img src=\"doxygen.png\" alt=\"doxygen\" " 
-    << "align=\"middle\" border=0>"
+    << "align=\"middle\" border=\"0\">"
     << "</a> $doxygenversion";
   t << "</small></address>\n"
     << "</body>\n"
@@ -446,9 +441,9 @@ static void writePageFooter(QTextStream &t,const QCString &lastTitle,
         dateToString(TRUE),
         Config_getString("PROJECT_NAME")
         );
-    t << endl << "<a href=\"http://www.doxygen.org/index.html\">";
+    t << "&nbsp;" << endl << "<a href=\"http://www.doxygen.org/index.html\">";
     t << endl << "<img src=\"" << relPath << "doxygen.png\" alt=\"doxygen\" " 
-      << "align=\"middle\" border=0 >" << "</a> " << versionString << " ";
+      << "align=\"middle\" border=\"0\">" << "</a> " << versionString << " ";
     t << "</small></address>";
     if (Debug::isFlagSet(Debug::Validate))
     {
@@ -529,7 +524,7 @@ void HtmlGenerator::writeStyleInfo(int part)
 void HtmlGenerator::startDoxyAnchor(const char *,const char *,
                                     const char *anchor, const char *name)
 {
-  t << "<a class=\"anchor\" name=\"" << anchor << "\" doxytag=\"" << name << "\" ></a>";
+  t << "<a class=\"anchor\" name=\"" << anchor << "\" doxytag=\"" << name << "\"></a>";
 }
 
 void HtmlGenerator::endDoxyAnchor(const char *,const char *)
@@ -859,9 +854,9 @@ void HtmlGenerator::startMemberItem(int annoType)
     t << "<tr>";
     switch(annoType)
     {
-      case 0:  t << "<td class=\"memItemLeft\" nowrap align=right valign=top>"; break;
+      case 0:  t << "<td class=\"memItemLeft\" nowrap align=\"right\" valign=\"top\">"; break;
       case 1:  t << "<td class=\"memItemLeft\" nowrap>"; break;
-      default: t << "<td class=\"memItemLeft\" nowrap valign=top>"; break;
+      default: t << "<td class=\"memItemLeft\" nowrap valign=\"top\">"; break;
     }
   }
   else
@@ -886,7 +881,7 @@ void HtmlGenerator::insertMemberAlign()
   DBG_HTML(t << "<!-- insertMemberAlign -->" << endl)
   if (Config_getBool("HTML_ALIGN_MEMBERS"))
   {
-    t << "&nbsp;</td><td class=\"memItemRight\" valign=bottom>"; 
+    t << "&nbsp;</td><td class=\"memItemRight\" valign=\"bottom\">"; 
   }
 }
 
@@ -921,7 +916,7 @@ void HtmlGenerator::startMemberSections()
   DBG_HTML(t << "<!-- startMemberSections -->" << endl)
   if (Config_getBool("HTML_ALIGN_MEMBERS"))
   {
-    t << "<table border=0 cellpadding=0 cellspacing=0>" << endl;
+    t << "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" << endl;
     // HTML is not recursively decomposable, sorry
     t << "<tr><td></td></tr>" << endl;
   }
@@ -941,7 +936,7 @@ void HtmlGenerator::startMemberHeader()
   DBG_HTML(t << "<!-- startMemberHeader -->" << endl)
   if (Config_getBool("HTML_ALIGN_MEMBERS"))
   {
-    t << "<tr><td colspan=2><br><h2>";
+    t << "<tr><td colspan=\"2\"><br><h2>";
   }
   else
   {
@@ -965,7 +960,7 @@ void HtmlGenerator::endMemberHeader()
 void HtmlGenerator::startMemberSubtitle()
 {
   DBG_HTML(t << "<!-- startMemberSubtitle -->" << endl)
-  if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<tr><td colspan=2>";
+  if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<tr><td colspan=\"2\">";
 }
 
 void HtmlGenerator::endMemberSubtitle()
@@ -1036,7 +1031,7 @@ void HtmlGenerator::startMemberDocName(bool align)
   t << "        <tr>" << endl;
   t << "          <td class=\"md\" nowrap valign=\"top\"";
   if (align) t << " align=\"right\"";
-  t << "> ";
+  t << ">";
 }
 
 void HtmlGenerator::endMemberDocName()
@@ -1213,7 +1208,7 @@ void HtmlGenerator::startIndent()
   
   //t << "<div class=\"in\">" << endl; 
 
-  t << "<table cellspacing=5 cellpadding=0 border=0>\n"
+  t << "<table cellspacing=\"5\" cellpadding=\"0\" border=\"0\">\n"
        "  <tr>\n"
        "    <td>\n"
        "      &nbsp;\n"
diff --git a/src/htmlgen.h b/src/htmlgen.h
index 9371970..a58d986 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -172,11 +172,11 @@ class HtmlGenerator : public OutputGenerator
     void writeNonBreakableSpace(int);
     
     void startDescTable()
-    { t << "<table border=0 cellspacing=2 cellpadding=0>" << endl; }
+    { t << "<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl; }
     void endDescTable()
     { t << "</table>" << endl; }
     void startDescTableTitle()
-    { t << "<tr><td valign=top><em>"; }
+    { t << "<tr><td valign=\"top\"><em>"; }
     void endDescTableTitle()
     { t << "</em>&nbsp;</td>"; }
     void startDescTableData()
diff --git a/src/index.cpp b/src/index.cpp
index 77c01d6..72c8f64 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -544,31 +544,32 @@ void writeClassTree(BaseClassList *cl,int level)
 
 void writeClassTreeNode(ClassDef *cd,bool hasHtmlHelp,bool hasFtvHelp,bool &started,int level)
 {
-    if (cd->isVisibleInHierarchy() && !cd->visited)
+  //printf("writeClassTreeNode(%s) visited=%d\n",cd->name().data(),cd->visited);
+  if (cd->isVisibleInHierarchy() && !cd->visited)
+  {
+    if (!started)
     {
-      if (!started)
+      started=TRUE;
+    }
+    bool hasChildren = classHasVisibleChildren(cd);
+    //printf("node: Has children %s: %d\n",cd->name().data(),hasChildren);
+    if (cd->isLinkable())
+    {
+      if (hasHtmlHelp)
       {
-        started=TRUE;
+        HtmlHelp::getInstance()->addContentsItem(hasChildren,cd->displayName(),cd->getOutputFileBase());
       }
-      bool hasChildren = classHasVisibleChildren(cd);
-      //printf("node: Has children %s: %d\n",cd->name().data(),hasChildren);
-      if (cd->isLinkable())
+      if (hasFtvHelp)
       {
-        if (hasHtmlHelp)
-        {
-          HtmlHelp::getInstance()->addContentsItem(hasChildren,cd->displayName(),cd->getOutputFileBase());
-        }
-        if (hasFtvHelp)
-        {
-          FTVHelp::getInstance()->addContentsItem(hasChildren,cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
-        }
+        FTVHelp::getInstance()->addContentsItem(hasChildren,cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
       }
-      if (hasChildren)
-      {
-        writeClassTree(cd->subClasses(),level+1);
-      }
-      cd->visited=TRUE;
     }
+    if (hasChildren)
+    {
+      writeClassTree(cd->subClasses(),level+1);
+    }
+    cd->visited=TRUE;
+  }
 }
 
 void writeClassTree(ClassList *cl,int level)
@@ -578,7 +579,11 @@ void writeClassTree(ClassList *cl,int level)
   bool hasFtvHelp  = generateHtml && Config_getBool("GENERATE_TREEVIEW");
   ClassListIterator cli(*cl);
   bool started=FALSE;
-  for ( ; cli.current() ; ++cli)
+  for ( cli.toFirst() ; cli.current() ; ++cli)
+  {
+    cli.current()->visited=FALSE;
+  }
+  for ( cli.toFirst() ; cli.current() ; ++cli)
   {
     writeClassTreeNode(cli.current(),hasHtmlHelp,hasFtvHelp,started,level);
   }
@@ -591,7 +596,11 @@ void writeClassTree(ClassSDict *d,int level)
   bool hasFtvHelp  = generateHtml && Config_getBool("GENERATE_TREEVIEW");
   ClassSDict::Iterator cli(*d);
   bool started=FALSE;
-  for ( ; cli.current() ; ++cli)
+  for ( cli.toFirst() ; cli.current() ; ++cli)
+  {
+    cli.current()->visited=FALSE;
+  }
+  for ( cli.toFirst() ; cli.current() ; ++cli)
   {
     writeClassTreeNode(cli.current(),hasHtmlHelp,hasFtvHelp,started,level);
   }
@@ -1356,7 +1365,7 @@ void writeAlphabeticalClassList(OutputList &ol)
   alphaLinks += "</div><p>\n";
   ol.writeString(alphaLinks);
 
-  ol.writeString("<table align=center width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n");
+  ol.writeString("<table align=\"center\" width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n");
 
   // the number of columns in the table
   const int columns = Config_getInt("COLS_IN_ALPHA_INDEX");
@@ -2835,7 +2844,21 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,int level)
           ftvHelp->incContentsDepth();
         }
 
-        writeClassTree(gd->classSDict,1);
+        ClassDef *cd;
+        ClassSDict::Iterator cdi(*gd->classSDict);
+        for (cdi.toFirst();(cd=cdi.current());++cdi)
+        {
+          if (cd->isLinkable())
+          {
+            //printf("node: Has children %s\n",cd->name().data());
+            if (htmlHelp)
+              htmlHelp->addContentsItem(FALSE,cd->displayName(),cd->getOutputFileBase());
+            if (ftvHelp)
+              ftvHelp->addContentsItem(FALSE,cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
+          }
+        }
+
+        //writeClassTree(gd->classSDict,1);
         if(htmlHelp) htmlHelp->decContentsDepth();
         if(ftvHelp)  ftvHelp->decContentsDepth();
       }
diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in
index 5b65522..049cf1f 100644
--- a/src/libdoxygen.pro.in
+++ b/src/libdoxygen.pro.in
@@ -33,6 +33,7 @@ HEADERS      =	bufstr.h \
                 define.h \
                 definition.h \
                 diagram.h \
+                dirdef.h \
                 docparser.h \
                 doctokenizer.h \
                 docvisitor.h \
@@ -136,6 +137,7 @@ SOURCES      =	ce_lex.cpp \
 		define.cpp \
 		definition.cpp \
 		diagram.cpp \
+                dirdef.cpp \
                 docparser.cpp \
                 doctokenizer.cpp \
 		dot.cpp \
diff --git a/src/logos.cpp b/src/logos.cpp
index 4b55343..fb5b6b6 100644
--- a/src/logos.cpp
+++ b/src/logos.cpp
@@ -25,138 +25,113 @@
 unsigned char doxygen_png_data[] = {
   0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
   0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x2d,
-  0x08, 0x03, 0x00, 0x00, 0x00, 0x6f, 0x6b, 0x3e, 0xc2, 0x00, 0x00, 0x03,
-  0x00, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0xbf, 0xbe, 0xa4, 0xf7,
-  0xe4, 0x8c, 0xff, 0xfe, 0xd8, 0xf4, 0xda, 0x6f, 0xda, 0xcb, 0x86, 0xf9,
-  0xeb, 0xa1, 0xde, 0xdb, 0xb4, 0x00, 0x00, 0x00, 0xb9, 0xab, 0x71, 0xdf,
-  0xdf, 0xc4, 0x5b, 0x51, 0x26, 0xff, 0xff, 0xe1, 0xd7, 0xc3, 0x6d, 0xae,
-  0x92, 0x2b, 0xd5, 0xbb, 0x57, 0xf1, 0xcd, 0x49, 0xee, 0xc4, 0x30, 0xd1,
-  0xad, 0x2d, 0x3d, 0x37, 0x1d, 0x67, 0x5e, 0x37, 0x60, 0x5f, 0x50, 0x40,
-  0x3f, 0x32, 0xfd, 0xf8, 0xc9, 0xfc, 0xf4, 0xbc, 0xdc, 0xd4, 0x9f, 0xfb,
-  0xf0, 0xaf, 0x1f, 0x1d, 0x13, 0xff, 0xcc, 0xcc, 0xdf, 0xb2, 0xb2, 0xa9,
-  0x22, 0x22, 0x12, 0x14, 0x3e, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x22,
-  0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x26,
-  0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x2a,
-  0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2e,
-  0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x32,
-  0x32, 0x32, 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x36,
-  0x36, 0x36, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x3a,
-  0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3e,
-  0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x42,
-  0x42, 0x42, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x46,
-  0x46, 0x46, 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x4a,
-  0x4a, 0x4a, 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4e,
-  0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x52,
-  0x52, 0x52, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x56,
-  0x56, 0x56, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x5a,
-  0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5e,
-  0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x62,
-  0x62, 0x62, 0x63, 0x63, 0x63, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x66,
-  0x66, 0x66, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x6a,
-  0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x6e,
-  0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x72,
-  0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74, 0x75, 0x75, 0x75, 0x76,
-  0x76, 0x76, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, 0x79, 0x7a,
-  0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7e,
-  0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82,
-  0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x86,
-  0x86, 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x8a,
-  0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0x8e,
-  0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x90, 0x90, 0x90, 0x91, 0x91, 0x91, 0x92,
-  0x92, 0x92, 0x93, 0x93, 0x93, 0x94, 0x94, 0x94, 0x95, 0x95, 0x95, 0x96,
-  0x96, 0x96, 0x97, 0x97, 0x97, 0x98, 0x98, 0x98, 0x99, 0x99, 0x99, 0x9a,
-  0x9a, 0x9a, 0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0x9c, 0x9d, 0x9d, 0x9d, 0x9e,
-  0x9e, 0x9e, 0x9f, 0x9f, 0x9f, 0xa0, 0xa0, 0xa0, 0xa1, 0xa1, 0xa1, 0xa2,
-  0xa2, 0xa2, 0xa3, 0xa3, 0xa3, 0xa4, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, 0xa6,
-  0xa6, 0xa6, 0xa7, 0xa7, 0xa7, 0xa8, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xaa,
-  0xaa, 0xaa, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xae,
-  0xae, 0xae, 0xaf, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb2,
-  0xb2, 0xb2, 0xb3, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb6,
-  0xb6, 0xb6, 0xb7, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xb9, 0xba,
-  0xba, 0xba, 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbe,
-  0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc1, 0xc2,
-  0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc5, 0xc5, 0xc5, 0xc6,
-  0xc6, 0xc6, 0xc7, 0xc7, 0xc7, 0xc8, 0xc8, 0xc8, 0xc9, 0xc9, 0xc9, 0xca,
-  0xca, 0xca, 0xcb, 0xcb, 0xcb, 0xcc, 0xcc, 0xcc, 0xcd, 0xcd, 0xcd, 0xce,
-  0xce, 0xce, 0xcf, 0xcf, 0xcf, 0xd0, 0xd0, 0xd0, 0xd1, 0xd1, 0xd1, 0xd2,
-  0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, 0xd4, 0xd4, 0xd5, 0xd5, 0xd5, 0xd6,
-  0xd6, 0xd6, 0xd7, 0xd7, 0xd7, 0xd8, 0xd8, 0xd8, 0xd9, 0xd9, 0xd9, 0xda,
-  0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdd, 0xdd, 0xdd, 0xde,
-  0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe1, 0xe2,
-  0xe2, 0xe2, 0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe5, 0xe6,
-  0xe6, 0xe6, 0xe7, 0xe7, 0xe7, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xe9, 0xea,
-  0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xee,
-  0xee, 0xee, 0xef, 0xef, 0xef, 0xf0, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf2,
-  0xf2, 0xf2, 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf6,
-  0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xfa,
-  0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfe,
-  0xfe, 0xfe, 0xff, 0xff, 0xff, 0xaf, 0x33, 0xef, 0x22, 0x00, 0x00, 0x00,
-  0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
-  0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x00, 0x88, 0x05, 0x1d, 0x48, 0x00,
-  0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x6e, 0xbd, 0x00,
-  0x00, 0x6e, 0xbd, 0x01, 0x84, 0x9a, 0x17, 0x68, 0x00, 0x00, 0x00, 0x07,
-  0x74, 0x49, 0x4d, 0x45, 0x07, 0xd3, 0x0a, 0x08, 0x15, 0x0b, 0x1c, 0x3a,
-  0x62, 0x10, 0x70, 0x00, 0x00, 0x02, 0xa1, 0x49, 0x44, 0x41, 0x54, 0x78,
-  0xda, 0xed, 0x56, 0x6b, 0x8f, 0xda, 0x30, 0x10, 0xc4, 0x0d, 0x69, 0xd6,
-  0xce, 0x03, 0x88, 0x89, 0x4b, 0xf0, 0xd1, 0xff, 0xff, 0x33, 0xbb, 0xb3,
-  0x6b, 0xc7, 0x86, 0x0f, 0x77, 0x42, 0x3a, 0x2a, 0xb5, 0x62, 0x25, 0xf0,
-  0xcc, 0xbe, 0xc6, 0x31, 0xc9, 0x86, 0xdd, 0xae, 0x18, 0xa9, 0xed, 0x5e,
-  0x6a, 0x64, 0x9c, 0x73, 0xe6, 0xd5, 0x22, 0xae, 0x69, 0x1a, 0xf7, 0x16,
-  0x79, 0x8b, 0xfc, 0xc3, 0x22, 0xc3, 0x5f, 0x11, 0x19, 0x86, 0xd7, 0x89,
-  0xa4, 0x81, 0x92, 0x45, 0x88, 0xca, 0x84, 0xa9, 0x97, 0x32, 0x74, 0x2a,
-  0x6f, 0x99, 0x45, 0x05, 0xd3, 0x7d, 0x40, 0x83, 0x98, 0x27, 0x6c, 0x83,
-  0x8a, 0x64, 0x8a, 0x11, 0x03, 0xac, 0x8b, 0x59, 0x68, 0x31, 0x69, 0xea,
-  0xa8, 0x77, 0xab, 0xd3, 0x94, 0xcc, 0x4c, 0xe5, 0xdf, 0xa6, 0x14, 0xbb,
-  0x86, 0x62, 0x8e, 0x82, 0xd9, 0xb0, 0x11, 0xec, 0x42, 0x0c, 0x0e, 0x11,
-  0x4e, 0x94, 0xd3, 0x24, 0xf5, 0x56, 0x75, 0x8e, 0xaa, 0x2e, 0x86, 0xaa,
-  0x86, 0x49, 0xa5, 0x76, 0x49, 0xab, 0xa1, 0x4e, 0x91, 0xef, 0x45, 0x0f,
-  0xd2, 0x69, 0x11, 0x59, 0x01, 0xe1, 0xae, 0x95, 0x54, 0xe5, 0xc3, 0x70,
-  0xc3, 0x83, 0x4a, 0x6a, 0x9a, 0x4e, 0x2b, 0x67, 0x6c, 0x87, 0xa7, 0xc5,
-  0xf8, 0x2c, 0x7a, 0x01, 0x94, 0x6e, 0x90, 0x20, 0x22, 0x9a, 0xe7, 0x28,
-  0x6d, 0xa0, 0xda, 0x8d, 0x56, 0xa5, 0x3b, 0x49, 0x9e, 0x8e, 0xc6, 0xf0,
-  0x91, 0x98, 0x46, 0x9e, 0x93, 0x3b, 0xca, 0xfb, 0x6d, 0xd4, 0x4c, 0x24,
-  0xc1, 0xbc, 0x69, 0x0d, 0x18, 0xf9, 0xf6, 0x70, 0x3a, 0xf1, 0xe1, 0xcc,
-  0xb4, 0x85, 0xb6, 0x5c, 0x5c, 0x93, 0x1e, 0x3c, 0xf5, 0x77, 0x81, 0x28,
-  0x86, 0x0e, 0x88, 0x12, 0xa5, 0x44, 0x4d, 0xd2, 0x80, 0x0b, 0xb8, 0x5b,
-  0xc4, 0x1f, 0x62, 0x97, 0xca, 0x0c, 0xb2, 0xc4, 0xb7, 0x68, 0x2f, 0x43,
-  0x25, 0x03, 0x31, 0x16, 0xe9, 0x7e, 0xb1, 0x75, 0x91, 0x5b, 0x44, 0xc0,
-  0x8e, 0x1e, 0x68, 0xd0, 0x84, 0x85, 0x44, 0x17, 0x10, 0x9c, 0x6f, 0xa1,
-  0x0e, 0xde, 0xc8, 0x22, 0xc8, 0xd2, 0x24, 0x89, 0x04, 0x09, 0x71, 0x8f,
-  0xa8, 0x4e, 0x11, 0xb9, 0xb0, 0xad, 0xd2, 0x75, 0x05, 0xa2, 0x07, 0x1a,
-  0xb0, 0x5c, 0x2e, 0x46, 0x5c, 0xe6, 0xa2, 0xb6, 0x72, 0x27, 0x60, 0xb3,
-  0x44, 0xc4, 0x3b, 0x5a, 0x73, 0x80, 0x3d, 0x24, 0x6c, 0x8d, 0xd2, 0x80,
-  0x3b, 0xe0, 0xb8, 0xae, 0x6c, 0xab, 0x9c, 0xcf, 0x0a, 0x44, 0x42, 0x79,
-  0x87, 0x42, 0x6d, 0xb0, 0xd7, 0xeb, 0x96, 0xa1, 0x29, 0x70, 0x03, 0x23,
-  0xb2, 0xae, 0x5a, 0xa4, 0x59, 0xab, 0x5d, 0x16, 0x6b, 0x03, 0x89, 0x8f,
-  0x45, 0xc4, 0x27, 0x3f, 0x7c, 0xfb, 0x93, 0xcd, 0xf2, 0x2f, 0x6d, 0x01,
-  0x5a, 0xe1, 0xf6, 0xac, 0xb4, 0x55, 0xa7, 0x66, 0xe0, 0x52, 0x94, 0xb6,
-  0xf2, 0x30, 0x87, 0x36, 0xc7, 0x56, 0xc5, 0xed, 0xf9, 0x6c, 0x79, 0xb5,
-  0xd2, 0xa2, 0x8d, 0xb1, 0xd5, 0x5c, 0x88, 0xd8, 0x1f, 0xb0, 0xb6, 0x6d,
-  0x75, 0x55, 0x9e, 0xa8, 0xf5, 0x4a, 0x14, 0x73, 0x63, 0xaf, 0x50, 0x47,
-  0x86, 0xd5, 0x12, 0x14, 0x45, 0x5b, 0x12, 0x79, 0x9f, 0xf8, 0x66, 0x11,
-  0x65, 0xbb, 0xa2, 0x92, 0x6c, 0xa4, 0x3e, 0xa1, 0xfd, 0x7e, 0x3f, 0xf6,
-  0x23, 0x5c, 0xde, 0x8f, 0xda, 0x9a, 0x0f, 0x51, 0x1c, 0x79, 0x30, 0x79,
-  0x3b, 0x8e, 0xda, 0x88, 0xaa, 0x2e, 0x23, 0x49, 0x52, 0x94, 0x5c, 0x66,
-  0xfa, 0xc8, 0xdb, 0xfd, 0x66, 0xa3, 0x45, 0x65, 0x26, 0x3d, 0x01, 0xda,
-  0x18, 0x91, 0x31, 0x4e, 0x22, 0x02, 0x47, 0x35, 0x00, 0xbd, 0x84, 0xe4,
-  0xba, 0xc6, 0xad, 0x05, 0x10, 0x44, 0x84, 0x26, 0x91, 0x7e, 0x3a, 0x68,
-  0xfc, 0x30, 0xf5, 0x3e, 0x46, 0xdf, 0x2b, 0x3d, 0xf4, 0x31, 0x32, 0xcc,
-  0xcb, 0xe4, 0x59, 0xc4, 0x73, 0xe8, 0x90, 0xfb, 0x4f, 0x38, 0x40, 0x24,
-  0x8f, 0x67, 0x50, 0x2d, 0x43, 0x14, 0xe0, 0xe0, 0x7d, 0xe2, 0x32, 0x83,
-  0xed, 0x47, 0xb1, 0x9b, 0x58, 0x05, 0x6f, 0x09, 0xc9, 0x62, 0x69, 0x3a,
-  0x1e, 0x8f, 0x13, 0x31, 0xbd, 0xdd, 0x18, 0x4f, 0x3e, 0x7a, 0x78, 0x0e,
-  0x54, 0xca, 0x3e, 0x4a, 0xbd, 0x2e, 0xb8, 0x85, 0x7f, 0x3f, 0x63, 0x34,
-  0x73, 0xcb, 0x54, 0x42, 0x0c, 0xe7, 0x19, 0x0e, 0x16, 0xf9, 0xac, 0x06,
-  0xaf, 0x81, 0xa7, 0x34, 0x4e, 0xa7, 0xd3, 0x9c, 0x45, 0x4e, 0x9b, 0xcd,
-  0x9f, 0x36, 0xb9, 0x7f, 0x8b, 0x7d, 0x6d, 0x10, 0x39, 0x67, 0x32, 0x65,
-  0x8d, 0xe9, 0x8b, 0xaa, 0x27, 0x5f, 0xd3, 0x13, 0x76, 0x5d, 0xd8, 0x2c,
-  0x97, 0x31, 0x7d, 0xf3, 0xdf, 0x02, 0xee, 0x5b, 0xb5, 0xe4, 0x8b, 0x99,
-  0x99, 0x7f, 0xfb, 0x5f, 0x8f, 0x18, 0xe3, 0xe3, 0x3f, 0x90, 0xdd, 0xdb,
-  0xde, 0xf6, 0xb6, 0xb7, 0xfd, 0x97, 0xf6, 0x07, 0x2e, 0xfb, 0x61, 0xc1,
-  0xcc, 0x44, 0x36, 0x49, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
-  0xae, 0x42, 0x60, 0x82
+  0x08, 0x03, 0x00, 0x00, 0x00, 0x6f, 0x6b, 0x3e, 0xc2, 0x00, 0x00, 0x00,
+  0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xd6, 0xd8, 0xd4, 0x4f, 0x58,
+  0x32, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66,
+  0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20,
+  0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9,
+  0x65, 0x3c, 0x00, 0x00, 0x00, 0x5d, 0x50, 0x4c, 0x54, 0x45, 0x00, 0x00,
+  0x00, 0xc7, 0xbe, 0xcf, 0x22, 0x26, 0xa9, 0xc8, 0xce, 0xef, 0xb6, 0xbb,
+  0xd6, 0xd3, 0xda, 0xfa, 0x93, 0xa2, 0xde, 0xa0, 0xac, 0xe0, 0xb6, 0xc2,
+  0xf5, 0x7f, 0x87, 0xa7, 0xd5, 0xd9, 0xea, 0xc9, 0xca, 0xce, 0xe1, 0xe2,
+  0xe6, 0x7b, 0x8e, 0xd4, 0x8d, 0xa1, 0xeb, 0x88, 0x99, 0xd7, 0xa0, 0xb2,
+  0xf8, 0xa7, 0xac, 0xb9, 0xc0, 0xc0, 0xb1, 0xdd, 0xdd, 0xce, 0xf9, 0xf9,
+  0xe9, 0xf5, 0xf5, 0xe7, 0xeb, 0xeb, 0xe5, 0x45, 0x44, 0x39, 0xd7, 0xd6,
+  0xcb, 0x68, 0x67, 0x5d, 0x1f, 0x1d, 0x13, 0x5f, 0x58, 0x3c, 0x40, 0x3a,
+  0x23, 0x6d, 0x68, 0x55, 0xff, 0xff, 0xff, 0xdd, 0xc0, 0x7f, 0x31, 0x00,
+  0x00, 0x00, 0x1f, 0x74, 0x52, 0x4e, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0x00, 0xcd, 0x19, 0x76, 0x10, 0x00, 0x00, 0x03, 0xff, 0x49, 0x44,
+  0x41, 0x54, 0x78, 0xda, 0x62, 0x90, 0x43, 0x00, 0x06, 0x08, 0x90, 0xa3,
+  0x3a, 0x00, 0x08, 0x20, 0x64, 0x23, 0x19, 0x84, 0x84, 0x85, 0x85, 0x85,
+  0x68, 0x60, 0x09, 0x40, 0x00, 0xa1, 0x58, 0x22, 0x2c, 0x2a, 0x2a, 0x2a,
+  0x4c, 0x03, 0x4b, 0x00, 0x02, 0x88, 0x2e, 0x96, 0x00, 0x04, 0x10, 0x5d,
+  0x2c, 0x01, 0x08, 0x20, 0xba, 0x58, 0x02, 0x10, 0x40, 0x74, 0xb1, 0x04,
+  0x20, 0x80, 0xe8, 0x62, 0x09, 0x40, 0x00, 0xd1, 0xc5, 0x12, 0x80, 0x00,
+  0x42, 0xb5, 0x44, 0x84, 0x36, 0x96, 0x00, 0x04, 0x10, 0x9a, 0x25, 0x22,
+  0x22, 0xb4, 0xb0, 0x04, 0x20, 0x80, 0x18, 0x90, 0x0b, 0x14, 0x98, 0x25,
+  0x0c, 0x0c, 0x88, 0x12, 0x06, 0x99, 0x42, 0x14, 0x3a, 0x48, 0xa2, 0x88,
+  0xb2, 0x08, 0xc1, 0x66, 0x40, 0x95, 0x00, 0x08, 0x20, 0x88, 0x52, 0x50,
+  0x79, 0x02, 0x04, 0x22, 0x10, 0x4b, 0x60, 0x5c, 0x50, 0x11, 0x03, 0x62,
+  0x43, 0x28, 0x21, 0x49, 0x06, 0x49, 0x21, 0x68, 0xa9, 0x03, 0x11, 0x85,
+  0xeb, 0x83, 0x28, 0x81, 0xf1, 0x84, 0x90, 0xc4, 0x21, 0xea, 0x01, 0x02,
+  0x88, 0x01, 0xac, 0x43, 0x04, 0x01, 0x84, 0x19, 0xc4, 0x85, 0xe0, 0x6c,
+  0x21, 0x30, 0x5b, 0x58, 0x5c, 0x4a, 0x5c, 0x18, 0x24, 0x03, 0x54, 0x08,
+  0x0e, 0x4d, 0x06, 0x88, 0x28, 0x92, 0x3e, 0x61, 0x06, 0x24, 0x53, 0x84,
+  0x18, 0x90, 0x0c, 0x04, 0xd9, 0x02, 0x10, 0x40, 0x0c, 0xd0, 0xa8, 0x40,
+  0x52, 0x2e, 0x24, 0x82, 0xac, 0x04, 0x4c, 0x4a, 0x42, 0x02, 0x52, 0x18,
+  0xa2, 0x89, 0x41, 0x10, 0xcc, 0x10, 0x47, 0x31, 0x0a, 0xac, 0x0b, 0x16,
+  0x18, 0xc2, 0x28, 0x46, 0xc8, 0x01, 0x04, 0x10, 0x83, 0x1c, 0xd4, 0x50,
+  0x68, 0x68, 0xc1, 0x54, 0xc0, 0x03, 0x0f, 0xa2, 0x19, 0x84, 0x25, 0x21,
+  0x1e, 0x60, 0x80, 0x26, 0x10, 0x71, 0xb0, 0x25, 0x10, 0x75, 0xc2, 0x0c,
+  0x50, 0x07, 0x20, 0xb9, 0x06, 0xa2, 0x0b, 0xac, 0x01, 0x20, 0x80, 0x18,
+  0x20, 0xb9, 0x43, 0x54, 0x08, 0x18, 0x24, 0x42, 0xa2, 0xe0, 0x7c, 0x82,
+  0xc2, 0x05, 0xba, 0x57, 0x14, 0x02, 0x84, 0xa4, 0x18, 0xc0, 0x6c, 0xa0,
+  0xa3, 0x21, 0x12, 0x42, 0x60, 0x52, 0x06, 0x24, 0x28, 0x0c, 0x16, 0x03,
+  0x85, 0x19, 0xc4, 0x08, 0x88, 0x91, 0x92, 0xc2, 0x10, 0x9e, 0x1c, 0x40,
+  0x00, 0x41, 0xc5, 0x25, 0xc4, 0x19, 0x18, 0xa4, 0xc4, 0x25, 0x40, 0x2c,
+  0x06, 0x28, 0x97, 0x01, 0xca, 0x15, 0x82, 0xda, 0x01, 0x12, 0x02, 0xb1,
+  0x25, 0x24, 0xc1, 0xe2, 0xe2, 0x52, 0x12, 0x50, 0x6d, 0x42, 0x20, 0x55,
+  0x60, 0x31, 0x49, 0x88, 0x59, 0x42, 0x0c, 0x08, 0x15, 0x20, 0x39, 0x39,
+  0x80, 0x00, 0x5c, 0x8d, 0x31, 0x02, 0x00, 0x20, 0x08, 0x02, 0x79, 0x43,
+  0x43, 0x12, 0x43, 0xff, 0x7f, 0x66, 0x22, 0x5b, 0x4e, 0xa0, 0x27, 0x00,
+  0xdc, 0x3d, 0x54, 0x47, 0xc8, 0x92, 0xf8, 0x6c, 0x05, 0x38, 0x98, 0x5e,
+  0x4b, 0xfb, 0x35, 0x8f, 0x3c, 0xea, 0x12, 0x53, 0x81, 0xe6, 0x52, 0xc9,
+  0xa4, 0x94, 0x25, 0xee, 0x13, 0x40, 0x40, 0x01, 0x1e, 0x20, 0xe0, 0x06,
+  0x9b, 0xca, 0x0d, 0x62, 0x31, 0xa0, 0x71, 0xc5, 0x41, 0x14, 0x0f, 0x8f,
+  0x10, 0x58, 0x48, 0x88, 0x07, 0x02, 0xb8, 0x81, 0x26, 0x81, 0xd8, 0x42,
+  0x92, 0x52, 0x20, 0x79, 0x09, 0x06, 0x6e, 0x98, 0x04, 0x50, 0x84, 0x01,
+  0xcc, 0xe3, 0x96, 0x02, 0x1b, 0x00, 0x34, 0x41, 0x0e, 0x20, 0x80, 0x80,
+  0x6a, 0xb9, 0x80, 0x80, 0x1b, 0x1c, 0x3e, 0xdc, 0x20, 0x16, 0x03, 0x98,
+  0x0b, 0x74, 0x21, 0x98, 0x2b, 0x28, 0x2e, 0xc8, 0xc5, 0x05, 0x57, 0x01,
+  0x51, 0x02, 0x12, 0x06, 0xb1, 0x41, 0x32, 0xdc, 0xdc, 0x10, 0x4d, 0x10,
+  0x55, 0xdc, 0x82, 0x92, 0x92, 0x82, 0x82, 0xe2, 0x0c, 0x60, 0x31, 0xa0,
+  0x25, 0x60, 0x31, 0x06, 0x39, 0x80, 0x00, 0x02, 0x46, 0x3c, 0x0b, 0x33,
+  0x10, 0x08, 0x02, 0x63, 0x5a, 0x10, 0xc4, 0x60, 0x01, 0xf3, 0x05, 0x65,
+  0x21, 0x5c, 0x16, 0x88, 0x20, 0x44, 0x05, 0xc8, 0x2b, 0x10, 0x2e, 0x0b,
+  0x38, 0x33, 0x8b, 0xb3, 0xc0, 0xe4, 0xb8, 0x21, 0x6c, 0x16, 0x59, 0x59,
+  0x41, 0x20, 0x2d, 0x08, 0x36, 0x82, 0x45, 0x4a, 0x8a, 0x05, 0xa2, 0x56,
+  0x0e, 0x20, 0x80, 0x40, 0xa9, 0x9e, 0x03, 0x04, 0x58, 0x58, 0x58, 0x20,
+  0x34, 0x84, 0x0f, 0xe5, 0x0a, 0xca, 0x40, 0x38, 0x10, 0x36, 0xd0, 0x60,
+  0x19, 0x08, 0x13, 0x52, 0x64, 0x08, 0x42, 0xb4, 0x80, 0x34, 0x49, 0x09,
+  0x22, 0x14, 0x02, 0xdd, 0x09, 0x22, 0x81, 0x96, 0x40, 0x78, 0x72, 0x00,
+  0x01, 0x04, 0xca, 0x8c, 0x82, 0x1c, 0x48, 0x80, 0x9d, 0x41, 0x1a, 0xca,
+  0x12, 0x10, 0x10, 0x60, 0x97, 0x66, 0x07, 0x09, 0xc9, 0xc8, 0xb0, 0x43,
+  0x8c, 0x06, 0x06, 0x22, 0x58, 0x00, 0x56, 0x30, 0xc9, 0x08, 0xb2, 0xb3,
+  0x43, 0x0c, 0x62, 0x40, 0x32, 0x85, 0x9d, 0x01, 0xac, 0x48, 0x0a, 0xac,
+  0x16, 0xc8, 0x93, 0x03, 0x08, 0x20, 0x70, 0x29, 0x21, 0x28, 0x00, 0x07,
+  0xec, 0x82, 0x20, 0x9d, 0x30, 0x8e, 0x34, 0x03, 0x88, 0x29, 0x28, 0x25,
+  0x05, 0x52, 0xc1, 0xce, 0x09, 0xb6, 0x04, 0x24, 0x80, 0x54, 0x00, 0xca,
+  0x80, 0xa5, 0xc0, 0xfe, 0x62, 0x87, 0x1b, 0x01, 0x62, 0x81, 0x2c, 0x01,
+  0x73, 0x19, 0xe4, 0x00, 0x02, 0xd0, 0x40, 0x06, 0x37, 0x00, 0xc0, 0x20,
+  0x08, 0xfc, 0xd1, 0xb0, 0x82, 0xd2, 0xee, 0x3f, 0x66, 0xa5, 0xd6, 0x97,
+  0x5c, 0x50, 0x49, 0x78, 0x21, 0x49, 0xb4, 0x0f, 0xa6, 0x22, 0x94, 0x8d,
+  0xc8, 0x88, 0x92, 0x33, 0xa8, 0x0a, 0x51, 0x59, 0x98, 0xff, 0x74, 0x81,
+  0x5e, 0x5e, 0xdb, 0xd8, 0x67, 0x76, 0x2d, 0x20, 0x7d, 0x3e, 0x57, 0x00,
+  0x81, 0x4a, 0x4f, 0x41, 0x56, 0x04, 0x60, 0x04, 0x03, 0x24, 0x26, 0x23,
+  0x94, 0x05, 0xa6, 0x04, 0x19, 0x38, 0xf9, 0xf8, 0xf8, 0x38, 0x19, 0x80,
+  0x5c, 0x46, 0x46, 0x20, 0x9b, 0x53, 0x46, 0x4a, 0x06, 0x24, 0xc2, 0xc6,
+  0x80, 0xd0, 0xc6, 0x8a, 0xd0, 0x0f, 0xa1, 0x18, 0xe4, 0x00, 0x02, 0x88,
+  0x81, 0x81, 0x89, 0x14, 0xc0, 0xc0, 0x0b, 0x34, 0x12, 0xaa, 0x85, 0x01,
+  0xc8, 0xe4, 0xe5, 0x05, 0x09, 0x00, 0x2d, 0xc1, 0xa7, 0x87, 0x01, 0x20,
+  0x80, 0x18, 0x48, 0xb2, 0x85, 0x81, 0x97, 0x9f, 0x9f, 0x9f, 0x17, 0x66,
+  0x09, 0x3f, 0x1c, 0xf0, 0xe2, 0x35, 0x84, 0x01, 0x20, 0x80, 0x18, 0x90,
+  0x6b, 0x31, 0xc2, 0x00, 0x64, 0x89, 0x2c, 0x8c, 0xc3, 0x09, 0xb3, 0x83,
+  0x93, 0x80, 0x2e, 0x80, 0x00, 0x22, 0xad, 0x46, 0x07, 0x99, 0xcb, 0xcb,
+  0x80, 0xe0, 0xf1, 0x82, 0xbd, 0xc1, 0x49, 0xc8, 0x10, 0x80, 0x00, 0x22,
+  0xb1, 0xd9, 0x00, 0x34, 0x17, 0xc9, 0x48, 0xa0, 0x67, 0x78, 0x81, 0x7c,
+  0x82, 0x66, 0x00, 0x04, 0x10, 0xa9, 0x6d, 0x13, 0x29, 0x29, 0x29, 0x39,
+  0xb4, 0x2e, 0x0d, 0x61, 0x4d, 0x00, 0x01, 0x44, 0x83, 0x06, 0x10, 0x26,
+  0x00, 0x08, 0x20, 0xba, 0x58, 0x02, 0x10, 0x40, 0x74, 0xb1, 0x04, 0x20,
+  0x80, 0xe8, 0x62, 0x09, 0x40, 0x00, 0xd1, 0xc5, 0x12, 0x80, 0x00, 0xa2,
+  0x8b, 0x25, 0x00, 0x01, 0x44, 0x17, 0x4b, 0x00, 0x02, 0x88, 0x2e, 0x96,
+  0x00, 0x04, 0x10, 0x5d, 0x2c, 0x01, 0x08, 0x20, 0xba, 0x58, 0x02, 0x10,
+  0x40, 0x74, 0xb1, 0x04, 0x20, 0x80, 0xe8, 0x62, 0x09, 0x40, 0x80, 0x01,
+  0x00, 0x64, 0x60, 0x82, 0xc9, 0xbd, 0x53, 0xb5, 0x4f, 0x00, 0x00, 0x00,
+  0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
 };
-unsigned int doxygen_png_len = 1576;
+unsigned int doxygen_png_len = 1281;
 
 unsigned char search_png[] = {
   0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 5c0570b..a515a3d 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -543,7 +543,17 @@ QCString MemberDef::anchor() const
   if (groupAlias)       return groupAlias->anchor();
   if (m_templateMaster) return m_templateMaster->anchor();
   if (enumScope) result.prepend(enumScope->anchor());
-  if (group) result.prepend("g");
+  if (group) 
+  {
+    if (groupMember)
+    {
+      result=groupMember->anchor();
+    }
+    else
+    {
+      result.prepend("g");
+    }
+  }
   return result;
 }
 
@@ -1184,12 +1194,18 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
   //    name().data(),hasDocs,container->definitionType(),inGroup);
   if ( !hasDocs ) return;
   QCString scopeName = scName;
+  QCString memAnchor = anchor();
   if (container->definitionType()==TypeGroup)
   {
     if (getClassDef())          scopeName=getClassDef()->name();
     else if (getNamespaceDef()) scopeName=getNamespaceDef()->name();
     else if (getFileDef())      scopeName=getFileDef()->name();
   }
+  else if (container->definitionType()==TypeFile && getNamespaceDef())
+  { // member is in a namespace, but is written as part of the file documentation
+    // as well, so we need to make sure its label is unique.
+    memAnchor.prepend("file_");
+  }
 
   QCString cname  = container->name();
   QCString cfname = getOutputFileBase();  
@@ -1200,7 +1216,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
   if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP"))
   {
     HtmlHelp *htmlHelp = HtmlHelp::getInstance();
-    htmlHelp->addIndexItem(cname,name(),cfname,anchor());
+    htmlHelp->addIndexItem(cname,name(),cfname,memAnchor);
   }
 
   // get member name
@@ -1242,11 +1258,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
     {
       if (vmd->isEnumerate() && ldef.mid(i,l)==vmd->name())
       {
-        ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
-        ol.startMemberDoc(cname,name(),anchor(),name());
+        ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName);
+        ol.startMemberDoc(cname,name(),memAnchor,name());
         if (hasHtmlHelp)
         {
-          htmlHelp->addIndexItem(cname,name(),cfname,anchor());
+          htmlHelp->addIndexItem(cname,name(),cfname,memAnchor);
         }
         linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.left(i));
         vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef());
@@ -1258,11 +1274,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
     if (!found) // anonymous compound
     {
       //printf("Anonymous compound `%s'\n",cname.data());
-      ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
-      ol.startMemberDoc(cname,name(),anchor(),name());
+      ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName);
+      ol.startMemberDoc(cname,name(),memAnchor,name());
       if (hasHtmlHelp)
       {
-        htmlHelp->addIndexItem(cname,name(),cfname,anchor());
+        htmlHelp->addIndexItem(cname,name(),cfname,memAnchor);
       }
       // strip anonymous compound names from definition
       int si=ldef.find(' '),pi,ei=i+l;
@@ -1280,11 +1296,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
   }
   else // not an enum value
   {
-    ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
-    ol.startMemberDoc(cname,name(),anchor(),name());
+    ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName);
+    ol.startMemberDoc(cname,name(),memAnchor,name());
     if (hasHtmlHelp)
     {
-      htmlHelp->addIndexItem(cname,name(),cfname,anchor());
+      htmlHelp->addIndexItem(cname,name(),cfname,memAnchor);
     }
 
     ClassDef *cd=getClassDef();
@@ -1457,7 +1473,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
     ol.endMemberDocName();
     ol.endMemberDoc(FALSE);
   }
-  ol.endDoxyAnchor(cfname,anchor());
+  ol.endDoxyAnchor(cfname,memAnchor);
   ol.startIndent();
 
   ol.pushGeneratorState();
@@ -1872,7 +1888,9 @@ void MemberDef::setAnchor(const char *a)
   anc=a;
 }
 
-void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs)
+void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
+                            const QCString &fileName,int startLine,
+                            bool hasDocs,MemberDef *member)
 {
   //printf("%s MemberDef::setGroupDef(%s)\n",name().data(),gd->name().data());
   group=gd;
@@ -1880,6 +1898,7 @@ void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,const QCString
   groupFileName=fileName;
   groupStartLine=startLine;
   groupHasDocs=hasDocs;
+  groupMember=member;
 }
 
 void MemberDef::setEnumScope(MemberDef *md) 
diff --git a/src/memberdef.h b/src/memberdef.h
index 2fa4a85..b7dbf46 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -164,7 +164,9 @@ class MemberDef : public Definition
     void setMaxInitLines(int lines)        { userInitLines=lines; }
     void setMemberClass(ClassDef *cd);
     void setSectionList(Definition *d,MemberList *sl);
-    void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs);
+    void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
+                     const QCString &fileName,int startLine,bool hasDocs,
+                     MemberDef *member=0);
     void setExplicitExternal(bool b)       { explExt=b; }
     void setReadAccessor(const char *r)    { read=r; }
     void setWriteAccessor(const char *w)   { write=w; }
@@ -360,6 +362,7 @@ class MemberDef : public Definition
     QCString groupFileName;   // file where this grouping was defined
     int groupStartLine;       // line  "      "      "     "     "
     bool groupHasDocs;        // true if the entry that caused the grouping was documented
+    MemberDef *groupMember;
     MemberDef *m_templateMaster;
     SDict<MemberList> *classSectionSDict;
     bool docsForDefinition;   // TRUE => documentation block is put before
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index 1d1c749..e330d11 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -81,7 +81,9 @@ void MemberGroup::insertMember(MemberDef *md)
   GroupDef *gd;
   if (firstMd && (gd=firstMd->getGroupDef()))
   {
-    md->setGroupDef(gd, firstMd->getGroupPri(), firstMd->getGroupFileName(), firstMd->getGroupStartLine(), firstMd->getGroupHasDocs());
+    md->setGroupDef(gd, firstMd->getGroupPri(), 
+                    firstMd->getGroupFileName(), firstMd->getGroupStartLine(), 
+                    firstMd->getGroupHasDocs());
     gd->insertMember(md);
   }
 }
diff --git a/src/scanner.l b/src/scanner.l
index d9d7da9..1a4c42d 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -2636,7 +2636,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 <ReadBody,ReadNSBody,ReadBodyIntf>{BN}+	{ current->program += yytext ;
 					  lineCount() ;
 					}
-<ReadBodyIntf>"@end"			{ // end of Objective C block
+<ReadBodyIntf>"@end"/[^a-z_A-Z0-9]	{ // end of Objective C block
 					  current_root->addSubEntry( current ) ;
   					  current=new Entry;
 					  initEntry();
@@ -5475,7 +5475,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					  unput('\n');
   					  BEGIN( lastInternalDocContext );
   					}
-<AfterDoc>{CMD}"brief"			{ BEGIN(AfterDocBrief); }
+<AfterDoc>{CMD}"brief"			{ current->brief.resize(0); BEGIN(AfterDocBrief); }
 <AfterDoc>"/*"|"//"			{ current->doc+=yytext; }
 <AfterDoc>^{B}*"*"+/[^/]			
 <AfterDoc>\n				{ current->doc+=yytext; yyLineNr++; }
diff --git a/src/util.cpp b/src/util.cpp
index c204a18..1d592d4 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -1203,6 +1203,7 @@ static bool findOperator(const QCString &s,int i)
 }
 
 static const char constScope[] = { 'c', 'o', 'n', 's', 't', ':' };
+static const char virtualScope[] = { 'v', 'i', 'r', 't', 'u', 'a', 'l', ':' };
 
 QCString removeRedundantWhiteSpace(const QCString &s)
 {
@@ -1211,11 +1212,13 @@ QCString removeRedundantWhiteSpace(const QCString &s)
   uint i;
   uint l=s.length();
   uint csp=0;
+  uint vsp=0;
   for (i=0;i<l;i++)
   {
 nextChar:
     char c=s.at(i);
     if (csp<6 && c==constScope[csp]) csp++; else csp=0;
+    if (vsp<8 && c==virtualScope[vsp]) vsp++; else vsp=0;
     if (c=='"') // quoted string
     {
       i++;
@@ -1262,9 +1265,13 @@ nextChar:
       result+=' ';
       result+=s.at(i);
     }
-    else if (c=='t' && csp==5 && !(isId(s.at(i+1)) || s.at(i+1)==' ' || s.at(i+1)==')' || s.at(i+1)==',' || s.at(i+1)=='\0')) // prevent const ::A from being converted to const::A
+    else if (c=='t' && csp==5 && 
+            !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ || s.at(i+1)==')' || 
+              s.at(i+1)==','  || s.at(i+1)=='\0')) 
+             // prevent const ::A from being converted to const::A
     {
       result+="t ";
+      if (s.at(i+1)==' ') i++;
       csp=0;
     }
     else if (c==':' && csp==6) // replace const::A by const ::A
@@ -1272,6 +1279,20 @@ nextChar:
       result+=" :";
       csp=0;
     }
+    else if (c=='l' && vsp==7 && 
+            !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ || s.at(i+1)==')' || 
+              s.at(i+1)==','  || s.at(i+1)=='\0')) 
+             // prevent virtual ::A from being converted to virtual::A
+    {
+      result+="l ";
+      if (s.at(i+1)==' ') i++;
+      vsp=0;
+    }
+    else if (c==':' && vsp==8) // replace virtual::A by virtual ::A
+    {
+      result+=" :";
+      vsp=0;
+    }
     else if (!isspace((uchar)c) ||
 	      ( i>0 && i<l-1 && 
                 (isId(s.at(i-1)) || s.at(i-1)==')' || s.at(i-1)==',' || s.at(i-1)=='>' || s.at(i-1)==']')
@@ -1399,6 +1420,16 @@ void linkifyText(const TextGeneratorIntf &out,Definition *scope,
           found=TRUE;
         }
       }
+      else if ((cd=getClass(word+"-p"))) // search for Obj-C protocols as well
+      {
+        // add link to the result
+        if (external ? cd->isLinkable() : cd->isLinkableInProject())
+        {
+          out.writeLink(cd->getReference(),cd->getOutputFileBase(),0,word);
+          found=TRUE;
+        }
+      }
+          
 
       if (scope && 
           (scope->definitionType()==Definition::TypeClass || 
@@ -3335,7 +3366,12 @@ bool resolveLink(/* in */ const char *scName,
     *resContext=fd;
     return TRUE;
   }
-  else if ((cd=getClass(linkRef)))
+  else if ((cd=getClass(linkRef))) // class link
+  {
+    *resContext=cd;
+    return TRUE;
+  }
+  else if ((cd=getClass(linkRef+"-p"))) // Obj-C protocol link
   {
     *resContext=cd;
     return TRUE;
diff --git a/tmake/lib/aix-xlc/tmake.conf b/tmake/lib/aix-xlc/tmake.conf
index ef65b37..04d5f15 100755
--- a/tmake/lib/aix-xlc/tmake.conf
+++ b/tmake/lib/aix-xlc/tmake.conf
@@ -7,11 +7,13 @@
 TEMPLATE		= app
 CONFIG			= qt warn_on release
 
-TMAKE_CC		= xlC
+TMAKE_CC		= xlc
+#TMAKE_CC		= xlC
 TMAKE_CFLAGS		= -+ -qstrict -D_BSD
 TMAKE_CFLAGS_WARN_ON	=
 TMAKE_CFLAGS_WARN_OFF	=
-TMAKE_CFLAGS_RELEASE	= -O3
+TMAKE_CFLAGS_RELEASE	= -O
+#TMAKE_CFLAGS_RELEASE	= -O3
 TMAKE_CFLAGS_DEBUG	= -g
 TMAKE_CFLAGS_SHLIB	=
 TMAKE_CFLAGS_YACC	=
-- 
cgit v0.12

