Index: client/1.0/neutral/pkgr.eagle
==================================================================
--- client/1.0/neutral/pkgr.eagle
+++ client/1.0/neutral/pkgr.eagle
@@ -352,11 +352,11 @@
       } result]} then {
         error "cannot use OpenPGP: may not be installed and/or configured"
       }
     } else {
       if {[catch {
-        eval exec [subst $openPgpInstalledCommand]
+        eval exec $openPgpInstalledCommand
       } result]} then {
         error "cannot use OpenPGP: may not be installed and/or configured"
       }
     }
 
Index: client/1.0/neutral/pkgr.eagle.asc
==================================================================
--- client/1.0/neutral/pkgr.eagle.asc
+++ client/1.0/neutral/pkgr.eagle.asc
@@ -1,18 +1,18 @@
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 Comment: Eagle Package Repository
 
-iQIcBAABCAAGBQJYVMeqAAoJEFAslq9JXcLZ7TMP/i1uqLXgToUaI4sFV8hoxPWQ
-buaSI3nfNLJvv8jVJAfe7VolYJw9v0FHpeDTcVToVUDlcGy8W561stkgYn96f4tZ
-C7jLGhqtv5IpESjXDm/1bf8QoJrLShx74W68/o1ae4uhlpPYxZg5vcSYFNS09h+r
-BGNNza0rZS/4elml92cbsfc/h3Qn2A9chu34eiF0TC4zhCknrmU4LKD3yhlqpJWT
-cDIGyKUecW+mSXJGltmmJL+IgO+tNwA72q91sJ3ZIsaEFdYMENZkwva9l7LxoK3j
-tqJqknv6a8H1V9PKN9c+qUROq0c5+biwhgldfg1JTLD5ah1YcrZNB9idUen/ftf+
-QTQnx3nYPLl7fnMiM6S6svWZjSdZ98Fnpu4Jr1F3Im4DSp6wQcILYruGah9ac49Z
-XB/yFpiit7ZhoTH1IVNYYQMdqbf/Wb6WBO5q4CxA000C6ANrk2Cm7Xh5wFlTafg3
-VsEzRNhOLfu8dO2CaOzTIfRo4QhwDJl9yDauei4sPo0J2FmbPTyMBnBwz/X14Gcv
-st5sFAIsryfSx2c3rDpnj8aFHcQLi0DuB8QCR0p4aSKVb2lenmZfcA85PZYD662v
-2x/41sP//rajbEz3YjJlnoK19acDwJSU6uFuvLEqklnd7TDFHl1YtnVVD6wvfSxV
-F67DBCIaQLgfEMK45lzv
-=waFs
+iQIcBAABCAAGBQJYVf3KAAoJEFAslq9JXcLZdl8P/3gJbugJFTv34QLfX4lGkE/O
+90DdUo9cE5Q3B4TzhdI7q0Pndr3npbHfYN4xE1x31ru49TAvFfvqlfb8ruWbLaut
+yVT4qWixveJ+9Dmyqz/caP4EEOLiWy5Esyiodsnm0vfmsZNF2l2ZheLemcLk6Vzm
+Z5mBH3wDwdPP0KP7qKEpz5havgnyt1OMqAeilq8Kr0azBhlKKfCv74XpYvKJk+Rp
+6DHO9aRrszMs6MOBHwPBs7WncMiOANNHnj/Q24sxIdqGjIA7FmU4mkZBC0j2ambD
+8tk8DUvKLeHMsttpB8K6pur9OdLkXTNy96tH2wMsSH77ewvcuNJs+znB8p2OEcGr
+s61qNhioRym9L/mtoMeaDQhmTr6xHLP5brLW2VKrm61UoWpakTjcKIX7mKEe2KN0
+9PVWgVoKO1u3xxRpqERsdgb72AiHk0usODIqy7WazLLOh+he/yOSiJtYj2Q4VsiC
+O5E7GTkdD9XRWaltkJ2TYxDC8C4VSUoWsXTKHnMRczg3iIk6sqgxRkAHqa1ggjM9
+sBMuwJtJwKeWvLtTwJef5qZp4pdY9rxZo5wn92nMx9veLUit963ORAe1ww2gqFdk
+o7kAVia6QL6csbhyO8hgx+ozi0vrD9THIfO6KNYXhn6zEthX8ZYcf9gS/gUcpef9
+HP4UN52z9xe1HmJ1zztl
+=m5li
 -----END PGP SIGNATURE-----
Index: client/1.0/neutral/pkgr.eagle.harpy
==================================================================
--- client/1.0/neutral/pkgr.eagle.harpy
+++ client/1.0/neutral/pkgr.eagle.harpy
@@ -19,50 +19,50 @@
 
   None
   Mistachkin Systems
-  b26eb0c0-d25c-485f-9228-064fdd1f781a
+  0dc9006c-d011-45fe-a801-6b1fb194725f
   SHA512
   Script
-  2016-12-17T05:04:57.1298828Z
+  2016-12-18T03:08:09.6591796Z
   -1.00:00:00
   0x9559f6017247e3e2
   
-    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
+    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
   
 
Index: client/1.0/neutral/pkgr.eagle.harpy.asc
==================================================================
--- client/1.0/neutral/pkgr.eagle.harpy.asc
+++ client/1.0/neutral/pkgr.eagle.harpy.asc
@@ -1,18 +1,18 @@
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 Comment: Eagle Package Repository
 
-iQIcBAABCAAGBQJYVMetAAoJEFAslq9JXcLZE/8QAJY8LtO8YUPPhTY+RPAPw7vZ
-R5W/eCOJ1Qy185xjLVYeb6V0ULxEAgY7iNw4mAkF7dZl1oQ56Xhao4L2sH4+nsMx
-q/BU0Y/Bk0StpHpRvw10bWl/iVo4W2qK07gXepgL9zpI5pl/lJerSJA3LHd6RD8T
-Au/2dw6d/N4ozkc3BTZf4PVZCKfLzVdQ1hEbpDTVlWd0fDS9sEywdML/OKgMzvbG
-YfJrTwjF8sf3urJDbBolFxV430mdbIbLPyvkUCCiOjC3oJi0766B2Xsz+95fY16y
-fMa8T96R2atRPCOolDN5jdIvCkP3VRKlts6OoNZ7nojiS0SsDsREgt5cEFWieXYg
-JFf0Ln5wqjAWxRLl/MlZw2qoN4VQKD9OyS/m/lncNQ4udP4/AIeuQIIeJ0e/pjuQ
-7jiYm9ZCyBcFT7ncU1gZjp9zQar4hWY1oF79RfiwAhno8Rz1CwAFNGKaJ7nenx+7
-/orx8qcDMFZnPh0fsLQJ2f+Z7TTFmLDuYvA8tDHZRWF4RO//+HYec2KZYIay1ZHI
-6RiaNzwjNKI2RF9yJUS+6tGhhu1ck2MR5IXuQ9QFLXqke15qwkpMdKUTxu8N2K/L
-FToN9rn9WfC6O1TeUGZkYr7q9hgZ7hBCn0iiLikrgafxuSVQ5eQCRyLD+04vn3nX
-cXMvYolWIL6QiREGHpsW
-=zSis
+iQIcBAABCAAGBQJYVf3LAAoJEFAslq9JXcLZVWgQAJRR53COXyGIGTjnYLyzyZ81
+dYJgaM0TIOGK6kPZ+QnJqVKZzrTK5v68JSBxOaIhP15GcBhBfk03Mfi12QjdnZ4N
+NkZ7odh1X3glBbRoSHCqfyfma8Uz25fW2KVdggFCFyX5SK5A1JgWbFJO2CCcFqy5
+po6BDC9kKXAPy6a9PEpPtITXnzo0eixYEQ2Y1p2fcWofKJaGtkNOtxEk5q4S9JLX
+vV9oFTRnKYOdwil2Ik1LAgANrCYI/gDDckDOsQ92D86xfz6Hz/NHRFbI4zrxR5pm
+PqtmRFq58IxJ/6e7AydJ0hEQHuRBA+AES/jkvsb4dIo/NLkiTth0mV/nQodBGIWK
+oT62Ytz/V4mzXrmlwdquHb3mdu3SAkCi/kSEFBpUzg+oOTWPPJ2hNZ7cukhAsT0u
+WIJZFFi5QgWE8FP+yNPX3RqqjLX2ub1kTacLi4cWl71eOYHC15eIMQFuSDdfYNT6
+Oqz9h9sOhLXtZacQmUqYZdT9lXX6QWutfcbjzacIS6c6z0hzJGI7q4MGFsBIJw/c
+jHlgizkCGIX71KtYCeODwpnHBEqy8DPUlRc6Js0xWruXna2f5W7jwVAkVQZTWSE0
+8cIwQ6a2BQMc4/p3xBPOwvcCX/IPm8ugxgTsOrkfBtYw4hIFcEaHflFy5KAoGf6o
+FpnkDrmayO97yAwGLY38
+=Z5JN
 -----END PGP SIGNATURE-----
Index: client/1.0/neutral/pkgr_upload.eagle
==================================================================
--- client/1.0/neutral/pkgr_upload.eagle
+++ client/1.0/neutral/pkgr_upload.eagle
@@ -35,10 +35,357 @@
   \[fileName1\] ... \[fileNameN\]"
 
     exit 1
   }
 
+  #
+  # NOTE: This procedure sets up the default values for all configuration
+  #       parameters used by the package uploader client.  The script
+  #       argument is the fully qualified path and file name for the script
+  #       being evaluated.
+  #
+  proc setupUploadVars { script } {
+    #
+    # NOTE: What is the fully qualified path to the directory containing the
+    #       checkout for the package client?
+    #
+    variable checkoutDirectory
+
+    if {![info exists checkoutDirectory]} then {
+      set checkoutDirectory [file dirname $script]
+    }
+
+    #
+    # NOTE: The command to use when attempting to stage package files using
+    #       Fossil.
+    #
+    variable fossilAddCommand; # DEFAULT fossil add {${fileName}}
+
+    if {![info exists fossilAddCommand]} then {
+      set fossilAddCommand {fossil add {${fileName}}}
+    }
+
+    #
+    # NOTE: The command to use when attempting to commit package files using
+    #       Fossil.
+    #
+    variable fossilCommitCommand; # DEFAULT fossil commit ...
+
+    if {![info exists fossilCommitCommand]} then {
+      set fossilCommitCommand {fossil commit -m {${comment}}\
+          --branch {${branch}} --user anonymous --chdir \
+          {${checkoutDirectory}} --no-prompt}
+    }
+
+    #
+    # NOTE: The regular expression pattern used when attempting to verify
+    #       that Fossil committed a set of files.
+    #
+    variable fossilCommitPattern; # DEFAULT: {^New_Version: ([0-9a-f]{40})$}
+
+    if {![info exists fossilCommitPattern]} then {
+      set fossilCommitPattern {^New_Version: ([0-9a-f]{40})$}
+    }
+  }
+
+  #
+  # NOTE: This procedure returns a string value, formatted for use within a
+  #       script block being processed by the [string map] command.  The
+  #       value argument is the string value to format.  No return value is
+  #       reserved to indicate an error.  This procedure may not raise any
+  #       script errors.
+  #
+  proc formatStringMapValue { value } {
+    if {[string length $value] == 0} then {
+      return \"\"
+    }
+
+    set list [list $value]
+
+    if {$value eq $list} then {
+      return $value
+    } else {
+      return $list
+    }
+  }
+
+  #
+  # NOTE: This procedure counts the common path components for two paths.  The
+  #       count is returned, zero if there are no common path components.  The
+  #       path1 and path2 arguments are the paths to compare.  This procedure
+  #       may not raise script errors.
+  #
+  proc countCommonPathParts { path1 path2 } {
+    set parts1 [file split $path1]
+    set length1 [llength $parts1]
+
+    set parts2 [file split $path2]
+    set length2 [llength $parts2]
+
+    set length [expr {min($length1, $length2)}]
+
+    for {set index 0} {$index < $length} {incr index} {
+      set part1 [lindex $parts1 $index]
+      set part2 [lindex $parts2 $index]
+
+      if {$part1 ne $part2} then {
+        return $index
+      }
+    }
+
+    return $length
+  }
+
+  #
+  # NOTE: This procedure processes a list of (fully?) qualified file names and
+  #       tries to determine their common containing directory, if any.  The
+  #       fileNames argument is the list of (fully?) qualified file names to
+  #       process.  This procedure may not raise script errors.  If there is
+  #       no common containing directory, an empty string is returned.
+  #
+  proc getCommonContainingDirectory { fileNames } {
+    set length [llength $fileNames]
+
+    if {$length == 0} then {
+      return ""
+    }
+
+    set oldFileName [lindex $fileNames 0]
+
+    if {$length == 1} then {
+      return [file dirname $oldFileName]
+    }
+
+    set minimumCount 0
+
+    for {set index 1} {$index < $length} {incr index} {
+      set newFileName [lindex $fileNames $index]
+      set newCount [countCommonPathParts $oldFileName $newFileName]
+
+      if {$newCount == 0} then {
+        return ""
+      }
+
+      if {$minimumCount == 0 || $newCount < $minimumCount} then {
+        set oldFileName $newFileName
+        set minimumCount $newCount
+      }
+    }
+
+    if {$minimumCount == 0} then {
+      return ""
+    }
+
+    incr minimumCount -1
+
+    return [eval file join [lrange [file split $oldFileName] 0 $minimumCount]]
+  }
+
+  #
+  # NOTE: This procedure attempts to process a list of (fully?) qualified file
+  #       names and return the corresponding list of relative file names.  The
+  #       fileNames argument is the list of (fully?) qualified file names to
+  #       process.  The maximumLevels argument is the maximum path depth that
+  #       is allowed for all file names.  This procedure may raise script
+  #       errors.
+  #
+  proc getRelativeFileNames { fileNames maximumLevels } {
+    set directory [getCommonContainingDirectory $fileNames]
+    set directoryParts [file split $directory]
+    set fileNameIndex [expr {[llength $directoryParts] - 1}]
+
+    if {$fileNameIndex < 0} then {
+      error [appendArgs \
+          "invalid containing directory \"" $directory \
+          "\": cannot go up one level"]
+    }
+
+    set relativeFileNames [list]
+
+    foreach fileName $fileNames {
+      set fileNameParts [lrange \
+          [file split $fileName] $fileNameIndex end]
+
+      if {$maximumLevels > 0 && \
+          [llength $fileNameParts] > $maximumLevels} then {
+        error [appendArgs \
+            "depth for file name \"" $fileName \
+            "\" exceeds maximum (" $maximumLevels )]
+      }
+
+      set relativeFileName [eval file join $fileNameParts]
+
+      if {[string length $relativeFileName] == 0 || \
+          [file pathtype $relativeFileName] ne "relative"} then {
+        error [appendArgs \
+            "bad file name \"" $relativeFileName "\", not relative"]
+      }
+
+      lappend relativeFileNames $relativeFileName
+    }
+
+    return $relativeFileNames
+  }
+
+  #
+  # NOTE: This procedure attempts to create a script chunk that appends the
+  #       specified list of file names to a list variable.  The fileNames
+  #       argument is the list of (fully?) qualified file names to append to
+  #       the list variable.  The maximumLevels argument is the maximum path
+  #       depth that is allowed for all file names.  This procedure may raise
+  #       script errors.
+  #
+  proc getScriptChunkForFileNames { fileNames maximumLevels } {
+    set result ""
+    set relativeFileNames [getRelativeFileNames $fileNames $maximumLevels]
+
+    foreach relativeFileName $relativeFileNames {
+      if {[string length $result] > 0} then {
+        append result \n
+      }
+
+      append result {  lappend fileNames [file join }
+      append result [file split $relativeFileName]
+      append result \]
+    }
+
+    return $result
+  }
+
+  #
+  # NOTE: This procedure creates and returns a script block designed for use
+  #       with the package repository server in order to download and provide
+  #       a package consisting of a set of files.  The language argument must
+  #       be the literal string "eagle" or the literal string "tcl".  The
+  #       version argument must be one of the literal strings "8.4", "8.5",
+  #       or "8.6" when the language is "tcl" -OR- the literal string "1.0"
+  #       when the language is "eagle".  The platform argument must be an
+  #       empty string -OR- one of the literal strings "neutral", "win32-arm",
+  #       "win32-x86", "win64-arm64", "win64-ia64", or "win64-x64".  The
+  #       fileNames argument is the list of (fully?) qualified file names to
+  #       be downloaded when the associated package is being provided.  The
+  #       options argument is reserved for future use, it should be an empty
+  #       list.
+  #
+  # 
+  proc createRepositoryScript { language version platform fileNames options } {
+    ::PackageDownloader::verifyLanguageAndVersion $language $version isClient
+
+    return [string trim [string map [list \r\n \n \
+        %language% [formatStringMapValue $language] \
+        %version% [formatStringMapValue $version] \
+        %platform% [formatStringMapValue $platform] \
+        %backslash% \\ %ns% ::PackageDownloader %fileNames% \
+        [getScriptChunkForFileNames $fileNames 2]] {
+apply [list [list] {
+  package require Eagle.Package.Downloader
+
+  %ns%::resetCookieAndLoginSimple
+
+  set fileNames [list]
+
+%fileNames%
+
+  set options [list %backslash%
+      -persistent false -usePgp true -useAutoPath true]
+
+  %ns%::downloadFiles %language% %version% %platform% $fileNames $options
+  %ns%::logoutAndResetCookie
+}]
+    }]]
+  }
+
+  #
+  # NOTE: This procedure attempts to stage the specified package files using
+  #       Fossil.  The fileNames argument is a list of (fully?) qualified
+  #       local file names to stage.
+  #
+  # 
+  proc stagePackageFiles { language version platform fileNames } {
+    variable checkoutDirectory
+    variable fossilAddCommand
+
+    set relativeFileNames [getRelativeFileNames $fileNames]
+    set savedPwd [pwd]; cd $checkoutDirectory
+
+    foreach fileName $fileNames relativeFileName $relativeFileNames {
+      file mkdir [file join \
+          $language $version $platform [file dirname $relativeFileName]]
+
+      file copy $fileName $relativeFileName
+      set fileName $relativeFileName
+
+      if {[isEagle]} then {
+        set fileName [::PackageRepository::formatExecArgument $fileName]
+
+        if {[catch {
+          eval exec -success Success [subst $fossilAddCommand]
+        } error]} then {
+          cd $savedPwd
+
+          error [appendArgs \
+              "failed to stage file \"" $fileName "\": " $error]
+        }
+      } else {
+        if {[catch {
+          eval exec [subst $fossilAddCommand]
+        } error]} then {
+          cd $savedPwd
+
+          error [appendArgs \
+              "failed to stage file \"" $fileName "\": " $error]
+        }
+      }
+    }
+
+    cd $savedPwd
+  }
+
+  #
+  # NOTE: This procedure attempts to commit the staged package files to the
+  #       remote package file repository using Fossil.  The varName argument
+  #       is the name of a scalar variable in the context of the immediate
+  #       caller that will receive the resulting Fossil check-in identifier.
+  #
+  # 
+  proc commitPackageFiles { varName } {
+    variable checkoutDirectory
+    variable fossilCommitCommand
+    variable fossilCommitPattern
+
+    set branch ""; # TODO: Figure out a good branch.
+    set comment ""; # TODO: Figure out a good comment.
+
+    if {[isEagle]} then {
+      if {[catch {
+        eval exec -nocarriagereturns -stdout output -stderr error \
+            [subst $fossilCommitCommand]
+      } result] == 0} then {
+        set result [appendArgs $output $error]
+      } else {
+        return false
+      }
+    } else {
+      if {[catch {
+        eval exec [subst $fossilCommitCommand]
+      } result]} then {
+        return false
+      }
+    }
+
+    if {[string length $varName] > 0} then {
+      upvar 1 $varName checkin
+    }
+
+    if {![info exists result] || \
+        ![regexp -line -- $fossilCommitPattern $result dummy checkin]} then {
+      return false
+    }
+
+    return true
+  }
+
   #
   # NOTE: Figure out the fully qualified path to the current script file.
   #       If necessary, add it to the auto-path for the interpreter.  The
   #       necessary supporting packages (i.e. the Package Repository and
   #       other support packages) that are assumed to exist in the same
@@ -65,13 +412,39 @@
   namespace eval ::PackageRepository {
     variable verboseUriDownload true
   }
 
   #
-  # NOTE: Load the Package Repository Client package now.
+  # NOTE: This package requires both the package repository and downloader
+  #       client packages.
+  #
+  package require Eagle.Package.Downloader
+
+  #
+  # NOTE: This package requires that support for namespaces, which is an
+  #       optional feature of Eagle, must be enabled.
+  #
+  if {[isEagle] && ![namespace enable]} then {
+    error "namespaces must be enabled for this package"
+  }
+
+  #
+  # NOTE: Attempt to read optional settings file now.  This may override
+  #       one or more of the variable setup in the next step.
+  #
+  ::PackageRepository::maybeReadSettingsFile [info script]
+
+  #
+  # NOTE: Setup the variables, within this namespace, used by this script.
+  #
+  setupUploadVars [info script]
+
+  #
+  # NOTE: Provide the package to the interpreter.
   #
-  package require Eagle.Package.Repository
+  package provide Eagle.Package.Uploader \
+    [expr {[isEagle] ? [info engine PatchLevel] : "1.0"}]
 
   #
   # NOTE: Verify that the number of command line arguments meets the basic
   #       requirements of this tool.
   #
Index: client/1.0/neutral/pkgr_upload.eagle.asc
==================================================================
--- client/1.0/neutral/pkgr_upload.eagle.asc
+++ client/1.0/neutral/pkgr_upload.eagle.asc
@@ -1,18 +1,18 @@
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 Comment: Eagle Package Repository
 
-iQIcBAABCAAGBQJYVM2HAAoJEFAslq9JXcLZqDQP/0EuHa77yyYqMTY5LnOfFZ0t
-vDquGO1Qk4vOw3m3lQKejssZqQLS46qe0+xfdDg81/vIU5w81Z1FI8V51m5EgHd4
-g9O9GOGgLR/ZRaEkEY12nzvyk4kBYQ6OmQshVVD0cSb+72SNh5Olry8DnoG8bRn0
-LGB43ir2+6Mhu02o7WGdI7HlST51/WHMkIkvpbRqxFa8W2E0YahngZJA0icTnpHN
-ZY+iosWtPk9gigW0GWAjJLQBbwVYjnfd0hX5W5AcQ6ZU/6m1vBNGJTMk8+cuFnPr
-TvzohUMJdO38ITtFr/s/pIq7ELyP25ayTMDdWKARKHKRoLQAXuWvwmXNXrF71VSE
-fBPQrY47AGE4PBpG+yVqlv1hqDu+sPhRzNl2XcXTRVOZ1mRhQnfc2ebQkSKETU+O
-vzspwLmFrOJ8gsYTidSgw8WCXaywjssISNtSm0AcklwjgOeO2e6Vc1erY1h9HctS
-kTB63CuH5V4OuxBUkjFXqmhBuqYUZG+W6Soha99hIw9Jj8j12yfOF97N7ldm7XVO
-NoQweZJXYrV4At9ZiXXhMsZ8RgolQtms29kFXeZ879rq4P8QlCmIN+NDJZHbI2k8
-TyVayOg1Q8LcLIi51o/kQ7ldzSd/xZf6kJzPZdUDpKqJBZHUH0aF8C1f/VhebacI
-c+gJibewxrSrqMjIE6B+
-=MPwB
+iQIcBAABCAAGBQJYVvfzAAoJEFAslq9JXcLZ3KYP/1ziIWg74l8Xat7PICttqWra
+2eFS6x2/fJUK0sqol3pBDxNgn6PfQEFNeJOtP/FlLe7NCG2oOCcIZGuYzGQmZv9u
+UAQQiV6J6Tzn4ZQXETVcKFFkIZ8VhemK3BBuw4omSPogHCHTX7LiVAmsYjs6krhM
+q5UOuswqOidWBWvbaUrkq3SWrtYPj+M4oiNlpA3AjEcn/UePiag60jQi2ZJF+GaN
+cMa5iTHYBWPlnqjlXPOIEOJ4AUHULo9LwJtjkXPIqYNjuVyTJXuO5sRy8yTWIv8C
+FScTt6PS/ds5Yj6LMNsRDII9/broj04kb7eZt3LIruIxT+Cni0HXqfwydlHBBgng
+FgniTiWR6hM8TSOPH18jxjuZ8Cb3ML6Tb/OUul1QWZOrLz/RYszVRgbaC6Y3Z8Ga
+lVYdVXo247UvRwYMkgbSeVKEqhwv/prIh44Ii33cYqMGGRReV7/vAfxB8WXWTQBZ
+QQ96Z93LsP3lujXwecQQPfb+uBzcPvlFrwmWHmMjsQ/q09BIPbc+gCV0UmfMcax6
+Lb9S/QNFWQ4CbjptpdiD/1JfSAwqLOuThQdCUGaQq+LPs297vMpmt2frL9gC7d3h
+/DmEGMMylse2852qFdHYCaWw4Yr8Sgn+lZ9eXuaqY0FCGjRTgTz5CR5f2JylY+mH
+Mhm7F3uErgDn97Jp/qht
+=QWS0
 -----END PGP SIGNATURE-----
Index: client/1.0/neutral/pkgr_upload.eagle.harpy
==================================================================
--- client/1.0/neutral/pkgr_upload.eagle.harpy
+++ client/1.0/neutral/pkgr_upload.eagle.harpy
@@ -19,50 +19,50 @@
 
   None
   Mistachkin Systems
-  410ca3b4-8e95-44e4-a931-03b0cc7e1281
+  57abf613-80dc-4e9a-b1bd-c0a6dac4e16f
   SHA512
   Script
-  2016-12-17T05:30:22.5644531Z
+  2016-12-18T20:55:40.0390625Z
   -1.00:00:00
   0x9559f6017247e3e2
   
-    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
+    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
   
 
Index: client/1.0/neutral/pkgr_upload.eagle.harpy.asc
==================================================================
--- client/1.0/neutral/pkgr_upload.eagle.harpy.asc
+++ client/1.0/neutral/pkgr_upload.eagle.harpy.asc
@@ -1,18 +1,18 @@
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 Comment: Eagle Package Repository
 
-iQIcBAABCAAGBQJYVM2KAAoJEFAslq9JXcLZiNsQAJqKASG3YGn6w7BJRAonKw0y
-jmxVC9wCeFwarD46I0E93XQmNNA6mkonRwT5CvDuUd4G+sH7i5fyM2BIVy0XFO26
-OutiouvupFBiQU2ObsZbGYKrsfN/EpA2/axWAldg4WYDH7dC+3pNd95yp61dDfBg
-bJ6sidNHnUokLzJQ5PaFSYrgaf9/toEZZfOeCmF+4r0frIf4anERuwA4R+RmeeX4
-3ZZbnbb2GwNortF/DEy5DyRO/sz7eyBIBACdp/IacSvHy0UIFD8vIIA71DFrYiMg
-pmf0JyFjwXFF98VLwmatpb3OvtuwEoN+0vaCZ/BRAY4FpTykDUuvKGAYn26k0lVU
-xaKtt9jDBii1VnO3ZgoBjnAYu4dfd35F+EOi7P5uT6SsPS+GjfbZrQrimyDO++Cd
-8rGGw3FEKFVaV40mrT1dlIdpo64fsQmLTwYc+SM/fiQbtbKZb9y+Rqo0UO9cuWCP
-l+dZyw8vRRelRxpsZNYuImLk27HRrBr38JelANfFuO7Lm4WiC6DdzEiL3Sf9BtEN
-xkapDjBz7VhUJ97m0KoC+ODemckv3tlZD+9deowRdYmdjGKtn8GqbNhNfoF0vUGN
-g4zj+UvQ1NblfPLVBEF4WcZFiHqAuRTw/WDBraZXhwbMi51JjVWfOo2WK13tODl8
-KGic5Aea3InSHNGZU4rj
-=MPMG
+iQIcBAABCAAGBQJYVvf0AAoJEFAslq9JXcLZ2B4QAIOriM66ke/AwFa96RpEYs8g
+YdiGg1k5ZpCRc8uVtPYcJnjtc1g325tf73jw7s5I/SThsmBSEFmIWKJwh0HVR6b2
+m2xL0hS+D1ba5+sa6aBUrmn7jbw4i1z9+Rb4hqXacBhIyMaT5qRSN9WQl+mblBML
+cVU9NKYc8ifAmayqiOOvV3vcf3n2V+jiyjEyCw8NVT441JuPIm9jPkTP0oDdy/y6
+l5a2TEvAIq1o9ovEXBkc5NJP8hC+haKdSAZId6q01/aY3L3ObRYCrHs/2iTygWM0
+QmtvP9VPdjfQ6A7u4b1P5EBzQfFvvkOnbi9R2gb/xA06ZqC/heDtxCfl9xL1T8GH
+4vl0+cENxY61G9avc5v0AoEQY+XFvhJpU5vL2PSpw0ZMFmQE4G50SuooD/pA+t8X
+ak+YFoLw2tVnGyDgO+CilF6cP/h1mY+dWvw6hx8aLQeDlNAWRHNco0wzaxDRhJJn
+KNvtwQqO2xGEnDbHkkA3ka0nyUYfyOnJnD+LGQKgKqUm+yMywChlK9NOtbdNrLce
+i8evvNEudOrQY1TLHNkGpJ4fP6LRQSU33MplPMYnYTyeqiJFpNsHjWWhk4cWxDcx
+oprP4sumZuZEHGXLXKXP2/V8/XDPQPuYCDARbkvO2YS84ZG1FadkZ6MkyDiIunSn
++hD0AK7acs6BQTWdNQFf
+=Q5nF
 -----END PGP SIGNATURE-----