From lichray@gmail.com  Tue May  1 01:05:55 2012
Return-Path: <lichray@gmail.com>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 668F0106566B
	for <FreeBSD-gnats-submit@freebsd.org>; Tue,  1 May 2012 01:05:55 +0000 (UTC)
	(envelope-from lichray@gmail.com)
Received: from mail-ob0-f182.google.com (mail-ob0-f182.google.com [209.85.214.182])
	by mx1.freebsd.org (Postfix) with ESMTP id 299E28FC0A
	for <FreeBSD-gnats-submit@freebsd.org>; Tue,  1 May 2012 01:05:55 +0000 (UTC)
Received: by obcni5 with SMTP id ni5so6116113obc.13
        for <FreeBSD-gnats-submit@freebsd.org>; Mon, 30 Apr 2012 18:05:54 -0700 (PDT)
Received: by 10.182.46.36 with SMTP id s4mr5893888obm.58.1335834354643;
        Mon, 30 Apr 2012 18:05:54 -0700 (PDT)
Received: from localhost (c-98-228-191-105.hsd1.il.comcast.net. [98.228.191.105])
        by mx.google.com with ESMTPS id lq4sm11253740obb.12.2012.04.30.18.05.53
        (version=SSLv3 cipher=OTHER);
        Mon, 30 Apr 2012 18:05:53 -0700 (PDT)
Message-Id: <4f9f36f1.447ab60a.784b.ffffed55@mx.google.com>
Date: Mon, 30 Apr 2012 18:05:53 -0700 (PDT)
From: Zhihao Yuan <lichray@gmail.com>
Reply-To: Zhihao Yuan <lichray@gmail.com>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: New port: x11-fm/qtfm A small, lightweight file manager based on pure Qt
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         167466
>Category:       ports
>Synopsis:       New port: x11-fm/qtfm A small, lightweight file manager based on pure Qt
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    makc
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue May 01 01:10:11 UTC 2012
>Closed-Date:    Tue May 08 23:38:29 UTC 2012
>Last-Modified:  Tue May 08 23:38:29 UTC 2012
>Originator:     Zhihao Yuan
>Release:        FreeBSD 8.3-PRERELEASE amd64
>Organization:
Northern Illinois University
>Environment:
System: FreeBSD elitebook.hp 8.3-PRERELEASE FreeBSD 8.3-PRERELEASE #0 r234564: Sun Apr 22 04:30:51 CDT 2012 lichray@elitebook.hp:/usr/obj/usr/src/sys/HOUKAGO amd64


	
>Description:
	
	A small file manager which only depends on QtGui and QtNetwork (no modern hal, polkit, etc.).
	http://www.qtfm.org/
>How-To-Repeat:
	
>Fix:

	
	1. <sys/vfs.h> -> <sys/mount.h>;
	2. inotify -> QFileSystemWatcher (reported to upstream);
	3. /proc/self/mtab watching -> kevent EVFILT_FS in a thread;
	4. /proc/self/mtab parsing -> getmntinfo(3) (reported).

--- qtfm.shar begins here ---
# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	qtfm
#	qtfm/files
#	qtfm/files/patch-src_propertiesdlg.cpp
#	qtfm/files/patch-src_mainwindow.cpp
#	qtfm/files/patch-src_mymodel.cpp
#	qtfm/files/patch-src_mymodel.h
#	qtfm/files/patch-src_mainwindow.h
#	qtfm/files/patch-src_bookmarks.cpp
#	qtfm/files/patch-qtfm.pro
#	qtfm/distinfo
#	qtfm/pkg-plist
#	qtfm/Makefile
#	qtfm/pkg-descr
#
echo c - qtfm
mkdir -p qtfm > /dev/null 2>&1
echo c - qtfm/files
mkdir -p qtfm/files > /dev/null 2>&1
echo x - qtfm/files/patch-src_propertiesdlg.cpp
sed 's/^X//' >qtfm/files/patch-src_propertiesdlg.cpp << '0d9d84c92531dcafeec4d9768cc602f0'
X--- src/propertiesdlg.cpp~	2012-03-08 20:34:27.000000000 -0600
X+++ src/propertiesdlg.cpp	2012-04-29 06:49:57.546488947 -0500
X@@ -23,7 +23,11 @@
X #include "propertiesdlg.h"
X #include "icondlg.h"
X #include "mainwindow.h"
X+#ifdef __FreeBSD__
X+#include <sys/mount.h>
X+#else
X #include <sys/vfs.h>
X+#endif
X #include <sys/stat.h>
X #include <magic.h>
X 
0d9d84c92531dcafeec4d9768cc602f0
echo x - qtfm/files/patch-src_mainwindow.cpp
sed 's/^X//' >qtfm/files/patch-src_mainwindow.cpp << '44433c87ac59d95ad45b8753666563a1'
X--- src/mainwindow.cpp.orig	2012-03-11 10:11:28.000000000 -0500
X+++ src/mainwindow.cpp	2012-04-29 23:06:06.481938775 -0500
X@@ -21,7 +21,11 @@
X 
X 
X #include <QtGui>
X+#ifdef __FreeBSD__
X+#include <sys/mount.h>
X+#else
X #include <sys/vfs.h>
X+#endif
X #include <fcntl.h>
X 
X #include "mainwindow.h"
X@@ -280,10 +284,15 @@ void MainWindow::lateStart()
X     customMapper = new QSignalMapper();
X     connect(customMapper, SIGNAL(mapped(QString)),this, SLOT(actionMapper(QString)));
X 
X+#ifdef __FreeBSD__
X+    worker = new MountWorker();
X+    worker->setParent(this);
X+    worker->start(QThread::IdlePriority);
X+#else
X     int fd = open("/proc/self/mounts",O_RDONLY,0);
X     notify = new QSocketNotifier(fd,QSocketNotifier::Write);
X     connect(notify, SIGNAL(activated(int)), this, SLOT(mountWatcherTriggered()),Qt::QueuedConnection);
X-
X+#endif
X 
X     term = settings->value("term").toString();
X     progress = 0;
X@@ -336,6 +345,9 @@ void MainWindow::closeEvent(QCloseEvent 
X {
X     writeSettings();
X 
X+#ifdef __FreeBSD__
X+    worker->close();
X+#endif
X     if(isDaemon)
X     {
X         this->setVisible(0);
X@@ -1839,7 +1851,7 @@ void MainWindow::actionMapper(QString cm
X     QString exec = temp.at(0);
X     temp.removeAt(0);
X 
X-    temp.replaceInStrings("\\","\ ");
X+    temp.replaceInStrings("\\"," ");
X 
X     QProcess *customProcess = new QProcess();
X     customProcess->setWorkingDirectory(pathEdit->itemText(0));
44433c87ac59d95ad45b8753666563a1
echo x - qtfm/files/patch-src_mymodel.cpp
sed 's/^X//' >qtfm/files/patch-src_mymodel.cpp << '9d571fc377e081220ac31ba2da3641ae'
X--- src/mymodel.cpp.orig	2012-03-09 05:00:54.000000000 -0600
X+++ src/mymodel.cpp	2012-04-29 16:13:57.725169164 -0500
X@@ -21,7 +21,6 @@
X 
X #include <mainwindow.h>
X #include "mymodel.h"
X-#include <sys/inotify.h>
X #include <unistd.h>
X #include <sys/ioctl.h>
X 
X@@ -63,9 +62,8 @@ myModel::myModel(bool realMime)
X 
X     iconFactory = new QFileIconProvider();
X 
X-    inotifyFD = inotify_init();
X-    notifier = new QSocketNotifier(inotifyFD, QSocketNotifier::Read, this);
X-    connect(notifier, SIGNAL(activated(int)), this, SLOT(notifyChange()));
X+    watcher = new QFileSystemWatcher(this);
X+    connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(notifyChange(QString)));
X 
X     realMimeTypes = realMime;
X }
X@@ -188,28 +186,9 @@ QString myModel::getMimeType(const QMode
X }
X 
X //---------------------------------------------------------------------------------------
X-void myModel::notifyChange()
X+void myModel::notifyChange(QString const& path)
X {
X-    notifier->setEnabled(0);
X-
X-    int buffSize = 0;
X-    ioctl(inotifyFD, FIONREAD, (char *) &buffSize);
X-
X-    QByteArray buffer;
X-    buffer.resize(buffSize);
X-    read(inotifyFD,buffer.data(),buffSize);
X-    const char *at = buffer.data();
X-    const char * const end = at + buffSize;
X-
X-    while (at < end)
X-    {
X-        const inotify_event *event = reinterpret_cast<const inotify_event *>(at);
X-
X-        int w = event->wd;
X-
X-        if(watchers.contains(w))
X-        {
X-            myModelItem *parent = rootItem->matchPath(watchers.value(w).split(SEPARATOR));
X+            myModelItem *parent = rootItem->matchPath(path.split(SEPARATOR));
X 
X             if(parent)
X             {
X@@ -230,9 +209,7 @@ void myModel::notifyChange()
X                         //must of been deleted, remove from model
X                         if(child->fileInfo().isDir())
X                         {
X-                            int wd = watchers.key(child->absoluteFilePath());
X-                            inotify_rm_watch(inotifyFD,wd);
X-                            watchers.remove(wd);
X+                            watcher->removePath(child->absoluteFilePath());
X                         }
X                         beginRemoveRows(index(parent->absoluteFilePath()),child->childNumber(),child->childNumber());
X                         parent->removeChild(child);
X@@ -249,23 +226,17 @@ void myModel::notifyChange()
X             }
X             else
X             {
X-                inotify_rm_watch(inotifyFD,w);
X-                watchers.remove(w);
X+                watcher->removePath(path);
X             }
X-        }
X-
X-        at += sizeof(inotify_event) + event->len;
X-    }
X-
X-    notifier->setEnabled(1);
X }
X 
X //---------------------------------------------------------------------------------
X-void myModel::addWatcher(myModelItem *item)
X+void myModel::addToWatcher(myModelItem *item)
X {
X     while(item != rootItem)
X     {
X-        watchers.insert(inotify_add_watch(inotifyFD, item->absoluteFilePath().toLocal8Bit(), IN_MOVE | IN_CREATE | IN_DELETE),item->absoluteFilePath()); //IN_ONESHOT | IN_ALL_EVENTS)
X+        if (!watcher->directories().contains(item->absoluteFilePath()))
X+            watcher->addPath(item->absoluteFilePath());
X         item->watched = 1;
X         item = item->parent();
X     }
X@@ -278,7 +249,7 @@ bool myModel::setRootPath(const QString&
X 
X     myModelItem *item = rootItem->matchPath(path.split(SEPARATOR));
X 
X-    if(item->watched == 0) addWatcher(item);
X+    if(item->watched == 0) addToWatcher(item);
X 
X     if(item->walked == 0)
X     {
X@@ -352,10 +323,7 @@ void myModel::refresh()
X {
X     myModelItem *item = rootItem->matchPath(QStringList("/"));
X 
X-    //free all inotify watches
X-    foreach(int w, watchers.keys())
X-        inotify_rm_watch(inotifyFD,w);
X-    watchers.clear();
X+    watcher->removePaths(watcher->directories());
X 
X     beginResetModel();
X     item->clearAll();
X@@ -811,9 +779,7 @@ bool myModel::remove(const QModelIndex &
X         QFileInfo info(children.at(i));
X         if(info.isDir())
X         {
X-            int wd = watchers.key(info.filePath());
X-            inotify_rm_watch(inotifyFD,wd);
X-            watchers.remove(wd);
X+            watcher->removePath(info.filePath());
X             error |= QDir().rmdir(info.filePath());
X         }
X         else error |= QFile::remove(info.filePath());
9d571fc377e081220ac31ba2da3641ae
echo x - qtfm/files/patch-src_mymodel.h
sed 's/^X//' >qtfm/files/patch-src_mymodel.h << '348051303f98ef66c477a24b73c44bb7'
X--- src/mymodel.h.orig	2012-03-09 00:47:45.000000000 -0600
X+++ src/mymodel.h	2012-04-29 13:59:45.508571462 -0500
X@@ -83,8 +83,8 @@ public:
X         bool realMimeTypes;
X 
X public slots:
X-        void notifyChange();
X-        void addWatcher(myModelItem* path);
X+        void notifyChange(QString const& path);
X+        void addToWatcher(myModelItem* path);
X 
X signals:
X         void dragDropPaste(const QMimeData * data, QString newPath, QStringList cutList);
X@@ -113,9 +113,7 @@ private:
X         QString currentRootPath;
X         QFileIconProvider* iconFactory;
X 
X-        int inotifyFD;
X-        QSocketNotifier *notifier;
X-        QHash<int, QString> watchers;
X+        QFileSystemWatcher *watcher;
X };
X 
X #endif // MYMODEL_H
348051303f98ef66c477a24b73c44bb7
echo x - qtfm/files/patch-src_mainwindow.h
sed 's/^X//' >qtfm/files/patch-src_mainwindow.h << 'e39b4aa67f496c46c3ceac79fb4fcf6e'
X--- src/mainwindow.h.orig	2012-03-08 04:46:39.000000000 -0600
X+++ src/mainwindow.h	2012-04-29 22:53:06.754026702 -0500
X@@ -146,6 +146,15 @@ private:
X     void writeSettings();
X     void recurseFolder(QString path, QString parent, QStringList *);
X 
X+    class MountWorker : public QThread
X+    {
X+        bool ahead;
X+    protected:
X+        void run();
X+    public:
X+        void close();
X+    };
X+
X     int zoom;
X     int zoomTree;
X     int zoomList;
X@@ -182,7 +191,11 @@ private:
X     bookmarkmodel *modelBookmarks;
X     QItemSelectionModel *treeSelectionModel;
X     QItemSelectionModel *listSelectionModel;
X+#ifdef __FreeBSD__
X+    MountWorker *worker;
X+#else
X     QSocketNotifier *notify;
X+#endif
X 
X     QStringList mounts;
X 
e39b4aa67f496c46c3ceac79fb4fcf6e
echo x - qtfm/files/patch-src_bookmarks.cpp
sed 's/^X//' >qtfm/files/patch-src_bookmarks.cpp << '554b56483885fcf897b06e19cd7606b9'
X--- src/bookmarks.cpp.orig	2012-03-08 04:46:39.000000000 -0600
X+++ src/bookmarks.cpp	2012-04-30 14:20:26.157046128 -0500
X@@ -22,6 +22,11 @@
X #ifndef BOOKMARKS_CPP
X #define BOOKMARKS_CPP
X 
X+#ifdef __FreeBSD__
X+#include <sys/event.h>
X+#include <sys/mount.h>
X+#endif
X+
X #include <QtGui>
X #include "bookmarkmodel.h"
X #include "icondlg.h"
X@@ -80,42 +85,74 @@ void MainWindow::mountWatcherTriggered()
X }
X 
X //---------------------------------------------------------------------------
X+#ifdef __FreeBSD__
X+void MainWindow::MountWorker::run()
X+{
X+
X+    ahead = 1;
X+    int kq = kqueue();
X+    struct kevent ki[1];
X+    struct timespec to[1] = {{ 0, 100000 }};
X+
X+    EV_SET(ki, 0, EVFILT_FS, EV_ADD, VQ_MOUNT | VQ_UNMOUNT, 0, 0);
X+    kevent(kq, ki, 1, NULL, 0, NULL);
X+
X+    while (ahead) {
X+        switch (kevent(kq, NULL, 0, ki, 1, to)) {
X+        case -1:
X+            ::perror("kevent");
X+            break;
X+        case 0:
X+            continue;
X+        default:
X+            ((MainWindow *)parent())->MainWindow::autoBookmarkMounts();
X+        }
X+    }
X+    ::close(kq);
X+}
X+
X+void MainWindow::MountWorker::close()
X+{
X+    ahead = 0;
X+    wait();
X+}
X+#endif
X+
X+//---------------------------------------------------------------------------
X void MainWindow::autoBookmarkMounts()
X {
X     QList<QStandardItem *> theBookmarks = modelBookmarks->findItems("*",Qt::MatchWildcard);
X 
X     QStringList autoBookmarks;
X 
X+    size_t mntsize;
X+    struct statfs *mnt, *mntbuf;
X+
X     foreach(QStandardItem *item, theBookmarks)
X     {
X         if(item->data(34).toString() == "1")		    //is an automount
X             autoBookmarks.append(item->data(32).toString());
X     }
X 
X-    QStringList mtabMounts;
X-    QFile mtab("/etc/mtab");
X-    mtab.open(QFile::ReadOnly);
X-    QTextStream stream(&mtab);
X-    do mtabMounts.append(stream.readLine());
X-    while (!stream.atEnd());
X-    mtab.close();
X+    mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
X 
X     QStringList dontShowList = settings->value("hideBookmarks",0).toStringList();
X     mounts.clear();
X 
X-    foreach(QString item, mtabMounts)
X-        if(item[0] == '/')
X+    for (mnt = mntbuf; mntsize > 0; mntsize--, mnt++)
X+        // XXX zpool name does not start with /
X+        if (mnt->f_mntfromname[0] == '/' or !strcmp(mnt->f_fstypename, "zfs"))
X         {
X-            QString path = item.split(" ").at(1);
X-            path.replace("\\040"," ");
X-
X-            mounts.append(path);
X-            if(!dontShowList.contains(path))
X-                if(!autoBookmarks.contains(path))	    //add a new auto bookmark if it doesn't exist
X+            mounts.append(mnt->f_mntonname);
X+            if(!dontShowList.contains(mnt->f_mntonname))
X+                //add a new auto bookmark if it doesn't exist
X+                if(!autoBookmarks.contains(mnt->f_mntonname))
X                 {
X-                    if(item.split(" ").at(2) == "iso9660") modelBookmarks->addBookmark(path,path,"1","drive-optical");
X-                    else if(item.split(" ").at(2).contains("fat")) modelBookmarks->addBookmark(path,path,"1","drive-removable-media");
X-                    else modelBookmarks->addBookmark(path,path,"1","drive-harddisk");
X+                    if(strstr(mnt->f_fstypename, "9660"))
X+                        modelBookmarks->addBookmark(mnt->f_mntonname,mnt->f_mntonname,"1","drive-optical");
X+                    else if(strstr(mnt->f_fstypename, "fat"))
X+                        modelBookmarks->addBookmark(mnt->f_mntonname,mnt->f_mntonname,"1","drive-removable-media");
X+                    else modelBookmarks->addBookmark(mnt->f_mntonname,mnt->f_mntonname,"1","drive-harddisk");
X                 }
X         }
X 
554b56483885fcf897b06e19cd7606b9
echo x - qtfm/files/patch-qtfm.pro
sed 's/^X//' >qtfm/files/patch-qtfm.pro << '539ce90923915e57a4d8da9176a33b82'
X--- qtfm.pro.orig	2012-04-30 17:08:07.093692960 -0500
X+++ qtfm.pro	2012-04-30 17:48:49.433021364 -0500
X@@ -55,7 +55,7 @@ trans.files += translations/qtfm_da.qm \
X                translations/qtfm_zh.qm \
X                translations/qtfm_zh_TW.qm
X 
X-INSTALLS += target desktop icon docs trans
X+INSTALLS += target desktop icon trans
X 
X 
X 
539ce90923915e57a4d8da9176a33b82
echo x - qtfm/distinfo
sed 's/^X//' >qtfm/distinfo << '2e77555e3ee02543739b10879fbce1af'
XSHA256 (qtfm-5.4.tar.gz) = 8ef4c2464502959944e1b2476aa635b2a889d2859ba62dd61d8f591779c6fd0d
XSIZE (qtfm-5.4.tar.gz) = 147293
2e77555e3ee02543739b10879fbce1af
echo x - qtfm/pkg-plist
sed 's/^X//' >qtfm/pkg-plist << '2aa18a46886aa40174f24aeaf10ceb63'
Xbin/qtfm
Xshare/applications/qtfm.desktop
Xshare/pixmaps/qtfm.png
X%%DATADIR%%/qtfm_da.qm
X%%DATADIR%%/qtfm_de.qm
X%%DATADIR%%/qtfm_es.qm
X%%DATADIR%%/qtfm_fr.qm
X%%DATADIR%%/qtfm_it.qm
X%%DATADIR%%/qtfm_pl.qm
X%%DATADIR%%/qtfm_ru.qm
X%%DATADIR%%/qtfm_sr.qm
X%%DATADIR%%/qtfm_zh.qm
X%%DATADIR%%/qtfm_zh_TW.qm
X@dirrm %%DATADIR%%
2aa18a46886aa40174f24aeaf10ceb63
echo x - qtfm/Makefile
sed 's/^X//' >qtfm/Makefile << 'def7cb58bb8db47afc7f6c9ef8ce34cd'
X# New ports collection makefile for:	qtfm
X# Date created:				29 Apr 2012
X# Whom:					Zhihao Yuan <lichray@gmail.com>
X#
X# $FreeBSD$
X#
X
XPORTNAME=	qtfm
XDISTVERSION=	5.4
XCATEGORIES=	x11-fm
XMASTER_SITES=	http://www.qtfm.org/
X
XMAINTAINER=	lichray@gmail.com
XCOMMENT=	A small, lightweight file manager based on pure Qt
X
XLICENSE=	GPLv2
XLICENSE_FILE=	${WRKSRC}/COPYING
X
XUSE_DOS2UNIX=	yes
XUSE_QT_VER=	4
XQT_COMPONENTS=	gui network qmake_build moc_build rcc_build
X
XMAKE_JOBS_SAFE=	yes
XSTRIP_FILES=	bin/qtfm
X
Xpost-patch:
X	@cd ${WRKSRC} && \
X		${REINPLACE_CMD} -e s@/usr/@${PREFIX}/@g \
X		qtfm.pro src/main.cpp
X	@cd ${WRKSRC}/src && \
X		${REINPLACE_CMD} -e s@/usr/@${LOCALBASE}/@g \
X		icondlg.cpp mainwindow.cpp mymodel.cpp
X
Xdo-configure:
X	@cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} ${QMAKE} \
X		${QMAKEFLAGS} qtfm.pro
X
Xpost-install:
X	${STRIP_CMD} ${STRIP_FILES:S,^,${PREFIX}/,}
X
X.include <bsd.port.mk>
def7cb58bb8db47afc7f6c9ef8ce34cd
echo x - qtfm/pkg-descr
sed 's/^X//' >qtfm/pkg-descr << 'c8a167a29c6b1c2f721eaf16c674b5d9'
XqtFM is a small, lightweight file manager for Linux desktops based on pure Qt
Xand works great with minimal desktop environments like Openbox.
X
XWWW: http://www.qtfm.org/
c8a167a29c6b1c2f721eaf16c674b5d9
exit
--- qtfm.shar ends here ---


>Release-Note:
>Audit-Trail:

From: Zhihao Yuan <lichray@gmail.com>
To: bug-followup@FreeBSD.org, lichray@gmail.com
Cc:  
Subject: Re: ports/167466: New port: x11-fm/qtfm A small, lightweight file
 manager based on pure Qt
Date: Mon, 30 Apr 2012 20:59:50 -0500

 --14dae934085917c09404beefed35
 Content-Type: text/plain; charset=UTF-8
 
 Fix 1 known problem and a big miss.
 
 1. Requires qt4-imageformats plugins.
 2. Use USE_DOS2UNIX in a correct way (did not noticed that due to the
 icon cache).
 
 -- 
 Zhihao Yuan, nickname lichray
 The best way to predict the future is to invent it.
 ___________________________________________________
 4BSD -- http://4bsd.biz/
 
 --14dae934085917c09404beefed35
 Content-Type: application/x-shar; name="qtfm_1.shar"
 Content-Disposition: attachment; filename="qtfm_1.shar"
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_h1ob7e1y0
 
 IyBUaGlzIGlzIGEgc2hlbGwgYXJjaGl2ZS4gIFNhdmUgaXQgaW4gYSBmaWxlLCByZW1vdmUgYW55
 dGhpbmcgYmVmb3JlCiMgdGhpcyBsaW5lLCBhbmQgdGhlbiB1bnBhY2sgaXQgYnkgZW50ZXJpbmcg
 InNoIGZpbGUiLiAgTm90ZSwgaXQgbWF5CiMgY3JlYXRlIGRpcmVjdG9yaWVzOyBmaWxlcyBhbmQg
 ZGlyZWN0b3JpZXMgd2lsbCBiZSBvd25lZCBieSB5b3UgYW5kCiMgaGF2ZSBkZWZhdWx0IHBlcm1p
 c3Npb25zLgojCiMgVGhpcyBhcmNoaXZlIGNvbnRhaW5zOgojCiMJcXRmbQojCXF0Zm0vZmlsZXMK
 IwlxdGZtL2ZpbGVzL3BhdGNoLXNyY19wcm9wZXJ0aWVzZGxnLmNwcAojCXF0Zm0vZmlsZXMvcGF0
 Y2gtc3JjX21haW53aW5kb3cuY3BwCiMJcXRmbS9maWxlcy9wYXRjaC1zcmNfbXltb2RlbC5jcHAK
 IwlxdGZtL2ZpbGVzL3BhdGNoLXNyY19teW1vZGVsLmgKIwlxdGZtL2ZpbGVzL3BhdGNoLXNyY19t
 YWlud2luZG93LmgKIwlxdGZtL2ZpbGVzL3BhdGNoLXNyY19ib29rbWFya3MuY3BwCiMJcXRmbS9m
 aWxlcy9wYXRjaC1xdGZtLnBybwojCXF0Zm0vZGlzdGluZm8KIwlxdGZtL3BrZy1wbGlzdAojCXF0
 Zm0vTWFrZWZpbGUKIwlxdGZtL3BrZy1kZXNjcgojCmVjaG8gYyAtIHF0Zm0KbWtkaXIgLXAgcXRm
 bSA+IC9kZXYvbnVsbCAyPiYxCmVjaG8gYyAtIHF0Zm0vZmlsZXMKbWtkaXIgLXAgcXRmbS9maWxl
 cyA+IC9kZXYvbnVsbCAyPiYxCmVjaG8geCAtIHF0Zm0vZmlsZXMvcGF0Y2gtc3JjX3Byb3BlcnRp
 ZXNkbGcuY3BwCnNlZCAncy9eWC8vJyA+cXRmbS9maWxlcy9wYXRjaC1zcmNfcHJvcGVydGllc2Rs
 Zy5jcHAgPDwgJzBkOWQ4NGM5MjUzMWRjYWZlZWM0ZDk3NjhjYzYwMmYwJwpYLS0tIHNyYy9wcm9w
 ZXJ0aWVzZGxnLmNwcH4JMjAxMi0wMy0wOCAyMDozNDoyNy4wMDAwMDAwMDAgLTA2MDAKWCsrKyBz
 cmMvcHJvcGVydGllc2RsZy5jcHAJMjAxMi0wNC0yOSAwNjo0OTo1Ny41NDY0ODg5NDcgLTA1MDAK
 WEBAIC0yMyw3ICsyMywxMSBAQApYICNpbmNsdWRlICJwcm9wZXJ0aWVzZGxnLmgiClggI2luY2x1
 ZGUgImljb25kbGcuaCIKWCAjaW5jbHVkZSAibWFpbndpbmRvdy5oIgpYKyNpZmRlZiBfX0ZyZWVC
 U0RfXwpYKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KWCsjZWxzZQpYICNpbmNsdWRlIDxzeXMvdmZz
 Lmg+ClgrI2VuZGlmClggI2luY2x1ZGUgPHN5cy9zdGF0Lmg+ClggI2luY2x1ZGUgPG1hZ2ljLmg+
 ClggCjBkOWQ4NGM5MjUzMWRjYWZlZWM0ZDk3NjhjYzYwMmYwCmVjaG8geCAtIHF0Zm0vZmlsZXMv
 cGF0Y2gtc3JjX21haW53aW5kb3cuY3BwCnNlZCAncy9eWC8vJyA+cXRmbS9maWxlcy9wYXRjaC1z
 cmNfbWFpbndpbmRvdy5jcHAgPDwgJzQ0NDMzYzg3YWM1OWQ5NWFkNDViODc1MzY2NjU2M2ExJwpY
 LS0tIHNyYy9tYWlud2luZG93LmNwcC5vcmlnCTIwMTItMDMtMTEgMTA6MTE6MjguMDAwMDAwMDAw
 IC0wNTAwClgrKysgc3JjL21haW53aW5kb3cuY3BwCTIwMTItMDQtMjkgMjM6MDY6MDYuNDgxOTM4
 Nzc1IC0wNTAwClhAQCAtMjEsNyArMjEsMTEgQEAKWCAKWCAKWCAjaW5jbHVkZSA8UXRHdWk+Clgr
 I2lmZGVmIF9fRnJlZUJTRF9fClgrI2luY2x1ZGUgPHN5cy9tb3VudC5oPgpYKyNlbHNlClggI2lu
 Y2x1ZGUgPHN5cy92ZnMuaD4KWCsjZW5kaWYKWCAjaW5jbHVkZSA8ZmNudGwuaD4KWCAKWCAjaW5j
 bHVkZSAibWFpbndpbmRvdy5oIgpYQEAgLTI4MCwxMCArMjg0LDE1IEBAIHZvaWQgTWFpbldpbmRv
 dzo6bGF0ZVN0YXJ0KCkKWCAgICAgY3VzdG9tTWFwcGVyID0gbmV3IFFTaWduYWxNYXBwZXIoKTsK
 WCAgICAgY29ubmVjdChjdXN0b21NYXBwZXIsIFNJR05BTChtYXBwZWQoUVN0cmluZykpLHRoaXMs
 IFNMT1QoYWN0aW9uTWFwcGVyKFFTdHJpbmcpKSk7ClggClgrI2lmZGVmIF9fRnJlZUJTRF9fClgr
 ICAgIHdvcmtlciA9IG5ldyBNb3VudFdvcmtlcigpOwpYKyAgICB3b3JrZXItPnNldFBhcmVudCh0
 aGlzKTsKWCsgICAgd29ya2VyLT5zdGFydChRVGhyZWFkOjpJZGxlUHJpb3JpdHkpOwpYKyNlbHNl
 ClggICAgIGludCBmZCA9IG9wZW4oIi9wcm9jL3NlbGYvbW91bnRzIixPX1JET05MWSwwKTsKWCAg
 ICAgbm90aWZ5ID0gbmV3IFFTb2NrZXROb3RpZmllcihmZCxRU29ja2V0Tm90aWZpZXI6OldyaXRl
 KTsKWCAgICAgY29ubmVjdChub3RpZnksIFNJR05BTChhY3RpdmF0ZWQoaW50KSksIHRoaXMsIFNM
 T1QobW91bnRXYXRjaGVyVHJpZ2dlcmVkKCkpLFF0OjpRdWV1ZWRDb25uZWN0aW9uKTsKWC0KWCsj
 ZW5kaWYKWCAKWCAgICAgdGVybSA9IHNldHRpbmdzLT52YWx1ZSgidGVybSIpLnRvU3RyaW5nKCk7
 ClggICAgIHByb2dyZXNzID0gMDsKWEBAIC0zMzYsNiArMzQ1LDkgQEAgdm9pZCBNYWluV2luZG93
 OjpjbG9zZUV2ZW50KFFDbG9zZUV2ZW50IApYIHsKWCAgICAgd3JpdGVTZXR0aW5ncygpOwpYIApY
 KyNpZmRlZiBfX0ZyZWVCU0RfXwpYKyAgICB3b3JrZXItPmNsb3NlKCk7ClgrI2VuZGlmClggICAg
 IGlmKGlzRGFlbW9uKQpYICAgICB7ClggICAgICAgICB0aGlzLT5zZXRWaXNpYmxlKDApOwpYQEAg
 LTE4MzksNyArMTg1MSw3IEBAIHZvaWQgTWFpbldpbmRvdzo6YWN0aW9uTWFwcGVyKFFTdHJpbmcg
 Y20KWCAgICAgUVN0cmluZyBleGVjID0gdGVtcC5hdCgwKTsKWCAgICAgdGVtcC5yZW1vdmVBdCgw
 KTsKWCAKWC0gICAgdGVtcC5yZXBsYWNlSW5TdHJpbmdzKCJcXCIsIlwgIik7ClgrICAgIHRlbXAu
 cmVwbGFjZUluU3RyaW5ncygiXFwiLCIgIik7ClggClggICAgIFFQcm9jZXNzICpjdXN0b21Qcm9j
 ZXNzID0gbmV3IFFQcm9jZXNzKCk7ClggICAgIGN1c3RvbVByb2Nlc3MtPnNldFdvcmtpbmdEaXJl
 Y3RvcnkocGF0aEVkaXQtPml0ZW1UZXh0KDApKTsKNDQ0MzNjODdhYzU5ZDk1YWQ0NWI4NzUzNjY2
 NTYzYTEKZWNobyB4IC0gcXRmbS9maWxlcy9wYXRjaC1zcmNfbXltb2RlbC5jcHAKc2VkICdzL15Y
 Ly8nID5xdGZtL2ZpbGVzL3BhdGNoLXNyY19teW1vZGVsLmNwcCA8PCAnOWQ1NzFmYzM3N2UwODEy
 MjBhYzMxYmEyZGEzNjQxYWUnClgtLS0gc3JjL215bW9kZWwuY3BwLm9yaWcJMjAxMi0wMy0wOSAw
 NTowMDo1NC4wMDAwMDAwMDAgLTA2MDAKWCsrKyBzcmMvbXltb2RlbC5jcHAJMjAxMi0wNC0yOSAx
 NjoxMzo1Ny43MjUxNjkxNjQgLTA1MDAKWEBAIC0yMSw3ICsyMSw2IEBAClggClggI2luY2x1ZGUg
 PG1haW53aW5kb3cuaD4KWCAjaW5jbHVkZSAibXltb2RlbC5oIgpYLSNpbmNsdWRlIDxzeXMvaW5v
 dGlmeS5oPgpYICNpbmNsdWRlIDx1bmlzdGQuaD4KWCAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+Clgg
 ClhAQCAtNjMsOSArNjIsOCBAQCBteU1vZGVsOjpteU1vZGVsKGJvb2wgcmVhbE1pbWUpClggClgg
 ICAgIGljb25GYWN0b3J5ID0gbmV3IFFGaWxlSWNvblByb3ZpZGVyKCk7ClggClgtICAgIGlub3Rp
 ZnlGRCA9IGlub3RpZnlfaW5pdCgpOwpYLSAgICBub3RpZmllciA9IG5ldyBRU29ja2V0Tm90aWZp
 ZXIoaW5vdGlmeUZELCBRU29ja2V0Tm90aWZpZXI6OlJlYWQsIHRoaXMpOwpYLSAgICBjb25uZWN0
 KG5vdGlmaWVyLCBTSUdOQUwoYWN0aXZhdGVkKGludCkpLCB0aGlzLCBTTE9UKG5vdGlmeUNoYW5n
 ZSgpKSk7ClgrICAgIHdhdGNoZXIgPSBuZXcgUUZpbGVTeXN0ZW1XYXRjaGVyKHRoaXMpOwpYKyAg
 ICBjb25uZWN0KHdhdGNoZXIsIFNJR05BTChkaXJlY3RvcnlDaGFuZ2VkKFFTdHJpbmcpKSwgdGhp
 cywgU0xPVChub3RpZnlDaGFuZ2UoUVN0cmluZykpKTsKWCAKWCAgICAgcmVhbE1pbWVUeXBlcyA9
 IHJlYWxNaW1lOwpYIH0KWEBAIC0xODgsMjggKzE4Niw5IEBAIFFTdHJpbmcgbXlNb2RlbDo6Z2V0
 TWltZVR5cGUoY29uc3QgUU1vZGUKWCB9ClggClggLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
 LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
 LS0tLS0KWC12b2lkIG15TW9kZWw6Om5vdGlmeUNoYW5nZSgpClgrdm9pZCBteU1vZGVsOjpub3Rp
 ZnlDaGFuZ2UoUVN0cmluZyBjb25zdCYgcGF0aCkKWCB7ClgtICAgIG5vdGlmaWVyLT5zZXRFbmFi
 bGVkKDApOwpYLQpYLSAgICBpbnQgYnVmZlNpemUgPSAwOwpYLSAgICBpb2N0bChpbm90aWZ5RkQs
 IEZJT05SRUFELCAoY2hhciAqKSAmYnVmZlNpemUpOwpYLQpYLSAgICBRQnl0ZUFycmF5IGJ1ZmZl
 cjsKWC0gICAgYnVmZmVyLnJlc2l6ZShidWZmU2l6ZSk7ClgtICAgIHJlYWQoaW5vdGlmeUZELGJ1
 ZmZlci5kYXRhKCksYnVmZlNpemUpOwpYLSAgICBjb25zdCBjaGFyICphdCA9IGJ1ZmZlci5kYXRh
 KCk7ClgtICAgIGNvbnN0IGNoYXIgKiBjb25zdCBlbmQgPSBhdCArIGJ1ZmZTaXplOwpYLQpYLSAg
 ICB3aGlsZSAoYXQgPCBlbmQpClgtICAgIHsKWC0gICAgICAgIGNvbnN0IGlub3RpZnlfZXZlbnQg
 KmV2ZW50ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbm90aWZ5X2V2ZW50ICo+KGF0KTsKWC0K
 WC0gICAgICAgIGludCB3ID0gZXZlbnQtPndkOwpYLQpYLSAgICAgICAgaWYod2F0Y2hlcnMuY29u
 dGFpbnModykpClgtICAgICAgICB7ClgtICAgICAgICAgICAgbXlNb2RlbEl0ZW0gKnBhcmVudCA9
 IHJvb3RJdGVtLT5tYXRjaFBhdGgod2F0Y2hlcnMudmFsdWUodykuc3BsaXQoU0VQQVJBVE9SKSk7
 ClgrICAgICAgICAgICAgbXlNb2RlbEl0ZW0gKnBhcmVudCA9IHJvb3RJdGVtLT5tYXRjaFBhdGgo
 cGF0aC5zcGxpdChTRVBBUkFUT1IpKTsKWCAKWCAgICAgICAgICAgICBpZihwYXJlbnQpClggICAg
 ICAgICAgICAgewpYQEAgLTIzMCw5ICsyMDksNyBAQCB2b2lkIG15TW9kZWw6Om5vdGlmeUNoYW5n
 ZSgpClggICAgICAgICAgICAgICAgICAgICAgICAgLy9tdXN0IG9mIGJlZW4gZGVsZXRlZCwgcmVt
 b3ZlIGZyb20gbW9kZWwKWCAgICAgICAgICAgICAgICAgICAgICAgICBpZihjaGlsZC0+ZmlsZUlu
 Zm8oKS5pc0RpcigpKQpYICAgICAgICAgICAgICAgICAgICAgICAgIHsKWC0gICAgICAgICAgICAg
 ICAgICAgICAgICAgICAgaW50IHdkID0gd2F0Y2hlcnMua2V5KGNoaWxkLT5hYnNvbHV0ZUZpbGVQ
 YXRoKCkpOwpYLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm90aWZ5X3JtX3dhdGNoKGlu
 b3RpZnlGRCx3ZCk7ClgtICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZXJzLnJlbW92
 ZSh3ZCk7ClgrICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZXItPnJlbW92ZVBhdGgo
 Y2hpbGQtPmFic29sdXRlRmlsZVBhdGgoKSk7ClggICAgICAgICAgICAgICAgICAgICAgICAgfQpY
 ICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luUmVtb3ZlUm93cyhpbmRleChwYXJlbnQtPmFi
 c29sdXRlRmlsZVBhdGgoKSksY2hpbGQtPmNoaWxkTnVtYmVyKCksY2hpbGQtPmNoaWxkTnVtYmVy
 KCkpOwpYICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+cmVtb3ZlQ2hpbGQoY2hpbGQp
 OwpYQEAgLTI0OSwyMyArMjI2LDE3IEBAIHZvaWQgbXlNb2RlbDo6bm90aWZ5Q2hhbmdlKCkKWCAg
 ICAgICAgICAgICB9ClggICAgICAgICAgICAgZWxzZQpYICAgICAgICAgICAgIHsKWC0gICAgICAg
 ICAgICAgICAgaW5vdGlmeV9ybV93YXRjaChpbm90aWZ5RkQsdyk7ClgtICAgICAgICAgICAgICAg
 IHdhdGNoZXJzLnJlbW92ZSh3KTsKWCsgICAgICAgICAgICAgICAgd2F0Y2hlci0+cmVtb3ZlUGF0
 aChwYXRoKTsKWCAgICAgICAgICAgICB9ClgtICAgICAgICB9ClgtClgtICAgICAgICBhdCArPSBz
 aXplb2YoaW5vdGlmeV9ldmVudCkgKyBldmVudC0+bGVuOwpYLSAgICB9ClgtClgtICAgIG5vdGlm
 aWVyLT5zZXRFbmFibGVkKDEpOwpYIH0KWCAKWCAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
 LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpY
 LXZvaWQgbXlNb2RlbDo6YWRkV2F0Y2hlcihteU1vZGVsSXRlbSAqaXRlbSkKWCt2b2lkIG15TW9k
 ZWw6OmFkZFRvV2F0Y2hlcihteU1vZGVsSXRlbSAqaXRlbSkKWCB7ClggICAgIHdoaWxlKGl0ZW0g
 IT0gcm9vdEl0ZW0pClggICAgIHsKWC0gICAgICAgIHdhdGNoZXJzLmluc2VydChpbm90aWZ5X2Fk
 ZF93YXRjaChpbm90aWZ5RkQsIGl0ZW0tPmFic29sdXRlRmlsZVBhdGgoKS50b0xvY2FsOEJpdCgp
 LCBJTl9NT1ZFIHwgSU5fQ1JFQVRFIHwgSU5fREVMRVRFKSxpdGVtLT5hYnNvbHV0ZUZpbGVQYXRo
 KCkpOyAvL0lOX09ORVNIT1QgfCBJTl9BTExfRVZFTlRTKQpYKyAgICAgICAgaWYgKCF3YXRjaGVy
 LT5kaXJlY3RvcmllcygpLmNvbnRhaW5zKGl0ZW0tPmFic29sdXRlRmlsZVBhdGgoKSkpClgrICAg
 ICAgICAgICAgd2F0Y2hlci0+YWRkUGF0aChpdGVtLT5hYnNvbHV0ZUZpbGVQYXRoKCkpOwpYICAg
 ICAgICAgaXRlbS0+d2F0Y2hlZCA9IDE7ClggICAgICAgICBpdGVtID0gaXRlbS0+cGFyZW50KCk7
 ClggICAgIH0KWEBAIC0yNzgsNyArMjQ5LDcgQEAgYm9vbCBteU1vZGVsOjpzZXRSb290UGF0aChj
 b25zdCBRU3RyaW5nJgpYIApYICAgICBteU1vZGVsSXRlbSAqaXRlbSA9IHJvb3RJdGVtLT5tYXRj
 aFBhdGgocGF0aC5zcGxpdChTRVBBUkFUT1IpKTsKWCAKWC0gICAgaWYoaXRlbS0+d2F0Y2hlZCA9
 PSAwKSBhZGRXYXRjaGVyKGl0ZW0pOwpYKyAgICBpZihpdGVtLT53YXRjaGVkID09IDApIGFkZFRv
 V2F0Y2hlcihpdGVtKTsKWCAKWCAgICAgaWYoaXRlbS0+d2Fsa2VkID09IDApClggICAgIHsKWEBA
 IC0zNTIsMTAgKzMyMyw3IEBAIHZvaWQgbXlNb2RlbDo6cmVmcmVzaCgpClggewpYICAgICBteU1v
 ZGVsSXRlbSAqaXRlbSA9IHJvb3RJdGVtLT5tYXRjaFBhdGgoUVN0cmluZ0xpc3QoIi8iKSk7Clgg
 ClgtICAgIC8vZnJlZSBhbGwgaW5vdGlmeSB3YXRjaGVzClgtICAgIGZvcmVhY2goaW50IHcsIHdh
 dGNoZXJzLmtleXMoKSkKWC0gICAgICAgIGlub3RpZnlfcm1fd2F0Y2goaW5vdGlmeUZELHcpOwpY
 LSAgICB3YXRjaGVycy5jbGVhcigpOwpYKyAgICB3YXRjaGVyLT5yZW1vdmVQYXRocyh3YXRjaGVy
 LT5kaXJlY3RvcmllcygpKTsKWCAKWCAgICAgYmVnaW5SZXNldE1vZGVsKCk7ClggICAgIGl0ZW0t
 PmNsZWFyQWxsKCk7ClhAQCAtODExLDkgKzc3OSw3IEBAIGJvb2wgbXlNb2RlbDo6cmVtb3ZlKGNv
 bnN0IFFNb2RlbEluZGV4ICYKWCAgICAgICAgIFFGaWxlSW5mbyBpbmZvKGNoaWxkcmVuLmF0KGkp
 KTsKWCAgICAgICAgIGlmKGluZm8uaXNEaXIoKSkKWCAgICAgICAgIHsKWC0gICAgICAgICAgICBp
 bnQgd2QgPSB3YXRjaGVycy5rZXkoaW5mby5maWxlUGF0aCgpKTsKWC0gICAgICAgICAgICBpbm90
 aWZ5X3JtX3dhdGNoKGlub3RpZnlGRCx3ZCk7ClgtICAgICAgICAgICAgd2F0Y2hlcnMucmVtb3Zl
 KHdkKTsKWCsgICAgICAgICAgICB3YXRjaGVyLT5yZW1vdmVQYXRoKGluZm8uZmlsZVBhdGgoKSk7
 ClggICAgICAgICAgICAgZXJyb3IgfD0gUURpcigpLnJtZGlyKGluZm8uZmlsZVBhdGgoKSk7Clgg
 ICAgICAgICB9ClggICAgICAgICBlbHNlIGVycm9yIHw9IFFGaWxlOjpyZW1vdmUoaW5mby5maWxl
 UGF0aCgpKTsKOWQ1NzFmYzM3N2UwODEyMjBhYzMxYmEyZGEzNjQxYWUKZWNobyB4IC0gcXRmbS9m
 aWxlcy9wYXRjaC1zcmNfbXltb2RlbC5oCnNlZCAncy9eWC8vJyA+cXRmbS9maWxlcy9wYXRjaC1z
 cmNfbXltb2RlbC5oIDw8ICczNDgwNTEzMDNmOThlZjY2YzQ3N2EyNGI3M2M0NGJiNycKWC0tLSBz
 cmMvbXltb2RlbC5oLm9yaWcJMjAxMi0wMy0wOSAwMDo0Nzo0NS4wMDAwMDAwMDAgLTA2MDAKWCsr
 KyBzcmMvbXltb2RlbC5oCTIwMTItMDQtMjkgMTM6NTk6NDUuNTA4NTcxNDYyIC0wNTAwClhAQCAt
 ODMsOCArODMsOCBAQCBwdWJsaWM6ClggICAgICAgICBib29sIHJlYWxNaW1lVHlwZXM7ClggClgg
 cHVibGljIHNsb3RzOgpYLSAgICAgICAgdm9pZCBub3RpZnlDaGFuZ2UoKTsKWC0gICAgICAgIHZv
 aWQgYWRkV2F0Y2hlcihteU1vZGVsSXRlbSogcGF0aCk7ClgrICAgICAgICB2b2lkIG5vdGlmeUNo
 YW5nZShRU3RyaW5nIGNvbnN0JiBwYXRoKTsKWCsgICAgICAgIHZvaWQgYWRkVG9XYXRjaGVyKG15
 TW9kZWxJdGVtKiBwYXRoKTsKWCAKWCBzaWduYWxzOgpYICAgICAgICAgdm9pZCBkcmFnRHJvcFBh
 c3RlKGNvbnN0IFFNaW1lRGF0YSAqIGRhdGEsIFFTdHJpbmcgbmV3UGF0aCwgUVN0cmluZ0xpc3Qg
 Y3V0TGlzdCk7ClhAQCAtMTEzLDkgKzExMyw3IEBAIHByaXZhdGU6ClggICAgICAgICBRU3RyaW5n
 IGN1cnJlbnRSb290UGF0aDsKWCAgICAgICAgIFFGaWxlSWNvblByb3ZpZGVyKiBpY29uRmFjdG9y
 eTsKWCAKWC0gICAgICAgIGludCBpbm90aWZ5RkQ7ClgtICAgICAgICBRU29ja2V0Tm90aWZpZXIg
 Km5vdGlmaWVyOwpYLSAgICAgICAgUUhhc2g8aW50LCBRU3RyaW5nPiB3YXRjaGVyczsKWCsgICAg
 ICAgIFFGaWxlU3lzdGVtV2F0Y2hlciAqd2F0Y2hlcjsKWCB9OwpYIApYICNlbmRpZiAvLyBNWU1P
 REVMX0gKMzQ4MDUxMzAzZjk4ZWY2NmM0NzdhMjRiNzNjNDRiYjcKZWNobyB4IC0gcXRmbS9maWxl
 cy9wYXRjaC1zcmNfbWFpbndpbmRvdy5oCnNlZCAncy9eWC8vJyA+cXRmbS9maWxlcy9wYXRjaC1z
 cmNfbWFpbndpbmRvdy5oIDw8ICdlMzliNGFhNjdmNDk2YzQ2YzNjZWFjNzlmYjRmY2Y2ZScKWC0t
 LSBzcmMvbWFpbndpbmRvdy5oLm9yaWcJMjAxMi0wMy0wOCAwNDo0NjozOS4wMDAwMDAwMDAgLTA2
 MDAKWCsrKyBzcmMvbWFpbndpbmRvdy5oCTIwMTItMDQtMjkgMjI6NTM6MDYuNzU0MDI2NzAyIC0w
 NTAwClhAQCAtMTQ2LDYgKzE0NiwxNSBAQCBwcml2YXRlOgpYICAgICB2b2lkIHdyaXRlU2V0dGlu
 Z3MoKTsKWCAgICAgdm9pZCByZWN1cnNlRm9sZGVyKFFTdHJpbmcgcGF0aCwgUVN0cmluZyBwYXJl
 bnQsIFFTdHJpbmdMaXN0ICopOwpYIApYKyAgICBjbGFzcyBNb3VudFdvcmtlciA6IHB1YmxpYyBR
 VGhyZWFkClgrICAgIHsKWCsgICAgICAgIGJvb2wgYWhlYWQ7ClgrICAgIHByb3RlY3RlZDoKWCsg
 ICAgICAgIHZvaWQgcnVuKCk7ClgrICAgIHB1YmxpYzoKWCsgICAgICAgIHZvaWQgY2xvc2UoKTsK
 WCsgICAgfTsKWCsKWCAgICAgaW50IHpvb207ClggICAgIGludCB6b29tVHJlZTsKWCAgICAgaW50
 IHpvb21MaXN0OwpYQEAgLTE4Miw3ICsxOTEsMTEgQEAgcHJpdmF0ZToKWCAgICAgYm9va21hcmtt
 b2RlbCAqbW9kZWxCb29rbWFya3M7ClggICAgIFFJdGVtU2VsZWN0aW9uTW9kZWwgKnRyZWVTZWxl
 Y3Rpb25Nb2RlbDsKWCAgICAgUUl0ZW1TZWxlY3Rpb25Nb2RlbCAqbGlzdFNlbGVjdGlvbk1vZGVs
 OwpYKyNpZmRlZiBfX0ZyZWVCU0RfXwpYKyAgICBNb3VudFdvcmtlciAqd29ya2VyOwpYKyNlbHNl
 ClggICAgIFFTb2NrZXROb3RpZmllciAqbm90aWZ5OwpYKyNlbmRpZgpYIApYICAgICBRU3RyaW5n
 TGlzdCBtb3VudHM7ClggCmUzOWI0YWE2N2Y0OTZjNDZjM2NlYWM3OWZiNGZjZjZlCmVjaG8geCAt
 IHF0Zm0vZmlsZXMvcGF0Y2gtc3JjX2Jvb2ttYXJrcy5jcHAKc2VkICdzL15YLy8nID5xdGZtL2Zp
 bGVzL3BhdGNoLXNyY19ib29rbWFya3MuY3BwIDw8ICc1NTRiNTY0ODM4ODVmY2Y4OTdiMDZlMTlj
 ZDc2MDZiOScKWC0tLSBzcmMvYm9va21hcmtzLmNwcC5vcmlnCTIwMTItMDMtMDggMDQ6NDY6Mzku
 MDAwMDAwMDAwIC0wNjAwClgrKysgc3JjL2Jvb2ttYXJrcy5jcHAJMjAxMi0wNC0zMCAxNDoyMDoy
 Ni4xNTcwNDYxMjggLTA1MDAKWEBAIC0yMiw2ICsyMiwxMSBAQApYICNpZm5kZWYgQk9PS01BUktT
 X0NQUApYICNkZWZpbmUgQk9PS01BUktTX0NQUApYIApYKyNpZmRlZiBfX0ZyZWVCU0RfXwpYKyNp
 bmNsdWRlIDxzeXMvZXZlbnQuaD4KWCsjaW5jbHVkZSA8c3lzL21vdW50Lmg+ClgrI2VuZGlmClgr
 ClggI2luY2x1ZGUgPFF0R3VpPgpYICNpbmNsdWRlICJib29rbWFya21vZGVsLmgiClggI2luY2x1
 ZGUgImljb25kbGcuaCIKWEBAIC04MCw0MiArODUsNzQgQEAgdm9pZCBNYWluV2luZG93Ojptb3Vu
 dFdhdGNoZXJUcmlnZ2VyZWQoKQpYIH0KWCAKWCAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
 LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpYKyNpZmRl
 ZiBfX0ZyZWVCU0RfXwpYK3ZvaWQgTWFpbldpbmRvdzo6TW91bnRXb3JrZXI6OnJ1bigpClgrewpY
 KwpYKyAgICBhaGVhZCA9IDE7ClgrICAgIGludCBrcSA9IGtxdWV1ZSgpOwpYKyAgICBzdHJ1Y3Qg
 a2V2ZW50IGtpWzFdOwpYKyAgICBzdHJ1Y3QgdGltZXNwZWMgdG9bMV0gPSB7eyAwLCAxMDAwMDAg
 fX07ClgrClgrICAgIEVWX1NFVChraSwgMCwgRVZGSUxUX0ZTLCBFVl9BREQsIFZRX01PVU5UIHwg
 VlFfVU5NT1VOVCwgMCwgMCk7ClgrICAgIGtldmVudChrcSwga2ksIDEsIE5VTEwsIDAsIE5VTEwp
 OwpYKwpYKyAgICB3aGlsZSAoYWhlYWQpIHsKWCsgICAgICAgIHN3aXRjaCAoa2V2ZW50KGtxLCBO
 VUxMLCAwLCBraSwgMSwgdG8pKSB7ClgrICAgICAgICBjYXNlIC0xOgpYKyAgICAgICAgICAgIDo6
 cGVycm9yKCJrZXZlbnQiKTsKWCsgICAgICAgICAgICBicmVhazsKWCsgICAgICAgIGNhc2UgMDoK
 WCsgICAgICAgICAgICBjb250aW51ZTsKWCsgICAgICAgIGRlZmF1bHQ6ClgrICAgICAgICAgICAg
 KChNYWluV2luZG93ICopcGFyZW50KCkpLT5NYWluV2luZG93OjphdXRvQm9va21hcmtNb3VudHMo
 KTsKWCsgICAgICAgIH0KWCsgICAgfQpYKyAgICA6OmNsb3NlKGtxKTsKWCt9ClgrClgrdm9pZCBN
 YWluV2luZG93OjpNb3VudFdvcmtlcjo6Y2xvc2UoKQpYK3sKWCsgICAgYWhlYWQgPSAwOwpYKyAg
 ICB3YWl0KCk7ClgrfQpYKyNlbmRpZgpYKwpYKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
 LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClggdm9pZCBN
 YWluV2luZG93OjphdXRvQm9va21hcmtNb3VudHMoKQpYIHsKWCAgICAgUUxpc3Q8UVN0YW5kYXJk
 SXRlbSAqPiB0aGVCb29rbWFya3MgPSBtb2RlbEJvb2ttYXJrcy0+ZmluZEl0ZW1zKCIqIixRdDo6
 TWF0Y2hXaWxkY2FyZCk7ClggClggICAgIFFTdHJpbmdMaXN0IGF1dG9Cb29rbWFya3M7ClggClgr
 ICAgIHNpemVfdCBtbnRzaXplOwpYKyAgICBzdHJ1Y3Qgc3RhdGZzICptbnQsICptbnRidWY7Clgr
 ClggICAgIGZvcmVhY2goUVN0YW5kYXJkSXRlbSAqaXRlbSwgdGhlQm9va21hcmtzKQpYICAgICB7
 ClggICAgICAgICBpZihpdGVtLT5kYXRhKDM0KS50b1N0cmluZygpID09ICIxIikJCSAgICAvL2lz
 IGFuIGF1dG9tb3VudApYICAgICAgICAgICAgIGF1dG9Cb29rbWFya3MuYXBwZW5kKGl0ZW0tPmRh
 dGEoMzIpLnRvU3RyaW5nKCkpOwpYICAgICB9ClggClgtICAgIFFTdHJpbmdMaXN0IG10YWJNb3Vu
 dHM7ClgtICAgIFFGaWxlIG10YWIoIi9ldGMvbXRhYiIpOwpYLSAgICBtdGFiLm9wZW4oUUZpbGU6
 OlJlYWRPbmx5KTsKWC0gICAgUVRleHRTdHJlYW0gc3RyZWFtKCZtdGFiKTsKWC0gICAgZG8gbXRh
 Yk1vdW50cy5hcHBlbmQoc3RyZWFtLnJlYWRMaW5lKCkpOwpYLSAgICB3aGlsZSAoIXN0cmVhbS5h
 dEVuZCgpKTsKWC0gICAgbXRhYi5jbG9zZSgpOwpYKyAgICBtbnRzaXplID0gZ2V0bW50aW5mbygm
 bW50YnVmLCBNTlRfTk9XQUlUKTsKWCAKWCAgICAgUVN0cmluZ0xpc3QgZG9udFNob3dMaXN0ID0g
 c2V0dGluZ3MtPnZhbHVlKCJoaWRlQm9va21hcmtzIiwwKS50b1N0cmluZ0xpc3QoKTsKWCAgICAg
 bW91bnRzLmNsZWFyKCk7ClggClgtICAgIGZvcmVhY2goUVN0cmluZyBpdGVtLCBtdGFiTW91bnRz
 KQpYLSAgICAgICAgaWYoaXRlbVswXSA9PSAnLycpClgrICAgIGZvciAobW50ID0gbW50YnVmOyBt
 bnRzaXplID4gMDsgbW50c2l6ZS0tLCBtbnQrKykKWCsgICAgICAgIC8vIFhYWCB6cG9vbCBuYW1l
 IGRvZXMgbm90IHN0YXJ0IHdpdGggLwpYKyAgICAgICAgaWYgKG1udC0+Zl9tbnRmcm9tbmFtZVsw
 XSA9PSAnLycgb3IgIXN0cmNtcChtbnQtPmZfZnN0eXBlbmFtZSwgInpmcyIpKQpYICAgICAgICAg
 ewpYLSAgICAgICAgICAgIFFTdHJpbmcgcGF0aCA9IGl0ZW0uc3BsaXQoIiAiKS5hdCgxKTsKWC0g
 ICAgICAgICAgICBwYXRoLnJlcGxhY2UoIlxcMDQwIiwiICIpOwpYLQpYLSAgICAgICAgICAgIG1v
 dW50cy5hcHBlbmQocGF0aCk7ClgtICAgICAgICAgICAgaWYoIWRvbnRTaG93TGlzdC5jb250YWlu
 cyhwYXRoKSkKWC0gICAgICAgICAgICAgICAgaWYoIWF1dG9Cb29rbWFya3MuY29udGFpbnMocGF0
 aCkpCSAgICAvL2FkZCBhIG5ldyBhdXRvIGJvb2ttYXJrIGlmIGl0IGRvZXNuJ3QgZXhpc3QKWCsg
 ICAgICAgICAgICBtb3VudHMuYXBwZW5kKG1udC0+Zl9tbnRvbm5hbWUpOwpYKyAgICAgICAgICAg
 IGlmKCFkb250U2hvd0xpc3QuY29udGFpbnMobW50LT5mX21udG9ubmFtZSkpClgrICAgICAgICAg
 ICAgICAgIC8vYWRkIGEgbmV3IGF1dG8gYm9va21hcmsgaWYgaXQgZG9lc24ndCBleGlzdApYKyAg
 ICAgICAgICAgICAgICBpZighYXV0b0Jvb2ttYXJrcy5jb250YWlucyhtbnQtPmZfbW50b25uYW1l
 KSkKWCAgICAgICAgICAgICAgICAgewpYLSAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5zcGxp
 dCgiICIpLmF0KDIpID09ICJpc285NjYwIikgbW9kZWxCb29rbWFya3MtPmFkZEJvb2ttYXJrKHBh
 dGgscGF0aCwiMSIsImRyaXZlLW9wdGljYWwiKTsKWC0gICAgICAgICAgICAgICAgICAgIGVsc2Ug
 aWYoaXRlbS5zcGxpdCgiICIpLmF0KDIpLmNvbnRhaW5zKCJmYXQiKSkgbW9kZWxCb29rbWFya3Mt
 PmFkZEJvb2ttYXJrKHBhdGgscGF0aCwiMSIsImRyaXZlLXJlbW92YWJsZS1tZWRpYSIpOwpYLSAg
 ICAgICAgICAgICAgICAgICAgZWxzZSBtb2RlbEJvb2ttYXJrcy0+YWRkQm9va21hcmsocGF0aCxw
 YXRoLCIxIiwiZHJpdmUtaGFyZGRpc2siKTsKWCsgICAgICAgICAgICAgICAgICAgIGlmKHN0cnN0
 cihtbnQtPmZfZnN0eXBlbmFtZSwgIjk2NjAiKSkKWCsgICAgICAgICAgICAgICAgICAgICAgICBt
 b2RlbEJvb2ttYXJrcy0+YWRkQm9va21hcmsobW50LT5mX21udG9ubmFtZSxtbnQtPmZfbW50b25u
 YW1lLCIxIiwiZHJpdmUtb3B0aWNhbCIpOwpYKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihz
 dHJzdHIobW50LT5mX2ZzdHlwZW5hbWUsICJmYXQiKSkKWCsgICAgICAgICAgICAgICAgICAgICAg
 ICBtb2RlbEJvb2ttYXJrcy0+YWRkQm9va21hcmsobW50LT5mX21udG9ubmFtZSxtbnQtPmZfbW50
 b25uYW1lLCIxIiwiZHJpdmUtcmVtb3ZhYmxlLW1lZGlhIik7ClgrICAgICAgICAgICAgICAgICAg
 ICBlbHNlIG1vZGVsQm9va21hcmtzLT5hZGRCb29rbWFyayhtbnQtPmZfbW50b25uYW1lLG1udC0+
 Zl9tbnRvbm5hbWUsIjEiLCJkcml2ZS1oYXJkZGlzayIpOwpYICAgICAgICAgICAgICAgICB9Clgg
 ICAgICAgICB9ClggCjU1NGI1NjQ4Mzg4NWZjZjg5N2IwNmUxOWNkNzYwNmI5CmVjaG8geCAtIHF0
 Zm0vZmlsZXMvcGF0Y2gtcXRmbS5wcm8Kc2VkICdzL15YLy8nID5xdGZtL2ZpbGVzL3BhdGNoLXF0
 Zm0ucHJvIDw8ICc1MzljZTkwOTIzOTE1ZTU3YTRkOGRhOTE3NmEzM2I4MicKWC0tLSBxdGZtLnBy
 by5vcmlnCTIwMTItMDQtMzAgMTc6MDg6MDcuMDkzNjkyOTYwIC0wNTAwClgrKysgcXRmbS5wcm8J
 MjAxMi0wNC0zMCAxNzo0ODo0OS40MzMwMjEzNjQgLTA1MDAKWEBAIC01NSw3ICs1NSw3IEBAIHRy
 YW5zLmZpbGVzICs9IHRyYW5zbGF0aW9ucy9xdGZtX2RhLnFtIFwKWCAgICAgICAgICAgICAgICB0
 cmFuc2xhdGlvbnMvcXRmbV96aC5xbSBcClggICAgICAgICAgICAgICAgdHJhbnNsYXRpb25zL3F0
 Zm1femhfVFcucW0KWCAKWC1JTlNUQUxMUyArPSB0YXJnZXQgZGVza3RvcCBpY29uIGRvY3MgdHJh
 bnMKWCtJTlNUQUxMUyArPSB0YXJnZXQgZGVza3RvcCBpY29uIHRyYW5zClggClggClggCjUzOWNl
 OTA5MjM5MTVlNTdhNGQ4ZGE5MTc2YTMzYjgyCmVjaG8geCAtIHF0Zm0vZGlzdGluZm8Kc2VkICdz
 L15YLy8nID5xdGZtL2Rpc3RpbmZvIDw8ICcyZTc3NTU1ZTNlZTAyNTQzNzM5YjEwODc5ZmJjZTFh
 ZicKWFNIQTI1NiAocXRmbS01LjQudGFyLmd6KSA9IDhlZjRjMjQ2NDUwMjk1OTk0NGUxYjI0NzZh
 YTYzNWIyYTg4OWQyODU5YmE2MmRkNjFkOGY1OTE3NzljNmZkMGQKWFNJWkUgKHF0Zm0tNS40LnRh
 ci5neikgPSAxNDcyOTMKMmU3NzU1NWUzZWUwMjU0MzczOWIxMDg3OWZiY2UxYWYKZWNobyB4IC0g
 cXRmbS9wa2ctcGxpc3QKc2VkICdzL15YLy8nID5xdGZtL3BrZy1wbGlzdCA8PCAnMmFhMThhNDY4
 ODZhYTQwMTc0ZjI0YWVhZjEwY2ViNjMnClhiaW4vcXRmbQpYc2hhcmUvYXBwbGljYXRpb25zL3F0
 Zm0uZGVza3RvcApYc2hhcmUvcGl4bWFwcy9xdGZtLnBuZwpYJSVEQVRBRElSJSUvcXRmbV9kYS5x
 bQpYJSVEQVRBRElSJSUvcXRmbV9kZS5xbQpYJSVEQVRBRElSJSUvcXRmbV9lcy5xbQpYJSVEQVRB
 RElSJSUvcXRmbV9mci5xbQpYJSVEQVRBRElSJSUvcXRmbV9pdC5xbQpYJSVEQVRBRElSJSUvcXRm
 bV9wbC5xbQpYJSVEQVRBRElSJSUvcXRmbV9ydS5xbQpYJSVEQVRBRElSJSUvcXRmbV9zci5xbQpY
 JSVEQVRBRElSJSUvcXRmbV96aC5xbQpYJSVEQVRBRElSJSUvcXRmbV96aF9UVy5xbQpYQGRpcnJt
 ICUlREFUQURJUiUlCjJhYTE4YTQ2ODg2YWE0MDE3NGYyNGFlYWYxMGNlYjYzCmVjaG8geCAtIHF0
 Zm0vTWFrZWZpbGUKc2VkICdzL15YLy8nID5xdGZtL01ha2VmaWxlIDw8ICdkZWY3Y2I1OGJiOGRi
 NDdhZmM3ZjZjOWVmOGNlMzRjZCcKWCMgTmV3IHBvcnRzIGNvbGxlY3Rpb24gbWFrZWZpbGUgZm9y
 OglxdGZtClgjIERhdGUgY3JlYXRlZDoJCQkJMjkgQXByIDIwMTIKWCMgV2hvbToJCQkJCVpoaWhh
 byBZdWFuIDxsaWNocmF5QGdtYWlsLmNvbT4KWCMKWCMgJEZyZWVCU0QkClgjClgKWFBPUlROQU1F
 PQlxdGZtClhESVNUVkVSU0lPTj0JNS40ClhDQVRFR09SSUVTPQl4MTEtZm0KWE1BU1RFUl9TSVRF
 Uz0JaHR0cDovL3d3dy5xdGZtLm9yZy8KWApYTUFJTlRBSU5FUj0JbGljaHJheUBnbWFpbC5jb20K
 WENPTU1FTlQ9CUEgc21hbGwsIGxpZ2h0d2VpZ2h0IGZpbGUgbWFuYWdlciBiYXNlZCBvbiBwdXJl
 IFF0ClgKWExJQ0VOU0U9CUdQTHYyClhMSUNFTlNFX0ZJTEU9CSR7V1JLU1JDfS9DT1BZSU5HClgK
 WFVTRV9ET1MyVU5JWD0JeWVzClhET1MyVU5JWF9SRUdFWD0JLipcLihofGNwcCkKWFVTRV9RVF9W
 RVI9CTQKWFFUX0NPTVBPTkVOVFM9CWd1aSBuZXR3b3JrIGltYWdlZm9ybWF0c19ydW4gcW1ha2Vf
 YnVpbGQgbW9jX2J1aWxkIHJjY19idWlsZApYClhNQUtFX0pPQlNfU0FGRT0JeWVzClhTVFJJUF9G
 SUxFUz0JYmluL3F0Zm0KWApYcG9zdC1wYXRjaDoKWAlAY2QgJHtXUktTUkN9ICYmIFwKWAkJJHtS
 RUlOUExBQ0VfQ01EfSAtZSBzQC91c3IvQCR7UFJFRklYfS9AZyBcClgJCXF0Zm0ucHJvIHNyYy9t
 YWluLmNwcApYCUBjZCAke1dSS1NSQ30vc3JjICYmIFwKWAkJJHtSRUlOUExBQ0VfQ01EfSAtZSBz
 QC91c3IvQCR7TE9DQUxCQVNFfS9AZyBcClgJCWljb25kbGcuY3BwIG1haW53aW5kb3cuY3BwIG15
 bW9kZWwuY3BwClgKWGRvLWNvbmZpZ3VyZToKWAlAY2QgJHtXUktTUkN9ICYmICR7U0VURU5WfSAk
 e01BS0VfRU5WfSAke1FNQUtFfSBcClgJCSR7UU1BS0VGTEFHU30gcXRmbS5wcm8KWApYcG9zdC1p
 bnN0YWxsOgpYCSR7U1RSSVBfQ01EfSAke1NUUklQX0ZJTEVTOlMsXiwke1BSRUZJWH0vLH0KWApY
 LmluY2x1ZGUgPGJzZC5wb3J0Lm1rPgpkZWY3Y2I1OGJiOGRiNDdhZmM3ZjZjOWVmOGNlMzRjZApl
 Y2hvIHggLSBxdGZtL3BrZy1kZXNjcgpzZWQgJ3MvXlgvLycgPnF0Zm0vcGtnLWRlc2NyIDw8ICdj
 OGExNjdhMjljNmIxYzJmNzIxZWFmMTZjNjc0YjVkOScKWHF0Rk0gaXMgYSBzbWFsbCwgbGlnaHR3
 ZWlnaHQgZmlsZSBtYW5hZ2VyIGZvciBMaW51eCBkZXNrdG9wcyBiYXNlZCBvbiBwdXJlIFF0Clhh
 bmQgd29ya3MgZ3JlYXQgd2l0aCBtaW5pbWFsIGRlc2t0b3AgZW52aXJvbm1lbnRzIGxpa2UgT3Bl
 bmJveC4KWApYV1dXOiBodHRwOi8vd3d3LnF0Zm0ub3JnLwpjOGExNjdhMjljNmIxYzJmNzIxZWFm
 MTZjNjc0YjVkOQpleGl0Cgo=
 --14dae934085917c09404beefed35--
Responsible-Changed-From-To: freebsd-ports-bugs->makc 
Responsible-Changed-By: makc 
Responsible-Changed-When: Thu May 3 22:08:06 UTC 2012 
Responsible-Changed-Why:  
I'll take it. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=167466 
State-Changed-From-To: open->closed 
State-Changed-By: makc 
State-Changed-When: Tue May 8 23:38:28 UTC 2012 
State-Changed-Why:  
New port added, with minor changes. Thanks! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=167466 
>Unformatted:
